|
24 | 24 | #define F54_NUM_TX_OFFSET 1
|
25 | 25 | #define F54_NUM_RX_OFFSET 0
|
26 | 26 |
|
| 27 | +/* |
| 28 | + * The smbus protocol can read only 32 bytes max at a time. |
| 29 | + * But this should be fine for i2c/spi as well. |
| 30 | + */ |
| 31 | +#define F54_REPORT_DATA_SIZE 32 |
| 32 | + |
27 | 33 | /* F54 commands */
|
28 | 34 | #define F54_GET_REPORT 1
|
29 | 35 | #define F54_FORCE_CAL 2
|
@@ -526,6 +532,7 @@ static void rmi_f54_work(struct work_struct *work)
|
526 | 532 | int report_size;
|
527 | 533 | u8 command;
|
528 | 534 | int error;
|
| 535 | + int i; |
529 | 536 |
|
530 | 537 | report_size = rmi_f54_get_report_size(f54);
|
531 | 538 | if (report_size == 0) {
|
@@ -558,23 +565,27 @@ static void rmi_f54_work(struct work_struct *work)
|
558 | 565 |
|
559 | 566 | rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Get report command completed, reading data\n");
|
560 | 567 |
|
561 |
| - fifo[0] = 0; |
562 |
| - fifo[1] = 0; |
563 |
| - error = rmi_write_block(fn->rmi_dev, |
564 |
| - fn->fd.data_base_addr + F54_FIFO_OFFSET, |
565 |
| - fifo, sizeof(fifo)); |
566 |
| - if (error) { |
567 |
| - dev_err(&fn->dev, "Failed to set fifo start offset\n"); |
568 |
| - goto abort; |
569 |
| - } |
| 568 | + for (i = 0; i < report_size; i += F54_REPORT_DATA_SIZE) { |
| 569 | + int size = min(F54_REPORT_DATA_SIZE, report_size - i); |
| 570 | + |
| 571 | + fifo[0] = i & 0xff; |
| 572 | + fifo[1] = i >> 8; |
| 573 | + error = rmi_write_block(fn->rmi_dev, |
| 574 | + fn->fd.data_base_addr + F54_FIFO_OFFSET, |
| 575 | + fifo, sizeof(fifo)); |
| 576 | + if (error) { |
| 577 | + dev_err(&fn->dev, "Failed to set fifo start offset\n"); |
| 578 | + goto abort; |
| 579 | + } |
570 | 580 |
|
571 |
| - error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr + |
572 |
| - F54_REPORT_DATA_OFFSET, f54->report_data, |
573 |
| - report_size); |
574 |
| - if (error) { |
575 |
| - dev_err(&fn->dev, "%s: read [%d bytes] returned %d\n", |
576 |
| - __func__, report_size, error); |
577 |
| - goto abort; |
| 581 | + error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr + |
| 582 | + F54_REPORT_DATA_OFFSET, |
| 583 | + f54->report_data + i, size); |
| 584 | + if (error) { |
| 585 | + dev_err(&fn->dev, "%s: read [%d bytes] returned %d\n", |
| 586 | + __func__, size, error); |
| 587 | + goto abort; |
| 588 | + } |
578 | 589 | }
|
579 | 590 |
|
580 | 591 | abort:
|
|
0 commit comments