gpio: pcal9535a: use i2c_poll_transfer() for register read

The newly introduced i2c_poll_transfer() is now used for register
read for PCAL9535A GPIO driver. The old write then read does not
work because every read or write ends with STOP. However,
the chip requires RESTART after writing the register address.
So the new generic transfer function is perfect for this.

Change-Id: I56d7ebe08f68cb04731c72138d60645ef124f65e
Signed-off-by: Daniel Leung <daniel.leung@intel.com>
This commit is contained in:
Daniel Leung 2015-10-08 15:51:29 -07:00 committed by Anas Nashif
commit 827f6d018b

View file

@ -127,34 +127,11 @@ static int _read_port_regs(struct device *dev, uint8_t reg,
struct device * const i2c_master = drv_data->i2c_master;
uint16_t i2c_addr = config->i2c_slave_addr;
int ret;
int cnt;
uint8_t cmd[] = { reg };
/* Tell the chip we want to read from a particular register. */
buf->byte[0] = reg;
buf->byte[1] = 0;
ret = i2c_write(i2c_master, buf->byte, 1, i2c_addr);
ret = i2c_poll_transfer(i2c_master, cmd, 1, buf->byte, 2, i2c_addr, 0);
if (ret) {
DBG("PCAL9535A[0x%X]: error writing to register 0x%X (%d)\n",
i2c_addr, reg, ret);
goto error;
}
/* Then, read those register values back.
* The I2C bus may not be ready for read yet,
* so retry a few times.
*/
cnt = 5;
do {
/* wait for i2c master to idle */
_wait_10ms(&drv_data->timer);
ret = i2c_read(i2c_master, buf->byte, 2, i2c_addr);
if (!ret) {
break;
}
} while (cnt--);
if (ret) {
DBG("PCAL9535A[0x%X]: error reading from register 0x%X (%d)\n",
DBG("PCAL9535A[0x%X]: error reading register 0x%X (%d)\n",
i2c_addr, reg, ret);
goto error;
}