Skip to contentSkip to conversation

dma: imx-sdma: Add ROM script addresses to driver

PATCH Superseded Sascha Hauer 3 participants 8 messages Aug 20, 2013 – Aug 26, 2013

Subsystems (5)
lore
Share & tools
lore

Sascha Hauer

author maintainer
#0 lore raw

PATCH v2 1/1 dma: imx-sdma: Add ROM script addresses to driver

Changes since v1:

- skip handling of SoCs which have a tapeout specific SDMA firmware, namely i.MX31/35

----------------------------------------------------------------
Sascha Hauer (3):
dma: imx-sdma: Use struct for driver data
dma: imx-sdma: Add ROM script addresses to driver
ARM: i.MX: remove sdma script address arrays from platform data

 .../devicetree/bindings/dma/fsl-imx-sdma.txt       |   7 +-
 arch/arm/mach-imx/mm-imx25.c                       |  17 ---
 arch/arm/mach-imx/mm-imx5.c                        |  14 --
 drivers/dma/imx-sdma.c                             | 161 +++++++++++++++++----
 4 files changed, 137 insertions(+), 62 deletions(-)
author maintainer
#1 lore raw

PATCH 1/3 dma: imx-sdma: Use struct for driver data

Use a struct type instead of an enum type for distinguishing between different versions. This makes it simpler to handle multiple differences withtou cluttering the code with comparisons for certain devtypes.

---
 drivers/dma/imx-sdma.c | 63 ++++++++++++++++++++++++++------------------------
 1 file changed, 33 insertions(+), 30 deletions(-)
drivers/dma/imx-sdma.c +33 -30
index 1e44b8c..e3e7e3f 100644
@@ -307,9 +307,9 @@ struct sdma_firmware_header {
 	u32	ram_code_size;
 };
 
-enum sdma_devtype {
-	IMX31_SDMA,	/* runs on i.mx31 */
-	IMX35_SDMA,	/* runs on i.mx35 and later */
+struct sdma_driver_data {
+	int chnenbl0;
+	int num_events;
 };
 
 struct sdma_engine {
@@ -318,8 +318,6 @@ struct sdma_engine {
 	struct sdma_channel		channel[MAX_DMA_CHANNELS];
 	struct sdma_channel_control	*channel_control;
 	void __iomem			*regs;
-	enum sdma_devtype		devtype;
-	unsigned int			num_events;
 	struct sdma_context_data	*context;
 	dma_addr_t			context_phys;
 	struct dma_device		dma_device;
@@ -327,15 +325,26 @@ struct sdma_engine {
 	struct clk			*clk_ahb;
 	spinlock_t			channel_0_lock;
 	struct sdma_script_start_addrs	*script_addrs;
+	const struct sdma_driver_data	*drvdata;
+};
+
+struct sdma_driver_data sdma_imx31 = {
+	.chnenbl0 = SDMA_CHNENBL0_IMX31,
+	.num_events = 32,
+};
+
+struct sdma_driver_data sdma_imx35 = {
+	.chnenbl0 = SDMA_CHNENBL0_IMX35,
+	.num_events = 48,
 };
 
 static struct platform_device_id sdma_devtypes[] = {
 	{
 		.name = "imx31-sdma",
-		.driver_data = IMX31_SDMA,
+		.driver_data = (unsigned long)&sdma_imx31,
 	}, {
 		.name = "imx35-sdma",
-		.driver_data = IMX35_SDMA,
+		.driver_data = (unsigned long)&sdma_imx35,
 	}, {
 		/* sentinel */
 	}
@@ -343,8 +352,8 @@ static struct platform_device_id sdma_devtypes[] = {
 MODULE_DEVICE_TABLE(platform, sdma_devtypes);
 
 static const struct of_device_id sdma_dt_ids[] = {
-	{ .compatible = "fsl,imx31-sdma", .data = &sdma_devtypes[IMX31_SDMA], },
-	{ .compatible = "fsl,imx35-sdma", .data = &sdma_devtypes[IMX35_SDMA], },
+	{ .compatible = "fsl,imx31-sdma", .data = &sdma_imx31, },
+	{ .compatible = "fsl,imx35-sdma", .data = &sdma_imx35, },
 	{ /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, sdma_dt_ids);
@@ -356,8 +365,7 @@ MODULE_DEVICE_TABLE(of, sdma_dt_ids);
 
 static inline u32 chnenbl_ofs(struct sdma_engine *sdma, unsigned int event)
 {
-	u32 chnenbl0 = (sdma->devtype == IMX31_SDMA ? SDMA_CHNENBL0_IMX31 :
-						      SDMA_CHNENBL0_IMX35);
+	u32 chnenbl0 = sdma->drvdata->chnenbl0;
 	return chnenbl0 + event * 4;
 }
 
@@ -733,7 +741,7 @@ static int sdma_config_channel(struct sdma_channel *sdmac)
 	sdmac->per_addr = 0;
 
 	if (sdmac->event_id0) {
-		if (sdmac->event_id0 >= sdmac->sdma->num_events)
+		if (sdmac->event_id0 >= sdmac->sdma->drvdata->num_events)
 			return -EINVAL;
 		sdma_event_enable(sdmac, sdmac->event_id0);
 	}
@@ -1218,19 +1226,6 @@ static int __init sdma_init(struct sdma_engine *sdma)
 	int i, ret;
 	dma_addr_t ccb_phys;
 
-	switch (sdma->devtype) {
-	case IMX31_SDMA:
-		sdma->num_events = 32;
-		break;
-	case IMX35_SDMA:
-		sdma->num_events = 48;
-		break;
-	default:
-		dev_err(sdma->dev, "Unknown sdma type %d. aborting\n",
-			sdma->devtype);
-		return -ENODEV;
-	}
-
 	clk_enable(sdma->clk_ipg);
 	clk_enable(sdma->clk_ahb);
 
@@ -1257,7 +1252,7 @@ static int __init sdma_init(struct sdma_engine *sdma)
 			MAX_DMA_CHANNELS * sizeof (struct sdma_channel_control));
 
 	/* disable all channels */
-	for (i = 0; i < sdma->num_events; i++)
+	for (i = 0; i < sdma->drvdata->num_events; i++)
 		writel_relaxed(0, sdma->regs + chnenbl_ofs(sdma, i));
 
 	/* All channels have priority 0 */
@@ -1339,6 +1334,17 @@ static int __init sdma_probe(struct platform_device *pdev)
 	int i;
 	struct sdma_engine *sdma;
 	s32 *saddr_arr;
+	const struct sdma_driver_data *drvdata = NULL;
+
+	if (of_id)
+		drvdata = of_id->data;
+	else if (pdev->id_entry)
+		drvdata = (void *)pdev->id_entry->driver_data;
+
+	if (!drvdata) {
+		dev_err(&pdev->dev, "unable to find driver data\n");
+		return -EINVAL;
+	}
 
 	sdma = kzalloc(sizeof(*sdma), GFP_KERNEL);
 	if (!sdma)
@@ -1347,6 +1353,7 @@ static int __init sdma_probe(struct platform_device *pdev)
 	spin_lock_init(&sdma->channel_0_lock);
 
 	sdma->dev = &pdev->dev;
+	sdma->drvdata = drvdata;
 
 	iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	irq = platform_get_irq(pdev, 0);
@@ -1396,10 +1403,6 @@ static int __init sdma_probe(struct platform_device *pdev)
 	for (i = 0; i < SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; i++)
 		saddr_arr[i] = -EINVAL;
 
-	if (of_id)
-		pdev->id_entry = of_id->data;
-	sdma->devtype = pdev->id_entry->driver_data;
-
 	dma_cap_set(DMA_SLAVE, sdma->dma_device.cap_mask);
 	dma_cap_set(DMA_CYCLIC, sdma->dma_device.cap_mask);
 
Signature · 1 line
1.8.4.rc3
#2 lore raw

PATCH 1/3 dma: imx-sdma: Use struct for driver data

Quoted 3 lines · Sascha Hauer

Use a struct type instead of an enum type for distinguishing between different versions. This makes it simpler to handle multiple differences withtou cluttering the code with comparisons for certain devtypes.

typo^^^^^, fixed it up while applying

~Vinod

author maintainer
#3 lore raw

PATCH 2/3 dma: imx-sdma: Add ROM script addresses to driver

In reply to Sascha Hauer

This adds the ROM script addresses for i.MX25, i.MX5x and i.MX6 to the SDMA driver needed for the driver to work without additional firmware.

The ROM script addresses are SoC specific and in some cases even tapeout specific. This patch adds the ROM script addresses only for SoCs which do not have a tapeout specific SDMA ROM, because currently it's unclear how this case should be handled.

---
 .../devicetree/bindings/dma/fsl-imx-sdma.txt       |   7 +-
 drivers/dma/imx-sdma.c                             | 100 ++++++++++++++++++++-
 2 files changed, 105 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt +6 -1
index 68cee4f5..4fa814d 100644
@@ -1,7 +1,12 @@
 * Freescale Smart Direct Memory Access (SDMA) Controller for i.MX
 
 Required properties:
-- compatible : Should be "fsl,<chip>-sdma"
+- compatible : Should be "fsl,imx31-sdma", "fsl,imx31-to1-sdma",
+  "fsl,imx31-to2-sdma", "fsl,imx35-sdma", "fsl,imx35-to1-sdma",
+  "fsl,imx35-to2-sdma", "fsl,imx51-sdma", "fsl,imx53-sdma" or
+  "fsl,imx6q-sdma". The -to variants should be preferred since they
+  allow to determnine the correct ROM script addresses needed for
+  the driver to work without additional firmware.
 - reg : Should contain SDMA registers location and length
 - interrupts : Should contain SDMA interrupt
 - #dma-cells : Must be <3>.
drivers/dma/imx-sdma.c +99 -1

138 lines not on this page · raw message

Signature · 1 line
1.8.4.rc3
author maintainer
#4 lore raw

PATCH 3/3 ARM: i.MX: remove sdma script address arrays from platform data

In reply to Sascha Hauer

Now that the sdma driver holds the address tables for i.MX25/5 they are no longer needed in platform_data. Remove them.

---
 arch/arm/mach-imx/mm-imx25.c | 17 -----------------
 arch/arm/mach-imx/mm-imx5.c  | 14 --------------
 2 files changed, 31 deletions(-)
arch/arm/mach-imx/mm-imx25.c +0 -17
index e065c11..5211f62 100644
@@ -61,25 +61,8 @@ void __init mx25_init_irq(void)
 	mxc_init_irq(MX25_IO_ADDRESS(MX25_AVIC_BASE_ADDR));
 }
 
-static struct sdma_script_start_addrs imx25_sdma_script __initdata = {
-	.ap_2_ap_addr = 729,
-	.uart_2_mcu_addr = 904,
-	.per_2_app_addr = 1255,
-	.mcu_2_app_addr = 834,
-	.uartsh_2_mcu_addr = 1120,
-	.per_2_shp_addr = 1329,
-	.mcu_2_shp_addr = 1048,
-	.ata_2_mcu_addr = 1560,
-	.mcu_2_ata_addr = 1479,
-	.app_2_per_addr = 1189,
-	.app_2_mcu_addr = 770,
-	.shp_2_per_addr = 1407,
-	.shp_2_mcu_addr = 979,
-};
-
 static struct sdma_platform_data imx25_sdma_pdata __initdata = {
 	.fw_name = "sdma-imx25.bin",
-	.script_addrs = &imx25_sdma_script,
 };
 
 static const struct resource imx25_audmux_res[] __initconst = {
arch/arm/mach-imx/mm-imx5.c +0 -14
index cf193d8..051add9 100644
@@ -103,22 +103,8 @@ void __init mx53_init_irq(void)
 	tzic_init_irq(MX53_IO_ADDRESS(MX53_TZIC_BASE_ADDR));
 }
 
-static struct sdma_script_start_addrs imx51_sdma_script __initdata = {
-	.ap_2_ap_addr = 642,
-	.uart_2_mcu_addr = 817,
-	.mcu_2_app_addr = 747,
-	.mcu_2_shp_addr = 961,
-	.ata_2_mcu_addr = 1473,
-	.mcu_2_ata_addr = 1392,
-	.app_2_per_addr = 1033,
-	.app_2_mcu_addr = 683,
-	.shp_2_per_addr = 1251,
-	.shp_2_mcu_addr = 892,
-};
-
 static struct sdma_platform_data imx51_sdma_pdata __initdata = {
 	.fw_name = "sdma-imx51.bin",
-	.script_addrs = &imx51_sdma_script,
 };
 
 static const struct resource imx51_audmux_res[] __initconst = {
Signature · 1 line
1.8.4.rc3
#5 lore raw

PATCH v2 1/1 dma: imx-sdma: Add ROM script addresses to driver

In reply to Sascha Hauer
Quoted 10 lines · Sascha Hauer

Changes since v1:

- skip handling of SoCs which have a tapeout specific SDMA firmware, namely i.MX31/35

----------------------------------------------------------------
Sascha Hauer (3):
dma: imx-sdma: Use struct for driver data
dma: imx-sdma: Add ROM script addresses to driver
ARM: i.MX: remove sdma script address arrays from platform data

For the series,

Quoted 6 lines
 .../devicetree/bindings/dma/fsl-imx-sdma.txt       |   7 +-
 arch/arm/mach-imx/mm-imx25.c                       |  17 ---
 arch/arm/mach-imx/mm-imx5.c                        |  14 --
 drivers/dma/imx-sdma.c                             | 161 +++++++++++++++++----
 4 files changed, 137 insertions(+), 62 deletions(-)
author maintainer
#6 lore raw

PATCH v2 1/1 dma: imx-sdma: Add ROM script addresses to driver

In reply to Sascha Hauer

Hi Vinod,

Is this series ok for you to apply?

Thanks
Sascha

Quoted 22 lines · Sascha Hauer

Changes since v1:

- skip handling of SoCs which have a tapeout specific SDMA firmware, namely i.MX31/35

----------------------------------------------------------------
Sascha Hauer (3):
dma: imx-sdma: Use struct for driver data
dma: imx-sdma: Add ROM script addresses to driver
ARM: i.MX: remove sdma script address arrays from platform data

 .../devicetree/bindings/dma/fsl-imx-sdma.txt       |   7 +-
 arch/arm/mach-imx/mm-imx25.c                       |  17 ---
 arch/arm/mach-imx/mm-imx5.c                        |  14 --
 drivers/dma/imx-sdma.c                             | 161 +++++++++++++++++----
 4 files changed, 137 insertions(+), 62 deletions(-)

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Signature · 4 lines
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 |
Applied
#7 lore raw

PATCH v2 1/1 dma: imx-sdma: Add ROM script addresses to driver

In reply to Sascha Hauer
Quoted 4 lines · Sascha Hauer

Changes since v1:

- skip handling of SoCs which have a tapeout specific SDMA firmware, namely i.MX31/35

Applied, with typo fix in patch 1...

~Vinod