arch/xtensa/esp32s2: switch from semaphore to mutex for exclusive access

Signed-off-by: Petro Karashchenko <petro.karashchenko@gmail.com>
This commit is contained in:
Petro Karashchenko 2023-01-25 23:00:34 +02:00 committed by Xiang Xiao
parent c415ce518f
commit c4cf1eeb2b

View File

@ -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;
}