Thread (10 messages) 10 messages, 3 authors, 2020-03-13

Re: [PATCH 4/4] Input: exc3000: add firmware update support

From: Lucas Stach <l.stach@pengutronix.de>
Date: 2020-03-13 14:39:34

On Mo, 2020-01-20 at 11:54 -0800, Dmitry Torokhov wrote:
On Tue, Jan 07, 2020 at 06:17:40PM +0100, Lucas Stach wrote:
quoted
This change allows the device firmware to be updated by putting a
firmware
file in /lib/firmware and providing the name of the file via the
update_fw
sysfs property. The driver will then flash the firmware image into
the
controller internal storage and restart the controller to activate
the new
firmware.

The implementation was done by looking at the the messages passed
between
the controller and proprietary vendor update tool. Not every detail
of the
protocol is totally well understood, so the implementation still
has some
"monkey see, monkey do" parts, as far as they have been found to be
required
for the update to succeed.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/input/touchscreen/exc3000.c | 248
+++++++++++++++++++++++++++-
 1 file changed, 246 insertions(+), 2 deletions(-)
diff --git a/drivers/input/touchscreen/exc3000.c
b/drivers/input/touchscreen/exc3000.c
index ce83914d65ff..f9a9820dc232 100644
--- a/drivers/input/touchscreen/exc3000.c
+++ b/drivers/input/touchscreen/exc3000.c
@@ -3,8 +3,8 @@
  * Driver for I2C connected EETI EXC3000 multiple touch controller
  *
  * Copyright (C) 2017 Ahmet Inan <inan@distec.de>
- *
- * minimal implementation based on egalax_ts.c and egalax_i2c.c
+ * Copyright (C) 2019 Pengutronix <kernel@pengutronix.de>
+ * Copyright (C) 2019 Zodiac Inflight Innovations
  */
 
 #include <linux/bitops.h>
@@ -18,6 +18,8 @@
 #include <linux/of.h>
 #include <linux/timer.h>
 #include <asm/unaligned.h>
+#include <linux/firmware.h>
+#include <linux/delay.h>
 
 #define EXC3000_NUM_SLOTS		10
 #define EXC3000_SLOTS_PER_FRAME		5
@@ -37,6 +39,7 @@ struct exc3000_data {
 	struct mutex vendor_data_lock;
 	struct completion vendor_data_done;
 	char *type, *model, *fw_rev;
+	int update_status;
 };
 
 static void exc3000_report_slots(struct input_dev *input,
@@ -215,6 +218,8 @@ static int exc3000_populate_device_info(struct
exc3000_data *data)
 	if (ret < 0)
 		return -ENODEV;
 
+	if (data->type)
+		devm_kfree(dev, data->type);
 	data->type = devm_kmemdup(dev, &response[1], ret - 1,
GFP_KERNEL);
This makes me uncomfortable, as this changes the release order of the
resources (newly re-allocated memory will be freed first). Please
reassure me that it will work fine WRT device removal (or,
alternatively, we will need devm_realloc() that would preserve devm
release ordering.
The cached information here is only used for the sysfs FW info
attributes. In v2 I split those out into a separate group, which gets
removed and registered again when refreshing this information after the
FW update. This keeps the devm ordering the same and fixes a possible
use-after-free through sysfs reads at the same time.

Regards,
Lucas
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help