add alarm support for the rtc-ab-eoz9
v2 cover add alarm support for the rtc-ab-eoz9
From: Liam Beguin <[email protected]>
Add alarm support for the rtc-ab-eoz9.
The board used to test this series has the interrupt line of the RTC connected to a circuit controlling the power of the board.
An event on the interrupt line while the board is off will power it on. Because of these hardware limitations, the irq handler added in this patch wasn't fully tested.
The alarm functionality was tested, with:
$ date "2010-10-10 10:10" Sun Oct 10 10:10:00 UTC 2010 $ /usr/sbin/rtcwake -u -d /dev/rtc0 -s20 --mode off [ ... ] $ # power on after 20 seconds
Changes since v1:
- drop abeoz9_reset_validity in abeoz9_rtc_set_alarm since we don't know for sure the time is set properly at that time.
- keep the RTC_FEATURE_ALARM change in a separate patch for easy backport
Liam Beguin (3):
rtc: ab-eoz9: set regmap max_register
rtc: ab-eoz9: add alarm support
rtc: ab-eoz9: make use of RTC_FEATURE_ALARM
drivers/rtc/rtc-ab-eoz9.c | 135 +++++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 1 deletion(-)
Range-diff against v1:
1: 7809a783807d < -: ------------ rtc: ab-eoz9: make use of regmap local variable
2: 3b5d3fa74715 = 1: d2c1ffa4007b rtc: ab-eoz9: set regmap max_register
3: 0a19ed90d4cc ! 2: ac36be1f5f61 rtc: ab-eoz9: add alarm support
@@ drivers/rtc/rtc-ab-eoz9.c: static int abeoz9_rtc_set_time(struct device *dev, st
+ if (ret)
+ return ret;
+
-+ ret = abeoz9_reset_validity(data->regmap);
-+ if (ret)
-+ return ret;
-+
+ return abeoz9_rtc_alarm_irq_enable(dev, alarm->enabled);
+}
+4: 7004d40f2f36 = 3: 1987bef12ee8 rtc: ab-eoz9: make use of RTC_FEATURE_ALARM
base-commit: e49d033bddf5b565044e2abe4241353959bc9120
Signature · 1 line
2.30.1.489.g328c10930387
PATCH v2 1/3 rtc: ab-eoz9: set regmap max_register
From: Liam Beguin <[email protected]>
Set regmap's max_register property to allow users to dump registers using debufgs.
--- drivers/rtc/rtc-ab-eoz9.c | 1 + 1 file changed, 1 insertion(+)
drivers/rtc/rtc-ab-eoz9.c +1 -0
@@ -264,6 +264,7 @@ static const struct rtc_class_ops rtc_ops = {static const struct regmap_config abeoz9_rtc_regmap_config = { .reg_bits =8 , .val_bits =8 , + .max_register =0x3f , };#if IS_REACHABLE (CONFIG_HWMON )
Signature · 1 line
2.30.1.489.g328c10930387
PATCH v2 2/3 rtc: ab-eoz9: add alarm support
In reply to Liam BeguinFrom: Liam Beguin <[email protected]>
Add alarm support for the rtc-ab-eoz9.
--- drivers/rtc/rtc-ab-eoz9.c | 136 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+)
drivers/rtc/rtc-ab-eoz9.c +136 -0
@@ -11,6 +11,7 @@#include <linux/bcd.h> #include <linux/of.h> #include <linux/regmap.h> +#include <linux/bitfield.h> #include <linux/hwmon.h> #include <linux/hwmon-sysfs.h>
@@ -57,6 +58,24 @@#define ABEOZ9_SEC_LEN 7 +#define ABEOZ9_REG_ALARM_SEC 0x10 +#define ABEOZ9_BIT_ALARM_SEC GENMASK(6, 0) +#define ABEOZ9_REG_ALARM_MIN 0x11 +#define ABEOZ9_BIT_ALARM_MIN GENMASK(6, 0) +#define ABEOZ9_REG_ALARM_HOURS 0x12 +#define ABEOZ9_BIT_ALARM_HOURS_PM BIT(5) +#define ABEOZ9_BIT_ALARM_HOURS GENMASK(4, 0) +#define ABEOZ9_REG_ALARM_DAYS 0x13 +#define ABEOZ9_BIT_ALARM_DAYS GENMASK(5, 0) +#define ABEOZ9_REG_ALARM_WEEKDAYS 0x14 +#define ABEOZ9_BIT_ALARM_WEEKDAYS GENMASK(2, 0) +#define ABEOZ9_REG_ALARM_MONTHS 0x15 +#define ABEOZ9_BIT_ALARM_MONTHS GENMASK(4, 0) +#define ABEOZ9_REG_ALARM_YEARS 0x16 + +#define ABEOZ9_ALARM_LEN 7 +#define ABEOZ9_BIT_ALARM_AE BIT(7) +#define ABEOZ9_REG_REG_TEMP 0x20#define ABEOZ953_TEMP_MAX 120#define ABEOZ953_TEMP_MIN -60
@@ -186,6 +205,98 @@ static int abeoz9_rtc_set_time(struct device *dev, struct rtc_time *tm)return abeoz9_reset_validity (regmap); } +static int abeoz9_rtc_read_alarm (struct device *dev,struct rtc_wkalrm *alarm) +{ +struct abeoz9_rtc_data *data =dev_get_drvdata (dev); +struct regmap *regmap = data->regmap; +u8 regs[ABEOZ9_ALARM_LEN ]; +u8 val[2 ]; +int ret; + + ret =abeoz9_check_validity (dev); +if (ret) +return ret; + + ret =regmap_bulk_read (regmap,ABEOZ9_REG_CTRL_INT , val,sizeof (val)); +if (ret) +return ret; + + alarm->enabled = val[0 ] &ABEOZ9_REG_CTRL_INT_AIE ; + alarm->pending = val[1 ] &ABEOZ9_REG_CTRL_INT_FLAG_AF ; + + ret =regmap_bulk_read (regmap,ABEOZ9_REG_ALARM_SEC , regs,sizeof (regs)); +if (ret) +return ret; + + alarm->time.tm_sec =bcd2bin (FIELD_GET (ABEOZ9_BIT_ALARM_SEC , regs[0 ])); + alarm->time.tm_min =bcd2bin (FIELD_GET (ABEOZ9_BIT_ALARM_MIN , regs[1 ])); + alarm->time.tm_hour =bcd2bin (FIELD_GET (ABEOZ9_BIT_ALARM_HOURS , regs[2 ])); +if (FIELD_GET (ABEOZ9_BIT_ALARM_HOURS_PM , regs[2 ])) + alarm->time.tm_hour +=12 ; + + alarm->time.tm_mday =bcd2bin (FIELD_GET (ABEOZ9_BIT_ALARM_DAYS , regs[3 ])); + +return 0 ; +} + +static int abeoz9_rtc_alarm_irq_enable (struct device *dev,u32 enable) +{ +struct abeoz9_rtc_data *data =dev_get_drvdata (dev); + +return regmap_update_bits (data->regmap,ABEOZ9_REG_CTRL_INT , +ABEOZ9_REG_CTRL_INT_AIE , +FIELD_PREP (ABEOZ9_REG_CTRL_INT_AIE , enable)); +} + +static int abeoz9_rtc_set_alarm (struct device *dev,struct rtc_wkalrm *alarm) +{ +struct abeoz9_rtc_data *data =dev_get_drvdata (dev); +u8 regs[ABEOZ9_ALARM_LEN ] = {0 }; +int ret; + + ret =regmap_update_bits (data->regmap,ABEOZ9_REG_CTRL_INT_FLAG , +ABEOZ9_REG_CTRL_INT_FLAG_AF ,0 ); +if (ret) +return ret; + + regs[0 ] =ABEOZ9_BIT_ALARM_AE |FIELD_PREP (ABEOZ9_BIT_ALARM_SEC , +bin2bcd (alarm->time.tm_sec)); + regs[1 ] =ABEOZ9_BIT_ALARM_AE |FIELD_PREP (ABEOZ9_BIT_ALARM_MIN , +bin2bcd (alarm->time.tm_min)); + regs[2 ] =ABEOZ9_BIT_ALARM_AE |FIELD_PREP (ABEOZ9_BIT_ALARM_HOURS , +bin2bcd (alarm->time.tm_hour)); + regs[3 ] =ABEOZ9_BIT_ALARM_AE |FIELD_PREP (ABEOZ9_BIT_ALARM_DAYS , +bin2bcd (alarm->time.tm_mday)); + + ret =regmap_bulk_write (data->regmap,ABEOZ9_REG_ALARM_SEC , regs, +sizeof (regs)); +if (ret) +return ret; + +return abeoz9_rtc_alarm_irq_enable (dev, alarm->enabled); +} + +static irqreturn_t abeoz9_rtc_irq (int irq,void *dev) +{ +struct abeoz9_rtc_data *data =dev_get_drvdata (dev); +unsigned int val; +int ret; + + ret =regmap_read (data->regmap,ABEOZ9_REG_CTRL_INT_FLAG , &val); +if (ret) +return IRQ_NONE ; + +if (!FIELD_GET (ABEOZ9_REG_CTRL_INT_FLAG_AF , val)) +return IRQ_NONE ; + +regmap_update_bits (data->regmap,ABEOZ9_REG_CTRL_INT_FLAG , +ABEOZ9_REG_CTRL_INT_FLAG_AF ,0 ); + +rtc_update_irq (data->rtc,1 ,RTC_IRQF |RTC_AF ); + +return IRQ_HANDLED ; +} +static int abeoz9_trickle_parse_dt (struct device_node *node) {u32 ohms =0 ;
@@ -261,6 +372,14 @@ static const struct rtc_class_ops rtc_ops = { .set_time = abeoz9_rtc_set_time, }; +static const struct rtc_class_ops rtc_alarm_ops = { + .read_time = abeoz9_rtc_get_time, + .set_time = abeoz9_rtc_set_time, + .read_alarm = abeoz9_rtc_read_alarm, + .set_alarm = abeoz9_rtc_set_alarm, + .alarm_irq_enable = abeoz9_rtc_alarm_irq_enable, +}; +static const struct regmap_config abeoz9_rtc_regmap_config = { .reg_bits =8 , .val_bits =8 ,
@@ -420,6 +539,23 @@ static int abeoz9_probe(struct i2c_client *client, data->rtc->ops = &rtc_ops; data->rtc->range_min =RTC_TIMESTAMP_BEGIN_2000 ; data->rtc->range_max =RTC_TIMESTAMP_END_2099 ; + data->rtc->uie_unsupported =1 ; + +if (client->irq >0 ) { + ret =devm_request_threaded_irq (dev, client->irq,NULL , + abeoz9_rtc_irq, +IRQF_TRIGGER_LOW |IRQF_ONESHOT , +dev_name (dev), dev); +if (ret) { +dev_err (dev,"failed to request alarm irq\n" ); +return ret; + } + } + +if (client->irq >0 ||device_property_read_bool (dev,"wakeup-source" )) { + ret =device_init_wakeup (dev, true); + data->rtc->ops = &rtc_alarm_ops; + } ret =devm_rtc_register_device (data->rtc);if (ret)
Signature · 1 line
2.30.1.489.g328c10930387
PATCH v2 3/3 rtc: ab-eoz9: make use of RTC_FEATURE_ALARM
In reply to Liam BeguinFrom: Liam Beguin <[email protected]>
Move the alarm callbacks in rtc_ops and use RTC_FEATURE_ALARM to notify the core whether alarm capabilities are available or not.
--- drivers/rtc/rtc-ab-eoz9.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/rtc/rtc-ab-eoz9.c +2 -6
@@ -368,11 +368,6 @@ static int abeoz9_rtc_setup(struct device *dev, struct device_node *node) }static const struct rtc_class_ops rtc_ops = { - .read_time = abeoz9_rtc_get_time, - .set_time = abeoz9_rtc_set_time, -}; - -static const struct rtc_class_ops rtc_alarm_ops = { .read_time = abeoz9_rtc_get_time, .set_time = abeoz9_rtc_set_time, .read_alarm = abeoz9_rtc_read_alarm,
@@ -540,6 +535,7 @@ static int abeoz9_probe(struct i2c_client *client, data->rtc->range_min =RTC_TIMESTAMP_BEGIN_2000 ; data->rtc->range_max =RTC_TIMESTAMP_END_2099 ; data->rtc->uie_unsupported =1 ; +clear_bit (RTC_FEATURE_ALARM , data->rtc->features);if (client->irq >0 ) { ret = devm_request_threaded_irq(dev, client->irq, NULL,
@@ -554,7 +550,7 @@ static int abeoz9_probe(struct i2c_client *client,if (client->irq >0 ||device_property_read_bool (dev,"wakeup-source" )) { ret =device_init_wakeup (dev, true); - data->rtc->ops = &rtc_alarm_ops; +set_bit (RTC_FEATURE_ALARM , data->rtc->features); } ret =devm_rtc_register_device (data->rtc);
Signature · 1 line
2.30.1.489.g328c10930387
Quoted 10 lines · Liam Beguin
Add alarm support for the rtc-ab-eoz9.
The board used to test this series has the interrupt line of the RTC connected to a circuit controlling the power of the board.
An event on the interrupt line while the board is off will power it on. Because of these hardware limitations, the irq handler added in this patch wasn't fully tested.
[...]
Applied, thanks!
[1/3] rtc: ab-eoz9: set regmap max_register
commit: f1d304766c7f5388239d273fc0b72efa62acd9ca
[2/3] rtc: ab-eoz9: add alarm support
commit: e70e52e1bf1d6d0ea60e2f8294d5e76a8d8f5370
[3/3] rtc: ab-eoz9: make use of RTC_FEATURE_ALARM
commit: c52409eb16672907804b7acf1658bb1fd9dcb426I would still have preferred the last two to be squashed but I've been slow to reply and we are late in the cyle.
Best regards,
Signature · 1 line
Alexandre Belloni <[email protected]>
Quoted 21 lines · Alexandre Belloni
Quoted 10 lines · Liam Beguin
Add alarm support for the rtc-ab-eoz9.
The board used to test this series has the interrupt line of the RTC connected to a circuit controlling the power of the board.
An event on the interrupt line while the board is off will power it on. Because of these hardware limitations, the irq handler added in this patch wasn't fully tested.
[...]
Applied, thanks!
[1/3] rtc: ab-eoz9: set regmap
max_register
commit:f1d304766c7f5388239d273fc0b72efa62acd9ca
[2/3] rtc: ab-eoz9: add alarm support
commit:e70e52e1bf1d6d0ea60e2f8294d5e76a8d8f5370
[3/3] rtc: ab-eoz9: make use ofRTC_FEATURE_ALARM
commit:c52409eb16672907804b7acf1658bb1fd9dcb426
Quoted 4 lines
I would still have preferred the last two to be squashed but I've been slow to
reply and we are late in the cyle.
Understood, I'll squash them next time.
Thanks,
Liam
Quoted 3 lines
Best regards,
--
Alexandre Belloni <[email protected]>