diff options
author | Philip Chen <philipchen@google.com> | 2018-04-11 16:03:05 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-04-24 00:30:02 -0700 |
commit | ad06fa1e11365302fd9a17f7a137a760b315720a (patch) | |
tree | dfa8597a9c530886d556dabdb08ff09d79232534 /chip | |
parent | c4778cb4c467fecc4ab4c821197285de5842579e (diff) | |
download | chrome-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.c | 29 |
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; |