aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorBenson Leung <bleung@chromium.org>2014-05-19 02:03:09 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-05-19 02:27:25 -0400
commita0434b751d0a2cc29d264f26a48962c1648aac10 (patch)
tree0eaf0413d52a253c48c1feecb2be8a7a34baecbb /drivers/input
parentd79e7e47a9442abfcc252c8363521fe84c6b5783 (diff)
Input: atmel_mxt_ts - wait for CHG after bootloader resets
Rather than msleep for MXT_RESET_TIME and MXT_FWRESET_TIME during the transition to bootloader mode and the transition back from app, wait for the CHG assert to indicate that the transition is done. This change replaces the msleep with a wait for completion that the mxt_interrupt handler signals. Also add CHG poll after last firmware frame - some bootloader versions will assert the interrupt line after the final frame, in testing this meant that the driver attempts to read the info block too early whilst the chip is still resetting. This improves firmware update time as we no longer wait longer than necessary for each reset. Signed-off-by: Benson Leung <bleung@chromium.org> Signed-off-by: Daniel Kurtz <djkurtz@chromium.org> Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk> Acked-by: Yufeng Shen <miletus@chromium.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 7f51d39ce2fb..d5b30434c4ac 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -181,8 +181,8 @@
181#define MXT_BACKUP_VALUE 0x55 181#define MXT_BACKUP_VALUE 0x55
182#define MXT_BACKUP_TIME 50 /* msec */ 182#define MXT_BACKUP_TIME 50 /* msec */
183#define MXT_RESET_TIME 200 /* msec */ 183#define MXT_RESET_TIME 200 /* msec */
184 184#define MXT_FW_RESET_TIME 3000 /* msec */
185#define MXT_FWRESET_TIME 175 /* msec */ 185#define MXT_FW_CHG_TIMEOUT 300 /* msec */
186 186
187/* Command to unlock bootloader */ 187/* Command to unlock bootloader */
188#define MXT_UNLOCK_CMD_MSB 0xaa 188#define MXT_UNLOCK_CMD_MSB 0xaa
@@ -375,7 +375,7 @@ recheck:
375 * CHG assertion before reading the status byte. 375 * CHG assertion before reading the status byte.
376 * Once the status byte has been read, the line is deasserted. 376 * Once the status byte has been read, the line is deasserted.
377 */ 377 */
378 ret = mxt_wait_for_chg(data, 300); 378 ret = mxt_wait_for_chg(data, MXT_FW_CHG_TIMEOUT);
379 if (ret) { 379 if (ret) {
380 /* 380 /*
381 * TODO: handle -ERESTARTSYS better by terminating 381 * TODO: handle -ERESTARTSYS better by terminating
@@ -1047,6 +1047,18 @@ static int mxt_load_fw(struct device *dev, const char *fn)
1047 dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, fw->size); 1047 dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, fw->size);
1048 } 1048 }
1049 1049
1050 /* Wait for flash. */
1051 ret = mxt_wait_for_chg(data, MXT_FW_RESET_TIME);
1052 if (ret)
1053 goto disable_irq;
1054
1055 /*
1056 * Wait for device to reset. Some bootloader versions do not assert
1057 * the CHG line after bootloading has finished, so ignore potential
1058 * errors.
1059 */
1060 mxt_wait_for_chg(data, MXT_FW_RESET_TIME);
1061
1050 data->in_bootloader = false; 1062 data->in_bootloader = false;
1051 1063
1052disable_irq: 1064disable_irq:
@@ -1075,10 +1087,6 @@ static ssize_t mxt_update_fw_store(struct device *dev,
1075 count = error; 1087 count = error;
1076 } else { 1088 } else {
1077 dev_dbg(dev, "The firmware update succeeded\n"); 1089 dev_dbg(dev, "The firmware update succeeded\n");
1078
1079 /* Wait for reset */
1080 msleep(MXT_FWRESET_TIME);
1081
1082 mxt_free_object_table(data); 1090 mxt_free_object_table(data);
1083 1091
1084 mxt_initialize(data); 1092 mxt_initialize(data);