This path makes auto-update available when IC's status is
Recovery mode

Signed-off-by: simba.hsu <simba....@raydium.corp-partner.google.com>
Change-Id: Icf974d59f7717da0de8bd97a06c496a32dafa1ff
---
 drivers/input/touchscreen/raydium_i2c_ts.c | 53 ++++++++++++++++++----
 1 file changed, 45 insertions(+), 8 deletions(-)

diff --git a/drivers/input/touchscreen/raydium_i2c_ts.c 
b/drivers/input/touchscreen/raydium_i2c_ts.c
index 4d2d22a86977..a97403c55f75 100644
--- a/drivers/input/touchscreen/raydium_i2c_ts.c
+++ b/drivers/input/touchscreen/raydium_i2c_ts.c
@@ -36,7 +36,8 @@
 #define RM_CMD_BOOT_CHK                0x33            /* send data check */
 #define RM_CMD_BOOT_READ       0x44            /* send wait bl data ready*/
 
-#define RM_BOOT_RDY            0xFF            /* bl data ready */
+#define RM_BOOT_RDY            0xFF                    /* bl data ready */
+#define RM_BOOT_CMD_READHWID   0x0E    /* read hwid */
 
 /* I2C main commands */
 #define RM_CMD_QUERY_BANK      0x2B
@@ -155,6 +156,7 @@ static int raydium_i2c_xfer(struct i2c_client *client, u32 
addr,
         * sent first. Else, skip the header i.e. xfer[0].
         */
        int xfer_start_idx = (addr > 0xff) ? 0 : 1;
+
        xfer_count -= xfer_start_idx;
 
        ret = i2c_transfer(client->adapter, &xfer[xfer_start_idx], xfer_count);
@@ -289,6 +291,44 @@ static int raydium_i2c_sw_reset(struct i2c_client *client)
 
        return 0;
 }
+static int raydium_i2c_query_ts_BL_info(struct raydium_data *ts)
+{
+       struct i2c_client *client = ts->client;
+       static const u8 get_hwid[7] = {RM_BOOT_CMD_READHWID,
+                                        0x10, 0xc0, 0x01, 0x00, 0x04, 0x00};
+       int error;
+       u8 rbuf[5] = {0, 0, 0, 0, 0};
+       u32 tmpdata = 0;
+
+       error = raydium_i2c_send(client,
+                                RM_CMD_BOOT_WRT, get_hwid, sizeof(get_hwid));
+       if (error) {
+               dev_err(&client->dev, "WRT HWID command failed: %d\n", error);
+               return error;
+       }
+
+       error = raydium_i2c_send(client, RM_CMD_BOOT_ACK, rbuf, 1);
+       if (error) {
+               dev_err(&client->dev, "Ack HWID command failed: %d\n", error);
+               return error;
+       }
+
+       error = raydium_i2c_read(client,
+                                RM_CMD_BOOT_CHK, rbuf, sizeof(rbuf));
+       if (!error) {
+               tmpdata = (rbuf[1]<<24|rbuf[2]<<16|rbuf[3]<<8|rbuf[4]);
+               ts->info.hw_ver = cpu_to_le32(tmpdata);
+               dev_err(&client->dev, "HWID %08X\n", ts->info.hw_ver);
+       } else {
+               ts->info.hw_ver = cpu_to_le32(0xffffffffUL);
+               dev_err(&client->dev, "raydium_i2c_read HWID failed, %X, %X, 
%X, %X\n",
+                                        rbuf[1], rbuf[2], rbuf[3], rbuf[4]);
+       }
+       ts->info.main_ver = 0xff;
+       ts->info.sub_ver = 0xff;
+
+       return error;
+}
 
 static int raydium_i2c_query_ts_info(struct raydium_data *ts)
 {
@@ -388,13 +428,10 @@ static int raydium_i2c_initialize(struct raydium_data *ts)
        if (error)
                ts->boot_mode = RAYDIUM_TS_BLDR;
 
-       if (ts->boot_mode == RAYDIUM_TS_BLDR) {
-               ts->info.hw_ver = cpu_to_le32(0xffffffffUL);
-               ts->info.main_ver = 0xff;
-               ts->info.sub_ver = 0xff;
-       } else {
+       if (ts->boot_mode == RAYDIUM_TS_BLDR)
+               raydium_i2c_query_ts_BL_info(ts);
+       else
                raydium_i2c_query_ts_info(ts);
-       }
 
        return error;
 }
@@ -1218,7 +1255,7 @@ static SIMPLE_DEV_PM_OPS(raydium_i2c_pm_ops,
                         raydium_i2c_suspend, raydium_i2c_resume);
 
 static const struct i2c_device_id raydium_i2c_id[] = {
-       { "raydium_i2c" , 0 },
+       { "raydium_i2c", 0 },
        { "rm32380", 0 },
        { /* sentinel */ }
 };
-- 
2.25.1

Reply via email to