Message ID | 1366812273-10833-3-git-send-email-shawn.guo@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Apr 24, 2013 at 11:04 AM, Shawn Guo <shawn.guo@linaro.org> wrote: > +ssi2: ssi@70014000 { > + compatible = "fsl,imx51-ssi", "fsl,imx21-ssi"; > + reg = <0x70014000 0x4000>; > + interrupts = <30>; > + clocks = <&clks 49>; > + dmas = <&sdma 24 DMA_PRIO_HIGH IMX_DMATYPE_SSI_SP>, > + <&sdma 25 DMA_PRIO_HIGH IMX_DMATYPE_SSI_SP>; The document says: "third cell specifies the peripheral type and priority of DMA transfer respectively" ,but what I see in this example is the opposite: priority of DMA and then peripheral type.
On Wednesday 24 April 2013, Shawn Guo wrote: > +/* > + * This enumerates peripheral types. Used for SDMA. > + */ > +#define IMX_DMATYPE_SSI 0 /* MCU domain SSI */ > +#define IMX_DMATYPE_SSI_SP 1 /* Shared SSI */ > +#define IMX_DMATYPE_MMC 2 /* MMC */ > +#define IMX_DMATYPE_SDHC 3 /* SDHC */ > +#define IMX_DMATYPE_UART 4 /* MCU domain UART */ > +#define IMX_DMATYPE_UART_SP 5 /* Shared UART */ > +#define IMX_DMATYPE_FIRI 6 /* FIRI */ > +#define IMX_DMATYPE_CSPI 7 /* MCU domain CSPI */ > +#define IMX_DMATYPE_CSPI_SP 8 /* Shared CSPI */ > +#define IMX_DMATYPE_SIM 9 /* SIM */ > +#define IMX_DMATYPE_ATA 10 /* ATA */ > +#define IMX_DMATYPE_CCM 11 /* CCM */ > +#define IMX_DMATYPE_EXT 12 /* External peripheral */ > +#define IMX_DMATYPE_MSHC 13 /* Memory Stick Host Controller */ > +#define IMX_DMATYPE_MSHC_SP 14 /* Shared Memory Stick Host Controller */ > +#define IMX_DMATYPE_DSP 15 /* DSP */ > +#define IMX_DMATYPE_MEMORY 16 /* Memory */ > +#define IMX_DMATYPE_FIFO_MEMORY 17 /* FIFO type Memory */ > +#define IMX_DMATYPE_SPDIF 18 /* SPDIF */ > +#define IMX_DMATYPE_IPU_MEMORY 19 /* IPU Memory */ > +#define IMX_DMATYPE_ASRC 20 /* ASRC */ > +#define IMX_DMATYPE_ESAI 21 /* ESAI */ These macros don't seem helpful to me, since they are used in only one place each. Why not put the literal numbers into the dts file directly? Arnd
On Wed, Apr 24, 2013 at 11:23:04AM -0300, Fabio Estevam wrote: > On Wed, Apr 24, 2013 at 11:04 AM, Shawn Guo <shawn.guo@linaro.org> wrote: > > > +ssi2: ssi@70014000 { > > + compatible = "fsl,imx51-ssi", "fsl,imx21-ssi"; > > + reg = <0x70014000 0x4000>; > > + interrupts = <30>; > > + clocks = <&clks 49>; > > + dmas = <&sdma 24 DMA_PRIO_HIGH IMX_DMATYPE_SSI_SP>, > > + <&sdma 25 DMA_PRIO_HIGH IMX_DMATYPE_SSI_SP>; > > The document says: > "third cell specifies the peripheral type and priority of DMA transfer > respectively" > > ,but what I see in this example is the opposite: > > priority of DMA and then peripheral type. Ah, yes. Will fix it. Thanks. Shawn
On Wed, Apr 24, 2013 at 04:26:22PM +0200, Arnd Bergmann wrote: > On Wednesday 24 April 2013, Shawn Guo wrote: > > +/* > > + * This enumerates peripheral types. Used for SDMA. > > + */ > > +#define IMX_DMATYPE_SSI 0 /* MCU domain SSI */ > > +#define IMX_DMATYPE_SSI_SP 1 /* Shared SSI */ > > +#define IMX_DMATYPE_MMC 2 /* MMC */ > > +#define IMX_DMATYPE_SDHC 3 /* SDHC */ > > +#define IMX_DMATYPE_UART 4 /* MCU domain UART */ > > +#define IMX_DMATYPE_UART_SP 5 /* Shared UART */ > > +#define IMX_DMATYPE_FIRI 6 /* FIRI */ > > +#define IMX_DMATYPE_CSPI 7 /* MCU domain CSPI */ > > +#define IMX_DMATYPE_CSPI_SP 8 /* Shared CSPI */ > > +#define IMX_DMATYPE_SIM 9 /* SIM */ > > +#define IMX_DMATYPE_ATA 10 /* ATA */ > > +#define IMX_DMATYPE_CCM 11 /* CCM */ > > +#define IMX_DMATYPE_EXT 12 /* External peripheral */ > > +#define IMX_DMATYPE_MSHC 13 /* Memory Stick Host Controller */ > > +#define IMX_DMATYPE_MSHC_SP 14 /* Shared Memory Stick Host Controller */ > > +#define IMX_DMATYPE_DSP 15 /* DSP */ > > +#define IMX_DMATYPE_MEMORY 16 /* Memory */ > > +#define IMX_DMATYPE_FIFO_MEMORY 17 /* FIFO type Memory */ > > +#define IMX_DMATYPE_SPDIF 18 /* SPDIF */ > > +#define IMX_DMATYPE_IPU_MEMORY 19 /* IPU Memory */ > > +#define IMX_DMATYPE_ASRC 20 /* ASRC */ > > +#define IMX_DMATYPE_ESAI 21 /* ESAI */ > > These macros don't seem helpful to me, since they are used in only one > place each. Why not put the literal numbers into the dts file directly? Using macros will help us to: 1) Improve the readability of "dmas" property in dts 2) Keep the values stay in sync between kernel and DT Shawn
On Wednesday 24 April 2013, Shawn Guo wrote: > Using macros will help us to: > > 1) Improve the readability of "dmas" property in dts > 2) Keep the values stay in sync between kernel and DT > I can understand the second part, but I strongly disagree on the first one. Using symbolic constants in the DT will make it harder to understand because you now have to look in multiple places to see what you actually put in there. It makes some sense for the priorities, since they get reused for each dma specifier. Arnd
On Wed, Apr 24, 2013 at 04:52:48PM +0200, Arnd Bergmann wrote: > On Wednesday 24 April 2013, Shawn Guo wrote: > > Using macros will help us to: > > > > 1) Improve the readability of "dmas" property in dts > > 2) Keep the values stay in sync between kernel and DT > > > > I can understand the second part, but I strongly disagree on the first one. > Using symbolic constants in the DT will make it harder to understand because > you now have to look in multiple places to see what you actually put in there. So for example below, I did not use macro for the first cell which is the DMA request ID, because it's unique for each peripheral. But IMX_DMATYPE_SSI_SP will be applied on all 3 SSI controllers on imx51 for 6 times (rx and tx). dmas = <&sdma 24 IMX_DMATYPE_SSI_SP DMA_PRIO_HIGH>, <&sdma 25 IMX_DMATYPE_SSI_SP DMA_PRIO_HIGH>; dma-names = "rx", "tx"; Shawn > It makes some sense for the priorities, since they get reused for each > dma specifier.
diff --git a/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt b/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt index d1e3f44..053e20e 100644 --- a/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt +++ b/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt @@ -4,6 +4,11 @@ Required properties: - compatible : Should be "fsl,<chip>-sdma" - reg : Should contain SDMA registers location and length - interrupts : Should contain SDMA interrupt +- #dma-cells : Must be <3>. + The first cell specifies the DMA request/event ID. The second and + third cell specifies the peripheral type and priority of DMA transfer + respectively. Refer to include/dt-bindings/dma/imx.h for available + peripheral types and priorities. - fsl,sdma-ram-script-name : Should contain the full path of SDMA RAM scripts firmware @@ -13,5 +18,22 @@ sdma@83fb0000 { compatible = "fsl,imx51-sdma", "fsl,imx35-sdma"; reg = <0x83fb0000 0x4000>; interrupts = <6>; + #dma-cells = <3>; fsl,sdma-ram-script-name = "sdma-imx51.bin"; }; + +DMA clients connected to the i.MX SDMA controller must use the format +described in the dma.txt file. + +Examples: + +ssi2: ssi@70014000 { + compatible = "fsl,imx51-ssi", "fsl,imx21-ssi"; + reg = <0x70014000 0x4000>; + interrupts = <30>; + clocks = <&clks 49>; + dmas = <&sdma 24 DMA_PRIO_HIGH IMX_DMATYPE_SSI_SP>, + <&sdma 25 DMA_PRIO_HIGH IMX_DMATYPE_SSI_SP>; + dma-names = "rx", "tx"; + fsl,fifo-depth = <15>; +}; diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index e57a0c6..f1324da 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c @@ -36,6 +36,7 @@ #include <linux/dmaengine.h> #include <linux/of.h> #include <linux/of_device.h> +#include <linux/of_dma.h> #include <asm/irq.h> #include <linux/platform_data/dma-imx-sdma.h> @@ -1296,6 +1297,35 @@ err_dma_alloc: return ret; } +static bool sdma_filter_fn(struct dma_chan *chan, void *fn_param) +{ + struct imx_dma_data *data = fn_param; + + if (!imx_dma_is_general_purpose(chan)) + return false; + + chan->private = data; + + return true; +} + +struct dma_chan *sdma_xlate(struct of_phandle_args *dma_spec, + struct of_dma *ofdma) +{ + struct sdma_engine *sdma = ofdma->of_dma_data; + dma_cap_mask_t mask = sdma->dma_device.cap_mask; + struct imx_dma_data data; + + if (dma_spec->args_count != 3) + return NULL; + + data.dma_request = dma_spec->args[0]; + data.peripheral_type = dma_spec->args[1]; + data.priority = dma_spec->args[2]; + + return dma_request_channel(mask, sdma_filter_fn, &data); +} + static int __init sdma_probe(struct platform_device *pdev) { const struct of_device_id *of_id = @@ -1443,10 +1473,20 @@ static int __init sdma_probe(struct platform_device *pdev) goto err_init; } + if (np) { + ret = of_dma_controller_register(np, sdma_xlate, sdma); + if (ret) { + dev_err(&pdev->dev, "failed to register controller\n"); + goto err_register; + } + } + dev_info(sdma->dev, "initialized\n"); return 0; +err_register: + dma_async_device_unregister(&sdma->dma_device); err_init: kfree(sdma->script_addrs); err_alloc: diff --git a/include/dt-bindings/dma/imx.h b/include/dt-bindings/dma/imx.h new file mode 100644 index 0000000..d5de68c --- /dev/null +++ b/include/dt-bindings/dma/imx.h @@ -0,0 +1,29 @@ +/* + * This enumerates peripheral types. Used for SDMA. + */ +#define IMX_DMATYPE_SSI 0 /* MCU domain SSI */ +#define IMX_DMATYPE_SSI_SP 1 /* Shared SSI */ +#define IMX_DMATYPE_MMC 2 /* MMC */ +#define IMX_DMATYPE_SDHC 3 /* SDHC */ +#define IMX_DMATYPE_UART 4 /* MCU domain UART */ +#define IMX_DMATYPE_UART_SP 5 /* Shared UART */ +#define IMX_DMATYPE_FIRI 6 /* FIRI */ +#define IMX_DMATYPE_CSPI 7 /* MCU domain CSPI */ +#define IMX_DMATYPE_CSPI_SP 8 /* Shared CSPI */ +#define IMX_DMATYPE_SIM 9 /* SIM */ +#define IMX_DMATYPE_ATA 10 /* ATA */ +#define IMX_DMATYPE_CCM 11 /* CCM */ +#define IMX_DMATYPE_EXT 12 /* External peripheral */ +#define IMX_DMATYPE_MSHC 13 /* Memory Stick Host Controller */ +#define IMX_DMATYPE_MSHC_SP 14 /* Shared Memory Stick Host Controller */ +#define IMX_DMATYPE_DSP 15 /* DSP */ +#define IMX_DMATYPE_MEMORY 16 /* Memory */ +#define IMX_DMATYPE_FIFO_MEMORY 17 /* FIFO type Memory */ +#define IMX_DMATYPE_SPDIF 18 /* SPDIF */ +#define IMX_DMATYPE_IPU_MEMORY 19 /* IPU Memory */ +#define IMX_DMATYPE_ASRC 20 /* ASRC */ +#define IMX_DMATYPE_ESAI 21 /* ESAI */ + +#define DMA_PRIO_HIGH 0 +#define DMA_PRIO_MEDIUM 1 +#define DMA_PRIO_LOW 2 diff --git a/include/linux/platform_data/dma-imx.h b/include/linux/platform_data/dma-imx.h index 8a8a684..33f7eda 100644 --- a/include/linux/platform_data/dma-imx.h +++ b/include/linux/platform_data/dma-imx.h @@ -12,36 +12,7 @@ #include <linux/scatterlist.h> #include <linux/device.h> #include <linux/dmaengine.h> - -/* - * This enumerates peripheral types. Used for SDMA. - */ -#define IMX_DMATYPE_SSI 0 /* MCU domain SSI */ -#define IMX_DMATYPE_SSI_SP 1 /* Shared SSI */ -#define IMX_DMATYPE_MMC 2 /* MMC */ -#define IMX_DMATYPE_SDHC 3 /* SDHC */ -#define IMX_DMATYPE_UART 4 /* MCU domain UART */ -#define IMX_DMATYPE_UART_SP 5 /* Shared UART */ -#define IMX_DMATYPE_FIRI 6 /* FIRI */ -#define IMX_DMATYPE_CSPI 7 /* MCU domain CSPI */ -#define IMX_DMATYPE_CSPI_SP 8 /* Shared CSPI */ -#define IMX_DMATYPE_SIM 9 /* SIM */ -#define IMX_DMATYPE_ATA 10 /* ATA */ -#define IMX_DMATYPE_CCM 11 /* CCM */ -#define IMX_DMATYPE_EXT 12 /* External peripheral */ -#define IMX_DMATYPE_MSHC 13 /* Memory Stick Host Controller */ -#define IMX_DMATYPE_MSHC_SP 14 /* Shared Memory Stick Host Controller */ -#define IMX_DMATYPE_DSP 15 /* DSP */ -#define IMX_DMATYPE_MEMORY 16 /* Memory */ -#define IMX_DMATYPE_FIFO_MEMORY 17 /* FIFO type Memory */ -#define IMX_DMATYPE_SPDIF 18 /* SPDIF */ -#define IMX_DMATYPE_IPU_MEMORY 19 /* IPU Memory */ -#define IMX_DMATYPE_ASRC 20 /* ASRC */ -#define IMX_DMATYPE_ESAI 21 /* ESAI */ - -#define DMA_PRIO_HIGH 0 -#define DMA_PRIO_MEDIUM 1 -#define DMA_PRIO_LOW 2 +#include <dt-bindings/dma/imx.h> struct imx_dma_data { int dma_request; /* DMA request line */
Update imx-sdma driver to adopt generic DMA device tree bindings. It calls of_dma_controller_register() with imx-sdma specific of_dma_xlate to get the generic DMA device tree helper support. The #dma-cells for imx-sdma must be 3, which includes request ID, peripheral type and priority. The definitions of peripheral type and priority get moved into include/dt-bindings/dma/imx.h, so that the macros can also be used in dts files. The existing way of requesting channel, clients directly call dma_request_channel(), still work there, and will be removed after all imx-sdma clients get converted to generic DMA device tree helper. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> --- .../devicetree/bindings/dma/fsl-imx-sdma.txt | 22 +++++++++++ drivers/dma/imx-sdma.c | 40 ++++++++++++++++++++ include/dt-bindings/dma/imx.h | 29 ++++++++++++++ include/linux/platform_data/dma-imx.h | 31 +-------------- 4 files changed, 92 insertions(+), 30 deletions(-) create mode 100644 include/dt-bindings/dma/imx.h