14
14
#include <zephyr/kernel.h>
15
15
#include <zephyr/init.h>
16
16
#include <zephyr/devicetree.h>
17
+ #include <zephyr/spinlock.h>
17
18
#include <zephyr/drivers/rtc.h>
18
19
#include <zephyr/drivers/clock_control/stm32_clock_control.h>
19
20
#include <zephyr/drivers/clock_control.h>
@@ -132,7 +133,7 @@ struct rtc_stm32_alrm {
132
133
#endif /* STM32_RTC_ALARM_ENABLED */
133
134
134
135
struct rtc_stm32_data {
135
- struct k_mutex lock ;
136
+ struct k_spinlock lock ;
136
137
#ifdef STM32_RTC_ALARM_ENABLED
137
138
struct rtc_stm32_alrm rtc_alrm_a ;
138
139
struct rtc_stm32_alrm rtc_alrm_b ;
@@ -335,7 +336,7 @@ static int rtc_stm32_init(const struct device *dev)
335
336
{
336
337
const struct device * const clk = DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE );
337
338
const struct rtc_stm32_config * cfg = dev -> config ;
338
- struct rtc_stm32_data * data = dev -> data ;
339
+ __maybe_unused struct rtc_stm32_data * data = dev -> data ;
339
340
340
341
int err = 0 ;
341
342
@@ -380,8 +381,6 @@ static int rtc_stm32_init(const struct device *dev)
380
381
}
381
382
#endif /* CONFIG_SOC_SERIES_STM32WB0X */
382
383
383
- k_mutex_init (& data -> lock );
384
-
385
384
/* Enable Backup access */
386
385
#if RTC_STM32_BACKUP_DOMAIN_WRITE_PROTECTION
387
386
LL_PWR_EnableBkUpAccess ();
@@ -426,11 +425,11 @@ static int rtc_stm32_init(const struct device *dev)
426
425
427
426
ll_func_exti_enable_rtc_alarm_it (RTC_STM32_EXTI_LINE );
428
427
429
- k_mutex_lock (& data -> lock , K_FOREVER );
430
- memset (& (data -> rtc_alrm_a ), 0 , sizeof (struct rtc_stm32_alrm ));
431
- memset (& (data -> rtc_alrm_b ), 0 , sizeof (struct rtc_stm32_alrm ));
432
- k_mutex_unlock ( & data -> lock );
433
- #endif /* STM32_RTC_ALARM_ENABLED */
428
+ K_SPINLOCK (& data -> lock ) {
429
+ memset (& (data -> rtc_alrm_a ), 0 , sizeof (struct rtc_stm32_alrm ));
430
+ memset (& (data -> rtc_alrm_b ), 0 , sizeof (struct rtc_stm32_alrm ));
431
+ }
432
+ #endif /* CONFIG_RTC_ALARM */
434
433
435
434
return err ;
436
435
}
@@ -453,10 +452,7 @@ static int rtc_stm32_set_time(const struct device *dev, const struct rtc_time *t
453
452
return - EINVAL ;
454
453
}
455
454
456
- err = k_mutex_lock (& data -> lock , K_NO_WAIT );
457
- if (err ) {
458
- return err ;
459
- }
455
+ k_spinlock_key_t key = k_spin_lock (& data -> lock );
460
456
461
457
LOG_DBG ("Setting clock" );
462
458
@@ -494,7 +490,7 @@ static int rtc_stm32_set_time(const struct device *dev, const struct rtc_time *t
494
490
}
495
491
#endif /* CONFIG_SOC_SERIES_STM32F2X */
496
492
497
- k_mutex_unlock (& data -> lock );
493
+ k_spin_unlock (& data -> lock , key );
498
494
499
495
LOG_DBG ("Calendar set : %d/%d/%d - %dh%dm%ds" ,
500
496
LL_RTC_DATE_GetDay (RTC ),
@@ -524,18 +520,14 @@ static int rtc_stm32_get_time(const struct device *dev, struct rtc_time *timeptr
524
520
return - EINVAL ;
525
521
}
526
522
527
- int err = k_mutex_lock (& data -> lock , K_NO_WAIT );
528
-
529
- if (err ) {
530
- return err ;
531
- }
523
+ k_spinlock_key_t key = k_spin_lock (& data -> lock );
532
524
533
525
if (!LL_RTC_IsActiveFlag_INITS (RTC )) {
534
526
/* INITS flag is set when the calendar has been initialiazed. This flag is
535
527
* reset only on backup domain reset, so it can be read after a system
536
528
* reset to check if the calendar has been initialized.
537
529
*/
538
- k_mutex_unlock (& data -> lock );
530
+ k_spin_unlock (& data -> lock , key );
539
531
return - ENODATA ;
540
532
}
541
533
@@ -555,7 +547,7 @@ static int rtc_stm32_get_time(const struct device *dev, struct rtc_time *timeptr
555
547
} while (rtc_time != LL_RTC_TIME_Get (RTC ));
556
548
} while (rtc_date != LL_RTC_DATE_Get (RTC ));
557
549
558
- k_mutex_unlock (& data -> lock );
550
+ k_spin_unlock (& data -> lock , key );
559
551
560
552
/* tm_year is the value since 1900 and Rtc year is from 2000 */
561
553
timeptr -> tm_year = bcd2bin (__LL_RTC_GET_YEAR (rtc_date )) + (RTC_YEAR_REF - TM_YEAR_REF );
@@ -757,7 +749,7 @@ static int rtc_stm32_alarm_get_time(const struct device *dev, uint16_t id, uint1
757
749
return - EINVAL ;
758
750
}
759
751
760
- k_mutex_lock (& data -> lock , K_FOREVER );
752
+ k_spinlock_key_t key = k_spin_lock (& data -> lock );
761
753
762
754
if (id == RTC_STM32_ALRM_A ) {
763
755
p_rtc_alrm = & (data -> rtc_alrm_a );
@@ -785,7 +777,7 @@ static int rtc_stm32_alarm_get_time(const struct device *dev, uint16_t id, uint1
785
777
timeptr -> tm_min , timeptr -> tm_sec , * mask );
786
778
787
779
unlock :
788
- k_mutex_unlock (& data -> lock );
780
+ k_spin_unlock (& data -> lock , key );
789
781
790
782
return err ;
791
783
}
@@ -799,7 +791,7 @@ static int rtc_stm32_alarm_set_time(const struct device *dev, uint16_t id, uint1
799
791
LL_RTC_TimeTypeDef * p_ll_rtc_alrm_time ;
800
792
int err = 0 ;
801
793
802
- k_mutex_lock (& data -> lock , K_FOREVER );
794
+ k_spinlock_key_t key = k_spin_lock (& data -> lock );
803
795
804
796
if (id == RTC_STM32_ALRM_A ) {
805
797
p_rtc_alrm = & (data -> rtc_alrm_a );
@@ -918,7 +910,7 @@ static int rtc_stm32_alarm_set_time(const struct device *dev, uint16_t id, uint1
918
910
#endif /* RTC_STM32_BACKUP_DOMAIN_WRITE_PROTECTION */
919
911
920
912
unlock :
921
- k_mutex_unlock (& data -> lock );
913
+ k_spin_unlock (& data -> lock , key );
922
914
923
915
if (id == RTC_STM32_ALRM_A ) {
924
916
LOG_DBG ("Alarm A : %dh%dm%ds mask = 0x%x" ,
@@ -946,7 +938,7 @@ static int rtc_stm32_alarm_set_callback(const struct device *dev, uint16_t id,
946
938
struct rtc_stm32_alrm * p_rtc_alrm ;
947
939
int err = 0 ;
948
940
949
- k_mutex_lock (& data -> lock , K_FOREVER );
941
+ k_spinlock_key_t key = k_spin_lock (& data -> lock );
950
942
951
943
if (id == RTC_STM32_ALRM_A ) {
952
944
p_rtc_alrm = & (data -> rtc_alrm_a );
@@ -963,7 +955,7 @@ static int rtc_stm32_alarm_set_callback(const struct device *dev, uint16_t id,
963
955
p_rtc_alrm -> user_data = user_data ;
964
956
965
957
unlock :
966
- k_mutex_unlock (& data -> lock );
958
+ k_spin_unlock (& data -> lock , key );
967
959
968
960
return err ;
969
961
}
@@ -974,7 +966,7 @@ static int rtc_stm32_alarm_is_pending(const struct device *dev, uint16_t id)
974
966
struct rtc_stm32_alrm * p_rtc_alrm ;
975
967
int ret = 0 ;
976
968
977
- k_mutex_lock (& data -> lock , K_FOREVER );
969
+ k_spinlock_key_t key = k_spin_lock (& data -> lock );
978
970
979
971
if (id == RTC_STM32_ALRM_A ) {
980
972
p_rtc_alrm = & (data -> rtc_alrm_a );
@@ -992,7 +984,7 @@ static int rtc_stm32_alarm_is_pending(const struct device *dev, uint16_t id)
992
984
__enable_irq ();
993
985
994
986
unlock :
995
- k_mutex_unlock (& data -> lock );
987
+ k_spin_unlock (& data -> lock , key );
996
988
return ret ;
997
989
}
998
990
#endif /* STM32_RTC_ALARM_ENABLED */
0 commit comments