Răsfoiți Sursa

Input: atmel_mxt_ts - handle bootloader previously unlocked

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

Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
Acked-by: Benson Leung <bleung@chromium.org>
Acked-by: Yufeng Shen <miletus@chromium.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Nick Dyer 11 ani în urmă
părinte
comite
385deb962a
1 a modificat fișierele cu 18 adăugiri și 9 ștergeri
  1. 18 9
      drivers/input/touchscreen/atmel_mxt_ts.c

+ 18 - 9
drivers/input/touchscreen/atmel_mxt_ts.c

@@ -449,14 +449,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;
 	struct device *dev = &data->client->dev;
 	u8 val;
 	u8 val;
 	int ret;
 	int ret;
 
 
 recheck:
 recheck:
-	if (state != MXT_WAITING_BOOTLOAD_CMD) {
+	if (wait) {
 		/*
 		/*
 		 * In application update mode, the interrupt
 		 * In application update mode, the interrupt
 		 * line signals state transitions. We must wait for the
 		 * line signals state transitions. We must wait for the
@@ -1676,15 +1677,23 @@ static int mxt_load_fw(struct device *dev, const char *fn)
 	mxt_free_object_table(data);
 	mxt_free_object_table(data);
 	reinit_completion(&data->bl_completion);
 	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) {
 	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)
 		if (ret)
 			goto disable_irq;
 			goto disable_irq;
 
 
@@ -1698,7 +1707,7 @@ static int mxt_load_fw(struct device *dev, const char *fn)
 		if (ret)
 		if (ret)
 			goto disable_irq;
 			goto disable_irq;
 
 
-		ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS);
+		ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS, true);
 		if (ret) {
 		if (ret) {
 			retry++;
 			retry++;