Re: [PATCH 00/15] atmel_mxt_ts - device tree, bootloader, etc
From: Stephen Warren <hidden>
Date: 2014-09-02 15:45:25
Also in:
lkml
On 07/29/2014 01:26 PM, Stephen Warren wrote:
On 07/29/2014 11:06 AM, Nick Dyer wrote:quoted
On 29/07/14 17:16, Stephen Warren wrote:
...
quoted
quoted
I also found that removing the module (even without attempting a FW update) yields: After attempted FW update via sysfs:quoted
root@localhost:~# rmmod ./atmel_mxt_ts.ko [ 81.995672] Unable to handle kernel NULL pointer dereference at virtual address 00000364Not good. It's trying to free an input device which isn't registered at that point. In a later patch in my series I add a guard around that (mxt_free_input_device): https://github.com/ndyer/linux/commit/bb4800ff8c185It looks like 8d01a84b86b0 "Input: atmel_mxt_ts - implement T100 touch object support" from that branch is what solves the issue. Ah, in linux-next, it's simply a double-unregister; both mxt_remove() and mxt_free_object_table() call input_unregister_device(data->input_dev). I think it would make sense to send the following patch for 3.17. Do you agree?
Nick, I see the fix below isn't in linux-next as of next-20140829. IIRC, you'd sent the patch below but there had been some comments on it by Dmitry. Unfortunately, I don't recall the patch subject to search for it. Anyway, are you planning on re-spinning the patch so it can be applied?
quoted hunk ↗ jump to hunk
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.cb/drivers/input/touchscreen/atmel_mxt_ts.c index 03b85711cb70..da497dbf9735 100644--- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c@@ -1353,8 +1353,10 @@ static int mxt_get_info(struct mxt_data *data) static void mxt_free_object_table(struct mxt_data *data) { - input_unregister_device(data->input_dev); - data->input_dev = NULL; + if (data->input_dev) { + input_unregister_device(data->input_dev); + data->input_dev = NULL; + } kfree(data->object_table); data->object_table = NULL;@@ -2194,7 +2196,6 @@ static int mxt_remove(struct i2c_client *client) sysfs_remove_group(&client->dev.kobj, &mxt_attr_group); free_irq(data->irq, data); - input_unregister_device(data->input_dev); mxt_free_object_table(data); kfree(data);