Input: exc3000 - fix firmware version query for device in bootloader
authorLucas Stach <l.stach@pengutronix.de>
Mon, 8 Mar 2021 05:40:01 +0000 (21:40 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 8 Mar 2021 05:56:49 +0000 (21:56 -0800)
If the device is stuck in bootloader (maybe due to blank or corrupted
application firmware) it won't answer a query for the firmware version.
Fall back to returning the bootloader version in that case.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Link: https://lore.kernel.org/r/20210125182527.1225245-4-l.stach@pengutronix.de
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/exc3000.c

index e55fb79..66682a0 100644 (file)
@@ -263,6 +263,20 @@ static ssize_t fw_version_show(struct device *dev,
        u8 response[EXC3000_LEN_FRAME];
        int ret;
 
+       /* query bootloader info */
+       ret = exc3000_vendor_data_request(data,
+                                         (u8[]){0x39, 0x02}, 2, response, 1);
+       if (ret < 0)
+               return ret;
+
+       /*
+        * If the bootloader version is non-zero then the device is in
+        * bootloader mode and won't answer a query for the application FW
+        * version, so we just use the bootloader version info.
+        */
+       if (response[2] || response[3])
+               return sprintf(buf, "%d.%d\n", response[2], response[3]);
+
        ret = exc3000_vendor_data_request(data, (u8[]){'D'}, 1, response, 1);
        if (ret < 0)
                return ret;