* [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9
@ 2021-04-08 2:40 Liam Beguin
2021-04-08 2:40 ` [PATCH v2 1/3] rtc: ab-eoz9: set regmap max_register Liam Beguin
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Liam Beguin @ 2021-04-08 2:40 UTC (permalink / raw)
To: liambeguin, a.zummo, alexandre.belloni, panfilov.artyom; +Cc: linux-rtc
From: Liam Beguin <lvb@xiphos.com>
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
--
2.30.1.489.g328c10930387
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/3] rtc: ab-eoz9: set regmap max_register
2021-04-08 2:40 [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Liam Beguin
@ 2021-04-08 2:40 ` Liam Beguin
2021-04-08 2:40 ` [PATCH v2 2/3] rtc: ab-eoz9: add alarm support Liam Beguin
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Liam Beguin @ 2021-04-08 2:40 UTC (permalink / raw)
To: liambeguin, a.zummo, alexandre.belloni, panfilov.artyom; +Cc: linux-rtc
From: Liam Beguin <lvb@xiphos.com>
Set regmap's max_register property to allow users to dump registers
using debufgs.
Signed-off-by: Liam Beguin <lvb@xiphos.com>
---
drivers/rtc/rtc-ab-eoz9.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/rtc/rtc-ab-eoz9.c b/drivers/rtc/rtc-ab-eoz9.c
index b20d8f26dcdb..dee17a76a72b 100644
--- a/drivers/rtc/rtc-ab-eoz9.c
+++ b/drivers/rtc/rtc-ab-eoz9.c
@@ -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)
--
2.30.1.489.g328c10930387
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/3] rtc: ab-eoz9: add alarm support
2021-04-08 2:40 [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Liam Beguin
2021-04-08 2:40 ` [PATCH v2 1/3] rtc: ab-eoz9: set regmap max_register Liam Beguin
@ 2021-04-08 2:40 ` Liam Beguin
2021-04-08 2:40 ` [PATCH v2 3/3] rtc: ab-eoz9: make use of RTC_FEATURE_ALARM Liam Beguin
2021-04-16 22:09 ` [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Alexandre Belloni
3 siblings, 0 replies; 6+ messages in thread
From: Liam Beguin @ 2021-04-08 2:40 UTC (permalink / raw)
To: liambeguin, a.zummo, alexandre.belloni, panfilov.artyom; +Cc: linux-rtc
From: Liam Beguin <lvb@xiphos.com>
Add alarm support for the rtc-ab-eoz9.
Signed-off-by: Liam Beguin <lvb@xiphos.com>
---
drivers/rtc/rtc-ab-eoz9.c | 136 ++++++++++++++++++++++++++++++++++++++
1 file changed, 136 insertions(+)
diff --git a/drivers/rtc/rtc-ab-eoz9.c b/drivers/rtc/rtc-ab-eoz9.c
index dee17a76a72b..7dc96fabc76f 100644
--- a/drivers/rtc/rtc-ab-eoz9.c
+++ b/drivers/rtc/rtc-ab-eoz9.c
@@ -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)
--
2.30.1.489.g328c10930387
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 3/3] rtc: ab-eoz9: make use of RTC_FEATURE_ALARM
2021-04-08 2:40 [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Liam Beguin
2021-04-08 2:40 ` [PATCH v2 1/3] rtc: ab-eoz9: set regmap max_register Liam Beguin
2021-04-08 2:40 ` [PATCH v2 2/3] rtc: ab-eoz9: add alarm support Liam Beguin
@ 2021-04-08 2:40 ` Liam Beguin
2021-04-16 22:09 ` [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Alexandre Belloni
3 siblings, 0 replies; 6+ messages in thread
From: Liam Beguin @ 2021-04-08 2:40 UTC (permalink / raw)
To: liambeguin, a.zummo, alexandre.belloni, panfilov.artyom; +Cc: linux-rtc
From: Liam Beguin <lvb@xiphos.com>
Move the alarm callbacks in rtc_ops and use RTC_FEATURE_ALARM to notify
the core whether alarm capabilities are available or not.
Signed-off-by: Liam Beguin <lvb@xiphos.com>
---
drivers/rtc/rtc-ab-eoz9.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/rtc/rtc-ab-eoz9.c b/drivers/rtc/rtc-ab-eoz9.c
index 7dc96fabc76f..a9b355510cd4 100644
--- a/drivers/rtc/rtc-ab-eoz9.c
+++ b/drivers/rtc/rtc-ab-eoz9.c
@@ -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);
--
2.30.1.489.g328c10930387
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9
2021-04-08 2:40 [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Liam Beguin
` (2 preceding siblings ...)
2021-04-08 2:40 ` [PATCH v2 3/3] rtc: ab-eoz9: make use of RTC_FEATURE_ALARM Liam Beguin
@ 2021-04-16 22:09 ` Alexandre Belloni
2021-04-16 22:29 ` Liam Beguin
3 siblings, 1 reply; 6+ messages in thread
From: Alexandre Belloni @ 2021-04-16 22:09 UTC (permalink / raw)
To: a.zummo, Liam Beguin, panfilov.artyom; +Cc: Alexandre Belloni, linux-rtc
On Wed, 7 Apr 2021 22:40:25 -0400, Liam Beguin wrote:
> 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: c52409eb16672907804b7acf1658bb1fd9dcb426
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.
Best regards,
--
Alexandre Belloni <alexandre.belloni@bootlin.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9
2021-04-16 22:09 ` [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Alexandre Belloni
@ 2021-04-16 22:29 ` Liam Beguin
0 siblings, 0 replies; 6+ messages in thread
From: Liam Beguin @ 2021-04-16 22:29 UTC (permalink / raw)
To: Alexandre Belloni, a.zummo, panfilov.artyom; +Cc: linux-rtc
On Fri Apr 16, 2021 at 6:09 PM EDT, Alexandre Belloni wrote:
> On Wed, 7 Apr 2021 22:40:25 -0400, Liam Beguin wrote:
> > 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: c52409eb16672907804b7acf1658bb1fd9dcb426
>
> 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
> Best regards,
> --
> Alexandre Belloni <alexandre.belloni@bootlin.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-04-16 22:29 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-08 2:40 [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Liam Beguin
2021-04-08 2:40 ` [PATCH v2 1/3] rtc: ab-eoz9: set regmap max_register Liam Beguin
2021-04-08 2:40 ` [PATCH v2 2/3] rtc: ab-eoz9: add alarm support Liam Beguin
2021-04-08 2:40 ` [PATCH v2 3/3] rtc: ab-eoz9: make use of RTC_FEATURE_ALARM Liam Beguin
2021-04-16 22:09 ` [PATCH v2 0/3] add alarm support for the rtc-ab-eoz9 Alexandre Belloni
2021-04-16 22:29 ` Liam Beguin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).