aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/touchscreen/synaptics_fw_updater.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/touchscreen/synaptics_fw_updater.c')
-rw-r--r--drivers/input/touchscreen/synaptics_fw_updater.c91
1 files changed, 69 insertions, 22 deletions
diff --git a/drivers/input/touchscreen/synaptics_fw_updater.c b/drivers/input/touchscreen/synaptics_fw_updater.c
index 1a15fdc..2b8293f 100644
--- a/drivers/input/touchscreen/synaptics_fw_updater.c
+++ b/drivers/input/touchscreen/synaptics_fw_updater.c
@@ -399,39 +399,79 @@ int synaptics_fw_updater(struct synaptics_drv_data *data, u8 *fw_data)
{
struct synaptics_ts_fw_block *fw;
int irq = gpio_to_irq(data->gpio);
- bool update = true;
+ bool update = false;
fw = kzalloc(sizeof(struct synaptics_ts_fw_block), GFP_KERNEL);
data->fw = fw;
if (NULL == fw_data) {
- u8 *buf, *fw_version;
- buf = kzalloc(4, GFP_KERNEL);
- fw_version = kzalloc(4, GFP_KERNEL);
+ u8 buf[5] = {0, };
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+ if (data->pdata->support_extend_button) {
+ fw->fw_data = (u8 *)rmi_fw_button;
+
+ /* set firmware data */
+ data->firm_version[0] = rmi_fw_button[0xb100];
+ data->firm_version[1] = rmi_fw_button[0xb101];
+ data->firm_version[2] = rmi_fw_button[0xb102];
+ data->firm_version[3] = rmi_fw_button[0xb103];
+ data->firm_version[4] = '\0';
+
+ strncpy(data->firm_config, rmi_config_ver_button,
+ sizeof(data->firm_config));
+ } else {
+ fw->fw_data = (u8 *)rmi_fw;
+
+ data->firm_version[0] = rmi_fw[0xb100];
+ data->firm_version[1] = rmi_fw[0xb101];
+ data->firm_version[2] = rmi_fw[0xb102];
+ data->firm_version[3] = rmi_fw[0xb103];
+ data->firm_version[4] = '\0';
+
+ strncpy(data->firm_config, rmi_config_ver,
+ sizeof(data->firm_config));
+ }
+#else
fw->fw_data = (u8 *)rmi_fw;
- strncpy(fw_version, &rmi_fw[0xb100],
- sizeof(fw_version));
- strncpy(data->firm_version, fw_version,
- sizeof(data->firm_version));
+
+ data->firm_version[0] = rmi_fw[0xb100];
+ data->firm_version[1] = rmi_fw[0xb101];
+ data->firm_version[2] = rmi_fw[0xb102];
+ data->firm_version[3] = rmi_fw[0xb103];
+ data->firm_version[4] = '\0';
+
strncpy(data->firm_config, rmi_config_ver,
sizeof(data->firm_config));
- synaptics_ts_read_block(data,
+#endif
+ if (synaptics_ts_read_block(data,
data->f34.control_base_addr,
- buf, 4);
-
- printk(KERN_DEBUG "[TSP] IC FW. : [%s], new FW. : [%s]\n",
- buf, fw_version);
-
- if (strncmp((char *)fw_version, (char *)buf, 4) == 0)
- update = false;
-
- kfree(buf);
- kfree(fw_version);
-
- } else
+ buf, 4) > 0)
+ printk(KERN_DEBUG "[TSP] block read success!\n");
+ else
+ printk(KERN_DEBUG "[TSP] block read failed!\n");
+
+ printk(KERN_DEBUG "[TSP] IC FW. : [%c%c%.2d%.2d00], new FW. : [%c%c%.2d%.2d00]\n",
+ buf[0],buf[1],buf[2],buf[3],
+ data->firm_version[0],data->firm_version[1],
+ data->firm_version[2],data->firm_version[3]);
+
+ /* update firm > tsp */
+ /*
+ if (strcmp(data->firm_version, buf) > 0) {
+ printk(KERN_DEBUG "[TSP] update!\n");
+ update = true;
+ }
+ */
+ /* update if firm != tsp */
+ if (strncmp(data->firm_version, buf, 4) != 0)
+ update = true;
+ } else {
fw->fw_data = fw_data;
-
+ update = true;
+ }
+
if (update) {
+ printk(KERN_DEBUG "[TSP] tsp update!!\n");
disable_irq(irq);
wake_lock(&data->wakelock);
synaptics_fw_initialize(data);
@@ -463,6 +503,13 @@ int synaptics_fw_updater(struct synaptics_drv_data *data, u8 *fw_data)
void forced_fw_update(struct synaptics_drv_data *data)
{
+#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S7301_KEYS)
+ if (data->pdata->support_extend_button)
+ synaptics_fw_updater(data, (u8 *)rmi_fw_button);
+ else
+ synaptics_fw_updater(data, (u8 *)rmi_fw);
+#else
synaptics_fw_updater(data, (u8 *)rmi_fw);
+#endif
}