You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/01/26 02:24:16 UTC
[nuttx] 05/05: arch/xtensa/esp32s2: switch from semaphore to mutex for exclusive access
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit c4cf1eeb2b16c471e41b2fa65e34ae06d9ec5fa9
Author: Petro Karashchenko <pe...@gmail.com>
AuthorDate: Wed Jan 25 23:00:34 2023 +0200
arch/xtensa/esp32s2: switch from semaphore to mutex for exclusive access
Signed-off-by: Petro Karashchenko <pe...@gmail.com>
---
arch/xtensa/src/esp32s2/esp32s2_spi.c | 47 ++++++++++++-----------------------
1 file changed, 16 insertions(+), 31 deletions(-)
diff --git a/arch/xtensa/src/esp32s2/esp32s2_spi.c b/arch/xtensa/src/esp32s2/esp32s2_spi.c
index 990d91bf4d..36c823a9a3 100644
--- a/arch/xtensa/src/esp32s2/esp32s2_spi.c
+++ b/arch/xtensa/src/esp32s2/esp32s2_spi.c
@@ -38,7 +38,7 @@
#include <nuttx/arch.h>
#include <nuttx/irq.h>
#include <nuttx/clock.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
#include <nuttx/spinlock.h>
#include <nuttx/spi/spi.h>
@@ -150,7 +150,7 @@ struct esp32s2_spi_priv_s
const struct esp32s2_spi_config_s *config;
int refs; /* Reference count */
- sem_t exclsem; /* Held while chip is selected for mutual exclusion */
+ mutex_t lock; /* Held while chip is selected for mutual exclusion */
#if defined(CONFIG_ESP32S2_SPI2_DMA) || defined(CONFIG_ESP32S2_SPI3_DMA)
sem_t sem_isr; /* Interrupt wait semaphore */
int cpuint; /* SPI interrupt ID */
@@ -356,7 +356,7 @@ static struct esp32s2_spi_priv_s esp32s2_spi2_priv =
},
.config = &esp32s2_spi2_config,
.refs = 0,
- .exclsem = SEM_INITIALIZER(0),
+ .lock = NXMUTEX_INITIALIZER,
#ifdef CONFIG_ESP32S2_SPI2_DMA
.sem_isr = SEM_INITIALIZER(0),
.cpuint = -ENOMEM,
@@ -441,7 +441,7 @@ static struct esp32s2_spi_priv_s esp32s2_spi3_priv =
},
.config = &esp32s2_spi3_config,
.refs = 0,
- .exclsem = SEM_INITIALIZER(0),
+ .lock = NXMUTEX_INITIALIZER,
#ifdef CONFIG_ESP32S2_SPI3_DMA
.sem_isr = SEM_INITIALIZER(0),
.cpuint = -ENOMEM,
@@ -563,11 +563,11 @@ static int esp32s2_spi_lock(struct spi_dev_s *dev, bool lock)
if (lock)
{
- ret = nxsem_wait_uninterruptible(&priv->exclsem);
+ ret = nxmutex_lock(&priv->lock);
}
else
{
- ret = nxsem_post(&priv->exclsem);
+ ret = nxmutex_unlock(&priv->lock);
}
return ret;
@@ -895,7 +895,7 @@ static int esp32s2_spi_hwfeatures(struct spi_dev_s *dev,
* uint16_t's
*
* Returned Value:
- * None
+ * None.
*
****************************************************************************/
@@ -1365,10 +1365,6 @@ static void esp32s2_spi_init(struct spi_dev_s *dev)
const uint32_t id = config->id;
uint32_t regval;
- /* Initialize the SPI semaphore that enforces mutually exclusive access */
-
- nxsem_init(&priv->exclsem, 0, 1);
-
esp32s2_gpiowrite(config->cs_pin, true);
esp32s2_gpiowrite(config->mosi_pin, true);
esp32s2_gpiowrite(config->miso_pin, true);
@@ -1519,7 +1515,6 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
{
struct spi_dev_s *spi_dev;
struct esp32s2_spi_priv_s *priv;
- irqstate_t flags;
switch (port)
{
@@ -1539,12 +1534,11 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
spi_dev = (struct spi_dev_s *)priv;
- flags = enter_critical_section();
-
+ nxmutex_lock(&priv->lock);
if (priv->refs != 0)
{
- leave_critical_section(flags);
-
+ priv->refs++;
+ nxmutex_unlock(&priv->lock);
return spi_dev;
}
@@ -1571,8 +1565,7 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
{
/* Failed to allocate a CPU interrupt of this type. */
- leave_critical_section(flags);
-
+ nxmutex_unlock(&priv->lock);
return NULL;
}
@@ -1584,7 +1577,7 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
esp32s2_teardown_irq(priv->config->periph, priv->cpuint);
priv->cpuint = -ENOMEM;
- leave_critical_section(flags);
+ nxmutex_unlock(&priv->lock);
return NULL;
}
@@ -1595,11 +1588,9 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
#endif
esp32s2_spi_init(spi_dev);
-
priv->refs++;
- leave_critical_section(flags);
-
+ nxmutex_unlock(&priv->lock);
return spi_dev;
}
@@ -1619,7 +1610,6 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
int esp32s2_spibus_uninitialize(struct spi_dev_s *dev)
{
- irqstate_t flags;
struct esp32s2_spi_priv_s *priv = (struct esp32s2_spi_priv_s *)dev;
DEBUGASSERT(dev);
@@ -1629,16 +1619,13 @@ int esp32s2_spibus_uninitialize(struct spi_dev_s *dev)
return ERROR;
}
- flags = enter_critical_section();
-
+ nxmutex_lock(&priv->lock);
if (--priv->refs != 0)
{
- leave_critical_section(flags);
+ nxmutex_unlock(&priv->lock);
return OK;
}
- leave_critical_section(flags);
-
#if defined(CONFIG_ESP32S2_SPI2_DMA) || defined(CONFIG_ESP32S2_SPI3_DMA)
up_disable_irq(priv->config->irq);
esp32s2_teardown_irq(priv->config->periph, priv->cpuint);
@@ -1646,12 +1633,10 @@ int esp32s2_spibus_uninitialize(struct spi_dev_s *dev)
priv->cpuint = -ENOMEM;
- nxsem_destroy(&priv->sem_isr);
#endif
esp32s2_spi_deinit(dev);
-
- nxsem_destroy(&priv->exclsem);
+ nxmutex_unlock(&priv->lock);
return OK;
}