]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rtc: zynqmp: use dynamic max and min offset ranges
authorTomas Melin <tomas.melin@vaisala.com>
Thu, 22 Jan 2026 13:53:49 +0000 (13:53 +0000)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Thu, 29 Jan 2026 15:44:37 +0000 (16:44 +0100)
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.

Reviewed-by: Harini T <harini.t@amd.com>
Tested-by: Harini T <harini.t@amd.com>
Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
Acked-by: Michal Simek <michal.simek@amd.com>
Link: https://patch.msgid.link/20260122-zynqmp-rtc-updates-v4-5-d4edb966b499@vaisala.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-zynqmp.c

index f0f5dc63e254799ed99927c259c767b30ee877a4..2ae54804b87a47642d118789dc33191c53b36932 100644 (file)
@@ -44,8 +44,6 @@
 #define RTC_FR_MASK            0xF0000
 #define RTC_FR_MAX_TICKS       16
 #define RTC_PPB                        1000000000
-#define RTC_MIN_OFFSET         -32768000
-#define RTC_MAX_OFFSET         32767000
 
 struct xlnx_rtc_dev {
        struct rtc_device       *rtc;
@@ -215,12 +213,13 @@ static int xlnx_rtc_set_offset(struct device *dev, long offset)
 
        /* Tick to offset multiplier */
        tick_mult = DIV_ROUND_CLOSEST(RTC_PPB, 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))
+               return -ERANGE;
+
        /* Number fractional ticks for given offset */
        if (fract_offset) {
                fract_part = DIV_ROUND_UP(tick_mult, RTC_FR_MAX_TICKS);