--- v9
+++ v11
@@ -1,39 +1,117 @@
-From: keerthikumarp <Keerthikumar.Padmanabha@in.bosch.com>
+From: Kautuk Consul <kautuk_consul@mentor.com>
-In case of attached display, the touchpanel reset is controlled
-via imx gpio's from atmel driver and the delay between
-touchpanel reset and the time at which the chip becomes capable to
-communicate with the host processor, has be taken care.
+We now prefer to rely on the calculated CRC and not on the CRC stored in
+the file.
-However in case of detachable displays, the touchpanel reset is
-controlled via a deserializer gpio which is triggered just before
-the atmel driver is probed.The delay between touchpanel reset and
-the time at which the chip becomes capable to communicate (as
-specified in datasheet) was not being accounted for. This patch
-introduces that delay.
+The new logic is as follows:
+1) stored CRC of file != calculated CRC of file, then refuse the possible
+ corrupted file
+2) calculated CRC of file != CRC of configuration in controller, then
+ update configuration in controller
+3) calculated CRC of file == CRC of configuration in controller, then
+ ignore configuration file
-Signed-off-by: keerthikumarp <Keerthikumar.Padmanabha@in.bosch.com>
+Signed-off-by: Kautuk Consul <kautuk_consul@mentor.com>
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
- drivers/input/touchscreen/atmel_mxt_ts.c | 4 ++++
- 1 file changed, 4 insertions(+)
+ drivers/input/touchscreen/atmel_mxt_ts.c | 65 +++++++++++++-----------
+ 1 file changed, 36 insertions(+), 29 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
-index cfeeacdd4084..fb7cd06cab53 100644
+index 9281a574ca80..75329f87927b 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
-@@ -4118,6 +4118,10 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
- msleep(MXT_RESET_GPIO_TIME);
- gpiod_set_value(data->reset_gpio, 1);
- msleep(MXT_RESET_INVALID_CHG);
+@@ -1891,7 +1891,7 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *fw)
+ int ret;
+ int offset;
+ int i;
+- u32 info_crc, config_crc, calculated_crc;
++ u32 info_crc, config_crc, calculated_crc = 0;
+ u16 crc_start = 0;
+
+ /* Make zero terminated copy of the OBP_RAW file */
+@@ -1954,30 +1954,6 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *fw)
+ }
+ cfg.raw_pos += offset;
+
+- /*
+- * The Info Block CRC is calculated over mxt_info and the object
+- * table. If it does not match then we are trying to load the
+- * configuration from a different chip or firmware version, so
+- * the configuration CRC is invalid anyway.
+- */
+- if (info_crc == data->info_crc) {
+- if (config_crc == 0 || data->config_crc == 0) {
+- dev_info(dev, "CRC zero, attempting to apply config\n");
+- } else if (config_crc == data->config_crc) {
+- dev_dbg(dev, "Config CRC 0x%06X: OK\n",
+- data->config_crc);
+- ret = 0;
+- goto release_raw;
+- } else {
+- dev_info(dev, "Config CRC 0x%06X: does not match file 0x%06X\n",
+- data->config_crc, config_crc);
+- }
+- } else {
+- dev_warn(dev,
+- "Warning: Info CRC error - device=0x%06X file=0x%06X\n",
+- data->info_crc, info_crc);
+- }
+-
+ /* Malloc memory to store configuration */
+ cfg.start_ofs = MXT_OBJECT_START +
+ data->info->object_num * sizeof(struct mxt_object) +
+@@ -2001,14 +1977,45 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *fw)
+ else
+ dev_warn(dev, "Could not find CRC start\n");
+
+- if (crc_start > cfg.start_ofs) {
++ if (crc_start > cfg.start_ofs)
+ calculated_crc = mxt_calculate_crc(cfg.mem,
+ crc_start - cfg.start_ofs,
+ cfg.mem_size);
+
+- if (config_crc > 0 && config_crc != calculated_crc)
+- dev_warn(dev, "Config CRC in file inconsistent, calculated=%06X, file=%06X\n",
+- calculated_crc, config_crc);
++ /* If the CRC stored in the file is not the same as what
++ * was calculated by mxt_calculate_crc, this means we
++ * have to refuse the config file and abort download.
++ */
++ if (config_crc != calculated_crc) {
++ dev_warn(dev,
++ "Config CRC in file inconsistent, calculated=%06X, file=%06X\n",
++ calculated_crc, config_crc);
++ ret = 0;
++ goto release_mem;
++ }
++
++ /*
++ * The Info Block CRC is calculated over mxt_info and the object
++ * table. If it does not match then we are trying to load the
++ * configuration from a different chip or firmware version, so
++ * the configuration CRC is invalid anyway.
++ */
++ if (info_crc == data->info_crc) {
++ if (config_crc == 0 || data->config_crc == 0) {
++ dev_info(dev, "CRC zero, attempting to apply config\n");
++ } else if (config_crc == data->config_crc) {
++ dev_dbg(dev, "Config CRC 0x%06X: OK\n",
++ data->config_crc);
++ ret = 0;
++ goto release_mem;
++ } else {
++ dev_info(dev, "Config CRC 0x%06X: does not match file 0x%06X\n",
++ data->config_crc, config_crc);
++ }
+ } else {
-+ dev_dbg(&client->dev,
-+ "atmel reset pin not found in device tree");
-+ msleep(MXT_RESET_TIME);
++ dev_warn(dev,
++ "Warning: Info CRC error - device=0x%06X file=0x%06X\n",
++ data->info_crc, info_crc);
}
- error = mxt_initialize(data);
+ ret = mxt_upload_cfg_mem(data, &cfg);
--
2.17.1