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

Reply via email to