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 2022/11/04 16:37:10 UTC
[incubator-nuttx] 03/04: esp32/i2s: replace nxsem when used as a lock to nxmutex
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/incubator-nuttx.git
commit 20d8a551817260eaa11c9326fbfd763816acb364
Author: Tiago Medicci Serrano <ti...@espressif.com>
AuthorDate: Tue Oct 25 15:49:46 2022 -0300
esp32/i2s: replace nxsem when used as a lock to nxmutex
---
arch/xtensa/src/esp32/esp32_i2s.c | 59 ++++++++++++---------------------------
1 file changed, 18 insertions(+), 41 deletions(-)
diff --git a/arch/xtensa/src/esp32/esp32_i2s.c b/arch/xtensa/src/esp32/esp32_i2s.c
index 59ceea1a6a..7923e295b9 100644
--- a/arch/xtensa/src/esp32/esp32_i2s.c
+++ b/arch/xtensa/src/esp32/esp32_i2s.c
@@ -269,10 +269,10 @@ struct esp32_transport_s
struct esp32_i2s_s
{
struct i2s_dev_s dev; /* Externally visible I2S interface */
- sem_t exclsem; /* Assures mutually exclusive access */
+ mutex_t lock; /* Ensures mutually exclusive access */
int cpuint; /* I2S interrupt ID */
uint8_t cpu; /* CPU ID */
- spinlock_t lock; /* Device specific lock. */
+ spinlock_t slock; /* Device specific lock. */
/* Port configuration */
@@ -310,9 +310,6 @@ struct esp32_i2s_s
/* Semaphore helpers */
-static int i2s_exclsem_take(struct esp32_i2s_s *priv);
-#define i2s_exclsem_give(priv) nxsem_post(&priv->exclsem)
-
static int i2s_bufsem_take(struct esp32_i2s_s *priv);
#define i2s_bufsem_give(priv) nxsem_post(&priv->bufsem)
@@ -487,26 +484,6 @@ static struct esp32_i2s_s esp32_i2s1_priv =
* Private Functions
****************************************************************************/
-/****************************************************************************
- * Name: i2s_exclsem_take
- *
- * Description:
- * Take the exclusive access semaphore handling any exceptional conditions
- *
- * Input Parameters:
- * priv - A reference to the i2s peripheral state
- *
- * Returned Value:
- * Normally OK, but may return -ECANCELED in the rare event that the task
- * has been canceled.
- *
- ****************************************************************************/
-
-static int i2s_exclsem_take(struct esp32_i2s_s *priv)
-{
- return nxsem_wait_uninterruptible(&priv->exclsem);
-}
-
/****************************************************************************
* Name: i2s_bufsem_take
*
@@ -565,14 +542,14 @@ static struct esp32_buffer_s *i2s_buf_allocate(struct esp32_i2s_s *priv)
/* Get the buffer from the head of the free list */
- flags = spin_lock_irqsave(&priv->lock);
+ flags = spin_lock_irqsave(&priv->slock);
bfcontainer = priv->bf_freelist;
DEBUGASSERT(bfcontainer);
/* Unlink the buffer from the freelist */
priv->bf_freelist = bfcontainer->flink;
- spin_unlock_irqrestore(&priv->lock, flags);
+ spin_unlock_irqrestore(&priv->slock, flags);
return bfcontainer;
}
@@ -601,7 +578,7 @@ static void i2s_buf_free(struct esp32_i2s_s *priv,
/* Put the buffer container back on the free list (circbuf) */
- flags = spin_lock_irqsave(&priv->lock);
+ flags = spin_lock_irqsave(&priv->slock);
bfcontainer->apb = NULL;
bfcontainer->buf = NULL;
@@ -609,7 +586,7 @@ static void i2s_buf_free(struct esp32_i2s_s *priv,
bfcontainer->flink = priv->bf_freelist;
priv->bf_freelist = bfcontainer;
- spin_unlock_irqrestore(&priv->lock, flags);
+ spin_unlock_irqrestore(&priv->slock, flags);
/* Wake up any threads waiting for a buffer container */
@@ -850,7 +827,7 @@ static int i2s_txdma_setup(struct esp32_i2s_s *priv,
return bytes_queued;
}
- flags = spin_lock_irqsave(&priv->lock);
+ flags = spin_lock_irqsave(&priv->slock);
/* Add the buffer container to the end of the TX pending queue */
@@ -860,7 +837,7 @@ static int i2s_txdma_setup(struct esp32_i2s_s *priv,
ret = i2s_txdma_start(priv);
- spin_unlock_irqrestore(&priv->lock, flags);
+ spin_unlock_irqrestore(&priv->slock, flags);
return ret;
}
@@ -1012,9 +989,9 @@ static void i2s_tx_worker(void *arg)
* also modified from the interrupt level.
*/
- flags = spin_lock_irqsave(&priv->lock);
+ flags = spin_lock_irqsave(&priv->slock);
bfcontainer = (struct esp32_buffer_s *)sq_remfirst(&priv->tx.done);
- spin_unlock_irqrestore(&priv->lock, flags);
+ spin_unlock_irqrestore(&priv->slock, flags);
/* Perform the TX transfer done callback */
@@ -1801,7 +1778,7 @@ static int esp32_i2s_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
/* Get exclusive access to the I2S driver data */
- ret = i2s_exclsem_take(priv);
+ ret = nxmutex_lock(&priv->lock);
if (ret < 0)
{
goto errout_with_buf;
@@ -1831,12 +1808,12 @@ static int esp32_i2s_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
i2s_dump_buffer("Audio pipeline buffer:", &apb->samp[apb->curbyte],
apb->nbytes - apb->curbyte);
- i2s_exclsem_give(priv);
+ nxmutex_unlock(&priv->lock);
return OK;
errout_with_buf:
- i2s_exclsem_give(priv);
+ nxmutex_unlock(&priv->lock);
i2s_buf_free(priv, bfcontainer);
return ret;
}
@@ -1931,9 +1908,9 @@ struct i2s_dev_s *esp32_i2sbus_initialize(int port)
priv->tx_started = false;
- flags = spin_lock_irqsave(&priv->lock);
+ flags = spin_lock_irqsave(&priv->slock);
- nxsem_init(&priv->exclsem, 0, 1);
+ nxmutex_init(&priv->lock);
i2s_configure(priv);
@@ -1957,7 +1934,7 @@ struct i2s_dev_s *esp32_i2sbus_initialize(int port)
i2s_tx_channel_start(priv);
#endif /* I2S_HAVE_TX */
- spin_unlock_irqrestore(&priv->lock, flags);
+ spin_unlock_irqrestore(&priv->slock, flags);
/* Success exit */
@@ -1968,8 +1945,8 @@ struct i2s_dev_s *esp32_i2sbus_initialize(int port)
/* Failure exit */
err:
- spin_unlock_irqrestore(&priv->lock, flags);
- nxsem_destroy(&priv->exclsem);
+ spin_unlock_irqrestore(&priv->slock, flags);
+ nxmutex_destroy(&priv->lock);
return NULL;
}