Message ID | 20210510083536.41925-1-simba.hsu@rad-ic.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | driver:input:touchscreen: improve the mechanism of auto-update | expand |
Hi, On Mon, May 10, 2021 at 04:35:36PM +0800, simba.hsu wrote: > From: "simba.hsu" <simba.hsu@raydium.corp-partner.google.com> > > Once auto-update has been interrupted, touch IC will be stuck in > recovery mode forever and it will lead to touch malfunction. > This patch makes auto-update available when touch IC is in > recovery mode to avoid touch malfunction. > > Signed-off-by: simba.hsu <simba.hsu@rad-ic.com> > --- > 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..50f6fbbe4775 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]); This looks like a big-endian data. Is this correct? If so, could you please see if the version of the patch below still works for you? Thanks!
diff --git a/drivers/input/touchscreen/raydium_i2c_ts.c b/drivers/input/touchscreen/raydium_i2c_ts.c index 4d2d22a86977..50f6fbbe4775 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 = 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 */ } };