1add5ca2cSKuninori Morimoto // SPDX-License-Identifier: GPL-2.0 241504c39SPaul Mundt /* 341504c39SPaul Mundt * SH7770 Setup 441504c39SPaul Mundt * 52163b4cbSPaul Mundt * Copyright (C) 2006 - 2008 Paul Mundt 641504c39SPaul Mundt */ 741504c39SPaul Mundt #include <linux/platform_device.h> 841504c39SPaul Mundt #include <linux/init.h> 941504c39SPaul Mundt #include <linux/serial.h> 1096de1a8fSPaul Mundt #include <linux/serial_sci.h> 11f251935eSMagnus Damm #include <linux/sh_timer.h> 12f454314cSPaul Mundt #include <linux/sh_intc.h> 139304d0ccSMagnus Damm #include <linux/io.h> 14507fd01dSBartosz Golaszewski #include <asm/platform_early.h> 1541504c39SPaul Mundt 16a9571d7bSMagnus Damm static struct plat_sci_port scif0_platform_data = { 17c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 1841504c39SPaul Mundt .type = PORT_SCIF, 19d850acf9SLaurent Pinchart }; 20d850acf9SLaurent Pinchart 21d850acf9SLaurent Pinchart static struct resource scif0_resources[] = { 22d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff923000, 0x100), 23d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x9a0)), 24a9571d7bSMagnus Damm }; 25a9571d7bSMagnus Damm 26a9571d7bSMagnus Damm static struct platform_device scif0_device = { 27a9571d7bSMagnus Damm .name = "sh-sci", 28a9571d7bSMagnus Damm .id = 0, 29d850acf9SLaurent Pinchart .resource = scif0_resources, 30d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif0_resources), 31a9571d7bSMagnus Damm .dev = { 32a9571d7bSMagnus Damm .platform_data = &scif0_platform_data, 33a9571d7bSMagnus Damm }, 34a9571d7bSMagnus Damm }; 35a9571d7bSMagnus Damm 36a9571d7bSMagnus Damm static struct plat_sci_port scif1_platform_data = { 37c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 3841504c39SPaul Mundt .type = PORT_SCIF, 39d850acf9SLaurent Pinchart }; 40d850acf9SLaurent Pinchart 41d850acf9SLaurent Pinchart static struct resource scif1_resources[] = { 42d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff924000, 0x100), 43d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x9c0)), 44a9571d7bSMagnus Damm }; 45a9571d7bSMagnus Damm 46a9571d7bSMagnus Damm static struct platform_device scif1_device = { 47a9571d7bSMagnus Damm .name = "sh-sci", 48a9571d7bSMagnus Damm .id = 1, 49d850acf9SLaurent Pinchart .resource = scif1_resources, 50d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif1_resources), 51a9571d7bSMagnus Damm .dev = { 52a9571d7bSMagnus Damm .platform_data = &scif1_platform_data, 53a9571d7bSMagnus Damm }, 54a9571d7bSMagnus Damm }; 55a9571d7bSMagnus Damm 56a9571d7bSMagnus Damm static struct plat_sci_port scif2_platform_data = { 57c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 5841504c39SPaul Mundt .type = PORT_SCIF, 59d850acf9SLaurent Pinchart }; 60d850acf9SLaurent Pinchart 61d850acf9SLaurent Pinchart static struct resource scif2_resources[] = { 62d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff925000, 0x100), 63d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x9e0)), 64a9571d7bSMagnus Damm }; 65a9571d7bSMagnus Damm 66a9571d7bSMagnus Damm static struct platform_device scif2_device = { 67a9571d7bSMagnus Damm .name = "sh-sci", 68a9571d7bSMagnus Damm .id = 2, 69d850acf9SLaurent Pinchart .resource = scif2_resources, 70d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif2_resources), 71a9571d7bSMagnus Damm .dev = { 72a9571d7bSMagnus Damm .platform_data = &scif2_platform_data, 73a9571d7bSMagnus Damm }, 74a9571d7bSMagnus Damm }; 75a9571d7bSMagnus Damm 76a9571d7bSMagnus Damm static struct plat_sci_port scif3_platform_data = { 77c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 782163b4cbSPaul Mundt .type = PORT_SCIF, 79d850acf9SLaurent Pinchart }; 80d850acf9SLaurent Pinchart 81d850acf9SLaurent Pinchart static struct resource scif3_resources[] = { 82d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff926000, 0x100), 83d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0xa00)), 84a9571d7bSMagnus Damm }; 85a9571d7bSMagnus Damm 86a9571d7bSMagnus Damm static struct platform_device scif3_device = { 87a9571d7bSMagnus Damm .name = "sh-sci", 88a9571d7bSMagnus Damm .id = 3, 89d850acf9SLaurent Pinchart .resource = scif3_resources, 90d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif3_resources), 91a9571d7bSMagnus Damm .dev = { 92a9571d7bSMagnus Damm .platform_data = &scif3_platform_data, 93a9571d7bSMagnus Damm }, 94a9571d7bSMagnus Damm }; 95a9571d7bSMagnus Damm 96a9571d7bSMagnus Damm static struct plat_sci_port scif4_platform_data = { 97c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 982163b4cbSPaul Mundt .type = PORT_SCIF, 99d850acf9SLaurent Pinchart }; 100d850acf9SLaurent Pinchart 101d850acf9SLaurent Pinchart static struct resource scif4_resources[] = { 102d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff927000, 0x100), 103d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0xa20)), 104a9571d7bSMagnus Damm }; 105a9571d7bSMagnus Damm 106a9571d7bSMagnus Damm static struct platform_device scif4_device = { 107a9571d7bSMagnus Damm .name = "sh-sci", 108a9571d7bSMagnus Damm .id = 4, 109d850acf9SLaurent Pinchart .resource = scif4_resources, 110d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif4_resources), 111a9571d7bSMagnus Damm .dev = { 112a9571d7bSMagnus Damm .platform_data = &scif4_platform_data, 113a9571d7bSMagnus Damm }, 114a9571d7bSMagnus Damm }; 115a9571d7bSMagnus Damm 116a9571d7bSMagnus Damm static struct plat_sci_port scif5_platform_data = { 117c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 1182163b4cbSPaul Mundt .type = PORT_SCIF, 119d850acf9SLaurent Pinchart }; 120d850acf9SLaurent Pinchart 121d850acf9SLaurent Pinchart static struct resource scif5_resources[] = { 122d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff928000, 0x100), 123d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0xa40)), 124a9571d7bSMagnus Damm }; 125a9571d7bSMagnus Damm 126a9571d7bSMagnus Damm static struct platform_device scif5_device = { 127a9571d7bSMagnus Damm .name = "sh-sci", 128a9571d7bSMagnus Damm .id = 5, 129d850acf9SLaurent Pinchart .resource = scif5_resources, 130d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif5_resources), 131a9571d7bSMagnus Damm .dev = { 132a9571d7bSMagnus Damm .platform_data = &scif5_platform_data, 133a9571d7bSMagnus Damm }, 134a9571d7bSMagnus Damm }; 135a9571d7bSMagnus Damm 136a9571d7bSMagnus Damm static struct plat_sci_port scif6_platform_data = { 137c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 1382163b4cbSPaul Mundt .type = PORT_SCIF, 139d850acf9SLaurent Pinchart }; 140d850acf9SLaurent Pinchart 141d850acf9SLaurent Pinchart static struct resource scif6_resources[] = { 142d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff929000, 0x100), 143d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0xa60)), 144a9571d7bSMagnus Damm }; 145a9571d7bSMagnus Damm 146a9571d7bSMagnus Damm static struct platform_device scif6_device = { 147a9571d7bSMagnus Damm .name = "sh-sci", 148a9571d7bSMagnus Damm .id = 6, 149d850acf9SLaurent Pinchart .resource = scif6_resources, 150d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif6_resources), 151a9571d7bSMagnus Damm .dev = { 152a9571d7bSMagnus Damm .platform_data = &scif6_platform_data, 153a9571d7bSMagnus Damm }, 154a9571d7bSMagnus Damm }; 155a9571d7bSMagnus Damm 156a9571d7bSMagnus Damm static struct plat_sci_port scif7_platform_data = { 157c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 1582163b4cbSPaul Mundt .type = PORT_SCIF, 159d850acf9SLaurent Pinchart }; 160d850acf9SLaurent Pinchart 161d850acf9SLaurent Pinchart static struct resource scif7_resources[] = { 162d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff92a000, 0x100), 163d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0xa80)), 164a9571d7bSMagnus Damm }; 165a9571d7bSMagnus Damm 166a9571d7bSMagnus Damm static struct platform_device scif7_device = { 167a9571d7bSMagnus Damm .name = "sh-sci", 168a9571d7bSMagnus Damm .id = 7, 169d850acf9SLaurent Pinchart .resource = scif7_resources, 170d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif7_resources), 171a9571d7bSMagnus Damm .dev = { 172a9571d7bSMagnus Damm .platform_data = &scif7_platform_data, 173a9571d7bSMagnus Damm }, 174a9571d7bSMagnus Damm }; 175a9571d7bSMagnus Damm 176a9571d7bSMagnus Damm static struct plat_sci_port scif8_platform_data = { 177c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 1782163b4cbSPaul Mundt .type = PORT_SCIF, 179d850acf9SLaurent Pinchart }; 180d850acf9SLaurent Pinchart 181d850acf9SLaurent Pinchart static struct resource scif8_resources[] = { 182d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff92b000, 0x100), 183d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0xaa0)), 184a9571d7bSMagnus Damm }; 185a9571d7bSMagnus Damm 186a9571d7bSMagnus Damm static struct platform_device scif8_device = { 187a9571d7bSMagnus Damm .name = "sh-sci", 188a9571d7bSMagnus Damm .id = 8, 189d850acf9SLaurent Pinchart .resource = scif8_resources, 190d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif8_resources), 191a9571d7bSMagnus Damm .dev = { 192a9571d7bSMagnus Damm .platform_data = &scif8_platform_data, 193a9571d7bSMagnus Damm }, 194a9571d7bSMagnus Damm }; 195a9571d7bSMagnus Damm 196a9571d7bSMagnus Damm static struct plat_sci_port scif9_platform_data = { 197c3fa400bSLaurent Pinchart .scscr = SCSCR_REIE | SCSCR_TOIE, 1982163b4cbSPaul Mundt .type = PORT_SCIF, 199d850acf9SLaurent Pinchart }; 200d850acf9SLaurent Pinchart 201d850acf9SLaurent Pinchart static struct resource scif9_resources[] = { 202d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xff92c000, 0x100), 203d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0xac0)), 20441504c39SPaul Mundt }; 20541504c39SPaul Mundt 206a9571d7bSMagnus Damm static struct platform_device scif9_device = { 20741504c39SPaul Mundt .name = "sh-sci", 208a9571d7bSMagnus Damm .id = 9, 209d850acf9SLaurent Pinchart .resource = scif9_resources, 210d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif9_resources), 21141504c39SPaul Mundt .dev = { 212a9571d7bSMagnus Damm .platform_data = &scif9_platform_data, 21341504c39SPaul Mundt }, 21441504c39SPaul Mundt }; 21541504c39SPaul Mundt 216f251935eSMagnus Damm static struct sh_timer_config tmu0_platform_data = { 2171399c195SLaurent Pinchart .channels_mask = 7, 218f251935eSMagnus Damm }; 219f251935eSMagnus Damm 220f251935eSMagnus Damm static struct resource tmu0_resources[] = { 2211399c195SLaurent Pinchart DEFINE_RES_MEM(0xffd80000, 0x30), 2221399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x400)), 2231399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x420)), 2241399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x440)), 225f251935eSMagnus Damm }; 226f251935eSMagnus Damm 227f251935eSMagnus Damm static struct platform_device tmu0_device = { 2281399c195SLaurent Pinchart .name = "sh-tmu", 229f251935eSMagnus Damm .id = 0, 230f251935eSMagnus Damm .dev = { 231f251935eSMagnus Damm .platform_data = &tmu0_platform_data, 232f251935eSMagnus Damm }, 233f251935eSMagnus Damm .resource = tmu0_resources, 234f251935eSMagnus Damm .num_resources = ARRAY_SIZE(tmu0_resources), 235f251935eSMagnus Damm }; 236f251935eSMagnus Damm 237f251935eSMagnus Damm static struct sh_timer_config tmu1_platform_data = { 2381399c195SLaurent Pinchart .channels_mask = 7, 239f251935eSMagnus Damm }; 240f251935eSMagnus Damm 241f251935eSMagnus Damm static struct resource tmu1_resources[] = { 2421399c195SLaurent Pinchart DEFINE_RES_MEM(0xffd81000, 0x30), 2431399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x460)), 2441399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x480)), 2451399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x4a0)), 246f251935eSMagnus Damm }; 247f251935eSMagnus Damm 248f251935eSMagnus Damm static struct platform_device tmu1_device = { 2491399c195SLaurent Pinchart .name = "sh-tmu", 250f251935eSMagnus Damm .id = 1, 251f251935eSMagnus Damm .dev = { 252f251935eSMagnus Damm .platform_data = &tmu1_platform_data, 253f251935eSMagnus Damm }, 254f251935eSMagnus Damm .resource = tmu1_resources, 255f251935eSMagnus Damm .num_resources = ARRAY_SIZE(tmu1_resources), 256f251935eSMagnus Damm }; 257f251935eSMagnus Damm 258f251935eSMagnus Damm static struct sh_timer_config tmu2_platform_data = { 2591399c195SLaurent Pinchart .channels_mask = 7, 260f251935eSMagnus Damm }; 261f251935eSMagnus Damm 262f251935eSMagnus Damm static struct resource tmu2_resources[] = { 2631399c195SLaurent Pinchart DEFINE_RES_MEM(0xffd82000, 0x2c), 2641399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x4c0)), 2651399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x4e0)), 2661399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x500)), 267f251935eSMagnus Damm }; 268f251935eSMagnus Damm 269f251935eSMagnus Damm static struct platform_device tmu2_device = { 2701399c195SLaurent Pinchart .name = "sh-tmu", 271f251935eSMagnus Damm .id = 2, 272f251935eSMagnus Damm .dev = { 273f251935eSMagnus Damm .platform_data = &tmu2_platform_data, 274f251935eSMagnus Damm }, 275f251935eSMagnus Damm .resource = tmu2_resources, 276f251935eSMagnus Damm .num_resources = ARRAY_SIZE(tmu2_resources), 277f251935eSMagnus Damm }; 278f251935eSMagnus Damm 27941504c39SPaul Mundt static struct platform_device *sh7770_devices[] __initdata = { 280a9571d7bSMagnus Damm &scif0_device, 281a9571d7bSMagnus Damm &scif1_device, 282a9571d7bSMagnus Damm &scif2_device, 283a9571d7bSMagnus Damm &scif3_device, 284a9571d7bSMagnus Damm &scif4_device, 285a9571d7bSMagnus Damm &scif5_device, 286a9571d7bSMagnus Damm &scif6_device, 287a9571d7bSMagnus Damm &scif7_device, 288a9571d7bSMagnus Damm &scif8_device, 289a9571d7bSMagnus Damm &scif9_device, 290f251935eSMagnus Damm &tmu0_device, 291f251935eSMagnus Damm &tmu1_device, 292f251935eSMagnus Damm &tmu2_device, 29341504c39SPaul Mundt }; 29441504c39SPaul Mundt 29541504c39SPaul Mundt static int __init sh7770_devices_setup(void) 29641504c39SPaul Mundt { 29741504c39SPaul Mundt return platform_add_devices(sh7770_devices, 29841504c39SPaul Mundt ARRAY_SIZE(sh7770_devices)); 29941504c39SPaul Mundt } 300ba9a6337SMagnus Damm arch_initcall(sh7770_devices_setup); 30135f3abe9SPaul Mundt 302f251935eSMagnus Damm static struct platform_device *sh7770_early_devices[] __initdata = { 303a9571d7bSMagnus Damm &scif0_device, 304a9571d7bSMagnus Damm &scif1_device, 305a9571d7bSMagnus Damm &scif2_device, 306a9571d7bSMagnus Damm &scif3_device, 307a9571d7bSMagnus Damm &scif4_device, 308a9571d7bSMagnus Damm &scif5_device, 309a9571d7bSMagnus Damm &scif6_device, 310a9571d7bSMagnus Damm &scif7_device, 311a9571d7bSMagnus Damm &scif8_device, 312a9571d7bSMagnus Damm &scif9_device, 313f251935eSMagnus Damm &tmu0_device, 314f251935eSMagnus Damm &tmu1_device, 315f251935eSMagnus Damm &tmu2_device, 316f251935eSMagnus Damm }; 317f251935eSMagnus Damm 318f251935eSMagnus Damm void __init plat_early_device_setup(void) 319f251935eSMagnus Damm { 320f251935eSMagnus Damm early_platform_add_devices(sh7770_early_devices, 321f251935eSMagnus Damm ARRAY_SIZE(sh7770_early_devices)); 322f251935eSMagnus Damm } 323f251935eSMagnus Damm 3249304d0ccSMagnus Damm enum { 3259304d0ccSMagnus Damm UNUSED = 0, 3269304d0ccSMagnus Damm 3279304d0ccSMagnus Damm /* interrupt sources */ 3289304d0ccSMagnus Damm IRL_LLLL, IRL_LLLH, IRL_LLHL, IRL_LLHH, 3299304d0ccSMagnus Damm IRL_LHLL, IRL_LHLH, IRL_LHHL, IRL_LHHH, 3309304d0ccSMagnus Damm IRL_HLLL, IRL_HLLH, IRL_HLHL, IRL_HLHH, 3319304d0ccSMagnus Damm IRL_HHLL, IRL_HHLH, IRL_HHHL, 3329304d0ccSMagnus Damm 3339304d0ccSMagnus Damm IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, 3349304d0ccSMagnus Damm 3359304d0ccSMagnus Damm GPIO, 3369304d0ccSMagnus Damm TMU0, TMU1, TMU2, TMU2_TICPI, 3379304d0ccSMagnus Damm TMU3, TMU4, TMU5, TMU5_TICPI, 3389304d0ccSMagnus Damm TMU6, TMU7, TMU8, 3399304d0ccSMagnus Damm HAC, IPI, SPDIF, HUDI, I2C, 3409304d0ccSMagnus Damm DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, 3419304d0ccSMagnus Damm I2S0, I2S1, I2S2, I2S3, 3429304d0ccSMagnus Damm SRC_RX, SRC_TX, SRC_SPDIF, 3439304d0ccSMagnus Damm DU, VIDEO_IN, REMOTE, YUV, USB, ATAPI, CAN, GPS, GFX2D, 3449304d0ccSMagnus Damm GFX3D_MBX, GFX3D_DMAC, 3459304d0ccSMagnus Damm EXBUS_ATA, 3469304d0ccSMagnus Damm SPI0, SPI1, 3479304d0ccSMagnus Damm SCIF089, SCIF1234, SCIF567, 3489304d0ccSMagnus Damm ADC, 3499304d0ccSMagnus Damm BBDMAC_0_3, BBDMAC_4_7, BBDMAC_8_10, BBDMAC_11_14, 3509304d0ccSMagnus Damm BBDMAC_15_18, BBDMAC_19_22, BBDMAC_23_26, BBDMAC_27, 3519304d0ccSMagnus Damm BBDMAC_28, BBDMAC_29, BBDMAC_30, BBDMAC_31, 3529304d0ccSMagnus Damm 3539304d0ccSMagnus Damm /* interrupt groups */ 3549304d0ccSMagnus Damm TMU, DMAC, I2S, SRC, GFX3D, SPI, SCIF, BBDMAC, 3559304d0ccSMagnus Damm }; 3569304d0ccSMagnus Damm 3579304d0ccSMagnus Damm static struct intc_vect vectors[] __initdata = { 3589304d0ccSMagnus Damm INTC_VECT(GPIO, 0x3e0), 3599304d0ccSMagnus Damm INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), 3609304d0ccSMagnus Damm INTC_VECT(TMU2, 0x440), INTC_VECT(TMU2_TICPI, 0x460), 3619304d0ccSMagnus Damm INTC_VECT(TMU3, 0x480), INTC_VECT(TMU4, 0x4a0), 3629304d0ccSMagnus Damm INTC_VECT(TMU5, 0x4c0), INTC_VECT(TMU5_TICPI, 0x4e0), 3639304d0ccSMagnus Damm INTC_VECT(TMU6, 0x500), INTC_VECT(TMU7, 0x520), 3649304d0ccSMagnus Damm INTC_VECT(TMU8, 0x540), 3659304d0ccSMagnus Damm INTC_VECT(HAC, 0x580), INTC_VECT(IPI, 0x5c0), 3669304d0ccSMagnus Damm INTC_VECT(SPDIF, 0x5e0), 3679304d0ccSMagnus Damm INTC_VECT(HUDI, 0x600), INTC_VECT(I2C, 0x620), 3689304d0ccSMagnus Damm INTC_VECT(DMAC0_DMINT0, 0x640), INTC_VECT(DMAC0_DMINT1, 0x660), 3699304d0ccSMagnus Damm INTC_VECT(DMAC0_DMINT2, 0x680), 3709304d0ccSMagnus Damm INTC_VECT(I2S0, 0x6a0), INTC_VECT(I2S1, 0x6c0), 3719304d0ccSMagnus Damm INTC_VECT(I2S2, 0x6e0), INTC_VECT(I2S3, 0x700), 3729304d0ccSMagnus Damm INTC_VECT(SRC_RX, 0x720), INTC_VECT(SRC_TX, 0x740), 3739304d0ccSMagnus Damm INTC_VECT(SRC_SPDIF, 0x760), 3749304d0ccSMagnus Damm INTC_VECT(DU, 0x780), INTC_VECT(VIDEO_IN, 0x7a0), 3759304d0ccSMagnus Damm INTC_VECT(REMOTE, 0x7c0), INTC_VECT(YUV, 0x7e0), 3769304d0ccSMagnus Damm INTC_VECT(USB, 0x840), INTC_VECT(ATAPI, 0x860), 3779304d0ccSMagnus Damm INTC_VECT(CAN, 0x880), INTC_VECT(GPS, 0x8a0), 3789304d0ccSMagnus Damm INTC_VECT(GFX2D, 0x8c0), 3799304d0ccSMagnus Damm INTC_VECT(GFX3D_MBX, 0x900), INTC_VECT(GFX3D_DMAC, 0x920), 3809304d0ccSMagnus Damm INTC_VECT(EXBUS_ATA, 0x940), 3819304d0ccSMagnus Damm INTC_VECT(SPI0, 0x960), INTC_VECT(SPI1, 0x980), 3829304d0ccSMagnus Damm INTC_VECT(SCIF089, 0x9a0), INTC_VECT(SCIF1234, 0x9c0), 3839304d0ccSMagnus Damm INTC_VECT(SCIF1234, 0x9e0), INTC_VECT(SCIF1234, 0xa00), 3849304d0ccSMagnus Damm INTC_VECT(SCIF1234, 0xa20), INTC_VECT(SCIF567, 0xa40), 3859304d0ccSMagnus Damm INTC_VECT(SCIF567, 0xa60), INTC_VECT(SCIF567, 0xa80), 3869304d0ccSMagnus Damm INTC_VECT(SCIF089, 0xaa0), INTC_VECT(SCIF089, 0xac0), 3879304d0ccSMagnus Damm INTC_VECT(ADC, 0xb20), 3889304d0ccSMagnus Damm INTC_VECT(BBDMAC_0_3, 0xba0), INTC_VECT(BBDMAC_0_3, 0xbc0), 3899304d0ccSMagnus Damm INTC_VECT(BBDMAC_0_3, 0xbe0), INTC_VECT(BBDMAC_0_3, 0xc00), 3909304d0ccSMagnus Damm INTC_VECT(BBDMAC_4_7, 0xc20), INTC_VECT(BBDMAC_4_7, 0xc40), 3919304d0ccSMagnus Damm INTC_VECT(BBDMAC_4_7, 0xc60), INTC_VECT(BBDMAC_4_7, 0xc80), 3929304d0ccSMagnus Damm INTC_VECT(BBDMAC_8_10, 0xca0), INTC_VECT(BBDMAC_8_10, 0xcc0), 3939304d0ccSMagnus Damm INTC_VECT(BBDMAC_8_10, 0xce0), INTC_VECT(BBDMAC_11_14, 0xd00), 3949304d0ccSMagnus Damm INTC_VECT(BBDMAC_11_14, 0xd20), INTC_VECT(BBDMAC_11_14, 0xd40), 3959304d0ccSMagnus Damm INTC_VECT(BBDMAC_11_14, 0xd60), INTC_VECT(BBDMAC_15_18, 0xd80), 3969304d0ccSMagnus Damm INTC_VECT(BBDMAC_15_18, 0xda0), INTC_VECT(BBDMAC_15_18, 0xdc0), 3979304d0ccSMagnus Damm INTC_VECT(BBDMAC_15_18, 0xde0), INTC_VECT(BBDMAC_19_22, 0xe00), 3989304d0ccSMagnus Damm INTC_VECT(BBDMAC_19_22, 0xe20), INTC_VECT(BBDMAC_19_22, 0xe40), 3999304d0ccSMagnus Damm INTC_VECT(BBDMAC_19_22, 0xe60), INTC_VECT(BBDMAC_23_26, 0xe80), 4009304d0ccSMagnus Damm INTC_VECT(BBDMAC_23_26, 0xea0), INTC_VECT(BBDMAC_23_26, 0xec0), 4019304d0ccSMagnus Damm INTC_VECT(BBDMAC_23_26, 0xee0), INTC_VECT(BBDMAC_27, 0xf00), 4029304d0ccSMagnus Damm INTC_VECT(BBDMAC_28, 0xf20), INTC_VECT(BBDMAC_29, 0xf40), 4039304d0ccSMagnus Damm INTC_VECT(BBDMAC_30, 0xf60), INTC_VECT(BBDMAC_31, 0xf80), 4049304d0ccSMagnus Damm }; 4059304d0ccSMagnus Damm 4069304d0ccSMagnus Damm static struct intc_group groups[] __initdata = { 4079304d0ccSMagnus Damm INTC_GROUP(TMU, TMU0, TMU1, TMU2, TMU2_TICPI, TMU3, TMU4, TMU5, 4089304d0ccSMagnus Damm TMU5_TICPI, TMU6, TMU7, TMU8), 4099304d0ccSMagnus Damm INTC_GROUP(DMAC, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2), 4109304d0ccSMagnus Damm INTC_GROUP(I2S, I2S0, I2S1, I2S2, I2S3), 4119304d0ccSMagnus Damm INTC_GROUP(SRC, SRC_RX, SRC_TX, SRC_SPDIF), 4129304d0ccSMagnus Damm INTC_GROUP(GFX3D, GFX3D_MBX, GFX3D_DMAC), 4139304d0ccSMagnus Damm INTC_GROUP(SPI, SPI0, SPI1), 4149304d0ccSMagnus Damm INTC_GROUP(SCIF, SCIF089, SCIF1234, SCIF567), 4159304d0ccSMagnus Damm INTC_GROUP(BBDMAC, 4169304d0ccSMagnus Damm BBDMAC_0_3, BBDMAC_4_7, BBDMAC_8_10, BBDMAC_11_14, 4179304d0ccSMagnus Damm BBDMAC_15_18, BBDMAC_19_22, BBDMAC_23_26, BBDMAC_27, 4189304d0ccSMagnus Damm BBDMAC_28, BBDMAC_29, BBDMAC_30, BBDMAC_31), 4199304d0ccSMagnus Damm }; 4209304d0ccSMagnus Damm 4219304d0ccSMagnus Damm static struct intc_mask_reg mask_registers[] __initdata = { 4229304d0ccSMagnus Damm { 0xffe00040, 0xffe00044, 32, /* INT2MSKR / INT2MSKCR */ 4239304d0ccSMagnus Damm { 0, BBDMAC, ADC, SCIF, SPI, EXBUS_ATA, GFX3D, GFX2D, 4249304d0ccSMagnus Damm GPS, CAN, ATAPI, USB, YUV, REMOTE, VIDEO_IN, DU, SRC, I2S, 4259304d0ccSMagnus Damm DMAC, I2C, HUDI, SPDIF, IPI, HAC, TMU, GPIO } }, 4269304d0ccSMagnus Damm }; 4279304d0ccSMagnus Damm 4289304d0ccSMagnus Damm static struct intc_prio_reg prio_registers[] __initdata = { 4299304d0ccSMagnus Damm { 0xffe00000, 0, 32, 8, /* INT2PRI0 */ { GPIO, TMU0, 0, HAC } }, 4309304d0ccSMagnus Damm { 0xffe00004, 0, 32, 8, /* INT2PRI1 */ { IPI, SPDIF, HUDI, I2C } }, 4319304d0ccSMagnus Damm { 0xffe00008, 0, 32, 8, /* INT2PRI2 */ { DMAC, I2S, SRC, DU } }, 4329304d0ccSMagnus Damm { 0xffe0000c, 0, 32, 8, /* INT2PRI3 */ { VIDEO_IN, REMOTE, YUV, USB } }, 4339304d0ccSMagnus Damm { 0xffe00010, 0, 32, 8, /* INT2PRI4 */ { ATAPI, CAN, GPS, GFX2D } }, 4349304d0ccSMagnus Damm { 0xffe00014, 0, 32, 8, /* INT2PRI5 */ { 0, GFX3D, EXBUS_ATA, SPI } }, 4359304d0ccSMagnus Damm { 0xffe00018, 0, 32, 8, /* INT2PRI6 */ { SCIF1234, SCIF567, SCIF089 } }, 4369304d0ccSMagnus Damm { 0xffe0001c, 0, 32, 8, /* INT2PRI7 */ { ADC, 0, 0, BBDMAC_0_3 } }, 4379304d0ccSMagnus Damm { 0xffe00020, 0, 32, 8, /* INT2PRI8 */ 4389304d0ccSMagnus Damm { BBDMAC_4_7, BBDMAC_8_10, BBDMAC_11_14, BBDMAC_15_18 } }, 4399304d0ccSMagnus Damm { 0xffe00024, 0, 32, 8, /* INT2PRI9 */ 4409304d0ccSMagnus Damm { BBDMAC_19_22, BBDMAC_23_26, BBDMAC_27, BBDMAC_28 } }, 4419304d0ccSMagnus Damm { 0xffe00028, 0, 32, 8, /* INT2PRI10 */ 4429304d0ccSMagnus Damm { BBDMAC_29, BBDMAC_30, BBDMAC_31 } }, 4439304d0ccSMagnus Damm { 0xffe0002c, 0, 32, 8, /* INT2PRI11 */ 4449304d0ccSMagnus Damm { TMU1, TMU2, TMU2_TICPI, TMU3 } }, 4459304d0ccSMagnus Damm { 0xffe00030, 0, 32, 8, /* INT2PRI12 */ 4469304d0ccSMagnus Damm { TMU4, TMU5, TMU5_TICPI, TMU6 } }, 4479304d0ccSMagnus Damm { 0xffe00034, 0, 32, 8, /* INT2PRI13 */ 4489304d0ccSMagnus Damm { TMU7, TMU8 } }, 4499304d0ccSMagnus Damm }; 4509304d0ccSMagnus Damm 4519304d0ccSMagnus Damm static DECLARE_INTC_DESC(intc_desc, "sh7770", vectors, groups, 4529304d0ccSMagnus Damm mask_registers, prio_registers, NULL); 4539304d0ccSMagnus Damm 4549304d0ccSMagnus Damm /* Support for external interrupt pins in IRQ mode */ 4559304d0ccSMagnus Damm static struct intc_vect irq_vectors[] __initdata = { 4569304d0ccSMagnus Damm INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280), 4579304d0ccSMagnus Damm INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300), 4589304d0ccSMagnus Damm INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380), 4599304d0ccSMagnus Damm }; 4609304d0ccSMagnus Damm 4619304d0ccSMagnus Damm static struct intc_mask_reg irq_mask_registers[] __initdata = { 4629304d0ccSMagnus Damm { 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */ 4639304d0ccSMagnus Damm { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, } }, 4649304d0ccSMagnus Damm }; 4659304d0ccSMagnus Damm 4669304d0ccSMagnus Damm static struct intc_prio_reg irq_prio_registers[] __initdata = { 4679304d0ccSMagnus Damm { 0xffd00010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3, 4689304d0ccSMagnus Damm IRQ4, IRQ5, } }, 4699304d0ccSMagnus Damm }; 4709304d0ccSMagnus Damm 4719304d0ccSMagnus Damm static struct intc_sense_reg irq_sense_registers[] __initdata = { 4729304d0ccSMagnus Damm { 0xffd0001c, 32, 2, /* ICR1 */ { IRQ0, IRQ1, IRQ2, IRQ3, 4739304d0ccSMagnus Damm IRQ4, IRQ5, } }, 4749304d0ccSMagnus Damm }; 4759304d0ccSMagnus Damm 4769304d0ccSMagnus Damm static DECLARE_INTC_DESC(intc_irq_desc, "sh7770-irq", irq_vectors, 4779304d0ccSMagnus Damm NULL, irq_mask_registers, irq_prio_registers, 4789304d0ccSMagnus Damm irq_sense_registers); 4799304d0ccSMagnus Damm 4809304d0ccSMagnus Damm /* External interrupt pins in IRL mode */ 4819304d0ccSMagnus Damm static struct intc_vect irl_vectors[] __initdata = { 4829304d0ccSMagnus Damm INTC_VECT(IRL_LLLL, 0x200), INTC_VECT(IRL_LLLH, 0x220), 4839304d0ccSMagnus Damm INTC_VECT(IRL_LLHL, 0x240), INTC_VECT(IRL_LLHH, 0x260), 4849304d0ccSMagnus Damm INTC_VECT(IRL_LHLL, 0x280), INTC_VECT(IRL_LHLH, 0x2a0), 4859304d0ccSMagnus Damm INTC_VECT(IRL_LHHL, 0x2c0), INTC_VECT(IRL_LHHH, 0x2e0), 4869304d0ccSMagnus Damm INTC_VECT(IRL_HLLL, 0x300), INTC_VECT(IRL_HLLH, 0x320), 4879304d0ccSMagnus Damm INTC_VECT(IRL_HLHL, 0x340), INTC_VECT(IRL_HLHH, 0x360), 4889304d0ccSMagnus Damm INTC_VECT(IRL_HHLL, 0x380), INTC_VECT(IRL_HHLH, 0x3a0), 4899304d0ccSMagnus Damm INTC_VECT(IRL_HHHL, 0x3c0), 4909304d0ccSMagnus Damm }; 4919304d0ccSMagnus Damm 4929304d0ccSMagnus Damm static struct intc_mask_reg irl3210_mask_registers[] __initdata = { 4939304d0ccSMagnus Damm { 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */ 4949304d0ccSMagnus Damm { IRL_LLLL, IRL_LLLH, IRL_LLHL, IRL_LLHH, 4959304d0ccSMagnus Damm IRL_LHLL, IRL_LHLH, IRL_LHHL, IRL_LHHH, 4969304d0ccSMagnus Damm IRL_HLLL, IRL_HLLH, IRL_HLHL, IRL_HLHH, 4979304d0ccSMagnus Damm IRL_HHLL, IRL_HHLH, IRL_HHHL, } }, 4989304d0ccSMagnus Damm }; 4999304d0ccSMagnus Damm 5009304d0ccSMagnus Damm static struct intc_mask_reg irl7654_mask_registers[] __initdata = { 5019304d0ccSMagnus Damm { 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */ 5029304d0ccSMagnus Damm { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5039304d0ccSMagnus Damm IRL_LLLL, IRL_LLLH, IRL_LLHL, IRL_LLHH, 5049304d0ccSMagnus Damm IRL_LHLL, IRL_LHLH, IRL_LHHL, IRL_LHHH, 5059304d0ccSMagnus Damm IRL_HLLL, IRL_HLLH, IRL_HLHL, IRL_HLHH, 5069304d0ccSMagnus Damm IRL_HHLL, IRL_HHLH, IRL_HHHL, } }, 5079304d0ccSMagnus Damm }; 5089304d0ccSMagnus Damm 5099304d0ccSMagnus Damm static DECLARE_INTC_DESC(intc_irl7654_desc, "sh7780-irl7654", irl_vectors, 5109304d0ccSMagnus Damm NULL, irl7654_mask_registers, NULL, NULL); 5119304d0ccSMagnus Damm 5129304d0ccSMagnus Damm static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7780-irl3210", irl_vectors, 5139304d0ccSMagnus Damm NULL, irl3210_mask_registers, NULL, NULL); 5149304d0ccSMagnus Damm 5159304d0ccSMagnus Damm #define INTC_ICR0 0xffd00000 5169304d0ccSMagnus Damm #define INTC_INTMSK0 0xffd00044 5179304d0ccSMagnus Damm #define INTC_INTMSK1 0xffd00048 5189304d0ccSMagnus Damm #define INTC_INTMSK2 0xffd40080 5199304d0ccSMagnus Damm #define INTC_INTMSKCLR1 0xffd00068 5209304d0ccSMagnus Damm #define INTC_INTMSKCLR2 0xffd40084 5219304d0ccSMagnus Damm 52235f3abe9SPaul Mundt void __init plat_irq_setup(void) 52335f3abe9SPaul Mundt { 5249304d0ccSMagnus Damm /* disable IRQ7-0 */ 5259d56dd3bSPaul Mundt __raw_writel(0xff000000, INTC_INTMSK0); 5269304d0ccSMagnus Damm 5279304d0ccSMagnus Damm /* disable IRL3-0 + IRL7-4 */ 5289d56dd3bSPaul Mundt __raw_writel(0xc0000000, INTC_INTMSK1); 5299d56dd3bSPaul Mundt __raw_writel(0xfffefffe, INTC_INTMSK2); 5309304d0ccSMagnus Damm 5319304d0ccSMagnus Damm /* select IRL mode for IRL3-0 + IRL7-4 */ 5329d56dd3bSPaul Mundt __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); 5339304d0ccSMagnus Damm 5349304d0ccSMagnus Damm /* disable holding function, ie enable "SH-4 Mode" */ 5359d56dd3bSPaul Mundt __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0); 5369304d0ccSMagnus Damm 5379304d0ccSMagnus Damm register_intc_controller(&intc_desc); 5389304d0ccSMagnus Damm } 5399304d0ccSMagnus Damm 5409304d0ccSMagnus Damm void __init plat_irq_setup_pins(int mode) 5419304d0ccSMagnus Damm { 5429304d0ccSMagnus Damm switch (mode) { 5439304d0ccSMagnus Damm case IRQ_MODE_IRQ: 5449304d0ccSMagnus Damm /* select IRQ mode for IRL3-0 + IRL7-4 */ 5459d56dd3bSPaul Mundt __raw_writel(__raw_readl(INTC_ICR0) | 0x00c00000, INTC_ICR0); 5469304d0ccSMagnus Damm register_intc_controller(&intc_irq_desc); 5479304d0ccSMagnus Damm break; 5489304d0ccSMagnus Damm case IRQ_MODE_IRL7654: 5499304d0ccSMagnus Damm /* enable IRL7-4 but don't provide any masking */ 5509d56dd3bSPaul Mundt __raw_writel(0x40000000, INTC_INTMSKCLR1); 5519d56dd3bSPaul Mundt __raw_writel(0x0000fffe, INTC_INTMSKCLR2); 5529304d0ccSMagnus Damm break; 5539304d0ccSMagnus Damm case IRQ_MODE_IRL3210: 5549304d0ccSMagnus Damm /* enable IRL0-3 but don't provide any masking */ 5559d56dd3bSPaul Mundt __raw_writel(0x80000000, INTC_INTMSKCLR1); 5569d56dd3bSPaul Mundt __raw_writel(0xfffe0000, INTC_INTMSKCLR2); 5579304d0ccSMagnus Damm break; 5589304d0ccSMagnus Damm case IRQ_MODE_IRL7654_MASK: 5599304d0ccSMagnus Damm /* enable IRL7-4 and mask using cpu intc controller */ 5609d56dd3bSPaul Mundt __raw_writel(0x40000000, INTC_INTMSKCLR1); 5619304d0ccSMagnus Damm register_intc_controller(&intc_irl7654_desc); 5629304d0ccSMagnus Damm break; 5639304d0ccSMagnus Damm case IRQ_MODE_IRL3210_MASK: 5649304d0ccSMagnus Damm /* enable IRL0-3 and mask using cpu intc controller */ 5659d56dd3bSPaul Mundt __raw_writel(0x80000000, INTC_INTMSKCLR1); 5669304d0ccSMagnus Damm register_intc_controller(&intc_irl3210_desc); 5679304d0ccSMagnus Damm break; 5689304d0ccSMagnus Damm default: 5699304d0ccSMagnus Damm BUG(); 5709304d0ccSMagnus Damm } 57135f3abe9SPaul Mundt } 572