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> 256d9598e2SMagnus Damm #include <linux/platform_device.h> 266d9598e2SMagnus Damm #include <linux/delay.h> 276d9598e2SMagnus Damm #include <linux/input.h> 286d9598e2SMagnus Damm #include <linux/io.h> 296d9598e2SMagnus Damm #include <linux/serial_sci.h> 30681e1b3eSMagnus Damm #include <linux/sh_dma.h> 316d9598e2SMagnus Damm #include <linux/sh_intc.h> 326d9598e2SMagnus Damm #include <linux/sh_timer.h> 336d9598e2SMagnus Damm #include <mach/hardware.h> 34681e1b3eSMagnus Damm #include <mach/sh73a0.h> 356d9598e2SMagnus Damm #include <asm/mach-types.h> 366d9598e2SMagnus Damm #include <asm/mach/arch.h> 376d9598e2SMagnus Damm 386d9598e2SMagnus Damm static struct plat_sci_port scif0_platform_data = { 396d9598e2SMagnus Damm .mapbase = 0xe6c40000, 406d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 41f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 42f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 436d9598e2SMagnus Damm .type = PORT_SCIFA, 446d9598e2SMagnus Damm .irqs = { gic_spi(72), gic_spi(72), 456d9598e2SMagnus Damm gic_spi(72), gic_spi(72) }, 466d9598e2SMagnus Damm }; 476d9598e2SMagnus Damm 486d9598e2SMagnus Damm static struct platform_device scif0_device = { 496d9598e2SMagnus Damm .name = "sh-sci", 506d9598e2SMagnus Damm .id = 0, 516d9598e2SMagnus Damm .dev = { 526d9598e2SMagnus Damm .platform_data = &scif0_platform_data, 536d9598e2SMagnus Damm }, 546d9598e2SMagnus Damm }; 556d9598e2SMagnus Damm 566d9598e2SMagnus Damm static struct plat_sci_port scif1_platform_data = { 576d9598e2SMagnus Damm .mapbase = 0xe6c50000, 586d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 59f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 60f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 616d9598e2SMagnus Damm .type = PORT_SCIFA, 626d9598e2SMagnus Damm .irqs = { gic_spi(73), gic_spi(73), 636d9598e2SMagnus Damm gic_spi(73), gic_spi(73) }, 646d9598e2SMagnus Damm }; 656d9598e2SMagnus Damm 666d9598e2SMagnus Damm static struct platform_device scif1_device = { 676d9598e2SMagnus Damm .name = "sh-sci", 686d9598e2SMagnus Damm .id = 1, 696d9598e2SMagnus Damm .dev = { 706d9598e2SMagnus Damm .platform_data = &scif1_platform_data, 716d9598e2SMagnus Damm }, 726d9598e2SMagnus Damm }; 736d9598e2SMagnus Damm 746d9598e2SMagnus Damm static struct plat_sci_port scif2_platform_data = { 756d9598e2SMagnus Damm .mapbase = 0xe6c60000, 766d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 77f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 78f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 796d9598e2SMagnus Damm .type = PORT_SCIFA, 806d9598e2SMagnus Damm .irqs = { gic_spi(74), gic_spi(74), 816d9598e2SMagnus Damm gic_spi(74), gic_spi(74) }, 826d9598e2SMagnus Damm }; 836d9598e2SMagnus Damm 846d9598e2SMagnus Damm static struct platform_device scif2_device = { 856d9598e2SMagnus Damm .name = "sh-sci", 866d9598e2SMagnus Damm .id = 2, 876d9598e2SMagnus Damm .dev = { 886d9598e2SMagnus Damm .platform_data = &scif2_platform_data, 896d9598e2SMagnus Damm }, 906d9598e2SMagnus Damm }; 916d9598e2SMagnus Damm 926d9598e2SMagnus Damm static struct plat_sci_port scif3_platform_data = { 936d9598e2SMagnus Damm .mapbase = 0xe6c70000, 946d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 95f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 96f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 976d9598e2SMagnus Damm .type = PORT_SCIFA, 986d9598e2SMagnus Damm .irqs = { gic_spi(75), gic_spi(75), 996d9598e2SMagnus Damm gic_spi(75), gic_spi(75) }, 1006d9598e2SMagnus Damm }; 1016d9598e2SMagnus Damm 1026d9598e2SMagnus Damm static struct platform_device scif3_device = { 1036d9598e2SMagnus Damm .name = "sh-sci", 1046d9598e2SMagnus Damm .id = 3, 1056d9598e2SMagnus Damm .dev = { 1066d9598e2SMagnus Damm .platform_data = &scif3_platform_data, 1076d9598e2SMagnus Damm }, 1086d9598e2SMagnus Damm }; 1096d9598e2SMagnus Damm 1106d9598e2SMagnus Damm static struct plat_sci_port scif4_platform_data = { 1116d9598e2SMagnus Damm .mapbase = 0xe6c80000, 1126d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 113f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 114f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1156d9598e2SMagnus Damm .type = PORT_SCIFA, 1166d9598e2SMagnus Damm .irqs = { gic_spi(78), gic_spi(78), 1176d9598e2SMagnus Damm gic_spi(78), gic_spi(78) }, 1186d9598e2SMagnus Damm }; 1196d9598e2SMagnus Damm 1206d9598e2SMagnus Damm static struct platform_device scif4_device = { 1216d9598e2SMagnus Damm .name = "sh-sci", 1226d9598e2SMagnus Damm .id = 4, 1236d9598e2SMagnus Damm .dev = { 1246d9598e2SMagnus Damm .platform_data = &scif4_platform_data, 1256d9598e2SMagnus Damm }, 1266d9598e2SMagnus Damm }; 1276d9598e2SMagnus Damm 1286d9598e2SMagnus Damm static struct plat_sci_port scif5_platform_data = { 1296d9598e2SMagnus Damm .mapbase = 0xe6cb0000, 1306d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 131f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 132f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1336d9598e2SMagnus Damm .type = PORT_SCIFA, 1346d9598e2SMagnus Damm .irqs = { gic_spi(79), gic_spi(79), 1356d9598e2SMagnus Damm gic_spi(79), gic_spi(79) }, 1366d9598e2SMagnus Damm }; 1376d9598e2SMagnus Damm 1386d9598e2SMagnus Damm static struct platform_device scif5_device = { 1396d9598e2SMagnus Damm .name = "sh-sci", 1406d9598e2SMagnus Damm .id = 5, 1416d9598e2SMagnus Damm .dev = { 1426d9598e2SMagnus Damm .platform_data = &scif5_platform_data, 1436d9598e2SMagnus Damm }, 1446d9598e2SMagnus Damm }; 1456d9598e2SMagnus Damm 1466d9598e2SMagnus Damm static struct plat_sci_port scif6_platform_data = { 1476d9598e2SMagnus Damm .mapbase = 0xe6cc0000, 1486d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 149f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 150f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1516d9598e2SMagnus Damm .type = PORT_SCIFA, 1526d9598e2SMagnus Damm .irqs = { gic_spi(156), gic_spi(156), 1536d9598e2SMagnus Damm gic_spi(156), gic_spi(156) }, 1546d9598e2SMagnus Damm }; 1556d9598e2SMagnus Damm 1566d9598e2SMagnus Damm static struct platform_device scif6_device = { 1576d9598e2SMagnus Damm .name = "sh-sci", 1586d9598e2SMagnus Damm .id = 6, 1596d9598e2SMagnus Damm .dev = { 1606d9598e2SMagnus Damm .platform_data = &scif6_platform_data, 1616d9598e2SMagnus Damm }, 1626d9598e2SMagnus Damm }; 1636d9598e2SMagnus Damm 1646d9598e2SMagnus Damm static struct plat_sci_port scif7_platform_data = { 1656d9598e2SMagnus Damm .mapbase = 0xe6cd0000, 1666d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 167f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 168f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1696d9598e2SMagnus Damm .type = PORT_SCIFA, 1706d9598e2SMagnus Damm .irqs = { gic_spi(143), gic_spi(143), 1716d9598e2SMagnus Damm gic_spi(143), gic_spi(143) }, 1726d9598e2SMagnus Damm }; 1736d9598e2SMagnus Damm 1746d9598e2SMagnus Damm static struct platform_device scif7_device = { 1756d9598e2SMagnus Damm .name = "sh-sci", 1766d9598e2SMagnus Damm .id = 7, 1776d9598e2SMagnus Damm .dev = { 1786d9598e2SMagnus Damm .platform_data = &scif7_platform_data, 1796d9598e2SMagnus Damm }, 1806d9598e2SMagnus Damm }; 1816d9598e2SMagnus Damm 1826d9598e2SMagnus Damm static struct plat_sci_port scif8_platform_data = { 1836d9598e2SMagnus Damm .mapbase = 0xe6c30000, 1846d9598e2SMagnus Damm .flags = UPF_BOOT_AUTOCONF, 185f43dc23dSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE, 186f43dc23dSPaul Mundt .scbrr_algo_id = SCBRR_ALGO_4, 1876d9598e2SMagnus Damm .type = PORT_SCIFB, 1886d9598e2SMagnus Damm .irqs = { gic_spi(80), gic_spi(80), 1896d9598e2SMagnus Damm gic_spi(80), gic_spi(80) }, 1906d9598e2SMagnus Damm }; 1916d9598e2SMagnus Damm 1926d9598e2SMagnus Damm static struct platform_device scif8_device = { 1936d9598e2SMagnus Damm .name = "sh-sci", 1946d9598e2SMagnus Damm .id = 8, 1956d9598e2SMagnus Damm .dev = { 1966d9598e2SMagnus Damm .platform_data = &scif8_platform_data, 1976d9598e2SMagnus Damm }, 1986d9598e2SMagnus Damm }; 1996d9598e2SMagnus Damm 2006d9598e2SMagnus Damm static struct sh_timer_config cmt10_platform_data = { 2016d9598e2SMagnus Damm .name = "CMT10", 2026d9598e2SMagnus Damm .channel_offset = 0x10, 2036d9598e2SMagnus Damm .timer_bit = 0, 2046d9598e2SMagnus Damm .clockevent_rating = 125, 2056d9598e2SMagnus Damm .clocksource_rating = 125, 2066d9598e2SMagnus Damm }; 2076d9598e2SMagnus Damm 2086d9598e2SMagnus Damm static struct resource cmt10_resources[] = { 2096d9598e2SMagnus Damm [0] = { 2106d9598e2SMagnus Damm .name = "CMT10", 2116d9598e2SMagnus Damm .start = 0xe6138010, 2126d9598e2SMagnus Damm .end = 0xe613801b, 2136d9598e2SMagnus Damm .flags = IORESOURCE_MEM, 2146d9598e2SMagnus Damm }, 2156d9598e2SMagnus Damm [1] = { 2166d9598e2SMagnus Damm .start = gic_spi(65), 2176d9598e2SMagnus Damm .flags = IORESOURCE_IRQ, 2186d9598e2SMagnus Damm }, 2196d9598e2SMagnus Damm }; 2206d9598e2SMagnus Damm 2216d9598e2SMagnus Damm static struct platform_device cmt10_device = { 2226d9598e2SMagnus Damm .name = "sh_cmt", 2236d9598e2SMagnus Damm .id = 10, 2246d9598e2SMagnus Damm .dev = { 2256d9598e2SMagnus Damm .platform_data = &cmt10_platform_data, 2266d9598e2SMagnus Damm }, 2276d9598e2SMagnus Damm .resource = cmt10_resources, 2286d9598e2SMagnus Damm .num_resources = ARRAY_SIZE(cmt10_resources), 2296d9598e2SMagnus Damm }; 2306d9598e2SMagnus Damm 2315010f3dbSMagnus Damm /* TMU */ 2325010f3dbSMagnus Damm static struct sh_timer_config tmu00_platform_data = { 2335010f3dbSMagnus Damm .name = "TMU00", 2345010f3dbSMagnus Damm .channel_offset = 0x4, 2355010f3dbSMagnus Damm .timer_bit = 0, 2365010f3dbSMagnus Damm .clockevent_rating = 200, 2375010f3dbSMagnus Damm }; 2385010f3dbSMagnus Damm 2395010f3dbSMagnus Damm static struct resource tmu00_resources[] = { 2405010f3dbSMagnus Damm [0] = { 2415010f3dbSMagnus Damm .name = "TMU00", 2425010f3dbSMagnus Damm .start = 0xfff60008, 2435010f3dbSMagnus Damm .end = 0xfff60013, 2445010f3dbSMagnus Damm .flags = IORESOURCE_MEM, 2455010f3dbSMagnus Damm }, 2465010f3dbSMagnus Damm [1] = { 2475010f3dbSMagnus Damm .start = intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */ 2485010f3dbSMagnus Damm .flags = IORESOURCE_IRQ, 2495010f3dbSMagnus Damm }, 2505010f3dbSMagnus Damm }; 2515010f3dbSMagnus Damm 2525010f3dbSMagnus Damm static struct platform_device tmu00_device = { 2535010f3dbSMagnus Damm .name = "sh_tmu", 2545010f3dbSMagnus Damm .id = 0, 2555010f3dbSMagnus Damm .dev = { 2565010f3dbSMagnus Damm .platform_data = &tmu00_platform_data, 2575010f3dbSMagnus Damm }, 2585010f3dbSMagnus Damm .resource = tmu00_resources, 2595010f3dbSMagnus Damm .num_resources = ARRAY_SIZE(tmu00_resources), 2605010f3dbSMagnus Damm }; 2615010f3dbSMagnus Damm 2625010f3dbSMagnus Damm static struct sh_timer_config tmu01_platform_data = { 2635010f3dbSMagnus Damm .name = "TMU01", 2645010f3dbSMagnus Damm .channel_offset = 0x10, 2655010f3dbSMagnus Damm .timer_bit = 1, 2665010f3dbSMagnus Damm .clocksource_rating = 200, 2675010f3dbSMagnus Damm }; 2685010f3dbSMagnus Damm 2695010f3dbSMagnus Damm static struct resource tmu01_resources[] = { 2705010f3dbSMagnus Damm [0] = { 2715010f3dbSMagnus Damm .name = "TMU01", 2725010f3dbSMagnus Damm .start = 0xfff60014, 2735010f3dbSMagnus Damm .end = 0xfff6001f, 2745010f3dbSMagnus Damm .flags = IORESOURCE_MEM, 2755010f3dbSMagnus Damm }, 2765010f3dbSMagnus Damm [1] = { 2775010f3dbSMagnus Damm .start = intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */ 2785010f3dbSMagnus Damm .flags = IORESOURCE_IRQ, 2795010f3dbSMagnus Damm }, 2805010f3dbSMagnus Damm }; 2815010f3dbSMagnus Damm 2825010f3dbSMagnus Damm static struct platform_device tmu01_device = { 2835010f3dbSMagnus Damm .name = "sh_tmu", 2845010f3dbSMagnus Damm .id = 1, 2855010f3dbSMagnus Damm .dev = { 2865010f3dbSMagnus Damm .platform_data = &tmu01_platform_data, 2875010f3dbSMagnus Damm }, 2885010f3dbSMagnus Damm .resource = tmu01_resources, 2895010f3dbSMagnus Damm .num_resources = ARRAY_SIZE(tmu01_resources), 2905010f3dbSMagnus Damm }; 2915010f3dbSMagnus Damm 292b028f94bSYoshii Takashi static struct resource i2c0_resources[] = { 293b028f94bSYoshii Takashi [0] = { 294b028f94bSYoshii Takashi .name = "IIC0", 295b028f94bSYoshii Takashi .start = 0xe6820000, 296b028f94bSYoshii Takashi .end = 0xe6820425 - 1, 297b028f94bSYoshii Takashi .flags = IORESOURCE_MEM, 298b028f94bSYoshii Takashi }, 299b028f94bSYoshii Takashi [1] = { 300b028f94bSYoshii Takashi .start = gic_spi(167), 301b028f94bSYoshii Takashi .end = gic_spi(170), 302b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 303b028f94bSYoshii Takashi }, 304b028f94bSYoshii Takashi }; 305b028f94bSYoshii Takashi 306b028f94bSYoshii Takashi static struct resource i2c1_resources[] = { 307b028f94bSYoshii Takashi [0] = { 308b028f94bSYoshii Takashi .name = "IIC1", 309b028f94bSYoshii Takashi .start = 0xe6822000, 310b028f94bSYoshii Takashi .end = 0xe6822425 - 1, 311b028f94bSYoshii Takashi .flags = IORESOURCE_MEM, 312b028f94bSYoshii Takashi }, 313b028f94bSYoshii Takashi [1] = { 314b028f94bSYoshii Takashi .start = gic_spi(51), 315b028f94bSYoshii Takashi .end = gic_spi(54), 316b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 317b028f94bSYoshii Takashi }, 318b028f94bSYoshii Takashi }; 319b028f94bSYoshii Takashi 320b028f94bSYoshii Takashi static struct resource i2c2_resources[] = { 321b028f94bSYoshii Takashi [0] = { 322b028f94bSYoshii Takashi .name = "IIC2", 323b028f94bSYoshii Takashi .start = 0xe6824000, 324b028f94bSYoshii Takashi .end = 0xe6824425 - 1, 325b028f94bSYoshii Takashi .flags = IORESOURCE_MEM, 326b028f94bSYoshii Takashi }, 327b028f94bSYoshii Takashi [1] = { 328b028f94bSYoshii Takashi .start = gic_spi(171), 329b028f94bSYoshii Takashi .end = gic_spi(174), 330b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 331b028f94bSYoshii Takashi }, 332b028f94bSYoshii Takashi }; 333b028f94bSYoshii Takashi 334b028f94bSYoshii Takashi static struct resource i2c3_resources[] = { 335b028f94bSYoshii Takashi [0] = { 336b028f94bSYoshii Takashi .name = "IIC3", 337b028f94bSYoshii Takashi .start = 0xe6826000, 338b028f94bSYoshii Takashi .end = 0xe6826425 - 1, 339b028f94bSYoshii Takashi .flags = IORESOURCE_MEM, 340b028f94bSYoshii Takashi }, 341b028f94bSYoshii Takashi [1] = { 342b028f94bSYoshii Takashi .start = gic_spi(183), 343b028f94bSYoshii Takashi .end = gic_spi(186), 344b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 345b028f94bSYoshii Takashi }, 346b028f94bSYoshii Takashi }; 347b028f94bSYoshii Takashi 348b028f94bSYoshii Takashi static struct resource i2c4_resources[] = { 349b028f94bSYoshii Takashi [0] = { 350b028f94bSYoshii Takashi .name = "IIC4", 351b028f94bSYoshii Takashi .start = 0xe6828000, 352b028f94bSYoshii Takashi .end = 0xe6828425 - 1, 353b028f94bSYoshii Takashi .flags = IORESOURCE_MEM, 354b028f94bSYoshii Takashi }, 355b028f94bSYoshii Takashi [1] = { 356b028f94bSYoshii Takashi .start = gic_spi(187), 357b028f94bSYoshii Takashi .end = gic_spi(190), 358b028f94bSYoshii Takashi .flags = IORESOURCE_IRQ, 359b028f94bSYoshii Takashi }, 360b028f94bSYoshii Takashi }; 361b028f94bSYoshii Takashi 362b028f94bSYoshii Takashi static struct platform_device i2c0_device = { 363b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 364b028f94bSYoshii Takashi .id = 0, 365b028f94bSYoshii Takashi .resource = i2c0_resources, 366b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c0_resources), 367b028f94bSYoshii Takashi }; 368b028f94bSYoshii Takashi 369b028f94bSYoshii Takashi static struct platform_device i2c1_device = { 370b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 371b028f94bSYoshii Takashi .id = 1, 372b028f94bSYoshii Takashi .resource = i2c1_resources, 373b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c1_resources), 374b028f94bSYoshii Takashi }; 375b028f94bSYoshii Takashi 376b028f94bSYoshii Takashi static struct platform_device i2c2_device = { 377b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 378b028f94bSYoshii Takashi .id = 2, 379b028f94bSYoshii Takashi .resource = i2c2_resources, 380b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c2_resources), 381b028f94bSYoshii Takashi }; 382b028f94bSYoshii Takashi 383b028f94bSYoshii Takashi static struct platform_device i2c3_device = { 384b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 385b028f94bSYoshii Takashi .id = 3, 386b028f94bSYoshii Takashi .resource = i2c3_resources, 387b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c3_resources), 388b028f94bSYoshii Takashi }; 389b028f94bSYoshii Takashi 390b028f94bSYoshii Takashi static struct platform_device i2c4_device = { 391b028f94bSYoshii Takashi .name = "i2c-sh_mobile", 392b028f94bSYoshii Takashi .id = 4, 393b028f94bSYoshii Takashi .resource = i2c4_resources, 394b028f94bSYoshii Takashi .num_resources = ARRAY_SIZE(i2c4_resources), 395b028f94bSYoshii Takashi }; 396b028f94bSYoshii Takashi 397681e1b3eSMagnus Damm /* Transmit sizes and respective CHCR register values */ 398681e1b3eSMagnus Damm enum { 399681e1b3eSMagnus Damm XMIT_SZ_8BIT = 0, 400681e1b3eSMagnus Damm XMIT_SZ_16BIT = 1, 401681e1b3eSMagnus Damm XMIT_SZ_32BIT = 2, 402681e1b3eSMagnus Damm XMIT_SZ_64BIT = 7, 403681e1b3eSMagnus Damm XMIT_SZ_128BIT = 3, 404681e1b3eSMagnus Damm XMIT_SZ_256BIT = 4, 405681e1b3eSMagnus Damm XMIT_SZ_512BIT = 5, 406681e1b3eSMagnus Damm }; 407681e1b3eSMagnus Damm 408681e1b3eSMagnus Damm /* log2(size / 8) - used to calculate number of transfers */ 409681e1b3eSMagnus Damm #define TS_SHIFT { \ 410681e1b3eSMagnus Damm [XMIT_SZ_8BIT] = 0, \ 411681e1b3eSMagnus Damm [XMIT_SZ_16BIT] = 1, \ 412681e1b3eSMagnus Damm [XMIT_SZ_32BIT] = 2, \ 413681e1b3eSMagnus Damm [XMIT_SZ_64BIT] = 3, \ 414681e1b3eSMagnus Damm [XMIT_SZ_128BIT] = 4, \ 415681e1b3eSMagnus Damm [XMIT_SZ_256BIT] = 5, \ 416681e1b3eSMagnus Damm [XMIT_SZ_512BIT] = 6, \ 417681e1b3eSMagnus Damm } 418681e1b3eSMagnus Damm 419681e1b3eSMagnus Damm #define TS_INDEX2VAL(i) ((((i) & 3) << 3) | (((i) & 0xc) << (20 - 2))) 420681e1b3eSMagnus Damm #define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz))) 421681e1b3eSMagnus Damm #define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz))) 422681e1b3eSMagnus Damm 423681e1b3eSMagnus Damm static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = { 424681e1b3eSMagnus Damm { 425681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF0_TX, 426681e1b3eSMagnus Damm .addr = 0xe6c40020, 427681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 428681e1b3eSMagnus Damm .mid_rid = 0x21, 429681e1b3eSMagnus Damm }, { 430681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF0_RX, 431681e1b3eSMagnus Damm .addr = 0xe6c40024, 432681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 433681e1b3eSMagnus Damm .mid_rid = 0x22, 434681e1b3eSMagnus Damm }, { 435681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF1_TX, 436681e1b3eSMagnus Damm .addr = 0xe6c50020, 437681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 438681e1b3eSMagnus Damm .mid_rid = 0x25, 439681e1b3eSMagnus Damm }, { 440681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF1_RX, 441681e1b3eSMagnus Damm .addr = 0xe6c50024, 442681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 443681e1b3eSMagnus Damm .mid_rid = 0x26, 444681e1b3eSMagnus Damm }, { 445681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF2_TX, 446681e1b3eSMagnus Damm .addr = 0xe6c60020, 447681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 448681e1b3eSMagnus Damm .mid_rid = 0x29, 449681e1b3eSMagnus Damm }, { 450681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF2_RX, 451681e1b3eSMagnus Damm .addr = 0xe6c60024, 452681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 453681e1b3eSMagnus Damm .mid_rid = 0x2a, 454681e1b3eSMagnus Damm }, { 455681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF3_TX, 456681e1b3eSMagnus Damm .addr = 0xe6c70020, 457681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 458681e1b3eSMagnus Damm .mid_rid = 0x2d, 459681e1b3eSMagnus Damm }, { 460681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF3_RX, 461681e1b3eSMagnus Damm .addr = 0xe6c70024, 462681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 463681e1b3eSMagnus Damm .mid_rid = 0x2e, 464681e1b3eSMagnus Damm }, { 465681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF4_TX, 466681e1b3eSMagnus Damm .addr = 0xe6c80020, 467681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 468681e1b3eSMagnus Damm .mid_rid = 0x39, 469681e1b3eSMagnus Damm }, { 470681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF4_RX, 471681e1b3eSMagnus Damm .addr = 0xe6c80024, 472681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 473681e1b3eSMagnus Damm .mid_rid = 0x3a, 474681e1b3eSMagnus Damm }, { 475681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF5_TX, 476681e1b3eSMagnus Damm .addr = 0xe6cb0020, 477681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 478681e1b3eSMagnus Damm .mid_rid = 0x35, 479681e1b3eSMagnus Damm }, { 480681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF5_RX, 481681e1b3eSMagnus Damm .addr = 0xe6cb0024, 482681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 483681e1b3eSMagnus Damm .mid_rid = 0x36, 484681e1b3eSMagnus Damm }, { 485681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF6_TX, 486681e1b3eSMagnus Damm .addr = 0xe6cc0020, 487681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 488681e1b3eSMagnus Damm .mid_rid = 0x1d, 489681e1b3eSMagnus Damm }, { 490681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF6_RX, 491681e1b3eSMagnus Damm .addr = 0xe6cc0024, 492681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 493681e1b3eSMagnus Damm .mid_rid = 0x1e, 494681e1b3eSMagnus Damm }, { 495681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF7_TX, 496681e1b3eSMagnus Damm .addr = 0xe6cd0020, 497681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 498681e1b3eSMagnus Damm .mid_rid = 0x19, 499681e1b3eSMagnus Damm }, { 500681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF7_RX, 501681e1b3eSMagnus Damm .addr = 0xe6cd0024, 502681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 503681e1b3eSMagnus Damm .mid_rid = 0x1a, 504681e1b3eSMagnus Damm }, { 505681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF8_TX, 506681e1b3eSMagnus Damm .addr = 0xe6c30040, 507681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_8BIT), 508681e1b3eSMagnus Damm .mid_rid = 0x3d, 509681e1b3eSMagnus Damm }, { 510681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SCIF8_RX, 511681e1b3eSMagnus Damm .addr = 0xe6c30060, 512681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_8BIT), 513681e1b3eSMagnus Damm .mid_rid = 0x3e, 514681e1b3eSMagnus Damm }, { 515681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI0_TX, 516681e1b3eSMagnus Damm .addr = 0xee100030, 517681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_16BIT), 518681e1b3eSMagnus Damm .mid_rid = 0xc1, 519681e1b3eSMagnus Damm }, { 520681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI0_RX, 521681e1b3eSMagnus Damm .addr = 0xee100030, 522681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_16BIT), 523681e1b3eSMagnus Damm .mid_rid = 0xc2, 524681e1b3eSMagnus Damm }, { 525681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI1_TX, 526681e1b3eSMagnus Damm .addr = 0xee120030, 527681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_16BIT), 528681e1b3eSMagnus Damm .mid_rid = 0xc9, 529681e1b3eSMagnus Damm }, { 530681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI1_RX, 531681e1b3eSMagnus Damm .addr = 0xee120030, 532681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_16BIT), 533681e1b3eSMagnus Damm .mid_rid = 0xca, 534681e1b3eSMagnus Damm }, { 535681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI2_TX, 536681e1b3eSMagnus Damm .addr = 0xee140030, 537681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_16BIT), 538681e1b3eSMagnus Damm .mid_rid = 0xcd, 539681e1b3eSMagnus Damm }, { 540681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_SDHI2_RX, 541681e1b3eSMagnus Damm .addr = 0xee140030, 542681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_16BIT), 543681e1b3eSMagnus Damm .mid_rid = 0xce, 544681e1b3eSMagnus Damm }, { 545681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_MMCIF_TX, 546681e1b3eSMagnus Damm .addr = 0xe6bd0034, 547681e1b3eSMagnus Damm .chcr = CHCR_TX(XMIT_SZ_32BIT), 548681e1b3eSMagnus Damm .mid_rid = 0xd1, 549681e1b3eSMagnus Damm }, { 550681e1b3eSMagnus Damm .slave_id = SHDMA_SLAVE_MMCIF_RX, 551681e1b3eSMagnus Damm .addr = 0xe6bd0034, 552681e1b3eSMagnus Damm .chcr = CHCR_RX(XMIT_SZ_32BIT), 553681e1b3eSMagnus Damm .mid_rid = 0xd2, 554681e1b3eSMagnus Damm }, 555681e1b3eSMagnus Damm }; 556681e1b3eSMagnus Damm 557681e1b3eSMagnus Damm #define DMAE_CHANNEL(_offset) \ 558681e1b3eSMagnus Damm { \ 559681e1b3eSMagnus Damm .offset = _offset - 0x20, \ 560681e1b3eSMagnus Damm .dmars = _offset - 0x20 + 0x40, \ 561681e1b3eSMagnus Damm } 562681e1b3eSMagnus Damm 563681e1b3eSMagnus Damm static const struct sh_dmae_channel sh73a0_dmae_channels[] = { 564681e1b3eSMagnus Damm DMAE_CHANNEL(0x8000), 565681e1b3eSMagnus Damm DMAE_CHANNEL(0x8080), 566681e1b3eSMagnus Damm DMAE_CHANNEL(0x8100), 567681e1b3eSMagnus Damm DMAE_CHANNEL(0x8180), 568681e1b3eSMagnus Damm DMAE_CHANNEL(0x8200), 569681e1b3eSMagnus Damm DMAE_CHANNEL(0x8280), 570681e1b3eSMagnus Damm DMAE_CHANNEL(0x8300), 571681e1b3eSMagnus Damm DMAE_CHANNEL(0x8380), 572681e1b3eSMagnus Damm DMAE_CHANNEL(0x8400), 573681e1b3eSMagnus Damm DMAE_CHANNEL(0x8480), 574681e1b3eSMagnus Damm DMAE_CHANNEL(0x8500), 575681e1b3eSMagnus Damm DMAE_CHANNEL(0x8580), 576681e1b3eSMagnus Damm DMAE_CHANNEL(0x8600), 577681e1b3eSMagnus Damm DMAE_CHANNEL(0x8680), 578681e1b3eSMagnus Damm DMAE_CHANNEL(0x8700), 579681e1b3eSMagnus Damm DMAE_CHANNEL(0x8780), 580681e1b3eSMagnus Damm DMAE_CHANNEL(0x8800), 581681e1b3eSMagnus Damm DMAE_CHANNEL(0x8880), 582681e1b3eSMagnus Damm DMAE_CHANNEL(0x8900), 583681e1b3eSMagnus Damm DMAE_CHANNEL(0x8980), 584681e1b3eSMagnus Damm }; 585681e1b3eSMagnus Damm 586681e1b3eSMagnus Damm static const unsigned int ts_shift[] = TS_SHIFT; 587681e1b3eSMagnus Damm 588681e1b3eSMagnus Damm static struct sh_dmae_pdata sh73a0_dmae_platform_data = { 589681e1b3eSMagnus Damm .slave = sh73a0_dmae_slaves, 590681e1b3eSMagnus Damm .slave_num = ARRAY_SIZE(sh73a0_dmae_slaves), 591681e1b3eSMagnus Damm .channel = sh73a0_dmae_channels, 592681e1b3eSMagnus Damm .channel_num = ARRAY_SIZE(sh73a0_dmae_channels), 593681e1b3eSMagnus Damm .ts_low_shift = 3, 594681e1b3eSMagnus Damm .ts_low_mask = 0x18, 595681e1b3eSMagnus Damm .ts_high_shift = (20 - 2), /* 2 bits for shifted low TS */ 596681e1b3eSMagnus Damm .ts_high_mask = 0x00300000, 597681e1b3eSMagnus Damm .ts_shift = ts_shift, 598681e1b3eSMagnus Damm .ts_shift_num = ARRAY_SIZE(ts_shift), 599681e1b3eSMagnus Damm .dmaor_init = DMAOR_DME, 600681e1b3eSMagnus Damm }; 601681e1b3eSMagnus Damm 602681e1b3eSMagnus Damm static struct resource sh73a0_dmae_resources[] = { 603681e1b3eSMagnus Damm { 604681e1b3eSMagnus Damm /* Registers including DMAOR and channels including DMARSx */ 605681e1b3eSMagnus Damm .start = 0xfe000020, 606681e1b3eSMagnus Damm .end = 0xfe008a00 - 1, 607681e1b3eSMagnus Damm .flags = IORESOURCE_MEM, 608681e1b3eSMagnus Damm }, 609681e1b3eSMagnus Damm { 61020052462SShimoda, Yoshihiro .name = "error_irq", 611681e1b3eSMagnus Damm .start = gic_spi(129), 612681e1b3eSMagnus Damm .end = gic_spi(129), 613681e1b3eSMagnus Damm .flags = IORESOURCE_IRQ, 614681e1b3eSMagnus Damm }, 615681e1b3eSMagnus Damm { 616681e1b3eSMagnus Damm /* IRQ for channels 0-19 */ 617681e1b3eSMagnus Damm .start = gic_spi(109), 618681e1b3eSMagnus Damm .end = gic_spi(128), 619681e1b3eSMagnus Damm .flags = IORESOURCE_IRQ, 620681e1b3eSMagnus Damm }, 621681e1b3eSMagnus Damm }; 622681e1b3eSMagnus Damm 623681e1b3eSMagnus Damm static struct platform_device dma0_device = { 624681e1b3eSMagnus Damm .name = "sh-dma-engine", 625681e1b3eSMagnus Damm .id = 0, 626681e1b3eSMagnus Damm .resource = sh73a0_dmae_resources, 627681e1b3eSMagnus Damm .num_resources = ARRAY_SIZE(sh73a0_dmae_resources), 628681e1b3eSMagnus Damm .dev = { 629681e1b3eSMagnus Damm .platform_data = &sh73a0_dmae_platform_data, 630681e1b3eSMagnus Damm }, 631681e1b3eSMagnus Damm }; 632681e1b3eSMagnus Damm 6336d9598e2SMagnus Damm static struct platform_device *sh73a0_early_devices[] __initdata = { 6346d9598e2SMagnus Damm &scif0_device, 6356d9598e2SMagnus Damm &scif1_device, 6366d9598e2SMagnus Damm &scif2_device, 6376d9598e2SMagnus Damm &scif3_device, 6386d9598e2SMagnus Damm &scif4_device, 6396d9598e2SMagnus Damm &scif5_device, 6406d9598e2SMagnus Damm &scif6_device, 6416d9598e2SMagnus Damm &scif7_device, 6426d9598e2SMagnus Damm &scif8_device, 6436d9598e2SMagnus Damm &cmt10_device, 6445010f3dbSMagnus Damm &tmu00_device, 6455010f3dbSMagnus Damm &tmu01_device, 6466d9598e2SMagnus Damm }; 6476d9598e2SMagnus Damm 648b028f94bSYoshii Takashi static struct platform_device *sh73a0_late_devices[] __initdata = { 649b028f94bSYoshii Takashi &i2c0_device, 650b028f94bSYoshii Takashi &i2c1_device, 651b028f94bSYoshii Takashi &i2c2_device, 652b028f94bSYoshii Takashi &i2c3_device, 653b028f94bSYoshii Takashi &i2c4_device, 654681e1b3eSMagnus Damm &dma0_device, 655b028f94bSYoshii Takashi }; 656b028f94bSYoshii Takashi 657681e1b3eSMagnus Damm #define SRCR2 0xe61580b0 658681e1b3eSMagnus Damm 6596d9598e2SMagnus Damm void __init sh73a0_add_standard_devices(void) 6606d9598e2SMagnus Damm { 661681e1b3eSMagnus Damm /* Clear software reset bit on SY-DMAC module */ 662681e1b3eSMagnus Damm __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2); 663681e1b3eSMagnus Damm 6646d9598e2SMagnus Damm platform_add_devices(sh73a0_early_devices, 6656d9598e2SMagnus Damm ARRAY_SIZE(sh73a0_early_devices)); 666b028f94bSYoshii Takashi platform_add_devices(sh73a0_late_devices, 667b028f94bSYoshii Takashi ARRAY_SIZE(sh73a0_late_devices)); 6686d9598e2SMagnus Damm } 6696d9598e2SMagnus Damm 6706d9598e2SMagnus Damm void __init sh73a0_add_early_devices(void) 6716d9598e2SMagnus Damm { 6726d9598e2SMagnus Damm early_platform_add_devices(sh73a0_early_devices, 6736d9598e2SMagnus Damm ARRAY_SIZE(sh73a0_early_devices)); 6746d9598e2SMagnus Damm } 675