Commit 9d327c2d authored by Michael Grzeschik's avatar Michael Grzeschik Committed by Alexandre Belloni
Browse files

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: default avatarMichael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: default avatarDenis Osterland <Denis.Osterland@diehl.com>
Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent 72dd71f0
Loading
Loading
Loading
Loading
+17 −17
Original line number Diff line number Diff line
@@ -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;
}