Commit 0b94c577 authored by Padmavathi Venna's avatar Padmavathi Venna Committed by Vinod Koul

DMA: PL330: Add check if device tree compatible

This patch register the dma controller with generic dma helpers only
in DT case. This also adds some extra error handling in the driver.
Signed-off-by: default avatarPadmavathi Venna <padma.v@samsung.com>
Reported-by: default avatarSachin Kamat <sachin.kamat@linaro.org>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
parent 07961ac7
...@@ -2882,7 +2882,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -2882,7 +2882,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
{ {
struct dma_pl330_platdata *pdat; struct dma_pl330_platdata *pdat;
struct dma_pl330_dmac *pdmac; struct dma_pl330_dmac *pdmac;
struct dma_pl330_chan *pch; struct dma_pl330_chan *pch, *_p;
struct pl330_info *pi; struct pl330_info *pi;
struct dma_device *pd; struct dma_device *pd;
struct resource *res; struct resource *res;
...@@ -2984,7 +2984,16 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -2984,7 +2984,16 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
ret = dma_async_device_register(pd); ret = dma_async_device_register(pd);
if (ret) { if (ret) {
dev_err(&adev->dev, "unable to register DMAC\n"); dev_err(&adev->dev, "unable to register DMAC\n");
goto probe_err2; goto probe_err3;
}
if (adev->dev.of_node) {
ret = of_dma_controller_register(adev->dev.of_node,
of_dma_pl330_xlate, pdmac);
if (ret) {
dev_err(&adev->dev,
"unable to register DMA to the generic DT DMA helpers\n");
}
} }
dev_info(&adev->dev, dev_info(&adev->dev,
...@@ -2995,16 +3004,21 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -2995,16 +3004,21 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
pi->pcfg.data_bus_width / 8, pi->pcfg.num_chan, pi->pcfg.data_bus_width / 8, pi->pcfg.num_chan,
pi->pcfg.num_peri, pi->pcfg.num_events); pi->pcfg.num_peri, pi->pcfg.num_events);
ret = of_dma_controller_register(adev->dev.of_node,
of_dma_pl330_xlate, pdmac);
if (ret) {
dev_err(&adev->dev,
"unable to register DMA to the generic DT DMA helpers\n");
goto probe_err2;
}
return 0; return 0;
probe_err3:
amba_set_drvdata(adev, NULL);
/* Idle the DMAC */
list_for_each_entry_safe(pch, _p, &pdmac->ddma.channels,
chan.device_node) {
/* Remove the channel */
list_del(&pch->chan.device_node);
/* Flush the channel */
pl330_control(&pch->chan, DMA_TERMINATE_ALL, 0);
pl330_free_chan_resources(&pch->chan);
}
probe_err2: probe_err2:
pl330_del(pi); pl330_del(pi);
probe_err1: probe_err1:
...@@ -3023,8 +3037,10 @@ static int pl330_remove(struct amba_device *adev) ...@@ -3023,8 +3037,10 @@ static int pl330_remove(struct amba_device *adev)
if (!pdmac) if (!pdmac)
return 0; return 0;
of_dma_controller_free(adev->dev.of_node); if (adev->dev.of_node)
of_dma_controller_free(adev->dev.of_node);
dma_async_device_unregister(&pdmac->ddma);
amba_set_drvdata(adev, NULL); amba_set_drvdata(adev, NULL);
/* Idle the DMAC */ /* Idle the DMAC */
......
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