Skip to content

Commit 4640a24

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 de7d26e commit 4640a24

File tree

1 file changed

+24
-11
lines changed

1 file changed

+24
-11
lines changed

drivers/i2c/i2c_ll_stm32_v2.c

Lines changed: 24 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 = msg->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 = msg->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)
@@ -805,18 +806,30 @@ static int stm32_i2c_irq_xfer(const struct device *dev, struct i2c_msg *msg,
805806
uint32_t cr1 = I2C_CR1_ERRIE | I2C_CR1_STOPIE | I2C_CR1_TCIE | I2C_CR1_NACKIE;
806807

807808
#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+
}
809812
#else
810813
/* If not using DMA, also enable RX and TX empty interrupts */
811814
cr1 |= I2C_CR1_TXIE | I2C_CR1_RXIE;
812-
#endif
815+
816+
#endif /* CONFIG_I2C_STM32_V2_DMA */
817+
813818
cr1 |= LL_I2C_ReadReg(regs, CR1);
814819

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

818823
/* Wait for transfer to finish */
819824
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;
820833
}
821834

822835
#else /* !CONFIG_I2C_STM32_INTERRUPT */

0 commit comments

Comments
 (0)