Thread (17 messages) 17 messages, 3 authors, 2025-12-17

Re: [PATCH 4/4] rtc: zynqmp: use dynamic max and min offset ranges

From: Tomas Melin <hidden>
Date: 2025-12-10 12:25:48
Also in: linux-rtc, lkml

Hi,

On 09/12/2025 21:28, T, Harini wrote:
[Public]

Hi,
quoted
-----Original Message-----
From: Tomas Melin <redacted>
Sent: Monday, December 1, 2025 6:20 PM
To: Alexandre Belloni <alexandre.belloni@bootlin.com>; Simek, Michal
[off-list ref]
Cc: linux-rtc@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-
kernel@vger.kernel.org; Tomas Melin [off-list ref]
Subject: [PATCH 4/4] rtc: zynqmp: use dynamic max and min offset ranges

Caution: This message originated from an External Source. Use proper
caution when opening attachments, clicking links, or responding.


Maximum and minimum offsets in ppb that can be handled are dependent
on the rtc clock frequency and what can fit in the 16-bit register field.

Signed-off-by: Tomas Melin <redacted>
---
 drivers/rtc/rtc-zynqmp.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/rtc/rtc-zynqmp.c b/drivers/rtc/rtc-zynqmp.c index
3bc8831ba2c4c4c701a49506b67ae6174f3ade3d..0cebc99b15a6de2440a60afc
2bd1769eccfa84b3 100644
--- a/drivers/rtc/rtc-zynqmp.c
+++ b/drivers/rtc/rtc-zynqmp.c
@@ -44,8 +44,6 @@
 #define RTC_FR_MASK            0xF0000
 #define RTC_FR_MAX_TICKS       16
 #define RTC_PPB                        1000000000LL
-#define RTC_MIN_OFFSET         -32768000
-#define RTC_MAX_OFFSET         32767000

 struct xlnx_rtc_dev {
        struct rtc_device       *rtc;
@@ -215,12 +213,12 @@ static int xlnx_rtc_set_offset(struct device *dev,
long offset)

        /* ticks to reach RTC_PPB */
        tick_mult = DIV_ROUND_CLOSEST(RTC_PPB, xrtcdev->freq);
-       if (offset < RTC_MIN_OFFSET || offset > RTC_MAX_OFFSET)
-               return -ERANGE;
-
        /* Number ticks for given offset */
        max_tick = div_s64_rem(offset, tick_mult, &fract_offset);

+       if (freq + max_tick > RTC_TICK_MASK || (freq + max_tick < 1))
The check 'freq + max_tick < 1' should be '<2' to prevent writing 0 to the calibration register when fract_offset < 0 causes max_tick--.
Example: freq=32767, max_tick=-32766 passes (sum=1), but after decrement becomes calibval=0.
calibval=0 is not documented as invalid calibration value. AFAIS it
would mean a frequency of 1Hz. Can You provide more info on this?

Thanks,
Tomas

quoted
+               return -ERANGE;
+
        /* Number fractional ticks for given offset */
        if (fract_offset) {
                /* round up here so we stay below a full tick */

--
2.47.3
Thanks,
Harini T
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help