linux-rtc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/17] rtc: constify all rtc_class_ops
@ 2021-01-10 23:17 Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 01/17] rtc: introduce features bitfield Alexandre Belloni
                   ` (16 more replies)
  0 siblings, 17 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc; +Cc: linux-kernel, linux-arm-kernel, linuxppc-dev, Alexandre Belloni

Hello,

This first introduces a features bitfield that is used to handle the
presence or absence of alarms instead of relying only on the presence of
the alarm callbacks.

The drivers modifying a struct rtc_class_ops or using two different
structures are then converted.

Alexandre Belloni (17):
  rtc: introduce features bitfield
  rtc: pl031: use RTC_FEATURE_ALARM
  rtc: armada38x: remove armada38x_rtc_ops_noirq
  rtc: cmos: remove cmos_rtc_ops_no_alarm
  rtc: mv: remove mv_rtc_alarm_ops
  rtc: m48t59: remove m48t02_rtc_ops
  rtc: pcf2127: remove pcf2127_rtc_alrm_ops
  rtc: pcf85063: remove pcf85063_rtc_ops_alarm
  rtc: rx8010: drop a struct rtc_class_ops
  rtc: pcf85363: drop a struct rtc_class_ops
  rtc: m41t80: constify m41t80_rtc_ops
  rtc: opal: constify opal_rtc_ops
  rtc: rv3028: constify rv3028_rtc_ops
  rtc: rv3029: constify rv3029_rtc_ops
  rtc: rv3032: constify rv3032_rtc_ops
  rtc: rv8803: constify rv8803_rtc_ops
  rtc: tps65910: remove tps65910_rtc_ops_noirq

 drivers/rtc/class.c         |  5 +++++
 drivers/rtc/interface.c     | 12 ++++++------
 drivers/rtc/rtc-armada38x.c | 21 ++++-----------------
 drivers/rtc/rtc-cmos.c      | 12 +++---------
 drivers/rtc/rtc-m41t80.c    | 14 +++++++-------
 drivers/rtc/rtc-m48t59.c    | 22 ++++++++--------------
 drivers/rtc/rtc-mv.c        | 14 ++++----------
 drivers/rtc/rtc-opal.c      | 13 +++++++------
 drivers/rtc/rtc-pcf2127.c   | 11 +++--------
 drivers/rtc/rtc-pcf85063.c  | 11 ++---------
 drivers/rtc/rtc-pcf85363.c  |  8 ++------
 drivers/rtc/rtc-pl031.c     |  8 ++------
 drivers/rtc/rtc-rv3028.c    | 11 ++++++-----
 drivers/rtc/rtc-rv3029c2.c  | 11 ++++++-----
 drivers/rtc/rtc-rv3032.c    | 11 ++++++-----
 drivers/rtc/rtc-rv8803.c    | 11 ++++++-----
 drivers/rtc/rtc-rx8010.c    | 13 +++----------
 drivers/rtc/rtc-tps65910.c  | 15 ++++-----------
 include/linux/rtc.h         |  2 ++
 include/uapi/linux/rtc.h    |  5 +++++
 20 files changed, 91 insertions(+), 139 deletions(-)

-- 
2.29.2


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 01/17] rtc: introduce features bitfield
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 02/17] rtc: pl031: use RTC_FEATURE_ALARM Alexandre Belloni
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Introduce a bitfield to allow the drivers to announce the available
features for an RTC.

The main use case would be to better handle alarms, that could be present
or not or have a minute resolution or may need a correct week day to be set.

Use the newly introduced RTC_FEATURE_ALARM bit to then test whether alarms
are available instead of relying on the presence of ops->set_alarm.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/class.c      |  5 +++++
 drivers/rtc/interface.c  | 12 ++++++------
 include/linux/rtc.h      |  2 ++
 include/uapi/linux/rtc.h |  5 +++++
 4 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c
index 7e470fbd5e4d..03abd0aa229a 100644
--- a/drivers/rtc/class.c
+++ b/drivers/rtc/class.c
@@ -231,6 +231,8 @@ static struct rtc_device *rtc_allocate_device(void)
 	rtc->pie_timer.function = rtc_pie_update_irq;
 	rtc->pie_enabled = 0;
 
+	set_bit(RTC_FEATURE_ALARM, rtc->features);
+
 	return rtc;
 }
 
@@ -386,6 +388,9 @@ int __devm_rtc_register_device(struct module *owner, struct rtc_device *rtc)
 		return -EINVAL;
 	}
 
+	if (!rtc->ops->set_alarm)
+		clear_bit(RTC_FEATURE_ALARM, rtc->features);
+
 	rtc->owner = owner;
 	rtc_device_get_offset(rtc);
 
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 794a4f036b99..dcb34c73319e 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -186,7 +186,7 @@ static int rtc_read_alarm_internal(struct rtc_device *rtc,
 
 	if (!rtc->ops) {
 		err = -ENODEV;
-	} else if (!rtc->ops->read_alarm) {
+	} else if (!test_bit(RTC_FEATURE_ALARM, rtc->features) || !rtc->ops->read_alarm) {
 		err = -EINVAL;
 	} else {
 		alarm->enabled = 0;
@@ -392,7 +392,7 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 		return err;
 	if (!rtc->ops) {
 		err = -ENODEV;
-	} else if (!rtc->ops->read_alarm) {
+	} else if (!test_bit(RTC_FEATURE_ALARM, rtc->features) || !rtc->ops->read_alarm) {
 		err = -EINVAL;
 	} else {
 		memset(alarm, 0, sizeof(struct rtc_wkalrm));
@@ -436,7 +436,7 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 
 	if (!rtc->ops)
 		err = -ENODEV;
-	else if (!rtc->ops->set_alarm)
+	else if (!test_bit(RTC_FEATURE_ALARM, rtc->features))
 		err = -EINVAL;
 	else
 		err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
@@ -451,7 +451,7 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
 
 	if (!rtc->ops)
 		return -ENODEV;
-	else if (!rtc->ops->set_alarm)
+	else if (!test_bit(RTC_FEATURE_ALARM, rtc->features))
 		return -EINVAL;
 
 	err = rtc_valid_tm(&alarm->time);
@@ -531,7 +531,7 @@ int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled)
 		/* nothing */;
 	else if (!rtc->ops)
 		err = -ENODEV;
-	else if (!rtc->ops->alarm_irq_enable)
+	else if (!test_bit(RTC_FEATURE_ALARM, rtc->features) || !rtc->ops->alarm_irq_enable)
 		err = -EINVAL;
 	else
 		err = rtc->ops->alarm_irq_enable(rtc->dev.parent, enabled);
@@ -843,7 +843,7 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
 
 static void rtc_alarm_disable(struct rtc_device *rtc)
 {
-	if (!rtc->ops || !rtc->ops->alarm_irq_enable)
+	if (!rtc->ops || !test_bit(RTC_FEATURE_ALARM, rtc->features) || !rtc->ops->alarm_irq_enable)
 		return;
 
 	rtc->ops->alarm_irq_enable(rtc->dev.parent, false);
diff --git a/include/linux/rtc.h b/include/linux/rtc.h
index 568909449c13..bd611e26291d 100644
--- a/include/linux/rtc.h
+++ b/include/linux/rtc.h
@@ -141,6 +141,8 @@ struct rtc_device {
 	 */
 	unsigned long set_offset_nsec;
 
+	unsigned long features[BITS_TO_LONGS(RTC_FEATURE_CNT)];
+
 	time64_t range_min;
 	timeu64_t range_max;
 	time64_t start_secs;
diff --git a/include/uapi/linux/rtc.h b/include/uapi/linux/rtc.h
index fa9aff91cbf2..f950bff75e97 100644
--- a/include/uapi/linux/rtc.h
+++ b/include/uapi/linux/rtc.h
@@ -110,6 +110,11 @@ struct rtc_pll_info {
 #define RTC_AF 0x20	/* Alarm interrupt */
 #define RTC_UF 0x10	/* Update interrupt for 1Hz RTC */
 
+/* feature list */
+#define RTC_FEATURE_ALARM		0
+#define RTC_FEATURE_ALARM_RES_MINUTE	1
+#define RTC_FEATURE_NEED_WEEK_DAY	2
+#define RTC_FEATURE_CNT			3
 
 #define RTC_MAX_FREQ	8192
 
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 02/17] rtc: pl031: use RTC_FEATURE_ALARM
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 01/17] rtc: introduce features bitfield Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-11 22:00   ` Linus Walleij
  2021-01-10 23:17 ` [PATCH 03/17] rtc: armada38x: remove armada38x_rtc_ops_noirq Alexandre Belloni
                   ` (14 subsequent siblings)
  16 siblings, 1 reply; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Linus Walleij, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Clear RTC_FEATURE_ALARM instead of setting set_alarm, read_alarm and
alarm_irq_enable to NULL.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-pl031.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
index 224bbf096262..7c3967df4f9a 100644
--- a/drivers/rtc/rtc-pl031.c
+++ b/drivers/rtc/rtc-pl031.c
@@ -352,12 +352,8 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
 		}
 	}
 
-	if (!adev->irq[0]) {
-		/* When there's no interrupt, no point in exposing the alarm */
-		ops->read_alarm = NULL;
-		ops->set_alarm = NULL;
-		ops->alarm_irq_enable = NULL;
-	}
+	if (!adev->irq[0])
+		clear_bit(RTC_FEATURE_ALARM, ldata->rtc->features);
 
 	device_init_wakeup(&adev->dev, true);
 	ldata->rtc = devm_rtc_allocate_device(&adev->dev);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 03/17] rtc: armada38x: remove armada38x_rtc_ops_noirq
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 01/17] rtc: introduce features bitfield Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 02/17] rtc: pl031: use RTC_FEATURE_ALARM Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 04/17] rtc: cmos: remove cmos_rtc_ops_no_alarm Alexandre Belloni
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth,
	Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Clear RTC_FEATURE_ALARM to signal that alarms are not available instead of
having a supplementary struct rtc_class_ops with a NULL .set_alarm.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-armada38x.c | 21 ++++-----------------
 1 file changed, 4 insertions(+), 17 deletions(-)

diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
index 807a79c07f08..cc542e6b1d5b 100644
--- a/drivers/rtc/rtc-armada38x.c
+++ b/drivers/rtc/rtc-armada38x.c
@@ -458,14 +458,6 @@ static const struct rtc_class_ops armada38x_rtc_ops = {
 	.set_offset = armada38x_rtc_set_offset,
 };
 
-static const struct rtc_class_ops armada38x_rtc_ops_noirq = {
-	.read_time = armada38x_rtc_read_time,
-	.set_time = armada38x_rtc_set_time,
-	.read_alarm = armada38x_rtc_read_alarm,
-	.read_offset = armada38x_rtc_read_offset,
-	.set_offset = armada38x_rtc_set_offset,
-};
-
 static const struct armada38x_rtc_data armada38x_data = {
 	.update_mbus_timing = rtc_update_38x_mbus_timing_params,
 	.read_rtc_reg = read_rtc_register_38x_wa,
@@ -540,20 +532,15 @@ static __init int armada38x_rtc_probe(struct platform_device *pdev)
 	}
 	platform_set_drvdata(pdev, rtc);
 
-	if (rtc->irq != -1) {
+	if (rtc->irq != -1)
 		device_init_wakeup(&pdev->dev, 1);
-		rtc->rtc_dev->ops = &armada38x_rtc_ops;
-	} else {
-		/*
-		 * If there is no interrupt available then we can't
-		 * use the alarm
-		 */
-		rtc->rtc_dev->ops = &armada38x_rtc_ops_noirq;
-	}
+	else
+		clear_bit(RTC_FEATURE_ALARM, rtc->rtc_dev->features);
 
 	/* Update RTC-MBUS bridge timing parameters */
 	rtc->data->update_mbus_timing(rtc);
 
+	rtc->rtc_dev->ops = &armada38x_rtc_ops;
 	rtc->rtc_dev->range_max = U32_MAX;
 
 	return devm_rtc_register_device(rtc->rtc_dev);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 04/17] rtc: cmos: remove cmos_rtc_ops_no_alarm
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (2 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 03/17] rtc: armada38x: remove armada38x_rtc_ops_noirq Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-04-28 18:49   ` youling257
  2021-01-10 23:17 ` [PATCH 05/17] rtc: mv: remove mv_rtc_alarm_ops Alexandre Belloni
                   ` (12 subsequent siblings)
  16 siblings, 1 reply; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Clear RTC_FEATURE_ALARM to signal that alarms are not available instead of
having a supplementary struct rtc_class_ops with a NULL .set_alarm.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-cmos.c | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index 51e80bc70d42..c3746e249f5a 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -574,12 +574,6 @@ static const struct rtc_class_ops cmos_rtc_ops = {
 	.alarm_irq_enable	= cmos_alarm_irq_enable,
 };
 
-static const struct rtc_class_ops cmos_rtc_ops_no_alarm = {
-	.read_time		= cmos_read_time,
-	.set_time		= cmos_set_time,
-	.proc			= cmos_procfs,
-};
-
 /*----------------------------------------------------------------*/
 
 /*
@@ -857,12 +851,12 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
 			dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq);
 			goto cleanup1;
 		}
-
-		cmos_rtc.rtc->ops = &cmos_rtc_ops;
 	} else {
-		cmos_rtc.rtc->ops = &cmos_rtc_ops_no_alarm;
+		clear_bit(RTC_FEATURE_ALARM, cmos_rtc.rtc->features);
 	}
 
+	cmos_rtc.rtc->ops = &cmos_rtc_ops;
+
 	retval = devm_rtc_register_device(cmos_rtc.rtc);
 	if (retval)
 		goto cleanup2;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 05/17] rtc: mv: remove mv_rtc_alarm_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (3 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 04/17] rtc: cmos: remove cmos_rtc_ops_no_alarm Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 06/17] rtc: m48t59: remove m48t02_rtc_ops Alexandre Belloni
                   ` (11 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Move the alarm callbacks in mv_rtc_ops and clear RTC_FEATURE_ALARM to
signal that alarms are not available instead of having a supplementary
struct rtc_class_ops.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-mv.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/drivers/rtc/rtc-mv.c b/drivers/rtc/rtc-mv.c
index f8e2ecea1d8d..6c526e2ec56d 100644
--- a/drivers/rtc/rtc-mv.c
+++ b/drivers/rtc/rtc-mv.c
@@ -200,11 +200,6 @@ static irqreturn_t mv_rtc_interrupt(int irq, void *data)
 static const struct rtc_class_ops mv_rtc_ops = {
 	.read_time	= mv_rtc_read_time,
 	.set_time	= mv_rtc_set_time,
-};
-
-static const struct rtc_class_ops mv_rtc_alarm_ops = {
-	.read_time	= mv_rtc_read_time,
-	.set_time	= mv_rtc_set_time,
 	.read_alarm	= mv_rtc_read_alarm,
 	.set_alarm	= mv_rtc_set_alarm,
 	.alarm_irq_enable = mv_rtc_alarm_irq_enable,
@@ -268,13 +263,12 @@ static int __init mv_rtc_probe(struct platform_device *pdev)
 		}
 	}
 
-	if (pdata->irq >= 0) {
+	if (pdata->irq >= 0)
 		device_init_wakeup(&pdev->dev, 1);
-		pdata->rtc->ops = &mv_rtc_alarm_ops;
-	} else {
-		pdata->rtc->ops = &mv_rtc_ops;
-	}
+	else
+		clear_bit(RTC_FEATURE_ALARM, pdata->rtc->features);
 
+	pdata->rtc->ops = &mv_rtc_ops;
 	pdata->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
 	pdata->rtc->range_max = RTC_TIMESTAMP_END_2099;
 
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 06/17] rtc: m48t59: remove m48t02_rtc_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (4 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 05/17] rtc: mv: remove mv_rtc_alarm_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 07/17] rtc: pcf2127: remove pcf2127_rtc_alrm_ops Alexandre Belloni
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Clear RTC_FEATURE_ALARM to signal that alarms are not available instead of
having a supplementary struct rtc_class_ops without alarm callbacks.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-m48t59.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c
index 5f5898d3b055..1d2e99a70fce 100644
--- a/drivers/rtc/rtc-m48t59.c
+++ b/drivers/rtc/rtc-m48t59.c
@@ -313,11 +313,6 @@ static const struct rtc_class_ops m48t59_rtc_ops = {
 	.alarm_irq_enable = m48t59_rtc_alarm_irq_enable,
 };
 
-static const struct rtc_class_ops m48t02_rtc_ops = {
-	.read_time	= m48t59_rtc_read_time,
-	.set_time	= m48t59_rtc_set_time,
-};
-
 static int m48t59_nvram_read(void *priv, unsigned int offset, void *val,
 			     size_t size)
 {
@@ -366,7 +361,6 @@ static int m48t59_rtc_probe(struct platform_device *pdev)
 	struct m48t59_private *m48t59 = NULL;
 	struct resource *res;
 	int ret = -ENOMEM;
-	const struct rtc_class_ops *ops;
 	struct nvmem_config nvmem_cfg = {
 		.name = "m48t59-",
 		.word_size = 1,
@@ -438,17 +432,21 @@ static int m48t59_rtc_probe(struct platform_device *pdev)
 		if (ret)
 			return ret;
 	}
+
+	m48t59->rtc = devm_rtc_allocate_device(&pdev->dev);
+	if (IS_ERR(m48t59->rtc))
+		return PTR_ERR(m48t59->rtc);
+
 	switch (pdata->type) {
 	case M48T59RTC_TYPE_M48T59:
-		ops = &m48t59_rtc_ops;
 		pdata->offset = 0x1ff0;
 		break;
 	case M48T59RTC_TYPE_M48T02:
-		ops = &m48t02_rtc_ops;
+		clear_bit(RTC_FEATURE_ALARM, m48t59->rtc->features);
 		pdata->offset = 0x7f0;
 		break;
 	case M48T59RTC_TYPE_M48T08:
-		ops = &m48t02_rtc_ops;
+		clear_bit(RTC_FEATURE_ALARM, m48t59->rtc->features);
 		pdata->offset = 0x1ff0;
 		break;
 	default:
@@ -459,11 +457,7 @@ static int m48t59_rtc_probe(struct platform_device *pdev)
 	spin_lock_init(&m48t59->lock);
 	platform_set_drvdata(pdev, m48t59);
 
-	m48t59->rtc = devm_rtc_allocate_device(&pdev->dev);
-	if (IS_ERR(m48t59->rtc))
-		return PTR_ERR(m48t59->rtc);
-
-	m48t59->rtc->ops = ops;
+	m48t59->rtc->ops = &m48t59_rtc_ops;
 
 	nvmem_cfg.size = pdata->offset;
 	ret = devm_rtc_nvmem_register(m48t59->rtc, &nvmem_cfg);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 07/17] rtc: pcf2127: remove pcf2127_rtc_alrm_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (5 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 06/17] rtc: m48t59: remove m48t02_rtc_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 08/17] rtc: pcf85063: remove pcf85063_rtc_ops_alarm Alexandre Belloni
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Move the alarm callbacks in pcf2127_rtc_ops and use RTC_FEATURE_ALARM to
signal to the core whether alarms are available instead of having a
supplementary struct rtc_class_ops without alarm callbacks.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-pcf2127.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
index 39a7b5116aa4..68160d857ac1 100644
--- a/drivers/rtc/rtc-pcf2127.c
+++ b/drivers/rtc/rtc-pcf2127.c
@@ -225,12 +225,6 @@ static int pcf2127_rtc_ioctl(struct device *dev,
 	}
 }
 
-static const struct rtc_class_ops pcf2127_rtc_ops = {
-	.ioctl		= pcf2127_rtc_ioctl,
-	.read_time	= pcf2127_rtc_read_time,
-	.set_time	= pcf2127_rtc_set_time,
-};
-
 static int pcf2127_nvmem_read(void *priv, unsigned int offset,
 			      void *val, size_t bytes)
 {
@@ -459,7 +453,7 @@ static irqreturn_t pcf2127_rtc_irq(int irq, void *dev)
 	return IRQ_HANDLED;
 }
 
-static const struct rtc_class_ops pcf2127_rtc_alrm_ops = {
+static const struct rtc_class_ops pcf2127_rtc_ops = {
 	.ioctl            = pcf2127_rtc_ioctl,
 	.read_time        = pcf2127_rtc_read_time,
 	.set_time         = pcf2127_rtc_set_time,
@@ -584,6 +578,7 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,
 	pcf2127->rtc->range_max = RTC_TIMESTAMP_END_2099;
 	pcf2127->rtc->set_start_time = true; /* Sets actual start to 1970 */
 	pcf2127->rtc->uie_unsupported = 1;
+	clear_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features);
 
 	if (alarm_irq > 0) {
 		ret = devm_request_threaded_irq(dev, alarm_irq, NULL,
@@ -598,7 +593,7 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,
 
 	if (alarm_irq > 0 || device_property_read_bool(dev, "wakeup-source")) {
 		device_init_wakeup(dev, true);
-		pcf2127->rtc->ops = &pcf2127_rtc_alrm_ops;
+		set_bit(RTC_FEATURE_ALARM, pcf2127->rtc->features);
 	}
 
 	if (has_nvmem) {
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 08/17] rtc: pcf85063: remove pcf85063_rtc_ops_alarm
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (6 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 07/17] rtc: pcf2127: remove pcf2127_rtc_alrm_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 09/17] rtc: rx8010: drop a struct rtc_class_ops Alexandre Belloni
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Move the alarm callbacks in pcf85063_rtc_ops and use RTC_FEATURE_ALARM to
signal to the core whether alarms are available instead of having a
supplementary struct rtc_class_ops without alarm callbacks.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-pcf85063.c | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c
index e19cf2adbc35..f7e7c9eb0781 100644
--- a/drivers/rtc/rtc-pcf85063.c
+++ b/drivers/rtc/rtc-pcf85063.c
@@ -307,14 +307,6 @@ static int pcf85063_ioctl(struct device *dev, unsigned int cmd,
 }
 
 static const struct rtc_class_ops pcf85063_rtc_ops = {
-	.read_time	= pcf85063_rtc_read_time,
-	.set_time	= pcf85063_rtc_set_time,
-	.read_offset	= pcf85063_read_offset,
-	.set_offset	= pcf85063_set_offset,
-	.ioctl		= pcf85063_ioctl,
-};
-
-static const struct rtc_class_ops pcf85063_rtc_ops_alarm = {
 	.read_time	= pcf85063_rtc_read_time,
 	.set_time	= pcf85063_rtc_set_time,
 	.read_offset	= pcf85063_read_offset,
@@ -587,6 +579,7 @@ static int pcf85063_probe(struct i2c_client *client)
 	pcf85063->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
 	pcf85063->rtc->range_max = RTC_TIMESTAMP_END_2099;
 	pcf85063->rtc->uie_unsupported = 1;
+	clear_bit(RTC_FEATURE_ALARM, pcf85063->rtc->features);
 
 	if (config->has_alarms && client->irq > 0) {
 		err = devm_request_threaded_irq(&client->dev, client->irq,
@@ -597,7 +590,7 @@ static int pcf85063_probe(struct i2c_client *client)
 			dev_warn(&pcf85063->rtc->dev,
 				 "unable to request IRQ, alarms disabled\n");
 		} else {
-			pcf85063->rtc->ops = &pcf85063_rtc_ops_alarm;
+			set_bit(RTC_FEATURE_ALARM, pcf85063->rtc->features);
 			device_init_wakeup(&client->dev, true);
 			err = dev_pm_set_wake_irq(&client->dev, client->irq);
 			if (err)
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 09/17] rtc: rx8010: drop a struct rtc_class_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (7 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 08/17] rtc: pcf85063: remove pcf85063_rtc_ops_alarm Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 10/17] rtc: pcf85363: " Alexandre Belloni
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Merge both struct rtc_class_ops in a single one and use RTC_FEATURE_ALARM
to signal to the core whether alarms are available.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-rx8010.c | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/drivers/rtc/rtc-rx8010.c b/drivers/rtc/rtc-rx8010.c
index 8340ab47a059..1a05e4654290 100644
--- a/drivers/rtc/rtc-rx8010.c
+++ b/drivers/rtc/rtc-rx8010.c
@@ -354,13 +354,7 @@ static int rx8010_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
 	}
 }
 
-static const struct rtc_class_ops rx8010_rtc_ops_default = {
-	.read_time = rx8010_get_time,
-	.set_time = rx8010_set_time,
-	.ioctl = rx8010_ioctl,
-};
-
-static const struct rtc_class_ops rx8010_rtc_ops_alarm = {
+static const struct rtc_class_ops rx8010_rtc_ops = {
 	.read_time = rx8010_get_time,
 	.set_time = rx8010_set_time,
 	.ioctl = rx8010_ioctl,
@@ -409,12 +403,11 @@ static int rx8010_probe(struct i2c_client *client)
 			dev_err(dev, "unable to request IRQ\n");
 			return err;
 		}
-
-		rx8010->rtc->ops = &rx8010_rtc_ops_alarm;
 	} else {
-		rx8010->rtc->ops = &rx8010_rtc_ops_default;
+		clear_bit(RTC_FEATURE_ALARM, rx8010->rtc->features);
 	}
 
+	rx8010->rtc->ops = &rx8010_rtc_ops;
 	rx8010->rtc->max_user_freq = 1;
 	rx8010->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
 	rx8010->rtc->range_max = RTC_TIMESTAMP_END_2099;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 10/17] rtc: pcf85363: drop a struct rtc_class_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (8 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 09/17] rtc: rx8010: drop a struct rtc_class_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 11/17] rtc: m41t80: constify m41t80_rtc_ops Alexandre Belloni
                   ` (6 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Merge both struct rtc_class_ops in a single one and use RTC_FEATURE_ALARM
to signal to the core whether alarms are available.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-pcf85363.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/drivers/rtc/rtc-pcf85363.c b/drivers/rtc/rtc-pcf85363.c
index a574c8d15a5c..8c2dcbac0d7b 100644
--- a/drivers/rtc/rtc-pcf85363.c
+++ b/drivers/rtc/rtc-pcf85363.c
@@ -285,11 +285,6 @@ static irqreturn_t pcf85363_rtc_handle_irq(int irq, void *dev_id)
 static const struct rtc_class_ops rtc_ops = {
 	.read_time	= pcf85363_rtc_read_time,
 	.set_time	= pcf85363_rtc_set_time,
-};
-
-static const struct rtc_class_ops rtc_ops_alarm = {
-	.read_time	= pcf85363_rtc_read_time,
-	.set_time	= pcf85363_rtc_set_time,
 	.read_alarm	= pcf85363_rtc_read_alarm,
 	.set_alarm	= pcf85363_rtc_set_alarm,
 	.alarm_irq_enable = pcf85363_rtc_alarm_irq_enable,
@@ -403,6 +398,7 @@ static int pcf85363_probe(struct i2c_client *client,
 	pcf85363->rtc->ops = &rtc_ops;
 	pcf85363->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
 	pcf85363->rtc->range_max = RTC_TIMESTAMP_END_2099;
+	clear_bit(RTC_FEATURE_ALARM, pcf85363->rtc->features);
 
 	if (client->irq > 0) {
 		regmap_write(pcf85363->regmap, CTRL_FLAGS, 0);
@@ -415,7 +411,7 @@ static int pcf85363_probe(struct i2c_client *client,
 		if (ret)
 			dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
 		else
-			pcf85363->rtc->ops = &rtc_ops_alarm;
+			set_bit(RTC_FEATURE_ALARM, pcf85363->rtc->features);
 	}
 
 	ret = devm_rtc_register_device(pcf85363->rtc);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 11/17] rtc: m41t80: constify m41t80_rtc_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (9 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 10/17] rtc: pcf85363: " Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 12/17] rtc: opal: constify opal_rtc_ops Alexandre Belloni
                   ` (5 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Use RTC_FEATURE_ALARM to signal to the core whether alarms are available
instead of changing the global struct rtc_class_ops, allowing to make it
const.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-m41t80.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c
index 160dcf68e64e..e3ddd660d68c 100644
--- a/drivers/rtc/rtc-m41t80.c
+++ b/drivers/rtc/rtc-m41t80.c
@@ -397,10 +397,13 @@ static int m41t80_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 	return 0;
 }
 
-static struct rtc_class_ops m41t80_rtc_ops = {
+static const struct rtc_class_ops m41t80_rtc_ops = {
 	.read_time = m41t80_rtc_read_time,
 	.set_time = m41t80_rtc_set_time,
 	.proc = m41t80_rtc_proc,
+	.read_alarm = m41t80_read_alarm,
+	.set_alarm = m41t80_set_alarm,
+	.alarm_irq_enable = m41t80_alarm_irq_enable,
 };
 
 #ifdef CONFIG_PM_SLEEP
@@ -913,13 +916,10 @@ static int m41t80_probe(struct i2c_client *client,
 			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 */
+	if (client->irq > 0 || wakeup_source)
 		device_init_wakeup(&client->dev, true);
-	}
+	else
+		clear_bit(RTC_FEATURE_ALARM, m41t80_data->rtc->features);
 
 	m41t80_data->rtc->ops = &m41t80_rtc_ops;
 	m41t80_data->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 12/17] rtc: opal: constify opal_rtc_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (10 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 11/17] rtc: m41t80: constify m41t80_rtc_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 13/17] rtc: rv3028: constify rv3028_rtc_ops Alexandre Belloni
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Michael Ellerman, Benjamin Herrenschmidt,
	Paul Mackerras, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Use RTC_FEATURE_ALARM to signal to the core whether alarms are available
instead of changing the global struct rtc_class_ops, allowing to make it
const.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-opal.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/rtc/rtc-opal.c b/drivers/rtc/rtc-opal.c
index c586f695bdc9..f8f49a969c23 100644
--- a/drivers/rtc/rtc-opal.c
+++ b/drivers/rtc/rtc-opal.c
@@ -224,9 +224,12 @@ static int opal_tpo_alarm_irq_enable(struct device *dev, unsigned int enabled)
 	return enabled ? 0 : opal_set_tpo_time(dev, &alarm);
 }
 
-static struct rtc_class_ops opal_rtc_ops = {
+static const struct rtc_class_ops opal_rtc_ops = {
 	.read_time	= opal_get_rtc_time,
 	.set_time	= opal_set_rtc_time,
+	.read_alarm	= opal_get_tpo_time,
+	.set_alarm	= opal_set_tpo_time,
+	.alarm_irq_enable = opal_tpo_alarm_irq_enable,
 };
 
 static int opal_rtc_probe(struct platform_device *pdev)
@@ -239,12 +242,10 @@ static int opal_rtc_probe(struct platform_device *pdev)
 
 	if (pdev->dev.of_node &&
 	    (of_property_read_bool(pdev->dev.of_node, "wakeup-source") ||
-	     of_property_read_bool(pdev->dev.of_node, "has-tpo")/* legacy */)) {
+	     of_property_read_bool(pdev->dev.of_node, "has-tpo")/* legacy */))
 		device_set_wakeup_capable(&pdev->dev, true);
-		opal_rtc_ops.read_alarm	= opal_get_tpo_time;
-		opal_rtc_ops.set_alarm = opal_set_tpo_time;
-		opal_rtc_ops.alarm_irq_enable = opal_tpo_alarm_irq_enable;
-	}
+	else
+		clear_bit(RTC_FEATURE_ALARM, rtc->features);
 
 	rtc->ops = &opal_rtc_ops;
 	rtc->range_min = RTC_TIMESTAMP_BEGIN_0000;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 13/17] rtc: rv3028: constify rv3028_rtc_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (11 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 12/17] rtc: opal: constify opal_rtc_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 14/17] rtc: rv3029: constify rv3029_rtc_ops Alexandre Belloni
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Use RTC_FEATURE_ALARM to signal to the core whether alarms are available
instead of changing the global struct rtc_class_ops, allowing to make it
const.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-rv3028.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
index 979407a51c7a..2004f8c5397f 100644
--- a/drivers/rtc/rtc-rv3028.c
+++ b/drivers/rtc/rtc-rv3028.c
@@ -770,9 +770,12 @@ static int rv3028_clkout_register_clk(struct rv3028_data *rv3028,
 }
 #endif
 
-static struct rtc_class_ops rv3028_rtc_ops = {
+static const struct rtc_class_ops rv3028_rtc_ops = {
 	.read_time = rv3028_get_time,
 	.set_time = rv3028_set_time,
+	.read_alarm = rv3028_get_alarm,
+	.set_alarm = rv3028_set_alarm,
+	.alarm_irq_enable = rv3028_alarm_irq_enable,
 	.read_offset = rv3028_read_offset,
 	.set_offset = rv3028_set_offset,
 	.ioctl = rv3028_ioctl,
@@ -841,12 +844,10 @@ static int rv3028_probe(struct i2c_client *client)
 		if (ret) {
 			dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
 			client->irq = 0;
-		} else {
-			rv3028_rtc_ops.read_alarm = rv3028_get_alarm;
-			rv3028_rtc_ops.set_alarm = rv3028_set_alarm;
-			rv3028_rtc_ops.alarm_irq_enable = rv3028_alarm_irq_enable;
 		}
 	}
+	if (!client->irq)
+		clear_bit(RTC_FEATURE_ALARM, rv3028->rtc->features);
 
 	ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1,
 				 RV3028_CTRL1_WADA, RV3028_CTRL1_WADA);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 14/17] rtc: rv3029: constify rv3029_rtc_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (12 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 13/17] rtc: rv3028: constify rv3028_rtc_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 15/17] rtc: rv3032: constify rv3032_rtc_ops Alexandre Belloni
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Use RTC_FEATURE_ALARM to signal to the core whether alarms are available
instead of changing the global struct rtc_class_ops, allowing to make it
const.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-rv3029c2.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/rtc/rtc-rv3029c2.c b/drivers/rtc/rtc-rv3029c2.c
index dc1bda62095e..c1f4c0bba1e5 100644
--- a/drivers/rtc/rtc-rv3029c2.c
+++ b/drivers/rtc/rtc-rv3029c2.c
@@ -694,10 +694,13 @@ static void rv3029_hwmon_register(struct device *dev, const char *name)
 
 #endif /* CONFIG_RTC_DRV_RV3029_HWMON */
 
-static struct rtc_class_ops rv3029_rtc_ops = {
+static const struct rtc_class_ops rv3029_rtc_ops = {
 	.read_time	= rv3029_read_time,
 	.set_time	= rv3029_set_time,
 	.ioctl		= rv3029_ioctl,
+	.read_alarm	= rv3029_read_alarm,
+	.set_alarm	= rv3029_set_alarm,
+	.alarm_irq_enable = rv3029_alarm_irq_enable,
 };
 
 static int rv3029_probe(struct device *dev, struct regmap *regmap, int irq,
@@ -739,12 +742,10 @@ static int rv3029_probe(struct device *dev, struct regmap *regmap, int irq,
 		if (rc) {
 			dev_warn(dev, "unable to request IRQ, alarms disabled\n");
 			rv3029->irq = 0;
-		} else {
-			rv3029_rtc_ops.read_alarm = rv3029_read_alarm;
-			rv3029_rtc_ops.set_alarm = rv3029_set_alarm;
-			rv3029_rtc_ops.alarm_irq_enable = rv3029_alarm_irq_enable;
 		}
 	}
+	if (!rv3029->irq)
+		clear_bit(RTC_FEATURE_ALARM, rv3029->rtc->features);
 
 	rv3029->rtc->ops = &rv3029_rtc_ops;
 	rv3029->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 15/17] rtc: rv3032: constify rv3032_rtc_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (13 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 14/17] rtc: rv3029: constify rv3029_rtc_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 16/17] rtc: rv8803: constify rv8803_rtc_ops Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 17/17] rtc: tps65910: remove tps65910_rtc_ops_noirq Alexandre Belloni
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Use RTC_FEATURE_ALARM to signal to the core whether alarms are available
instead of changing the global struct rtc_class_ops, allowing to make it
const.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-rv3032.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/rtc/rtc-rv3032.c b/drivers/rtc/rtc-rv3032.c
index c9bcea727757..5161016bce00 100644
--- a/drivers/rtc/rtc-rv3032.c
+++ b/drivers/rtc/rtc-rv3032.c
@@ -804,12 +804,15 @@ static void rv3032_hwmon_register(struct device *dev)
 	devm_hwmon_device_register_with_info(dev, "rv3032", rv3032, &rv3032_hwmon_chip_info, NULL);
 }
 
-static struct rtc_class_ops rv3032_rtc_ops = {
+static const struct rtc_class_ops rv3032_rtc_ops = {
 	.read_time = rv3032_get_time,
 	.set_time = rv3032_set_time,
 	.read_offset = rv3032_read_offset,
 	.set_offset = rv3032_set_offset,
 	.ioctl = rv3032_ioctl,
+	.read_alarm = rv3032_get_alarm,
+	.set_alarm = rv3032_set_alarm,
+	.alarm_irq_enable = rv3032_alarm_irq_enable,
 };
 
 static const struct regmap_config regmap_config = {
@@ -868,12 +871,10 @@ static int rv3032_probe(struct i2c_client *client)
 		if (ret) {
 			dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
 			client->irq = 0;
-		} else {
-			rv3032_rtc_ops.read_alarm = rv3032_get_alarm;
-			rv3032_rtc_ops.set_alarm = rv3032_set_alarm;
-			rv3032_rtc_ops.alarm_irq_enable = rv3032_alarm_irq_enable;
 		}
 	}
+	if (!client->irq)
+		clear_bit(RTC_FEATURE_ALARM, rv3032->rtc->features);
 
 	ret = regmap_update_bits(rv3032->regmap, RV3032_CTRL1,
 				 RV3032_CTRL1_WADA, RV3032_CTRL1_WADA);
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 16/17] rtc: rv8803: constify rv8803_rtc_ops
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (14 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 15/17] rtc: rv3032: constify rv3032_rtc_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  2021-01-10 23:17 ` [PATCH 17/17] rtc: tps65910: remove tps65910_rtc_ops_noirq Alexandre Belloni
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Use RTC_FEATURE_ALARM to signal to the core whether alarms are available
instead of changing the global struct rtc_class_ops, allowing to make it
const.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-rv8803.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/rtc/rtc-rv8803.c b/drivers/rtc/rtc-rv8803.c
index d4ea6db51b26..8821264e9385 100644
--- a/drivers/rtc/rtc-rv8803.c
+++ b/drivers/rtc/rtc-rv8803.c
@@ -471,10 +471,13 @@ static int rv8803_nvram_read(void *priv, unsigned int offset,
 	return 0;
 }
 
-static struct rtc_class_ops rv8803_rtc_ops = {
+static const struct rtc_class_ops rv8803_rtc_ops = {
 	.read_time = rv8803_get_time,
 	.set_time = rv8803_set_time,
 	.ioctl = rv8803_ioctl,
+	.read_alarm = rv8803_get_alarm,
+	.set_alarm = rv8803_set_alarm,
+	.alarm_irq_enable = rv8803_alarm_irq_enable,
 };
 
 static int rx8900_trickle_charger_init(struct rv8803_data *rv8803)
@@ -567,12 +570,10 @@ static int rv8803_probe(struct i2c_client *client,
 		if (err) {
 			dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
 			client->irq = 0;
-		} else {
-			rv8803_rtc_ops.read_alarm = rv8803_get_alarm;
-			rv8803_rtc_ops.set_alarm = rv8803_set_alarm;
-			rv8803_rtc_ops.alarm_irq_enable = rv8803_alarm_irq_enable;
 		}
 	}
+	if (!client->irq)
+		clear_bit(RTC_FEATURE_ALARM, rv8803->rtc->features);
 
 	err = rv8803_write_reg(rv8803->client, RV8803_EXT, RV8803_EXT_WADA);
 	if (err)
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 17/17] rtc: tps65910: remove tps65910_rtc_ops_noirq
  2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
                   ` (15 preceding siblings ...)
  2021-01-10 23:17 ` [PATCH 16/17] rtc: rv8803: constify rv8803_rtc_ops Alexandre Belloni
@ 2021-01-10 23:17 ` Alexandre Belloni
  16 siblings, 0 replies; 22+ messages in thread
From: Alexandre Belloni @ 2021-01-10 23:17 UTC (permalink / raw)
  To: linux-rtc, Alessandro Zummo, Alexandre Belloni
  Cc: linux-kernel, linux-arm-kernel, linuxppc-dev

Clear RTC_FEATURE_ALARM to signal that alarms are not available instead of
having a supplementary struct rtc_class_ops without alarm callbacks.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/rtc/rtc-tps65910.c | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c
index 2d87b62826a8..e1415a49f4ee 100644
--- a/drivers/rtc/rtc-tps65910.c
+++ b/drivers/rtc/rtc-tps65910.c
@@ -361,13 +361,6 @@ static const struct rtc_class_ops tps65910_rtc_ops = {
 	.set_offset	= tps65910_set_offset,
 };
 
-static const struct rtc_class_ops tps65910_rtc_ops_noirq = {
-	.read_time	= tps65910_rtc_read_time,
-	.set_time	= tps65910_rtc_set_time,
-	.read_offset	= tps65910_read_offset,
-	.set_offset	= tps65910_set_offset,
-};
-
 static int tps65910_rtc_probe(struct platform_device *pdev)
 {
 	struct tps65910 *tps65910 = NULL;
@@ -425,12 +418,12 @@ static int tps65910_rtc_probe(struct platform_device *pdev)
 		irq = -1;
 
 	tps_rtc->irq = irq;
-	if (irq != -1) {
+	if (irq != -1)
 		device_set_wakeup_capable(&pdev->dev, 1);
-		tps_rtc->rtc->ops = &tps65910_rtc_ops;
-	} else
-		tps_rtc->rtc->ops = &tps65910_rtc_ops_noirq;
+	else
+		clear_bit(RTC_FEATURE_ALARM, tps_rtc->rtc->features);
 
+	tps_rtc->rtc->ops = &tps65910_rtc_ops;
 	tps_rtc->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
 	tps_rtc->rtc->range_max = RTC_TIMESTAMP_END_2099;
 
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH 02/17] rtc: pl031: use RTC_FEATURE_ALARM
  2021-01-10 23:17 ` [PATCH 02/17] rtc: pl031: use RTC_FEATURE_ALARM Alexandre Belloni
@ 2021-01-11 22:00   ` Linus Walleij
  0 siblings, 0 replies; 22+ messages in thread
From: Linus Walleij @ 2021-01-11 22:00 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: linux-rtc, Alessandro Zummo, linux-kernel, Linux ARM,
	linuxppc-dev@lists.ozlabs.org list

On Mon, Jan 11, 2021 at 12:18 AM Alexandre Belloni
<alexandre.belloni@bootlin.com> wrote:

> Clear RTC_FEATURE_ALARM instead of setting set_alarm, read_alarm and
> alarm_irq_enable to NULL.
>
> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

Acked-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 04/17] rtc: cmos: remove cmos_rtc_ops_no_alarm
  2021-01-10 23:17 ` [PATCH 04/17] rtc: cmos: remove cmos_rtc_ops_no_alarm Alexandre Belloni
@ 2021-04-28 18:49   ` youling257
  2021-04-28 20:20     ` Alexandre Belloni
  0 siblings, 1 reply; 22+ messages in thread
From: youling257 @ 2021-04-28 18:49 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: hdegoede, a.zummo, linux-arm-kernel, linux-kernel, linux-rtc,
	linuxppc-dev

this patch cause suspend failed on my Bay trail z3735f tablet.

[  162.038713] PM: dpm_run_callback(): platform_pm_suspend+0x0/0x40 returns -22
[  162.038760] alarmtimer alarmtimer.0.auto: PM: failed to suspend: error -22

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 04/17] rtc: cmos: remove cmos_rtc_ops_no_alarm
  2021-04-28 18:49   ` youling257
@ 2021-04-28 20:20     ` Alexandre Belloni
  2021-04-28 21:07       ` youling 257
  0 siblings, 1 reply; 22+ messages in thread
From: Alexandre Belloni @ 2021-04-28 20:20 UTC (permalink / raw)
  To: youling257
  Cc: hdegoede, a.zummo, linux-arm-kernel, linux-kernel, linux-rtc,
	linuxppc-dev

Hello,

On 29/04/2021 02:49:46+0800, youling257 wrote:
> this patch cause suspend failed on my Bay trail z3735f tablet.
> 
> [  162.038713] PM: dpm_run_callback(): platform_pm_suspend+0x0/0x40 returns -22
> [  162.038760] alarmtimer alarmtimer.0.auto: PM: failed to suspend: error -22

I think I know what is happening, there is one patch I wanted to send
this cycle but didn't, can you test it?

https://github.com/alexandrebelloni/linux/commit/50641a5a19cedf7561410d7db614da46c228bacc

Thanks for the report!

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 04/17] rtc: cmos: remove cmos_rtc_ops_no_alarm
  2021-04-28 20:20     ` Alexandre Belloni
@ 2021-04-28 21:07       ` youling 257
  0 siblings, 0 replies; 22+ messages in thread
From: youling 257 @ 2021-04-28 21:07 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: hdegoede, a.zummo, linux-arm-kernel, linux-kernel, linux-rtc,
	linuxppc-dev

test this patch can fix my problem.

2021-04-29 4:20 GMT+08:00, Alexandre Belloni <alexandre.belloni@bootlin.com>:
> Hello,
>
> On 29/04/2021 02:49:46+0800, youling257 wrote:
>> this patch cause suspend failed on my Bay trail z3735f tablet.
>>
>> [  162.038713] PM: dpm_run_callback(): platform_pm_suspend+0x0/0x40
>> returns -22
>> [  162.038760] alarmtimer alarmtimer.0.auto: PM: failed to suspend: error
>> -22
>
> I think I know what is happening, there is one patch I wanted to send
> this cycle but didn't, can you test it?
>
> https://github.com/alexandrebelloni/linux/commit/50641a5a19cedf7561410d7db614da46c228bacc
>
> Thanks for the report!
>
> --
> Alexandre Belloni, co-owner and COO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2021-04-28 21:07 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-10 23:17 [PATCH 00/17] rtc: constify all rtc_class_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 01/17] rtc: introduce features bitfield Alexandre Belloni
2021-01-10 23:17 ` [PATCH 02/17] rtc: pl031: use RTC_FEATURE_ALARM Alexandre Belloni
2021-01-11 22:00   ` Linus Walleij
2021-01-10 23:17 ` [PATCH 03/17] rtc: armada38x: remove armada38x_rtc_ops_noirq Alexandre Belloni
2021-01-10 23:17 ` [PATCH 04/17] rtc: cmos: remove cmos_rtc_ops_no_alarm Alexandre Belloni
2021-04-28 18:49   ` youling257
2021-04-28 20:20     ` Alexandre Belloni
2021-04-28 21:07       ` youling 257
2021-01-10 23:17 ` [PATCH 05/17] rtc: mv: remove mv_rtc_alarm_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 06/17] rtc: m48t59: remove m48t02_rtc_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 07/17] rtc: pcf2127: remove pcf2127_rtc_alrm_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 08/17] rtc: pcf85063: remove pcf85063_rtc_ops_alarm Alexandre Belloni
2021-01-10 23:17 ` [PATCH 09/17] rtc: rx8010: drop a struct rtc_class_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 10/17] rtc: pcf85363: " Alexandre Belloni
2021-01-10 23:17 ` [PATCH 11/17] rtc: m41t80: constify m41t80_rtc_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 12/17] rtc: opal: constify opal_rtc_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 13/17] rtc: rv3028: constify rv3028_rtc_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 14/17] rtc: rv3029: constify rv3029_rtc_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 15/17] rtc: rv3032: constify rv3032_rtc_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 16/17] rtc: rv8803: constify rv8803_rtc_ops Alexandre Belloni
2021-01-10 23:17 ` [PATCH 17/17] rtc: tps65910: remove tps65910_rtc_ops_noirq Alexandre Belloni

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).