Skip to content

Commit ab8c21d

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 33c4980 commit ab8c21d

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)
@@ -804,18 +805,32 @@ static int stm32_i2c_irq_xfer(const struct device *dev, struct i2c_msg *msg,
804805
uint32_t cr1 = I2C_CR1_ERRIE | I2C_CR1_STOPIE | I2C_CR1_TCIE | I2C_CR1_NACKIE;
805806

806807
#ifdef CONFIG_I2C_STM32_V2_DMA
807-
dma_xfer_start(dev, msg);
808+
if (dma_xfer_start(dev, msg) != 0) {
809+
goto dma_error;
810+
}
808811
#else
809812
/* If not using DMA, also enable RX and TX empty interrupts */
810813
cr1 |= I2C_CR1_TXIE | I2C_CR1_RXIE;
811-
#endif
814+
815+
#endif /* CONFIG_I2C_STM32_V2_DMA */
816+
812817
cr1 |= LL_I2C_ReadReg(regs, CR1);
813818

814819
/* Enable interrupts */
815820
LL_I2C_WriteReg(regs, CR1, cr1);
816821

817822
/* Wait for transfer to finish */
818823
return stm32_i2c_irq_msg_finish(dev, msg);
824+
825+
#ifdef CONFIG_I2C_STM32_V2_DMA
826+
dma_error:
827+
LL_I2C_Disable(regs);
828+
#if defined(CONFIG_I2C_TARGET)
829+
data->master_active = false;
830+
#endif
831+
832+
return -EIO;
833+
#endif /* CONFIG_I2C_STM32_V2_DMA */
819834
}
820835

821836
#else /* !CONFIG_I2C_STM32_INTERRUPT */

0 commit comments

Comments
 (0)