On Sun, Jan 26, 2014 at 10:08:45AM +0800, Barry Song wrote:
> From: Barry Song <[email protected]>
> 
> move to support of_dma_request_slave_channel() and dma_request_slave_channel.
> we add a xlate() to let dma clients be able to find right dma_chan by generic
> "dmas" properties in dts.
> 
> Cc: Mark Rutland <[email protected]>
> Cc: Lars-Peter Clausen <[email protected]>
> Signed-off-by: Barry Song <[email protected]>

I tried applying this but it failed to apply.

Can you pls rebase quickly and resend. While at it pls add the Acks recived!

-- 
~Vinod

> ---
>  -v5:
>  add Acked-by: [email protected];
>  cc devicetree guys as Acked from dt was required
> 
>  .../devicetree/bindings/dma/sirfsoc-dma.txt        |   43 
> ++++++++++++++++++++
>  arch/arm/boot/dts/atlas6.dtsi                      |    2 +
>  arch/arm/boot/dts/prima2.dtsi                      |    2 +
>  drivers/dma/sirf-dma.c                             |   23 ++++++++++
>  4 files changed, 70 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/dma/sirfsoc-dma.txt
> 
> diff --git a/Documentation/devicetree/bindings/dma/sirfsoc-dma.txt 
> b/Documentation/devicetree/bindings/dma/sirfsoc-dma.txt
> new file mode 100644
> index 0000000..ecbc96a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/dma/sirfsoc-dma.txt
> @@ -0,0 +1,43 @@
> +* CSR SiRFSoC DMA controller
> +
> +See dma.txt first
> +
> +Required properties:
> +- compatible: Should be "sirf,prima2-dmac" or "sirf,marco-dmac"
> +- reg: Should contain DMA registers location and length.
> +- interrupts: Should contain one interrupt shared by all channel
> +- #dma-cells: must be <1>. used to represent the number of integer
> +    cells in the dmas property of client device.
> +- clocks: clock required
> +
> +Example:
> +
> +Controller:
> +dmac0: dma-controller@b00b0000 {
> +     compatible = "sirf,prima2-dmac";
> +     reg = <0xb00b0000 0x10000>;
> +     interrupts = <12>;
> +     clocks = <&clks 24>;
> +     #dma-cells = <1>;
> +};
> +
> +
> +Client:
> +Fill the specific dma request line in dmas. In the below example, spi0 read
> +channel request line is 9 of the 2nd dma controller, while write channel uses
> +4 of the 2nd dma controller; spi1 read channel request line is 12 of the 1st
> +dma controller, while write channel uses 13 of the 1st dma controller:
> +
> +spi0: spi@b00d0000 {
> +     compatible = "sirf,prima2-spi";
> +     dmas = <&dmac1 9>,
> +             <&dmac1 4>;
> +     dma-names = "rx", "tx";
> +};
> +
> +spi1: spi@b0170000 {
> +     compatible = "sirf,prima2-spi";
> +     dmas = <&dmac0 12>,
> +             <&dmac0 13>;
> +     dma-names = "rx", "tx";
> +};
> diff --git a/arch/arm/boot/dts/atlas6.dtsi b/arch/arm/boot/dts/atlas6.dtsi
> index b63cfef..4f41f0a 100644
> --- a/arch/arm/boot/dts/atlas6.dtsi
> +++ b/arch/arm/boot/dts/atlas6.dtsi
> @@ -260,6 +260,7 @@
>                               reg = <0xb00b0000 0x10000>;
>                               interrupts = <12>;
>                               clocks = <&clks 24>;
> +                             #dma-cells = <1>;
>                       };
>  
>                       dmac1: dma-controller@b0160000 {
> @@ -268,6 +269,7 @@
>                               reg = <0xb0160000 0x10000>;
>                               interrupts = <13>;
>                               clocks = <&clks 25>;
> +                             #dma-cells = <1>;
>                       };
>  
>                       vip@b00C0000 {
> diff --git a/arch/arm/boot/dts/prima2.dtsi b/arch/arm/boot/dts/prima2.dtsi
> index b292a5c..19e4e22 100644
> --- a/arch/arm/boot/dts/prima2.dtsi
> +++ b/arch/arm/boot/dts/prima2.dtsi
> @@ -277,6 +277,7 @@
>                               reg = <0xb00b0000 0x10000>;
>                               interrupts = <12>;
>                               clocks = <&clks 24>;
> +                             #dma-cells = <1>;
>                       };
>  
>                       dmac1: dma-controller@b0160000 {
> @@ -285,6 +286,7 @@
>                               reg = <0xb0160000 0x10000>;
>                               interrupts = <13>;
>                               clocks = <&clks 25>;
> +                             #dma-cells = <1>;
>                       };
>  
>                       vip@b00C0000 {
> diff --git a/drivers/dma/sirf-dma.c b/drivers/dma/sirf-dma.c
> index 6aec3ad..8b74c0d 100644
> --- a/drivers/dma/sirf-dma.c
> +++ b/drivers/dma/sirf-dma.c
> @@ -18,6 +18,7 @@
>  #include <linux/of_device.h>
>  #include <linux/of_platform.h>
>  #include <linux/clk.h>
> +#include <linux/of_dma.h>
>  #include <linux/sirfsoc_dma.h>
>  
>  #include "dmaengine.h"
> @@ -640,6 +641,18 @@ bool sirfsoc_dma_filter_id(struct dma_chan *chan, void 
> *chan_id)
>  }
>  EXPORT_SYMBOL(sirfsoc_dma_filter_id);
>  
> +static struct dma_chan *of_dma_sirfsoc_xlate(struct of_phandle_args 
> *dma_spec,
> +     struct of_dma *ofdma)
> +{
> +     struct sirfsoc_dma *sdma = ofdma->of_dma_data;
> +     unsigned int request = dma_spec->args[0];
> +
> +     if (request > SIRFSOC_DMA_CHANNELS)
> +             return NULL;
> +
> +     return dma_get_slave_channel(&sdma->channels[request].chan);
> +}
> +
>  static int sirfsoc_dma_probe(struct platform_device *op)
>  {
>       struct device_node *dn = op->dev.of_node;
> @@ -744,11 +757,20 @@ static int sirfsoc_dma_probe(struct platform_device *op)
>       if (ret)
>               goto free_irq;
>  
> +     /* Device-tree DMA controller registration */
> +     ret = of_dma_controller_register(dn, of_dma_sirfsoc_xlate, sdma);
> +     if (ret) {
> +             dev_err(dev, "failed to register DMA controller\n");
> +             goto unreg_dma_dev;
> +     }
> +
>       pm_runtime_enable(&op->dev);
>       dev_info(dev, "initialized SIRFSOC DMAC driver\n");
>  
>       return 0;
>  
> +unreg_dma_dev:
> +     dma_async_device_unregister(dma);
>  free_irq:
>       free_irq(sdma->irq, sdma);
>  irq_dispose:
> @@ -761,6 +783,7 @@ static int sirfsoc_dma_remove(struct platform_device *op)
>       struct device *dev = &op->dev;
>       struct sirfsoc_dma *sdma = dev_get_drvdata(dev);
>  
> +     of_dma_controller_free(op->dev.of_node);
>       dma_async_device_unregister(&sdma->dma);
>       free_irq(sdma->irq, sdma);
>       irq_dispose_mapping(sdma->irq);
> -- 
> 1.7.5.4
> 
> 

-- 
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to