diff --git a/arch/xtensa/src/esp32/esp32_spi.c b/arch/xtensa/src/esp32/esp32_spi.c index 9a73b7777c..593c996670 100644 --- a/arch/xtensa/src/esp32/esp32_spi.c +++ b/arch/xtensa/src/esp32/esp32_spi.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -162,6 +163,8 @@ struct esp32_spi_priv_s /* Actual SPI send/receive bits once transmission */ uint8_t nbits; + + spinlock_t lock; /* Device specific lock. */ }; /**************************************************************************** @@ -1451,13 +1454,13 @@ struct spi_dev_s *esp32_spibus_initialize(int port) return NULL; } - spi_dev = (struct spi_dev_s *)priv; + flags = spin_lock_irqsave(&priv->lock); - flags = enter_critical_section(); + spi_dev = (struct spi_dev_s *)priv; if ((volatile int)priv->refs != 0) { - leave_critical_section(flags); + spin_unlock_irqrestore(&priv->lock, flags); return spi_dev; } @@ -1471,7 +1474,7 @@ struct spi_dev_s *esp32_spibus_initialize(int port) 1, ESP32_CPUINT_LEVEL); if (priv->cpuint < 0) { - leave_critical_section(flags); + spin_unlock_irqrestore(&priv->lock, flags); return NULL; } @@ -1481,7 +1484,7 @@ struct spi_dev_s *esp32_spibus_initialize(int port) esp32_teardown_irq(priv->cpu, priv->config->periph, priv->cpuint); - leave_critical_section(flags); + spin_unlock_irqrestore(&priv->lock, flags); return NULL; } @@ -1492,7 +1495,7 @@ struct spi_dev_s *esp32_spibus_initialize(int port) priv->refs++; - leave_critical_section(flags); + spin_unlock_irqrestore(&priv->lock, flags); return spi_dev; } @@ -1517,15 +1520,15 @@ int esp32_spibus_uninitialize(struct spi_dev_s *dev) return ERROR; } - flags = enter_critical_section(); + flags = spin_lock_irqsave(&priv->lock); if (--priv->refs != 0) { - leave_critical_section(flags); + spin_unlock_irqrestore(&priv->lock, flags); return OK; } - leave_critical_section(flags); + spin_unlock_irqrestore(&priv->lock, flags); if (priv->config->use_dma) {