| From 08bd27dad0340c37d6ff01bd88a01d693d17692a Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Mon, 6 Jan 2014 00:32:54 -0800 |
| Subject: ARM: shmobile: r8a7790: add Audio DMAC support |
| |
| R-Car H2 has many DMACs |
| (ex SYS-DMAC, 2D-DMAC, Audio-DMAC, USB-DMAC etc) |
| and, these DMAEngine needs DMA slave IDs to use it. |
| |
| This patch adds new DMA slave ID list for r8a7790. |
| There, common part has RCAR_DMA_xxx prefix, |
| and Audio DMAC part has AUDIO_DMAC_SLAVE_xxx prefix. |
| |
| Audio DMAC can be controlled via sh-dma-engine |
| |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| (cherry picked from commit 2c578a1be846bde49cb0a916c20f526f27b59e89) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| arch/arm/mach-shmobile/include/mach/r8a7790.h | 25 ++++++++ |
| arch/arm/mach-shmobile/setup-r8a7790.c | 90 +++++++++++++++++++++++++++ |
| 2 files changed, 115 insertions(+) |
| |
| diff --git a/arch/arm/mach-shmobile/include/mach/r8a7790.h b/arch/arm/mach-shmobile/include/mach/r8a7790.h |
| index 5fbfa28b40b6..2177325af22f 100644 |
| --- a/arch/arm/mach-shmobile/include/mach/r8a7790.h |
| +++ b/arch/arm/mach-shmobile/include/mach/r8a7790.h |
| @@ -3,6 +3,31 @@ |
| |
| #include <mach/rcar-gen2.h> |
| |
| +/* DMA slave IDs */ |
| +enum { |
| + RCAR_DMA_SLAVE_INVALID, |
| + AUDIO_DMAC_SLAVE_SSI0_TX, |
| + AUDIO_DMAC_SLAVE_SSI0_RX, |
| + AUDIO_DMAC_SLAVE_SSI1_TX, |
| + AUDIO_DMAC_SLAVE_SSI1_RX, |
| + AUDIO_DMAC_SLAVE_SSI2_TX, |
| + AUDIO_DMAC_SLAVE_SSI2_RX, |
| + AUDIO_DMAC_SLAVE_SSI3_TX, |
| + AUDIO_DMAC_SLAVE_SSI3_RX, |
| + AUDIO_DMAC_SLAVE_SSI4_TX, |
| + AUDIO_DMAC_SLAVE_SSI4_RX, |
| + AUDIO_DMAC_SLAVE_SSI5_TX, |
| + AUDIO_DMAC_SLAVE_SSI5_RX, |
| + AUDIO_DMAC_SLAVE_SSI6_TX, |
| + AUDIO_DMAC_SLAVE_SSI6_RX, |
| + AUDIO_DMAC_SLAVE_SSI7_TX, |
| + AUDIO_DMAC_SLAVE_SSI7_RX, |
| + AUDIO_DMAC_SLAVE_SSI8_TX, |
| + AUDIO_DMAC_SLAVE_SSI8_RX, |
| + AUDIO_DMAC_SLAVE_SSI9_TX, |
| + AUDIO_DMAC_SLAVE_SSI9_RX, |
| +}; |
| + |
| void r8a7790_add_standard_devices(void); |
| void r8a7790_add_dt_devices(void); |
| void r8a7790_clock_init(void); |
| diff --git a/arch/arm/mach-shmobile/setup-r8a7790.c b/arch/arm/mach-shmobile/setup-r8a7790.c |
| index 6ab37aa1e919..c4616f0698c6 100644 |
| --- a/arch/arm/mach-shmobile/setup-r8a7790.c |
| +++ b/arch/arm/mach-shmobile/setup-r8a7790.c |
| @@ -24,12 +24,100 @@ |
| #include <linux/platform_data/gpio-rcar.h> |
| #include <linux/platform_data/irq-renesas-irqc.h> |
| #include <linux/serial_sci.h> |
| +#include <linux/sh_dma.h> |
| #include <linux/sh_timer.h> |
| #include <mach/common.h> |
| +#include <mach/dma-register.h> |
| #include <mach/irqs.h> |
| #include <mach/r8a7790.h> |
| #include <asm/mach/arch.h> |
| |
| +/* Audio-DMAC */ |
| +#define AUDIO_DMAC_SLAVE(_id, _addr, t, r) \ |
| +{ \ |
| + .slave_id = AUDIO_DMAC_SLAVE_## _id ##_TX, \ |
| + .addr = _addr + 0x8, \ |
| + .chcr = CHCR_TX(XMIT_SZ_32BIT), \ |
| + .mid_rid = t, \ |
| +}, { \ |
| + .slave_id = AUDIO_DMAC_SLAVE_## _id ##_RX, \ |
| + .addr = _addr + 0xc, \ |
| + .chcr = CHCR_RX(XMIT_SZ_32BIT), \ |
| + .mid_rid = r, \ |
| +} |
| + |
| +static const struct sh_dmae_slave_config r8a7790_audio_dmac_slaves[] = { |
| + AUDIO_DMAC_SLAVE(SSI0, 0xec241000, 0x01, 0x02), |
| + AUDIO_DMAC_SLAVE(SSI1, 0xec241040, 0x03, 0x04), |
| + AUDIO_DMAC_SLAVE(SSI2, 0xec241080, 0x05, 0x06), |
| + AUDIO_DMAC_SLAVE(SSI3, 0xec2410c0, 0x07, 0x08), |
| + AUDIO_DMAC_SLAVE(SSI4, 0xec241100, 0x09, 0x0a), |
| + AUDIO_DMAC_SLAVE(SSI5, 0xec241140, 0x0b, 0x0c), |
| + AUDIO_DMAC_SLAVE(SSI6, 0xec241180, 0x0d, 0x0e), |
| + AUDIO_DMAC_SLAVE(SSI7, 0xec2411c0, 0x0f, 0x10), |
| + AUDIO_DMAC_SLAVE(SSI8, 0xec241200, 0x11, 0x12), |
| + AUDIO_DMAC_SLAVE(SSI9, 0xec241240, 0x13, 0x14), |
| +}; |
| + |
| +#define DMAE_CHANNEL(a, b) \ |
| +{ \ |
| + .offset = (a) - 0x20, \ |
| + .dmars = (a) - 0x20 + 0x40, \ |
| + .chclr_bit = (b), \ |
| + .chclr_offset = 0x80 - 0x20, \ |
| +} |
| + |
| +static const struct sh_dmae_channel r8a7790_audio_dmac_channels[] = { |
| + DMAE_CHANNEL(0x8000, 0), |
| + DMAE_CHANNEL(0x8080, 1), |
| + DMAE_CHANNEL(0x8100, 2), |
| + DMAE_CHANNEL(0x8180, 3), |
| + DMAE_CHANNEL(0x8200, 4), |
| + DMAE_CHANNEL(0x8280, 5), |
| + DMAE_CHANNEL(0x8300, 6), |
| + DMAE_CHANNEL(0x8380, 7), |
| + DMAE_CHANNEL(0x8400, 8), |
| + DMAE_CHANNEL(0x8480, 9), |
| + DMAE_CHANNEL(0x8500, 10), |
| + DMAE_CHANNEL(0x8580, 11), |
| + DMAE_CHANNEL(0x8600, 12), |
| +}; |
| + |
| +static struct sh_dmae_pdata r8a7790_audio_dmac_platform_data = { |
| + .slave = r8a7790_audio_dmac_slaves, |
| + .slave_num = ARRAY_SIZE(r8a7790_audio_dmac_slaves), |
| + .channel = r8a7790_audio_dmac_channels, |
| + .channel_num = ARRAY_SIZE(r8a7790_audio_dmac_channels), |
| + .ts_low_shift = TS_LOW_SHIFT, |
| + .ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT, |
| + .ts_high_shift = TS_HI_SHIFT, |
| + .ts_high_mask = TS_HI_BIT << TS_HI_SHIFT, |
| + .ts_shift = dma_ts_shift, |
| + .ts_shift_num = ARRAY_SIZE(dma_ts_shift), |
| + .dmaor_init = DMAOR_DME, |
| + .chclr_present = 1, |
| + .chclr_bitwise = 1, |
| +}; |
| + |
| +static struct resource r8a7790_audio_dmac_resources[] = { |
| + /* Channel registers and DMAOR for low */ |
| + DEFINE_RES_MEM(0xec700020, 0x8663 - 0x20), |
| + DEFINE_RES_IRQ(gic_spi(346)), |
| + DEFINE_RES_NAMED(gic_spi(320), 13, NULL, IORESOURCE_IRQ), |
| + |
| + /* Channel registers and DMAOR for hi */ |
| + DEFINE_RES_MEM(0xec720020, 0x8663 - 0x20), /* hi */ |
| + DEFINE_RES_IRQ(gic_spi(347)), |
| + DEFINE_RES_NAMED(gic_spi(333), 13, NULL, IORESOURCE_IRQ), |
| +}; |
| + |
| +#define r8a7790_register_audio_dmac(id) \ |
| + platform_device_register_resndata( \ |
| + &platform_bus, "sh-dma-engine", id, \ |
| + &r8a7790_audio_dmac_resources[id * 3], 3, \ |
| + &r8a7790_audio_dmac_platform_data, \ |
| + sizeof(r8a7790_audio_dmac_platform_data)) |
| + |
| static const struct resource pfc_resources[] __initconst = { |
| DEFINE_RES_MEM(0xe6060000, 0x250), |
| }; |
| @@ -101,6 +189,8 @@ void __init r8a7790_pinmux_init(void) |
| r8a7790_register_i2c(1); |
| r8a7790_register_i2c(2); |
| r8a7790_register_i2c(3); |
| + r8a7790_register_audio_dmac(0); |
| + r8a7790_register_audio_dmac(1); |
| } |
| |
| #define __R8A7790_SCIF(scif_type, _scscr, index, baseaddr, irq) \ |
| -- |
| 2.1.2 |
| |