aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Van Den Berge <sam.van.den.berge@telenet.be>2016-09-22 14:51:15 -0400
committerVinod Koul <vinod.koul@intel.com>2016-09-26 13:43:04 -0400
commit34681d84a0f7cc22ded1413dc79eef8a2f23d9c3 (patch)
tree2813bf63617076fafc4e988d1b85a427986a8d85
parent360af35b08da9def3be8b67398f4e0f90c292e37 (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.c35
-rw-r--r--drivers/dma/s3c24xx-dma.c3
-rw-r--r--include/linux/platform_data/dma-s3c24xx.h6
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
443static 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
442static struct s3c24xx_dma_platdata s3c2440_dma_platdata = { 475static 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
448struct platform_device s3c2440_device_dma = { 483struct 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
33struct 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 */
39struct s3c24xx_dma_platdata { 43struct 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
45struct dma_chan; 51struct dma_chan;