summaryrefslogtreecommitdiff
path: root/drivers/dma/pxp/pxp_dma_v3.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dma/pxp/pxp_dma_v3.c')
-rw-r--r--drivers/dma/pxp/pxp_dma_v3.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/dma/pxp/pxp_dma_v3.c b/drivers/dma/pxp/pxp_dma_v3.c
index f44045084958..085f1aad4b74 100644
--- a/drivers/dma/pxp/pxp_dma_v3.c
+++ b/drivers/dma/pxp/pxp_dma_v3.c
@@ -87,7 +87,8 @@ struct pxp_dma {
struct pxps {
struct platform_device *pdev;
- struct clk *clk;
+ struct clk *ipg_clk;
+ struct clk *axi_clk;
void __iomem *base;
int irq; /* PXP IRQ to the CPU */
@@ -1276,7 +1277,8 @@ static void pxp_clk_enable(struct pxps *pxp)
pm_runtime_get_sync(pxp->dev);
- clk_prepare_enable(pxp->clk);
+ clk_prepare_enable(pxp->ipg_clk);
+ clk_prepare_enable(pxp->axi_clk);
pxp->clk_stat = CLK_STAT_ON;
mutex_unlock(&pxp->clk_mutex);
@@ -1296,7 +1298,8 @@ static void pxp_clk_disable(struct pxps *pxp)
spin_lock_irqsave(&pxp->lock, flags);
if ((pxp->pxp_ongoing == 0) && list_empty(&head)) {
spin_unlock_irqrestore(&pxp->lock, flags);
- clk_disable_unprepare(pxp->clk);
+ clk_disable_unprepare(pxp->ipg_clk);
+ clk_disable_unprepare(pxp->axi_clk);
pxp->clk_stat = CLK_STAT_OFF;
} else
spin_unlock_irqrestore(&pxp->lock, flags);
@@ -1809,6 +1812,8 @@ static void pxp_issue_pending(struct dma_chan *chan)
struct pxps *pxp = to_pxp(pxp_dma);
unsigned long flags0, flags;
+ down(&pxp->sema);
+
spin_lock_irqsave(&pxp->lock, flags0);
spin_lock_irqsave(&pxp_chan->lock, flags);
@@ -1825,7 +1830,6 @@ static void pxp_issue_pending(struct dma_chan *chan)
spin_unlock_irqrestore(&pxp->lock, flags0);
pxp_clk_enable(pxp);
- down(&pxp->sema);
spin_lock_irqsave(&pxp->lock, flags);
pxp->pxp_ongoing = 1;
@@ -4310,7 +4314,14 @@ static int pxp_probe(struct platform_device *pdev)
pxp->pdev = pdev;
- pxp->clk = devm_clk_get(&pdev->dev, "pxp-axi");
+ pxp->ipg_clk = devm_clk_get(&pdev->dev, "pxp_ipg");
+ pxp->axi_clk = devm_clk_get(&pdev->dev, "pxp_axi");
+
+ if (IS_ERR(pxp->ipg_clk) || IS_ERR(pxp->axi_clk)) {
+ dev_err(&pdev->dev, "pxp clocks invalid\n");
+ err = -EINVAL;
+ goto exit;
+ }
err = devm_request_irq(&pdev->dev, pxp->irq, pxp_irq, 0,
"pxp-dmaengine", pxp);
@@ -4385,7 +4396,8 @@ static int pxp_remove(struct platform_device *pdev)
unregister_pxp_device();
cancel_work_sync(&pxp->work);
del_timer_sync(&pxp->clk_timer);
- clk_disable_unprepare(pxp->clk);
+ clk_disable_unprepare(pxp->ipg_clk);
+ clk_disable_unprepare(pxp->axi_clk);
device_remove_file(&pdev->dev, &dev_attr_clk_off_timeout);
device_remove_file(&pdev->dev, &dev_attr_block_size);
dma_async_device_unregister(&(pxp->pxp_dma.dma));