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 2021/10/16 07:01:40 UTC
[incubator-nuttx] 07/16: esp32/esp32_spi_slave.c: Use device
specific locks.
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 c61009c2cfd803f18b1c09415ca54111e7ff548b
Author: Abdelatif Guettouche <ab...@espressif.com>
AuthorDate: Wed Sep 8 14:24:55 2021 +0200
esp32/esp32_spi_slave.c: Use device specific locks.
Signed-off-by: Abdelatif Guettouche <ab...@espressif.com>
---
arch/xtensa/src/esp32/esp32_spi_slave.c | 41 ++++++++++++++++++---------------
1 file changed, 22 insertions(+), 19 deletions(-)
diff --git a/arch/xtensa/src/esp32/esp32_spi_slave.c b/arch/xtensa/src/esp32/esp32_spi_slave.c
index 269e427..213d518 100644
--- a/arch/xtensa/src/esp32/esp32_spi_slave.c
+++ b/arch/xtensa/src/esp32/esp32_spi_slave.c
@@ -41,6 +41,7 @@
#include <nuttx/irq.h>
#include <nuttx/clock.h>
#include <nuttx/semaphore.h>
+#include <nuttx/spinlock.h>
#include <nuttx/spi/spi.h>
#include <nuttx/spi/slave.h>
@@ -163,6 +164,8 @@ struct esp32_spislv_priv_s
/* Copy from config to speed up checking */
bool dma_chan;
+
+ spinlock_t lock; /* Device specific lock. */
};
/****************************************************************************
@@ -1009,7 +1012,7 @@ static void esp32_spislv_bind(struct spi_slave_ctrlr_s *ctrlr,
DEBUGASSERT(priv != NULL && priv->dev == NULL && dev != NULL);
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
priv->dev = dev;
@@ -1031,7 +1034,7 @@ static void esp32_spislv_bind(struct spi_slave_ctrlr_s *ctrlr,
esp32_spi_set_regbits(priv, SPI_CMD_OFFSET, SPI_USR_M);
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
}
/****************************************************************************
@@ -1061,7 +1064,7 @@ static void esp32_spislv_unbind(struct spi_slave_ctrlr_s *ctrlr)
DEBUGASSERT(priv->dev != NULL);
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
up_disable_irq(priv->config->irq);
@@ -1076,7 +1079,7 @@ static void esp32_spislv_unbind(struct spi_slave_ctrlr_s *ctrlr)
priv->dev = NULL;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
}
/****************************************************************************
@@ -1114,7 +1117,7 @@ static int esp32_spislv_enqueue(struct spi_slave_ctrlr_s *ctrlr,
ctrlr, data, nwords);
DEBUGASSERT(priv != NULL && priv->dev != NULL);
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
bufsize = SPI_SLAVE_BUFSIZE - priv->txlen;
if (!bufsize)
@@ -1135,7 +1138,7 @@ static int esp32_spislv_enqueue(struct spi_slave_ctrlr_s *ctrlr,
}
}
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
return ret;
}
@@ -1165,9 +1168,9 @@ static bool esp32_spislv_qfull(struct spi_slave_ctrlr_s *ctrlr)
spiinfo("spi_qfull(ctrlr=%p)\n", ctrlr);
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
ret = priv->txlen == SPI_SLAVE_BUFSIZE;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
return ret;
}
@@ -1195,11 +1198,11 @@ static void esp32_spislv_qflush(struct spi_slave_ctrlr_s *ctrlr)
DEBUGASSERT(priv != NULL && priv->dev != NULL);
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
priv->rxlen = 0;
priv->txlen = 0;
priv->txen = false;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
}
/****************************************************************************
@@ -1225,12 +1228,12 @@ static size_t esp32_spislv_qpoll(struct spi_slave_ctrlr_s *ctrlr)
DEBUGASSERT(priv != NULL && priv->dev != NULL);
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
esp32_spislv_rx(priv);
n = priv->rxlen;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
return n;
}
@@ -1274,11 +1277,11 @@ struct spi_slave_ctrlr_s *esp32_spislv_ctrlr_initialize(int port)
spislv_dev = (struct spi_slave_ctrlr_s *)priv;
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
if ((volatile int)priv->refs != 0)
{
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
return spislv_dev;
}
@@ -1307,14 +1310,14 @@ struct spi_slave_ctrlr_s *esp32_spislv_ctrlr_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;
}
priv->refs++;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
return spislv_dev;
}
@@ -1345,11 +1348,11 @@ int esp32_spislv_ctrlr_uninitialize(struct spi_slave_ctrlr_s *ctrlr)
return ERROR;
}
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
if (--priv->refs)
{
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
return OK;
}
@@ -1357,7 +1360,7 @@ int esp32_spislv_ctrlr_uninitialize(struct spi_slave_ctrlr_s *ctrlr)
esp32_teardown_irq(priv->cpu, priv->config->periph, priv->cpuint);
esp32_spislv_deinit(ctrlr);
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
return OK;
}