Commit 779a4483 authored by Nuno Sa's avatar Nuno Sa Committed by Vinod Koul

dmaengine: axi-dmac: move to device managed probe

In axi_dmac_probe(), there's a mix in using device managed APIs and
explicitly cleaning things in the driver .remove() hook. Move to use
device managed APIs and thus drop the .remove() hook.
Signed-off-by: default avatarNuno Sa <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20240328-axi-dmac-devm-probe-v3-2-523c0176df70@analog.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 1bc31444
...@@ -1002,6 +1002,16 @@ static int axi_dmac_detect_caps(struct axi_dmac *dmac, unsigned int version) ...@@ -1002,6 +1002,16 @@ static int axi_dmac_detect_caps(struct axi_dmac *dmac, unsigned int version)
return 0; return 0;
} }
static void axi_dmac_tasklet_kill(void *task)
{
tasklet_kill(task);
}
static void axi_dmac_free_dma_controller(void *of_node)
{
of_dma_controller_free(of_node);
}
static int axi_dmac_probe(struct platform_device *pdev) static int axi_dmac_probe(struct platform_device *pdev)
{ {
struct dma_device *dma_dev; struct dma_device *dma_dev;
...@@ -1025,14 +1035,10 @@ static int axi_dmac_probe(struct platform_device *pdev) ...@@ -1025,14 +1035,10 @@ static int axi_dmac_probe(struct platform_device *pdev)
if (IS_ERR(dmac->base)) if (IS_ERR(dmac->base))
return PTR_ERR(dmac->base); return PTR_ERR(dmac->base);
dmac->clk = devm_clk_get(&pdev->dev, NULL); dmac->clk = devm_clk_get_enabled(&pdev->dev, NULL);
if (IS_ERR(dmac->clk)) if (IS_ERR(dmac->clk))
return PTR_ERR(dmac->clk); return PTR_ERR(dmac->clk);
ret = clk_prepare_enable(dmac->clk);
if (ret < 0)
return ret;
version = axi_dmac_read(dmac, ADI_AXI_REG_VERSION); version = axi_dmac_read(dmac, ADI_AXI_REG_VERSION);
if (version >= ADI_AXI_PCORE_VER(4, 3, 'a')) if (version >= ADI_AXI_PCORE_VER(4, 3, 'a'))
...@@ -1041,7 +1047,7 @@ static int axi_dmac_probe(struct platform_device *pdev) ...@@ -1041,7 +1047,7 @@ static int axi_dmac_probe(struct platform_device *pdev)
ret = axi_dmac_parse_dt(&pdev->dev, dmac); ret = axi_dmac_parse_dt(&pdev->dev, dmac);
if (ret < 0) if (ret < 0)
goto err_clk_disable; return ret;
INIT_LIST_HEAD(&dmac->chan.active_descs); INIT_LIST_HEAD(&dmac->chan.active_descs);
...@@ -1072,7 +1078,7 @@ static int axi_dmac_probe(struct platform_device *pdev) ...@@ -1072,7 +1078,7 @@ static int axi_dmac_probe(struct platform_device *pdev)
ret = axi_dmac_detect_caps(dmac, version); ret = axi_dmac_detect_caps(dmac, version);
if (ret) if (ret)
goto err_clk_disable; return ret;
dma_dev->copy_align = (dmac->chan.address_align_mask + 1); dma_dev->copy_align = (dmac->chan.address_align_mask + 1);
...@@ -1088,57 +1094,42 @@ static int axi_dmac_probe(struct platform_device *pdev) ...@@ -1088,57 +1094,42 @@ static int axi_dmac_probe(struct platform_device *pdev)
!AXI_DMAC_DST_COHERENT_GET(ret)) { !AXI_DMAC_DST_COHERENT_GET(ret)) {
dev_err(dmac->dma_dev.dev, dev_err(dmac->dma_dev.dev,
"Coherent DMA not supported in hardware"); "Coherent DMA not supported in hardware");
ret = -EINVAL; return -EINVAL;
goto err_clk_disable;
} }
} }
ret = dma_async_device_register(dma_dev); ret = dmaenginem_async_device_register(dma_dev);
if (ret)
return ret;
/*
* Put the action in here so it get's done before unregistering the DMA
* device.
*/
ret = devm_add_action_or_reset(&pdev->dev, axi_dmac_tasklet_kill,
&dmac->chan.vchan.task);
if (ret) if (ret)
goto err_clk_disable; return ret;
ret = of_dma_controller_register(pdev->dev.of_node, ret = of_dma_controller_register(pdev->dev.of_node,
of_dma_xlate_by_chan_id, dma_dev); of_dma_xlate_by_chan_id, dma_dev);
if (ret) if (ret)
goto err_unregister_device; return ret;
ret = request_irq(dmac->irq, axi_dmac_interrupt_handler, IRQF_SHARED, ret = devm_add_action_or_reset(&pdev->dev, axi_dmac_free_dma_controller,
dev_name(&pdev->dev), dmac); pdev->dev.of_node);
if (ret) if (ret)
goto err_unregister_of; return ret;
platform_set_drvdata(pdev, dmac); ret = devm_request_irq(&pdev->dev, dmac->irq, axi_dmac_interrupt_handler,
IRQF_SHARED, dev_name(&pdev->dev), dmac);
if (ret)
return ret;
regmap = devm_regmap_init_mmio(&pdev->dev, dmac->base, regmap = devm_regmap_init_mmio(&pdev->dev, dmac->base,
&axi_dmac_regmap_config); &axi_dmac_regmap_config);
if (IS_ERR(regmap)) {
ret = PTR_ERR(regmap);
goto err_free_irq;
}
return 0;
err_free_irq:
free_irq(dmac->irq, dmac);
err_unregister_of:
of_dma_controller_free(pdev->dev.of_node);
err_unregister_device:
dma_async_device_unregister(&dmac->dma_dev);
err_clk_disable:
clk_disable_unprepare(dmac->clk);
return ret;
}
static void axi_dmac_remove(struct platform_device *pdev)
{
struct axi_dmac *dmac = platform_get_drvdata(pdev);
free_irq(dmac->irq, dmac); return PTR_ERR_OR_ZERO(regmap);
of_dma_controller_free(pdev->dev.of_node);
tasklet_kill(&dmac->chan.vchan.task);
dma_async_device_unregister(&dmac->dma_dev);
clk_disable_unprepare(dmac->clk);
} }
static const struct of_device_id axi_dmac_of_match_table[] = { static const struct of_device_id axi_dmac_of_match_table[] = {
...@@ -1153,7 +1144,6 @@ static struct platform_driver axi_dmac_driver = { ...@@ -1153,7 +1144,6 @@ static struct platform_driver axi_dmac_driver = {
.of_match_table = axi_dmac_of_match_table, .of_match_table = axi_dmac_of_match_table,
}, },
.probe = axi_dmac_probe, .probe = axi_dmac_probe,
.remove_new = axi_dmac_remove,
}; };
module_platform_driver(axi_dmac_driver); module_platform_driver(axi_dmac_driver);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment