Re: [PATCH] dmaengine: altera-msgdma: fail probe when reset times out
From: Frank Li
Date: Fri Oct 16 2026 - 11:48:41 EST
On Tue, Jun 23, 2026 at 02:05:54PM +0800, Pengpeng Hou wrote:
> msgdma_probe() resets the controller before publishing the DMA device
> and OF DMA provider, but msgdma_reset() only logs a timeout and then
> continues to enable the controller and mark it idle.
>
> If the reset bit never clears, the driver can still register a DMA
> engine backed by a controller that did not leave reset. Return the
> readl_poll_timeout() error from msgdma_reset() and abort probe on reset
> failure.
>
> Signed-off-by: Pengpeng Hou <pengpeng@xxxxxxxxxxx>
> ---
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
> drivers/dma/altera-msgdma.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/dma/altera-msgdma.c b/drivers/dma/altera-msgdma.c
> index b46999c81df0..f60a4e86a246 100644
> --- a/drivers/dma/altera-msgdma.c
> +++ b/drivers/dma/altera-msgdma.c
> @@ -466,7 +466,7 @@ static int msgdma_dma_config(struct dma_chan *dchan,
> return 0;
> }
>
> -static void msgdma_reset(struct msgdma_device *mdev)
> +static int msgdma_reset(struct msgdma_device *mdev)
> {
> u32 val;
> int ret;
> @@ -478,8 +478,10 @@ static void msgdma_reset(struct msgdma_device *mdev)
> ret = readl_poll_timeout(mdev->csr + MSGDMA_CSR_STATUS, val,
> (val & MSGDMA_CSR_STAT_RESETTING) == 0,
> 1, 10000);
> - if (ret)
> + if (ret) {
> dev_err(mdev->dev, "DMA channel did not reset\n");
> + return ret;
> + }
>
> /* Clear all status bits */
> iowrite32(MSGDMA_CSR_STAT_MASK, mdev->csr + MSGDMA_CSR_STATUS);
> @@ -489,6 +491,7 @@ static void msgdma_reset(struct msgdma_device *mdev)
> MSGDMA_CSR_CTL_GLOBAL_INTR, mdev->csr + MSGDMA_CSR_CONTROL);
>
> mdev->idle = true;
> + return 0;
> };
>
> static void msgdma_copy_one(struct msgdma_device *mdev,
> @@ -896,7 +899,9 @@ static int msgdma_probe(struct platform_device *pdev)
> goto fail;
> }
>
> - msgdma_reset(mdev);
> + ret = msgdma_reset(mdev);
> + if (ret)
> + goto fail;
>
> ret = dma_async_device_register(dma_dev);
> if (ret)
> --
> 2.50.1 (Apple Git-155)
>