input: ft5x06_ts: add support for firmware update for CTP FT6X36
The firmware image format is changed in CTP FT6436. Also vendor id and version id are read from fw image from a different offset as compared to previous controllers. The driver is updated to support the new image format. This patch is propagated from msm-3.18 kernel 'commit 6146c68f81b4 ("input: ft5x06_ts: add support for firmware update for CTP FT6X36")' Change-Id: I465fdfa73e56e8fc4bbfdde980c558e4715d6d08 Signed-off-by: Mao Li <maol@codeaurora.org> Signed-off-by: Sudhakar Manapati <smanap@codeaurora.org>
This commit is contained in:
parent
a80c7960f1
commit
19cda0c39a
2 changed files with 27 additions and 6 deletions
|
@ -104,6 +104,7 @@
|
|||
#define FT5316_ID 0x0A
|
||||
#define FT5306I_ID 0x55
|
||||
#define FT6X06_ID 0x06
|
||||
#define FT6X36_ID 0x36
|
||||
|
||||
#define FT_UPGRADE_AA 0xAA
|
||||
#define FT_UPGRADE_55 0x55
|
||||
|
@ -116,10 +117,22 @@
|
|||
#define FT_FW_FILE_MIN_VER(x) 0
|
||||
#define FT_FW_FILE_SUB_MIN_VER(x) 0
|
||||
|
||||
#define FT_FW_CHECK(x) \
|
||||
#define FT_FW_FILE_MAJ_VER_FT6X36(x) ((x)->data[0x10a])
|
||||
#define FT_FW_FILE_VENDOR_ID_FT6X36(x) ((x)->data[0x108])
|
||||
|
||||
/**
|
||||
* Application data verification will be run before upgrade flow.
|
||||
* Firmware image stores some flags with negative and positive value
|
||||
* in corresponding addresses, we need pick them out do some check to
|
||||
* make sure the application data is valid.
|
||||
*/
|
||||
#define FT_FW_CHECK(x, ts_data) \
|
||||
(ts_data->family_id == FT6X36_ID ? \
|
||||
(((x)->data[0x104] ^ (x)->data[0x105]) == 0xFF \
|
||||
&& ((x)->data[0x106] ^ (x)->data[0x107]) == 0xFF) : \
|
||||
(((x)->data[(x)->size - 8] ^ (x)->data[(x)->size - 6]) == 0xFF \
|
||||
&& (((x)->data[(x)->size - 7] ^ (x)->data[(x)->size - 5]) == 0xFF \
|
||||
&& (((x)->data[(x)->size - 3] ^ (x)->data[(x)->size - 4]) == 0xFF)))
|
||||
&& ((x)->data[(x)->size - 7] ^ (x)->data[(x)->size - 5]) == 0xFF \
|
||||
&& ((x)->data[(x)->size - 3] ^ (x)->data[(x)->size - 4]) == 0xFF))
|
||||
|
||||
#define FT_MAX_TRIES 5
|
||||
#define FT_RETRY_DLY 20
|
||||
|
@ -701,7 +714,8 @@ static int ft5x06_fw_upgrade_start(struct i2c_client *client,
|
|||
for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) {
|
||||
msleep(FT_EARSE_DLY_MS);
|
||||
/* reset - write 0xaa and 0x55 to reset register */
|
||||
if (ts_data->family_id == FT6X06_ID)
|
||||
if (ts_data->family_id == FT6X06_ID
|
||||
|| ts_data->family_id == FT6X36_ID)
|
||||
reset_reg = FT_RST_CMD_REG2;
|
||||
else
|
||||
reset_reg = FT_RST_CMD_REG1;
|
||||
|
@ -906,7 +920,13 @@ static int ft5x06_fw_upgrade(struct device *dev, bool force)
|
|||
goto rel_fw;
|
||||
}
|
||||
|
||||
fw_file_maj = FT_FW_FILE_MAJ_VER(fw);
|
||||
if (data->family_id == FT6X36_ID) {
|
||||
fw_file_maj = FT_FW_FILE_MAJ_VER_FT6X36(fw);
|
||||
fw_file_vendor_id = FT_FW_FILE_VENDOR_ID_FT6X36(fw);
|
||||
} else {
|
||||
fw_file_maj = FT_FW_FILE_MAJ_VER(fw);
|
||||
fw_file_vendor_id = FT_FW_FILE_VENDOR_ID(fw);
|
||||
}
|
||||
fw_file_min = FT_FW_FILE_MIN_VER(fw);
|
||||
fw_file_sub_min = FT_FW_FILE_SUB_MIN_VER(fw);
|
||||
|
||||
|
@ -934,7 +954,7 @@ static int ft5x06_fw_upgrade(struct device *dev, bool force)
|
|||
}
|
||||
|
||||
/* start firmware upgrade */
|
||||
if (FT_FW_CHECK(fw)) {
|
||||
if (FT_FW_CHECK(fw, data)) {
|
||||
rc = ft5x06_fw_upgrade_start(data->client, fw->data, fw->size);
|
||||
if (rc < 0)
|
||||
dev_err(dev, "update failed (%d). try later...\n", rc);
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#define FT5X16_ID 0x0A
|
||||
#define FT5X36_ID 0x14
|
||||
#define FT6X06_ID 0x06
|
||||
#define FT6X36_ID 0x36
|
||||
|
||||
struct fw_upgrade_info {
|
||||
bool auto_cal;
|
||||
|
|
Loading…
Add table
Reference in a new issue