Skip to content

Commit 2254383

Browse files
vai-tommealexandrebelloni
authored andcommitted
rtc: zynqmp: use dynamic max and min offset ranges
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>
1 parent 9f5af70 commit 2254383

1 file changed

Lines changed: 3 additions & 4 deletions

File tree

drivers/rtc/rtc-zynqmp.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@
4444
#define RTC_FR_MASK 0xF0000
4545
#define RTC_FR_MAX_TICKS 16
4646
#define RTC_PPB 1000000000
47-
#define RTC_MIN_OFFSET -32768000
48-
#define RTC_MAX_OFFSET 32767000
4947

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

216214
/* Tick to offset multiplier */
217215
tick_mult = DIV_ROUND_CLOSEST(RTC_PPB, freq);
218-
if (offset < RTC_MIN_OFFSET || offset > RTC_MAX_OFFSET)
219-
return -ERANGE;
220216

221217
/* Number ticks for given offset */
222218
max_tick = div_s64_rem(offset, tick_mult, &fract_offset);
223219

220+
if (freq + max_tick > RTC_TICK_MASK || (freq + max_tick < 1))
221+
return -ERANGE;
222+
224223
/* Number fractional ticks for given offset */
225224
if (fract_offset) {
226225
fract_part = DIV_ROUND_UP(tick_mult, RTC_FR_MAX_TICKS);

0 commit comments

Comments
 (0)