summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFancy Fang <chen.fang@nxp.com>2016-04-18 11:01:28 +0800
committerFrank Li <Frank.Li@nxp.com>2016-05-23 15:04:20 -0500
commit3455774b8d912721a81e46e7a7acb353ddc2ff85 (patch)
treee0164f1a19342a239ad8ffee2cd9646f0c9f413c
parent9e04de3451adc465dc239d91778cb79c95ef9f99 (diff)
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 <chen.fang@nxp.com>
-rw-r--r--arch/arm/boot/dts/imx7d.dtsi4
-rw-r--r--drivers/dma/pxp/pxp_dma_v3.c21
2 files changed, 18 insertions, 7 deletions
diff --git a/arch/arm/boot/dts/imx7d.dtsi b/arch/arm/boot/dts/imx7d.dtsi
index 5727cc0d7f12..e3fe8d860552 100644
--- a/arch/arm/boot/dts/imx7d.dtsi
+++ b/arch/arm/boot/dts/imx7d.dtsi
@@ -844,8 +844,8 @@
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";
};
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));