@@ -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 = msg -> 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 = msg -> 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 )
@@ -805,18 +806,30 @@ static int stm32_i2c_irq_xfer(const struct device *dev, struct i2c_msg *msg,
805
806
uint32_t cr1 = I2C_CR1_ERRIE | I2C_CR1_STOPIE | I2C_CR1_TCIE | I2C_CR1_NACKIE ;
806
807
807
808
#ifdef CONFIG_I2C_STM32_V2_DMA
808
- dma_xfer_start (dev , msg );
809
+ if (dma_xfer_start (dev , msg ) != 0 ) {
810
+ goto dma_error ;
811
+ }
809
812
#else
810
813
/* If not using DMA, also enable RX and TX empty interrupts */
811
814
cr1 |= I2C_CR1_TXIE | I2C_CR1_RXIE ;
812
- #endif
815
+
816
+ #endif /* CONFIG_I2C_STM32_V2_DMA */
817
+
813
818
cr1 |= LL_I2C_ReadReg (regs , CR1 );
814
819
815
820
/* Enable interrupts */
816
821
LL_I2C_WriteReg (regs , CR1 , cr1 );
817
822
818
823
/* Wait for transfer to finish */
819
824
return stm32_i2c_irq_msg_finish (dev , msg );
825
+
826
+ dma_error :
827
+ #if defined(CONFIG_I2C_TARGET )
828
+ data -> master_active = false;
829
+ #endif
830
+ LL_I2C_Disable (regs );
831
+
832
+ return - EIO ;
820
833
}
821
834
822
835
#else /* !CONFIG_I2C_STM32_INTERRUPT */
0 commit comments