Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c578a1b authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Simon Horman
Browse files

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: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarSimon Horman <horms+renesas@verge.net.au>
parent f5b2947e
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -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);
+90 −0
Original line number Diff line number Diff line
@@ -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)		\