@@ -14,6 +14,7 @@
#include <linux/i2c.h>
#include <linux/bcd.h>
#include <linux/rtc.h>
+#include <linux/of_irq.h>
/* Register map */
/* rtc section */
@@ -79,6 +80,7 @@ enum {
struct isl1208 {
struct rtc_device *rtc;
const struct attribute_group *sysfs_files;
+ int evdet_irq;
};
/* block read */
@@ -730,6 +732,24 @@ static const struct attribute_group isl1219_rtc_sysfs_files = {
.attrs = isl1219_rtc_attrs,
};
+static int isl1208_setup_irq(struct i2c_client *client, int irq)
+{
+ int rc = devm_request_threaded_irq(&client->dev, 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(irq);
+ } else {
+ dev_err(&client->dev,
+ "Unable to request irq %d, no alarm support\n",
+ irq);
+ }
+ return rc;
+}
+
static int
isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
@@ -772,6 +792,8 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
return rc;
}
isl1208->sysfs_files = &isl1219_rtc_sysfs_files;
+ isl1208->evdet_irq = of_irq_get_byname(client->dev.of_node,
+ "evdet");
} else {
isl1208->sysfs_files = &isl1208_rtc_sysfs_files;
}
@@ -780,22 +802,15 @@ 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;
- }
- }
+ if (client->irq > 0)
+ rc = isl1208_setup_irq(client, client->irq);
+ if (rc)
+ return rc;
+
+ if (isl1208->evdet_irq > 0 && isl1208->evdet_irq != client->irq)
+ rc = isl1208_setup_irq(client, isl1208->evdet_irq);
+ if (rc)
+ return rc;
return rtc_register_device(isl1208->rtc);
}