[PATCH 4/6] rtc: rzn1: make interrupts optional
From: Wolfram Sang <wsa+renesas@sang-engineering.com>
Date: 2026-09-14 21:18:54
Also in:
linux-renesas-soc
Subsystem:
real time clock (rtc) subsystem, renesas rz/n1 rtc controller driver, the rest · Maintainers:
Alexandre Belloni, Miquel Raynal, Linus Torvalds
If no interrupts are specified, alarm handling will just be disabled. No
need to bail out. Instead of juggling with 4 different static rtc_ops
for all {subu|scmp}_{no_}alarm cases, a single non-static rtc_ops is
chosen which is adapted during probe().
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
---
drivers/rtc/rtc-rzn1.c | 58 +++++++++++++++++++-----------------------
1 file changed, 26 insertions(+), 32 deletions(-)
diff --git a/drivers/rtc/rtc-rzn1.c b/drivers/rtc/rtc-rzn1.c
index b9d69ebdd224..ebb56c8d75ea 100644
--- a/drivers/rtc/rtc-rzn1.c
+++ b/drivers/rtc/rtc-rzn1.c@@ -378,22 +378,9 @@ static int rzn1_rtc_set_offset(struct device *dev, long offset) return 0; } -static const struct rtc_class_ops rzn1_rtc_ops_subu = { +static struct rtc_class_ops rzn1_rtc_ops = { .read_time = rzn1_rtc_read_time, .set_time = rzn1_rtc_set_time, - .read_alarm = rzn1_rtc_read_alarm, - .set_alarm = rzn1_rtc_set_alarm, - .alarm_irq_enable = rzn1_rtc_alarm_irq_enable, - .read_offset = rzn1_rtc_read_offset, - .set_offset = rzn1_rtc_set_offset, -}; - -static const struct rtc_class_ops rzn1_rtc_ops_scmp = { - .read_time = rzn1_rtc_read_time, - .set_time = rzn1_rtc_set_time, - .read_alarm = rzn1_rtc_read_alarm, - .set_alarm = rzn1_rtc_set_alarm, - .alarm_irq_enable = rzn1_rtc_alarm_irq_enable, }; static void rzn1_rtc_disable_hardware(void *data)
@@ -431,14 +418,11 @@ static int rzn1_rtc_probe(struct platform_device *pdev) if (IS_ERR(rtc->base)) return dev_err_probe(dev, PTR_ERR(rtc->base), "Missing reg\n"); - irq = platform_get_irq_byname(pdev, "alarm"); - if (irq < 0) - return irq; - rtc->rtcdev = devm_rtc_allocate_device(dev); if (IS_ERR(rtc->rtcdev)) return PTR_ERR(rtc->rtcdev); + rtc->rtcdev->ops = &rzn1_rtc_ops; rtc->rtcdev->range_min = RTC_TIMESTAMP_BEGIN_2000; rtc->rtcdev->range_max = RTC_TIMESTAMP_END_2099; rtc->rtcdev->alarm_offset_max = 7 * 86400;
@@ -490,9 +474,9 @@ static int rzn1_rtc_probe(struct platform_device *pdev) if (scmp_val) { writel(rate - 1, rtc->base + RZN1_RTC_SCMP); - rtc->rtcdev->ops = &rzn1_rtc_ops_scmp; } else { - rtc->rtcdev->ops = &rzn1_rtc_ops_subu; + rzn1_rtc_ops.read_offset = rzn1_rtc_read_offset; + rzn1_rtc_ops.set_offset = rzn1_rtc_set_offset; } /* Enable controller finally */
@@ -503,20 +487,30 @@ static int rzn1_rtc_probe(struct platform_device *pdev) spin_lock_init(&rtc->ctl1_access_lock); - ret = devm_request_irq(dev, irq, rzn1_rtc_alarm_irq, 0, "RZN1 RTC Alarm", rtc); - if (ret) - return dev_err_probe(dev, ret, "RTC alarm interrupt not available\n"); - irq = platform_get_irq_byname_optional(pdev, "pps"); - if (irq == -EPROBE_DEFER) + irq = platform_get_irq_byname_optional(pdev, "alarm"); + if (irq == -EPROBE_DEFER) { return irq; - if (irq >= 0) - ret = devm_request_irq(dev, irq, rzn1_rtc_1s_irq, 0, "RZN1 RTC 1s", rtc); - - if (irq < 0 || ret) { - set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->rtcdev->features); - clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->rtcdev->features); - dev_warn(dev, "RTC pps interrupt not available. Alarm has only minute accuracy\n"); + } else if (irq >= 0) { + ret = devm_request_irq(dev, irq, rzn1_rtc_alarm_irq, 0, "RZN1 RTC Alarm", rtc); + if (ret) + return dev_err_probe(dev, ret, "RTC alarm interrupt not available\n"); + + irq = platform_get_irq_byname_optional(pdev, "pps"); + if (irq == -EPROBE_DEFER) + return irq; + if (irq >= 0) + ret = devm_request_irq(dev, irq, rzn1_rtc_1s_irq, 0, "RZN1 RTC 1s", rtc); + + if (irq < 0 || ret) { + set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->rtcdev->features); + clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->rtcdev->features); + dev_warn(dev, "RTC pps interrupt not available. Alarm has only minute accuracy\n"); + } + + rzn1_rtc_ops.read_alarm = rzn1_rtc_read_alarm; + rzn1_rtc_ops.set_alarm = rzn1_rtc_set_alarm; + rzn1_rtc_ops.alarm_irq_enable = rzn1_rtc_alarm_irq_enable; } return devm_rtc_register_device(rtc->rtcdev);
--
2.53.0