From 392da5baee6c5779214580c81b025af8766225fb Mon Sep 17 00:00:00 2001 From: Johannes Hutter Date: Mon, 18 Jun 2018 10:38:18 +0200 Subject: [PATCH] drivers: flash: w25qxxdv: Avoid locking when not threaded When using CONFIG_MULTITHREADING=n, the semaphore primitives are non-functional and useless. Remove their usage when this option is enabled. Signed-off-by: Johannes Hutter --- drivers/flash/spi_flash_w25qxxdv.c | 34 +++++++++++++++++++----------- drivers/flash/spi_flash_w25qxxdv.h | 2 ++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/drivers/flash/spi_flash_w25qxxdv.c b/drivers/flash/spi_flash_w25qxxdv.c index b7d2eabfeefbb6..d4e7dffa40943a 100644 --- a/drivers/flash/spi_flash_w25qxxdv.c +++ b/drivers/flash/spi_flash_w25qxxdv.c @@ -14,6 +14,17 @@ #include "spi_flash_w25qxxdv.h" #include "flash_priv.h" +#if defined(CONFIG_MULTITHREADING) +#define SYNC_INIT() k_sem_init( \ + &((struct spi_flash_data *)dev->driver_data)->sem, 1, UINT_MAX) +#define SYNC_LOCK() k_sem_take(&driver_data->sem, K_FOREVER) +#define SYNC_UNLOCK() k_sem_give(&driver_data->sem) +#else +#define SYNC_INIT() +#define SYNC_LOCK() +#define SYNC_UNLOCK() +#endif + static int spi_flash_wb_access(struct spi_flash_data *ctx, u8_t cmd, bool addressed, off_t offset, void *data, size_t length, bool write) @@ -123,14 +134,14 @@ static int spi_flash_wb_read(struct device *dev, off_t offset, void *data, return -ENODEV; } - k_sem_take(&driver_data->sem, K_FOREVER); + SYNC_LOCK(); wait_for_flash_idle(dev); ret = spi_flash_wb_access(driver_data, W25QXXDV_CMD_READ, true, offset, data, len, false); - k_sem_give(&driver_data->sem); + SYNC_UNLOCK(); return ret; } @@ -146,13 +157,13 @@ static int spi_flash_wb_write(struct device *dev, off_t offset, return -ENOTSUP; } - k_sem_take(&driver_data->sem, K_FOREVER); + SYNC_LOCK(); wait_for_flash_idle(dev); reg = spi_flash_wb_reg_read(dev, W25QXXDV_CMD_RDSR); if (!(reg & W25QXXDV_WEL_BIT)) { - k_sem_give(&driver_data->sem); + SYNC_UNLOCK(); return -EIO; } @@ -165,7 +176,7 @@ static int spi_flash_wb_write(struct device *dev, off_t offset, ret = spi_flash_wb_access(driver_data, W25QXXDV_CMD_PP, true, offset, (void *)data, len, true); - k_sem_give(&driver_data->sem); + SYNC_UNLOCK(); return ret; } @@ -176,7 +187,7 @@ static int spi_flash_wb_write_protection_set(struct device *dev, bool enable) u8_t reg = 0; int ret; - k_sem_take(&driver_data->sem, K_FOREVER); + SYNC_LOCK(); wait_for_flash_idle(dev); @@ -188,7 +199,7 @@ static int spi_flash_wb_write_protection_set(struct device *dev, bool enable) ret = spi_flash_wb_reg_write(dev, reg); - k_sem_give(&driver_data->sem); + SYNC_UNLOCK(); return ret; } @@ -252,12 +263,12 @@ static int spi_flash_wb_erase(struct device *dev, off_t offset, size_t size) return -ENODEV; } - k_sem_take(&driver_data->sem, K_FOREVER); + SYNC_LOCK(); reg = spi_flash_wb_reg_read(dev, W25QXXDV_CMD_RDSR); if (!(reg & W25QXXDV_WEL_BIT)) { - k_sem_give(&driver_data->sem); + SYNC_UNLOCK(); return -EIO; } @@ -292,7 +303,7 @@ static int spi_flash_wb_erase(struct device *dev, off_t offset, size_t size) } } - k_sem_give(&driver_data->sem); + SYNC_UNLOCK(); return ret; } @@ -340,10 +351,9 @@ static int spi_flash_wb_configure(struct device *dev) static int spi_flash_init(struct device *dev) { - struct spi_flash_data *data = dev->driver_data; int ret; - k_sem_init(&data->sem, 1, UINT_MAX); + SYNC_INIT(); ret = spi_flash_wb_configure(dev); if (!ret) { diff --git a/drivers/flash/spi_flash_w25qxxdv.h b/drivers/flash/spi_flash_w25qxxdv.h index 3790b0d1ca7331..411c777ebe2cac 100644 --- a/drivers/flash/spi_flash_w25qxxdv.h +++ b/drivers/flash/spi_flash_w25qxxdv.h @@ -20,7 +20,9 @@ struct spi_flash_data { struct spi_cs_control cs_ctrl; #endif /* CONFIG_SPI_FLASH_W25QXXDV_GPIO_SPI_CS */ struct spi_config spi_cfg; +#if defined(CONFIG_MULTITHREADING) struct k_sem sem; +#endif /* CONFIG_MULTITHREADING */ };