[PATCHv2 8/8] ata: sata_dwc_460ex: use devm for old DMA resource lifetime management
Rosen Penev <[email protected]>
| Newsgroups | org.kernel.vger.linux-ide,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Convert sata_dwc_dma_exit_old() to a devm action callback and register it via devm_add_action_or_reset() after dw_dma_probe() succeeds. This lets the devm framework handle DMA controller teardown automatically on probe failure and driver removal. As a result the probe function can use plain return-on-error for all failure paths - the dma_initialized flag, the goto labels, and the explicit sata_dwc_dma_exit_old() call in sata_dwc_remove() are all eliminated. Assisted-by: opencode:big-pickle Signed-off-by: Rosen Penev <[email protected]> --- drivers/ata/sata_dwc_460ex.c | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c index e8e2790be1d6..352cd7f02163 100644 --- a/drivers/ata/sata_dwc_460ex.c +++ b/drivers/ata/sata_dwc_460ex.c @@ -222,10 +222,18 @@ static int sata_dwc_dma_get_channel_old(struct sata_dwc_device_port *hsdevp) return 0; } +static void sata_dwc_dma_exit_old(void *data) +{ + struct sata_dwc_device *hsdev = data; + + dw_dma_remove(hsdev->dma); +} + static int sata_dwc_dma_init_old(struct platform_device *pdev, struct sata_dwc_device *hsdev) { struct device *dev = &pdev->dev; + int err; hsdev->dma = devm_kzalloc(dev, sizeof(*hsdev->dma), GFP_KERNEL); if (!hsdev->dma) @@ -245,15 +253,11 @@ static int sata_dwc_dma_init_old(struct platform_device *pdev, return PTR_ERR(hsdev->dma->regs); /* Initialize AHB DMAC */ - return dw_dma_probe(hsdev->dma); -} - -static void sata_dwc_dma_exit_old(struct sata_dwc_device *hsdev) -{ - if (!hsdev->dma) - return; + err = dw_dma_probe(hsdev->dma); + if (err) + return err; - dw_dma_remove(hsdev->dma); + return devm_add_action_or_reset(dev, sata_dwc_dma_exit_old, hsdev); } #endif @@ -1203,19 +1207,12 @@ static int sata_dwc_probe(struct platform_device *ofdev) err = ata_host_activate(host, irq, sata_dwc_isr, 0, &sata_dwc_sht); if (err) { dev_err(dev, "failed to activate host"); - goto error_out; + return err; } /* Enable SATA Interrupts */ sata_dwc_enable_interrupts(hsdev); return 0; - -error_out: -#ifdef CONFIG_SATA_DWC_OLD_DMA - if (!device_property_present(dev, "dmas")) - sata_dwc_dma_exit_old(hsdev); -#endif - return err; } static void sata_dwc_remove(struct platform_device *ofdev) @@ -1228,11 +1225,6 @@ static void sata_dwc_remove(struct platform_device *ofdev) ata_host_detach(host); -#ifdef CONFIG_SATA_DWC_OLD_DMA - /* Free SATA DMA resources */ - sata_dwc_dma_exit_old(hsdev); -#endif - dev_dbg(dev, "done\n"); } -- 2.55.0