* [PATCH RESEND v5 0/2] dma: imx-dma: OFTree support @ 2013-04-18 13:21 Markus Pargmann [not found] ` <1366291298-30004-1-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 2013-04-18 14:44 ` [PATCH RESEND v5 0/2] dma: imx-dma: OFTree support Shawn Guo 0 siblings, 2 replies; 7+ messages in thread From: Markus Pargmann @ 2013-04-18 13:21 UTC (permalink / raw) To: Vinod Koul Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring, kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Dan Williams, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Hi, this series adds support for the generic DMA DT bindings. Regards, Markus Markus Pargmann (2): dma: imx-dma: Add oftree support DMA: imx-dma: imxdma->dev used uninitialized Documentation/devicetree/bindings/dma/fsl-imx-dma.txt | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ drivers/dma/imx-dma.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- include/linux/platform_data/dma-imx.h | 6 ++---- 3 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 Documentation/devicetree/bindings/dma/fsl-imx-dma.txt ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <1366291298-30004-1-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>]
* [PATCH RESEND v5 1/2] dma: imx-dma: Add oftree support [not found] ` <1366291298-30004-1-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> @ 2013-04-18 13:21 ` Markus Pargmann [not found] ` <1366291298-30004-2-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 2013-04-18 13:21 ` [PATCH RESEND v5 2/2] DMA: imx-dma: imxdma->dev used uninitialized Markus Pargmann 1 sibling, 1 reply; 7+ messages in thread From: Markus Pargmann @ 2013-04-18 13:21 UTC (permalink / raw) To: Vinod Koul Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring, kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Dan Williams, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Adding devicetree support for imx-dma driver. Use driver name for function 'imx_dma_is_general_purpose' because the devicename for devicetree initialized devices is different. Signed-off-by: Markus Pargmann <mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> Reviewed-by: Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org> --- Notes: Changes in V5: - Style fix - Documentation reference Changes in V4: - Directly use "imxdma_channel" as proposed by Arnd. This removes the allocation of imx_dma_data. - Simplify function imx_dma_is_general_purpose using driver names. Changes in V3: - Create a imxdma translate function to pass the device object into the filter function. Changes in V2: - Change the driver to use generic DMA DT bindings. - Add a imx-dma filter function that sets the dma request line in private data. .../devicetree/bindings/dma/fsl-imx-dma.txt | 48 ++++++++++++++ drivers/dma/imx-dma.c | 74 ++++++++++++++++++++++ include/linux/platform_data/dma-imx.h | 6 +- 3 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 Documentation/devicetree/bindings/dma/fsl-imx-dma.txt diff --git a/Documentation/devicetree/bindings/dma/fsl-imx-dma.txt b/Documentation/devicetree/bindings/dma/fsl-imx-dma.txt new file mode 100644 index 0000000..2717ecb --- /dev/null +++ b/Documentation/devicetree/bindings/dma/fsl-imx-dma.txt @@ -0,0 +1,48 @@ +* Freescale Direct Memory Access (DMA) Controller for i.MX + +This document will only describe differences to the generic DMA Controller and +DMA request bindings as described in dma/dma.txt . + +* DMA controller + +Required properties: +- compatible : Should be "fsl,<chip>-dma". chip can be imx1, imx21 or imx27 +- reg : Should contain DMA registers location and length +- interrupts : First item should be DMA interrupt, second one is optional and + should contain DMA Error interrupt +- #dma-cells : Has to be 1. imx-dma does not support anything else. + +Optional properties: +- #dma-channels : Number of DMA channels supported. Should be 16. +- #dma-requests : Number of DMA requests supported. + +Example: + + dma: dma@10001000 { + compatible = "fsl,imx27-dma"; + reg = <0x10001000 0x1000>; + interrupts = <32 33>; + #dma-cells = <1>; + #dma-channels = <16>; + }; + + +* DMA client + +Clients have to specify the DMA requests with phandles in a list. + +Required properties: +- dmas: List of one or more DMA request specifiers. One DMA request specifier + consists of a phandle to the DMA controller followed by the integer + specifiying the request line. +- dma-names: List of string identifiers for the DMA requests. For the correct + names, have a look at the specific client driver. + +Example: + + sdhci1: sdhci@10013000 { + ... + dmas = <&dma 7>; + dma-names = "rx-tx"; + ... + }; diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c index 70b8975..8849d03 100644 --- a/drivers/dma/imx-dma.c +++ b/drivers/dma/imx-dma.c @@ -27,6 +27,8 @@ #include <linux/clk.h> #include <linux/dmaengine.h> #include <linux/module.h> +#include <linux/of_device.h> +#include <linux/of_dma.h> #include <asm/irq.h> #include <linux/platform_data/dma-imx.h> @@ -186,6 +188,11 @@ struct imxdma_engine { enum imx_dma_type devtype; }; +struct imxdma_filter_data { + struct imxdma_engine *imxdma; + int request; +}; + static struct platform_device_id imx_dma_devtype[] = { { .name = "imx1-dma", @@ -202,6 +209,22 @@ static struct platform_device_id imx_dma_devtype[] = { }; MODULE_DEVICE_TABLE(platform, imx_dma_devtype); +static const struct of_device_id imx_dma_of_dev_id[] = { + { + .compatible = "fsl,imx1-dma", + .data = &imx_dma_devtype[IMX1_DMA], + }, { + .compatible = "fsl,imx21-dma", + .data = &imx_dma_devtype[IMX21_DMA], + }, { + .compatible = "fsl,imx27-dma", + .data = &imx_dma_devtype[IMX27_DMA], + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(of, imx_dma_of_dev_id); + static inline int is_imx1_dma(struct imxdma_engine *imxdma) { return imxdma->devtype == IMX1_DMA; @@ -997,13 +1020,49 @@ static void imxdma_issue_pending(struct dma_chan *chan) spin_unlock_irqrestore(&imxdma->lock, flags); } +static bool imxdma_filter_fn(struct dma_chan *chan, void *param) +{ + struct imxdma_filter_data *fdata = param; + struct imxdma_channel *imxdma_chan = to_imxdma_chan(chan); + + if (chan->device->dev != fdata->imxdma->dev) + return false; + + imxdma_chan->dma_request = fdata->request; + chan->private = NULL; + + return true; +} + +static struct dma_chan *imxdma_xlate(struct of_phandle_args *dma_spec, + struct of_dma *ofdma) +{ + int count = dma_spec->args_count; + struct imxdma_engine *imxdma = ofdma->of_dma_data; + struct imxdma_filter_data fdata = { + .imxdma = imxdma, + .request = *(unsigned *)&dma_spec->args[0], + }; + + if (count != 1) + return NULL; + + return dma_request_channel(imxdma->dma_device.cap_mask, + imxdma_filter_fn, &fdata); +} + static int __init imxdma_probe(struct platform_device *pdev) { struct imxdma_engine *imxdma; struct resource *res; + const struct of_device_id *of_id; int ret, i; int irq, irq_err; + of_id = of_match_device(imx_dma_of_dev_id, &pdev->dev); + if (of_id) + pdev->id_entry = of_id->data; + imxdma = devm_kzalloc(&pdev->dev, sizeof(*imxdma), GFP_KERNEL); if (!imxdma) return -ENOMEM; @@ -1137,8 +1196,19 @@ static int __init imxdma_probe(struct platform_device *pdev) goto err; } + if (pdev->dev.of_node) { + ret = of_dma_controller_register(pdev->dev.of_node, + imxdma_xlate, imxdma); + if (ret) { + dev_err(&pdev->dev, "unable to register of_dma_controller\n"); + goto err_of_dma_controller; + } + } + return 0; +err_of_dma_controller: + dma_async_device_unregister(&imxdma->dma_device); err: clk_disable_unprepare(imxdma->dma_ipg); clk_disable_unprepare(imxdma->dma_ahb); @@ -1151,6 +1221,9 @@ static int __exit imxdma_remove(struct platform_device *pdev) dma_async_device_unregister(&imxdma->dma_device); + if (pdev->dev.of_node) + of_dma_controller_free(pdev->dev.of_node); + clk_disable_unprepare(imxdma->dma_ipg); clk_disable_unprepare(imxdma->dma_ahb); @@ -1160,6 +1233,7 @@ static int __exit imxdma_remove(struct platform_device *pdev) static struct platform_driver imxdma_driver = { .driver = { .name = "imx-dma", + .of_match_table = imx_dma_of_dev_id, }, .id_table = imx_dma_devtype, .remove = __exit_p(imxdma_remove), diff --git a/include/linux/platform_data/dma-imx.h b/include/linux/platform_data/dma-imx.h index f6d30cc..beac6b8 100644 --- a/include/linux/platform_data/dma-imx.h +++ b/include/linux/platform_data/dma-imx.h @@ -60,10 +60,8 @@ static inline int imx_dma_is_ipu(struct dma_chan *chan) static inline int imx_dma_is_general_purpose(struct dma_chan *chan) { - return strstr(dev_name(chan->device->dev), "sdma") || - !strcmp(dev_name(chan->device->dev), "imx1-dma") || - !strcmp(dev_name(chan->device->dev), "imx21-dma") || - !strcmp(dev_name(chan->device->dev), "imx27-dma"); + return !strcmp(chan->device->dev->driver->name, "imx-sdma") || + !strcmp(chan->device->dev->driver->name, "imx-dma"); } #endif -- 1.8.1.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
[parent not found: <1366291298-30004-2-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>]
* Re: [PATCH RESEND v5 1/2] dma: imx-dma: Add oftree support [not found] ` <1366291298-30004-2-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> @ 2013-04-18 15:14 ` Lars-Peter Clausen [not found] ` <51700DDD.1060801-Qo5EllUWu/uELgA04lAiVw@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Lars-Peter Clausen @ 2013-04-18 15:14 UTC (permalink / raw) To: Markus Pargmann Cc: Vinod Koul, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring, kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Dan Williams, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Hi, On 04/18/2013 03:21 PM, Markus Pargmann wrote: [...] > +static struct dma_chan *imxdma_xlate(struct of_phandle_args *dma_spec, > + struct of_dma *ofdma) > +{ > + int count = dma_spec->args_count; > + struct imxdma_engine *imxdma = ofdma->of_dma_data; > + struct imxdma_filter_data fdata = { > + .imxdma = imxdma, > + .request = *(unsigned *)&dma_spec->args[0], This cast looks rather bogus and shouldn't be necessary. > + }; > + > + if (count != 1) > + return NULL; I think you need to check count before you access dma_spec->args[0] > + > + return dma_request_channel(imxdma->dma_device.cap_mask, > + imxdma_filter_fn, &fdata); > +} > + [...] ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <51700DDD.1060801-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>]
* Re: [PATCH RESEND v5 1/2] dma: imx-dma: Add oftree support [not found] ` <51700DDD.1060801-Qo5EllUWu/uELgA04lAiVw@public.gmane.org> @ 2013-04-18 16:02 ` Markus Pargmann 0 siblings, 0 replies; 7+ messages in thread From: Markus Pargmann @ 2013-04-18 16:02 UTC (permalink / raw) To: Lars-Peter Clausen Cc: Vinod Koul, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring, kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Dan Williams, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Thu, Apr 18, 2013 at 05:14:37PM +0200, Lars-Peter Clausen wrote: > Hi, > > On 04/18/2013 03:21 PM, Markus Pargmann wrote: > [...] > > +static struct dma_chan *imxdma_xlate(struct of_phandle_args *dma_spec, > > + struct of_dma *ofdma) > > +{ > > + int count = dma_spec->args_count; > > + struct imxdma_engine *imxdma = ofdma->of_dma_data; > > + struct imxdma_filter_data fdata = { > > + .imxdma = imxdma, > > + .request = *(unsigned *)&dma_spec->args[0], > > This cast looks rather bogus and shouldn't be necessary. Ah right, I was assuming "args" is void*. > > > + }; > > + > > + if (count != 1) > > + return NULL; > > I think you need to check count before you access dma_spec->args[0] dma_spec->args is actually a static array of size MAX_PHANDLE_ARGS. However it is probably cleaner after the check, so I changed both. Thanks, Markus > > > + > > + return dma_request_channel(imxdma->dma_device.cap_mask, > > + imxdma_filter_fn, &fdata); > > +} > > + > [...] > > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH RESEND v5 2/2] DMA: imx-dma: imxdma->dev used uninitialized [not found] ` <1366291298-30004-1-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 2013-04-18 13:21 ` [PATCH RESEND v5 1/2] dma: imx-dma: Add oftree support Markus Pargmann @ 2013-04-18 13:21 ` Markus Pargmann 1 sibling, 0 replies; 7+ messages in thread From: Markus Pargmann @ 2013-04-18 13:21 UTC (permalink / raw) To: Vinod Koul Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring, kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Dan Williams, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r imxdma->dev is used for dev_warn before it was set. Signed-off-by: Markus Pargmann <mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> --- drivers/dma/imx-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c index 8849d03..0d42d0a 100644 --- a/drivers/dma/imx-dma.c +++ b/drivers/dma/imx-dma.c @@ -1067,6 +1067,7 @@ static int __init imxdma_probe(struct platform_device *pdev) if (!imxdma) return -ENOMEM; + imxdma->dev = &pdev->dev; imxdma->devtype = pdev->id_entry->driver_data; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -1171,7 +1172,6 @@ static int __init imxdma_probe(struct platform_device *pdev) &imxdma->dma_device.channels); } - imxdma->dev = &pdev->dev; imxdma->dma_device.dev = &pdev->dev; imxdma->dma_device.device_alloc_chan_resources = imxdma_alloc_chan_resources; -- 1.8.1.5 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH RESEND v5 0/2] dma: imx-dma: OFTree support 2013-04-18 13:21 [PATCH RESEND v5 0/2] dma: imx-dma: OFTree support Markus Pargmann [not found] ` <1366291298-30004-1-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> @ 2013-04-18 14:44 ` Shawn Guo [not found] ` <20130418144428.GB2222-rvtDTF3kK1ictlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> 1 sibling, 1 reply; 7+ messages in thread From: Shawn Guo @ 2013-04-18 14:44 UTC (permalink / raw) To: Markus Pargmann Cc: Arnd Bergmann, Vinod Koul, devicetree-discuss, Rob Herring, Grant Likely, kernel, Dan Williams, linux-arm-kernel On Thu, Apr 18, 2013 at 03:21:36PM +0200, Markus Pargmann wrote: > Markus Pargmann (2): > dma: imx-dma: Add oftree support > DMA: imx-dma: imxdma->dev used uninitialized Both, Reviewed-by: Shawn Guo <shawn.guo@linaro.org> ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <20130418144428.GB2222-rvtDTF3kK1ictlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org>]
* Re: [PATCH RESEND v5 0/2] dma: imx-dma: OFTree support [not found] ` <20130418144428.GB2222-rvtDTF3kK1ictlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> @ 2013-04-21 8:51 ` Markus Pargmann 0 siblings, 0 replies; 7+ messages in thread From: Markus Pargmann @ 2013-04-21 8:51 UTC (permalink / raw) To: Shawn Guo Cc: Vinod Koul, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring, kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Dan Williams, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Thu, Apr 18, 2013 at 10:44:29PM +0800, Shawn Guo wrote: > On Thu, Apr 18, 2013 at 03:21:36PM +0200, Markus Pargmann wrote: > > Markus Pargmann (2): > > dma: imx-dma: Add oftree support > > DMA: imx-dma: imxdma->dev used uninitialized > > Both, > > Reviewed-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > Thanks Markus -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-04-21 8:51 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-04-18 13:21 [PATCH RESEND v5 0/2] dma: imx-dma: OFTree support Markus Pargmann [not found] ` <1366291298-30004-1-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 2013-04-18 13:21 ` [PATCH RESEND v5 1/2] dma: imx-dma: Add oftree support Markus Pargmann [not found] ` <1366291298-30004-2-git-send-email-mpa-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 2013-04-18 15:14 ` Lars-Peter Clausen [not found] ` <51700DDD.1060801-Qo5EllUWu/uELgA04lAiVw@public.gmane.org> 2013-04-18 16:02 ` Markus Pargmann 2013-04-18 13:21 ` [PATCH RESEND v5 2/2] DMA: imx-dma: imxdma->dev used uninitialized Markus Pargmann 2013-04-18 14:44 ` [PATCH RESEND v5 0/2] dma: imx-dma: OFTree support Shawn Guo [not found] ` <20130418144428.GB2222-rvtDTF3kK1ictlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> 2013-04-21 8:51 ` Markus Pargmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).