Skip to content

Commit 201949b

Browse files
committed
i2c: imx: support DMA defer probing
JIRA: https://issues.redhat.com/browse/RHEL-116101 commit d9a13c0 Author: Carlos Song <carlos.song@nxp.com> Date: Thu Dec 26 14:25:21 2024 +0800 i2c: imx: support DMA defer probing Return -EPROBE_DEFER when dma_request_slave_channel() because DMA driver have not ready yet. Move i2c_imx_dma_request() before registering I2C adapter to avoid infinite loop of .probe() calls to the same driver, see "e8c220fac415 Revert "i2c: imx: improve the error handling in i2c_imx_dma_request()"" and "Documentation/driver-api/driver-model/driver.rst". Use CPU mode to avoid stuck registering i2c adapter when DMA resources are unavailable. Signed-off-by: Carlos Song <carlos.song@nxp.com> Signed-off-by: Clark Wang <xiaoning.wang@nxp.com> Acked-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Acked-by: Oleksij Rempel <o.rempel@pengutronix.de> Link: https://lore.kernel.org/r/20241226062521.1004809-1-carlos.song@nxp.com Signed-off-by: Andi Shyti <andi.shyti@kernel.org> Signed-off-by: Jared Kangas <jkangas@redhat.com>
1 parent 0db5fc8 commit 201949b

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

drivers/i2c/busses/i2c-imx.c

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -397,17 +397,16 @@ static void i2c_imx_reset_regs(struct imx_i2c_struct *i2c_imx)
397397
}
398398

399399
/* Functions for DMA support */
400-
static void i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx,
401-
dma_addr_t phy_addr)
400+
static int i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx, dma_addr_t phy_addr)
402401
{
403402
struct imx_i2c_dma *dma;
404403
struct dma_slave_config dma_sconfig;
405-
struct device *dev = &i2c_imx->adapter.dev;
404+
struct device *dev = i2c_imx->adapter.dev.parent;
406405
int ret;
407406

408407
dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL);
409408
if (!dma)
410-
return;
409+
return -ENOMEM;
411410

412411
dma->chan_tx = dma_request_chan(dev, "tx");
413412
if (IS_ERR(dma->chan_tx)) {
@@ -452,14 +451,16 @@ static void i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx,
452451
dev_info(dev, "using %s (tx) and %s (rx) for DMA transfers\n",
453452
dma_chan_name(dma->chan_tx), dma_chan_name(dma->chan_rx));
454453

455-
return;
454+
return 0;
456455

457456
fail_rx:
458457
dma_release_channel(dma->chan_rx);
459458
fail_tx:
460459
dma_release_channel(dma->chan_tx);
461460
fail_al:
462461
devm_kfree(dev, dma);
462+
463+
return ret;
463464
}
464465

465466
static void i2c_imx_dma_callback(void *arg)
@@ -1802,6 +1803,22 @@ static int i2c_imx_probe(struct platform_device *pdev)
18021803
if (ret == -EPROBE_DEFER)
18031804
goto clk_notifier_unregister;
18041805

1806+
/*
1807+
* DMA mode should be optional for I2C, when encountering DMA errors,
1808+
* no need to exit I2C probe. Only print warning to show DMA error and
1809+
* use PIO mode directly to ensure I2C bus available as much as possible.
1810+
*/
1811+
ret = i2c_imx_dma_request(i2c_imx, phy_addr);
1812+
if (ret) {
1813+
if (ret == -EPROBE_DEFER)
1814+
goto clk_notifier_unregister;
1815+
else if (ret == -ENODEV)
1816+
dev_dbg(&pdev->dev, "Only use PIO mode\n");
1817+
else
1818+
dev_warn(&pdev->dev, "Failed to setup DMA (%pe), only use PIO mode\n",
1819+
ERR_PTR(ret));
1820+
}
1821+
18051822
/* Add I2C adapter */
18061823
ret = i2c_add_numbered_adapter(&i2c_imx->adapter);
18071824
if (ret < 0)
@@ -1816,9 +1833,6 @@ static int i2c_imx_probe(struct platform_device *pdev)
18161833
i2c_imx->adapter.name);
18171834
dev_info(&i2c_imx->adapter.dev, "IMX I2C adapter registered\n");
18181835

1819-
/* Init DMA config if supported */
1820-
i2c_imx_dma_request(i2c_imx, phy_addr);
1821-
18221836
return 0; /* Return OK */
18231837

18241838
clk_notifier_unregister:

0 commit comments

Comments
 (0)