From 25d5dcf7ef12d85c65ec05250a880b0f7a4bef0d Mon Sep 17 00:00:00 2001 From: hujun5 Date: Tue, 17 Dec 2024 11:35:26 +0800 Subject: [PATCH] lc823450_rtc: use small lock in arch/arm/src/lc823450/lc823450_rtc.c reason: We would like to replace the big lock with a small lock. Signed-off-by: hujun5 --- arch/arm/src/lc823450/lc823450_rtc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/arch/arm/src/lc823450/lc823450_rtc.c b/arch/arm/src/lc823450/lc823450_rtc.c index f1cf931ff0..4e0a50b869 100644 --- a/arch/arm/src/lc823450/lc823450_rtc.c +++ b/arch/arm/src/lc823450/lc823450_rtc.c @@ -28,6 +28,7 @@ #include #include +#include #include #ifdef CONFIG_RTC_ALARM @@ -136,6 +137,7 @@ static void rtc_pmnotify(struct pm_callback_s *cb, enum pm_state_e pmstate); #ifdef CONFIG_RTC_ALARM static alarmcb_t g_alarmcb; +static spinlock_t g_alarmcb_lock = SP_UNLOCKED; #endif #ifdef CONFIG_RTC_SAVE_DEFAULT @@ -581,6 +583,7 @@ int up_rtc_settime(const struct timespec *ts) #ifdef CONFIG_RTC_ALARM int up_rtc_setalarm(const struct timespec *ts, alarmcb_t callback) { + irqstate_t flags; struct tm *tp; if (g_alarmcb) @@ -589,9 +592,12 @@ int up_rtc_setalarm(const struct timespec *ts, alarmcb_t callback) } tp = gmtime(&ts->tv_sec); + #ifdef CONFIG_RTC_DIV tm_divider(tp, CONFIG_RTC_DIV_M, CONFIG_RTC_DIV_N); #endif /* CONFIG_RTC_DIV */ + + flags = spin_lock_irqsave(&g_alarmcb_lock); g_alarmcb = callback; #if 0 llinfo("SETALARM (%04d/%02d/%02d %02d:%02d:%02d)\n", @@ -623,6 +629,8 @@ int up_rtc_setalarm(const struct timespec *ts, alarmcb_t callback) modifyreg8(RTC_RTCINT, 1 << RTC_RTCINT_SET, 1 << RTC_RTCINT_AIE); + spin_unlock_irqrestore(&g_alarmcb_lock, flags); + return OK; } @@ -633,14 +641,14 @@ int up_rtc_setalarm(const struct timespec *ts, alarmcb_t callback) int up_rtc_cancelalarm(void) { irqstate_t flags; - flags = enter_critical_section(); + flags = spin_lock_irqsave(&g_alarmcb_lock); g_alarmcb = NULL; /* Disable IRQ */ putreg8(0, RTC_RTCINT); - leave_critical_section(flags); + spin_unlock_irqrestore(&g_alarmcb_lock, flags); return 0; }