Skip to content

Commit e0d2190

Browse files
committed
ACPI: TAD: RTC: Refine timer value computations and checks
Since rtc_tm_to_ktime() may overflow for large RTC time values and full second granularity is sufficient in timer value computations in acpi_tad_rtc_set_alarm() and acpi_tad_rtc_read_alarm(), use rtc_tm_to_time64() instead of that function, which also allows the computations to be simplified. Moreover, U32_MAX is a special "timer disabled" value, so make acpi_tad_rtc_set_alarm() reject it when attempting to program the alarm timers. Fixes: 7572dca ("ACPI: TAD: Add alarm support to the RTC class device interface") Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Link: https://patch.msgid.link/3414608.aeNJFYEL58@rafael.j.wysocki
1 parent 77dd14a commit e0d2190

1 file changed

Lines changed: 3 additions & 5 deletions

File tree

drivers/acpi/acpi_tad.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -680,9 +680,8 @@ static int acpi_tad_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *t)
680680

681681
acpi_tad_rt_to_tm(&rt, &tm_now);
682682

683-
value = ktime_divns(ktime_sub(rtc_tm_to_ktime(t->time),
684-
rtc_tm_to_ktime(tm_now)), NSEC_PER_SEC);
685-
if (value <= 0 || value > U32_MAX)
683+
value = rtc_tm_to_time64(&t->time) - rtc_tm_to_time64(&tm_now);
684+
if (value <= 0 || value >= U32_MAX)
686685
return -EINVAL;
687686
}
688687

@@ -745,8 +744,7 @@ static int acpi_tad_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *t)
745744

746745
if (retval != ACPI_TAD_WAKE_DISABLED) {
747746
t->enabled = 1;
748-
t->time = rtc_ktime_to_tm(ktime_add_ns(rtc_tm_to_ktime(tm_now),
749-
(u64)retval * NSEC_PER_SEC));
747+
rtc_time64_to_tm(rtc_tm_to_time64(&tm_now) + retval, &t->time);
750748
} else {
751749
t->enabled = 0;
752750
t->time = tm_now;

0 commit comments

Comments
 (0)