Merge tag 'backport/v3.14.24-ltsi-rc1/phy-rcar-gen2-usb-to-v3.15' into backport/v3...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / arm / mach-shmobile / setup-r8a7790.c
index 6ab37aa..4795c98 100644 (file)
 #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/irqs.h>
-#include <mach/r8a7790.h>
+
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "dma-register.h"
+#include "irqs.h"
+#include "r8a7790.h"
+#include "rcar-gen2.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),
 };
@@ -97,10 +188,6 @@ void __init r8a7790_pinmux_init(void)
        r8a7790_register_gpio(3);
        r8a7790_register_gpio(4);
        r8a7790_register_gpio(5);
-       r8a7790_register_i2c(0);
-       r8a7790_register_i2c(1);
-       r8a7790_register_i2c(2);
-       r8a7790_register_i2c(3);
 }
 
 #define __R8A7790_SCIF(scif_type, _scscr, index, baseaddr, irq)                \
@@ -179,26 +266,23 @@ static const struct resource thermal_resources[] __initconst = {
                                        thermal_resources,              \
                                        ARRAY_SIZE(thermal_resources))
 
-static const struct sh_timer_config cmt00_platform_data __initconst = {
-       .name = "CMT00",
-       .timer_bit = 0,
-       .clockevent_rating = 80,
+static struct sh_timer_config cmt0_platform_data = {
+       .channels_mask = 0x60,
 };
 
-static const struct resource cmt00_resources[] __initconst = {
-       DEFINE_RES_MEM(0xffca0510, 0x0c),
-       DEFINE_RES_MEM(0xffca0500, 0x04),
-       DEFINE_RES_IRQ(gic_spi(142)), /* CMT0_0 */
+static struct resource cmt0_resources[] = {
+       DEFINE_RES_MEM(0xffca0000, 0x1004),
+       DEFINE_RES_IRQ(gic_spi(142)),
 };
 
 #define r8a7790_register_cmt(idx)                                      \
-       platform_device_register_resndata(&platform_bus, "sh_cmt",      \
+       platform_device_register_resndata(&platform_bus, "sh-cmt-48-gen2", \
                                          idx, cmt##idx##_resources,    \
                                          ARRAY_SIZE(cmt##idx##_resources), \
                                          &cmt##idx##_platform_data,    \
                                          sizeof(struct sh_timer_config))
 
-void __init r8a7790_add_dt_devices(void)
+void __init r8a7790_add_standard_devices(void)
 {
        r8a7790_register_scif(0);
        r8a7790_register_scif(1);
@@ -210,21 +294,15 @@ void __init r8a7790_add_dt_devices(void)
        r8a7790_register_scif(7);
        r8a7790_register_scif(8);
        r8a7790_register_scif(9);
-       r8a7790_register_cmt(00);
-}
-
-void __init r8a7790_add_standard_devices(void)
-{
-       r8a7790_add_dt_devices();
+       r8a7790_register_cmt(0);
        r8a7790_register_irqc(0);
        r8a7790_register_thermal();
-}
-
-void __init r8a7790_init_early(void)
-{
-#ifndef CONFIG_ARM_ARCH_TIMER
-       shmobile_setup_delay(1300, 2, 4); /* Cortex-A15 @ 1300MHz */
-#endif
+       r8a7790_register_i2c(0);
+       r8a7790_register_i2c(1);
+       r8a7790_register_i2c(2);
+       r8a7790_register_i2c(3);
+       r8a7790_register_audio_dmac(0);
+       r8a7790_register_audio_dmac(1);
 }
 
 #ifdef CONFIG_USE_OF
@@ -236,8 +314,10 @@ static const char * const r8a7790_boards_compat_dt[] __initconst = {
 
 DT_MACHINE_START(R8A7790_DT, "Generic R8A7790 (Flattened Device Tree)")
        .smp            = smp_ops(r8a7790_smp_ops),
-       .init_early     = r8a7790_init_early,
+       .init_early     = shmobile_init_delay,
        .init_time      = rcar_gen2_timer_init,
+       .init_late      = shmobile_init_late,
+       .reserve        = rcar_gen2_reserve,
        .dt_compat      = r8a7790_boards_compat_dt,
 MACHINE_END
 #endif /* CONFIG_USE_OF */