Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79985eee authored by Daniel Kurtz's avatar Daniel Kurtz Committed by Daniel Vetter
Browse files

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48269


Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
Signed-Off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent f637fde4
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -217,7 +217,7 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
		   (len << GMBUS_BYTE_COUNT_SHIFT) |
		   (len << GMBUS_BYTE_COUNT_SHIFT) |
		   (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
		   (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
		   GMBUS_SLAVE_READ | GMBUS_SW_RDY);
		   GMBUS_SLAVE_READ | GMBUS_SW_RDY);
	do {
	while (len) {
		int ret;
		int ret;
		u32 val, loop = 0;
		u32 val, loop = 0;
		u32 gmbus2;
		u32 gmbus2;
@@ -235,7 +235,7 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
			*buf++ = val & 0xff;
			*buf++ = val & 0xff;
			val >>= 8;
			val >>= 8;
		} while (--len && ++loop < 4);
		} while (--len && ++loop < 4);
	} while (len);
	}


	return 0;
	return 0;
}
}