@@ -151,11 +151,12 @@ static int configure_dma(struct stream const *dma, struct dma_config *dma_cfg,
151
151
return 0 ;
152
152
}
153
153
154
- static void dma_xfer_start (const struct device * dev , struct i2c_msg * msg )
154
+ static int dma_xfer_start (const struct device * dev , struct i2c_msg * msg )
155
155
{
156
156
const struct i2c_stm32_config * cfg = dev -> config ;
157
157
struct i2c_stm32_data * data = dev -> data ;
158
158
I2C_TypeDef * i2c = cfg -> i2c ;
159
+ int ret = 0 ;
159
160
160
161
if ((msg -> flags & I2C_MSG_READ ) != 0U ) {
161
162
/* Configure RX DMA */
@@ -166,10 +167,10 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
166
167
data -> dma_blk_cfg .dest_addr_adj = DMA_ADDR_ADJ_INCREMENT ;
167
168
data -> dma_blk_cfg .block_size = data -> current .len ;
168
169
169
- if ( configure_dma (& cfg -> rx_dma , & data -> dma_rx_cfg ,
170
- & data -> dma_blk_cfg ) != 0 ) {
171
- LOG_ERR ( "Problem setting up RX DMA" );
172
- return ;
170
+ ret = configure_dma (& cfg -> rx_dma , & data -> dma_rx_cfg , & data -> dma_blk_cfg );
171
+
172
+ if ( ret != 0 ) {
173
+ return ret ;
173
174
}
174
175
LL_I2C_EnableDMAReq_RX (i2c );
175
176
} else {
@@ -183,14 +184,14 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
183
184
data -> dma_blk_cfg .dest_addr_adj = DMA_ADDR_ADJ_NO_CHANGE ;
184
185
data -> dma_blk_cfg .block_size = data -> current .len ;
185
186
186
- if (configure_dma (& cfg -> tx_dma , & data -> dma_tx_cfg ,
187
- & data -> dma_blk_cfg ) != 0 ) {
188
- LOG_ERR ("Problem setting up TX DMA" );
189
- return ;
187
+ ret = configure_dma (& cfg -> tx_dma , & data -> dma_tx_cfg , & data -> dma_blk_cfg );
188
+ if (ret != 0 ) {
189
+ return ret ;
190
190
}
191
191
LL_I2C_EnableDMAReq_TX (i2c );
192
192
}
193
193
}
194
+ return ret ;
194
195
}
195
196
196
197
static inline void dma_finish (const struct device * dev , struct i2c_msg * msg )
@@ -802,18 +803,32 @@ static int stm32_i2c_irq_xfer(const struct device *dev, struct i2c_msg *msg,
802
803
uint32_t cr1 = I2C_CR1_ERRIE | I2C_CR1_STOPIE | I2C_CR1_TCIE | I2C_CR1_NACKIE ;
803
804
804
805
#ifdef CONFIG_I2C_STM32_V2_DMA
805
- dma_xfer_start (dev , msg );
806
+ if (dma_xfer_start (dev , msg ) != 0 ) {
807
+ goto dma_error ;
808
+ }
806
809
#else
807
810
/* If not using DMA, also enable RX and TX empty interrupts */
808
811
cr1 |= I2C_CR1_TXIE | I2C_CR1_RXIE ;
809
- #endif
812
+
813
+ #endif /* CONFIG_I2C_STM32_V2_DMA */
814
+
810
815
cr1 |= LL_I2C_ReadReg (regs , CR1 );
811
816
812
817
/* Enable interrupts */
813
818
LL_I2C_WriteReg (regs , CR1 , cr1 );
814
819
815
820
/* Wait for transfer to finish */
816
821
return stm32_i2c_irq_msg_finish (dev , msg );
822
+
823
+ #ifdef CONFIG_I2C_STM32_V2_DMA
824
+ dma_error :
825
+ LL_I2C_Disable (regs );
826
+ #if defined(CONFIG_I2C_TARGET )
827
+ data -> master_active = false;
828
+ #endif
829
+
830
+ return - EIO ;
831
+ #endif /* CONFIG_I2C_STM32_V2_DMA */
817
832
}
818
833
819
834
#else /* !CONFIG_I2C_STM32_INTERRUPT */
0 commit comments