summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen
diff options
context:
space:
mode:
authorMao Li <maol@codeaurora.org>2014-05-15 17:36:00 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-21 21:12:40 -0700
commit19cda0c39a6eb40af171c58bc42ff9beea3d0d0a (patch)
treec3f156bc3089d284becd1b4d67e75d4aa0bfa7f8 /drivers/input/touchscreen
parenta80c7960f1e098e5de43eae1a420a5576cd7a73a (diff)
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>
Diffstat (limited to 'drivers/input/touchscreen')
-rw-r--r--drivers/input/touchscreen/ft5x06_ts.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/drivers/input/touchscreen/ft5x06_ts.c b/drivers/input/touchscreen/ft5x06_ts.c
index c0e756fc59f9..421021ab0a4e 100644
--- a/drivers/input/touchscreen/ft5x06_ts.c
+++ b/drivers/input/touchscreen/ft5x06_ts.c
@@ -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);