Merge branch 'next_pxa_dma' into next
This commit is contained in:
Коммит
2fb166e50e
|
@ -4,6 +4,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/spi/pxa2xx_spi.h>
|
||||
#include <linux/platform_data/i2c-pxa.h>
|
||||
|
||||
|
@ -59,16 +60,6 @@ static struct resource pxamci_resources[] = {
|
|||
.end = IRQ_MMC,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = 21,
|
||||
.end = 21,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
.start = 22,
|
||||
.end = 22,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 pxamci_dmamask = 0xffffffffUL;
|
||||
|
@ -406,16 +397,6 @@ static struct resource pxa_ir_resources[] = {
|
|||
.end = 0x40700023,
|
||||
.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 = {
|
||||
|
@ -544,18 +525,6 @@ static struct resource pxa25x_resource_ssp[] = {
|
|||
.end = IRQ_SSP,
|
||||
.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 = {
|
||||
|
@ -582,18 +551,6 @@ static struct resource pxa25x_resource_nssp[] = {
|
|||
.end = IRQ_NSSP,
|
||||
.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 = {
|
||||
|
@ -620,18 +577,6 @@ static struct resource pxa25x_resource_assp[] = {
|
|||
.end = IRQ_ASSP,
|
||||
.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 = {
|
||||
|
@ -750,18 +695,6 @@ static struct resource pxa27x_resource_ssp1[] = {
|
|||
.end = IRQ_SSP,
|
||||
.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 = {
|
||||
|
@ -788,18 +721,6 @@ static struct resource pxa27x_resource_ssp2[] = {
|
|||
.end = IRQ_SSP2,
|
||||
.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 = {
|
||||
|
@ -826,18 +747,6 @@ static struct resource pxa27x_resource_ssp3[] = {
|
|||
.end = IRQ_SSP3,
|
||||
.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 = {
|
||||
|
@ -894,16 +803,6 @@ static struct resource pxa3xx_resources_mci2[] = {
|
|||
.end = IRQ_MMC2,
|
||||
.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 = {
|
||||
|
@ -933,16 +832,6 @@ static struct resource pxa3xx_resources_mci3[] = {
|
|||
.end = IRQ_MMC3,
|
||||
.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 = {
|
||||
|
@ -1020,18 +909,6 @@ static struct resource pxa3xx_resources_nand[] = {
|
|||
.end = IRQ_NAND,
|
||||
.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);
|
||||
|
@ -1065,18 +942,6 @@ static struct resource pxa3xx_resource_ssp4[] = {
|
|||
.end = IRQ_SSP4,
|
||||
.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)
|
|||
platform_device_add(pd);
|
||||
}
|
||||
|
||||
static struct mmp_dma_platdata pxa_dma_pdata = {
|
||||
.dma_channels = 0,
|
||||
.nb_requestors = 0,
|
||||
};
|
||||
|
||||
static struct resource pxa_dma_resource[] = {
|
||||
[0] = {
|
||||
.start = 0x40000000,
|
||||
|
@ -1233,9 +1093,7 @@ static struct platform_device pxa2xx_pxa_dma = {
|
|||
.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_dma_pdata.nb_requestors = nb_requestors;
|
||||
pxa_register_device(&pxa2xx_pxa_dma, &pxa_dma_pdata);
|
||||
pxa_register_device(&pxa2xx_pxa_dma, dma_pdata);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
/* 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_mci;
|
||||
extern struct platform_device pxa3xx_device_mci2;
|
||||
|
@ -55,7 +59,7 @@ extern struct platform_device pxa3xx_device_gpio;
|
|||
extern struct platform_device pxa93x_device_gpio;
|
||||
|
||||
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;
|
||||
extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info);
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
* initialization stuff for PXA machines which can be overridden later if
|
||||
* need be.
|
||||
*/
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio-pxa.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -26,6 +28,7 @@
|
|||
#include <linux/syscore_ops.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <linux/platform_data/mmp_dma.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/suspend.h>
|
||||
|
@ -201,6 +204,39 @@ static struct platform_device *pxa25x_devices[] __initdata = {
|
|||
&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)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -215,7 +251,7 @@ static int __init pxa25x_init(void)
|
|||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||
|
||||
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);
|
||||
ret = platform_add_devices(pxa25x_devices,
|
||||
ARRAY_SIZE(pxa25x_devices));
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio-pxa.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -23,6 +25,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/platform_data/i2c-pxa.h>
|
||||
#include <linux/platform_data/mmp_dma.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/hardware.h>
|
||||
|
@ -297,6 +300,40 @@ static struct platform_device *devices[] __initdata = {
|
|||
&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)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -313,7 +350,7 @@ static int __init pxa27x_init(void)
|
|||
if (!of_have_populated_dt()) {
|
||||
pxa_register_device(&pxa27x_device_gpio,
|
||||
&pxa27x_gpio_info);
|
||||
pxa2xx_set_dmac_info(32, 75);
|
||||
pxa2xx_set_dmac_info(&pxa27x_dma_pdata);
|
||||
ret = platform_add_devices(devices,
|
||||
ARRAY_SIZE(devices));
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -24,6 +26,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/platform_data/i2c-pxa.h>
|
||||
#include <linux/platform_data/mmp_dma.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/suspend.h>
|
||||
|
@ -421,6 +424,42 @@ static struct platform_device *devices[] __initdata = {
|
|||
&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)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -456,7 +495,7 @@ static int __init pxa3xx_init(void)
|
|||
if (of_have_populated_dt())
|
||||
return 0;
|
||||
|
||||
pxa2xx_set_dmac_info(32, 100);
|
||||
pxa2xx_set_dmac_info(&pxa3xx_dma_pdata);
|
||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
@ -127,53 +127,6 @@ static int pxa_ssp_probe(struct platform_device *pdev)
|
|||
if (IS_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);
|
||||
if (res == NULL) {
|
||||
dev_err(dev, "no memory resource defined\n");
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include <linux/libata.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/completion.h>
|
||||
|
@ -180,8 +179,6 @@ static int pxa_ata_probe(struct platform_device *pdev)
|
|||
struct resource *irq_res;
|
||||
struct pata_pxa_pdata *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct dma_slave_config config;
|
||||
dma_cap_mask_t mask;
|
||||
struct pxad_param param;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
|
@ -278,10 +275,6 @@ static int pxa_ata_probe(struct platform_device *pdev)
|
|||
|
||||
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));
|
||||
config.src_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)
|
|||
* Request the DMA channel
|
||||
*/
|
||||
data->dma_chan =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶m, &pdev->dev, "data");
|
||||
dma_request_slave_channel(&pdev->dev, "data");
|
||||
if (!data->dma_chan)
|
||||
return -EBUSY;
|
||||
ret = dmaengine_slave_config(data->dma_chan, &config);
|
||||
|
|
|
@ -179,6 +179,8 @@ static unsigned int pxad_drcmr(unsigned int line)
|
|||
return 0x1000 + line * 4;
|
||||
}
|
||||
|
||||
bool pxad_filter_fn(struct dma_chan *chan, void *param);
|
||||
|
||||
/*
|
||||
* Debug fs
|
||||
*/
|
||||
|
@ -760,6 +762,8 @@ static void pxad_free_chan_resources(struct dma_chan *dchan)
|
|||
dma_pool_destroy(chan->desc_pool);
|
||||
chan->desc_pool = NULL;
|
||||
|
||||
chan->drcmr = U32_MAX;
|
||||
chan->prio = PXAD_PRIO_LOWEST;
|
||||
}
|
||||
|
||||
static void pxad_free_desc(struct virt_dma_desc *vd)
|
||||
|
@ -1384,6 +1388,9 @@ static int pxad_init_dmadev(struct platform_device *op,
|
|||
c = devm_kzalloc(&op->dev, sizeof(*c), GFP_KERNEL);
|
||||
if (!c)
|
||||
return -ENOMEM;
|
||||
|
||||
c->drcmr = U32_MAX;
|
||||
c->prio = PXAD_PRIO_LOWEST;
|
||||
c->vc.desc_free = pxad_free_desc;
|
||||
vchan_init(&c->vc, &pdev->slave);
|
||||
init_waitqueue_head(&c->wq_state);
|
||||
|
@ -1396,9 +1403,10 @@ static int pxad_probe(struct platform_device *op)
|
|||
{
|
||||
struct pxad_device *pdev;
|
||||
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 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 =
|
||||
DMA_SLAVE_BUSWIDTH_1_BYTE | DMA_SLAVE_BUSWIDTH_2_BYTES |
|
||||
DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
|
@ -1429,6 +1437,8 @@ static int pxad_probe(struct platform_device *op)
|
|||
} else if (pdata && pdata->dma_channels) {
|
||||
dma_channels = pdata->dma_channels;
|
||||
nb_requestors = pdata->nb_requestors;
|
||||
slave_map = pdata->slave_map;
|
||||
slave_map_cnt = pdata->slave_map_cnt;
|
||||
} else {
|
||||
dma_channels = 32; /* default 32 channel */
|
||||
}
|
||||
|
@ -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_slave_sg = pxad_prep_slave_sg;
|
||||
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.src_addr_widths = widths;
|
||||
|
|
|
@ -2375,8 +2375,6 @@ static int pxa_camera_probe(struct platform_device *pdev)
|
|||
.src_maxburst = 8,
|
||||
.direction = DMA_DEV_TO_MEM,
|
||||
};
|
||||
dma_cap_mask_t mask;
|
||||
struct pxad_param params;
|
||||
char clk_name[V4L2_CLK_NAME_SIZE];
|
||||
int irq;
|
||||
int err = 0, i;
|
||||
|
@ -2450,34 +2448,20 @@ static int pxa_camera_probe(struct platform_device *pdev)
|
|||
pcdev->base = base;
|
||||
|
||||
/* request dma */
|
||||
dma_cap_zero(mask);
|
||||
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,
|
||||
¶ms, &pdev->dev, "CI_Y");
|
||||
pcdev->dma_chans[0] = dma_request_slave_channel(&pdev->dev, "CI_Y");
|
||||
if (!pcdev->dma_chans[0]) {
|
||||
dev_err(&pdev->dev, "Can't request DMA for Y\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
params.drcmr = 69;
|
||||
pcdev->dma_chans[1] =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶ms, &pdev->dev, "CI_U");
|
||||
pcdev->dma_chans[1] = dma_request_slave_channel(&pdev->dev, "CI_U");
|
||||
if (!pcdev->dma_chans[1]) {
|
||||
dev_err(&pdev->dev, "Can't request DMA for Y\n");
|
||||
err = -ENODEV;
|
||||
goto exit_free_dma_y;
|
||||
}
|
||||
|
||||
params.drcmr = 70;
|
||||
pcdev->dma_chans[2] =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶ms, &pdev->dev, "CI_V");
|
||||
pcdev->dma_chans[2] = dma_request_slave_channel(&pdev->dev, "CI_V");
|
||||
if (!pcdev->dma_chans[2]) {
|
||||
dev_err(&pdev->dev, "Can't request DMA for V\n");
|
||||
err = -ENODEV;
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/dma/pxa-dma.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
@ -637,10 +636,8 @@ static int pxamci_probe(struct platform_device *pdev)
|
|||
{
|
||||
struct mmc_host *mmc;
|
||||
struct pxamci_host *host = NULL;
|
||||
struct resource *r, *dmarx, *dmatx;
|
||||
struct pxad_param param_rx, param_tx;
|
||||
struct resource *r;
|
||||
int ret, irq, gpio_cd = -1, gpio_ro = -1, gpio_power = -1;
|
||||
dma_cap_mask_t mask;
|
||||
|
||||
ret = pxamci_of_init(pdev);
|
||||
if (ret)
|
||||
|
@ -739,34 +736,14 @@ static int pxamci_probe(struct platform_device *pdev)
|
|||
|
||||
platform_set_drvdata(pdev, mmc);
|
||||
|
||||
if (!pdev->dev.of_node) {
|
||||
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,
|
||||
¶m_rx, &pdev->dev, "rx");
|
||||
host->dma_chan_rx = dma_request_slave_channel(&pdev->dev, "rx");
|
||||
if (host->dma_chan_rx == NULL) {
|
||||
dev_err(&pdev->dev, "unable to request rx dma channel\n");
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
host->dma_chan_tx =
|
||||
dma_request_slave_channel_compat(mask, pxad_filter_fn,
|
||||
¶m_tx, &pdev->dev, "tx");
|
||||
host->dma_chan_tx = dma_request_slave_channel(&pdev->dev, "tx");
|
||||
if (host->dma_chan_tx == NULL) {
|
||||
dev_err(&pdev->dev, "unable to request tx dma channel\n");
|
||||
ret = -ENODEV;
|
||||
|
|
|
@ -2612,8 +2612,6 @@ static int marvell_nfc_init_dma(struct marvell_nfc *nfc)
|
|||
dev);
|
||||
struct dma_slave_config config = {};
|
||||
struct resource *r;
|
||||
dma_cap_mask_t mask;
|
||||
struct pxad_param param;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PXA_DMA)) {
|
||||
|
@ -2626,20 +2624,7 @@ static int marvell_nfc_init_dma(struct marvell_nfc *nfc)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
||||
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,
|
||||
¶m, nfc->dev,
|
||||
"data");
|
||||
nfc->dma_chan = dma_request_slave_channel(nfc->dev, "data");
|
||||
if (!nfc->dma_chan) {
|
||||
dev_err(nfc->dev,
|
||||
"Unable to request data DMA channel\n");
|
||||
|
|
|
@ -9,6 +9,15 @@ enum pxad_chan_prio {
|
|||
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 {
|
||||
unsigned int drcmr;
|
||||
enum pxad_chan_prio prio;
|
||||
|
|
|
@ -12,9 +12,13 @@
|
|||
#ifndef MMP_DMA_H
|
||||
#define MMP_DMA_H
|
||||
|
||||
struct dma_slave_map;
|
||||
|
||||
struct mmp_dma_platdata {
|
||||
int dma_channels;
|
||||
int nb_requestors;
|
||||
int slave_map_cnt;
|
||||
const struct dma_slave_map *slave_map;
|
||||
};
|
||||
|
||||
#endif /* MMP_DMA_H */
|
||||
|
|
|
@ -212,8 +212,6 @@ struct ssp_device {
|
|||
int type;
|
||||
int use_count;
|
||||
int irq;
|
||||
int drcmr_rx;
|
||||
int drcmr_tx;
|
||||
|
||||
struct device_node *of_node;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
if (!dma)
|
||||
return -ENOMEM;
|
||||
|
||||
dma->filter_data = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
|
||||
&ssp->drcmr_tx : &ssp->drcmr_rx;
|
||||
dma->chan_name = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
|
||||
"tx" : "rx";
|
||||
|
||||
snd_soc_dai_set_dma_data(cpu_dai, substream, dma);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче