@@ -32,6 +32,8 @@ LOG_MODULE_REGISTER(flash_stm32_qspi, CONFIG_FLASH_LOG_LEVEL);
3232#define STM32_QSPI_FIFO_THRESHOLD 8
3333#define STM32_QSPI_CLOCK_PRESCALER_MAX 255
3434
35+ #define STM32_QSPI_USE_DMA DT_NODE_HAS_PROP(DT_PARENT(DT_DRV_INST(0)), dmas)
36+
3537#if DT_HAS_COMPAT_STATUS_OKAY (st_stm32_qspi_nor )
3638
3739uint32_t table_m_size [] = {
@@ -151,7 +153,11 @@ static int qspi_read_access(const struct device *dev, QSPI_CommandTypeDef *cmd,
151153 return - EIO ;
152154 }
153155
156+ #if STM32_QSPI_USE_DMA
154157 hal_ret = HAL_QSPI_Receive_DMA (& dev_data -> hqspi , data );
158+ #else
159+ hal_ret = HAL_QSPI_Receive_IT (& dev_data -> hqspi , data );
160+ #endif
155161 if (hal_ret != HAL_OK ) {
156162 LOG_ERR ("%d: Failed to read data" , hal_ret );
157163 return - EIO ;
@@ -186,7 +192,11 @@ static int qspi_write_access(const struct device *dev, QSPI_CommandTypeDef *cmd,
186192 return - EIO ;
187193 }
188194
195+ #if STM32_QSPI_USE_DMA
189196 hal_ret = HAL_QSPI_Transmit_DMA (& dev_data -> hqspi , (uint8_t * )data );
197+ #else
198+ hal_ret = HAL_QSPI_Transmit_IT (& dev_data -> hqspi , (uint8_t * )data );
199+ #endif
190200 if (hal_ret != HAL_OK ) {
191201 LOG_ERR ("%d: Failed to read data" , hal_ret );
192202 return - EIO ;
@@ -454,6 +464,7 @@ static void flash_stm32_qspi_isr(const struct device *dev)
454464}
455465
456466/* This function is executed in the interrupt context */
467+ #if STM32_QSPI_USE_DMA
457468static void qspi_dma_callback (const struct device * dev , void * arg ,
458469 uint32_t channel , int status )
459470{
@@ -466,6 +477,7 @@ static void qspi_dma_callback(const struct device *dev, void *arg,
466477
467478 HAL_DMA_IRQHandler (hdma );
468479}
480+ #endif
469481
470482__weak HAL_StatusTypeDef HAL_DMA_Abort_IT (DMA_HandleTypeDef * hdma )
471483{
@@ -658,8 +670,6 @@ static int flash_stm32_qspi_init(const struct device *dev)
658670{
659671 const struct flash_stm32_qspi_config * dev_cfg = DEV_CFG (dev );
660672 struct flash_stm32_qspi_data * dev_data = DEV_DATA (dev );
661- struct dma_config dma_cfg = dev_data -> dma .cfg ;
662- static DMA_HandleTypeDef hdma ;
663673 uint32_t ahb_clock_freq ;
664674 uint32_t prescaler = 0 ;
665675 int ret ;
@@ -673,6 +683,7 @@ static int flash_stm32_qspi_init(const struct device *dev)
673683 return ret ;
674684 }
675685
686+ #if STM32_QSPI_USE_DMA
676687 /*
677688 * DMA configuration
678689 * Due to use of QSPI HAL API in current driver,
@@ -681,7 +692,6 @@ static int flash_stm32_qspi_init(const struct device *dev)
681692 * the minimum information to inform the DMA slot will be in used and
682693 * how to route callbacks.
683694 */
684-
685695 struct dma_config dma_cfg = dev_data -> dma .cfg ;
686696 static DMA_HandleTypeDef hdma ;
687697
@@ -691,6 +701,8 @@ static int flash_stm32_qspi_init(const struct device *dev)
691701 LOG_ERR ("%s device not found" , dev_data -> dma .name );
692702 return - ENODEV ;
693703 }
704+ } else {
705+ return - EINVAL ;
694706 }
695707
696708 /* Proceed to the minimum Zephyr DMA driver init */
@@ -738,6 +750,8 @@ static int flash_stm32_qspi_init(const struct device *dev)
738750 __HAL_LINKDMA (& dev_data -> hqspi , hdma , hdma );
739751 HAL_DMA_Init (& hdma );
740752
753+ #endif /* STM32_QSPI_USE_DMA */
754+
741755 /* Clock configuration */
742756 __ASSERT_NO_MSG (device_get_binding (STM32_CLOCK_CONTROL_NAME ));
743757
@@ -762,7 +776,6 @@ static int flash_stm32_qspi_init(const struct device *dev)
762776 }
763777 }
764778 __ASSERT_NO_MSG (prescaler <= STM32_QSPI_CLOCK_PRESCALER_MAX );
765-
766779 /* Initialize QSPI HAL */
767780 dev_data -> hqspi .Init .ClockPrescaler = prescaler ;
768781 dev_data -> hqspi .Init .FlashSize = find_lsb_set (dev_cfg -> flash_size );
0 commit comments