Patch "Input: synaptics-rmi4 - fix error handling in I2C transport driver" has been added to the 4.8-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
Input: synaptics-rmi4 - fix error handling in I2C transport driver
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
input-synaptics-rmi4-fix-error-handling-in-i2c-transport-driver.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
261d7794c49b9a3bb5115c5ffc452e00f969bf43Mon Sep 17 00:00:00 2001
From: Guenter Roeck <[email protected]>
Date: Tue, 4 Oct 2016 11:50:54 -0700
Subject: Input: synaptics-rmi4 - fix error handling in I2C transport driver
From: Guenter Roeck <[email protected]>
commit 261d7794c49b9a3bb5115c5ffc452e00f969bf43 upstream.
Instantiating the rmi4 I2C transport driver without interrupts assigned (for example using manual i2c instantiation from the command line) caused the driver to fail to load, but it does not clean up its regulator or transport device registrations. Result is a crash at a later time, for example when rebooting the system.
--- drivers/input/rmi4/rmi_i2c.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-)
drivers/input/rmi4/rmi_i2c.c +26 -12
@@ -221,6 +221,21 @@ static const struct of_device_id rmi_i2cMODULE_DEVICE_TABLE (of, rmi_i2c_of_match);#endif +static void rmi_i2c_regulator_bulk_disable (void *data) +{ +struct rmi_i2c_xport *rmi_i2c = data; + +regulator_bulk_disable (ARRAY_SIZE (rmi_i2c->supplies), + rmi_i2c->supplies); +} + +static void rmi_i2c_unregister_transport (void *data) +{ +struct rmi_i2c_xport *rmi_i2c = data; + +rmi_unregister_transport_device (&rmi_i2c->xport); +} +static int rmi_i2c_probe (struct i2c_client *client,const struct i2c_device_id *id) {
@@ -264,6 +279,12 @@ static int rmi_i2c_probe(struct i2c_clieif (retval <0 )return retval; + retval =devm_add_action_or_reset (&client->dev, + rmi_i2c_regulator_bulk_disable, + rmi_i2c); +if (retval) +return retval; +of_property_read_u32 (client->dev.of_node,"syna,startup-delay-ms" , &rmi_i2c->startup_delay);
@@ -294,6 +315,11 @@ static int rmi_i2c_probe(struct i2c_clie client->addr);return retval; } + retval =devm_add_action_or_reset (&client->dev, + rmi_i2c_unregister_transport, + rmi_i2c); +if (retval) +return retval; retval =rmi_i2c_init_irq (client);if (retval <0 )
@@ -304,17 +330,6 @@ static int rmi_i2c_probe(struct i2c_cliereturn 0 ; } -static int rmi_i2c_remove (struct i2c_client *client) -{ -struct rmi_i2c_xport *rmi_i2c =i2c_get_clientdata (client); - -rmi_unregister_transport_device (&rmi_i2c->xport); -regulator_bulk_disable (ARRAY_SIZE (rmi_i2c->supplies), - rmi_i2c->supplies); - -return 0 ; -} -#ifdef CONFIG_PM_SLEEP static int rmi_i2c_suspend (struct device *dev) {
@@ -431,7 +446,6 @@ static struct i2c_driver rmi_i2c_driver }, .id_table = rmi_id, .probe = rmi_i2c_probe, - .remove = rmi_i2c_remove, };module_i2c_driver (rmi_i2c_driver);
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/input-synaptics-rmi4-fix-error-handling-in-spi-transport-driver.patch queue-4.8/watchdog-core-fix-devres_alloc-allocation-size.patch queue-4.8/input-synaptics-rmi4-fix-error-handling-in-i2c-transport-driver.patch