linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Input: synaptics-rmi4 - Fix error handling in I2C transport driver
@ 2016-09-29  0:37 Guenter Roeck
  2016-09-29 17:55 ` Bjorn Andersson
  0 siblings, 1 reply; 11+ messages in thread
From: Guenter Roeck @ 2016-09-29  0:37 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: linux-input, linux-kernel, Guenter Roeck, Bjorn Andersson,
	Andrew Duggan

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.

Fixes: 946c8432aab0 ("Input: synaptics-rmi4 - support regulator supplies")
Fixes: fdf51604f104 ("Input: synaptics-rmi4 - add I2C transport driver")
Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: Andrew Duggan <aduggan@synaptics.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
 drivers/input/rmi4/rmi_i2c.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/input/rmi4/rmi_i2c.c b/drivers/input/rmi4/rmi_i2c.c
index 6f2e0e4f0296..d57b227ccd25 100644
--- a/drivers/input/rmi4/rmi_i2c.c
+++ b/drivers/input/rmi4/rmi_i2c.c
@@ -285,23 +285,30 @@ static int rmi_i2c_probe(struct i2c_client *client,
 	retval = rmi_set_page(rmi_i2c, 0);
 	if (retval) {
 		dev_err(&client->dev, "Failed to set page select to 0.\n");
-		return retval;
+		goto error_disable;
 	}
 
 	retval = rmi_register_transport_device(&rmi_i2c->xport);
 	if (retval) {
 		dev_err(&client->dev, "Failed to register transport driver at 0x%.2X.\n",
 			client->addr);
-		return retval;
+		goto error_disable;
 	}
 
 	retval = rmi_i2c_init_irq(client);
 	if (retval < 0)
-		return retval;
+		goto error_unregister;
 
 	dev_info(&client->dev, "registered rmi i2c driver at %#04x.\n",
 			client->addr);
 	return 0;
+
+error_unregister:
+	rmi_unregister_transport_device(&rmi_i2c->xport);
+error_disable:
+	regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies),
+			       rmi_i2c->supplies);
+	return retval;
 }
 
 static int rmi_i2c_remove(struct i2c_client *client)
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2016-10-01 20:46 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-29  0:37 [PATCH] Input: synaptics-rmi4 - Fix error handling in I2C transport driver Guenter Roeck
2016-09-29 17:55 ` Bjorn Andersson
2016-09-30 22:54   ` Dmitry Torokhov
2016-09-30 23:02     ` Dmitry Torokhov
2016-10-01  3:44       ` Guenter Roeck
2016-10-01 17:27         ` Andrew Duggan
2016-10-01 17:45           ` Guenter Roeck
2016-10-01 17:51             ` Andrew Duggan
2016-10-01 19:04           ` Dmitry Torokhov
2016-10-01 20:46             ` Guenter Roeck
2016-10-01  3:03     ` Guenter Roeck

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).