diff options
author | Sam Van Den Berge <sam.van.den.berge@telenet.be> | 2016-09-22 14:51:15 -0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2016-09-26 13:43:04 -0400 |
commit | 34681d84a0f7cc22ded1413dc79eef8a2f23d9c3 (patch) | |
tree | 2813bf63617076fafc4e988d1b85a427986a8d85 | |
parent | 360af35b08da9def3be8b67398f4e0f90c292e37 (diff) |
dmaengine: s3c24xx: Add dma_slave_map for s3c2440 devices
This patch updates the s3c24xx dma driver to be able to pass a
dma_slave_map array via the platform data. This is needed to
be able to use the new, simpler dmaengine API [1].
I used the virtual DMA channels as a parameter for the dma_filter
function. By doing that, I could reuse the existing filter function in
drivers/dma/s3c24xx-dma.c.
I have tested this on my mini2440 board with the audio driver.
According to my observations, dma_request_slave_channel in the
function dmaengine_pcm_new in the file
sound/soc/soc-generic-dmaengine-pcm.c now returns a valid DMA channel
whereas before no DMA channel was returned at that point.
Entries for DMACH_XD0, DMACH_XD1 and DMACH_TIMER are missing because I
don't realy know which driver to use for these.
[1]
http://lists.infradead.org/pipermail/linux-arm-kernel/2015-December/393635.html
Signed-off-by: Sam Van Den Berge <sam.van.den.berge@telenet.be>
Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Krzysztof Kozlowski <krzk@kernel.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r-- | arch/arm/mach-s3c24xx/common.c | 35 | ||||
-rw-r--r-- | drivers/dma/s3c24xx-dma.c | 3 | ||||
-rw-r--r-- | include/linux/platform_data/dma-s3c24xx.h | 6 |
3 files changed, 44 insertions, 0 deletions
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c index bf50328107bd..ba0ceebdd73d 100644 --- a/arch/arm/mach-s3c24xx/common.c +++ b/arch/arm/mach-s3c24xx/common.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/delay.h> | 33 | #include <linux/delay.h> |
34 | #include <linux/io.h> | 34 | #include <linux/io.h> |
35 | #include <linux/platform_data/dma-s3c24xx.h> | 35 | #include <linux/platform_data/dma-s3c24xx.h> |
36 | #include <linux/dmaengine.h> | ||
36 | 37 | ||
37 | #include <mach/hardware.h> | 38 | #include <mach/hardware.h> |
38 | #include <mach/regs-clock.h> | 39 | #include <mach/regs-clock.h> |
@@ -439,10 +440,44 @@ static struct s3c24xx_dma_channel s3c2440_dma_channels[DMACH_MAX] = { | |||
439 | [DMACH_USB_EP4] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 3), }, | 440 | [DMACH_USB_EP4] = { S3C24XX_DMA_APB, true, S3C24XX_DMA_CHANREQ(4, 3), }, |
440 | }; | 441 | }; |
441 | 442 | ||
443 | static const struct dma_slave_map s3c2440_dma_slave_map[] = { | ||
444 | /* TODO: DMACH_XD0 */ | ||
445 | /* TODO: DMACH_XD1 */ | ||
446 | { "s3c2440-sdi", "rx-tx", (void *)DMACH_SDI }, | ||
447 | { "s3c2410-spi.0", "rx", (void *)DMACH_SPI0 }, | ||
448 | { "s3c2410-spi.0", "tx", (void *)DMACH_SPI0 }, | ||
449 | { "s3c2410-spi.1", "rx", (void *)DMACH_SPI1 }, | ||
450 | { "s3c2410-spi.1", "tx", (void *)DMACH_SPI1 }, | ||
451 | { "s3c2440-uart.0", "rx", (void *)DMACH_UART0 }, | ||
452 | { "s3c2440-uart.0", "tx", (void *)DMACH_UART0 }, | ||
453 | { "s3c2440-uart.1", "rx", (void *)DMACH_UART1 }, | ||
454 | { "s3c2440-uart.1", "tx", (void *)DMACH_UART1 }, | ||
455 | { "s3c2440-uart.2", "rx", (void *)DMACH_UART2 }, | ||
456 | { "s3c2440-uart.2", "tx", (void *)DMACH_UART2 }, | ||
457 | { "s3c2440-uart.3", "rx", (void *)DMACH_UART3 }, | ||
458 | { "s3c2440-uart.3", "tx", (void *)DMACH_UART3 }, | ||
459 | /* TODO: DMACH_TIMER */ | ||
460 | { "s3c24xx-iis", "rx", (void *)DMACH_I2S_IN }, | ||
461 | { "s3c24xx-iis", "tx", (void *)DMACH_I2S_OUT }, | ||
462 | { "samsung-ac97", "rx", (void *)DMACH_PCM_IN }, | ||
463 | { "samsung-ac97", "tx", (void *)DMACH_PCM_OUT }, | ||
464 | { "samsung-ac97", "rx", (void *)DMACH_MIC_IN }, | ||
465 | { "s3c-hsudc", "rx0", (void *)DMACH_USB_EP1 }, | ||
466 | { "s3c-hsudc", "rx1", (void *)DMACH_USB_EP2 }, | ||
467 | { "s3c-hsudc", "rx2", (void *)DMACH_USB_EP3 }, | ||
468 | { "s3c-hsudc", "rx3", (void *)DMACH_USB_EP4 }, | ||
469 | { "s3c-hsudc", "tx0", (void *)DMACH_USB_EP1 }, | ||
470 | { "s3c-hsudc", "tx1", (void *)DMACH_USB_EP2 }, | ||
471 | { "s3c-hsudc", "tx2", (void *)DMACH_USB_EP3 }, | ||
472 | { "s3c-hsudc", "tx3", (void *)DMACH_USB_EP4 } | ||
473 | }; | ||
474 | |||
442 | static struct s3c24xx_dma_platdata s3c2440_dma_platdata = { | 475 | static struct s3c24xx_dma_platdata s3c2440_dma_platdata = { |
443 | .num_phy_channels = 4, | 476 | .num_phy_channels = 4, |
444 | .channels = s3c2440_dma_channels, | 477 | .channels = s3c2440_dma_channels, |
445 | .num_channels = DMACH_MAX, | 478 | .num_channels = DMACH_MAX, |
479 | .slave_map = s3c2440_dma_slave_map, | ||
480 | .slavecnt = ARRAY_SIZE(s3c2440_dma_slave_map), | ||
446 | }; | 481 | }; |
447 | 482 | ||
448 | struct platform_device s3c2440_device_dma = { | 483 | struct platform_device s3c2440_device_dma = { |
diff --git a/drivers/dma/s3c24xx-dma.c b/drivers/dma/s3c24xx-dma.c index ce67075589f5..d5c85e7d2061 100644 --- a/drivers/dma/s3c24xx-dma.c +++ b/drivers/dma/s3c24xx-dma.c | |||
@@ -1301,6 +1301,9 @@ static int s3c24xx_dma_probe(struct platform_device *pdev) | |||
1301 | s3cdma->slave.device_prep_dma_cyclic = s3c24xx_dma_prep_dma_cyclic; | 1301 | s3cdma->slave.device_prep_dma_cyclic = s3c24xx_dma_prep_dma_cyclic; |
1302 | s3cdma->slave.device_config = s3c24xx_dma_set_runtime_config; | 1302 | s3cdma->slave.device_config = s3c24xx_dma_set_runtime_config; |
1303 | s3cdma->slave.device_terminate_all = s3c24xx_dma_terminate_all; | 1303 | s3cdma->slave.device_terminate_all = s3c24xx_dma_terminate_all; |
1304 | s3cdma->slave.filter.map = pdata->slave_map; | ||
1305 | s3cdma->slave.filter.mapcnt = pdata->slavecnt; | ||
1306 | s3cdma->slave.filter.fn = s3c24xx_dma_filter; | ||
1304 | 1307 | ||
1305 | /* Register as many memcpy channels as there are physical channels */ | 1308 | /* Register as many memcpy channels as there are physical channels */ |
1306 | ret = s3c24xx_dma_init_virtual_channels(s3cdma, &s3cdma->memcpy, | 1309 | ret = s3c24xx_dma_init_virtual_channels(s3cdma, &s3cdma->memcpy, |
diff --git a/include/linux/platform_data/dma-s3c24xx.h b/include/linux/platform_data/dma-s3c24xx.h index 89ba1b0c90e4..4f9aba405e96 100644 --- a/include/linux/platform_data/dma-s3c24xx.h +++ b/include/linux/platform_data/dma-s3c24xx.h | |||
@@ -30,16 +30,22 @@ struct s3c24xx_dma_channel { | |||
30 | u16 chansel; | 30 | u16 chansel; |
31 | }; | 31 | }; |
32 | 32 | ||
33 | struct dma_slave_map; | ||
34 | |||
33 | /** | 35 | /** |
34 | * struct s3c24xx_dma_platdata - platform specific settings | 36 | * struct s3c24xx_dma_platdata - platform specific settings |
35 | * @num_phy_channels: number of physical channels | 37 | * @num_phy_channels: number of physical channels |
36 | * @channels: array of virtual channel descriptions | 38 | * @channels: array of virtual channel descriptions |
37 | * @num_channels: number of virtual channels | 39 | * @num_channels: number of virtual channels |
40 | * @slave_map: dma slave map matching table | ||
41 | * @slavecnt: number of elements in slave_map | ||
38 | */ | 42 | */ |
39 | struct s3c24xx_dma_platdata { | 43 | struct s3c24xx_dma_platdata { |
40 | int num_phy_channels; | 44 | int num_phy_channels; |
41 | struct s3c24xx_dma_channel *channels; | 45 | struct s3c24xx_dma_channel *channels; |
42 | int num_channels; | 46 | int num_channels; |
47 | const struct dma_slave_map *slave_map; | ||
48 | int slavecnt; | ||
43 | }; | 49 | }; |
44 | 50 | ||
45 | struct dma_chan; | 51 | struct dma_chan; |