diff options
author | Daniel Kurtz <djkurtz@chromium.org> | 2012-04-13 07:47:53 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-04-13 09:02:52 -0400 |
commit | 79985eee842ef146ed6307a29fdc2fa008036421 (patch) | |
tree | b8b454b646b3ffa35de316728b53e8fd3869d713 /drivers/gpu/drm/i915/intel_i2c.c | |
parent | f637fde434c9e3687798730c7ddd367e93666013 (diff) |
drm/i915/intel_i2c: handle zero-length reads
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>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_i2c.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index cab879fedf3c..e24916042550 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
@@ -217,7 +217,7 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg, | |||
217 | (len << GMBUS_BYTE_COUNT_SHIFT) | | 217 | (len << GMBUS_BYTE_COUNT_SHIFT) | |
218 | (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) | | 218 | (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) | |
219 | GMBUS_SLAVE_READ | GMBUS_SW_RDY); | 219 | GMBUS_SLAVE_READ | GMBUS_SW_RDY); |
220 | do { | 220 | while (len) { |
221 | int ret; | 221 | int ret; |
222 | u32 val, loop = 0; | 222 | u32 val, loop = 0; |
223 | u32 gmbus2; | 223 | u32 gmbus2; |
@@ -235,7 +235,7 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg, | |||
235 | *buf++ = val & 0xff; | 235 | *buf++ = val & 0xff; |
236 | val >>= 8; | 236 | val >>= 8; |
237 | } while (--len && ++loop < 4); | 237 | } while (--len && ++loop < 4); |
238 | } while (len); | 238 | } |
239 | 239 | ||
240 | return 0; | 240 | return 0; |
241 | } | 241 | } |