summaryrefslogtreecommitdiff
path: root/chip
diff options
context:
space:
mode:
authorPhilip Chen <philipchen@google.com>2018-04-11 16:03:05 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-04-24 00:30:02 -0700
commitad06fa1e11365302fd9a17f7a137a760b315720a (patch)
treedfa8597a9c530886d556dabdb08ff09d79232534 /chip
parentc4778cb4c467fecc4ab4c821197285de5842579e (diff)
downloadchrome-ec-ad06fa1e11365302fd9a17f7a137a760b315720a.tar.gz
chip/stm32/clock: Align to second for rtc alarm host command
BUG=b:74256016 BRANCH=scarlet CQ-DEPEND=CL:1025118 TEST=On scarlet, run 'date; powerd_dbus_suspend --wakeup_timeout=10; date', confirm alarm works and the sleep time is ~10 secs TEST='idlestat' when scarlet is in S3, confirm scarlet enters sleep mode and wakes up without missing wake deadline TEST=Run 'power_Resume' test on scarlet for 10 times and see consistent 'seconds_system_resume' Change-Id: I4b0cbc2a6b8a85047b682358aec374e8f05a4346 Signed-off-by: Philip Chen <philipchen@google.com> Reviewed-on: https://chromium-review.googlesource.com/1008838 Commit-Ready: Philip Chen <philipchen@chromium.org> Tested-by: Philip Chen <philipchen@chromium.org> Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
Diffstat (limited to 'chip')
-rw-r--r--chip/stm32/clock-f.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/chip/stm32/clock-f.c b/chip/stm32/clock-f.c
index e3fcc02a1d..4b94c1f655 100644
--- a/chip/stm32/clock-f.c
+++ b/chip/stm32/clock-f.c
@@ -187,9 +187,13 @@ void set_rtc_alarm(uint32_t delay_s, uint32_t delay_us,
/* Calculate alarm time */
alarm_sec = rtc_tr_to_sec(rtc->rtc_tr) + delay_s;
- alarm_us = rtcss_to_us(rtc->rtc_ssr) + delay_us;
- alarm_sec = alarm_sec + alarm_us / SECOND;
- alarm_us = alarm_us % SECOND;
+
+ if (delay_us) {
+ alarm_us = rtcss_to_us(rtc->rtc_ssr) + delay_us;
+ alarm_sec = alarm_sec + alarm_us / SECOND;
+ alarm_us = alarm_us % SECOND;
+ }
+
/*
* If seconds is greater than 1 day, subtract by 1 day to deal with
* 24-hour rollover.
@@ -197,12 +201,19 @@ void set_rtc_alarm(uint32_t delay_s, uint32_t delay_us,
if (alarm_sec >= SECS_PER_DAY)
alarm_sec -= SECS_PER_DAY;
- /* Set alarm time */
- STM32_RTC_ALRMAR = sec_to_rtc_tr(alarm_sec);
- STM32_RTC_ALRMASSR = us_to_rtcss(alarm_us);
- /* Check for match on hours, minutes, seconds, and subsecond */
- STM32_RTC_ALRMAR |= 0xc0000000;
- STM32_RTC_ALRMASSR |= 0x0f000000;
+ /*
+ * Set alarm time in seconds and check for match on
+ * hours, minutes, and seconds.
+ */
+ STM32_RTC_ALRMAR = sec_to_rtc_tr(alarm_sec) | 0xc0000000;
+
+ /*
+ * Set alarm time in subseconds and check for match on subseconds.
+ * If the caller doesn't specify subsecond delay (e.g. host command),
+ * just align the alarm time to second.
+ */
+ STM32_RTC_ALRMASSR = delay_us ?
+ (us_to_rtcss(alarm_us) | 0x0f000000) : 0;
/* Enable alarm and alarm interrupt */
STM32_EXTI_PR = EXTI_RTC_ALR_EVENT;