Commit c15f8ba6 authored by Hans Verkuil's avatar Hans Verkuil Committed by Dmitry Torokhov

Input: rmi_f54 - read from FIFO in 32 byte blocks

The F54 Report Data is apparently read through a fifo and for
the smbus protocol that means that between reading a block of 32
bytes the rmiaddr shouldn't be incremented. However, changing
that causes other non-fifo reads to fail and so that change was
reverted.

This patch changes just the F54 function and it now reads 32 bytes
at a time from the fifo, using the F54_FIFO_OFFSET to update the
start address that is used when reading from the fifo.

This has only been tested with smbus, not with i2c or spi. But I
suspect that the same is needed there since I think similar
problems will occur there when reading more than 256 bytes.
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Tested-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Reported-by: default avatarTimo Kaufmann <timokau@zoho.com>
Link: https://lore.kernel.org/r/20200115124819.3191024-3-hverkuil-cisco@xs4all.nlSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 8ff771f8
...@@ -24,6 +24,12 @@ ...@@ -24,6 +24,12 @@
#define F54_NUM_TX_OFFSET 1 #define F54_NUM_TX_OFFSET 1
#define F54_NUM_RX_OFFSET 0 #define F54_NUM_RX_OFFSET 0
/*
* The smbus protocol can read only 32 bytes max at a time.
* But this should be fine for i2c/spi as well.
*/
#define F54_REPORT_DATA_SIZE 32
/* F54 commands */ /* F54 commands */
#define F54_GET_REPORT 1 #define F54_GET_REPORT 1
#define F54_FORCE_CAL 2 #define F54_FORCE_CAL 2
...@@ -526,6 +532,7 @@ static void rmi_f54_work(struct work_struct *work) ...@@ -526,6 +532,7 @@ static void rmi_f54_work(struct work_struct *work)
int report_size; int report_size;
u8 command; u8 command;
int error; int error;
int i;
report_size = rmi_f54_get_report_size(f54); report_size = rmi_f54_get_report_size(f54);
if (report_size == 0) { if (report_size == 0) {
...@@ -558,8 +565,11 @@ static void rmi_f54_work(struct work_struct *work) ...@@ -558,8 +565,11 @@ static void rmi_f54_work(struct work_struct *work)
rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Get report command completed, reading data\n"); rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Get report command completed, reading data\n");
fifo[0] = 0; for (i = 0; i < report_size; i += F54_REPORT_DATA_SIZE) {
fifo[1] = 0; int size = min(F54_REPORT_DATA_SIZE, report_size - i);
fifo[0] = i & 0xff;
fifo[1] = i >> 8;
error = rmi_write_block(fn->rmi_dev, error = rmi_write_block(fn->rmi_dev,
fn->fd.data_base_addr + F54_FIFO_OFFSET, fn->fd.data_base_addr + F54_FIFO_OFFSET,
fifo, sizeof(fifo)); fifo, sizeof(fifo));
...@@ -569,13 +579,14 @@ static void rmi_f54_work(struct work_struct *work) ...@@ -569,13 +579,14 @@ static void rmi_f54_work(struct work_struct *work)
} }
error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr + error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr +
F54_REPORT_DATA_OFFSET, f54->report_data, F54_REPORT_DATA_OFFSET,
report_size); f54->report_data + i, size);
if (error) { if (error) {
dev_err(&fn->dev, "%s: read [%d bytes] returned %d\n", dev_err(&fn->dev, "%s: read [%d bytes] returned %d\n",
__func__, report_size, error); __func__, size, error);
goto abort; goto abort;
} }
}
abort: abort:
f54->report_size = error ? 0 : report_size; f54->report_size = error ? 0 : report_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment