Skip to content

Commit 48b1ae9

Browse files
committed
drivers:sdmmc_sdhc: add timeout to wait for ISR mutex unlock
1 parent be88208 commit 48b1ae9

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

drivers/sdmmc/sdmmc_sdhc.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,24 +79,29 @@
7979

8080
/* millisecond timer definitions dependent on active ztimer backend */
8181
#if IS_USED(MODULE_ZTIMER_MSEC)
82-
#define _ZTIMER_ACQUIRE() ztimer_acquire(ZTIMER_MSEC)
83-
#define _ZTIMER_RELEASE() ztimer_release(ZTIMER_MSEC)
84-
#define _ZTIMER_NOW() ztimer_now(ZTIMER_MSEC)
85-
#define _ZTIMER_SLEEP_MS(n) ztimer_sleep(ZTIMER_MSEC, n)
82+
#define _ZTIMER_CLOCK ZTIMER_MSEC
83+
#define _ZTIMER_TICKS_PER_MS 1
84+
8685
#elif IS_USED(MODULE_ZTIMER_USEC)
87-
#define _ZTIMER_ACQUIRE() ztimer_acquire(ZTIMER_USEC)
88-
#define _ZTIMER_RELEASE() ztimer_release(ZTIMER_USEC)
89-
#define _ZTIMER_NOW() ztimer_now(ZTIMER_USEC) / US_PER_MS
90-
#define _ZTIMER_SLEEP_MS(n) ztimer_sleep(ZTIMER_USEC, n * US_PER_MS)
86+
#define _ZTIMER_CLOCK ZTIMER_USEC
87+
#define _ZTIMER_TICKS_PER_MS US_PER_MS
9188
#else
9289
#error "Either module ztimer_msec or ztimer_usec is needed"
9390
#endif
9491

92+
#define _ZTIMER_ACQUIRE() ztimer_acquire(_ZTIMER_CLOCK)
93+
#define _ZTIMER_RELEASE() ztimer_release(_ZTIMER_CLOCK)
94+
#define _ZTIMER_NOW() (ztimer_now(_ZTIMER_CLOCK) / _ZTIMER_TICKS_PER_MS)
95+
#define _ZTIMER_SLEEP_MS(n) ztimer_sleep(_ZTIMER_CLOCK, n * _ZTIMER_TICKS_PER_MS)
96+
9597
/* Monitor card insertion and removal */
9698
#define SDHC_NISTR_CARD_DETECT (SDHC_NISTR_CREM | SDHC_NISTR_CINS)
9799
#define SDHC_NISTER_CARD_DETECT (SDHC_NISTER_CREM | SDHC_NISTER_CINS)
98100
#define SDHC_NISIER_CARD_DETECT (SDHC_NISIER_CREM | SDHC_NISIER_CINS)
99101

102+
/* 2s timeout for IRQ wait */
103+
#define SDHC_IRQ_TIMEOUT_MS (2000 * _ZTIMER_TICKS_PER_MS)
104+
100105
#include "board.h"
101106

102107
/* forward declaration of _driver */
@@ -743,17 +748,20 @@ static bool _wait_for_event(sdhc_dev_t *sdhc_dev,
743748
#if defined(CPU_SAMD5X) || defined(CPU_SAME5X)
744749
pm_block(SAM0_PM_IDLE);
745750
#endif
746-
mutex_lock(&sdhc_dev->irq_wait);
751+
bool timeout = ztimer_mutex_lock_timeout(_ZTIMER_CLOCK, &sdhc_dev->irq_wait, SDHC_IRQ_TIMEOUT_MS) < 0;
747752
#if defined(CPU_SAMD5X) || defined(CPU_SAME5X)
748753
pm_unblock(SAM0_PM_IDLE);
749754
#endif
750755

751756
sdhc->NISIER.reg &= ~event;
752757
sdhc->EISIER.reg &= ~error_mask;
753758

754-
if (sdhc_dev->error & error_mask) {
759+
if (timeout || (sdhc_dev->error & error_mask)) {
755760
if (IS_USED(ENABLE_DEBUG)) {
756761
DEBUG("[sdmmc] SDHC error: EISTR=%04x, ", sdhc_dev->error);
762+
if (timeout) {
763+
DEBUG("[sdmmc] IRQ wait timeout\n");
764+
}
757765
switch (reset) {
758766
case SDHC_SRR_SWRSTCMD:
759767
DEBUG("reset CMD\n");
@@ -832,7 +840,7 @@ static int _sdhc_to_sdmmc_err_code(uint16_t code)
832840
static void _isr(sdhc_dev_t *sdhc_dev)
833841
{
834842
sdhc_t *sdhc = sdhc_dev->conf->sdhc;
835-
843+
DEBUG_PUTS("[sdmmc] IRQ");
836844
if (sdhc->NISTR.reg & SDHC_NISTR_CARD_DETECT) {
837845
DEBUG_PUTS("[sdmmc] card presence changed");
838846

0 commit comments

Comments
 (0)