drm/i915/intel_i2c: handle zero-length reads
authorDaniel Kurtz <djkurtz@chromium.org>
Fri, 13 Apr 2012 11:47:53 +0000 (19:47 +0800)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 13 Apr 2012 13:02:52 +0000 (15:02 +0200)
A common method of probing an i2c bus is trying to do a zero-length read.
Handle this case by checking the length first waiting for data to be read.

This is actually important, since attempting a zero-length read is one
of the ways that i2cdetect and i2c_new_probed_device detect whether
there is device present on the bus with a given address.

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48269
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_i2c.c

index cab879fedf3caf229fd3f142ae1c4845184a0175..e249160425509192fd2a9ec6f2aa9ee7d3463893 100644 (file)
@@ -217,7 +217,7 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
                   (len << GMBUS_BYTE_COUNT_SHIFT) |
                   (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
                   GMBUS_SLAVE_READ | GMBUS_SW_RDY);
-       do {
+       while (len) {
                int ret;
                u32 val, loop = 0;
                u32 gmbus2;
@@ -235,7 +235,7 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
                        *buf++ = val & 0xff;
                        val >>= 8;
                } while (--len && ++loop < 4);
-       } while (len);
+       }
 
        return 0;
 }