From: Nick Dyer <[email protected]>

On a warm probe, the device might be in a state where an flash operation was
not completed.

Signed-off-by: Nick Dyer <[email protected]>
Acked-by: Benson Leung <[email protected]>
Acked-by: Yufeng Shen <[email protected]>
---
 drivers/input/touchscreen/atmel_mxt_ts.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c 
b/drivers/input/touchscreen/atmel_mxt_ts.c
index aa957d2..f9db3e1 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -453,14 +453,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
@@ -1726,15 +1727,23 @@ static int mxt_load_fw(struct device *dev, const char 
*fn)
        mxt_free_object_table(data);
        reinit_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 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;
 
@@ -1748,7 +1757,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++;
 
-- 
2.0.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
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