@@ -150,11 +150,12 @@ static int configure_dma(struct stream const *dma, struct dma_config *dma_cfg,
150
150
return 0 ;
151
151
}
152
152
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 )
154
154
{
155
155
const struct i2c_stm32_config * cfg = dev -> config ;
156
156
struct i2c_stm32_data * data = dev -> data ;
157
157
I2C_TypeDef * i2c = cfg -> i2c ;
158
+ int ret = 0 ;
158
159
159
160
if ((msg -> flags & I2C_MSG_READ ) != 0U ) {
160
161
/* Configure RX DMA */
@@ -165,10 +166,9 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
165
166
data -> dma_blk_cfg .dest_addr_adj = DMA_ADDR_ADJ_INCREMENT ;
166
167
data -> dma_blk_cfg .block_size = data -> current .len ;
167
168
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 ;
172
172
}
173
173
LL_I2C_EnableDMAReq_RX (i2c );
174
174
} else {
@@ -181,14 +181,14 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
181
181
data -> dma_blk_cfg .dest_addr_adj = DMA_ADDR_ADJ_NO_CHANGE ;
182
182
data -> dma_blk_cfg .block_size = data -> current .len ;
183
183
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 ;
188
187
}
189
188
LL_I2C_EnableDMAReq_TX (i2c );
190
189
}
191
190
}
191
+ return 0 ;
192
192
}
193
193
194
194
static 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,
799
799
uint32_t cr1 = I2C_CR1_ERRIE | I2C_CR1_STOPIE | I2C_CR1_TCIE | I2C_CR1_NACKIE ;
800
800
801
801
#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
+ }
803
809
#else
804
810
/* If not using DMA, also enable RX and TX empty interrupts */
805
811
cr1 |= I2C_CR1_TXIE | I2C_CR1_RXIE ;
806
- #endif
812
+ #endif /* CONFIG_I2C_STM32_V2_DMA */
807
813
808
814
/* Commit configuration to I2C controller and start transfer */
809
815
LL_I2C_WriteReg (regs , CR2 , cr2 );
0 commit comments