16d9598e2SMagnus Damm /* 26d9598e2SMagnus Damm * sh73a0 processor support 36d9598e2SMagnus Damm * 46d9598e2SMagnus Damm * Copyright (C) 2010 Takashi Yoshii 56d9598e2SMagnus Damm * Copyright (C) 2010 Magnus Damm 66d9598e2SMagnus Damm * Copyright (C) 2008 Yoshihiro Shimoda 76d9598e2SMagnus Damm * 86d9598e2SMagnus Damm * This program is free software; you can redistribute it and/or modify 96d9598e2SMagnus Damm * it under the terms of the GNU General Public License as published by 106d9598e2SMagnus Damm * the Free Software Foundation; version 2 of the License. 116d9598e2SMagnus Damm * 126d9598e2SMagnus Damm * This program is distributed in the hope that it will be useful, 136d9598e2SMagnus Damm * but WITHOUT ANY WARRANTY; without even the implied warranty of 146d9598e2SMagnus Damm * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 156d9598e2SMagnus Damm * GNU General Public License for more details. 166d9598e2SMagnus Damm * 176d9598e2SMagnus Damm * You should have received a copy of the GNU General Public License 186d9598e2SMagnus Damm * along with this program; if not, write to the Free Software 196d9598e2SMagnus Damm * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 206d9598e2SMagnus Damm */ 216d9598e2SMagnus Damm #include <linux/kernel.h> 226d9598e2SMagnus Damm #include <linux/init.h> 236d9598e2SMagnus Damm #include <linux/interrupt.h> 246d9598e2SMagnus Damm #include <linux/irq.h> 254eca134fSSimon Horman #include <linux/irqchip.h> 266d9598e2SMagnus Damm #include <linux/platform_device.h> 2748609533SSimon Horman #include <linux/of_platform.h> 286d9598e2SMagnus Damm #include <linux/delay.h> 296d9598e2SMagnus Damm #include <linux/input.h> 306d9598e2SMagnus Damm #include <linux/io.h> 316d9598e2SMagnus Damm #include <linux/serial_sci.h> 32681e1b3eSMagnus Damm #include <linux/sh_dma.h> 336d9598e2SMagnus Damm #include <linux/sh_intc.h> 346d9598e2SMagnus Damm #include <linux/sh_timer.h> 359a27dee7SHideki EIRAKU #include <linux/platform_data/sh_ipmmu.h> 36341eb546SMagnus Damm #include <linux/platform_data/irq-renesas-intc-irqpin.h> 376088b422SKuninori Morimoto #include <mach/dma-register.h> 386d9598e2SMagnus Damm #include <mach/hardware.h> 39250a2723SRob Herring #include <mach/irqs.h> 40681e1b3eSMagnus Damm #include <mach/sh73a0.h> 4150e15c34SMagnus Damm #include <mach/common.h> 426d9598e2SMagnus Damm #include <asm/mach-types.h> 4350e15c34SMagnus Damm #include <asm/mach/map.h> 446d9598e2SMagnus Damm #include <asm/mach/arch.h> 453be26fdbSMagnus Damm #include <asm/mach/time.h> 466d9598e2SMagnus Damm 4750e15c34SMagnus Damm static struct map_desc sh73a0_io_desc[] __initdata = { 4850e15c34SMagnus Damm /* create a 1:1 entity map for 0xe6xxxxxx 4950e15c34SMagnus Damm * used by CPGA, INTC and PFC. 5050e15c34SMagnus Damm */ 5150e15c34SMagnus Damm { 5250e15c34SMagnus Damm .virtual = 0xe6000000, 5350e15c34SMagnus Damm .pfn = __phys_to_pfn(0xe6000000), 5450e15c34SMagnus Damm .length = 256 << 20, 5550e15c34SMagnus Damm .type = MT_DEVICE_NONSHARED 5650e15c34SMagnus Damm }, 5750e15c34SMagnus Damm }; 5850e15c34SMagnus Damm 5950e15c34SMagnus Damm void __init sh73a0_map_io(void) 6050e15c34SMagnus Damm { 6150e15c34SMagnus Damm iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc)); 6250e15c34SMagnus Damm } 6350e15c34SMagnus Damm 64994d66a4SLaurent Pinchart static struct resource sh73a0_pfc_resources[] = { 65994d66a4SLaurent Pinchart [0] = { 66994d66a4SLaurent Pinchart .start = 0xe6050000, 67994d66a4SLaurent Pinchart .end = 0xe6057fff, 68994d66a4SLaurent Pinchart .flags = IORESOURCE_MEM, 69994d66a4SLaurent Pinchart }, 70994d66a4SLaurent Pinchart [1] = { 71994d66a4SLaurent Pinchart .start = 0xe605801c, 72994d66a4SLaurent Pinchart .end = 0xe6058027, 73994d66a4SLaurent Pinchart .flags = IORESOURCE_MEM, 74994d66a4SLaurent Pinchart } 75994d66a4SLaurent Pinchart }; 76994d66a4SLaurent Pinchart 77994d66a4SLaurent Pinchart static struct platform_device sh73a0_pfc_device = { 78994d66a4SLaurent Pinchart .name = "pfc-sh73a0", 79994d66a4SLaurent Pinchart .id = -1, 80994d66a4SLaurent Pinchart .resource = sh73a0_pfc_resources, 81994d66a4SLaurent Pinchart .num_resources = ARRAY_SIZE(sh73a0_pfc_resources), 82994d66a4SLaurent Pinchart }; 83994d66a4SLaurent Pinchart 84994d66a4SLaurent Pinchart void __init sh73a0_pinmux_init(void) 85994d66a4SLaurent Pinchart { 86994d66a4SLaurent Pinchart platform_device_register(&sh73a0_pfc_device); 87994d66a4SLaurent Pinchart } 88994d66a4SLaurent Pinchart 896d9598e2SMagnus Damm static struct plat_sci_port scif0_platform_data = { 906d9598e2SMagnus Damm .mapbase = 0xe6c40000, 916d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 92f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 93f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 946d9598e2SMagnus Damm .type = PORT_SCIFA, 956d9598e2SMagnus Damm .irqs = { gic_spi(72), gic_spi(72), 966d9598e2SMagnus Damm gic_spi(72), gic_spi(72) }, 976d9598e2SMagnus Damm }; 986d9598e2SMagnus Damm 996d9598e2SMagnus Damm static struct platform_device scif0_device = { 1006d9598e2SMagnus Damm .name = "sh-sci", 1016d9598e2SMagnus Damm .id = 0, 1026d9598e2SMagnus Damm .dev = { 1036d9598e2SMagnus Damm .platform_data = &scif0_platform_data, 1046d9598e2SMagnus Damm }, 1056d9598e2SMagnus Damm }; 1066d9598e2SMagnus Damm 1076d9598e2SMagnus Damm static struct plat_sci_port scif1_platform_data = { 1086d9598e2SMagnus Damm .mapbase = 0xe6c50000, 1096d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 110f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 111f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1126d9598e2SMagnus Damm .type = PORT_SCIFA, 1136d9598e2SMagnus Damm .irqs = { gic_spi(73), gic_spi(73), 1146d9598e2SMagnus Damm gic_spi(73), gic_spi(73) }, 1156d9598e2SMagnus Damm }; 1166d9598e2SMagnus Damm 1176d9598e2SMagnus Damm static struct platform_device scif1_device = { 1186d9598e2SMagnus Damm .name = "sh-sci", 1196d9598e2SMagnus Damm .id = 1, 1206d9598e2SMagnus Damm .dev = { 1216d9598e2SMagnus Damm .platform_data = &scif1_platform_data, 1226d9598e2SMagnus Damm }, 1236d9598e2SMagnus Damm }; 1246d9598e2SMagnus Damm 1256d9598e2SMagnus Damm static struct plat_sci_port scif2_platform_data = { 1266d9598e2SMagnus Damm .mapbase = 0xe6c60000, 1276d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 128f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 129f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1306d9598e2SMagnus Damm .type = PORT_SCIFA, 1316d9598e2SMagnus Damm .irqs = { gic_spi(74), gic_spi(74), 1326d9598e2SMagnus Damm gic_spi(74), gic_spi(74) }, 1336d9598e2SMagnus Damm }; 1346d9598e2SMagnus Damm 1356d9598e2SMagnus Damm static struct platform_device scif2_device = { 1366d9598e2SMagnus Damm .name = "sh-sci", 1376d9598e2SMagnus Damm .id = 2, 1386d9598e2SMagnus Damm .dev = { 1396d9598e2SMagnus Damm .platform_data = &scif2_platform_data, 1406d9598e2SMagnus Damm }, 1416d9598e2SMagnus Damm }; 1426d9598e2SMagnus Damm 1436d9598e2SMagnus Damm static struct plat_sci_port scif3_platform_data = { 1446d9598e2SMagnus Damm .mapbase = 0xe6c70000, 1456d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 146f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 147f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1486d9598e2SMagnus Damm .type = PORT_SCIFA, 1496d9598e2SMagnus Damm .irqs = { gic_spi(75), gic_spi(75), 1506d9598e2SMagnus Damm gic_spi(75), gic_spi(75) }, 1516d9598e2SMagnus Damm }; 1526d9598e2SMagnus Damm 1536d9598e2SMagnus Damm static struct platform_device scif3_device = { 1546d9598e2SMagnus Damm .name = "sh-sci", 1556d9598e2SMagnus Damm .id = 3, 1566d9598e2SMagnus Damm .dev = { 1576d9598e2SMagnus Damm .platform_data = &scif3_platform_data, 1586d9598e2SMagnus Damm }, 1596d9598e2SMagnus Damm }; 1606d9598e2SMagnus Damm 1616d9598e2SMagnus Damm static struct plat_sci_port scif4_platform_data = { 1626d9598e2SMagnus Damm .mapbase = 0xe6c80000, 1636d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 164f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 165f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1666d9598e2SMagnus Damm .type = PORT_SCIFA, 1676d9598e2SMagnus Damm .irqs = { gic_spi(78), gic_spi(78), 1686d9598e2SMagnus Damm gic_spi(78), gic_spi(78) }, 1696d9598e2SMagnus Damm }; 1706d9598e2SMagnus Damm 1716d9598e2SMagnus Damm static struct platform_device scif4_device = { 1726d9598e2SMagnus Damm .name = "sh-sci", 1736d9598e2SMagnus Damm .id = 4, 1746d9598e2SMagnus Damm .dev = { 1756d9598e2SMagnus Damm .platform_data = &scif4_platform_data, 1766d9598e2SMagnus Damm }, 1776d9598e2SMagnus Damm }; 1786d9598e2SMagnus Damm 1796d9598e2SMagnus Damm static struct plat_sci_port scif5_platform_data = { 1806d9598e2SMagnus Damm .mapbase = 0xe6cb0000, 1816d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 182f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 183f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1846d9598e2SMagnus Damm .type = PORT_SCIFA, 1856d9598e2SMagnus Damm .irqs = { gic_spi(79), gic_spi(79), 1866d9598e2SMagnus Damm gic_spi(79), gic_spi(79) }, 1876d9598e2SMagnus Damm }; 1886d9598e2SMagnus Damm 1896d9598e2SMagnus Damm static struct platform_device scif5_device = { 1906d9598e2SMagnus Damm .name = "sh-sci", 1916d9598e2SMagnus Damm .id = 5, 1926d9598e2SMagnus Damm .dev = { 1936d9598e2SMagnus Damm .platform_data = &scif5_platform_data, 1946d9598e2SMagnus Damm }, 1956d9598e2SMagnus Damm }; 1966d9598e2SMagnus Damm 1976d9598e2SMagnus Damm static struct plat_sci_port scif6_platform_data = { 1986d9598e2SMagnus Damm .mapbase = 0xe6cc0000, 1996d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 200f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 201f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 2026d9598e2SMagnus Damm .type = PORT_SCIFA, 2036d9598e2SMagnus Damm .irqs = { gic_spi(156), gic_spi(156), 2046d9598e2SMagnus Damm gic_spi(156), gic_spi(156) }, 2056d9598e2SMagnus Damm }; 2066d9598e2SMagnus Damm 2076d9598e2SMagnus Damm static struct platform_device scif6_device = { 2086d9598e2SMagnus Damm .name = "sh-sci", 2096d9598e2SMagnus Damm .id = 6, 2106d9598e2SMagnus Damm .dev = { 2116d9598e2SMagnus Damm .platform_data = &scif6_platform_data, 2126d9598e2SMagnus Damm }, 2136d9598e2SMagnus Damm }; 2146d9598e2SMagnus Damm 2156d9598e2SMagnus Damm static struct plat_sci_port scif7_platform_data = { 2166d9598e2SMagnus Damm .mapbase = 0xe6cd0000, 2176d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 218f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 219f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 2206d9598e2SMagnus Damm .type = PORT_SCIFA, 2216d9598e2SMagnus Damm .irqs = { gic_spi(143), gic_spi(143), 2226d9598e2SMagnus Damm gic_spi(143), gic_spi(143) }, 2236d9598e2SMagnus Damm }; 2246d9598e2SMagnus Damm 2256d9598e2SMagnus Damm static struct platform_device scif7_device = { 2266d9598e2SMagnus Damm .name = "sh-sci", 2276d9598e2SMagnus Damm .id = 7, 2286d9598e2SMagnus Damm .dev = { 2296d9598e2SMagnus Damm .platform_data = &scif7_platform_data, 2306d9598e2SMagnus Damm }, 2316d9598e2SMagnus Damm }; 2326d9598e2SMagnus Damm 2336d9598e2SMagnus Damm static struct plat_sci_port scif8_platform_data = { 2346d9598e2SMagnus Damm .mapbase = 0xe6c30000, 2356d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 236f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 237f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 2386d9598e2SMagnus Damm .type = PORT_SCIFB, 2396d9598e2SMagnus Damm .irqs = { gic_spi(80), gic_spi(80), 2406d9598e2SMagnus Damm gic_spi(80), gic_spi(80) }, 2416d9598e2SMagnus Damm }; 2426d9598e2SMagnus Damm 2436d9598e2SMagnus Damm static struct platform_device scif8_device = { 2446d9598e2SMagnus Damm .name = "sh-sci", 2456d9598e2SMagnus Damm .id = 8, 2466d9598e2SMagnus Damm .dev = { 2476d9598e2SMagnus Damm .platform_data = &scif8_platform_data, 2486d9598e2SMagnus Damm }, 2496d9598e2SMagnus Damm }; 2506d9598e2SMagnus Damm 2516d9598e2SMagnus Damm static struct sh_timer_config cmt10_platform_data = { 2526d9598e2SMagnus Damm .name = "CMT10", 2536d9598e2SMagnus Damm .channel_offset = 0x10, 2546d9598e2SMagnus Damm .timer_bit = 0, 2556d9598e2SMagnus Damm .clockevent_rating = 125, 2566d9598e2SMagnus Damm .clocksource_rating = 125, 2576d9598e2SMagnus Damm }; 2586d9598e2SMagnus Damm 2596d9598e2SMagnus Damm static struct resource cmt10_resources[] = { 2606d9598e2SMagnus Damm [0] = { 2616d9598e2SMagnus Damm .name = "CMT10", 2626d9598e2SMagnus Damm .start = 0xe6138010, 2636d9598e2SMagnus Damm .end = 0xe613801b, 2646d9598e2SMagnus Damm .flags = IORESOURCE_MEM, 2656d9598e2SMagnus Damm }, 2666d9598e2SMagnus Damm [1] = { 2676d9598e2SMagnus Damm .start = gic_spi(65), 2686d9598e2SMagnus Damm .flags = IORESOURCE_IRQ, 2696d9598e2SMagnus Damm }, 2706d9598e2SMagnus Damm }; 2716d9598e2SMagnus Damm 2726d9598e2SMagnus Damm static struct platform_device cmt10_device = { 2736d9598e2SMagnus Damm .name = "sh_cmt", 2746d9598e2SMagnus Damm .id = 10, 2756d9598e2SMagnus Damm .dev = { 2766d9598e2SMagnus Damm .platform_data = &cmt10_platform_data, 2776d9598e2SMagnus Damm }, 2786d9598e2SMagnus Damm .resource = cmt10_resources, 2796d9598e2SMagnus Damm .num_resources = ARRAY_SIZE(cmt10_resources), 2806d9598e2SMagnus Damm }; 2816d9598e2SMagnus Damm 2825010f3dbSMagnus Damm /* TMU */ 2835010f3dbSMagnus Damm static struct sh_timer_config tmu00_platform_data = { 2845010f3dbSMagnus Damm .name = "TMU00", 2855010f3dbSMagnus Damm .channel_offset = 0x4, 2865010f3dbSMagnus Damm .timer_bit = 0, 2875010f3dbSMagnus Damm .clockevent_rating = 200, 2885010f3dbSMagnus Damm }; 2895010f3dbSMagnus Damm 2905010f3dbSMagnus Damm static struct resource tmu00_resources[] = { 291abbec5f4SSimon Horman [0] = DEFINE_RES_MEM_NAMED(0xfff60008, 0xc, "TMU00"), 2925010f3dbSMagnus Damm [1] = { 2935010f3dbSMagnus Damm .start = intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */ 2945010f3dbSMagnus Damm .flags = IORESOURCE_IRQ, 2955010f3dbSMagnus Damm }, 2965010f3dbSMagnus Damm }; 2975010f3dbSMagnus Damm 2985010f3dbSMagnus Damm static struct platform_device tmu00_device = { 2995010f3dbSMagnus Damm .name = "sh_tmu", 3005010f3dbSMagnus Damm .id = 0, 3015010f3dbSMagnus Damm .dev = { 3025010f3dbSMagnus Damm .platform_data = &tmu00_platform_data, 3035010f3dbSMagnus Damm }, 3045010f3dbSMagnus Damm .resource = tmu00_resources, 3055010f3dbSMagnus Damm .num_resources = ARRAY_SIZE(tmu00_resources), 3065010f3dbSMagnus Damm }; 3075010f3dbSMagnus Damm 3085010f3dbSMagnus Damm static struct sh_timer_config tmu01_platform_data = { 3095010f3dbSMagnus Damm .name = "TMU01", 3105010f3dbSMagnus Damm .channel_offset = 0x10, 3115010f3dbSMagnus Damm .timer_bit = 1, 3125010f3dbSMagnus Damm .clocksource_rating = 200, 3135010f3dbSMagnus Damm }; 3145010f3dbSMagnus Damm 3155010f3dbSMagnus Damm static struct resource tmu01_resources[] = { 316abbec5f4SSimon Horman [0] = DEFINE_RES_MEM_NAMED(0xfff60014, 0xc, "TMU00"), 3175010f3dbSMagnus Damm [1] = { 3185010f3dbSMagnus Damm .start = intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */ 3195010f3dbSMagnus Damm .flags = IORESOURCE_IRQ, 3205010f3dbSMagnus Damm }, 3215010f3dbSMagnus Damm }; 3225010f3dbSMagnus Damm 3235010f3dbSMagnus Damm static struct platform_device tmu01_device = { 3245010f3dbSMagnus Damm .name = "sh_tmu", 3255010f3dbSMagnus Damm .id = 1, 3265010f3dbSMagnus Damm .dev = { 3275010f3dbSMagnus Damm .platform_data = &tmu01_platform_data, 3285010f3dbSMagnus Damm }, 3295010f3dbSMagnus Damm .resource = tmu01_resources, 3305010f3dbSMagnus Damm .num_resources = ARRAY_SIZE(tmu01_resources), 3315010f3dbSMagnus Damm }; 3325010f3dbSMagnus Damm 333b028f94bSYoshii Takashi static struct resource i2c0_resources[] = { 334abbec5f4SSimon Horman [0] = DEFINE_RES_MEM_NAMED(0xe6820000, 0x426, "IIC0"), 335b028f94bSYoshii Takashi [1] = { 336b028f94bSYoshii Takashi .start = gic_spi(167), 337b028f94bSYoshii Takashi .end = gic_spi(170), 338b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 339b028f94bSYoshii Takashi }, 340b028f94bSYoshii Takashi }; 341b028f94bSYoshii Takashi 342b028f94bSYoshii Takashi static struct resource i2c1_resources[] = { 343abbec5f4SSimon Horman [0] = DEFINE_RES_MEM_NAMED(0xe6822000, 0x426, "IIC1"), 344b028f94bSYoshii Takashi [1] = { 345b028f94bSYoshii Takashi .start = gic_spi(51), 346b028f94bSYoshii Takashi .end = gic_spi(54), 347b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 348b028f94bSYoshii Takashi }, 349b028f94bSYoshii Takashi }; 350b028f94bSYoshii Takashi 351b028f94bSYoshii Takashi static struct resource i2c2_resources[] = { 352abbec5f4SSimon Horman [0] = DEFINE_RES_MEM_NAMED(0xe6824000, 0x426, "IIC2"), 353b028f94bSYoshii Takashi [1] = { 354b028f94bSYoshii Takashi .start = gic_spi(171), 355b028f94bSYoshii Takashi .end = gic_spi(174), 356b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 357b028f94bSYoshii Takashi }, 358b028f94bSYoshii Takashi }; 359b028f94bSYoshii Takashi 360b028f94bSYoshii Takashi static struct resource i2c3_resources[] = { 361abbec5f4SSimon Horman [0] = DEFINE_RES_MEM_NAMED(0xe6826000, 0x426, "IIC3"), 362b028f94bSYoshii Takashi [1] = { 363b028f94bSYoshii Takashi .start = gic_spi(183), 364b028f94bSYoshii Takashi .end = gic_spi(186), 365b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 366b028f94bSYoshii Takashi }, 367b028f94bSYoshii Takashi }; 368b028f94bSYoshii Takashi 369b028f94bSYoshii Takashi static struct resource i2c4_resources[] = { 370abbec5f4SSimon Horman [0] = DEFINE_RES_MEM_NAMED(0xe6828000, 0x426, "IIC4"), 371b028f94bSYoshii Takashi [1] = { 372b028f94bSYoshii Takashi .start = gic_spi(187), 373b028f94bSYoshii Takashi .end = gic_spi(190), 374b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 375b028f94bSYoshii Takashi }, 376b028f94bSYoshii Takashi }; 377b028f94bSYoshii Takashi 378b028f94bSYoshii Takashi static struct platform_device i2c0_device = { 379b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 380b028f94bSYoshii Takashi .id = 0, 381b028f94bSYoshii Takashi .resource = i2c0_resources, 382b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c0_resources), 383b028f94bSYoshii Takashi }; 384b028f94bSYoshii Takashi 385b028f94bSYoshii Takashi static struct platform_device i2c1_device = { 386b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 387b028f94bSYoshii Takashi .id = 1, 388b028f94bSYoshii Takashi .resource = i2c1_resources, 389b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c1_resources), 390b028f94bSYoshii Takashi }; 391b028f94bSYoshii Takashi 392b028f94bSYoshii Takashi static struct platform_device i2c2_device = { 393b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 394b028f94bSYoshii Takashi .id = 2, 395b028f94bSYoshii Takashi .resource = i2c2_resources, 396b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c2_resources), 397b028f94bSYoshii Takashi }; 398b028f94bSYoshii Takashi 399b028f94bSYoshii Takashi static struct platform_device i2c3_device = { 400b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 401b028f94bSYoshii Takashi .id = 3, 402b028f94bSYoshii Takashi .resource = i2c3_resources, 403b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c3_resources), 404b028f94bSYoshii Takashi }; 405b028f94bSYoshii Takashi 406b028f94bSYoshii Takashi static struct platform_device i2c4_device = { 407b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 408b028f94bSYoshii Takashi .id = 4, 409b028f94bSYoshii Takashi .resource = i2c4_resources, 410b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c4_resources), 411b028f94bSYoshii Takashi }; 412b028f94bSYoshii Takashi 413681e1b3eSMagnus Damm static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = { 414681e1b3eSMagnus Damm { 415681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF0_TX, 416681e1b3eSMagnus Damm .addr = 0xe6c40020, 417681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 418681e1b3eSMagnus Damm .mid_rid = 0x21, 419681e1b3eSMagnus Damm }, { 420681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF0_RX, 421681e1b3eSMagnus Damm .addr = 0xe6c40024, 422681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 423681e1b3eSMagnus Damm .mid_rid = 0x22, 424681e1b3eSMagnus Damm }, { 425681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF1_TX, 426681e1b3eSMagnus Damm .addr = 0xe6c50020, 427681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 428681e1b3eSMagnus Damm .mid_rid = 0x25, 429681e1b3eSMagnus Damm }, { 430681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF1_RX, 431681e1b3eSMagnus Damm .addr = 0xe6c50024, 432681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 433681e1b3eSMagnus Damm .mid_rid = 0x26, 434681e1b3eSMagnus Damm }, { 435681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF2_TX, 436681e1b3eSMagnus Damm .addr = 0xe6c60020, 437681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 438681e1b3eSMagnus Damm .mid_rid = 0x29, 439681e1b3eSMagnus Damm }, { 440681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF2_RX, 441681e1b3eSMagnus Damm .addr = 0xe6c60024, 442681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 443681e1b3eSMagnus Damm .mid_rid = 0x2a, 444681e1b3eSMagnus Damm }, { 445681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF3_TX, 446681e1b3eSMagnus Damm .addr = 0xe6c70020, 447681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 448681e1b3eSMagnus Damm .mid_rid = 0x2d, 449681e1b3eSMagnus Damm }, { 450681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF3_RX, 451681e1b3eSMagnus Damm .addr = 0xe6c70024, 452681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 453681e1b3eSMagnus Damm .mid_rid = 0x2e, 454681e1b3eSMagnus Damm }, { 455681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF4_TX, 456681e1b3eSMagnus Damm .addr = 0xe6c80020, 457681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 458681e1b3eSMagnus Damm .mid_rid = 0x39, 459681e1b3eSMagnus Damm }, { 460681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF4_RX, 461681e1b3eSMagnus Damm .addr = 0xe6c80024, 462681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 463681e1b3eSMagnus Damm .mid_rid = 0x3a, 464681e1b3eSMagnus Damm }, { 465681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF5_TX, 466681e1b3eSMagnus Damm .addr = 0xe6cb0020, 467681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 468681e1b3eSMagnus Damm .mid_rid = 0x35, 469681e1b3eSMagnus Damm }, { 470681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF5_RX, 471681e1b3eSMagnus Damm .addr = 0xe6cb0024, 472681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 473681e1b3eSMagnus Damm .mid_rid = 0x36, 474681e1b3eSMagnus Damm }, { 475681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF6_TX, 476681e1b3eSMagnus Damm .addr = 0xe6cc0020, 477681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 478681e1b3eSMagnus Damm .mid_rid = 0x1d, 479681e1b3eSMagnus Damm }, { 480681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF6_RX, 481681e1b3eSMagnus Damm .addr = 0xe6cc0024, 482681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 483681e1b3eSMagnus Damm .mid_rid = 0x1e, 484681e1b3eSMagnus Damm }, { 485681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF7_TX, 486681e1b3eSMagnus Damm .addr = 0xe6cd0020, 487681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 488681e1b3eSMagnus Damm .mid_rid = 0x19, 489681e1b3eSMagnus Damm }, { 490681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF7_RX, 491681e1b3eSMagnus Damm .addr = 0xe6cd0024, 492681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 493681e1b3eSMagnus Damm .mid_rid = 0x1a, 494681e1b3eSMagnus Damm }, { 495681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF8_TX, 496681e1b3eSMagnus Damm .addr = 0xe6c30040, 497681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 498681e1b3eSMagnus Damm .mid_rid = 0x3d, 499681e1b3eSMagnus Damm }, { 500681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF8_RX, 501681e1b3eSMagnus Damm .addr = 0xe6c30060, 502681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 503681e1b3eSMagnus Damm .mid_rid = 0x3e, 504681e1b3eSMagnus Damm }, { 505681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI0_TX, 506681e1b3eSMagnus Damm .addr = 0xee100030, 507681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_16BIT), 508681e1b3eSMagnus Damm .mid_rid = 0xc1, 509681e1b3eSMagnus Damm }, { 510681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI0_RX, 511681e1b3eSMagnus Damm .addr = 0xee100030, 512681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_16BIT), 513681e1b3eSMagnus Damm .mid_rid = 0xc2, 514681e1b3eSMagnus Damm }, { 515681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI1_TX, 516681e1b3eSMagnus Damm .addr = 0xee120030, 517681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_16BIT), 518681e1b3eSMagnus Damm .mid_rid = 0xc9, 519681e1b3eSMagnus Damm }, { 520681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI1_RX, 521681e1b3eSMagnus Damm .addr = 0xee120030, 522681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_16BIT), 523681e1b3eSMagnus Damm .mid_rid = 0xca, 524681e1b3eSMagnus Damm }, { 525681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI2_TX, 526681e1b3eSMagnus Damm .addr = 0xee140030, 527681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_16BIT), 528681e1b3eSMagnus Damm .mid_rid = 0xcd, 529681e1b3eSMagnus Damm }, { 530681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI2_RX, 531681e1b3eSMagnus Damm .addr = 0xee140030, 532681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_16BIT), 533681e1b3eSMagnus Damm .mid_rid = 0xce, 534681e1b3eSMagnus Damm }, { 535681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_MMCIF_TX, 536681e1b3eSMagnus Damm .addr = 0xe6bd0034, 537681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_32BIT), 538681e1b3eSMagnus Damm .mid_rid = 0xd1, 539681e1b3eSMagnus Damm }, { 540681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_MMCIF_RX, 541681e1b3eSMagnus Damm .addr = 0xe6bd0034, 542681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_32BIT), 543681e1b3eSMagnus Damm .mid_rid = 0xd2, 544681e1b3eSMagnus Damm }, 545681e1b3eSMagnus Damm }; 546681e1b3eSMagnus Damm 547681e1b3eSMagnus Damm #define DMAE_CHANNEL(_offset) \ 548681e1b3eSMagnus Damm { \ 549681e1b3eSMagnus Damm .offset = _offset - 0x20, \ 550681e1b3eSMagnus Damm .dmars = _offset - 0x20 + 0x40, \ 551681e1b3eSMagnus Damm } 552681e1b3eSMagnus Damm 553681e1b3eSMagnus Damm static const struct sh_dmae_channel sh73a0_dmae_channels[] = { 554681e1b3eSMagnus Damm DMAE_CHANNEL(0x8000), 555681e1b3eSMagnus Damm DMAE_CHANNEL(0x8080), 556681e1b3eSMagnus Damm DMAE_CHANNEL(0x8100), 557681e1b3eSMagnus Damm DMAE_CHANNEL(0x8180), 558681e1b3eSMagnus Damm DMAE_CHANNEL(0x8200), 559681e1b3eSMagnus Damm DMAE_CHANNEL(0x8280), 560681e1b3eSMagnus Damm DMAE_CHANNEL(0x8300), 561681e1b3eSMagnus Damm DMAE_CHANNEL(0x8380), 562681e1b3eSMagnus Damm DMAE_CHANNEL(0x8400), 563681e1b3eSMagnus Damm DMAE_CHANNEL(0x8480), 564681e1b3eSMagnus Damm DMAE_CHANNEL(0x8500), 565681e1b3eSMagnus Damm DMAE_CHANNEL(0x8580), 566681e1b3eSMagnus Damm DMAE_CHANNEL(0x8600), 567681e1b3eSMagnus Damm DMAE_CHANNEL(0x8680), 568681e1b3eSMagnus Damm DMAE_CHANNEL(0x8700), 569681e1b3eSMagnus Damm DMAE_CHANNEL(0x8780), 570681e1b3eSMagnus Damm DMAE_CHANNEL(0x8800), 571681e1b3eSMagnus Damm DMAE_CHANNEL(0x8880), 572681e1b3eSMagnus Damm DMAE_CHANNEL(0x8900), 573681e1b3eSMagnus Damm DMAE_CHANNEL(0x8980), 574681e1b3eSMagnus Damm }; 575681e1b3eSMagnus Damm 576681e1b3eSMagnus Damm static struct sh_dmae_pdata sh73a0_dmae_platform_data = { 577681e1b3eSMagnus Damm .slave = sh73a0_dmae_slaves, 578681e1b3eSMagnus Damm .slave_num = ARRAY_SIZE(sh73a0_dmae_slaves), 579681e1b3eSMagnus Damm .channel = sh73a0_dmae_channels, 580681e1b3eSMagnus Damm .channel_num = ARRAY_SIZE(sh73a0_dmae_channels), 5816088b422SKuninori Morimoto .ts_low_shift = TS_LOW_SHIFT, 5826088b422SKuninori Morimoto .ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT, 5836088b422SKuninori Morimoto .ts_high_shift = TS_HI_SHIFT, 5846088b422SKuninori Morimoto .ts_high_mask = TS_HI_BIT << TS_HI_SHIFT, 5856088b422SKuninori Morimoto .ts_shift = dma_ts_shift, 5866088b422SKuninori Morimoto .ts_shift_num = ARRAY_SIZE(dma_ts_shift), 587681e1b3eSMagnus Damm .dmaor_init = DMAOR_DME, 588681e1b3eSMagnus Damm }; 589681e1b3eSMagnus Damm 590681e1b3eSMagnus Damm static struct resource sh73a0_dmae_resources[] = { 591abbec5f4SSimon Horman DEFINE_RES_MEM(0xfe000020, 0x89e0), 592681e1b3eSMagnus Damm { 59320052462SShimoda, Yoshihiro .name = "error_irq", 594681e1b3eSMagnus Damm .start = gic_spi(129), 595681e1b3eSMagnus Damm .end = gic_spi(129), 596681e1b3eSMagnus Damm .flags = IORESOURCE_IRQ, 597681e1b3eSMagnus Damm }, 598681e1b3eSMagnus Damm { 599681e1b3eSMagnus Damm /* IRQ for channels 0-19 */ 600681e1b3eSMagnus Damm .start = gic_spi(109), 601681e1b3eSMagnus Damm .end = gic_spi(128), 602681e1b3eSMagnus Damm .flags = IORESOURCE_IRQ, 603681e1b3eSMagnus Damm }, 604681e1b3eSMagnus Damm }; 605681e1b3eSMagnus Damm 606681e1b3eSMagnus Damm static struct platform_device dma0_device = { 607681e1b3eSMagnus Damm .name = "sh-dma-engine", 608681e1b3eSMagnus Damm .id = 0, 609681e1b3eSMagnus Damm .resource = sh73a0_dmae_resources, 610681e1b3eSMagnus Damm .num_resources = ARRAY_SIZE(sh73a0_dmae_resources), 611681e1b3eSMagnus Damm .dev = { 612681e1b3eSMagnus Damm .platform_data = &sh73a0_dmae_platform_data, 613681e1b3eSMagnus Damm }, 614681e1b3eSMagnus Damm }; 615681e1b3eSMagnus Damm 616832290b2SKuninori Morimoto /* MPDMAC */ 617832290b2SKuninori Morimoto static const struct sh_dmae_slave_config sh73a0_mpdma_slaves[] = { 618832290b2SKuninori Morimoto { 619832290b2SKuninori Morimoto .slave_id = SHDMA_SLAVE_FSI2A_RX, 620832290b2SKuninori Morimoto .addr = 0xec230020, 621832290b2SKuninori Morimoto .chcr = CHCR_RX(XMIT_SZ_32BIT), 622832290b2SKuninori Morimoto .mid_rid = 0xd6, /* CHECK ME */ 623832290b2SKuninori Morimoto }, { 624832290b2SKuninori Morimoto .slave_id = SHDMA_SLAVE_FSI2A_TX, 625832290b2SKuninori Morimoto .addr = 0xec230024, 626832290b2SKuninori Morimoto .chcr = CHCR_TX(XMIT_SZ_32BIT), 627832290b2SKuninori Morimoto .mid_rid = 0xd5, /* CHECK ME */ 628832290b2SKuninori Morimoto }, { 629832290b2SKuninori Morimoto .slave_id = SHDMA_SLAVE_FSI2C_RX, 630832290b2SKuninori Morimoto .addr = 0xec230060, 631832290b2SKuninori Morimoto .chcr = CHCR_RX(XMIT_SZ_32BIT), 632832290b2SKuninori Morimoto .mid_rid = 0xda, /* CHECK ME */ 633832290b2SKuninori Morimoto }, { 634832290b2SKuninori Morimoto .slave_id = SHDMA_SLAVE_FSI2C_TX, 635832290b2SKuninori Morimoto .addr = 0xec230064, 636832290b2SKuninori Morimoto .chcr = CHCR_TX(XMIT_SZ_32BIT), 637832290b2SKuninori Morimoto .mid_rid = 0xd9, /* CHECK ME */ 638832290b2SKuninori Morimoto }, { 639832290b2SKuninori Morimoto .slave_id = SHDMA_SLAVE_FSI2B_RX, 640832290b2SKuninori Morimoto .addr = 0xec240020, 641832290b2SKuninori Morimoto .chcr = CHCR_RX(XMIT_SZ_32BIT), 642832290b2SKuninori Morimoto .mid_rid = 0x8e, /* CHECK ME */ 643832290b2SKuninori Morimoto }, { 644832290b2SKuninori Morimoto .slave_id = SHDMA_SLAVE_FSI2B_TX, 645832290b2SKuninori Morimoto .addr = 0xec240024, 646832290b2SKuninori Morimoto .chcr = CHCR_RX(XMIT_SZ_32BIT), 647832290b2SKuninori Morimoto .mid_rid = 0x8d, /* CHECK ME */ 648832290b2SKuninori Morimoto }, { 649832290b2SKuninori Morimoto .slave_id = SHDMA_SLAVE_FSI2D_RX, 650832290b2SKuninori Morimoto .addr = 0xec240060, 651832290b2SKuninori Morimoto .chcr = CHCR_RX(XMIT_SZ_32BIT), 652832290b2SKuninori Morimoto .mid_rid = 0x9a, /* CHECK ME */ 653832290b2SKuninori Morimoto }, 654832290b2SKuninori Morimoto }; 655832290b2SKuninori Morimoto 656832290b2SKuninori Morimoto #define MPDMA_CHANNEL(a, b, c) \ 657832290b2SKuninori Morimoto { \ 658832290b2SKuninori Morimoto .offset = a, \ 659832290b2SKuninori Morimoto .dmars = b, \ 660832290b2SKuninori Morimoto .dmars_bit = c, \ 661832290b2SKuninori Morimoto .chclr_offset = (0x220 - 0x20) + a \ 662832290b2SKuninori Morimoto } 663832290b2SKuninori Morimoto 664832290b2SKuninori Morimoto static const struct sh_dmae_channel sh73a0_mpdma_channels[] = { 665832290b2SKuninori Morimoto MPDMA_CHANNEL(0x00, 0, 0), 666832290b2SKuninori Morimoto MPDMA_CHANNEL(0x10, 0, 8), 667832290b2SKuninori Morimoto MPDMA_CHANNEL(0x20, 4, 0), 668832290b2SKuninori Morimoto MPDMA_CHANNEL(0x30, 4, 8), 669832290b2SKuninori Morimoto MPDMA_CHANNEL(0x50, 8, 0), 670832290b2SKuninori Morimoto MPDMA_CHANNEL(0x70, 8, 8), 671832290b2SKuninori Morimoto }; 672832290b2SKuninori Morimoto 673832290b2SKuninori Morimoto static struct sh_dmae_pdata sh73a0_mpdma_platform_data = { 674832290b2SKuninori Morimoto .slave = sh73a0_mpdma_slaves, 675832290b2SKuninori Morimoto .slave_num = ARRAY_SIZE(sh73a0_mpdma_slaves), 676832290b2SKuninori Morimoto .channel = sh73a0_mpdma_channels, 677832290b2SKuninori Morimoto .channel_num = ARRAY_SIZE(sh73a0_mpdma_channels), 6786088b422SKuninori Morimoto .ts_low_shift = TS_LOW_SHIFT, 6796088b422SKuninori Morimoto .ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT, 6806088b422SKuninori Morimoto .ts_high_shift = TS_HI_SHIFT, 6816088b422SKuninori Morimoto .ts_high_mask = TS_HI_BIT << TS_HI_SHIFT, 6826088b422SKuninori Morimoto .ts_shift = dma_ts_shift, 6836088b422SKuninori Morimoto .ts_shift_num = ARRAY_SIZE(dma_ts_shift), 684832290b2SKuninori Morimoto .dmaor_init = DMAOR_DME, 685832290b2SKuninori Morimoto .chclr_present = 1, 686832290b2SKuninori Morimoto }; 687832290b2SKuninori Morimoto 688832290b2SKuninori Morimoto /* Resource order important! */ 689832290b2SKuninori Morimoto static struct resource sh73a0_mpdma_resources[] = { 690832290b2SKuninori Morimoto /* Channel registers and DMAOR */ 691abbec5f4SSimon Horman DEFINE_RES_MEM(0xec618020, 0x270), 692832290b2SKuninori Morimoto /* DMARSx */ 693abbec5f4SSimon Horman DEFINE_RES_MEM(0xec619000, 0xc), 694832290b2SKuninori Morimoto { 695832290b2SKuninori Morimoto .name = "error_irq", 696832290b2SKuninori Morimoto .start = gic_spi(181), 697832290b2SKuninori Morimoto .end = gic_spi(181), 698832290b2SKuninori Morimoto .flags = IORESOURCE_IRQ, 699832290b2SKuninori Morimoto }, 700832290b2SKuninori Morimoto { 701832290b2SKuninori Morimoto /* IRQ for channels 0-5 */ 702832290b2SKuninori Morimoto .start = gic_spi(175), 703832290b2SKuninori Morimoto .end = gic_spi(180), 704832290b2SKuninori Morimoto .flags = IORESOURCE_IRQ, 705832290b2SKuninori Morimoto }, 706832290b2SKuninori Morimoto }; 707832290b2SKuninori Morimoto 708832290b2SKuninori Morimoto static struct platform_device mpdma0_device = { 709832290b2SKuninori Morimoto .name = "sh-dma-engine", 710832290b2SKuninori Morimoto .id = 1, 711832290b2SKuninori Morimoto .resource = sh73a0_mpdma_resources, 712832290b2SKuninori Morimoto .num_resources = ARRAY_SIZE(sh73a0_mpdma_resources), 713832290b2SKuninori Morimoto .dev = { 714832290b2SKuninori Morimoto .platform_data = &sh73a0_mpdma_platform_data, 715832290b2SKuninori Morimoto }, 716832290b2SKuninori Morimoto }; 717832290b2SKuninori Morimoto 718f23f5be0STetsuyuki Kobayashi static struct resource pmu_resources[] = { 719f23f5be0STetsuyuki Kobayashi [0] = { 720f23f5be0STetsuyuki Kobayashi .start = gic_spi(55), 721f23f5be0STetsuyuki Kobayashi .end = gic_spi(55), 722f23f5be0STetsuyuki Kobayashi .flags = IORESOURCE_IRQ, 723f23f5be0STetsuyuki Kobayashi }, 724f23f5be0STetsuyuki Kobayashi [1] = { 725f23f5be0STetsuyuki Kobayashi .start = gic_spi(56), 726f23f5be0STetsuyuki Kobayashi .end = gic_spi(56), 727f23f5be0STetsuyuki Kobayashi .flags = IORESOURCE_IRQ, 728f23f5be0STetsuyuki Kobayashi }, 729f23f5be0STetsuyuki Kobayashi }; 730f23f5be0STetsuyuki Kobayashi 731f23f5be0STetsuyuki Kobayashi static struct platform_device pmu_device = { 732f23f5be0STetsuyuki Kobayashi .name = "arm-pmu", 733f23f5be0STetsuyuki Kobayashi .id = -1, 734f23f5be0STetsuyuki Kobayashi .num_resources = ARRAY_SIZE(pmu_resources), 735f23f5be0STetsuyuki Kobayashi .resource = pmu_resources, 736f23f5be0STetsuyuki Kobayashi }; 737f23f5be0STetsuyuki Kobayashi 7389a27dee7SHideki EIRAKU /* an IPMMU module for ICB */ 7399a27dee7SHideki EIRAKU static struct resource ipmmu_resources[] = { 740abbec5f4SSimon Horman DEFINE_RES_MEM_NAMED(0xfe951000, 0x100, "IPMMU"), 7419a27dee7SHideki EIRAKU }; 7429a27dee7SHideki EIRAKU 7439a27dee7SHideki EIRAKU static const char * const ipmmu_dev_names[] = { 7449a27dee7SHideki EIRAKU "sh_mobile_lcdc_fb.0", 7459a27dee7SHideki EIRAKU }; 7469a27dee7SHideki EIRAKU 7479a27dee7SHideki EIRAKU static struct shmobile_ipmmu_platform_data ipmmu_platform_data = { 7489a27dee7SHideki EIRAKU .dev_names = ipmmu_dev_names, 7499a27dee7SHideki EIRAKU .num_dev_names = ARRAY_SIZE(ipmmu_dev_names), 7509a27dee7SHideki EIRAKU }; 7519a27dee7SHideki EIRAKU 7529a27dee7SHideki EIRAKU static struct platform_device ipmmu_device = { 7539a27dee7SHideki EIRAKU .name = "ipmmu", 7549a27dee7SHideki EIRAKU .id = -1, 7559a27dee7SHideki EIRAKU .dev = { 7569a27dee7SHideki EIRAKU .platform_data = &ipmmu_platform_data, 7579a27dee7SHideki EIRAKU }, 7589a27dee7SHideki EIRAKU .resource = ipmmu_resources, 7599a27dee7SHideki EIRAKU .num_resources = ARRAY_SIZE(ipmmu_resources), 7609a27dee7SHideki EIRAKU }; 7619a27dee7SHideki EIRAKU 7621461f8b6SMagnus Damm static struct renesas_intc_irqpin_config irqpin0_platform_data = { 763341eb546SMagnus Damm .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */ 764341eb546SMagnus Damm }; 765341eb546SMagnus Damm 766341eb546SMagnus Damm static struct resource irqpin0_resources[] = { 767341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900000, 4), /* ICR1A */ 768341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900010, 4), /* INTPRI00A */ 769341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900020, 1), /* INTREQ00A */ 770341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900040, 1), /* INTMSK00A */ 771341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900060, 1), /* INTMSKCLR00A */ 772341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(1)), /* IRQ0 */ 773341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(2)), /* IRQ1 */ 774341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(3)), /* IRQ2 */ 775341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(4)), /* IRQ3 */ 776341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(5)), /* IRQ4 */ 777341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(6)), /* IRQ5 */ 778341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(7)), /* IRQ6 */ 779341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(8)), /* IRQ7 */ 780341eb546SMagnus Damm }; 781341eb546SMagnus Damm 782341eb546SMagnus Damm static struct platform_device irqpin0_device = { 783341eb546SMagnus Damm .name = "renesas_intc_irqpin", 784341eb546SMagnus Damm .id = 0, 785341eb546SMagnus Damm .resource = irqpin0_resources, 786341eb546SMagnus Damm .num_resources = ARRAY_SIZE(irqpin0_resources), 787341eb546SMagnus Damm .dev = { 788341eb546SMagnus Damm .platform_data = &irqpin0_platform_data, 789341eb546SMagnus Damm }, 790341eb546SMagnus Damm }; 791341eb546SMagnus Damm 7921461f8b6SMagnus Damm static struct renesas_intc_irqpin_config irqpin1_platform_data = { 793341eb546SMagnus Damm .irq_base = irq_pin(8), /* IRQ8 -> IRQ15 */ 794341eb546SMagnus Damm .control_parent = true, /* Disable spurious IRQ10 */ 795341eb546SMagnus Damm }; 796341eb546SMagnus Damm 797341eb546SMagnus Damm static struct resource irqpin1_resources[] = { 798341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900004, 4), /* ICR2A */ 799341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900014, 4), /* INTPRI10A */ 800341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900024, 1), /* INTREQ10A */ 801341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900044, 1), /* INTMSK10A */ 802341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900064, 1), /* INTMSKCLR10A */ 803341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(9)), /* IRQ8 */ 804341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(10)), /* IRQ9 */ 805341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(11)), /* IRQ10 */ 806341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(12)), /* IRQ11 */ 807341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(13)), /* IRQ12 */ 808341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(14)), /* IRQ13 */ 809341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(15)), /* IRQ14 */ 810341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(16)), /* IRQ15 */ 811341eb546SMagnus Damm }; 812341eb546SMagnus Damm 813341eb546SMagnus Damm static struct platform_device irqpin1_device = { 814341eb546SMagnus Damm .name = "renesas_intc_irqpin", 815341eb546SMagnus Damm .id = 1, 816341eb546SMagnus Damm .resource = irqpin1_resources, 817341eb546SMagnus Damm .num_resources = ARRAY_SIZE(irqpin1_resources), 818341eb546SMagnus Damm .dev = { 819341eb546SMagnus Damm .platform_data = &irqpin1_platform_data, 820341eb546SMagnus Damm }, 821341eb546SMagnus Damm }; 822341eb546SMagnus Damm 8231461f8b6SMagnus Damm static struct renesas_intc_irqpin_config irqpin2_platform_data = { 824341eb546SMagnus Damm .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */ 825341eb546SMagnus Damm }; 826341eb546SMagnus Damm 827341eb546SMagnus Damm static struct resource irqpin2_resources[] = { 828341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900008, 4), /* ICR3A */ 829341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900018, 4), /* INTPRI20A */ 830341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900028, 1), /* INTREQ20A */ 831341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900048, 1), /* INTMSK20A */ 832341eb546SMagnus Damm DEFINE_RES_MEM(0xe6900068, 1), /* INTMSKCLR20A */ 833341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(17)), /* IRQ16 */ 834341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(18)), /* IRQ17 */ 835341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(19)), /* IRQ18 */ 836341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(20)), /* IRQ19 */ 837341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(21)), /* IRQ20 */ 838341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(22)), /* IRQ21 */ 839341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(23)), /* IRQ22 */ 840341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(24)), /* IRQ23 */ 841341eb546SMagnus Damm }; 842341eb546SMagnus Damm 843341eb546SMagnus Damm static struct platform_device irqpin2_device = { 844341eb546SMagnus Damm .name = "renesas_intc_irqpin", 845341eb546SMagnus Damm .id = 2, 846341eb546SMagnus Damm .resource = irqpin2_resources, 847341eb546SMagnus Damm .num_resources = ARRAY_SIZE(irqpin2_resources), 848341eb546SMagnus Damm .dev = { 849341eb546SMagnus Damm .platform_data = &irqpin2_platform_data, 850341eb546SMagnus Damm }, 851341eb546SMagnus Damm }; 852341eb546SMagnus Damm 8531461f8b6SMagnus Damm static struct renesas_intc_irqpin_config irqpin3_platform_data = { 854341eb546SMagnus Damm .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */ 855341eb546SMagnus Damm }; 856341eb546SMagnus Damm 857341eb546SMagnus Damm static struct resource irqpin3_resources[] = { 858341eb546SMagnus Damm DEFINE_RES_MEM(0xe690000c, 4), /* ICR4A */ 859341eb546SMagnus Damm DEFINE_RES_MEM(0xe690001c, 4), /* INTPRI30A */ 860341eb546SMagnus Damm DEFINE_RES_MEM(0xe690002c, 1), /* INTREQ30A */ 861341eb546SMagnus Damm DEFINE_RES_MEM(0xe690004c, 1), /* INTMSK30A */ 862341eb546SMagnus Damm DEFINE_RES_MEM(0xe690006c, 1), /* INTMSKCLR30A */ 863341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(25)), /* IRQ24 */ 864341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(26)), /* IRQ25 */ 865341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(27)), /* IRQ26 */ 866341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(28)), /* IRQ27 */ 867341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(29)), /* IRQ28 */ 868341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(30)), /* IRQ29 */ 869341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(31)), /* IRQ30 */ 870341eb546SMagnus Damm DEFINE_RES_IRQ(gic_spi(32)), /* IRQ31 */ 871341eb546SMagnus Damm }; 872341eb546SMagnus Damm 873341eb546SMagnus Damm static struct platform_device irqpin3_device = { 874341eb546SMagnus Damm .name = "renesas_intc_irqpin", 875341eb546SMagnus Damm .id = 3, 876341eb546SMagnus Damm .resource = irqpin3_resources, 877341eb546SMagnus Damm .num_resources = ARRAY_SIZE(irqpin3_resources), 878341eb546SMagnus Damm .dev = { 879341eb546SMagnus Damm .platform_data = &irqpin3_platform_data, 880341eb546SMagnus Damm }, 881341eb546SMagnus Damm }; 882341eb546SMagnus Damm 8833b00f934SSimon Horman static struct platform_device *sh73a0_devices_dt[] __initdata = { 8846d9598e2SMagnus Damm &scif0_device, 8856d9598e2SMagnus Damm &scif1_device, 8866d9598e2SMagnus Damm &scif2_device, 8876d9598e2SMagnus Damm &scif3_device, 8886d9598e2SMagnus Damm &scif4_device, 8896d9598e2SMagnus Damm &scif5_device, 8906d9598e2SMagnus Damm &scif6_device, 8916d9598e2SMagnus Damm &scif7_device, 8926d9598e2SMagnus Damm &scif8_device, 8936d9598e2SMagnus Damm &cmt10_device, 89448609533SSimon Horman }; 89548609533SSimon Horman 89648609533SSimon Horman static struct platform_device *sh73a0_early_devices[] __initdata = { 8975010f3dbSMagnus Damm &tmu00_device, 8985010f3dbSMagnus Damm &tmu01_device, 8999a27dee7SHideki EIRAKU &ipmmu_device, 9006d9598e2SMagnus Damm }; 9016d9598e2SMagnus Damm 902b028f94bSYoshii Takashi static struct platform_device *sh73a0_late_devices[] __initdata = { 903b028f94bSYoshii Takashi &i2c0_device, 904b028f94bSYoshii Takashi &i2c1_device, 905b028f94bSYoshii Takashi &i2c2_device, 906b028f94bSYoshii Takashi &i2c3_device, 907b028f94bSYoshii Takashi &i2c4_device, 908681e1b3eSMagnus Damm &dma0_device, 909832290b2SKuninori Morimoto &mpdma0_device, 910f23f5be0STetsuyuki Kobayashi &pmu_device, 911341eb546SMagnus Damm &irqpin0_device, 912341eb546SMagnus Damm &irqpin1_device, 913341eb546SMagnus Damm &irqpin2_device, 914341eb546SMagnus Damm &irqpin3_device, 915b028f94bSYoshii Takashi }; 916b028f94bSYoshii Takashi 9170a4b04dcSArnd Bergmann #define SRCR2 IOMEM(0xe61580b0) 918681e1b3eSMagnus Damm 9196d9598e2SMagnus Damm void __init sh73a0_add_standard_devices(void) 9206d9598e2SMagnus Damm { 921681e1b3eSMagnus Damm /* Clear software reset bit on SY-DMAC module */ 922681e1b3eSMagnus Damm __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2); 923681e1b3eSMagnus Damm 9243b00f934SSimon Horman platform_add_devices(sh73a0_devices_dt, 9253b00f934SSimon Horman ARRAY_SIZE(sh73a0_devices_dt)); 9266d9598e2SMagnus Damm platform_add_devices(sh73a0_early_devices, 9276d9598e2SMagnus Damm ARRAY_SIZE(sh73a0_early_devices)); 928b028f94bSYoshii Takashi platform_add_devices(sh73a0_late_devices, 929b028f94bSYoshii Takashi ARRAY_SIZE(sh73a0_late_devices)); 9306d9598e2SMagnus Damm } 9316d9598e2SMagnus Damm 932d6720003SKuninori Morimoto /* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */ 933d6720003SKuninori Morimoto void __init __weak sh73a0_register_twd(void) { } 934d6720003SKuninori Morimoto 9356bb27d73SStephen Warren void __init sh73a0_earlytimer_init(void) 9363be26fdbSMagnus Damm { 9373be26fdbSMagnus Damm sh73a0_clock_init(); 9383be26fdbSMagnus Damm shmobile_earlytimer_init(); 939d6720003SKuninori Morimoto sh73a0_register_twd(); 9403be26fdbSMagnus Damm } 9413be26fdbSMagnus Damm 9426d9598e2SMagnus Damm void __init sh73a0_add_early_devices(void) 9436d9598e2SMagnus Damm { 9443b00f934SSimon Horman early_platform_add_devices(sh73a0_devices_dt, 9453b00f934SSimon Horman ARRAY_SIZE(sh73a0_devices_dt)); 9466d9598e2SMagnus Damm early_platform_add_devices(sh73a0_early_devices, 9476d9598e2SMagnus Damm ARRAY_SIZE(sh73a0_early_devices)); 94850e15c34SMagnus Damm 94950e15c34SMagnus Damm /* setup early console here as well */ 95050e15c34SMagnus Damm shmobile_setup_console(); 9516d9598e2SMagnus Damm } 95248609533SSimon Horman 95348609533SSimon Horman #ifdef CONFIG_USE_OF 95448609533SSimon Horman 9553b00f934SSimon Horman void __init sh73a0_init_delay(void) 95648609533SSimon Horman { 95748609533SSimon Horman shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */ 95848609533SSimon Horman } 95948609533SSimon Horman 96048609533SSimon Horman static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = { 96148609533SSimon Horman {}, 96248609533SSimon Horman }; 96348609533SSimon Horman 96448609533SSimon Horman void __init sh73a0_add_standard_devices_dt(void) 96548609533SSimon Horman { 966d2347382SGuennadi Liakhovetski struct platform_device_info devinfo = { .name = "cpufreq-cpu0", .id = -1, }; 967d2347382SGuennadi Liakhovetski 96848609533SSimon Horman /* clocks are setup late during boot in the case of DT */ 96948609533SSimon Horman sh73a0_clock_init(); 97048609533SSimon Horman 9713b00f934SSimon Horman platform_add_devices(sh73a0_devices_dt, 9723b00f934SSimon Horman ARRAY_SIZE(sh73a0_devices_dt)); 97348609533SSimon Horman of_platform_populate(NULL, of_default_bus_match_table, 97448609533SSimon Horman sh73a0_auxdata_lookup, NULL); 975d2347382SGuennadi Liakhovetski 976d2347382SGuennadi Liakhovetski /* Instantiate cpufreq-cpu0 */ 977d2347382SGuennadi Liakhovetski platform_device_register_full(&devinfo); 97848609533SSimon Horman } 97948609533SSimon Horman 98048609533SSimon Horman static const char *sh73a0_boards_compat_dt[] __initdata = { 98148609533SSimon Horman "renesas,sh73a0", 98248609533SSimon Horman NULL, 98348609533SSimon Horman }; 98448609533SSimon Horman 98548609533SSimon Horman DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)") 986f9989507SSimon Horman .smp = smp_ops(sh73a0_smp_ops), 98748609533SSimon Horman .map_io = sh73a0_map_io, 9883b00f934SSimon Horman .init_early = sh73a0_init_delay, 98948609533SSimon Horman .nr_irqs = NR_IRQS_LEGACY, 9904eca134fSSimon Horman .init_irq = irqchip_init, 99148609533SSimon Horman .init_machine = sh73a0_add_standard_devices_dt, 99248609533SSimon Horman .dt_compat = sh73a0_boards_compat_dt, 99348609533SSimon Horman MACHINE_END 99448609533SSimon Horman #endif /* CONFIG_USE_OF */ 995