i2c:smbus: Simplify read handling

There were two different read functions, and with the removal of
the command passed in there is no functional difference.  So remove
one of them.  With that you don't need one of the states, so that
can be removed, too.

Signed-off-by: Corey Minyard <cminyard@mvista.com>
This commit is contained in:
Corey Minyard 2018-11-30 13:49:31 -06:00
parent 9cf27d74a8
commit 031ac49886
3 changed files with 13 additions and 33 deletions

View file

@ -79,13 +79,6 @@ static int eeprom_write_data(SMBusDevice *dev, uint8_t *buf, uint8_t len)
return 0; return 0;
} }
static uint8_t eeprom_read_data(SMBusDevice *dev, int n)
{
/* As with writes, we implement block reads without the
SMBus length byte. */
return eeprom_receive_byte(dev);
}
static void smbus_eeprom_realize(DeviceState *dev, Error **errp) static void smbus_eeprom_realize(DeviceState *dev, Error **errp)
{ {
SMBusEEPROMDevice *eeprom = (SMBusEEPROMDevice *)dev; SMBusEEPROMDevice *eeprom = (SMBusEEPROMDevice *)dev;
@ -107,7 +100,6 @@ static void smbus_eeprom_class_initfn(ObjectClass *klass, void *data)
sc->quick_cmd = eeprom_quick_cmd; sc->quick_cmd = eeprom_quick_cmd;
sc->receive_byte = eeprom_receive_byte; sc->receive_byte = eeprom_receive_byte;
sc->write_data = eeprom_write_data; sc->write_data = eeprom_write_data;
sc->read_data = eeprom_read_data;
dc->props = smbus_eeprom_properties; dc->props = smbus_eeprom_properties;
/* Reason: pointer property "data" */ /* Reason: pointer property "data" */
dc->user_creatable = false; dc->user_creatable = false;

View file

@ -34,7 +34,6 @@ do { fprintf(stderr, "smbus: error: " fmt , ## __VA_ARGS__);} while (0)
enum { enum {
SMBUS_IDLE, SMBUS_IDLE,
SMBUS_WRITE_DATA, SMBUS_WRITE_DATA,
SMBUS_RECV_BYTE,
SMBUS_READ_DATA, SMBUS_READ_DATA,
SMBUS_DONE, SMBUS_DONE,
SMBUS_CONFUSED = -1 SMBUS_CONFUSED = -1
@ -82,7 +81,7 @@ static int smbus_i2c_event(I2CSlave *s, enum i2c_event event)
switch (dev->mode) { switch (dev->mode) {
case SMBUS_IDLE: case SMBUS_IDLE:
DPRINTF("Read mode\n"); DPRINTF("Read mode\n");
dev->mode = SMBUS_RECV_BYTE; dev->mode = SMBUS_READ_DATA;
break; break;
case SMBUS_WRITE_DATA: case SMBUS_WRITE_DATA:
if (dev->data_len == 0) { if (dev->data_len == 0) {
@ -91,7 +90,6 @@ static int smbus_i2c_event(I2CSlave *s, enum i2c_event event)
} else { } else {
smbus_do_write(dev); smbus_do_write(dev);
DPRINTF("Read mode\n"); DPRINTF("Read mode\n");
dev->data_len = 0;
dev->mode = SMBUS_READ_DATA; dev->mode = SMBUS_READ_DATA;
} }
break; break;
@ -148,31 +146,18 @@ static uint8_t smbus_i2c_recv(I2CSlave *s)
{ {
SMBusDevice *dev = SMBUS_DEVICE(s); SMBusDevice *dev = SMBUS_DEVICE(s);
SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev); SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
uint8_t ret; uint8_t ret = 0xff;
switch (dev->mode) { switch (dev->mode) {
case SMBUS_RECV_BYTE: case SMBUS_READ_DATA:
if (sc->receive_byte) { if (sc->receive_byte) {
ret = sc->receive_byte(dev); ret = sc->receive_byte(dev);
} else {
ret = 0;
}
DPRINTF("Receive Byte %02x\n", ret);
dev->mode = SMBUS_DONE;
break;
case SMBUS_READ_DATA:
if (sc->read_data) {
ret = sc->read_data(dev, dev->data_len);
dev->data_len++;
} else {
ret = 0;
} }
DPRINTF("Read data %02x\n", ret); DPRINTF("Read data %02x\n", ret);
break; break;
default: default:
BADF("Unexpected read in state %d\n", dev->mode); BADF("Unexpected read in state %d\n", dev->mode);
dev->mode = SMBUS_CONFUSED; dev->mode = SMBUS_CONFUSED;
ret = 0;
break; break;
} }
return ret; return ret;

View file

@ -47,8 +47,6 @@ typedef struct SMBusDeviceClass
*/ */
void (*quick_cmd)(SMBusDevice *dev, uint8_t read); void (*quick_cmd)(SMBusDevice *dev, uint8_t read);
uint8_t (*receive_byte)(SMBusDevice *dev);
/* /*
* We can't distinguish between a word write and a block write with * We can't distinguish between a word write and a block write with
* length 1, so pass the whole data block including the length byte * length 1, so pass the whole data block including the length byte
@ -59,11 +57,16 @@ typedef struct SMBusDeviceClass
*/ */
int (*write_data)(SMBusDevice *dev, uint8_t *buf, uint8_t len); int (*write_data)(SMBusDevice *dev, uint8_t *buf, uint8_t len);
/* Likewise we can't distinguish between different reads, or even know /*
the length of the read until the read is complete, so read data a * Likewise we can't distinguish between different reads, or even know
byte at a time. The device is responsible for adding the length * the length of the read until the read is complete, so read data a
byte on block reads. */ * byte at a time. The device is responsible for adding the length
uint8_t (*read_data)(SMBusDevice *dev, int n); * byte on block reads. This call cannot fail, it should return
* something, preferably 0xff if nothing is available.
* This may be NULL if no data is read from the device. Reads will
* return 0xff in that case.
*/
uint8_t (*receive_byte)(SMBusDevice *dev);
} SMBusDeviceClass; } SMBusDeviceClass;
struct SMBusDevice { struct SMBusDevice {