19d4436a6SYoshinori Sato /* 29d4436a6SYoshinori Sato * SH7619 Setup 39d4436a6SYoshinori Sato * 49d4436a6SYoshinori Sato * Copyright (C) 2006 Yoshinori Sato 55dece2bbSPaul Mundt * Copyright (C) 2009 Paul Mundt 69d4436a6SYoshinori Sato * 79d4436a6SYoshinori Sato * This file is subject to the terms and conditions of the GNU General Public 89d4436a6SYoshinori Sato * License. See the file "COPYING" in the main directory of this archive 99d4436a6SYoshinori Sato * for more details. 109d4436a6SYoshinori Sato */ 119d4436a6SYoshinori Sato #include <linux/platform_device.h> 129d4436a6SYoshinori Sato #include <linux/init.h> 139d4436a6SYoshinori Sato #include <linux/serial.h> 1496de1a8fSPaul Mundt #include <linux/serial_sci.h> 1546a12f74SPaul Mundt #include <linux/sh_timer.h> 16698aa99dSMagnus Damm #include <linux/io.h> 179d4436a6SYoshinori Sato 180dc3fc04SMagnus Damm enum { 190dc3fc04SMagnus Damm UNUSED = 0, 200dc3fc04SMagnus Damm 210dc3fc04SMagnus Damm /* interrupt sources */ 220dc3fc04SMagnus Damm IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, 230dc3fc04SMagnus Damm WDT, EDMAC, CMT0, CMT1, 245dece2bbSPaul Mundt SCIF0, SCIF1, SCIF2, 250dc3fc04SMagnus Damm HIF_HIFI, HIF_HIFBI, 260dc3fc04SMagnus Damm DMAC0, DMAC1, DMAC2, DMAC3, 270dc3fc04SMagnus Damm SIOF, 280dc3fc04SMagnus Damm }; 290dc3fc04SMagnus Damm 300dc3fc04SMagnus Damm static struct intc_vect vectors[] __initdata = { 310dc3fc04SMagnus Damm INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65), 320dc3fc04SMagnus Damm INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67), 330dc3fc04SMagnus Damm INTC_IRQ(IRQ4, 80), INTC_IRQ(IRQ5, 81), 340dc3fc04SMagnus Damm INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83), 350dc3fc04SMagnus Damm INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85), 360dc3fc04SMagnus Damm INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87), 375dece2bbSPaul Mundt INTC_IRQ(SCIF0, 88), INTC_IRQ(SCIF0, 89), 385dece2bbSPaul Mundt INTC_IRQ(SCIF0, 90), INTC_IRQ(SCIF0, 91), 395dece2bbSPaul Mundt INTC_IRQ(SCIF1, 92), INTC_IRQ(SCIF1, 93), 405dece2bbSPaul Mundt INTC_IRQ(SCIF1, 94), INTC_IRQ(SCIF1, 95), 415dece2bbSPaul Mundt INTC_IRQ(SCIF2, 96), INTC_IRQ(SCIF2, 97), 425dece2bbSPaul Mundt INTC_IRQ(SCIF2, 98), INTC_IRQ(SCIF2, 99), 430dc3fc04SMagnus Damm INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101), 440dc3fc04SMagnus Damm INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105), 450dc3fc04SMagnus Damm INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107), 460dc3fc04SMagnus Damm INTC_IRQ(SIOF, 108), 470dc3fc04SMagnus Damm }; 480dc3fc04SMagnus Damm 490dc3fc04SMagnus Damm static struct intc_prio_reg prio_registers[] __initdata = { 500dc3fc04SMagnus Damm { 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } }, 510dc3fc04SMagnus Damm { 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } }, 520dc3fc04SMagnus Damm { 0xf8080000, 0, 16, 4, /* IPRC */ { WDT, EDMAC, CMT0, CMT1 } }, 530dc3fc04SMagnus Damm { 0xf8080002, 0, 16, 4, /* IPRD */ { SCIF0, SCIF1, SCIF2 } }, 540dc3fc04SMagnus Damm { 0xf8080004, 0, 16, 4, /* IPRE */ { HIF_HIFI, HIF_HIFBI } }, 550dc3fc04SMagnus Damm { 0xf8080006, 0, 16, 4, /* IPRF */ { DMAC0, DMAC1, DMAC2, DMAC3 } }, 560dc3fc04SMagnus Damm { 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } }, 570dc3fc04SMagnus Damm }; 580dc3fc04SMagnus Damm 595dece2bbSPaul Mundt static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, NULL, 607f3edee8SMagnus Damm NULL, prio_registers, NULL); 610dc3fc04SMagnus Damm 629d4436a6SYoshinori Sato static struct plat_sci_port sci_platform_data[] = { 639d4436a6SYoshinori Sato { 649d4436a6SYoshinori Sato .mapbase = 0xf8400000, 659d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 669d4436a6SYoshinori Sato .type = PORT_SCIF, 675dece2bbSPaul Mundt .irqs = { 88, 88, 88, 88 }, 689d4436a6SYoshinori Sato }, { 699d4436a6SYoshinori Sato .mapbase = 0xf8410000, 709d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 719d4436a6SYoshinori Sato .type = PORT_SCIF, 725dece2bbSPaul Mundt .irqs = { 92, 92, 92, 92 }, 739d4436a6SYoshinori Sato }, { 749d4436a6SYoshinori Sato .mapbase = 0xf8420000, 759d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 769d4436a6SYoshinori Sato .type = PORT_SCIF, 775dece2bbSPaul Mundt .irqs = { 96, 96, 96, 96 }, 789d4436a6SYoshinori Sato }, { 799d4436a6SYoshinori Sato .flags = 0, 809d4436a6SYoshinori Sato } 819d4436a6SYoshinori Sato }; 829d4436a6SYoshinori Sato 839d4436a6SYoshinori Sato static struct platform_device sci_device = { 849d4436a6SYoshinori Sato .name = "sh-sci", 859d4436a6SYoshinori Sato .id = -1, 869d4436a6SYoshinori Sato .dev = { 879d4436a6SYoshinori Sato .platform_data = sci_platform_data, 889d4436a6SYoshinori Sato }, 899d4436a6SYoshinori Sato }; 909d4436a6SYoshinori Sato 91d88a3ea6SYoshinori Sato static struct resource eth_resources[] = { 92d88a3ea6SYoshinori Sato [0] = { 93d88a3ea6SYoshinori Sato .start = 0xfb000000, 94d88a3ea6SYoshinori Sato .end = 0xfb0001c8, 95d88a3ea6SYoshinori Sato .flags = IORESOURCE_MEM, 96d88a3ea6SYoshinori Sato }, 97d88a3ea6SYoshinori Sato [1] = { 98d88a3ea6SYoshinori Sato .start = 85, 99d88a3ea6SYoshinori Sato .end = 85, 100d88a3ea6SYoshinori Sato .flags = IORESOURCE_IRQ, 101d88a3ea6SYoshinori Sato }, 102d88a3ea6SYoshinori Sato }; 103d88a3ea6SYoshinori Sato 104d88a3ea6SYoshinori Sato static struct platform_device eth_device = { 105d88a3ea6SYoshinori Sato .name = "sh-eth", 106d88a3ea6SYoshinori Sato .id = -1, 107d88a3ea6SYoshinori Sato .dev = { 108d88a3ea6SYoshinori Sato .platform_data = (void *)1, 109d88a3ea6SYoshinori Sato }, 110d88a3ea6SYoshinori Sato .num_resources = ARRAY_SIZE(eth_resources), 111d88a3ea6SYoshinori Sato .resource = eth_resources, 112d88a3ea6SYoshinori Sato }; 113d88a3ea6SYoshinori Sato 11446a12f74SPaul Mundt static struct sh_timer_config cmt0_platform_data = { 115698aa99dSMagnus Damm .name = "CMT0", 116698aa99dSMagnus Damm .channel_offset = 0x02, 117698aa99dSMagnus Damm .timer_bit = 0, 118af777ce4SPaul Mundt .clk = "peripheral_clk", 119698aa99dSMagnus Damm .clockevent_rating = 125, 120698aa99dSMagnus Damm .clocksource_rating = 0, /* disabled due to code generation issues */ 121698aa99dSMagnus Damm }; 122698aa99dSMagnus Damm 123698aa99dSMagnus Damm static struct resource cmt0_resources[] = { 124698aa99dSMagnus Damm [0] = { 125698aa99dSMagnus Damm .name = "CMT0", 126698aa99dSMagnus Damm .start = 0xf84a0072, 127698aa99dSMagnus Damm .end = 0xf84a0077, 128698aa99dSMagnus Damm .flags = IORESOURCE_MEM, 129698aa99dSMagnus Damm }, 130698aa99dSMagnus Damm [1] = { 131698aa99dSMagnus Damm .start = 86, 132698aa99dSMagnus Damm .flags = IORESOURCE_IRQ, 133698aa99dSMagnus Damm }, 134698aa99dSMagnus Damm }; 135698aa99dSMagnus Damm 136698aa99dSMagnus Damm static struct platform_device cmt0_device = { 137698aa99dSMagnus Damm .name = "sh_cmt", 138698aa99dSMagnus Damm .id = 0, 139698aa99dSMagnus Damm .dev = { 140698aa99dSMagnus Damm .platform_data = &cmt0_platform_data, 141698aa99dSMagnus Damm }, 142698aa99dSMagnus Damm .resource = cmt0_resources, 143698aa99dSMagnus Damm .num_resources = ARRAY_SIZE(cmt0_resources), 144698aa99dSMagnus Damm }; 145698aa99dSMagnus Damm 14646a12f74SPaul Mundt static struct sh_timer_config cmt1_platform_data = { 147698aa99dSMagnus Damm .name = "CMT1", 148698aa99dSMagnus Damm .channel_offset = 0x08, 149698aa99dSMagnus Damm .timer_bit = 1, 150af777ce4SPaul Mundt .clk = "peripheral_clk", 151698aa99dSMagnus Damm .clockevent_rating = 125, 152698aa99dSMagnus Damm .clocksource_rating = 0, /* disabled due to code generation issues */ 153698aa99dSMagnus Damm }; 154698aa99dSMagnus Damm 155698aa99dSMagnus Damm static struct resource cmt1_resources[] = { 156698aa99dSMagnus Damm [0] = { 157698aa99dSMagnus Damm .name = "CMT1", 158698aa99dSMagnus Damm .start = 0xf84a0078, 159698aa99dSMagnus Damm .end = 0xf84a007d, 160698aa99dSMagnus Damm .flags = IORESOURCE_MEM, 161698aa99dSMagnus Damm }, 162698aa99dSMagnus Damm [1] = { 163698aa99dSMagnus Damm .start = 87, 164698aa99dSMagnus Damm .flags = IORESOURCE_IRQ, 165698aa99dSMagnus Damm }, 166698aa99dSMagnus Damm }; 167698aa99dSMagnus Damm 168698aa99dSMagnus Damm static struct platform_device cmt1_device = { 169698aa99dSMagnus Damm .name = "sh_cmt", 170698aa99dSMagnus Damm .id = 1, 171698aa99dSMagnus Damm .dev = { 172698aa99dSMagnus Damm .platform_data = &cmt1_platform_data, 173698aa99dSMagnus Damm }, 174698aa99dSMagnus Damm .resource = cmt1_resources, 175698aa99dSMagnus Damm .num_resources = ARRAY_SIZE(cmt1_resources), 176698aa99dSMagnus Damm }; 177698aa99dSMagnus Damm 1789d4436a6SYoshinori Sato static struct platform_device *sh7619_devices[] __initdata = { 1799d4436a6SYoshinori Sato &sci_device, 180d88a3ea6SYoshinori Sato ð_device, 181698aa99dSMagnus Damm &cmt0_device, 182698aa99dSMagnus Damm &cmt1_device, 1839d4436a6SYoshinori Sato }; 1849d4436a6SYoshinori Sato 1859d4436a6SYoshinori Sato static int __init sh7619_devices_setup(void) 1869d4436a6SYoshinori Sato { 1879d4436a6SYoshinori Sato return platform_add_devices(sh7619_devices, 1889d4436a6SYoshinori Sato ARRAY_SIZE(sh7619_devices)); 1899d4436a6SYoshinori Sato } 190*ba9a6337SMagnus Damm arch_initcall(sh7619_devices_setup); 191780a1568SYoshinori Sato 19290015c89SMagnus Damm void __init plat_irq_setup(void) 193780a1568SYoshinori Sato { 1940dc3fc04SMagnus Damm register_intc_controller(&intc_desc); 195780a1568SYoshinori Sato } 196698aa99dSMagnus Damm 197698aa99dSMagnus Damm static struct platform_device *sh7619_early_devices[] __initdata = { 198698aa99dSMagnus Damm &cmt0_device, 199698aa99dSMagnus Damm &cmt1_device, 200698aa99dSMagnus Damm }; 201698aa99dSMagnus Damm 202698aa99dSMagnus Damm #define STBCR3 0xf80a0000 203698aa99dSMagnus Damm 204698aa99dSMagnus Damm void __init plat_early_device_setup(void) 205698aa99dSMagnus Damm { 206698aa99dSMagnus Damm /* enable CMT clock */ 207698aa99dSMagnus Damm __raw_writeb(__raw_readb(STBCR3) & ~0x10, STBCR3); 208698aa99dSMagnus Damm 209698aa99dSMagnus Damm early_platform_add_devices(sh7619_early_devices, 210698aa99dSMagnus Damm ARRAY_SIZE(sh7619_early_devices)); 211698aa99dSMagnus Damm } 212