rtc: m41t80: enable wakealarm when "wakeup-source" is specified
authorEric Cooper <ecc@cmu.edu>
Sun, 30 Jul 2017 00:10:54 +0000 (20:10 -0400)
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>
Thu, 24 Aug 2017 09:03:34 +0000 (11:03 +0200)
Don't require an IRQ if the wakeup-source device-tree property is present.

Signed-off-by: Eric Cooper <ecc@cmu.edu>
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
drivers/rtc/rtc-m41t80.c

index 8940e9e..412a4e0 100644 (file)
@@ -927,6 +927,7 @@ static int m41t80_probe(struct i2c_client *client,
        struct rtc_device *rtc = NULL;
        struct rtc_time tm;
        struct m41t80_data *m41t80_data = NULL;
+       bool wakeup_source = false;
 
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK |
                                     I2C_FUNC_SMBUS_BYTE_DATA)) {
@@ -947,6 +948,10 @@ static int m41t80_probe(struct i2c_client *client,
                m41t80_data->features = id->driver_data;
        i2c_set_clientdata(client, m41t80_data);
 
+#ifdef CONFIG_OF
+       wakeup_source = of_property_read_bool(client->dev.of_node,
+                                             "wakeup-source");
+#endif
        if (client->irq > 0) {
                rc = devm_request_threaded_irq(&client->dev, client->irq,
                                               NULL, m41t80_handle_irq,
@@ -955,14 +960,16 @@ static int m41t80_probe(struct i2c_client *client,
                if (rc) {
                        dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
                        client->irq = 0;
-               } else {
-                       m41t80_rtc_ops.read_alarm = m41t80_read_alarm;
-                       m41t80_rtc_ops.set_alarm = m41t80_set_alarm;
-                       m41t80_rtc_ops.alarm_irq_enable = m41t80_alarm_irq_enable;
-                       /* Enable the wakealarm */
-                       device_init_wakeup(&client->dev, true);
+                       wakeup_source = false;
                }
        }
+       if (client->irq > 0 || wakeup_source) {
+               m41t80_rtc_ops.read_alarm = m41t80_read_alarm;
+               m41t80_rtc_ops.set_alarm = m41t80_set_alarm;
+               m41t80_rtc_ops.alarm_irq_enable = m41t80_alarm_irq_enable;
+               /* Enable the wakealarm */
+               device_init_wakeup(&client->dev, true);
+       }
 
        rtc = devm_rtc_device_register(&client->dev, client->name,
                                       &m41t80_rtc_ops, THIS_MODULE);
@@ -970,6 +977,10 @@ static int m41t80_probe(struct i2c_client *client,
                return PTR_ERR(rtc);
 
        m41t80_data->rtc = rtc;
+       if (client->irq <= 0) {
+               /* We cannot support UIE mode if we do not have an IRQ line */
+               rtc->uie_unsupported = 1;
+       }
 
        /* Make sure HT (Halt Update) bit is cleared */
        rc = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_HOUR);