]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rtc: isl1208: enable interrupt after context preparation
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Mon, 5 Mar 2018 10:43:53 +0000 (10:43 +0000)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Sat, 17 Mar 2018 13:20:53 +0000 (14:20 +0100)
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>
drivers/rtc/rtc-isl1208.c

index c8b495348229634f056948e23de8eadb4d948026..a13a4ba79004decd870653abaae3dd0fb1cc18ea 100644 (file)
@@ -635,23 +635,6 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
        if (isl1208_i2c_validate_client(client) < 0)
                return -ENODEV;
 
-       if (client->irq > 0) {
-               rc = devm_request_threaded_irq(&client->dev, client->irq, NULL,
-                                              isl1208_rtc_interrupt,
-                                              IRQF_SHARED | IRQF_ONESHOT,
-                                              isl1208_driver.driver.name,
-                                              client);
-               if (!rc) {
-                       device_init_wakeup(&client->dev, 1);
-                       enable_irq_wake(client->irq);
-               } else {
-                       dev_err(&client->dev,
-                               "Unable to request irq %d, no alarm support\n",
-                               client->irq);
-                       client->irq = 0;
-               }
-       }
-
        rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name,
                                  &isl1208_rtc_ops,
                                  THIS_MODULE);
@@ -674,6 +657,23 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
        if (rc)
                return rc;
 
+       if (client->irq > 0) {
+               rc = devm_request_threaded_irq(&client->dev, client->irq, NULL,
+                                              isl1208_rtc_interrupt,
+                                              IRQF_SHARED | IRQF_ONESHOT,
+                                              isl1208_driver.driver.name,
+                                              client);
+               if (!rc) {
+                       device_init_wakeup(&client->dev, 1);
+                       enable_irq_wake(client->irq);
+               } else {
+                       dev_err(&client->dev,
+                               "Unable to request irq %d, no alarm support\n",
+                               client->irq);
+                       client->irq = 0;
+               }
+       }
+
        return 0;
 }