The buf offset in i2c_isr_read() doesn't get updated when doing mutiple xfer_read(), e.g. reading EDID, thus it will return gfx driver wrong data. Track and update the buf offset would fix the problem.
Signed-off-by: Li Peng <[email protected]> --- drivers/i2c/busses/i2c-intel-mid.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-intel-mid.c b/drivers/i2c/busses/i2c-intel-mid.c index dd34c40..c170d82 100644 --- a/drivers/i2c/busses/i2c-intel-mid.c +++ b/drivers/i2c/busses/i2c-intel-mid.c @@ -83,6 +83,7 @@ struct intel_mid_i2c_private { struct completion complete; u32 abort; int rx_buf_len; + int rx_buf_offset; enum mid_i2c_status status; struct i2c_msg *msg; enum platform_enum platform; @@ -781,6 +782,7 @@ static int intel_mid_i2c_xfer(struct i2c_adapter *adap, for (i = 0; i < num; i++) { i2c->msg = pmsg; + i2c->rx_buf_offset = 0; i2c->status = STATUS_IDLE; if (pmsg->len && pmsg->buf) { @@ -806,9 +808,10 @@ static int intel_mid_i2c_xfer(struct i2c_adapter *adap, break; len -= xfer_len; - if (len) + if (len) { buf += xfer_len; - else /* len == 0 */ + i2c->rx_buf_offset += xfer_len; + } else /* len == 0 */ break; } } @@ -895,7 +898,8 @@ static void i2c_isr_read(struct intel_mid_i2c_private *i2c) { struct i2c_msg *msg = i2c->msg; u32 len = i2c->rx_buf_len; - u8 *buf = msg->buf; + u32 offset = i2c->rx_buf_offset; + u8 *buf = msg->buf + offset; while (len--) *buf++ = readl(i2c->base + IC_DATA_CMD); @@ -1044,6 +1048,7 @@ static int __devinit intel_mid_i2c_probe(struct pci_dev *dev, mrst->speed = STANDARD; mrst->abort = 0; mrst->rx_buf_len = 0; + mrst->rx_buf_offset = 0; mrst->status = STATUS_IDLE; pci_set_drvdata(dev, mrst); -- 1.7.2.2 _______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
