Signed-off-by: Nick Dyer <nick.d...@itdev.co.uk>
Acked-by: Benson Leung <ble...@chromium.org>
---
 drivers/input/touchscreen/atmel_mxt_ts.c |   28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c 
b/drivers/input/touchscreen/atmel_mxt_ts.c
index c18803a..125fe2f 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -459,14 +459,15 @@ static u8 mxt_get_bootloader_version(struct mxt_data 
*data, u8 val)
        }
 }
 
-static int mxt_check_bootloader(struct mxt_data *data, unsigned int state)
+static int mxt_check_bootloader(struct mxt_data *data, unsigned int state,
+                               bool wait)
 {
        struct device *dev = &data->client->dev;
        u8 val;
        int ret;
 
 recheck:
-       if (state != MXT_WAITING_BOOTLOAD_CMD) {
+       if (wait) {
                /*
                 * In application update mode, the interrupt
                 * line signals state transitions. We must wait for the
@@ -1616,15 +1617,24 @@ static int mxt_load_fw(struct device *dev, const char 
*fn)
        mxt_free_object_table(data);
        INIT_COMPLETION(data->bl_completion);
 
-       ret = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD);
-       if (ret)
-               goto disable_irq;
+       ret = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD, false);
+       if (ret) {
+               /* Bootloader may still be unlocked from previous update
+                * attempt */
+               ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, false);
+               if (ret)
+                       goto disable_irq;
+       } else {
+               dev_info(dev, "Unlocking bootloader\n");
 
-       /* Unlock bootloader */
-       mxt_unlock_bootloader(data);
+               /* Unlock bootloader */
+               ret = mxt_unlock_bootloader(data);
+               if (ret)
+                       goto disable_irq;
+       }
 
        while (pos < fw->size) {
-               ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA);
+               ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, true);
                if (ret)
                        goto disable_irq;
 
@@ -1638,7 +1648,7 @@ static int mxt_load_fw(struct device *dev, const char *fn)
                if (ret)
                        goto disable_irq;
 
-               ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS);
+               ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS, true);
                if (ret) {
                        retry++;
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to