Commit 22543831 authored by Tomas Melin's avatar Tomas Melin Committed by Alexandre Belloni
Browse files

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: default avatarHarini T <harini.t@amd.com>
Tested-by: default avatarHarini T <harini.t@amd.com>
Signed-off-by: default avatarTomas Melin <tomas.melin@vaisala.com>
Acked-by: default avatarMichal Simek <michal.simek@amd.com>
Link: https://patch.msgid.link/20260122-zynqmp-rtc-updates-v4-5-d4edb966b499@vaisala.com


Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent 9f5af702
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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);