diff --git a/arch/arm/src/cxd56xx/cxd56_rtc.c b/arch/arm/src/cxd56xx/cxd56_rtc.c index db33c24c32edc..9f9ca9db10af6 100644 --- a/arch/arm/src/cxd56xx/cxd56_rtc.c +++ b/arch/arm/src/cxd56xx/cxd56_rtc.c @@ -399,8 +399,11 @@ time_t up_rtc_time(void) #ifdef CONFIG_RTC_HIRES int up_rtc_gettime(struct timespec *tp) { + irqstate_t flags; uint64_t count; + flags = enter_critical_section(); + count = cxd56_rtc_count(); count += g_rtc_save->offset; @@ -410,6 +413,8 @@ int up_rtc_gettime(struct timespec *tp) tp->tv_nsec = (count % CONFIG_RTC_FREQUENCY) * (NSEC_PER_SEC / CONFIG_RTC_FREQUENCY); + leave_critical_section(flags); + rtc_dumptime(tp, "Getting time"); return OK; diff --git a/arch/arm/src/efm32/efm32_rtc_burtc.c b/arch/arm/src/efm32/efm32_rtc_burtc.c index e1dc0a7165b1a..536d16fd315b6 100644 --- a/arch/arm/src/efm32/efm32_rtc_burtc.c +++ b/arch/arm/src/efm32/efm32_rtc_burtc.c @@ -421,8 +421,10 @@ time_t up_rtc_time(void) #ifdef CONFIG_RTC_HIRES int up_rtc_gettime(struct timespec *tp) { + irqstate_t flags; uint64_t val; + flags = enter_critical_section(); val = efm32_get_burtc_tick(); /* Then we can save the time in seconds and fractional seconds. */ @@ -431,6 +433,7 @@ int up_rtc_gettime(struct timespec *tp) tp->tv_nsec = (val % CONFIG_RTC_FREQUENCY) * (NSEC_PER_SEC / CONFIG_RTC_FREQUENCY); + leave_critical_section(flags); rtcinfo("Get RTC %u.%09u\n", tp->tv_sec, tp->tv_nsec); return OK; diff --git a/arch/arm/src/max326xx/max32660/max32660_rtc.c b/arch/arm/src/max326xx/max32660/max32660_rtc.c index db37e63430072..4dc770e30f4e9 100644 --- a/arch/arm/src/max326xx/max32660/max32660_rtc.c +++ b/arch/arm/src/max326xx/max32660/max32660_rtc.c @@ -403,11 +403,14 @@ time_t up_rtc_time(void) #ifdef CONFIG_RTC_HIRES int up_rtc_gettime(struct timespec *tp) { + irqstate_t flags; uint64_t tmp; uint32_t sec; uint32_t ssec; uint32_t verify; + flags = enter_critical_section(); + /* Read the time handling rollover to full seconds */ do @@ -424,6 +427,7 @@ int up_rtc_gettime(struct timespec *tp) tp->tv_sec = sec; tp->tv_nsec = (long)tmp; + leave_critical_section(flags); return OK; } diff --git a/arch/arm/src/sam34/sam_rtc.c b/arch/arm/src/sam34/sam_rtc.c index d6d60f0b1a8b7..9b39bf73083c7 100644 --- a/arch/arm/src/sam34/sam_rtc.c +++ b/arch/arm/src/sam34/sam_rtc.c @@ -759,11 +759,13 @@ int up_rtc_gettime(struct timespec *tp) { /* This is a hack to emulate a high resolution rtc using the rtt */ + irqstate_t flags; uint32_t rtc_cal; uint32_t rtc_tim; uint32_t rtt_val; struct tm t; + flags = enter_critical_section(); do { rtc_cal = getreg32(SAM_RTC_CALR); @@ -794,6 +796,7 @@ int up_rtc_gettime(struct timespec *tp) tp->tv_nsec = (((rtt_val - g_rtt_offset) & (CONFIG_RTC_FREQUENCY - 1)) * 1000000000ull) / CONFIG_RTC_FREQUENCY; + leave_critical_section(flags); return OK; } #endif diff --git a/arch/arm/src/stm32/stm32_eth.c b/arch/arm/src/stm32/stm32_eth.c index 4aa2c5d1f1398..7f976d95e8fdb 100644 --- a/arch/arm/src/stm32/stm32_eth.c +++ b/arch/arm/src/stm32/stm32_eth.c @@ -4308,7 +4308,10 @@ int up_rtc_initialize(void) int up_rtc_gettime(struct timespec *tp) { + irqstate_t flags; uint64_t timestamp; + + flags = enter_critical_section(); timestamp = stm32_eth_ptp_gettime(); if (timestamp == 0) @@ -4318,11 +4321,13 @@ int up_rtc_gettime(struct timespec *tp) */ DEBUGASSERT(!g_rtc_enabled); + leave_critical_section(flags); return -EBUSY; } ptp_to_timespec(timestamp, tp); clock_timespec_add(tp, &g_stm32_eth_ptp_basetime, tp); + leave_critical_section(flags); return OK; } diff --git a/arch/renesas/src/rx65n/rx65n_rtc.c b/arch/renesas/src/rx65n/rx65n_rtc.c index 5585fa3d60af6..05bfe07709eea 100644 --- a/arch/renesas/src/rx65n/rx65n_rtc.c +++ b/arch/renesas/src/rx65n/rx65n_rtc.c @@ -461,6 +461,7 @@ int up_rtc_initialize(void) #if defined(CONFIG_RTC_HIRES) int up_rtc_gettime(struct timespec *tp) { + irqstate_t flags; uint8_t weekcnt; uint8_t daycnt; uint8_t monthcnt; @@ -476,6 +477,8 @@ int up_rtc_gettime(struct timespec *tp) uint8_t regval; struct tm t; + flags = enter_critical_section(); + if (RTC.RCR2.BIT.START == 0) { RTC.RCR2.BIT.START = 1; @@ -541,6 +544,8 @@ int up_rtc_gettime(struct timespec *tp) UNUSED(hrcnt); UNUSED(mincnt); UNUSED(seccnt); + + leave_critical_section(flags); return OK; } #endif diff --git a/arch/x86_64/src/intel64/intel64_rtc.c b/arch/x86_64/src/intel64/intel64_rtc.c index 6ed1da0080c0e..45df5fa949589 100644 --- a/arch/x86_64/src/intel64/intel64_rtc.c +++ b/arch/x86_64/src/intel64/intel64_rtc.c @@ -140,11 +140,14 @@ int up_rtc_initialize(void) int up_rtc_gettime(struct timespec *tp) { + irqstate_t flags; uint64_t tmp; + flags = enter_critical_section(); tmp = rtc_read(); tp->tv_sec = (tmp / NS_PER_SEC); tp->tv_nsec = (tmp - (tp->tv_sec) * NS_PER_SEC); + leave_critical_section(flags); return OK; }