@@ -102,6 +102,8 @@ struct esp_rtc_lowerhalf_s
102
102
103
103
struct alm_cbinfo_s alarmcb [CONFIG_RTC_NALARMS ];
104
104
#endif /* CONFIG_RTC_ALARM */
105
+
106
+ spinlock_t lock ;
105
107
};
106
108
107
109
#endif /* CONFIG_RTC_DRIVER */
@@ -420,13 +422,12 @@ static bool esp_rtc_havesettime(struct rtc_lowerhalf_s *lower)
420
422
****************************************************************************/
421
423
422
424
#if defined(CONFIG_RTC_DRIVER ) && defined(CONFIG_RTC_ALARM )
423
- static int esp_rtc_setalarm (struct rtc_lowerhalf_s * lower ,
424
- const struct lower_setalarm_s * alarminfo )
425
+ static int esp_rtc_setalarm_nolock (struct rtc_lowerhalf_s * lower ,
426
+ const struct lower_setalarm_s * alarminfo )
425
427
{
426
428
struct esp_rtc_lowerhalf_s * priv = (struct esp_rtc_lowerhalf_s * )lower ;
427
429
struct alm_cbinfo_s * cbinfo ;
428
430
uint64_t timeout ;
429
- irqstate_t flags ;
430
431
int id ;
431
432
432
433
DEBUGASSERT (priv != NULL );
@@ -446,8 +447,6 @@ static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
446
447
447
448
/* Create the RT-Timer alarm */
448
449
449
- flags = spin_lock_irqsave (NULL );
450
-
451
450
if (cbinfo -> alarm_hdl == NULL )
452
451
{
453
452
struct esp_hr_timer_args_s hr_timer_args ;
@@ -461,7 +460,6 @@ static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
461
460
if (ret < 0 )
462
461
{
463
462
rtcerr ("Failed to create HR Timer=%d\n" , ret );
464
- spin_unlock_irqrestore (NULL , flags );
465
463
return ret ;
466
464
}
467
465
}
@@ -474,10 +472,22 @@ static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
474
472
475
473
esp_hr_timer_start (cbinfo -> alarm_hdl , cbinfo -> deadline_us , false);
476
474
477
- spin_unlock_irqrestore (NULL , flags );
478
-
479
475
return OK ;
480
476
}
477
+
478
+ static int esp_rtc_setalarm (struct rtc_lowerhalf_s * lower ,
479
+ const struct lower_setalarm_s * alarminfo )
480
+ {
481
+ struct esp_rtc_lowerhalf_s * priv = (struct esp_rtc_lowerhalf_s * )lower ;
482
+ irqstate_t flags ;
483
+ int ret ;
484
+
485
+ flags = spin_lock_irqsave (& priv -> lock );
486
+ ret = esp_rtc_setalarm_nolock (lower , alarminfo );
487
+ spin_unlock_irqrestore (& priv -> lock , flags );
488
+
489
+ return ret ;
490
+ }
481
491
#endif /* CONFIG_RTC_DRIVER && CONFIG_RTC_ALARM */
482
492
483
493
/****************************************************************************
@@ -501,6 +511,7 @@ static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
501
511
static int esp_rtc_setrelative (struct rtc_lowerhalf_s * lower ,
502
512
const struct lower_setrelative_s * alarminfo )
503
513
{
514
+ struct esp_rtc_lowerhalf_s * priv = (struct esp_rtc_lowerhalf_s * )lower ;
504
515
struct lower_setalarm_s setalarm ;
505
516
time_t seconds ;
506
517
int ret = - EINVAL ;
@@ -510,7 +521,7 @@ static int esp_rtc_setrelative(struct rtc_lowerhalf_s *lower,
510
521
511
522
if (alarminfo -> reltime > 0 )
512
523
{
513
- flags = spin_lock_irqsave (NULL );
524
+ flags = spin_lock_irqsave (& priv -> lock );
514
525
515
526
seconds = alarminfo -> reltime ;
516
527
gmtime_r (& seconds , (struct tm * )& setalarm .time );
@@ -520,9 +531,9 @@ static int esp_rtc_setrelative(struct rtc_lowerhalf_s *lower,
520
531
setalarm .id = alarminfo -> id ;
521
532
setalarm .cb = alarminfo -> cb ;
522
533
setalarm .priv = alarminfo -> priv ;
523
- ret = esp_rtc_setalarm (lower , & setalarm );
534
+ ret = esp_rtc_setalarm_nolock (lower , & setalarm );
524
535
525
- spin_unlock_irqrestore (NULL , flags );
536
+ spin_unlock_irqrestore (& priv -> lock , flags );
526
537
}
527
538
528
539
return ret ;
@@ -566,7 +577,7 @@ static int esp_rtc_cancelalarm(struct rtc_lowerhalf_s *lower, int alarmid)
566
577
return - ENODATA ;
567
578
}
568
579
569
- flags = spin_lock_irqsave (NULL );
580
+ flags = spin_lock_irqsave (& priv -> lock );
570
581
571
582
/* Stop and delete the alarm */
572
583
@@ -579,7 +590,7 @@ static int esp_rtc_cancelalarm(struct rtc_lowerhalf_s *lower, int alarmid)
579
590
cbinfo -> deadline_us = 0 ;
580
591
cbinfo -> alarm_hdl = NULL ;
581
592
582
- spin_unlock_irqrestore (NULL , flags );
593
+ spin_unlock_irqrestore (& priv -> lock , flags );
583
594
584
595
return OK ;
585
596
}
@@ -616,7 +627,7 @@ static int esp_rtc_rdalarm(struct rtc_lowerhalf_s *lower,
616
627
617
628
priv = (struct esp_rtc_lowerhalf_s * )lower ;
618
629
619
- flags = spin_lock_irqsave (NULL );
630
+ flags = spin_lock_irqsave (& priv -> lock );
620
631
621
632
/* Get the alarm according to the alarm ID */
622
633
@@ -630,7 +641,7 @@ static int esp_rtc_rdalarm(struct rtc_lowerhalf_s *lower,
630
641
localtime_r ((const time_t * )& ts .tv_sec ,
631
642
(struct tm * )alarminfo -> time );
632
643
633
- spin_unlock_irqrestore (NULL , flags );
644
+ spin_unlock_irqrestore (& priv -> lock , flags );
634
645
635
646
return OK ;
636
647
}
@@ -664,7 +675,7 @@ time_t up_rtc_time(void)
664
675
uint64_t time_us ;
665
676
irqstate_t flags ;
666
677
667
- flags = spin_lock_irqsave (NULL );
678
+ flags = spin_lock_irqsave (& g_rtc_lowerhalf . lock );
668
679
669
680
#ifdef CONFIG_RTC_DRIVER
670
681
/* NOTE: HR-Timer starts to work after the board is initialized, and the
@@ -694,7 +705,7 @@ time_t up_rtc_time(void)
694
705
time_us = esp_rtc_get_time_us () + esp_rtc_get_boot_time ();
695
706
}
696
707
697
- spin_unlock_irqrestore (NULL , flags );
708
+ spin_unlock_irqrestore (& g_rtc_lowerhalf . lock , flags );
698
709
699
710
return (time_t )(time_us / USEC_PER_SEC );
700
711
}
@@ -723,7 +734,7 @@ int up_rtc_gettime(struct timespec *tp)
723
734
irqstate_t flags ;
724
735
uint64_t time_us ;
725
736
726
- flags = spin_lock_irqsave (NULL );
737
+ flags = spin_lock_irqsave (& g_rtc_lowerhalf . lock );
727
738
728
739
#ifdef CONFIG_RTC_DRIVER
729
740
if (g_hr_timer_enabled )
@@ -740,7 +751,7 @@ int up_rtc_gettime(struct timespec *tp)
740
751
tp -> tv_sec = time_us / USEC_PER_SEC ;
741
752
tp -> tv_nsec = (time_us % USEC_PER_SEC ) * NSEC_PER_USEC ;
742
753
743
- spin_unlock_irqrestore (NULL , flags );
754
+ spin_unlock_irqrestore (& g_rtc_lowerhalf . lock , flags );
744
755
745
756
return OK ;
746
757
}
@@ -770,7 +781,7 @@ int up_rtc_settime(const struct timespec *ts)
770
781
771
782
DEBUGASSERT (ts != NULL && ts -> tv_nsec < NSEC_PER_SEC );
772
783
773
- flags = spin_lock_irqsave (NULL );
784
+ flags = spin_lock_irqsave (& g_rtc_lowerhalf . lock );
774
785
775
786
now_us = ((uint64_t ) ts -> tv_sec ) * USEC_PER_SEC +
776
787
ts -> tv_nsec / NSEC_PER_USEC ;
@@ -794,7 +805,7 @@ int up_rtc_settime(const struct timespec *ts)
794
805
795
806
esp_rtc_set_boot_time (rtc_offset_us );
796
807
797
- spin_unlock_irqrestore (NULL , flags );
808
+ spin_unlock_irqrestore (& g_rtc_lowerhalf . lock , flags );
798
809
799
810
return OK ;
800
811
}
@@ -873,6 +884,7 @@ int esp_rtc_driverinit(void)
873
884
return ret ;
874
885
}
875
886
887
+ spin_lock_init (& g_rtc_lowerhalf .lock );
876
888
g_hr_timer_enabled = true;
877
889
878
890
/* Get the time difference between HR Timer and RTC */
0 commit comments