@@ -150,11 +150,12 @@ static int configure_dma(struct stream const *dma, struct dma_config *dma_cfg,
150150 return 0 ;
151151}
152152
153- static void dma_xfer_start (const struct device * dev , struct i2c_msg * msg )
153+ static int dma_xfer_start (const struct device * dev , struct i2c_msg * msg )
154154{
155155 const struct i2c_stm32_config * cfg = dev -> config ;
156156 struct i2c_stm32_data * data = dev -> data ;
157157 I2C_TypeDef * i2c = cfg -> i2c ;
158+ int ret = 0 ;
158159
159160 if ((msg -> flags & I2C_MSG_READ ) != 0U ) {
160161 /* Configure RX DMA */
@@ -165,10 +166,9 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
165166 data -> dma_blk_cfg .dest_addr_adj = DMA_ADDR_ADJ_INCREMENT ;
166167 data -> dma_blk_cfg .block_size = data -> current .len ;
167168
168- if (configure_dma (& cfg -> rx_dma , & data -> dma_rx_cfg ,
169- & data -> dma_blk_cfg ) != 0 ) {
170- LOG_ERR ("Problem setting up RX DMA" );
171- return ;
169+ ret = configure_dma (& cfg -> rx_dma , & data -> dma_rx_cfg , & data -> dma_blk_cfg );
170+ if (ret != 0 ) {
171+ return ret ;
172172 }
173173 LL_I2C_EnableDMAReq_RX (i2c );
174174 } else {
@@ -181,14 +181,14 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
181181 data -> dma_blk_cfg .dest_addr_adj = DMA_ADDR_ADJ_NO_CHANGE ;
182182 data -> dma_blk_cfg .block_size = data -> current .len ;
183183
184- if (configure_dma (& cfg -> tx_dma , & data -> dma_tx_cfg ,
185- & data -> dma_blk_cfg ) != 0 ) {
186- LOG_ERR ("Problem setting up TX DMA" );
187- return ;
184+ ret = configure_dma (& cfg -> tx_dma , & data -> dma_tx_cfg , & data -> dma_blk_cfg );
185+ if (ret != 0 ) {
186+ return ret ;
188187 }
189188 LL_I2C_EnableDMAReq_TX (i2c );
190189 }
191190 }
191+ return 0 ;
192192}
193193
194194static void dma_finish (const struct device * dev , struct i2c_msg * msg )
@@ -799,11 +799,17 @@ static int stm32_i2c_irq_xfer(const struct device *dev, struct i2c_msg *msg,
799799 uint32_t cr1 = I2C_CR1_ERRIE | I2C_CR1_STOPIE | I2C_CR1_TCIE | I2C_CR1_NACKIE ;
800800
801801#ifdef CONFIG_I2C_STM32_V2_DMA
802- dma_xfer_start (dev , msg );
802+ if (dma_xfer_start (dev , msg ) != 0 ) {
803+ LL_I2C_Disable (regs );
804+ #if defined(CONFIG_I2C_TARGET )
805+ data -> master_active = false;
806+ #endif
807+ return - EIO ;
808+ }
803809#else
804810 /* If not using DMA, also enable RX and TX empty interrupts */
805811 cr1 |= I2C_CR1_TXIE | I2C_CR1_RXIE ;
806- #endif
812+ #endif /* CONFIG_I2C_STM32_V2_DMA */
807813
808814 /* Commit configuration to I2C controller and start transfer */
809815 LL_I2C_WriteReg (regs , CR2 , cr2 );
0 commit comments