Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1534869

[PATCH v2 2/7] Input: synaptics-rmi4 - F03: grab data passed by transport device

From Benjamin Tissoires <benjamin.tissoires@redhat.com>
Newsgroups linux.kernel
Subject [PATCH v2 2/7] Input: synaptics-rmi4 - F03: grab data passed by transport device
Date 2016-12-02 12:50 +0100
Message-ID <sJUvM-3hJ-29@gated-at.bofh.it> (permalink)
References <sJUvL-3hJ-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Dennis Wassenberg <dennis.wassenberg@secunet.com>

First check if there are data available passed by the transport device.
If data available use these data. If there are no data available
try to read the rmi block if dsata are passed this way.

This is the way the other rmi function handlers will do this.

This patch is needed on HID devices because the firmware reads F03 data
registers and adds them to the HID attention report. Reading those
registers from the driver after the firmware read them will result in
invalid data.

Reviewed-by: Andrew Duggan <aduggan@synaptics.com>
Signed-off-by: Dennis Wassenberg <dennis.wassenberg@secunet.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>

---

no changes in v2
---
 drivers/input/rmi4/rmi_f03.c | 37 +++++++++++++++++++++++++++----------
 1 file changed, 27 insertions(+), 10 deletions(-)

diff --git a/drivers/input/rmi4/rmi_f03.c b/drivers/input/rmi4/rmi_f03.c
index fd8f6e5..06279cd 100644
--- a/drivers/input/rmi4/rmi_f03.c
+++ b/drivers/input/rmi4/rmi_f03.c
@@ -165,6 +165,7 @@ static int rmi_f03_config(struct rmi_function *fn)
 
 static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits)
 {
+	struct rmi_device *rmi_dev = fn->rmi_dev;
 	struct f03_data *f03 = dev_get_drvdata(&fn->dev);
 	u16 data_addr = fn->fd.data_base_addr;
 	const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
@@ -173,16 +174,32 @@ static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits)
 	u8 ob_data;
 	unsigned int serio_flags;
 	int i;
-	int retval;
-
-	/* Grab all of the data registers, and check them for data */
-	retval = rmi_read_block(fn->rmi_dev, data_addr + RMI_F03_OB_OFFSET,
-				&obs, ob_len);
-	if (retval) {
-		dev_err(&fn->dev, "%s: Failed to read F03 output buffers.\n",
-			__func__);
-		serio_interrupt(f03->serio, 0, SERIO_TIMEOUT);
-		return retval;
+	int ret;
+
+	if (!rmi_dev || !rmi_dev->xport)
+		return -ENODEV;
+
+	if (rmi_dev->xport->attn_data) {
+		/* First grab the data passed by the transport device */
+		if (rmi_dev->xport->attn_size < ob_len) {
+			dev_warn(&fn->dev, "F03 interrupted, but data is missing!\n");
+			return 0;
+		}
+
+		memcpy(obs, rmi_dev->xport->attn_data, ob_len);
+
+		rmi_dev->xport->attn_data += ob_len;
+		rmi_dev->xport->attn_size -= ob_len;
+	} else {
+		/* Grab all of the data registers, and check them for data */
+		ret = rmi_read_block(fn->rmi_dev, data_addr + RMI_F03_OB_OFFSET,
+				     &obs, ob_len);
+		if (ret) {
+			dev_err(&fn->dev, "%s: Failed to read F03 output buffers.\n",
+				__func__);
+			serio_interrupt(f03->serio, 0, SERIO_TIMEOUT);
+			return ret;
+		}
 	}
 
 	for (i = 0; i < ob_len; i += RMI_F03_OB_SIZE) {
-- 
2.9.3

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v2 0/7] RMI4 cleanups and switch hid-rmi to rmi_core Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-12-02 12:50 +0100
  [PATCH v2 4/7] Input: synaptics-rmi4 - store the attn data in the driver Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-12-02 12:50 +0100
    Re: [PATCH v2 4/7] Input: synaptics-rmi4 - store the attn data in the  driver Andrew Duggan <aduggan@synaptics.com> - 2016-12-03 01:50 +0100
      Re: [PATCH v2 4/7] Input: synaptics-rmi4 - store the attn data in  the driver Dmitry Torokhov <dmitry.torokhov@gmail.com> - 2016-12-03 19:30 +0100
  [PATCH v2 5/7] HID: rmi: Make hid-rmi a transport driver for synaptics-rmi4 Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-12-02 12:50 +0100
  [PATCH v2 2/7] Input: synaptics-rmi4 - F03: grab data passed by transport device Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-12-02 12:50 +0100
  [PATCH v2 3/7] Input: synaptics-rmi4 - allow to add attention data Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-12-02 12:50 +0100
    Re: [PATCH v2 3/7] Input: synaptics-rmi4 - allow to add attention  data Andrew Duggan <aduggan@synaptics.com> - 2016-12-03 01:50 +0100
      Re: [PATCH v2 3/7] Input: synaptics-rmi4 - allow to add attention  data Dmitry Torokhov <dmitry.torokhov@gmail.com> - 2016-12-03 19:30 +0100
  Re: [PATCH v2 0/7] RMI4 cleanups and switch hid-rmi to rmi_core Andrew Duggan <aduggan@synaptics.com> - 2016-12-03 01:50 +0100
  Re: [PATCH v2 0/7] RMI4 cleanups and switch hid-rmi to rmi_core Dmitry Torokhov <dmitry.torokhov@gmail.com> - 2016-12-03 19:40 +0100

csiph-web