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:
Mao Li 2014-05-15 17:36:00 +08:00 committed by Gerrit - the friendly Code Review server
parent a80c7960f1
commit 19cda0c39a
2 changed files with 27 additions and 6 deletions

View file

@ -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);

View file

@ -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;