Commit bc1d57fe authored by Johnny Chuang's avatar Johnny Chuang Committed by Dmitry Torokhov

Input: elants_i2c - get product id on recovery mode for FW update

We use hw version to construct name of file holding touchscreen firmware,
so let's try reading it even if touchscreen initialization fails (the
firmware supports reading product/hardware id even when device is in
recovery/boot mode).
Signed-off-by: default avatarJohnny Chuang <johnny.chuang@emc.com.tw>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent c9a3a7cf
...@@ -298,7 +298,7 @@ static u16 elants_i2c_parse_version(u8 *buf) ...@@ -298,7 +298,7 @@ static u16 elants_i2c_parse_version(u8 *buf)
return get_unaligned_be32(buf) >> 4; return get_unaligned_be32(buf) >> 4;
} }
static int elants_i2c_query_fw_id(struct elants_data *ts) static int elants_i2c_query_hw_version(struct elants_data *ts)
{ {
struct i2c_client *client = ts->client; struct i2c_client *client = ts->client;
int error, retry_cnt; int error, retry_cnt;
...@@ -318,8 +318,13 @@ static int elants_i2c_query_fw_id(struct elants_data *ts) ...@@ -318,8 +318,13 @@ static int elants_i2c_query_fw_id(struct elants_data *ts)
error, (int)sizeof(resp), resp); error, (int)sizeof(resp), resp);
} }
if (error) {
dev_err(&client->dev, dev_err(&client->dev,
"Failed to read fw id or fw id is invalid\n"); "Failed to read fw id: %d\n", error);
return error;
}
dev_err(&client->dev, "Invalid fw id: %#04x\n", ts->hw_version);
return -EINVAL; return -EINVAL;
} }
...@@ -508,7 +513,7 @@ static int elants_i2c_fastboot(struct i2c_client *client) ...@@ -508,7 +513,7 @@ static int elants_i2c_fastboot(struct i2c_client *client)
static int elants_i2c_initialize(struct elants_data *ts) static int elants_i2c_initialize(struct elants_data *ts)
{ {
struct i2c_client *client = ts->client; struct i2c_client *client = ts->client;
int error, retry_cnt; int error, error2, retry_cnt;
const u8 hello_packet[] = { 0x55, 0x55, 0x55, 0x55 }; const u8 hello_packet[] = { 0x55, 0x55, 0x55, 0x55 };
const u8 recov_packet[] = { 0x55, 0x55, 0x80, 0x80 }; const u8 recov_packet[] = { 0x55, 0x55, 0x80, 0x80 };
u8 buf[HEADER_SIZE]; u8 buf[HEADER_SIZE];
...@@ -553,18 +558,22 @@ static int elants_i2c_initialize(struct elants_data *ts) ...@@ -553,18 +558,22 @@ static int elants_i2c_initialize(struct elants_data *ts)
} }
} }
/* hw version is available even if device in recovery state */
error2 = elants_i2c_query_hw_version(ts);
if (!error) if (!error)
error = elants_i2c_query_fw_id(ts); error = error2;
if (!error) if (!error)
error = elants_i2c_query_fw_version(ts); error = elants_i2c_query_fw_version(ts);
if (!error)
error = elants_i2c_query_test_version(ts);
if (!error)
error = elants_i2c_query_bc_version(ts);
if (!error)
error = elants_i2c_query_ts_info(ts);
if (error) { if (error)
ts->iap_mode = ELAN_IAP_RECOVERY; ts->iap_mode = ELAN_IAP_RECOVERY;
} else {
elants_i2c_query_test_version(ts);
elants_i2c_query_bc_version(ts);
elants_i2c_query_ts_info(ts);
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment