Commit 2fb166e5 authored by Ulf Hansson's avatar Ulf Hansson

Merge branch 'next_pxa_dma' into next

parents 9d3cce1e 399c4129
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dmaengine.h>
#include <linux/spi/pxa2xx_spi.h> #include <linux/spi/pxa2xx_spi.h>
#include <linux/platform_data/i2c-pxa.h> #include <linux/platform_data/i2c-pxa.h>
...@@ -59,16 +60,6 @@ static struct resource pxamci_resources[] = { ...@@ -59,16 +60,6 @@ static struct resource pxamci_resources[] = {
.end = IRQ_MMC, .end = IRQ_MMC,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
.start = 21,
.end = 21,
.flags = IORESOURCE_DMA,
},
[3] = {
.start = 22,
.end = 22,
.flags = IORESOURCE_DMA,
},
}; };
static u64 pxamci_dmamask = 0xffffffffUL; static u64 pxamci_dmamask = 0xffffffffUL;
...@@ -406,16 +397,6 @@ static struct resource pxa_ir_resources[] = { ...@@ -406,16 +397,6 @@ static struct resource pxa_ir_resources[] = {
.end = 0x40700023, .end = 0x40700023,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[5] = {
.start = 17,
.end = 17,
.flags = IORESOURCE_DMA,
},
[6] = {
.start = 18,
.end = 18,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa_device_ficp = { struct platform_device pxa_device_ficp = {
...@@ -544,18 +525,6 @@ static struct resource pxa25x_resource_ssp[] = { ...@@ -544,18 +525,6 @@ static struct resource pxa25x_resource_ssp[] = {
.end = IRQ_SSP, .end = IRQ_SSP,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
/* DRCMR for RX */
.start = 13,
.end = 13,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for TX */
.start = 14,
.end = 14,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa25x_device_ssp = { struct platform_device pxa25x_device_ssp = {
...@@ -582,18 +551,6 @@ static struct resource pxa25x_resource_nssp[] = { ...@@ -582,18 +551,6 @@ static struct resource pxa25x_resource_nssp[] = {
.end = IRQ_NSSP, .end = IRQ_NSSP,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
/* DRCMR for RX */
.start = 15,
.end = 15,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for TX */
.start = 16,
.end = 16,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa25x_device_nssp = { struct platform_device pxa25x_device_nssp = {
...@@ -620,18 +577,6 @@ static struct resource pxa25x_resource_assp[] = { ...@@ -620,18 +577,6 @@ static struct resource pxa25x_resource_assp[] = {
.end = IRQ_ASSP, .end = IRQ_ASSP,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
/* DRCMR for RX */
.start = 23,
.end = 23,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for TX */
.start = 24,
.end = 24,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa25x_device_assp = { struct platform_device pxa25x_device_assp = {
...@@ -750,18 +695,6 @@ static struct resource pxa27x_resource_ssp1[] = { ...@@ -750,18 +695,6 @@ static struct resource pxa27x_resource_ssp1[] = {
.end = IRQ_SSP, .end = IRQ_SSP,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
/* DRCMR for RX */
.start = 13,
.end = 13,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for TX */
.start = 14,
.end = 14,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa27x_device_ssp1 = { struct platform_device pxa27x_device_ssp1 = {
...@@ -788,18 +721,6 @@ static struct resource pxa27x_resource_ssp2[] = { ...@@ -788,18 +721,6 @@ static struct resource pxa27x_resource_ssp2[] = {
.end = IRQ_SSP2, .end = IRQ_SSP2,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
/* DRCMR for RX */
.start = 15,
.end = 15,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for TX */
.start = 16,
.end = 16,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa27x_device_ssp2 = { struct platform_device pxa27x_device_ssp2 = {
...@@ -826,18 +747,6 @@ static struct resource pxa27x_resource_ssp3[] = { ...@@ -826,18 +747,6 @@ static struct resource pxa27x_resource_ssp3[] = {
.end = IRQ_SSP3, .end = IRQ_SSP3,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
/* DRCMR for RX */
.start = 66,
.end = 66,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for TX */
.start = 67,
.end = 67,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa27x_device_ssp3 = { struct platform_device pxa27x_device_ssp3 = {
...@@ -894,16 +803,6 @@ static struct resource pxa3xx_resources_mci2[] = { ...@@ -894,16 +803,6 @@ static struct resource pxa3xx_resources_mci2[] = {
.end = IRQ_MMC2, .end = IRQ_MMC2,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
.start = 93,
.end = 93,
.flags = IORESOURCE_DMA,
},
[3] = {
.start = 94,
.end = 94,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa3xx_device_mci2 = { struct platform_device pxa3xx_device_mci2 = {
...@@ -933,16 +832,6 @@ static struct resource pxa3xx_resources_mci3[] = { ...@@ -933,16 +832,6 @@ static struct resource pxa3xx_resources_mci3[] = {
.end = IRQ_MMC3, .end = IRQ_MMC3,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
.start = 100,
.end = 100,
.flags = IORESOURCE_DMA,
},
[3] = {
.start = 101,
.end = 101,
.flags = IORESOURCE_DMA,
},
}; };
struct platform_device pxa3xx_device_mci3 = { struct platform_device pxa3xx_device_mci3 = {
...@@ -1020,18 +909,6 @@ static struct resource pxa3xx_resources_nand[] = { ...@@ -1020,18 +909,6 @@ static struct resource pxa3xx_resources_nand[] = {
.end = IRQ_NAND, .end = IRQ_NAND,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
/* DRCMR for Data DMA */
.start = 97,
.end = 97,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for Command DMA */
.start = 99,
.end = 99,
.flags = IORESOURCE_DMA,
},
}; };
static u64 pxa3xx_nand_dma_mask = DMA_BIT_MASK(32); static u64 pxa3xx_nand_dma_mask = DMA_BIT_MASK(32);
...@@ -1065,18 +942,6 @@ static struct resource pxa3xx_resource_ssp4[] = { ...@@ -1065,18 +942,6 @@ static struct resource pxa3xx_resource_ssp4[] = {
.end = IRQ_SSP4, .end = IRQ_SSP4,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
[2] = {
/* DRCMR for RX */
.start = 2,
.end = 2,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for TX */
.start = 3,
.end = 3,
.flags = IORESOURCE_DMA,
},
}; };
/* /*
...@@ -1202,11 +1067,6 @@ void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info) ...@@ -1202,11 +1067,6 @@ void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info)
platform_device_add(pd); platform_device_add(pd);
} }
static struct mmp_dma_platdata pxa_dma_pdata = {
.dma_channels = 0,
.nb_requestors = 0,
};
static struct resource pxa_dma_resource[] = { static struct resource pxa_dma_resource[] = {
[0] = { [0] = {
.start = 0x40000000, .start = 0x40000000,
...@@ -1233,9 +1093,7 @@ static struct platform_device pxa2xx_pxa_dma = { ...@@ -1233,9 +1093,7 @@ static struct platform_device pxa2xx_pxa_dma = {
.resource = pxa_dma_resource, .resource = pxa_dma_resource,
}; };
void __init pxa2xx_set_dmac_info(int nb_channels, int nb_requestors) void __init pxa2xx_set_dmac_info(struct mmp_dma_platdata *dma_pdata)
{ {
pxa_dma_pdata.dma_channels = nb_channels; pxa_register_device(&pxa2xx_pxa_dma, dma_pdata);
pxa_dma_pdata.nb_requestors = nb_requestors;
pxa_register_device(&pxa2xx_pxa_dma, &pxa_dma_pdata);
} }
/* SPDX-License-Identifier: GPL-2.0 */ /* SPDX-License-Identifier: GPL-2.0 */
#define PDMA_FILTER_PARAM(_prio, _requestor) (&(struct pxad_param) { \
.prio = PXAD_PRIO_##_prio, .drcmr = _requestor })
struct mmp_dma_platdata;
extern struct platform_device pxa_device_pmu; extern struct platform_device pxa_device_pmu;
extern struct platform_device pxa_device_mci; extern struct platform_device pxa_device_mci;
extern struct platform_device pxa3xx_device_mci2; extern struct platform_device pxa3xx_device_mci2;
...@@ -55,7 +59,7 @@ extern struct platform_device pxa3xx_device_gpio; ...@@ -55,7 +59,7 @@ extern struct platform_device pxa3xx_device_gpio;
extern struct platform_device pxa93x_device_gpio; extern struct platform_device pxa93x_device_gpio;
void __init pxa_register_device(struct platform_device *dev, void *data); void __init pxa_register_device(struct platform_device *dev, void *data);
void __init pxa2xx_set_dmac_info(int nb_channels, int nb_requestors); void __init pxa2xx_set_dmac_info(struct mmp_dma_platdata *dma_pdata);
struct i2c_pxa_platform_data; struct i2c_pxa_platform_data;
extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info); extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info);
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
* initialization stuff for PXA machines which can be overridden later if * initialization stuff for PXA machines which can be overridden later if
* need be. * need be.
*/ */
#include <linux/dmaengine.h>
#include <linux/dma/pxa-dma.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio-pxa.h> #include <linux/gpio-pxa.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -26,6 +28,7 @@ ...@@ -26,6 +28,7 @@
#include <linux/syscore_ops.h> #include <linux/syscore_ops.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/irqchip.h> #include <linux/irqchip.h>
#include <linux/platform_data/mmp_dma.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/suspend.h> #include <asm/suspend.h>
...@@ -201,6 +204,39 @@ static struct platform_device *pxa25x_devices[] __initdata = { ...@@ -201,6 +204,39 @@ static struct platform_device *pxa25x_devices[] __initdata = {
&pxa_device_asoc_platform, &pxa_device_asoc_platform,
}; };
static const struct dma_slave_map pxa25x_slave_map[] = {
/* PXA25x, PXA27x and PXA3xx common entries */
{ "pxa2xx-ac97", "pcm_pcm_mic_mono", PDMA_FILTER_PARAM(LOWEST, 8) },
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_in", PDMA_FILTER_PARAM(LOWEST, 9) },
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_out",
PDMA_FILTER_PARAM(LOWEST, 10) },
{ "pxa2xx-ac97", "pcm_pcm_stereo_in", PDMA_FILTER_PARAM(LOWEST, 11) },
{ "pxa2xx-ac97", "pcm_pcm_stereo_out", PDMA_FILTER_PARAM(LOWEST, 12) },
{ "pxa-ssp-dai.1", "rx", PDMA_FILTER_PARAM(LOWEST, 13) },
{ "pxa-ssp-dai.1", "tx", PDMA_FILTER_PARAM(LOWEST, 14) },
{ "pxa-ssp-dai.2", "rx", PDMA_FILTER_PARAM(LOWEST, 15) },
{ "pxa-ssp-dai.2", "tx", PDMA_FILTER_PARAM(LOWEST, 16) },
{ "pxa2xx-ir", "rx", PDMA_FILTER_PARAM(LOWEST, 17) },
{ "pxa2xx-ir", "tx", PDMA_FILTER_PARAM(LOWEST, 18) },
{ "pxa2xx-mci.0", "rx", PDMA_FILTER_PARAM(LOWEST, 21) },
{ "pxa2xx-mci.0", "tx", PDMA_FILTER_PARAM(LOWEST, 22) },
/* PXA25x specific map */
{ "pxa25x-ssp.0", "rx", PDMA_FILTER_PARAM(LOWEST, 13) },
{ "pxa25x-ssp.0", "tx", PDMA_FILTER_PARAM(LOWEST, 14) },
{ "pxa25x-nssp.1", "rx", PDMA_FILTER_PARAM(LOWEST, 15) },
{ "pxa25x-nssp.1", "tx", PDMA_FILTER_PARAM(LOWEST, 16) },
{ "pxa25x-nssp.2", "rx", PDMA_FILTER_PARAM(LOWEST, 23) },
{ "pxa25x-nssp.2", "tx", PDMA_FILTER_PARAM(LOWEST, 24) },
};
static struct mmp_dma_platdata pxa25x_dma_pdata = {
.dma_channels = 16,
.nb_requestors = 40,
.slave_map = pxa25x_slave_map,
.slave_map_cnt = ARRAY_SIZE(pxa25x_slave_map),
};
static int __init pxa25x_init(void) static int __init pxa25x_init(void)
{ {
int ret = 0; int ret = 0;
...@@ -215,7 +251,7 @@ static int __init pxa25x_init(void) ...@@ -215,7 +251,7 @@ static int __init pxa25x_init(void)
register_syscore_ops(&pxa2xx_mfp_syscore_ops); register_syscore_ops(&pxa2xx_mfp_syscore_ops);
if (!of_have_populated_dt()) { if (!of_have_populated_dt()) {
pxa2xx_set_dmac_info(16, 40); pxa2xx_set_dmac_info(&pxa25x_dma_pdata);
pxa_register_device(&pxa25x_device_gpio, &pxa25x_gpio_info); pxa_register_device(&pxa25x_device_gpio, &pxa25x_gpio_info);
ret = platform_add_devices(pxa25x_devices, ret = platform_add_devices(pxa25x_devices,
ARRAY_SIZE(pxa25x_devices)); ARRAY_SIZE(pxa25x_devices));
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/dmaengine.h>
#include <linux/dma/pxa-dma.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio-pxa.h> #include <linux/gpio-pxa.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -23,6 +25,7 @@ ...@@ -23,6 +25,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/platform_data/i2c-pxa.h> #include <linux/platform_data/i2c-pxa.h>
#include <linux/platform_data/mmp_dma.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <mach/hardware.h> #include <mach/hardware.h>
...@@ -297,6 +300,40 @@ static struct platform_device *devices[] __initdata = { ...@@ -297,6 +300,40 @@ static struct platform_device *devices[] __initdata = {
&pxa27x_device_pwm1, &pxa27x_device_pwm1,
}; };
static const struct dma_slave_map pxa27x_slave_map[] = {
/* PXA25x, PXA27x and PXA3xx common entries */
{ "pxa2xx-ac97", "pcm_pcm_mic_mono", PDMA_FILTER_PARAM(LOWEST, 8) },
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_in", PDMA_FILTER_PARAM(LOWEST, 9) },
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_out",
PDMA_FILTER_PARAM(LOWEST, 10) },
{ "pxa2xx-ac97", "pcm_pcm_stereo_in", PDMA_FILTER_PARAM(LOWEST, 11) },
{ "pxa2xx-ac97", "pcm_pcm_stereo_out", PDMA_FILTER_PARAM(LOWEST, 12) },
{ "pxa-ssp-dai.0", "rx", PDMA_FILTER_PARAM(LOWEST, 13) },
{ "pxa-ssp-dai.0", "tx", PDMA_FILTER_PARAM(LOWEST, 14) },
{ "pxa-ssp-dai.1", "rx", PDMA_FILTER_PARAM(LOWEST, 15) },
{ "pxa-ssp-dai.1", "tx", PDMA_FILTER_PARAM(LOWEST, 16) },
{ "pxa2xx-ir", "rx", PDMA_FILTER_PARAM(LOWEST, 17) },
{ "pxa2xx-ir", "tx", PDMA_FILTER_PARAM(LOWEST, 18) },
{ "pxa2xx-mci.0", "rx", PDMA_FILTER_PARAM(LOWEST, 21) },
{ "pxa2xx-mci.0", "tx", PDMA_FILTER_PARAM(LOWEST, 22) },
{ "pxa-ssp-dai.2", "rx", PDMA_FILTER_PARAM(LOWEST, 66) },
{ "pxa-ssp-dai.2", "tx", PDMA_FILTER_PARAM(LOWEST, 67) },
/* PXA27x specific map */
{ "pxa2xx-i2s", "rx", PDMA_FILTER_PARAM(LOWEST, 2) },
{ "pxa2xx-i2s", "tx", PDMA_FILTER_PARAM(LOWEST, 3) },
{ "pxa27x-camera.0", "CI_Y", PDMA_FILTER_PARAM(HIGHEST, 68) },
{ "pxa27x-camera.0", "CI_U", PDMA_FILTER_PARAM(HIGHEST, 69) },
{ "pxa27x-camera.0", "CI_V", PDMA_FILTER_PARAM(HIGHEST, 70) },
};
static struct mmp_dma_platdata pxa27x_dma_pdata = {
.dma_channels = 32,
.nb_requestors = 75,
.slave_map = pxa27x_slave_map,
.slave_map_cnt = ARRAY_SIZE(pxa27x_slave_map),
};
static int __init pxa27x_init(void) static int __init pxa27x_init(void)
{ {
int ret = 0; int ret = 0;
...@@ -313,7 +350,7 @@ static int __init pxa27x_init(void) ...@@ -313,7 +350,7 @@ static int __init pxa27x_init(void)
if (!of_have_populated_dt()) { if (!of_have_populated_dt()) {
pxa_register_device(&pxa27x_device_gpio, pxa_register_device(&pxa27x_device_gpio,
&pxa27x_gpio_info); &pxa27x_gpio_info);
pxa2xx_set_dmac_info(32, 75); pxa2xx_set_dmac_info(&pxa27x_dma_pdata);
ret = platform_add_devices(devices, ret = platform_add_devices(devices,
ARRAY_SIZE(devices)); ARRAY_SIZE(devices));
} }
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/dmaengine.h>
#include <linux/dma/pxa-dma.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -24,6 +26,7 @@ ...@@ -24,6 +26,7 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/syscore_ops.h> #include <linux/syscore_ops.h>
#include <linux/platform_data/i2c-pxa.h> #include <linux/platform_data/i2c-pxa.h>
#include <linux/platform_data/mmp_dma.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/suspend.h> #include <asm/suspend.h>
...@@ -421,6 +424,42 @@ static struct platform_device *devices[] __initdata = { ...@@ -421,6 +424,42 @@ static struct platform_device *devices[] __initdata = {
&pxa27x_device_pwm1, &pxa27x_device_pwm1,
}; };
static const struct dma_slave_map pxa3xx_slave_map[] = {
/* PXA25x, PXA27x and PXA3xx common entries */
{ "pxa2xx-ac97", "pcm_pcm_mic_mono", PDMA_FILTER_PARAM(LOWEST, 8) },
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_in", PDMA_FILTER_PARAM(LOWEST, 9) },
{ "pxa2xx-ac97", "pcm_pcm_aux_mono_out",
PDMA_FILTER_PARAM(LOWEST, 10) },
{ "pxa2xx-ac97", "pcm_pcm_stereo_in", PDMA_FILTER_PARAM(LOWEST, 11) },
{ "pxa2xx-ac97", "pcm_pcm_stereo_out", PDMA_FILTER_PARAM(LOWEST, 12) },
{ "pxa-ssp-dai.0", "rx", PDMA_FILTER_PARAM(LOWEST, 13) },
{ "pxa-ssp-dai.0", "tx", PDMA_FILTER_PARAM(LOWEST, 14) },
{ "pxa-ssp-dai.1", "rx", PDMA_FILTER_PARAM(LOWEST, 15) },
{ "pxa-ssp-dai.1", "tx", PDMA_FILTER_PARAM(LOWEST, 16) },
{ "pxa2xx-ir", "rx", PDMA_FILTER_PARAM(LOWEST, 17) },
{ "pxa2xx-ir", "tx", PDMA_FILTER_PARAM(LOWEST, 18) },
{ "pxa2xx-mci.0", "rx", PDMA_FILTER_PARAM(LOWEST, 21) },
{ "pxa2xx-mci.0", "tx", PDMA_FILTER_PARAM(LOWEST, 22) },
{ "pxa-ssp-dai.2", "rx", PDMA_FILTER_PARAM(LOWEST, 66) },
{ "pxa-ssp-dai.2", "tx", PDMA_FILTER_PARAM(LOWEST, 67) },
/* PXA3xx specific map */
{ "pxa-ssp-dai.3", "rx", PDMA_FILTER_PARAM(LOWEST, 2) },
{ "pxa-ssp-dai.3", "tx", PDMA_FILTER_PARAM(LOWEST, 3) },
{ "pxa2xx-mci.1", "rx", PDMA_FILTER_PARAM(LOWEST, 93) },
{ "pxa2xx-mci.1", "tx", PDMA_FILTER_PARAM(LOWEST, 94) },
{ "pxa3xx-nand", "data", PDMA_FILTER_PARAM(LOWEST, 97) },
{ "pxa2xx-mci.2", "rx", PDMA_FILTER_PARAM(LOWEST, 100) },
{ "pxa2xx-mci.2", "tx", PDMA_FILTER_PARAM(LOWEST, 101) },
};
static struct mmp_dma_platdata pxa3xx_dma_pdata = {
.dma_channels = 32,
.nb_requestors = 100,
.slave_map = pxa3xx_slave_map,
.slave_map_cnt = ARRAY_SIZE(pxa3xx_slave_map),
};
static int __init pxa3xx_init(void) static int __init pxa3xx_init(void)
{ {
int ret = 0; int ret = 0;
...@@ -456,7 +495,7 @@ static int __init pxa3xx_init(void) ...@@ -456,7 +495,7 @@ static int __init pxa3xx_init(void)
if (of_have_populated_dt()) if (of_have_populated_dt())
return 0; return 0;
pxa2xx_set_dmac_info(32, 100); pxa2xx_set_dmac_info(&pxa3xx_dma_pdata);
ret = platform_add_devices(devices, ARRAY_SIZE(devices)); ret = platform_add_devices(devices, ARRAY_SIZE(devices));
if (ret) if (ret)
return ret; return ret;
......
...@@ -127,53 +127,6 @@ static int pxa_ssp_probe(struct platform_device *pdev) ...@@ -127,53 +127,6 @@ static int pxa_ssp_probe(struct platform_device *pdev)
if (IS_ERR(ssp->clk)) if (IS_ERR(ssp->clk))
return PTR_ERR(ssp->clk); return PTR_ERR(ssp->clk);
if (dev->of_node) {
struct of_phandle_args dma_spec;
struct device_node *np = dev->of_node;
int ret;
/*
* FIXME: we should allocate the DMA channel from this
* context and pass the channel down to the ssp users.
* For now, we lookup the rx and tx indices manually
*/
/* rx */
ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells",
0, &dma_spec);
if (ret) {
dev_err(dev, "Can't parse dmas property\n");
return -ENODEV;
}
ssp->drcmr_rx = dma_spec.args[0];
of_node_put(dma_spec.np);
/* tx */
ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells",
1, &dma_spec);
if (ret) {
dev_err(dev, "Can't parse dmas property\n");
return -ENODEV;
}
ssp->drcmr_tx = dma_spec.args[0];
of_node_put(dma_spec.np);
} else {
res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
if (res == NULL) {
dev_err(dev, "no SSP RX DRCMR defined\n");
return -ENODEV;
}
ssp->drcmr_rx = res->start;
res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
if (res == NULL) {
dev_err(dev, "no SSP TX DRCMR defined\n");
return -ENODEV;
}
ssp->drcmr_tx = res->start;
}
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res == NULL) { if (res == NULL) {
dev_err(dev, "no memory resource defined\n"); dev_err(dev, "no memory resource defined\n");
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include <linux/libata.h> #include <linux/libata.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/dma/pxa-dma.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/completion.h> #include <linux/completion.h>
...@@ -180,8 +179,6 @@ static int pxa_ata_probe(struct platform_device *pdev) ...@@ -180,8 +179,6 @@ static int pxa_ata_probe(struct platform_device *pdev)
struct resource *irq_res; struct resource *irq_res;
struct pata_pxa_pdata *pdata = dev_get_platdata(&pdev->dev); struct pata_pxa_pdata *pdata = dev_get_platdata(&pdev->dev);
struct dma_slave_config config; struct dma_slave_config config;
dma_cap_mask_t mask;
struct pxad_param param;
int ret = 0; int ret = 0;
/* /*
...@@ -278,10 +275,6 @@ static int pxa_ata_probe(struct platform_device *pdev) ...@@ -278,10 +275,6 @@ static int pxa_ata_probe(struct platform_device *pdev)
ap->private_data = data; ap->private_data = data;
dma_cap_zero(mask);
dma_cap_set(DMA_SLAVE, mask);
param.prio = PXAD_PRIO_LOWEST;
param.drcmr = pdata->dma_dreq;
memset(&config, 0, sizeof(config)); memset(&config, 0, sizeof(config));
config.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; config.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
...@@ -294,8 +287,7 @@ static int pxa_ata_probe(struct platform_device *pdev) ...@@ -294,8 +287,7 @@ static int pxa_ata_probe(struct platform_device *pdev)
* Request the DMA channel * Request the DMA channel
*/ */
data->dma_chan = data->dma_chan =
dma_request_slave_channel_compat(mask, pxad_filter_fn, dma_request_slave_channel(&pdev->dev, "data");
&param, &pdev->dev, "data");
if (!data->dma_chan) if (!data->dma_chan)
return -EBUSY; return -EBUSY;
ret = dmaengine_slave_config(data->dma_chan, &config); ret = dmaengine_slave_config(data->dma_chan, &config);
......
...@@ -179,6 +179,8 @@ static unsigned int pxad_drcmr(unsigned int line) ...@@ -179,6 +179,8 @@ static unsigned int pxad_drcmr(unsigned int line)
return 0x1000 + line * 4; return 0x1000 + line * 4;
} }
bool pxad_filter_fn(struct dma_chan *chan, void *param);
/* /*
* Debug fs * Debug fs
*/ */
...@@ -760,6 +762,8 @@ static void pxad_free_chan_resources(struct dma_chan *dchan) ...@@ -760,6 +762,8 @@ static void pxad_free_chan_resources(struct dma_chan *dchan)
dma_pool_destroy(chan->desc_pool); dma_pool_destroy(chan->desc_pool);
chan->desc_pool = NULL; chan->desc_pool = NULL;
chan->drcmr = U32_MAX;
chan->prio = PXAD_PRIO_LOWEST;
} }
static void pxad_free_desc(struct virt_dma_desc *vd) static void pxad_free_desc(struct virt_dma_desc *vd)
...@@ -1384,6 +1388,9 @@ static int pxad_init_dmadev(struct platform_device *op, ...@@ -1384,6 +1388,9 @@ static int pxad_init_dmadev(struct platform_device *op,
c = devm_kzalloc(&op->dev, sizeof(*c), GFP_KERNEL); c = devm_kzalloc(&op->dev, sizeof(*c), GFP_KERNEL);
if (!c) if (!c)
return -ENOMEM; return -ENOMEM;
c->drcmr = U32_MAX;
c->prio = PXAD_PRIO_LOWEST;
c->vc.desc_free = pxad_free_desc; c->vc.desc_free = pxad_free_desc;
vchan_init(&c->vc, &pdev->slave); vchan_init(&c->vc, &pdev->slave);
init_waitqueue_head(&c->wq_state); init_waitqueue_head(&c->wq_state);
...@@ -1396,9 +1403,10 @@ static int pxad_probe(struct platform_device *op) ...@@ -1396,9 +1403,10 @@ static int pxad_probe(struct platform_device *op)
{ {
struct pxad_device *pdev; struct pxad_device *pdev;
const struct of_device_id *of_id; const struct of_device_id *of_id;
const struct dma_slave_map *slave_map = NULL;
struct mmp_dma_platdata *pdata = dev_get_platdata(&op->dev); struct mmp_dma_platdata *pdata = dev_get_platdata(&op->dev);
struct resource *iores; struct resource *iores;
int ret, dma_channels = 0, nb_requestors = 0; int ret, dma_channels = 0, nb_requestors = 0, slave_map_cnt = 0;
const enum dma_slave_buswidth widths = const enum dma_slave_buswidth widths =
DMA_SLAVE_BUSWIDTH_1_BYTE | DMA_SLAVE_BUSWIDTH_2_BYTES | DMA_SLAVE_BUSWIDTH_1_BYTE | DMA_SLAVE_BUSWIDTH_2_BYTES |
DMA_SLAVE_BUSWIDTH_4_BYTES; DMA_SLAVE_BUSWIDTH_4_BYTES;
...@@ -1429,6 +1437,8 @@ static int pxad_probe(struct platform_device *op) ...@@ -1429,6 +1437,8 @@ static int pxad_probe(struct platform_device *op)
} else if (pdata && pdata->dma_channels) { } else if (pdata && pdata->dma_channels) {
dma_channels = pdata->dma_channels; dma_channels = pdata->dma_channels;
nb_requestors = pdata->nb_requestors; nb_requestors = pdata->nb_requestors;
slave_map = pdata->slave_map;
slave_map_cnt = pdata->slave_map_cnt;
} else { } else {
dma_channels = 32; /* default 32 channel */ dma_channels = 32; /* default 32 channel */
} }
...@@ -1440,6 +1450,9 @@ static int pxad_probe(struct platform_device *op) ...@@ -1440,6 +1450,9 @@ static int pxad_probe(struct platform_device *op)
pdev->slave.device_prep_dma_memcpy = pxad_prep_memcpy; pdev->slave.device_prep_dma_memcpy = pxad_prep_memcpy;
pdev->slave.device_prep_slave_sg = pxad_prep_slave_sg; pdev->slave.device_prep_slave_sg = pxad_prep_slave_sg;
pdev->slave.device_prep_dma_cyclic = pxad_prep_dma_cyclic; pdev->slave.device_prep_dma_cyclic = pxad_prep_dma_cyclic;
pdev->slave.filter.map = slave_map;
pdev->slave.filter.mapcnt = slave_map_cnt;
pdev->slave.filter.fn = pxad_filter_fn;
pdev->slave.copy_align = PDMA_ALIGNMENT; pdev->slave.copy_align = PDMA_ALIGNMENT;
pdev->slave.src_addr_widths = widths; pdev->slave.src_addr_widths = widths;
......
...@@ -2375,8 +2375,6 @@ static int pxa_camera_probe(struct platform_device *pdev) ...@@ -2375,8 +2375,6 @@ static int pxa_camera_probe(struct platform_device *pdev)
.src_maxburst = 8, .src_maxburst = 8,
.direction = DMA_DEV_TO_MEM, .direction = DMA_DEV_TO_MEM,
}; };
dma_cap_mask_t mask;
struct pxad_param params;
char clk_name[V4L2_CLK_NAME_SIZE]; char clk_name[V4L2_CLK_NAME_SIZE];
int irq; int irq;
int err = 0, i; int err = 0, i;
...@@ -2450,34 +2448,20 @@ static int pxa_camera_probe(struct platform_device *pdev) ...@@ -2450,34 +2448,20 @@ static int pxa_camera_probe(struct platform_device *pdev)
pcdev->base = base; pcdev->base = base;
/* request dma */ /* request dma */
dma_cap_zero(mask); pcdev->dma_chans[0] = dma_request_slave_channel(&pdev->dev, "CI_Y");
dma_cap_set(DMA_SLAVE, mask);
dma_cap_set(DMA_PRIVATE, mask);
params.prio = 0;
params.drcmr = 68;
pcdev->dma_chans[0] =
dma_request_slave_channel_compat(mask, pxad_filter_fn,
&params, &pdev->dev, "CI_Y");
if (!pcdev->dma_chans[0]) { if (!pcdev->dma_chans[0]) {
dev_err(&pdev->dev, "Can't request DMA for Y\n"); dev_err(&pdev->dev, "Can't request DMA for Y\n");
return -ENODEV; return -ENODEV;
} }
params.drcmr = 69; pcdev->dma_chans[1] = dma_request_slave_channel(&pdev->dev, "CI_U");
pcdev->dma_chans[1] =
dma_request_slave_channel_compat(mask, pxad_filter_fn,
&params, &pdev->dev, "CI_U");
if (!pcdev->dma_chans[1]) { if (!pcdev->dma_chans[1]) {
dev_err(&pdev->dev, "Can't request DMA for Y\n"); dev_err(&pdev->dev, "Can't request DMA for Y\n");
err = -ENODEV; err = -ENODEV;
goto exit_free_dma_y; goto exit_free_dma_y;
} }
params.drcmr = 70; pcdev->dma_chans[2] = dma_request_slave_channel(&pdev->dev, "CI_V");
pcdev->dma_chans[2] =
dma_request_slave_channel_compat(mask, pxad_filter_fn,
&params, &pdev->dev, "CI_V");
if (!pcdev->dma_chans[2]) { if (!pcdev->dma_chans[2]) {
dev_err(&pdev->dev, "Can't request DMA for V\n"); dev_err(&pdev->dev, "Can't request DMA for V\n");
err = -ENODEV; err = -ENODEV;
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dma/pxa-dma.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
...@@ -637,10 +636,8 @@ static int pxamci_probe(struct platform_device *pdev) ...@@ -637,10 +636,8 @@ static int pxamci_probe(struct platform_device *pdev)
{ {
struct mmc_host *mmc; struct mmc_host *mmc;
struct pxamci_host *host = NULL; struct pxamci_host *host = NULL;
struct resource *r, *dmarx, *dmatx; struct resource *r;
struct pxad_param param_rx, param_tx;
int ret, irq, gpio_cd = -1, gpio_ro = -1, gpio_power = -1; int ret, irq, gpio_cd = -1, gpio_ro = -1, gpio_power = -1;
dma_cap_mask_t mask;
ret = pxamci_of_init(pdev); ret = pxamci_of_init(pdev);
if (ret) if (ret)
...@@ -739,34 +736,14 @@ static int pxamci_probe(struct platform_device *pdev) ...@@ -739,34 +736,14 @@ static int pxamci_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, mmc); platform_set_drvdata(pdev, mmc);
if (!pdev->dev.of_node) { host->dma_chan_rx = dma_request_slave_channel(&pdev->dev, "rx");
dmarx = platform_get_resource(pdev, IORESOURCE_DMA, 0);
dmatx = platform_get_resource(pdev, IORESOURCE_DMA, 1);
if (!dmarx || !dmatx) {
ret = -ENXIO;
goto out;
}
param_rx.prio = PXAD_PRIO_LOWEST;
param_rx.drcmr = dmarx->start;
param_tx.prio = PXAD_PRIO_LOWEST;
param_tx.drcmr = dmatx->start;
}
dma_cap_zero(mask);
dma_cap_set(DMA_SLAVE, mask);
host->dma_chan_rx =
dma_request_slave_channel_compat(mask, pxad_filter_fn,
&param_rx, &pdev->dev, "rx");
if (host->dma_chan_rx == NULL) { if (host->dma_chan_rx == NULL) {
dev_err(&pdev->dev, "unable to request rx dma channel\n"); dev_err(&pdev->dev, "unable to request rx dma channel\n");
ret = -ENODEV; ret = -ENODEV;
goto out; goto out;
} }
host->dma_chan_tx = host->dma_chan_tx = dma_request_slave_channel(&pdev->dev, "tx");
dma_request_slave_channel_compat(mask, pxad_filter_fn,
&param_tx, &pdev->dev, "tx");
if (host->dma_chan_tx == NULL) { if (host->dma_chan_tx == NULL) {
dev_err(&pdev->dev, "unable to request tx dma channel\n"); dev_err(&pdev->dev, "unable to request tx dma channel\n");
ret = -ENODEV; ret = -ENODEV;
......
...@@ -2612,8 +2612,6 @@ static int marvell_nfc_init_dma(struct marvell_nfc *nfc) ...@@ -2612,8 +2612,6 @@ static int marvell_nfc_init_dma(struct marvell_nfc *nfc)
dev); dev);
struct dma_slave_config config = {}; struct dma_slave_config config = {};
struct resource *r; struct resource *r;
dma_cap_mask_t mask;
struct pxad_param param;
int ret; int ret;
if (!IS_ENABLED(CONFIG_PXA_DMA)) { if (!IS_ENABLED(CONFIG_PXA_DMA)) {
...@@ -2626,20 +2624,7 @@ static int marvell_nfc_init_dma(struct marvell_nfc *nfc) ...@@ -2626,20 +2624,7 @@ static int marvell_nfc_init_dma(struct marvell_nfc *nfc)
if (ret) if (ret)
return ret; return ret;
r = platform_get_resource(pdev, IORESOURCE_DMA, 0); nfc->dma_chan = dma_request_slave_channel(nfc->dev, "data");
if (!r) {
dev_err(nfc->dev, "No resource defined for data DMA\n");
return -ENXIO;
}
param.drcmr = r->start;
param.prio = PXAD_PRIO_LOWEST;
dma_cap_zero(mask);
dma_cap_set(DMA_SLAVE, mask);
nfc->dma_chan =
dma_request_slave_channel_compat(mask, pxad_filter_fn,
&param, nfc->dev,
"data");
if (!nfc->dma_chan) { if (!nfc->dma_chan) {
dev_err(nfc->dev, dev_err(nfc->dev,
"Unable to request data DMA channel\n"); "Unable to request data DMA channel\n");
......
...@@ -9,6 +9,15 @@ enum pxad_chan_prio { ...@@ -9,6 +9,15 @@ enum pxad_chan_prio {
PXAD_PRIO_LOWEST, PXAD_PRIO_LOWEST,
}; };
/**
* struct pxad_param - dma channel request parameters
* @drcmr: requestor line number
* @prio: minimal mandatory priority of the channel
*
* If a requested channel is granted, its priority will be at least @prio,
* ie. if PXAD_PRIO_LOW is required, the requested channel will be either
* PXAD_PRIO_LOW, PXAD_PRIO_NORMAL or PXAD_PRIO_HIGHEST.
*/
struct pxad_param { struct pxad_param {
unsigned int drcmr; unsigned int drcmr;
enum pxad_chan_prio prio; enum pxad_chan_prio prio;
......
...@@ -12,9 +12,13 @@ ...@@ -12,9 +12,13 @@
#ifndef MMP_DMA_H #ifndef MMP_DMA_H
#define MMP_DMA_H #define MMP_DMA_H
struct dma_slave_map;
struct mmp_dma_platdata { struct mmp_dma_platdata {
int dma_channels; int dma_channels;
int nb_requestors; int nb_requestors;
int slave_map_cnt;
const struct dma_slave_map *slave_map;
}; };
#endif /* MMP_DMA_H */ #endif /* MMP_DMA_H */
...@@ -212,8 +212,6 @@ struct ssp_device { ...@@ -212,8 +212,6 @@ struct ssp_device {
int type; int type;
int use_count; int use_count;
int irq; int irq;
int drcmr_rx;
int drcmr_tx;
struct device_node *of_node; struct device_node *of_node;
}; };
......
...@@ -105,9 +105,8 @@ static int pxa_ssp_startup(struct snd_pcm_substream *substream, ...@@ -105,9 +105,8 @@ static int pxa_ssp_startup(struct snd_pcm_substream *substream,
dma = kzalloc(sizeof(struct snd_dmaengine_dai_dma_data), GFP_KERNEL); dma = kzalloc(sizeof(struct snd_dmaengine_dai_dma_data), GFP_KERNEL);
if (!dma) if (!dma)
return -ENOMEM; return -ENOMEM;
dma->chan_name = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
dma->filter_data = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? "tx" : "rx";
&ssp->drcmr_tx : &ssp->drcmr_rx;
snd_soc_dai_set_dma_data(cpu_dai, substream, dma); snd_soc_dai_set_dma_data(cpu_dai, substream, dma);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment