2019-01-16 19:46:31

by Laurentiu Tudor

[permalink] [raw]
Subject: [PATCH v2 1/2] i2c: imx: fix dma_request_chan error handling

Use the correct error pointer when extracting the error code.

Fixes: ea1e5f176e97 ("i2c: imx: notify about real errors on dma i2c_imx_dma_request")
Signed-off-by: Laurentiu Tudor <[email protected]>
---
drivers/i2c/busses/i2c-imx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index 09b124547669..42fed40198a0 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -287,7 +287,7 @@ static int i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx,

dma->chan_tx = dma_request_chan(dev, "tx");
if (IS_ERR(dma->chan_tx)) {
- ret = PTR_ERR(dma->chan_rx);
+ ret = PTR_ERR(dma->chan_tx);
if (ret != -ENODEV && ret != -EPROBE_DEFER)
dev_err(dev, "can't request DMA tx channel (%d)\n", ret);
goto fail_al;
--
2.17.1



2019-01-16 19:47:06

by Laurentiu Tudor

[permalink] [raw]
Subject: [PATCH v2 2/2] i2c: imx: defer probing on dma channel request

If the dma controller is not yet probed, defer i2c probe.
The error path in probe was slightly modified (no functional change)
to avoid triggering this WARN_ON():
"cg-pll0-div1 already disabled
WARNING: CPU: 1 PID: 1 at drivers/clk/clk.c:828 clk_core_disable+0xa8/0xb0"

Signed-off-by: Laurentiu Tudor <[email protected]>
---
Changes in v2:
- rebased on latest i2c tree
- fix small error introduced by a previous commit (first patch)

drivers/i2c/busses/i2c-imx.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index 42fed40198a0..4e34b1572756 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -1111,7 +1111,8 @@ static int i2c_imx_probe(struct platform_device *pdev)
pdev->name, i2c_imx);
if (ret) {
dev_err(&pdev->dev, "can't claim irq %d\n", irq);
- goto clk_disable;
+ clk_disable_unprepare(i2c_imx->clk);
+ return ret;
}

/* Init queue */
@@ -1161,19 +1162,25 @@ static int i2c_imx_probe(struct platform_device *pdev)
pm_runtime_mark_last_busy(&pdev->dev);
pm_runtime_put_autosuspend(&pdev->dev);

+ /* Init DMA config if supported */
+ ret = i2c_imx_dma_request(i2c_imx, phy_addr);
+ if (ret) {
+ if (ret != -EPROBE_DEFER)
+ dev_info(&pdev->dev, "can't use DMA, using PIO instead.\n");
+ else
+ goto del_adapter;
+ }
+
dev_dbg(&i2c_imx->adapter.dev, "claimed irq %d\n", irq);
dev_dbg(&i2c_imx->adapter.dev, "device resources: %pR\n", res);
dev_dbg(&i2c_imx->adapter.dev, "adapter name: \"%s\"\n",
i2c_imx->adapter.name);

- /* Init DMA config if supported */
- ret = i2c_imx_dma_request(i2c_imx, phy_addr);
- if (ret < 0)
- goto clk_notifier_unregister;
-
dev_info(&i2c_imx->adapter.dev, "IMX I2C adapter registered\n");
return 0; /* Return OK */

+del_adapter:
+ i2c_del_adapter(&i2c_imx->adapter);
clk_notifier_unregister:
clk_notifier_unregister(i2c_imx->clk, &i2c_imx->clk_change_nb);
rpm_disable:
@@ -1182,8 +1189,6 @@ static int i2c_imx_probe(struct platform_device *pdev)
pm_runtime_set_suspended(&pdev->dev);
pm_runtime_dont_use_autosuspend(&pdev->dev);

-clk_disable:
- clk_disable_unprepare(i2c_imx->clk);
return ret;
}

--
2.17.1


2019-01-22 22:54:08

by Wolfram Sang

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] i2c: imx: fix dma_request_chan error handling

On Wed, Jan 16, 2019 at 01:28:54PM +0200, Laurentiu Tudor wrote:
> Use the correct error pointer when extracting the error code.
>
> Fixes: ea1e5f176e97 ("i2c: imx: notify about real errors on dma i2c_imx_dma_request")

This is not the sha1 in my tree. Maybe you rebased? I applied another
patch meanwhile fixing the same issue. Still thanks!

> Signed-off-by: Laurentiu Tudor <[email protected]>
> ---
> drivers/i2c/busses/i2c-imx.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
> index 09b124547669..42fed40198a0 100644
> --- a/drivers/i2c/busses/i2c-imx.c
> +++ b/drivers/i2c/busses/i2c-imx.c
> @@ -287,7 +287,7 @@ static int i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx,
>
> dma->chan_tx = dma_request_chan(dev, "tx");
> if (IS_ERR(dma->chan_tx)) {
> - ret = PTR_ERR(dma->chan_rx);
> + ret = PTR_ERR(dma->chan_tx);
> if (ret != -ENODEV && ret != -EPROBE_DEFER)
> dev_err(dev, "can't request DMA tx channel (%d)\n", ret);
> goto fail_al;
> --
> 2.17.1
>


Attachments:
(No filename) (1.08 kB)
signature.asc (849.00 B)
Download all attachments

2019-01-25 09:21:42

by Laurentiu Tudor

[permalink] [raw]
Subject: RE: [PATCH v2 1/2] i2c: imx: fix dma_request_chan error handling

Hi Wolfram,

> -----Original Message-----
> From: Wolfram Sang [mailto:[email protected]]
> Sent: Wednesday, January 23, 2019 12:52 AM
>
> On Wed, Jan 16, 2019 at 01:28:54PM +0200, Laurentiu Tudor wrote:
> > Use the correct error pointer when extracting the error code.
> >
> > Fixes: ea1e5f176e97 ("i2c: imx: notify about real errors on dma
> i2c_imx_dma_request")
>
> This is not the sha1 in my tree. Maybe you rebased? I applied another
> patch meanwhile fixing the same issue. Still thanks!

I don't know, perhaps I was on some transient snapshot. Anyway, good that in the end it's fixed.

---
Best Regards, Laurentiu

> > Signed-off-by: Laurentiu Tudor <[email protected]>
> > ---
> > drivers/i2c/busses/i2c-imx.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
> > index 09b124547669..42fed40198a0 100644
> > --- a/drivers/i2c/busses/i2c-imx.c
> > +++ b/drivers/i2c/busses/i2c-imx.c
> > @@ -287,7 +287,7 @@ static int i2c_imx_dma_request(struct imx_i2c_struct
> *i2c_imx,
> >
> > dma->chan_tx = dma_request_chan(dev, "tx");
> > if (IS_ERR(dma->chan_tx)) {
> > - ret = PTR_ERR(dma->chan_rx);
> > + ret = PTR_ERR(dma->chan_tx);
> > if (ret != -ENODEV && ret != -EPROBE_DEFER)
> > dev_err(dev, "can't request DMA tx channel (%d)\n",
> ret);
> > goto fail_al;
> > --
> > 2.17.1
> >