aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc
diff options
context:
space:
mode:
authorMichael Grzeschik <m.grzeschik@pengutronix.de>2018-03-05 05:43:53 -0500
committerAlexandre Belloni <alexandre.belloni@bootlin.com>2018-03-17 09:20:53 -0400
commit9d327c2d929161a6ca4d7ca0672414cc72100659 (patch)
treeb1000f790a34fe93aa371f009be230f1ef88c97a /drivers/rtc
parent72dd71f0dae47183efdf92279927ff26f0ed9f3f (diff)
rtc: isl1208: enable interrupt after context preparation
The interrupt handler got enabled very early. If the interrupt cause is triggering immediately before the context is fully prepared. This can lead to undefined behaviour. Therefor we move the interrupt enable code to the end of the probe function. Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> Signed-off-by: Denis Osterland <Denis.Osterland@diehl.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/rtc-isl1208.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c
index c8b495348229..a13a4ba79004 100644
--- a/drivers/rtc/rtc-isl1208.c
+++ b/drivers/rtc/rtc-isl1208.c
@@ -635,23 +635,6 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
635 if (isl1208_i2c_validate_client(client) < 0) 635 if (isl1208_i2c_validate_client(client) < 0)
636 return -ENODEV; 636 return -ENODEV;
637 637
638 if (client->irq > 0) {
639 rc = devm_request_threaded_irq(&client->dev, client->irq, NULL,
640 isl1208_rtc_interrupt,
641 IRQF_SHARED | IRQF_ONESHOT,
642 isl1208_driver.driver.name,
643 client);
644 if (!rc) {
645 device_init_wakeup(&client->dev, 1);
646 enable_irq_wake(client->irq);
647 } else {
648 dev_err(&client->dev,
649 "Unable to request irq %d, no alarm support\n",
650 client->irq);
651 client->irq = 0;
652 }
653 }
654
655 rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name, 638 rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name,
656 &isl1208_rtc_ops, 639 &isl1208_rtc_ops,
657 THIS_MODULE); 640 THIS_MODULE);
@@ -674,6 +657,23 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
674 if (rc) 657 if (rc)
675 return rc; 658 return rc;
676 659
660 if (client->irq > 0) {
661 rc = devm_request_threaded_irq(&client->dev, client->irq, NULL,
662 isl1208_rtc_interrupt,
663 IRQF_SHARED | IRQF_ONESHOT,
664 isl1208_driver.driver.name,
665 client);
666 if (!rc) {
667 device_init_wakeup(&client->dev, 1);
668 enable_irq_wake(client->irq);
669 } else {
670 dev_err(&client->dev,
671 "Unable to request irq %d, no alarm support\n",
672 client->irq);
673 client->irq = 0;
674 }
675 }
676
677 return 0; 677 return 0;
678} 678}
679 679