diff options
author | Steven Toth <stoth@hauppauge.com> | 2007-09-20 04:44:27 (GMT) |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-01-25 21:00:56 (GMT) |
commit | e92adc2c39aaaa0129b7b97584784a8ba9da9ec4 (patch) | |
tree | 3550388d6347b1479e0ec58880830f56e9da4dd8 | |
parent | 289d4d2f0746715ada41e0945116eb3d62d5f35c (diff) | |
download | linux-e92adc2c39aaaa0129b7b97584784a8ba9da9ec4.tar.xz |
V4L/DVB (6404): cx23885: i2c 16bit reg/val read/write fix
Fix i2c reads and writes of 16bit register address / values
Signed-off-by: Steven Toth <stoth@hauppauge.com>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r-- | drivers/media/video/cx23885/cx23885-i2c.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/media/video/cx23885/cx23885-i2c.c b/drivers/media/video/cx23885/cx23885-i2c.c index 71da528..f7e8a48 100644 --- a/drivers/media/video/cx23885/cx23885-i2c.c +++ b/drivers/media/video/cx23885/cx23885-i2c.c @@ -84,7 +84,8 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap, u32 wdata, addr, ctrl; int retval, cnt; - dprintk(1, "%s()\n", __FUNCTION__); + dprintk(1, "%s(msg->len=%d, last=%d)\n", __FUNCTION__, msg->len, last); + /* Deal with i2c probe functions with zero payload */ if (msg->len == 0) { cx_write(bus->reg_addr, msg->addr << 25); @@ -127,7 +128,7 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap, wdata = msg->buf[cnt]; ctrl = bus->i2c_period | (1 << 12) | (1 << 2); - if (cnt < msg->len-1 || !last) + if (cnt < msg->len - 1) ctrl |= I2C_NOSTOP | I2C_EXTEND; cx_write(bus->reg_addr, addr); @@ -162,7 +163,7 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap, u32 ctrl, cnt; int retval; - dprintk(1, "%s()\n", __FUNCTION__); + dprintk(1, "%s(msg->len=%d, last=%d)\n", __FUNCTION__, msg->len, last); /* Deal with i2c probe functions with zero payload */ if (msg->len == 0) { @@ -178,11 +179,14 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap, return 0; } + if (i2c_debug) + printk(" <R %02x", (msg->addr << 1) + 1); + for(cnt = 0; cnt < msg->len; cnt++) { ctrl = bus->i2c_period | (1 << 12) | (1 << 2) | 1; - if (cnt < msg->len-1 || !last) + if (cnt < msg->len - 1) ctrl |= I2C_NOSTOP | I2C_EXTEND; cx_write(bus->reg_addr, msg->addr << 25); @@ -195,9 +199,7 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap, goto eio; msg->buf[cnt] = cx_read(bus->reg_rdata) & 0xff; if (i2c_debug) { - if (!(ctrl & I2C_NOSTOP)) - printk(" <R %02x", (msg->addr << 1) +1); - printk(" =%02x", msg->buf[cnt]); + printk(" %02x", msg->buf[cnt]); if (!(ctrl & I2C_NOSTOP)) printk(" >\n"); } |