MLK-12669-2 dma: pxp-v3: add 'ipg' and 'axi' clocks
authorFancy Fang <chen.fang@nxp.com>
Mon, 18 Apr 2016 03:01:28 +0000 (11:01 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 19:51:49 +0000 (14:51 -0500)
Add 'ipg' and 'axi' clocks for pxp which should
be used to control runtime power managments.

Signed-off-by: Fancy Fang <chen.fang@nxp.com>
arch/arm/boot/dts/imx7d.dtsi
drivers/dma/pxp/pxp_dma_v3.c

index 34adad8..9637079 100644 (file)
                interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
                        <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
                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";
        };
 
index 4857c20..085f1aa 100644 (file)
@@ -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));