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 62632fd800SMagnus Damm static struct plat_sci_port scif0_platform_data = { 639d4436a6SYoshinori Sato .mapbase = 0xf8400000, 649d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 6500b9de9cSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE, 6626c92f37SPaul Mundt .scbrr_algo_id = SCBRR_ALGO_2, 679d4436a6SYoshinori Sato .type = PORT_SCIF, 68e00e7cb3SNobuhiro Iwamatsu .irqs = SCIx_IRQ_MUXED(88), 69632fd800SMagnus Damm }; 70632fd800SMagnus Damm 71632fd800SMagnus Damm static struct platform_device scif0_device = { 72632fd800SMagnus Damm .name = "sh-sci", 73632fd800SMagnus Damm .id = 0, 74632fd800SMagnus Damm .dev = { 75632fd800SMagnus Damm .platform_data = &scif0_platform_data, 76632fd800SMagnus Damm }, 77632fd800SMagnus Damm }; 78632fd800SMagnus Damm 79632fd800SMagnus Damm static struct plat_sci_port scif1_platform_data = { 809d4436a6SYoshinori Sato .mapbase = 0xf8410000, 819d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 8200b9de9cSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE, 8326c92f37SPaul Mundt .scbrr_algo_id = SCBRR_ALGO_2, 849d4436a6SYoshinori Sato .type = PORT_SCIF, 85e00e7cb3SNobuhiro Iwamatsu .irqs = SCIx_IRQ_MUXED(92), 86632fd800SMagnus Damm }; 87632fd800SMagnus Damm 88632fd800SMagnus Damm static struct platform_device scif1_device = { 89632fd800SMagnus Damm .name = "sh-sci", 90632fd800SMagnus Damm .id = 1, 91632fd800SMagnus Damm .dev = { 92632fd800SMagnus Damm .platform_data = &scif1_platform_data, 93632fd800SMagnus Damm }, 94632fd800SMagnus Damm }; 95632fd800SMagnus Damm 96632fd800SMagnus Damm static struct plat_sci_port scif2_platform_data = { 979d4436a6SYoshinori Sato .mapbase = 0xf8420000, 989d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 9900b9de9cSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE, 10026c92f37SPaul Mundt .scbrr_algo_id = SCBRR_ALGO_2, 1019d4436a6SYoshinori Sato .type = PORT_SCIF, 102e00e7cb3SNobuhiro Iwamatsu .irqs = SCIx_IRQ_MUXED(96), 1039d4436a6SYoshinori Sato }; 1049d4436a6SYoshinori Sato 105632fd800SMagnus Damm static struct platform_device scif2_device = { 1069d4436a6SYoshinori Sato .name = "sh-sci", 107632fd800SMagnus Damm .id = 2, 1089d4436a6SYoshinori Sato .dev = { 109632fd800SMagnus Damm .platform_data = &scif2_platform_data, 1109d4436a6SYoshinori Sato }, 1119d4436a6SYoshinori Sato }; 1129d4436a6SYoshinori Sato 113d88a3ea6SYoshinori Sato static struct resource eth_resources[] = { 114d88a3ea6SYoshinori Sato [0] = { 115d88a3ea6SYoshinori Sato .start = 0xfb000000, 116d88a3ea6SYoshinori Sato .end = 0xfb0001c8, 117d88a3ea6SYoshinori Sato .flags = IORESOURCE_MEM, 118d88a3ea6SYoshinori Sato }, 119d88a3ea6SYoshinori Sato [1] = { 120d88a3ea6SYoshinori Sato .start = 85, 121d88a3ea6SYoshinori Sato .end = 85, 122d88a3ea6SYoshinori Sato .flags = IORESOURCE_IRQ, 123d88a3ea6SYoshinori Sato }, 124d88a3ea6SYoshinori Sato }; 125d88a3ea6SYoshinori Sato 126d88a3ea6SYoshinori Sato static struct platform_device eth_device = { 127*c18a79abSSergei Shtylyov .name = "sh7619-ether", 128d88a3ea6SYoshinori Sato .id = -1, 129d88a3ea6SYoshinori Sato .dev = { 130d88a3ea6SYoshinori Sato .platform_data = (void *)1, 131d88a3ea6SYoshinori Sato }, 132d88a3ea6SYoshinori Sato .num_resources = ARRAY_SIZE(eth_resources), 133d88a3ea6SYoshinori Sato .resource = eth_resources, 134d88a3ea6SYoshinori Sato }; 135d88a3ea6SYoshinori Sato 13646a12f74SPaul Mundt static struct sh_timer_config cmt0_platform_data = { 137698aa99dSMagnus Damm .channel_offset = 0x02, 138698aa99dSMagnus Damm .timer_bit = 0, 139698aa99dSMagnus Damm .clockevent_rating = 125, 140698aa99dSMagnus Damm .clocksource_rating = 0, /* disabled due to code generation issues */ 141698aa99dSMagnus Damm }; 142698aa99dSMagnus Damm 143698aa99dSMagnus Damm static struct resource cmt0_resources[] = { 144698aa99dSMagnus Damm [0] = { 145698aa99dSMagnus Damm .start = 0xf84a0072, 146698aa99dSMagnus Damm .end = 0xf84a0077, 147698aa99dSMagnus Damm .flags = IORESOURCE_MEM, 148698aa99dSMagnus Damm }, 149698aa99dSMagnus Damm [1] = { 150698aa99dSMagnus Damm .start = 86, 151698aa99dSMagnus Damm .flags = IORESOURCE_IRQ, 152698aa99dSMagnus Damm }, 153698aa99dSMagnus Damm }; 154698aa99dSMagnus Damm 155698aa99dSMagnus Damm static struct platform_device cmt0_device = { 156698aa99dSMagnus Damm .name = "sh_cmt", 157698aa99dSMagnus Damm .id = 0, 158698aa99dSMagnus Damm .dev = { 159698aa99dSMagnus Damm .platform_data = &cmt0_platform_data, 160698aa99dSMagnus Damm }, 161698aa99dSMagnus Damm .resource = cmt0_resources, 162698aa99dSMagnus Damm .num_resources = ARRAY_SIZE(cmt0_resources), 163698aa99dSMagnus Damm }; 164698aa99dSMagnus Damm 16546a12f74SPaul Mundt static struct sh_timer_config cmt1_platform_data = { 166698aa99dSMagnus Damm .channel_offset = 0x08, 167698aa99dSMagnus Damm .timer_bit = 1, 168698aa99dSMagnus Damm .clockevent_rating = 125, 169698aa99dSMagnus Damm .clocksource_rating = 0, /* disabled due to code generation issues */ 170698aa99dSMagnus Damm }; 171698aa99dSMagnus Damm 172698aa99dSMagnus Damm static struct resource cmt1_resources[] = { 173698aa99dSMagnus Damm [0] = { 174698aa99dSMagnus Damm .start = 0xf84a0078, 175698aa99dSMagnus Damm .end = 0xf84a007d, 176698aa99dSMagnus Damm .flags = IORESOURCE_MEM, 177698aa99dSMagnus Damm }, 178698aa99dSMagnus Damm [1] = { 179698aa99dSMagnus Damm .start = 87, 180698aa99dSMagnus Damm .flags = IORESOURCE_IRQ, 181698aa99dSMagnus Damm }, 182698aa99dSMagnus Damm }; 183698aa99dSMagnus Damm 184698aa99dSMagnus Damm static struct platform_device cmt1_device = { 185698aa99dSMagnus Damm .name = "sh_cmt", 186698aa99dSMagnus Damm .id = 1, 187698aa99dSMagnus Damm .dev = { 188698aa99dSMagnus Damm .platform_data = &cmt1_platform_data, 189698aa99dSMagnus Damm }, 190698aa99dSMagnus Damm .resource = cmt1_resources, 191698aa99dSMagnus Damm .num_resources = ARRAY_SIZE(cmt1_resources), 192698aa99dSMagnus Damm }; 193698aa99dSMagnus Damm 1949d4436a6SYoshinori Sato static struct platform_device *sh7619_devices[] __initdata = { 195632fd800SMagnus Damm &scif0_device, 196632fd800SMagnus Damm &scif1_device, 197632fd800SMagnus Damm &scif2_device, 198d88a3ea6SYoshinori Sato ð_device, 199698aa99dSMagnus Damm &cmt0_device, 200698aa99dSMagnus Damm &cmt1_device, 2019d4436a6SYoshinori Sato }; 2029d4436a6SYoshinori Sato 2039d4436a6SYoshinori Sato static int __init sh7619_devices_setup(void) 2049d4436a6SYoshinori Sato { 2059d4436a6SYoshinori Sato return platform_add_devices(sh7619_devices, 2069d4436a6SYoshinori Sato ARRAY_SIZE(sh7619_devices)); 2079d4436a6SYoshinori Sato } 208ba9a6337SMagnus Damm arch_initcall(sh7619_devices_setup); 209780a1568SYoshinori Sato 21090015c89SMagnus Damm void __init plat_irq_setup(void) 211780a1568SYoshinori Sato { 2120dc3fc04SMagnus Damm register_intc_controller(&intc_desc); 213780a1568SYoshinori Sato } 214698aa99dSMagnus Damm 215698aa99dSMagnus Damm static struct platform_device *sh7619_early_devices[] __initdata = { 216632fd800SMagnus Damm &scif0_device, 217632fd800SMagnus Damm &scif1_device, 218632fd800SMagnus Damm &scif2_device, 219698aa99dSMagnus Damm &cmt0_device, 220698aa99dSMagnus Damm &cmt1_device, 221698aa99dSMagnus Damm }; 222698aa99dSMagnus Damm 223698aa99dSMagnus Damm #define STBCR3 0xf80a0000 224698aa99dSMagnus Damm 225698aa99dSMagnus Damm void __init plat_early_device_setup(void) 226698aa99dSMagnus Damm { 227698aa99dSMagnus Damm /* enable CMT clock */ 228698aa99dSMagnus Damm __raw_writeb(__raw_readb(STBCR3) & ~0x10, STBCR3); 229698aa99dSMagnus Damm 230698aa99dSMagnus Damm early_platform_add_devices(sh7619_early_devices, 231698aa99dSMagnus Damm ARRAY_SIZE(sh7619_early_devices)); 232698aa99dSMagnus Damm } 233