@@ -713,17 +713,13 @@ static int mxt_lookup_bootloader_address(struct mxt_data *data, bool retry)
return 0;
}
-static int mxt_probe_bootloader(struct mxt_data *data, bool alt_address)
+static int mxt_probe_bootloader(struct mxt_data *data)
{
struct device *dev = &data->client->dev;
int error;
u8 buf[3];
bool crc_failure, extended_id;
- error = mxt_lookup_bootloader_address(data, alt_address);
- if (error)
- return error;
-
/* Check bootloader status and version information */
error = mxt_bootloader_read(data, buf, sizeof(buf));
if (error)
@@ -2920,6 +2916,32 @@ static void mxt_config_cb(const struct firmware *cfg, void *ctx)
release_firmware(cfg);
}
+static int mxt_bootloader_status(struct mxt_data *data)
+{
+ struct i2c_client *client = data->client;
+ int error;
+
+ error = mxt_lookup_bootloader_address(data, false);
+ if (error) {
+ dev_info(&client->dev,
+ "Bootloader address is not specified\n");
+ return error;
+ }
+ /* Check bootloader state */
+ error = mxt_probe_bootloader(data);
+ if (error) {
+ dev_info(&client->dev, "Trying alternate bootloader address\n");
+ mxt_lookup_bootloader_address(data, true);
+ error = mxt_probe_bootloader(data);
+ if (error) {
+ dev_err(&client->dev,
+ "Chip is not in appmode or bootloader mode\n");
+ return error;
+ }
+ }
+ return 0;
+}
+
static int mxt_initialize(struct mxt_data *data)
{
struct i2c_client *client = data->client;
@@ -2931,16 +2953,13 @@ static int mxt_initialize(struct mxt_data *data)
if (!error)
break;
- /* Check bootloader state */
- error = mxt_probe_bootloader(data, false);
- if (error) {
- dev_info(&client->dev, "Trying alternate bootloader address\n");
- error = mxt_probe_bootloader(data, true);
- if (error) {
- /* Chip is not in appmode or bootloader mode */
- return error;
- }
- }
+ dev_info(&client->dev,
+ "info block read failed (%d), so try bootloader method\n",
+ error);
+
+ error = mxt_bootloader_status(data);
+ if (error)
+ return error;
/* OK, we are in bootloader, see if we can recover */
if (++recovery_attempts > 1) {
@@ -2954,7 +2973,9 @@ static int mxt_initialize(struct mxt_data *data)
}
/* Attempt to exit bootloader into app mode */
- mxt_send_bootloader_cmd(data, false);
+ error = mxt_send_bootloader_cmd(data, false);
+ if (error)
+ return error;
msleep(MXT_FW_RESET_TIME);
}
@@ -3646,8 +3667,11 @@ static int mxt_enter_bootloader(struct mxt_data *data)
msleep(MXT_RESET_TIME);
+ ret = mxt_lookup_bootloader_address(data, false);
+ if (ret)
+ return ret;
/* Do not need to scan since we know family ID */
- ret = mxt_probe_bootloader(data, 0);
+ ret = mxt_probe_bootloader(data);
if (ret)
return ret;