Skip to content

Commit 5ad9494

Browse files
erian747jhedberg
authored andcommitted
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 <[email protected]>
1 parent 624d9c1 commit 5ad9494

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

drivers/i2c/i2c_ll_stm32_v2.c

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

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

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

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;
172172
}
173173
LL_I2C_EnableDMAReq_RX(i2c);
174174
} else {
@@ -181,14 +181,14 @@ static void dma_xfer_start(const struct device *dev, struct i2c_msg *msg)
181181
data->dma_blk_cfg.dest_addr_adj = DMA_ADDR_ADJ_NO_CHANGE;
182182
data->dma_blk_cfg.block_size = data->current.len;
183183

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;
188187
}
189188
LL_I2C_EnableDMAReq_TX(i2c);
190189
}
191190
}
191+
return 0;
192192
}
193193

194194
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,
799799
uint32_t cr1 = I2C_CR1_ERRIE | I2C_CR1_STOPIE | I2C_CR1_TCIE | I2C_CR1_NACKIE;
800800

801801
#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+
}
803809
#else
804810
/* If not using DMA, also enable RX and TX empty interrupts */
805811
cr1 |= I2C_CR1_TXIE | I2C_CR1_RXIE;
806-
#endif
812+
#endif /* CONFIG_I2C_STM32_V2_DMA */
807813

808814
/* Commit configuration to I2C controller and start transfer */
809815
LL_I2C_WriteReg(regs, CR2, cr2);

0 commit comments

Comments
 (0)