From a33cbb41347eabce03851c07e319897324d3dca1 Mon Sep 17 00:00:00 2001 From: Fancy Fang Date: Mon, 18 Apr 2016 11:01:28 +0800 Subject: [PATCH] MLK-12669-2 dma: pxp-v3: add 'ipg' and 'axi' clocks Add 'ipg' and 'axi' clocks for pxp which should be used to control runtime power managments. Signed-off-by: Fancy Fang --- arch/arm/boot/dts/imx7d.dtsi | 4 ++-- drivers/dma/pxp/pxp_dma_v3.c | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/arch/arm/boot/dts/imx7d.dtsi b/arch/arm/boot/dts/imx7d.dtsi index 34adad87eeb7..96370793ce46 100644 --- a/arch/arm/boot/dts/imx7d.dtsi +++ b/arch/arm/boot/dts/imx7d.dtsi @@ -335,8 +335,8 @@ interrupts = , ; reg = <0x30700000 0x10000>; - clocks = <&clks IMX7D_CLK_DUMMY>; - clock-names = "pxp-axi"; + clocks = <&clks IMX7D_PXP_IPG_CLK>, <&clks IMX7D_PXP_AXI_CLK>; + clock-names = "pxp_ipg", "pxp-axi"; status = "disabled"; }; diff --git a/drivers/dma/pxp/pxp_dma_v3.c b/drivers/dma/pxp/pxp_dma_v3.c index 4857c20dd443..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); @@ -4311,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); @@ -4386,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)); -- 2.17.1