* [PATCH 2/4] dmaengine: at_hdmac: add device tree support
2011-10-10 16:37 ` [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table Nicolas Ferre
@ 2011-10-10 16:37 ` Nicolas Ferre
2011-10-10 16:37 ` [PATCH 3/4] ARM: at91/dma: remove platform data from DMA controller Nicolas Ferre
` (2 subsequent siblings)
3 siblings, 0 replies; 14+ messages in thread
From: Nicolas Ferre @ 2011-10-10 16:37 UTC (permalink / raw)
To: vinod.koul, linux-arm-kernel, robherring2, devicetree-discuss
Cc: linux-kernel, grant.likely, Nicolas Ferre
Add device tree probe support for atmel at_hdmac DMA driver.
Bindings are added to specify DMA controller configuration.
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
---
.../devicetree/bindings/dma/atmel-dma.txt | 14 +++++++++
drivers/dma/at_hdmac.c | 30 +++++++++++++++++++-
2 files changed, 43 insertions(+), 1 deletions(-)
create mode 100644 Documentation/devicetree/bindings/dma/atmel-dma.txt
diff --git a/Documentation/devicetree/bindings/dma/atmel-dma.txt b/Documentation/devicetree/bindings/dma/atmel-dma.txt
new file mode 100644
index 0000000..3c046ee
--- /dev/null
+++ b/Documentation/devicetree/bindings/dma/atmel-dma.txt
@@ -0,0 +1,14 @@
+* Atmel Direct Memory Access Controller (DMA)
+
+Required properties:
+- compatible: Should be "atmel,<chip>-dma"
+- reg: Should contain DMA registers location and length
+- interrupts: Should contain DMA interrupt
+
+Examples:
+
+dma@ffffec00 {
+ compatible = "atmel,at91sam9g45-dma";
+ reg = <0xffffec00 0x200>;
+ interrupts = <21>;
+};
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
index fef57bc..6d25b6a 100644
--- a/drivers/dma/at_hdmac.c
+++ b/drivers/dma/at_hdmac.c
@@ -23,6 +23,8 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
#include "at_hdmac_regs.h"
@@ -1175,6 +1177,20 @@ static void atc_free_chan_resources(struct dma_chan *chan)
/*-- Module Management -----------------------------------------------*/
+#if defined(CONFIG_OF)
+static const struct of_device_id atmel_dma_dt_ids[] = {
+ {
+ .compatible = "atmel,at91sam9rl-dma",
+ .data = (void *)ATDMA_DEVTYPE_SAM9RL
+ }, {
+ .compatible = "atmel,at91sam9g45-dma",
+ .data = (void *)ATDMA_DEVTYPE_SAM9G45
+ }, { /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, atmel_dma_dt_ids);
+#endif
+
static struct platform_device_id atdma_devtypes[] = {
{
.name = "at91sam9rl_dma",
@@ -1187,6 +1203,17 @@ static struct platform_device_id atdma_devtypes[] = {
}
};
+static inline enum atdma_devtype __init at_dma_get_driver_data(
+ struct platform_device *pdev)
+{
+ if (pdev->dev.of_node) {
+ const struct of_device_id *match;
+ match = of_match_node(atmel_dma_dt_ids, pdev->dev.of_node);
+ return (enum atdma_devtype)match->data;
+ }
+ return platform_get_device_id(pdev)->driver_data;
+}
+
/**
* at_dma_off - disable DMA controller
* @atdma: the Atmel HDAMC device
@@ -1218,7 +1245,7 @@ static int __init at_dma_probe(struct platform_device *pdev)
dma_cap_set(DMA_MEMCPY, cap_mask);
/* get DMA parameters from controller type */
- atdmatype = platform_get_device_id(pdev)->driver_data;
+ atdmatype = at_dma_get_driver_data(pdev);
switch (atdmatype) {
case ATDMA_DEVTYPE_SAM9RL:
@@ -1526,6 +1553,7 @@ static struct platform_driver at_dma_driver = {
.driver = {
.name = "at_hdmac",
.pm = &at_dma_dev_pm_ops,
+ .of_match_table = of_match_ptr(atmel_dma_dt_ids),
},
};
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH 3/4] ARM: at91/dma: remove platform data from DMA controller
2011-10-10 16:37 ` [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table Nicolas Ferre
2011-10-10 16:37 ` [PATCH 2/4] dmaengine: at_hdmac: add device tree support Nicolas Ferre
@ 2011-10-10 16:37 ` Nicolas Ferre
2011-10-11 14:25 ` Vinod Koul
2011-10-10 16:37 ` [PATCH 4/4] ARM: at91/dma: DMA controller registering with DT support Nicolas Ferre
2011-10-11 14:16 ` [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table Vinod Koul
3 siblings, 1 reply; 14+ messages in thread
From: Nicolas Ferre @ 2011-10-10 16:37 UTC (permalink / raw)
To: vinod.koul, linux-arm-kernel, robherring2, devicetree-discuss
Cc: linux-kernel, grant.likely, Nicolas Ferre
DMA controller can deduce its configuration data from
the platform. Remove the platform data and match device
types with the compatible ones.
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
---
arch/arm/mach-at91/at91sam9g45_devices.c | 9 +--------
arch/arm/mach-at91/at91sam9rl_devices.c | 8 +-------
2 files changed, 2 insertions(+), 15 deletions(-)
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
index 600bffb..c9b897f 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -38,10 +38,6 @@
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
static u64 hdmac_dmamask = DMA_BIT_MASK(32);
-static struct at_dma_platform_data atdma_pdata = {
- .nr_channels = 8,
-};
-
static struct resource hdmac_resources[] = {
[0] = {
.start = AT91_BASE_SYS + AT91_DMA,
@@ -56,12 +52,11 @@ static struct resource hdmac_resources[] = {
};
static struct platform_device at_hdmac_device = {
- .name = "at_hdmac",
+ .name = "at91sam9g45_dma",
.id = -1,
.dev = {
.dma_mask = &hdmac_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(32),
- .platform_data = &atdma_pdata,
},
.resource = hdmac_resources,
.num_resources = ARRAY_SIZE(hdmac_resources),
@@ -69,8 +64,6 @@ static struct platform_device at_hdmac_device = {
void __init at91_add_device_hdmac(void)
{
- dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
- dma_cap_set(DMA_SLAVE, atdma_pdata.cap_mask);
platform_device_register(&at_hdmac_device);
}
#else
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c
index aacb19d..81954f7 100644
--- a/arch/arm/mach-at91/at91sam9rl_devices.c
+++ b/arch/arm/mach-at91/at91sam9rl_devices.c
@@ -33,10 +33,6 @@
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
static u64 hdmac_dmamask = DMA_BIT_MASK(32);
-static struct at_dma_platform_data atdma_pdata = {
- .nr_channels = 2,
-};
-
static struct resource hdmac_resources[] = {
[0] = {
.start = AT91_BASE_SYS + AT91_DMA,
@@ -51,12 +47,11 @@ static struct resource hdmac_resources[] = {
};
static struct platform_device at_hdmac_device = {
- .name = "at_hdmac",
+ .name = "at91sam9rl_dma",
.id = -1,
.dev = {
.dma_mask = &hdmac_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(32),
- .platform_data = &atdma_pdata,
},
.resource = hdmac_resources,
.num_resources = ARRAY_SIZE(hdmac_resources),
@@ -64,7 +59,6 @@ static struct platform_device at_hdmac_device = {
void __init at91_add_device_hdmac(void)
{
- dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
platform_device_register(&at_hdmac_device);
}
#else
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH 3/4] ARM: at91/dma: remove platform data from DMA controller
2011-10-10 16:37 ` [PATCH 3/4] ARM: at91/dma: remove platform data from DMA controller Nicolas Ferre
@ 2011-10-11 14:25 ` Vinod Koul
0 siblings, 0 replies; 14+ messages in thread
From: Vinod Koul @ 2011-10-11 14:25 UTC (permalink / raw)
To: Nicolas Ferre
Cc: linux-arm-kernel, robherring2, devicetree-discuss, linux-kernel,
grant.likely
On Mon, 2011-10-10 at 18:37 +0200, Nicolas Ferre wrote:
> DMA controller can deduce its configuration data from
> the platform. Remove the platform data and match device
> types with the compatible ones.
This looks like remove, you should fix the changelog of patch 1 then.
>
> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
> ---
> arch/arm/mach-at91/at91sam9g45_devices.c | 9 +--------
> arch/arm/mach-at91/at91sam9rl_devices.c | 8 +-------
> 2 files changed, 2 insertions(+), 15 deletions(-)
>
> diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
> index 600bffb..c9b897f 100644
> --- a/arch/arm/mach-at91/at91sam9g45_devices.c
> +++ b/arch/arm/mach-at91/at91sam9g45_devices.c
> @@ -38,10 +38,6 @@
> #if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
> static u64 hdmac_dmamask = DMA_BIT_MASK(32);
>
> -static struct at_dma_platform_data atdma_pdata = {
> - .nr_channels = 8,
> -};
> -
> static struct resource hdmac_resources[] = {
> [0] = {
> .start = AT91_BASE_SYS + AT91_DMA,
> @@ -56,12 +52,11 @@ static struct resource hdmac_resources[] = {
> };
>
> static struct platform_device at_hdmac_device = {
> - .name = "at_hdmac",
> + .name = "at91sam9g45_dma",
> .id = -1,
> .dev = {
> .dma_mask = &hdmac_dmamask,
> .coherent_dma_mask = DMA_BIT_MASK(32),
> - .platform_data = &atdma_pdata,
> },
> .resource = hdmac_resources,
> .num_resources = ARRAY_SIZE(hdmac_resources),
> @@ -69,8 +64,6 @@ static struct platform_device at_hdmac_device = {
>
> void __init at91_add_device_hdmac(void)
> {
> - dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
> - dma_cap_set(DMA_SLAVE, atdma_pdata.cap_mask);
> platform_device_register(&at_hdmac_device);
> }
> #else
> diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c
> index aacb19d..81954f7 100644
> --- a/arch/arm/mach-at91/at91sam9rl_devices.c
> +++ b/arch/arm/mach-at91/at91sam9rl_devices.c
> @@ -33,10 +33,6 @@
> #if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
> static u64 hdmac_dmamask = DMA_BIT_MASK(32);
>
> -static struct at_dma_platform_data atdma_pdata = {
> - .nr_channels = 2,
> -};
> -
> static struct resource hdmac_resources[] = {
> [0] = {
> .start = AT91_BASE_SYS + AT91_DMA,
> @@ -51,12 +47,11 @@ static struct resource hdmac_resources[] = {
> };
>
> static struct platform_device at_hdmac_device = {
> - .name = "at_hdmac",
> + .name = "at91sam9rl_dma",
> .id = -1,
> .dev = {
> .dma_mask = &hdmac_dmamask,
> .coherent_dma_mask = DMA_BIT_MASK(32),
> - .platform_data = &atdma_pdata,
> },
> .resource = hdmac_resources,
> .num_resources = ARRAY_SIZE(hdmac_resources),
> @@ -64,7 +59,6 @@ static struct platform_device at_hdmac_device = {
>
> void __init at91_add_device_hdmac(void)
> {
> - dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
> platform_device_register(&at_hdmac_device);
> }
> #else
--
~Vinod
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 4/4] ARM: at91/dma: DMA controller registering with DT support
2011-10-10 16:37 ` [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table Nicolas Ferre
2011-10-10 16:37 ` [PATCH 2/4] dmaengine: at_hdmac: add device tree support Nicolas Ferre
2011-10-10 16:37 ` [PATCH 3/4] ARM: at91/dma: remove platform data from DMA controller Nicolas Ferre
@ 2011-10-10 16:37 ` Nicolas Ferre
2011-10-10 16:43 ` [PATCH V2 " Nicolas Ferre
2011-10-11 14:16 ` [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table Vinod Koul
3 siblings, 1 reply; 14+ messages in thread
From: Nicolas Ferre @ 2011-10-10 16:37 UTC (permalink / raw)
To: vinod.koul, linux-arm-kernel, robherring2, devicetree-discuss
Cc: linux-kernel, grant.likely, Nicolas Ferre
Device tree support on at91sam9g45 family SoC. Only call
platform_device_register() if no dma-controller node is
found in device tree.
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
---
arch/arm/mach-at91/at91sam9g45_devices.c | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
index c9b897f..cee7287 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -64,7 +64,14 @@ static struct platform_device at_hdmac_device = {
void __init at91_add_device_hdmac(void)
{
- platform_device_register(&at_hdmac_device);
+ struct device_node *of_node =
+ of_find_node_by_name(NULL, "dma-controller");
+
+ if (of_node) {
+ of_node_put(of_node);
+ } else {
+ platform_device_register(&at_hdmac_device);
+ }
}
#else
void __init at91_add_device_hdmac(void) {}
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH V2 4/4] ARM: at91/dma: DMA controller registering with DT support
2011-10-10 16:37 ` [PATCH 4/4] ARM: at91/dma: DMA controller registering with DT support Nicolas Ferre
@ 2011-10-10 16:43 ` Nicolas Ferre
2011-10-11 11:16 ` Sergei Shtylyov
0 siblings, 1 reply; 14+ messages in thread
From: Nicolas Ferre @ 2011-10-10 16:43 UTC (permalink / raw)
To: vinod.koul, linux-arm-kernel, robherring2, devicetree-discuss
Cc: linux-kernel, grant.likely, Nicolas Ferre
Device tree support on at91sam9g45 family SoC. Only call
platform_device_register() if no compatible dma-controller
node is found in device tree.
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
---
V2: use compatible string to match device.
arch/arm/mach-at91/at91sam9g45_devices.c | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
index 9390ae6..2120055 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -64,7 +64,13 @@ static struct platform_device at_hdmac_device = {
void __init at91_add_device_hdmac(void)
{
- platform_device_register(&at_hdmac_device);
+ struct device_node *np = of_find_node_by_name(NULL, "dma-controller");
+
+ if (np && of_device_is_compatible(np, "atmel,at91sam9g45-dma")) {
+ of_node_put(np);
+ } else {
+ platform_device_register(&at_hdmac_device);
+ }
}
#else
void __init at91_add_device_hdmac(void) {}
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH V2 4/4] ARM: at91/dma: DMA controller registering with DT support
2011-10-10 16:43 ` [PATCH V2 " Nicolas Ferre
@ 2011-10-11 11:16 ` Sergei Shtylyov
0 siblings, 0 replies; 14+ messages in thread
From: Sergei Shtylyov @ 2011-10-11 11:16 UTC (permalink / raw)
To: Nicolas Ferre
Cc: vinod.koul, linux-arm-kernel, robherring2, devicetree-discuss,
grant.likely, linux-kernel
Hello.
On 10-10-2011 20:43, Nicolas Ferre wrote:
> Device tree support on at91sam9g45 family SoC. Only call
> platform_device_register() if no compatible dma-controller
> node is found in device tree.
> Signed-off-by: Nicolas Ferre<nicolas.ferre@atmel.com>
> ---
> V2: use compatible string to match device.
[...]
> diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
> index 9390ae6..2120055 100644
> --- a/arch/arm/mach-at91/at91sam9g45_devices.c
> +++ b/arch/arm/mach-at91/at91sam9g45_devices.c
> @@ -64,7 +64,13 @@ static struct platform_device at_hdmac_device = {
>
> void __init at91_add_device_hdmac(void)
> {
> - platform_device_register(&at_hdmac_device);
> + struct device_node *np = of_find_node_by_name(NULL, "dma-controller");
> +
> + if (np&& of_device_is_compatible(np, "atmel,at91sam9g45-dma")) {
> + of_node_put(np);
> + } else {
> + platform_device_register(&at_hdmac_device);
> + }
{} not needed here, and checkpatch.pl should have protested.
WBR, Sergei
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table
2011-10-10 16:37 ` [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table Nicolas Ferre
` (2 preceding siblings ...)
2011-10-10 16:37 ` [PATCH 4/4] ARM: at91/dma: DMA controller registering with DT support Nicolas Ferre
@ 2011-10-11 14:16 ` Vinod Koul
2011-10-12 16:34 ` Nicolas Ferre
3 siblings, 1 reply; 14+ messages in thread
From: Vinod Koul @ 2011-10-11 14:16 UTC (permalink / raw)
To: Nicolas Ferre
Cc: linux-arm-kernel, robherring2, devicetree-discuss, linux-kernel,
grant.likely
On Mon, 2011-10-10 at 18:37 +0200, Nicolas Ferre wrote:
> We remove platform data from DMA controller and move
> to the use of .id_table to distinguish between compatible
> types. The two implementations allow to determine the
> number of channels and the capabilities of the controller.
>
> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
> ---
> drivers/dma/at_hdmac.c | 48 ++++++++++++++++++++++++++++++++++---------
> drivers/dma/at_hdmac_regs.h | 8 +++++++
> 2 files changed, 46 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
> index fcfa0a8..fef57bc 100644
> --- a/drivers/dma/at_hdmac.c
> +++ b/drivers/dma/at_hdmac.c
> @@ -1175,6 +1175,18 @@ static void atc_free_chan_resources(struct dma_chan *chan)
>
> /*-- Module Management -----------------------------------------------*/
>
> +static struct platform_device_id atdma_devtypes[] = {
> + {
> + .name = "at91sam9rl_dma",
> + .driver_data = ATDMA_DEVTYPE_SAM9RL,
> + }, {
> + .name = "at91sam9g45_dma",
> + .driver_data = ATDMA_DEVTYPE_SAM9G45,
> + }, {
> + /* sentinel */
> + }
> +};
> +
> /**
> * at_dma_off - disable DMA controller
> * @atdma: the Atmel HDAMC device
> @@ -1193,18 +1205,32 @@ static void at_dma_off(struct at_dma *atdma)
>
> static int __init at_dma_probe(struct platform_device *pdev)
> {
> - struct at_dma_platform_data *pdata;
> struct resource *io;
> struct at_dma *atdma;
> size_t size;
> int irq;
> int err;
> int i;
> + u32 nr_channels;
> + dma_cap_mask_t cap_mask = {};
> + enum atdma_devtype atdmatype;
> +
> + dma_cap_set(DMA_MEMCPY, cap_mask);
> +
> + /* get DMA parameters from controller type */
> + atdmatype = platform_get_device_id(pdev)->driver_data;
>
> - /* get DMA Controller parameters from platform */
> - pdata = pdev->dev.platform_data;
> - if (!pdata || pdata->nr_channels > AT_DMA_MAX_NR_CHANNELS)
> + switch (atdmatype) {
> + case ATDMA_DEVTYPE_SAM9RL:
> + nr_channels = 2;
> + break;
> + case ATDMA_DEVTYPE_SAM9G45:
> + nr_channels = 8;
> + dma_cap_set(DMA_SLAVE, cap_mask);
> + break;
> + default:
> return -EINVAL;
> + }
>
> io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> if (!io)
> @@ -1215,14 +1241,15 @@ static int __init at_dma_probe(struct platform_device *pdev)
> return irq;
>
> size = sizeof(struct at_dma);
> - size += pdata->nr_channels * sizeof(struct at_dma_chan);
> + size += nr_channels * sizeof(struct at_dma_chan);
> atdma = kzalloc(size, GFP_KERNEL);
> if (!atdma)
> return -ENOMEM;
>
> - /* discover transaction capabilites from the platform data */
> - atdma->dma_common.cap_mask = pdata->cap_mask;
> - atdma->all_chan_mask = (1 << pdata->nr_channels) - 1;
> + /* discover transaction capabilites */
capabilities
> + atdma->dma_common.cap_mask = cap_mask;
> + atdma->all_chan_mask = (1 << nr_channels) - 1;
> + atdma->devtype = atdmatype;
>
> size = resource_size(io);
> if (!request_mem_region(io->start, size, pdev->dev.driver->name)) {
> @@ -1268,7 +1295,7 @@ static int __init at_dma_probe(struct platform_device *pdev)
>
> /* initialize channels related values */
> INIT_LIST_HEAD(&atdma->dma_common.channels);
> - for (i = 0; i < pdata->nr_channels; i++) {
> + for (i = 0; i < nr_channels; i++) {
> struct at_dma_chan *atchan = &atdma->chan[i];
>
> atchan->chan_common.device = &atdma->dma_common;
> @@ -1313,7 +1340,7 @@ static int __init at_dma_probe(struct platform_device *pdev)
> dev_info(&pdev->dev, "Atmel AHB DMA Controller ( %s%s), %d channels\n",
> dma_has_cap(DMA_MEMCPY, atdma->dma_common.cap_mask) ? "cpy " : "",
> dma_has_cap(DMA_SLAVE, atdma->dma_common.cap_mask) ? "slave " : "",
> - pdata->nr_channels);
> + nr_channels);
indent?
>
> dma_async_device_register(&atdma->dma_common);
>
> @@ -1495,6 +1522,7 @@ static const struct dev_pm_ops at_dma_dev_pm_ops = {
> static struct platform_driver at_dma_driver = {
> .remove = __exit_p(at_dma_remove),
> .shutdown = at_dma_shutdown,
> + .id_table = atdma_devtypes,
> .driver = {
> .name = "at_hdmac",
> .pm = &at_dma_dev_pm_ops,
> diff --git a/drivers/dma/at_hdmac_regs.h b/drivers/dma/at_hdmac_regs.h
> index aa4c9ae..d7d6737 100644
> --- a/drivers/dma/at_hdmac_regs.h
> +++ b/drivers/dma/at_hdmac_regs.h
> @@ -248,9 +248,16 @@ static inline struct at_dma_chan *to_at_dma_chan(struct dma_chan *dchan)
>
> /*-- Controller ------------------------------------------------------*/
>
> +enum atdma_devtype {
> + ATDMA_DEVTYPE_UNDEFINED = 0,
> + ATDMA_DEVTYPE_SAM9RL, /* compatible with SAM9RL DMA controller */
> + ATDMA_DEVTYPE_SAM9G45, /* compatible with SAM9G45 DMA controller */
> +};
> +
> /**
> * struct at_dma - internal representation of an Atmel HDMA Controller
> * @chan_common: common dmaengine dma_device object members
> + * @atdma_devtype: identifier of DMA controller compatibility
> * @ch_regs: memory mapped register base
> * @clk: dma controller clock
> * @save_imr: interrupt mask register that is saved on suspend/resume cycle
> @@ -260,6 +267,7 @@ static inline struct at_dma_chan *to_at_dma_chan(struct dma_chan *dchan)
> */
> struct at_dma {
> struct dma_device dma_common;
> + enum atdma_devtype devtype;
> void __iomem *regs;
> struct clk *clk;
> u32 save_imr;
Little confused at this, where is the remove of existing platfrom data
per the changelog?
--
~Vinod
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table
2011-10-11 14:16 ` [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table Vinod Koul
@ 2011-10-12 16:34 ` Nicolas Ferre
2011-10-12 16:52 ` Nicolas Ferre
0 siblings, 1 reply; 14+ messages in thread
From: Nicolas Ferre @ 2011-10-12 16:34 UTC (permalink / raw)
To: Vinod Koul
Cc: linux-arm-kernel, robherring2, devicetree-discuss, linux-kernel,
grant.likely
On 10/11/2011 04:16 PM, Vinod Koul :
> On Mon, 2011-10-10 at 18:37 +0200, Nicolas Ferre wrote:
>> We remove platform data from DMA controller and move
>> to the use of .id_table to distinguish between compatible
>> types. The two implementations allow to determine the
>> number of channels and the capabilities of the controller.
>>
>> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
>> ---
>> drivers/dma/at_hdmac.c | 48 ++++++++++++++++++++++++++++++++++---------
>> drivers/dma/at_hdmac_regs.h | 8 +++++++
>> 2 files changed, 46 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
>> index fcfa0a8..fef57bc 100644
>> --- a/drivers/dma/at_hdmac.c
>> +++ b/drivers/dma/at_hdmac.c
>> @@ -1175,6 +1175,18 @@ static void atc_free_chan_resources(struct dma_chan *chan)
>>
>> /*-- Module Management -----------------------------------------------*/
>>
>> +static struct platform_device_id atdma_devtypes[] = {
>> + {
>> + .name = "at91sam9rl_dma",
>> + .driver_data = ATDMA_DEVTYPE_SAM9RL,
>> + }, {
>> + .name = "at91sam9g45_dma",
>> + .driver_data = ATDMA_DEVTYPE_SAM9G45,
>> + }, {
>> + /* sentinel */
>> + }
>> +};
>> +
>> /**
>> * at_dma_off - disable DMA controller
>> * @atdma: the Atmel HDAMC device
>> @@ -1193,18 +1205,32 @@ static void at_dma_off(struct at_dma *atdma)
>>
>> static int __init at_dma_probe(struct platform_device *pdev)
>> {
>> - struct at_dma_platform_data *pdata;
>> struct resource *io;
>> struct at_dma *atdma;
>> size_t size;
>> int irq;
>> int err;
>> int i;
>> + u32 nr_channels;
>> + dma_cap_mask_t cap_mask = {};
>> + enum atdma_devtype atdmatype;
>> +
>> + dma_cap_set(DMA_MEMCPY, cap_mask);
>> +
>> + /* get DMA parameters from controller type */
>> + atdmatype = platform_get_device_id(pdev)->driver_data;
>>
>> - /* get DMA Controller parameters from platform */
>> - pdata = pdev->dev.platform_data;
>> - if (!pdata || pdata->nr_channels > AT_DMA_MAX_NR_CHANNELS)
>> + switch (atdmatype) {
>> + case ATDMA_DEVTYPE_SAM9RL:
>> + nr_channels = 2;
>> + break;
>> + case ATDMA_DEVTYPE_SAM9G45:
>> + nr_channels = 8;
>> + dma_cap_set(DMA_SLAVE, cap_mask);
>> + break;
>> + default:
>> return -EINVAL;
>> + }
>>
>> io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> if (!io)
>> @@ -1215,14 +1241,15 @@ static int __init at_dma_probe(struct platform_device *pdev)
>> return irq;
>>
>> size = sizeof(struct at_dma);
>> - size += pdata->nr_channels * sizeof(struct at_dma_chan);
>> + size += nr_channels * sizeof(struct at_dma_chan);
>> atdma = kzalloc(size, GFP_KERNEL);
>> if (!atdma)
>> return -ENOMEM;
>>
>> - /* discover transaction capabilites from the platform data */
>> - atdma->dma_common.cap_mask = pdata->cap_mask;
>> - atdma->all_chan_mask = (1 << pdata->nr_channels) - 1;
>> + /* discover transaction capabilites */
> capabilities
Yes.
>> + atdma->dma_common.cap_mask = cap_mask;
>> + atdma->all_chan_mask = (1 << nr_channels) - 1;
>> + atdma->devtype = atdmatype;
>>
>> size = resource_size(io);
>> if (!request_mem_region(io->start, size, pdev->dev.driver->name)) {
>> @@ -1268,7 +1295,7 @@ static int __init at_dma_probe(struct platform_device *pdev)
>>
>> /* initialize channels related values */
>> INIT_LIST_HEAD(&atdma->dma_common.channels);
>> - for (i = 0; i < pdata->nr_channels; i++) {
>> + for (i = 0; i < nr_channels; i++) {
>> struct at_dma_chan *atchan = &atdma->chan[i];
>>
>> atchan->chan_common.device = &atdma->dma_common;
>> @@ -1313,7 +1340,7 @@ static int __init at_dma_probe(struct platform_device *pdev)
>> dev_info(&pdev->dev, "Atmel AHB DMA Controller ( %s%s), %d channels\n",
>> dma_has_cap(DMA_MEMCPY, atdma->dma_common.cap_mask) ? "cpy " : "",
>> dma_has_cap(DMA_SLAVE, atdma->dma_common.cap_mask) ? "slave " : "",
>> - pdata->nr_channels);
>> + nr_channels);
> indent?
Well, this dev_info statement seems pretty well indented: if I use a
tab, then I cross the 80 column rule, and I would like to keep the "?:"
operator on one line... So I would like to keep it like this.
>> dma_async_device_register(&atdma->dma_common);
>>
>> @@ -1495,6 +1522,7 @@ static const struct dev_pm_ops at_dma_dev_pm_ops = {
>> static struct platform_driver at_dma_driver = {
>> .remove = __exit_p(at_dma_remove),
>> .shutdown = at_dma_shutdown,
>> + .id_table = atdma_devtypes,
>> .driver = {
>> .name = "at_hdmac",
>> .pm = &at_dma_dev_pm_ops,
>> diff --git a/drivers/dma/at_hdmac_regs.h b/drivers/dma/at_hdmac_regs.h
>> index aa4c9ae..d7d6737 100644
>> --- a/drivers/dma/at_hdmac_regs.h
>> +++ b/drivers/dma/at_hdmac_regs.h
>> @@ -248,9 +248,16 @@ static inline struct at_dma_chan *to_at_dma_chan(struct dma_chan *dchan)
>>
>> /*-- Controller ------------------------------------------------------*/
>>
>> +enum atdma_devtype {
>> + ATDMA_DEVTYPE_UNDEFINED = 0,
>> + ATDMA_DEVTYPE_SAM9RL, /* compatible with SAM9RL DMA controller */
>> + ATDMA_DEVTYPE_SAM9G45, /* compatible with SAM9G45 DMA controller */
>> +};
>> +
>> /**
>> * struct at_dma - internal representation of an Atmel HDMA Controller
>> * @chan_common: common dmaengine dma_device object members
>> + * @atdma_devtype: identifier of DMA controller compatibility
>> * @ch_regs: memory mapped register base
>> * @clk: dma controller clock
>> * @save_imr: interrupt mask register that is saved on suspend/resume cycle
>> @@ -260,6 +267,7 @@ static inline struct at_dma_chan *to_at_dma_chan(struct dma_chan *dchan)
>> */
>> struct at_dma {
>> struct dma_device dma_common;
>> + enum atdma_devtype devtype;
>> void __iomem *regs;
>> struct clk *clk;
>> u32 save_imr;
> Little confused at this, where is the remove of existing platfrom data
> per the changelog?
Well, yes, it is the use of platform data that is removed, not the
structure it self. I change the log message in my v2 patch series.
thanks, bye,
--
Nicolas Ferre
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH 1/4] dmaengine: at_hdmac: platform data move to use .id_table
2011-10-12 16:34 ` Nicolas Ferre
@ 2011-10-12 16:52 ` Nicolas Ferre
0 siblings, 0 replies; 14+ messages in thread
From: Nicolas Ferre @ 2011-10-12 16:52 UTC (permalink / raw)
To: Vinod Koul; +Cc: devicetree-discuss, linux-kernel, linux-arm-kernel
On 10/12/2011 06:34 PM, Nicolas Ferre :
> On 10/11/2011 04:16 PM, Vinod Koul :
[..]
>> Little confused at this, where is the remove of existing platfrom data
>> per the changelog?
>
> Well, yes, it is the use of platform data that is removed, not the
> structure it self. I change the log message in my v2 patch series.
v3 actually...
Bye,
--
Nicolas Ferre
^ permalink raw reply [flat|nested] 14+ messages in thread