dma: imx-sdma: Add ROM script addresses to driver
Subsystems (5)
Sascha Hauer
maintainerPATCH 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(-)
Sascha Hauer
maintainerPATCH 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
@@ -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
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
Sascha Hauer
maintainerPATCH 2/3 dma: imx-sdma: Add ROM script addresses to driver
In reply to Sascha HauerThis 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
@@ -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
Sascha Hauer
maintainerPATCH 3/3 ARM: i.MX: remove sdma script address arrays from platform data
In reply to Sascha HauerNow 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
@@ -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
@@ -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
PATCH v2 1/1 dma: imx-sdma: Add ROM script addresses to driver
In reply to Sascha HauerQuoted 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(-)
Sascha Hauer
maintainerPATCH v2 1/1 dma: imx-sdma: Add ROM script addresses to driver
In reply to Sascha HauerHi 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 |
Vinod Koul
AppliedPATCH v2 1/1 dma: imx-sdma: Add ROM script addresses to driver
In reply to Sascha HauerQuoted 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