]> Git Repo - qemu.git/commitdiff
i2c:smbus: Simplify read handling
authorCorey Minyard <[email protected]>
Fri, 30 Nov 2018 19:49:31 +0000 (13:49 -0600)
committerCorey Minyard <[email protected]>
Thu, 28 Feb 2019 03:06:08 +0000 (21:06 -0600)
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 <[email protected]>
hw/i2c/smbus_eeprom.c
hw/i2c/smbus_slave.c
include/hw/i2c/smbus_slave.h

index 7fbb5ca27f6f521a9374be74281056cf9f7d2763..760594b3f11fe28fcf7671553945ac3c75f14dbf 100644 (file)
@@ -79,13 +79,6 @@ static int eeprom_write_data(SMBusDevice *dev, uint8_t *buf, uint8_t len)
     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)
 {
     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->receive_byte = eeprom_receive_byte;
     sc->write_data = eeprom_write_data;
-    sc->read_data = eeprom_read_data;
     dc->props = smbus_eeprom_properties;
     /* Reason: pointer property "data" */
     dc->user_creatable = false;
index 92c7a5086cb4bb13ccf569c6317546773df17eef..52a57423ee90bcb57b170d6348c50d46c1ae5787 100644 (file)
@@ -34,7 +34,6 @@ do { fprintf(stderr, "smbus: error: " fmt , ## __VA_ARGS__);} while (0)
 enum {
     SMBUS_IDLE,
     SMBUS_WRITE_DATA,
-    SMBUS_RECV_BYTE,
     SMBUS_READ_DATA,
     SMBUS_DONE,
     SMBUS_CONFUSED = -1
@@ -82,7 +81,7 @@ static int smbus_i2c_event(I2CSlave *s, enum i2c_event event)
         switch (dev->mode) {
         case SMBUS_IDLE:
             DPRINTF("Read mode\n");
-            dev->mode = SMBUS_RECV_BYTE;
+            dev->mode = SMBUS_READ_DATA;
             break;
         case SMBUS_WRITE_DATA:
             if (dev->data_len == 0) {
@@ -91,7 +90,6 @@ static int smbus_i2c_event(I2CSlave *s, enum i2c_event event)
             } else {
                 smbus_do_write(dev);
                 DPRINTF("Read mode\n");
-                dev->data_len = 0;
                 dev->mode = SMBUS_READ_DATA;
             }
             break;
@@ -148,31 +146,18 @@ static uint8_t smbus_i2c_recv(I2CSlave *s)
 {
     SMBusDevice *dev = SMBUS_DEVICE(s);
     SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
-    uint8_t ret;
+    uint8_t ret = 0xff;
 
     switch (dev->mode) {
-    case SMBUS_RECV_BYTE:
+    case SMBUS_READ_DATA:
         if (sc->receive_byte) {
             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);
         break;
     default:
         BADF("Unexpected read in state %d\n", dev->mode);
         dev->mode = SMBUS_CONFUSED;
-        ret = 0;
         break;
     }
     return ret;
index fa92201ec6d539129a8a3d697b34bc2bb68773fd..79050fb92d4727fb8472a7fcbbdf283c2ae2b787 100644 (file)
@@ -47,8 +47,6 @@ typedef struct SMBusDeviceClass
      */
     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
      * 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);
 
-    /* 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
-       byte at a time.  The device is responsible for adding the length
-       byte on block reads.  */
-    uint8_t (*read_data)(SMBusDevice *dev, int n);
+    /*
+     * 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
+     * byte at a time.  The device is responsible for adding the length
+     * 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;
 
 struct SMBusDevice {
This page took 0.032955 seconds and 4 git commands to generate.