[PATCH v3 20/49] Input: atmel_mxt_ts - refactor firmware flash to extract context into struct

From: Jiada Wang
Date: Tue Sep 17 2019 - 05:39:42 EST


From: Nick Dyer <nick.dyer@xxxxxxxxxxx>

Signed-off-by: Nick Dyer <nick.dyer@xxxxxxxxxxx>
(cherry picked from ndyer/linux/for-upstream commit 1bbe20ff3dcd6612e7942c495929eae5c138ece2)
Signed-off-by: George G. Davis <george_davis@xxxxxxxxxx>
Signed-off-by: Jiada Wang <jiada_wang@xxxxxxxxxx>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 59 +++++++++++++++---------
1 file changed, 36 insertions(+), 23 deletions(-)

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 69e34294688c..711ce39f38ca 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -291,6 +291,22 @@ struct mxt_cfg {
struct mxt_info info;
};

+/* Firmware frame structure */
+struct mxt_fw_frame {
+ __be16 size;
+ u8 data[];
+};
+
+/* Firmware update context */
+struct mxt_flash {
+ const struct firmware *fw;
+ struct mxt_fw_frame *frame;
+ loff_t pos;
+ size_t frame_size;
+ unsigned int count;
+ unsigned int retry;
+};
+
/* Each client has this additional data */
struct mxt_data {
struct i2c_client *client;
@@ -3244,21 +3260,17 @@ static int mxt_check_firmware_format(struct device *dev,
static int mxt_load_fw(struct device *dev)
{
struct mxt_data *data = dev_get_drvdata(dev);
- const struct firmware *fw = NULL;
- unsigned int frame_size;
- unsigned int pos = 0;
- unsigned int retry = 0;
- unsigned int frame = 0;
+ struct mxt_flash f = { 0, };
int ret;

- ret = request_firmware(&fw, data->fw_name, dev);
+ ret = request_firmware(&f.fw, data->fw_name, dev);
if (ret) {
dev_err(dev, "Unable to open firmware %s\n", data->fw_name);
return ret;
}

/* Check for incorrect enc file */
- ret = mxt_check_firmware_format(dev, fw);
+ ret = mxt_check_firmware_format(dev, f.fw);
if (ret)
goto release_firmware;

@@ -3312,41 +3324,42 @@ static int mxt_load_fw(struct device *dev)
goto disable_irq;
}

- while (pos < fw->size) {
+ while (f.pos < f.fw->size) {
+ f.frame = (struct mxt_fw_frame *)(f.fw->data + f.pos);
+
ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, true);
if (ret)
goto disable_irq;

- frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1));
-
/* Take account of CRC bytes */
- frame_size += 2;
+ f.frame_size = __be16_to_cpu(f.frame->size) + 2U;

/* Write one frame to device */
- ret = mxt_bootloader_write(data, fw->data + pos, frame_size);
+ ret = mxt_bootloader_write(data, f.fw->data + f.pos,
+ f.frame_size);
if (ret)
goto disable_irq;

ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS, true);
if (ret) {
- retry++;
+ f.retry++;

/* Back off by 20ms per retry */
- msleep(retry * 20);
+ msleep(f.retry * 20);

- if (retry > 20) {
+ if (f.retry > 20) {
dev_err(dev, "Retry count exceeded\n");
goto disable_irq;
}
} else {
- retry = 0;
- pos += frame_size;
- frame++;
+ f.retry = 0;
+ f.pos += f.frame_size;
+ f.count++;
}

- if (frame % 50 == 0)
- dev_dbg(dev, "Sent %d frames, %d/%zd bytes\n",
- frame, pos, fw->size);
+ if (f.count % 50 == 0)
+ dev_dbg(dev, "Sent %u frames, %lld/%zu bytes\n",
+ f.count, f.pos, f.fw->size);
}

/* Wait for flash. */
@@ -3355,7 +3368,7 @@ static int mxt_load_fw(struct device *dev)
if (ret)
goto disable_irq;

- dev_dbg(dev, "Sent %d frames, %d bytes\n", frame, pos);
+ dev_dbg(dev, "Sent %u frames, %lld bytes\n", f.count, f.pos);

/*
* Wait for device to reset. Some bootloader versions do not assert
@@ -3369,7 +3382,7 @@ static int mxt_load_fw(struct device *dev)
disable_irq:
disable_irq(data->irq);
release_firmware:
- release_firmware(fw);
+ release_firmware(f.fw);
return ret;
}

--
2.19.2