Input: ads7846 - always set last command to PWRDOWN
authorLuca Ellero <l.ellero@asem.it>
Thu, 26 Jan 2023 10:52:26 +0000 (11:52 +0100)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 30 Jan 2023 02:33:45 +0000 (18:33 -0800)
Controllers that report pressure (e.g. ADS7846) use 5 commands and the
correct sequence is READ_X, READ_Y, READ_Z1, READ_Z2, PWRDOWN.

Controllers that don't report pressure (e.g. ADS7845/ADS7843) use only 3
commands and the correct sequence should be READ_X, READ_Y, PWRDOWN. But
the sequence sent was incorrect: READ_X, READ_Y, READ_Z1.

Fix this by setting the third (and last) command to PWRDOWN.

Fixes: ffa458c1bd9b ("spi: ads7846 driver")
Signed-off-by: Luca Ellero <l.ellero@asem.it>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20230126105227.47648-3-l.ellero@asem.it
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/ads7846.c

index f11b444f21384e1905b25bf2992ae242536c11a7..15da1047a5776cafc26bb836cad6bf26ecbc44bc 100644 (file)
@@ -1066,6 +1066,9 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts,
                struct ads7846_buf_layout *l = &packet->l[cmd_idx];
                unsigned int max_count;
 
+               if (cmd_idx == packet->cmds - 1)
+                       cmd_idx = ADS7846_PWDOWN;
+
                if (ads7846_cmd_need_settle(cmd_idx))
                        max_count = packet->count + packet->count_skip;
                else
@@ -1102,7 +1105,12 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts,
 
        for (cmd_idx = 0; cmd_idx < packet->cmds; cmd_idx++) {
                struct ads7846_buf_layout *l = &packet->l[cmd_idx];
-               u8 cmd = ads7846_get_cmd(cmd_idx, vref);
+               u8 cmd;
+
+               if (cmd_idx == packet->cmds - 1)
+                       cmd_idx = ADS7846_PWDOWN;
+
+               cmd = ads7846_get_cmd(cmd_idx, vref);
 
                for (b = 0; b < l->count; b++)
                        packet->tx[l->offset + b].cmd = cmd;