input: cyttsp-i2c: Improve error handling in bootloader mode
Attempt multiple I2C writes (in case of failures) to get the
device out of bootloader mode.
Signed-off-by: Anirudh Ghayal <aghayal@codeaurora.org>
diff --git a/drivers/input/touchscreen/cyttsp-i2c.c b/drivers/input/touchscreen/cyttsp-i2c.c
index 9e50ee0..ddbdca6 100644
--- a/drivers/input/touchscreen/cyttsp-i2c.c
+++ b/drivers/input/touchscreen/cyttsp-i2c.c
@@ -2173,24 +2173,34 @@
/* take TTSP out of bootloader mode; go to TrueTouch operational mode */
if (!(retval < CY_OK)) {
cyttsp_xdebug1("exit bootloader; go operational\n");
- retval = i2c_smbus_write_i2c_block_data(ts->client,
- CY_REG_BASE, sizeof(bl_cmd), bl_cmd);
tries = 0;
do {
- mdelay(100);
- cyttsp_putbl(ts, 4, true, false, false);
- cyttsp_info("BL%d: f=%02X s=%02X err=%02X bl=%02X%02X bld=%02X%02X\n", \
- 104, \
- g_bl_data.bl_file, g_bl_data.bl_status, \
- g_bl_data.bl_error, \
- g_bl_data.blver_hi, g_bl_data.blver_lo, \
- g_bl_data.bld_blver_hi, g_bl_data.bld_blver_lo);
- } while (GET_BOOTLOADERMODE(g_bl_data.bl_status) &&
- tries++ < 100);
+ msleep(100);
+ retval = i2c_smbus_write_i2c_block_data(ts->client,
+ CY_REG_BASE, sizeof(bl_cmd), bl_cmd);
+ if (retval == CY_OK)
+ break;
+ } while (tries++ < 5);
+
+ if (retval == CY_OK) {
+ tries = 0;
+ do {
+ msleep(100);
+ cyttsp_putbl(ts, 4, true, false, false);
+ cyttsp_info("BL%d: f=%02X s=%02X err=%02X" \
+ "bl=%02X%02X bld=%02X%02X\n", 104, \
+ g_bl_data.bl_file, \
+ g_bl_data.bl_status, \
+ g_bl_data.bl_error, \
+ g_bl_data.blver_hi, \
+ g_bl_data.blver_lo, \
+ g_bl_data.bld_blver_hi, \
+ g_bl_data.bld_blver_lo);
+ } while (GET_BOOTLOADERMODE(g_bl_data.bl_status) &&
+ tries++ < 5);
+ }
}
-
-
if (!(retval < CY_OK) &&
cyttsp_app_load()) {
if (CY_DIFF(g_bl_data.ttspver_hi, cyttsp_tts_verh()) ||