19d4436a6SYoshinori Sato /* 29d4436a6SYoshinori Sato * SH7619 Setup 39d4436a6SYoshinori Sato * 49d4436a6SYoshinori Sato * Copyright (C) 2006 Yoshinori Sato 59d4436a6SYoshinori Sato * 69d4436a6SYoshinori Sato * This file is subject to the terms and conditions of the GNU General Public 79d4436a6SYoshinori Sato * License. See the file "COPYING" in the main directory of this archive 89d4436a6SYoshinori Sato * for more details. 99d4436a6SYoshinori Sato */ 109d4436a6SYoshinori Sato #include <linux/platform_device.h> 119d4436a6SYoshinori Sato #include <linux/init.h> 129d4436a6SYoshinori Sato #include <linux/serial.h> 139d4436a6SYoshinori Sato #include <asm/sci.h> 149d4436a6SYoshinori Sato 15*0dc3fc04SMagnus Damm enum { 16*0dc3fc04SMagnus Damm UNUSED = 0, 17*0dc3fc04SMagnus Damm 18*0dc3fc04SMagnus Damm /* interrupt sources */ 19*0dc3fc04SMagnus Damm IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, 20*0dc3fc04SMagnus Damm WDT, EDMAC, CMT0, CMT1, 21*0dc3fc04SMagnus Damm SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI, 22*0dc3fc04SMagnus Damm SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI, 23*0dc3fc04SMagnus Damm SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI, 24*0dc3fc04SMagnus Damm HIF_HIFI, HIF_HIFBI, 25*0dc3fc04SMagnus Damm DMAC0, DMAC1, DMAC2, DMAC3, 26*0dc3fc04SMagnus Damm SIOF, 27*0dc3fc04SMagnus Damm 28*0dc3fc04SMagnus Damm /* interrupt groups */ 29*0dc3fc04SMagnus Damm SCIF0, SCIF1, SCIF2, 30*0dc3fc04SMagnus Damm }; 31*0dc3fc04SMagnus Damm 32*0dc3fc04SMagnus Damm static struct intc_vect vectors[] __initdata = { 33*0dc3fc04SMagnus Damm INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65), 34*0dc3fc04SMagnus Damm INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67), 35*0dc3fc04SMagnus Damm INTC_IRQ(IRQ4, 80), INTC_IRQ(IRQ5, 81), 36*0dc3fc04SMagnus Damm INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83), 37*0dc3fc04SMagnus Damm INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85), 38*0dc3fc04SMagnus Damm INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87), 39*0dc3fc04SMagnus Damm INTC_IRQ(SCIF0_ERI, 88), INTC_IRQ(SCIF0_RXI, 89), 40*0dc3fc04SMagnus Damm INTC_IRQ(SCIF0_BRI, 90), INTC_IRQ(SCIF0_TXI, 91), 41*0dc3fc04SMagnus Damm INTC_IRQ(SCIF1_ERI, 92), INTC_IRQ(SCIF1_RXI, 93), 42*0dc3fc04SMagnus Damm INTC_IRQ(SCIF1_BRI, 94), INTC_IRQ(SCIF1_TXI, 95), 43*0dc3fc04SMagnus Damm INTC_IRQ(SCIF2_ERI, 96), INTC_IRQ(SCIF2_RXI, 97), 44*0dc3fc04SMagnus Damm INTC_IRQ(SCIF2_BRI, 98), INTC_IRQ(SCIF2_TXI, 99), 45*0dc3fc04SMagnus Damm INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101), 46*0dc3fc04SMagnus Damm INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105), 47*0dc3fc04SMagnus Damm INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107), 48*0dc3fc04SMagnus Damm INTC_IRQ(SIOF, 108), 49*0dc3fc04SMagnus Damm }; 50*0dc3fc04SMagnus Damm 51*0dc3fc04SMagnus Damm static struct intc_group groups[] __initdata = { 52*0dc3fc04SMagnus Damm INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), 53*0dc3fc04SMagnus Damm INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), 54*0dc3fc04SMagnus Damm INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI), 55*0dc3fc04SMagnus Damm }; 56*0dc3fc04SMagnus Damm 57*0dc3fc04SMagnus Damm static struct intc_prio_reg prio_registers[] __initdata = { 58*0dc3fc04SMagnus Damm { 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } }, 59*0dc3fc04SMagnus Damm { 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } }, 60*0dc3fc04SMagnus Damm { 0xf8080000, 0, 16, 4, /* IPRC */ { WDT, EDMAC, CMT0, CMT1 } }, 61*0dc3fc04SMagnus Damm { 0xf8080002, 0, 16, 4, /* IPRD */ { SCIF0, SCIF1, SCIF2 } }, 62*0dc3fc04SMagnus Damm { 0xf8080004, 0, 16, 4, /* IPRE */ { HIF_HIFI, HIF_HIFBI } }, 63*0dc3fc04SMagnus Damm { 0xf8080006, 0, 16, 4, /* IPRF */ { DMAC0, DMAC1, DMAC2, DMAC3 } }, 64*0dc3fc04SMagnus Damm { 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } }, 65*0dc3fc04SMagnus Damm }; 66*0dc3fc04SMagnus Damm 67*0dc3fc04SMagnus Damm static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, groups, 68*0dc3fc04SMagnus Damm NULL, NULL, prio_registers, NULL); 69*0dc3fc04SMagnus Damm 709d4436a6SYoshinori Sato static struct plat_sci_port sci_platform_data[] = { 719d4436a6SYoshinori Sato { 729d4436a6SYoshinori Sato .mapbase = 0xf8400000, 739d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 749d4436a6SYoshinori Sato .type = PORT_SCIF, 759d4436a6SYoshinori Sato .irqs = { 88, 89, 91, 90}, 769d4436a6SYoshinori Sato }, { 779d4436a6SYoshinori Sato .mapbase = 0xf8410000, 789d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 799d4436a6SYoshinori Sato .type = PORT_SCIF, 809d4436a6SYoshinori Sato .irqs = { 92, 93, 95, 94}, 819d4436a6SYoshinori Sato }, { 829d4436a6SYoshinori Sato .mapbase = 0xf8420000, 839d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 849d4436a6SYoshinori Sato .type = PORT_SCIF, 859d4436a6SYoshinori Sato .irqs = { 96, 97, 99, 98}, 869d4436a6SYoshinori Sato }, { 879d4436a6SYoshinori Sato .flags = 0, 889d4436a6SYoshinori Sato } 899d4436a6SYoshinori Sato }; 909d4436a6SYoshinori Sato 919d4436a6SYoshinori Sato static struct platform_device sci_device = { 929d4436a6SYoshinori Sato .name = "sh-sci", 939d4436a6SYoshinori Sato .id = -1, 949d4436a6SYoshinori Sato .dev = { 959d4436a6SYoshinori Sato .platform_data = sci_platform_data, 969d4436a6SYoshinori Sato }, 979d4436a6SYoshinori Sato }; 989d4436a6SYoshinori Sato 999d4436a6SYoshinori Sato static struct platform_device *sh7619_devices[] __initdata = { 1009d4436a6SYoshinori Sato &sci_device, 1019d4436a6SYoshinori Sato }; 1029d4436a6SYoshinori Sato 1039d4436a6SYoshinori Sato static int __init sh7619_devices_setup(void) 1049d4436a6SYoshinori Sato { 1059d4436a6SYoshinori Sato return platform_add_devices(sh7619_devices, 1069d4436a6SYoshinori Sato ARRAY_SIZE(sh7619_devices)); 1079d4436a6SYoshinori Sato } 1089d4436a6SYoshinori Sato __initcall(sh7619_devices_setup); 109780a1568SYoshinori Sato 11090015c89SMagnus Damm void __init plat_irq_setup(void) 111780a1568SYoshinori Sato { 112*0dc3fc04SMagnus Damm register_intc_controller(&intc_desc); 113780a1568SYoshinori Sato } 114