From fb8d0d8658c7dd85ded3e8978439f8aa84b23c8d Mon Sep 17 00:00:00 2001 From: Juergen Fitschen Date: Wed, 16 Nov 2022 11:38:55 +0100 Subject: [PATCH] sam0/rtc_rtt: don't block until set_alarm has been propagated to periph rtc_set_alarm() / rtt_set_alarm() are heavily used by ztimer during ISR. This will reduce time spent during ISR drastically. We trust that the peripheral is able to propagate the alarm asynchronously. --- cpu/sam0_common/periph/rtc_rtt.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/cpu/sam0_common/periph/rtc_rtt.c b/cpu/sam0_common/periph/rtc_rtt.c index fa1e375598df3..71ac60829dfa9 100644 --- a/cpu/sam0_common/periph/rtc_rtt.c +++ b/cpu/sam0_common/periph/rtc_rtt.c @@ -612,18 +612,18 @@ int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg) (time->tm_year > (reference_year + 63))) { return -2; } - else { - RTC->MODE2.Mode2Alarm[0].ALARM.reg = RTC_MODE2_ALARM_YEAR(time->tm_year - reference_year) - | RTC_MODE2_ALARM_MONTH(time->tm_mon + 1) - | RTC_MODE2_ALARM_DAY(time->tm_mday) - | RTC_MODE2_ALARM_HOUR(time->tm_hour) - | RTC_MODE2_ALARM_MINUTE(time->tm_min) - | RTC_MODE2_ALARM_SECOND(time->tm_sec); - RTC->MODE2.Mode2Alarm[0].MASK.reg = RTC_MODE2_MASK_SEL(6); - } + /* make sure that preceding changes have been applied */ _wait_syncbusy(); + RTC->MODE2.Mode2Alarm[0].ALARM.reg = RTC_MODE2_ALARM_YEAR(time->tm_year - reference_year) + | RTC_MODE2_ALARM_MONTH(time->tm_mon + 1) + | RTC_MODE2_ALARM_DAY(time->tm_mday) + | RTC_MODE2_ALARM_HOUR(time->tm_hour) + | RTC_MODE2_ALARM_MINUTE(time->tm_min) + | RTC_MODE2_ALARM_SECOND(time->tm_sec); + RTC->MODE2.Mode2Alarm[0].MASK.reg = RTC_MODE2_MASK_SEL(6); + /* Enable IRQ */ alarm_cb.cb = cb; alarm_cb.arg = arg; @@ -734,13 +734,15 @@ void rtt_set_alarm(uint32_t alarm, rtt_cb_t cb, void *arg) /* disable interrupt to avoid race */ _rtt_clear_alarm(); + /* make sure that preceding changes have been applied */ + _wait_syncbusy(); + /* setup callback */ alarm_cb.cb = cb; alarm_cb.arg = arg; /* set COMP register */ RTC->MODE0.COMP[0].reg = alarm; - _wait_syncbusy(); /* enable compare interrupt and clear flag */ RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0;