esp32/i2s: replace nxsem when used as a lock to nxmutex
This commit is contained in:
parent
64abc72052
commit
20d8a55181
@ -269,10 +269,10 @@ struct esp32_transport_s
|
|||||||
struct esp32_i2s_s
|
struct esp32_i2s_s
|
||||||
{
|
{
|
||||||
struct i2s_dev_s dev; /* Externally visible I2S interface */
|
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 */
|
int cpuint; /* I2S interrupt ID */
|
||||||
uint8_t cpu; /* CPU ID */
|
uint8_t cpu; /* CPU ID */
|
||||||
spinlock_t lock; /* Device specific lock. */
|
spinlock_t slock; /* Device specific lock. */
|
||||||
|
|
||||||
/* Port configuration */
|
/* Port configuration */
|
||||||
|
|
||||||
@ -310,9 +310,6 @@ struct esp32_i2s_s
|
|||||||
|
|
||||||
/* Semaphore helpers */
|
/* 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);
|
static int i2s_bufsem_take(struct esp32_i2s_s *priv);
|
||||||
#define i2s_bufsem_give(priv) nxsem_post(&priv->bufsem)
|
#define i2s_bufsem_give(priv) nxsem_post(&priv->bufsem)
|
||||||
|
|
||||||
@ -487,26 +484,6 @@ static struct esp32_i2s_s esp32_i2s1_priv =
|
|||||||
* Private Functions
|
* 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
|
* 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 */
|
/* 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;
|
bfcontainer = priv->bf_freelist;
|
||||||
DEBUGASSERT(bfcontainer);
|
DEBUGASSERT(bfcontainer);
|
||||||
|
|
||||||
/* Unlink the buffer from the freelist */
|
/* Unlink the buffer from the freelist */
|
||||||
|
|
||||||
priv->bf_freelist = bfcontainer->flink;
|
priv->bf_freelist = bfcontainer->flink;
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
spin_unlock_irqrestore(&priv->slock, flags);
|
||||||
return bfcontainer;
|
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) */
|
/* 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->apb = NULL;
|
||||||
bfcontainer->buf = NULL;
|
bfcontainer->buf = NULL;
|
||||||
@ -609,7 +586,7 @@ static void i2s_buf_free(struct esp32_i2s_s *priv,
|
|||||||
bfcontainer->flink = priv->bf_freelist;
|
bfcontainer->flink = priv->bf_freelist;
|
||||||
priv->bf_freelist = bfcontainer;
|
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 */
|
/* 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;
|
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 */
|
/* 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);
|
ret = i2s_txdma_start(priv);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
spin_unlock_irqrestore(&priv->slock, flags);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1012,9 +989,9 @@ static void i2s_tx_worker(void *arg)
|
|||||||
* also modified from the interrupt level.
|
* 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);
|
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 */
|
/* 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 */
|
/* Get exclusive access to the I2S driver data */
|
||||||
|
|
||||||
ret = i2s_exclsem_take(priv);
|
ret = nxmutex_lock(&priv->lock);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto errout_with_buf;
|
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],
|
i2s_dump_buffer("Audio pipeline buffer:", &apb->samp[apb->curbyte],
|
||||||
apb->nbytes - apb->curbyte);
|
apb->nbytes - apb->curbyte);
|
||||||
|
|
||||||
i2s_exclsem_give(priv);
|
nxmutex_unlock(&priv->lock);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
errout_with_buf:
|
errout_with_buf:
|
||||||
i2s_exclsem_give(priv);
|
nxmutex_unlock(&priv->lock);
|
||||||
i2s_buf_free(priv, bfcontainer);
|
i2s_buf_free(priv, bfcontainer);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1931,9 +1908,9 @@ struct i2s_dev_s *esp32_i2sbus_initialize(int port)
|
|||||||
|
|
||||||
priv->tx_started = false;
|
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);
|
i2s_configure(priv);
|
||||||
|
|
||||||
@ -1957,7 +1934,7 @@ struct i2s_dev_s *esp32_i2sbus_initialize(int port)
|
|||||||
i2s_tx_channel_start(priv);
|
i2s_tx_channel_start(priv);
|
||||||
#endif /* I2S_HAVE_TX */
|
#endif /* I2S_HAVE_TX */
|
||||||
|
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
spin_unlock_irqrestore(&priv->slock, flags);
|
||||||
|
|
||||||
/* Success exit */
|
/* Success exit */
|
||||||
|
|
||||||
@ -1968,8 +1945,8 @@ struct i2s_dev_s *esp32_i2sbus_initialize(int port)
|
|||||||
/* Failure exit */
|
/* Failure exit */
|
||||||
|
|
||||||
err:
|
err:
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
spin_unlock_irqrestore(&priv->slock, flags);
|
||||||
nxsem_destroy(&priv->exclsem);
|
nxmutex_destroy(&priv->lock);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user