* Add device tree (DT) property ("pl330,dma-memcpy") for DMA_MEMCPY capability and instead of setting this capability unconditionally in pl330_probe() do it only when property is present. * Set the new "pl330,dma-memcpy" device tree property for all current pl330 driver users except pdma controllers on ARM EXYNOS platforms (so the DT case matches non-DT one). It fixes the issue on ARM EXYNOS platforms using DT where pdma controller erroneously was used for DMA_MEMCPY operations instead of mdma one (it surprisingly seems to work but at the cost of worse performance). Cc: Jassi Brar <jassisinghbrar@xxxxxxxxx> Cc: Vinod Koul <vinod.koul@xxxxxxxxx> Cc: Kukjin Kim <kgene.kim@xxxxxxxxxxx> Cc: Rob Herring <rob.herring@xxxxxxxxxxx> Cc: Dinh Nguyen <dinguyen@xxxxxxxxxx> Cc: Pawel Moll <pawel.moll@xxxxxxx> Cc: Tomasz Figa <t.figa@xxxxxxxxxxx> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@xxxxxxxxxxx> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> --- Documentation/devicetree/bindings/dma/arm-pl330.txt | 1 + arch/arm/boot/dts/exynos4.dtsi | 1 + arch/arm/boot/dts/exynos5250.dtsi | 2 ++ arch/arm/boot/dts/highbank.dts | 1 + arch/arm/boot/dts/socfpga.dtsi | 1 + arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts | 1 + arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts | 1 + drivers/dma/pl330.c | 11 ++++++++--- 8 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/dma/arm-pl330.txt b/Documentation/devicetree/bindings/dma/arm-pl330.txt index 36e27d5..2661c7b 100644 --- a/Documentation/devicetree/bindings/dma/arm-pl330.txt +++ b/Documentation/devicetree/bindings/dma/arm-pl330.txt @@ -11,6 +11,7 @@ Required properties: Optional properties: - dma-coherent : Present if dma operations are coherent +- pl330,dma-memcpy : Present if controller has DMA_MEMCPY capability Example: diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi index 96d4462..ce5b03f 100644 --- a/arch/arm/boot/dts/exynos4.dtsi +++ b/arch/arm/boot/dts/exynos4.dtsi @@ -249,6 +249,7 @@ compatible = "arm,pl330", "arm,primecell"; reg = <0x12850000 0x1000>; interrupts = <0 34 0>; + pl330,dma-memcpy; }; }; }; diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 49546bc..d659e7b 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi @@ -247,12 +247,14 @@ compatible = "arm,pl330", "arm,primecell"; reg = <0x10800000 0x1000>; interrupts = <0 33 0>; + pl330,dma-memcpy; }; mdma1: mdma@11C10000 { compatible = "arm,pl330", "arm,primecell"; reg = <0x11C10000 0x1000>; interrupts = <0 124 0>; + pl330,dma-memcpy; }; }; diff --git a/arch/arm/boot/dts/highbank.dts b/arch/arm/boot/dts/highbank.dts index 0c6fc34..87f1d25 100644 --- a/arch/arm/boot/dts/highbank.dts +++ b/arch/arm/boot/dts/highbank.dts @@ -297,6 +297,7 @@ interrupts = <0 92 4>; clocks = <&pclk>; clock-names = "apb_pclk"; + pl330,dma-memcpy; }; ethernet@fff50000 { diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi index 0772f57..2fe1697 100644 --- a/arch/arm/boot/dts/socfpga.dtsi +++ b/arch/arm/boot/dts/socfpga.dtsi @@ -71,6 +71,7 @@ compatible = "arm,pl330", "arm,primecell"; reg = <0xffe01000 0x1000>; interrupts = <0 180 4>; + pl330,dma-memcpy; }; }; diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts index d12b34c..d82953c 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts @@ -94,6 +94,7 @@ <0 89 4>, <0 90 4>, <0 91 4>; + pl330,dma-memcpy; }; timer { diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts index 4890a81..b9e6ba2 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts @@ -114,6 +114,7 @@ <0 89 4>, <0 90 4>, <0 91 4>; + pl330,dma-memcpy; }; timer { diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index db7574b..e10290b 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -2860,6 +2860,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) struct pl330_info *pi; struct dma_device *pd; struct resource *res; + struct device_node *node; int i, ret, irq; int num_chan; @@ -2921,12 +2922,14 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) goto probe_err4; } + node = adev->dev.of_node; + for (i = 0; i < num_chan; i++) { pch = &pdmac->peripherals[i]; - if (!adev->dev.of_node) + if (!node) pch->chan.private = pdat ? &pdat->peri_id[i] : NULL; else - pch->chan.private = adev->dev.of_node; + pch->chan.private = node; INIT_LIST_HEAD(&pch->work_list); spin_lock_init(&pch->lock); @@ -2942,7 +2945,9 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) if (pdat) { pd->cap_mask = pdat->cap_mask; } else { - dma_cap_set(DMA_MEMCPY, pd->cap_mask); + if (adev->dev.of_node && + of_find_property(node, "pl330,dma-memcpy", NULL)) + dma_cap_set(DMA_MEMCPY, pd->cap_mask); if (pi->pcfg.num_peri) { dma_cap_set(DMA_SLAVE, pd->cap_mask); dma_cap_set(DMA_CYCLIC, pd->cap_mask); -- 1.8.0 -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html