linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] HID: i2c-hid: Support batch read of input events from fifo
@ 2014-05-08 13:32 Archana Patni
  2014-05-08 14:28 ` Benjamin Tissoires
  0 siblings, 1 reply; 9+ messages in thread
From: Archana Patni @ 2014-05-08 13:32 UTC (permalink / raw)
  To: jkosina
  Cc: jic23, linux-input, mika.westerberg, srinivas.pandruvada,
	Archana Patni, Archana Patni, Subramony Sesha

Some i2c_hid devices like a sensor hub have built-in fifos which
can accumulate input events in their buffers and trigger an interrupt
at end of a user defined event like fifo full or a timeout. The current
implementation reads one event at a time in the IRQ handler leading to
several hundred interrupts being necessary to flush the fifo.

This patch changes the threaded IRQ handler to keep input events until
there are no input events left to read. In the normal case, this will
invoke one additional call to fetch an input event to check for no pending
events and terminate the loop.

Signed-off-by: Archana Patni <archana.patni@intel.com>
Signed-off-by: Subramony Sesha <subramony.sesha@intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@intel.com>
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@intel.com>
---
 drivers/hid/i2c-hid/i2c-hid.c |   20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
index 21aafc8..3f09a50 100644
--- a/drivers/hid/i2c-hid/i2c-hid.c
+++ b/drivers/hid/i2c-hid/i2c-hid.c
@@ -52,6 +52,7 @@
 static bool debug;
 module_param(debug, bool, 0444);
 MODULE_PARM_DESC(debug, "print a lot of debug information");
+#define MAX_INPUT_EVENT_READ 100
 
 #define i2c_hid_dbg(ihid, fmt, arg...)					  \
 do {									  \
@@ -366,7 +367,7 @@ static int i2c_hid_hwreset(struct i2c_client *client)
 	return 0;
 }
 
-static void i2c_hid_get_input(struct i2c_hid *ihid)
+static int i2c_hid_get_input(struct i2c_hid *ihid)
 {
 	int ret, ret_size;
 	int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
@@ -374,11 +375,11 @@ static void i2c_hid_get_input(struct i2c_hid *ihid)
 	ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
 	if (ret != size) {
 		if (ret < 0)
-			return;
+			return ret;
 
 		dev_err(&ihid->client->dev, "%s: got %d data instead of %d\n",
 			__func__, ret, size);
-		return;
+		return -EIO;
 	}
 
 	ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8;
@@ -387,13 +388,13 @@ static void i2c_hid_get_input(struct i2c_hid *ihid)
 		/* host or device initiated RESET completed */
 		if (test_and_clear_bit(I2C_HID_RESET_PENDING, &ihid->flags))
 			wake_up(&ihid->wait);
-		return;
+		return 0;
 	}
 
 	if (ret_size > size) {
 		dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n",
 			__func__, size, ret_size);
-		return;
+		return -EIO;
 	}
 
 	i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf);
@@ -402,17 +403,22 @@ static void i2c_hid_get_input(struct i2c_hid *ihid)
 		hid_input_report(ihid->hid, HID_INPUT_REPORT, ihid->inbuf + 2,
 				ret_size - 2, 1);
 
-	return;
+	return 1;
 }
 
 static irqreturn_t i2c_hid_irq(int irq, void *dev_id)
 {
 	struct i2c_hid *ihid = dev_id;
+	int ret;
+	int count = 0;
 
 	if (test_bit(I2C_HID_READ_PENDING, &ihid->flags))
 		return IRQ_HANDLED;
+	do {
+		count++;
+		ret = i2c_hid_get_input(ihid);
 
-	i2c_hid_get_input(ihid);
+	} while (count < MAX_INPUT_EVENT_READ && ret > 0);
 
 	return IRQ_HANDLED;
 }
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-05-14 13:43 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-08 13:32 [PATCH] HID: i2c-hid: Support batch read of input events from fifo Archana Patni
2014-05-08 14:28 ` Benjamin Tissoires
2014-05-08 18:10   ` Jonathan Cameron
2014-05-08 21:34     ` Benjamin Tissoires
2014-05-09  7:23       ` Mika Westerberg
2014-05-10 18:48   ` Srinivas Pandruvada
2014-05-12 16:03     ` Benjamin Tissoires
     [not found]       ` <5370FDA9.90309@linux.intel.com>
2014-05-14 11:04         ` archana.patni
2014-05-14 13:43           ` Benjamin Tissoires

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).