Skip to content

Commit 23b048b

Browse files
committed
drivers: i2c_stm32_v2: Abort on DMA error
If configuration of DMA is unsuccessful then abort transaction and return with an error code Signed-off-by: Erik Andersson <erian747@gmail.com>
1 parent 817796e commit 23b048b

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

drivers/i2c/i2c_ll_stm32_v2.c

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,12 @@ static int configure_dma(struct stream const *dma, struct dma_config *dma_cfg,
151151
return 0;
152152
}
153153

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)
155155
{
156156
const struct i2c_stm32_config *cfg = dev->config;
157157
struct i2c_stm32_data *data = dev->data;
158158
I2C_TypeDef *i2c = cfg->i2c;
159+
int ret = 0;
159160

160161
if ((msg->flags & I2C_MSG_READ) != 0U) {
161162
/* Configure RX DMA */
@@ -166,10 +167,10 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
166167
data->dma_blk_cfg.dest_addr_adj = DMA_ADDR_ADJ_INCREMENT;
167168
data->dma_blk_cfg.block_size = data->current.len;
168169

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;
173174
}
174175
LL_I2C_EnableDMAReq_RX(i2c);
175176
} else {
@@ -183,14 +184,14 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
183184
data->dma_blk_cfg.dest_addr_adj = DMA_ADDR_ADJ_NO_CHANGE;
184185
data->dma_blk_cfg.block_size = data->current.len;
185186

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;
190190
}
191191
LL_I2C_EnableDMAReq_TX(i2c);
192192
}
193193
}
194+
return ret;
194195
}
195196

196197
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,
802803
uint32_t cr1 = I2C_CR1_ERRIE | I2C_CR1_STOPIE | I2C_CR1_TCIE | I2C_CR1_NACKIE;
803804

804805
#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+
}
806809
#else
807810
/* If not using DMA, also enable RX and TX empty interrupts */
808811
cr1 |= I2C_CR1_TXIE | I2C_CR1_RXIE;
809-
#endif
812+
813+
#endif /* CONFIG_I2C_STM32_V2_DMA */
814+
810815
cr1 |= LL_I2C_ReadReg(regs, CR1);
811816

812817
/* Enable interrupts */
813818
LL_I2C_WriteReg(regs, CR1, cr1);
814819

815820
/* Wait for transfer to finish */
816821
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 */
817832
}
818833

819834
#else /* !CONFIG_I2C_STM32_INTERRUPT */

0 commit comments

Comments
 (0)