xtensa/esp32: SPI Flash driver uses global sem for all MTD

Because all MTDs operate the main SPI Flash, so not only MTD internal
function should be mutex, but also MTDs should be mutex.
This commit is contained in:
Dong Heng 2020-11-02 11:36:22 +08:00 committed by Alan Carvalho de Assis
parent 5c6c0d2d57
commit c90697f193

View File

@ -97,10 +97,6 @@ struct esp32_spiflash_s
/* SPI Flash communication dummy number */ /* SPI Flash communication dummy number */
uint8_t *dummies; uint8_t *dummies;
/* Enxusre exculisve access to the driver */
sem_t exclsem;
}; };
/**************************************************************************** /****************************************************************************
@ -202,6 +198,10 @@ static struct esp32_spiflash_s g_esp32_spiflash1 =
.dummies = g_rom_spiflash_dummy_len_plus .dummies = g_rom_spiflash_dummy_len_plus
}; };
/* Ensure exclusive access to the driver */
static sem_t g_exclsem = SEM_INITIALIZER(1);
/**************************************************************************** /****************************************************************************
* Private Functions * Private Functions
****************************************************************************/ ****************************************************************************/
@ -1000,7 +1000,7 @@ static int esp32_erase(FAR struct mtd_dev_s *dev, off_t startblock,
finfo("esp32_erase(%p, %d, %d)\n", dev, startblock, nblocks); finfo("esp32_erase(%p, %d, %d)\n", dev, startblock, nblocks);
#endif #endif
ret = nxsem_wait(&priv->exclsem); ret = nxsem_wait(&g_exclsem);
if (ret < 0) if (ret < 0)
{ {
return ret; return ret;
@ -1009,7 +1009,7 @@ static int esp32_erase(FAR struct mtd_dev_s *dev, off_t startblock,
esp32_set_write_opt(priv); esp32_set_write_opt(priv);
ret = esp32_erasesector(priv, addr, size); ret = esp32_erasesector(priv, addr, size);
nxsem_post(&priv->exclsem); nxsem_post(&g_exclsem);
if (ret == OK) if (ret == OK)
{ {
@ -1064,7 +1064,7 @@ static ssize_t esp32_read(FAR struct mtd_dev_s *dev, off_t offset,
/* Acquire the semaphore. */ /* Acquire the semaphore. */
ret = nxsem_wait(&priv->exclsem); ret = nxsem_wait(&g_exclsem);
if (ret < 0) if (ret < 0)
{ {
goto error_with_buffer; goto error_with_buffer;
@ -1073,7 +1073,7 @@ static ssize_t esp32_read(FAR struct mtd_dev_s *dev, off_t offset,
esp32_set_read_opt(priv); esp32_set_read_opt(priv);
ret = esp32_readdata(priv, offset, tmpbuff, nbytes); ret = esp32_readdata(priv, offset, tmpbuff, nbytes);
nxsem_post(&priv->exclsem); nxsem_post(&g_exclsem);
if (ret == OK) if (ret == OK)
{ {
@ -1189,7 +1189,7 @@ static ssize_t esp32_write(FAR struct mtd_dev_s *dev, off_t offset,
/* Acquire the semaphore. */ /* Acquire the semaphore. */
ret = nxsem_wait(&priv->exclsem); ret = nxsem_wait(&g_exclsem);
if (ret < 0) if (ret < 0)
{ {
goto error_with_buffer; goto error_with_buffer;
@ -1198,7 +1198,7 @@ static ssize_t esp32_write(FAR struct mtd_dev_s *dev, off_t offset,
esp32_set_write_opt(priv); esp32_set_write_opt(priv);
ret = esp32_writedata(priv, offset, tmpbuff, nbytes); ret = esp32_writedata(priv, offset, tmpbuff, nbytes);
nxsem_post(&priv->exclsem); nxsem_post(&g_exclsem);
if (ret == OK) if (ret == OK)
{ {
@ -1343,10 +1343,6 @@ FAR struct mtd_dev_s *esp32_spiflash_alloc_mtdpart(void)
uint32_t startblock; uint32_t startblock;
uint32_t size; uint32_t size;
/* Initiliaze the mutex */
nxsem_init(&priv->exclsem, 0, 1);
ASSERT((ESP32_MTD_OFFSET + ESP32_MTD_SIZE) <= chip->chip_size); ASSERT((ESP32_MTD_OFFSET + ESP32_MTD_SIZE) <= chip->chip_size);
ASSERT((ESP32_MTD_OFFSET % chip->sector_size) == 0); ASSERT((ESP32_MTD_OFFSET % chip->sector_size) == 0);
ASSERT((ESP32_MTD_SIZE % chip->sector_size) == 0); ASSERT((ESP32_MTD_SIZE % chip->sector_size) == 0);