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: Corey Minyard <cminyard@mvista.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
19a6e31c9d
commit
cc083d8a25
|
@ -88,7 +88,12 @@ int i2c_bus_busy(I2CBus *bus)
|
||||||
return !QLIST_EMPTY(&bus->current_devs);
|
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. */
|
/* TODO: Make this handle multiple masters. */
|
||||||
int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
|
int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
|
||||||
{
|
{
|
||||||
|
|
|
@ -248,7 +248,9 @@ int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
i2c_send(bus, command);
|
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);
|
||||||
i2c_nack(bus);
|
i2c_nack(bus);
|
||||||
i2c_end_transfer(bus);
|
i2c_end_transfer(bus);
|
||||||
|
@ -273,7 +275,9 @@ int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
i2c_send(bus, command);
|
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);
|
||||||
data |= i2c_recv(bus) << 8;
|
data |= i2c_recv(bus) << 8;
|
||||||
i2c_nack(bus);
|
i2c_nack(bus);
|
||||||
|
@ -302,7 +306,9 @@ int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
i2c_send(bus, command);
|
i2c_send(bus, command);
|
||||||
i2c_start_transfer(bus, addr, 1);
|
if (i2c_start_transfer(bus, addr, 1)) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
len = i2c_recv(bus);
|
len = i2c_recv(bus);
|
||||||
if (len > 32) {
|
if (len > 32) {
|
||||||
len = 0;
|
len = 0;
|
||||||
|
|
Loading…
Reference in New Issue