Commit cc083d8a authored by Corey Minyard's avatar Corey Minyard Committed by Peter Maydell
Browse files

i2c: Add asserts for second smbus i2c_start_transfer()



Some SMBus operations restart the transfer to convert from
write to read mode without an intervening i2c_end_transfer().
The second call cannot fail, so the return code is unchecked,
but this causes Coverity to complain.  So add some asserts
and documentation about this.

Signed-off-by: default avatarCorey Minyard <cminyard@mvista.com>
Reviewed-by: default avatarPeter Maydell <peter.maydell@linaro.org>
Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parent 19a6e31c
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -88,7 +88,12 @@ int i2c_bus_busy(I2CBus *bus)
    return !QLIST_EMPTY(&bus->current_devs);
}

/* Returns non-zero if the address is not valid.  */
/*
 * Returns non-zero if the address is not valid.  If this is called
 * again without an intervening i2c_end_transfer(), like in the SMBus
 * case where the operation is switched from write to read, this
 * function will not rescan the bus and thus cannot fail.
 */
/* TODO: Make this handle multiple masters.  */
int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
{
+9 −3
Original line number Diff line number Diff line
@@ -248,7 +248,9 @@ int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command)
        return -1;
    }
    i2c_send(bus, command);
    i2c_start_transfer(bus, addr, 1);
    if (i2c_start_transfer(bus, addr, 1)) {
        assert(0);
    }
    data = i2c_recv(bus);
    i2c_nack(bus);
    i2c_end_transfer(bus);
@@ -273,7 +275,9 @@ int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command)
        return -1;
    }
    i2c_send(bus, command);
    i2c_start_transfer(bus, addr, 1);
    if (i2c_start_transfer(bus, addr, 1)) {
        assert(0);
    }
    data = i2c_recv(bus);
    data |= i2c_recv(bus) << 8;
    i2c_nack(bus);
@@ -302,7 +306,9 @@ int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data)
        return -1;
    }
    i2c_send(bus, command);
    i2c_start_transfer(bus, addr, 1);
    if (i2c_start_transfer(bus, addr, 1)) {
        assert(0);
    }
    len = i2c_recv(bus);
    if (len > 32) {
        len = 0;