aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2016-10-04 14:48:55 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2016-10-04 14:52:23 -0400
commitbbc2ceeb3220e54c7574f0b5e3a252fd9a62cf8a (patch)
tree7e1889902d51d5b3eae6becf91d5031f347c5438
parent574a62c93a663501fd545be9a72e6901089955e4 (diff)
Input: synaptics-rmi4 - fix error handling in SPI transport driver
Instantiating the rmi4 SPI transport driver without an interrupt assigned caused the driver to fail to load, but it does not clean up its transport device registration. Result may be a crash at a later time, for example when rebooting the system. Fixes: 8d99758dee31 ("Input: synaptics-rmi4 - add SPI transport driver") Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/rmi4/rmi_spi.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/input/rmi4/rmi_spi.c b/drivers/input/rmi4/rmi_spi.c
index 55bd1b34970c..4ebef607e214 100644
--- a/drivers/input/rmi4/rmi_spi.c
+++ b/drivers/input/rmi4/rmi_spi.c
@@ -396,6 +396,13 @@ static inline int rmi_spi_of_probe(struct spi_device *spi,
396} 396}
397#endif 397#endif
398 398
399static void rmi_spi_unregister_transport(void *data)
400{
401 struct rmi_spi_xport *rmi_spi = data;
402
403 rmi_unregister_transport_device(&rmi_spi->xport);
404}
405
399static int rmi_spi_probe(struct spi_device *spi) 406static int rmi_spi_probe(struct spi_device *spi)
400{ 407{
401 struct rmi_spi_xport *rmi_spi; 408 struct rmi_spi_xport *rmi_spi;
@@ -464,6 +471,11 @@ static int rmi_spi_probe(struct spi_device *spi)
464 dev_err(&spi->dev, "failed to register transport.\n"); 471 dev_err(&spi->dev, "failed to register transport.\n");
465 return retval; 472 return retval;
466 } 473 }
474 retval = devm_add_action_or_reset(&spi->dev,
475 rmi_spi_unregister_transport,
476 rmi_spi);
477 if (retval)
478 return retval;
467 479
468 retval = rmi_spi_init_irq(spi); 480 retval = rmi_spi_init_irq(spi);
469 if (retval < 0) 481 if (retval < 0)
@@ -473,15 +485,6 @@ static int rmi_spi_probe(struct spi_device *spi)
473 return 0; 485 return 0;
474} 486}
475 487
476static int rmi_spi_remove(struct spi_device *spi)
477{
478 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi);
479
480 rmi_unregister_transport_device(&rmi_spi->xport);
481
482 return 0;
483}
484
485#ifdef CONFIG_PM_SLEEP 488#ifdef CONFIG_PM_SLEEP
486static int rmi_spi_suspend(struct device *dev) 489static int rmi_spi_suspend(struct device *dev)
487{ 490{
@@ -577,7 +580,6 @@ static struct spi_driver rmi_spi_driver = {
577 }, 580 },
578 .id_table = rmi_id, 581 .id_table = rmi_id,
579 .probe = rmi_spi_probe, 582 .probe = rmi_spi_probe,
580 .remove = rmi_spi_remove,
581}; 583};
582 584
583module_spi_driver(rmi_spi_driver); 585module_spi_driver(rmi_spi_driver);