rtc: m41t80: enable wakealarm when "wakeup-source" is specified

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>
This commit is contained in:
Eric Cooper 2017-07-29 20:10:54 -04:00 committed by Alexandre Belloni
parent 60d3455211
commit d4473b9b77

View File

@ -927,6 +927,7 @@ static int m41t80_probe(struct i2c_client *client,
struct rtc_device *rtc = NULL; struct rtc_device *rtc = NULL;
struct rtc_time tm; struct rtc_time tm;
struct m41t80_data *m41t80_data = NULL; struct m41t80_data *m41t80_data = NULL;
bool wakeup_source = false;
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK |
I2C_FUNC_SMBUS_BYTE_DATA)) { I2C_FUNC_SMBUS_BYTE_DATA)) {
@ -947,6 +948,10 @@ static int m41t80_probe(struct i2c_client *client,
m41t80_data->features = id->driver_data; m41t80_data->features = id->driver_data;
i2c_set_clientdata(client, m41t80_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) { if (client->irq > 0) {
rc = devm_request_threaded_irq(&client->dev, client->irq, rc = devm_request_threaded_irq(&client->dev, client->irq,
NULL, m41t80_handle_irq, NULL, m41t80_handle_irq,
@ -955,14 +960,16 @@ static int m41t80_probe(struct i2c_client *client,
if (rc) { if (rc) {
dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n"); dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
client->irq = 0; client->irq = 0;
} else { wakeup_source = false;
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);
} }
} }
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, rtc = devm_rtc_device_register(&client->dev, client->name,
&m41t80_rtc_ops, THIS_MODULE); &m41t80_rtc_ops, THIS_MODULE);
@ -970,6 +977,10 @@ static int m41t80_probe(struct i2c_client *client,
return PTR_ERR(rtc); return PTR_ERR(rtc);
m41t80_data->rtc = 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 */ /* Make sure HT (Halt Update) bit is cleared */
rc = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_HOUR); rc = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_HOUR);