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> 1506a64f91SSergei Shtylyov #include <linux/sh_eth.h> 1646a12f74SPaul Mundt #include <linux/sh_timer.h> 17698aa99dSMagnus Damm #include <linux/io.h> 189d4436a6SYoshinori Sato 190dc3fc04SMagnus Damm enum { 200dc3fc04SMagnus Damm UNUSED = 0, 210dc3fc04SMagnus Damm 220dc3fc04SMagnus Damm /* interrupt sources */ 230dc3fc04SMagnus Damm IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, 240dc3fc04SMagnus Damm WDT, EDMAC, CMT0, CMT1, 255dece2bbSPaul Mundt SCIF0, SCIF1, SCIF2, 260dc3fc04SMagnus Damm HIF_HIFI, HIF_HIFBI, 270dc3fc04SMagnus Damm DMAC0, DMAC1, DMAC2, DMAC3, 280dc3fc04SMagnus Damm SIOF, 290dc3fc04SMagnus Damm }; 300dc3fc04SMagnus Damm 310dc3fc04SMagnus Damm static struct intc_vect vectors[] __initdata = { 320dc3fc04SMagnus Damm INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65), 330dc3fc04SMagnus Damm INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67), 340dc3fc04SMagnus Damm INTC_IRQ(IRQ4, 80), INTC_IRQ(IRQ5, 81), 350dc3fc04SMagnus Damm INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83), 360dc3fc04SMagnus Damm INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85), 370dc3fc04SMagnus Damm INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87), 385dece2bbSPaul Mundt INTC_IRQ(SCIF0, 88), INTC_IRQ(SCIF0, 89), 395dece2bbSPaul Mundt INTC_IRQ(SCIF0, 90), INTC_IRQ(SCIF0, 91), 405dece2bbSPaul Mundt INTC_IRQ(SCIF1, 92), INTC_IRQ(SCIF1, 93), 415dece2bbSPaul Mundt INTC_IRQ(SCIF1, 94), INTC_IRQ(SCIF1, 95), 425dece2bbSPaul Mundt INTC_IRQ(SCIF2, 96), INTC_IRQ(SCIF2, 97), 435dece2bbSPaul Mundt INTC_IRQ(SCIF2, 98), INTC_IRQ(SCIF2, 99), 440dc3fc04SMagnus Damm INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101), 450dc3fc04SMagnus Damm INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105), 460dc3fc04SMagnus Damm INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107), 470dc3fc04SMagnus Damm INTC_IRQ(SIOF, 108), 480dc3fc04SMagnus Damm }; 490dc3fc04SMagnus Damm 500dc3fc04SMagnus Damm static struct intc_prio_reg prio_registers[] __initdata = { 510dc3fc04SMagnus Damm { 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } }, 520dc3fc04SMagnus Damm { 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } }, 530dc3fc04SMagnus Damm { 0xf8080000, 0, 16, 4, /* IPRC */ { WDT, EDMAC, CMT0, CMT1 } }, 540dc3fc04SMagnus Damm { 0xf8080002, 0, 16, 4, /* IPRD */ { SCIF0, SCIF1, SCIF2 } }, 550dc3fc04SMagnus Damm { 0xf8080004, 0, 16, 4, /* IPRE */ { HIF_HIFI, HIF_HIFBI } }, 560dc3fc04SMagnus Damm { 0xf8080006, 0, 16, 4, /* IPRF */ { DMAC0, DMAC1, DMAC2, DMAC3 } }, 570dc3fc04SMagnus Damm { 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } }, 580dc3fc04SMagnus Damm }; 590dc3fc04SMagnus Damm 605dece2bbSPaul Mundt static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, NULL, 617f3edee8SMagnus Damm NULL, prio_registers, NULL); 620dc3fc04SMagnus Damm 63632fd800SMagnus Damm static struct plat_sci_port scif0_platform_data = { 649d4436a6SYoshinori Sato .mapbase = 0xf8400000, 659d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 6600b9de9cSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE, 6726c92f37SPaul Mundt .scbrr_algo_id = SCBRR_ALGO_2, 689d4436a6SYoshinori Sato .type = PORT_SCIF, 69e00e7cb3SNobuhiro Iwamatsu .irqs = SCIx_IRQ_MUXED(88), 70632fd800SMagnus Damm }; 71632fd800SMagnus Damm 72632fd800SMagnus Damm static struct platform_device scif0_device = { 73632fd800SMagnus Damm .name = "sh-sci", 74632fd800SMagnus Damm .id = 0, 75632fd800SMagnus Damm .dev = { 76632fd800SMagnus Damm .platform_data = &scif0_platform_data, 77632fd800SMagnus Damm }, 78632fd800SMagnus Damm }; 79632fd800SMagnus Damm 80632fd800SMagnus Damm static struct plat_sci_port scif1_platform_data = { 819d4436a6SYoshinori Sato .mapbase = 0xf8410000, 829d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 8300b9de9cSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE, 8426c92f37SPaul Mundt .scbrr_algo_id = SCBRR_ALGO_2, 859d4436a6SYoshinori Sato .type = PORT_SCIF, 86e00e7cb3SNobuhiro Iwamatsu .irqs = SCIx_IRQ_MUXED(92), 87632fd800SMagnus Damm }; 88632fd800SMagnus Damm 89632fd800SMagnus Damm static struct platform_device scif1_device = { 90632fd800SMagnus Damm .name = "sh-sci", 91632fd800SMagnus Damm .id = 1, 92632fd800SMagnus Damm .dev = { 93632fd800SMagnus Damm .platform_data = &scif1_platform_data, 94632fd800SMagnus Damm }, 95632fd800SMagnus Damm }; 96632fd800SMagnus Damm 97632fd800SMagnus Damm static struct plat_sci_port scif2_platform_data = { 989d4436a6SYoshinori Sato .mapbase = 0xf8420000, 999d4436a6SYoshinori Sato .flags = UPF_BOOT_AUTOCONF, 10000b9de9cSPaul Mundt .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE, 10126c92f37SPaul Mundt .scbrr_algo_id = SCBRR_ALGO_2, 1029d4436a6SYoshinori Sato .type = PORT_SCIF, 103e00e7cb3SNobuhiro Iwamatsu .irqs = SCIx_IRQ_MUXED(96), 1049d4436a6SYoshinori Sato }; 1059d4436a6SYoshinori Sato 106632fd800SMagnus Damm static struct platform_device scif2_device = { 1079d4436a6SYoshinori Sato .name = "sh-sci", 108632fd800SMagnus Damm .id = 2, 1099d4436a6SYoshinori Sato .dev = { 110632fd800SMagnus Damm .platform_data = &scif2_platform_data, 1119d4436a6SYoshinori Sato }, 1129d4436a6SYoshinori Sato }; 1139d4436a6SYoshinori Sato 11406a64f91SSergei Shtylyov static struct sh_eth_plat_data eth_platform_data = { 11506a64f91SSergei Shtylyov .phy = 1, 11606a64f91SSergei Shtylyov .edmac_endian = EDMAC_LITTLE_ENDIAN, 117*0bf2bbd2SSergei Shtylyov .phy_interface = PHY_INTERFACE_MODE_MII, 11806a64f91SSergei Shtylyov }; 11906a64f91SSergei Shtylyov 120d88a3ea6SYoshinori Sato static struct resource eth_resources[] = { 121d88a3ea6SYoshinori Sato [0] = { 122d88a3ea6SYoshinori Sato .start = 0xfb000000, 12306a64f91SSergei Shtylyov .end = 0xfb0001c7, 124d88a3ea6SYoshinori Sato .flags = IORESOURCE_MEM, 125d88a3ea6SYoshinori Sato }, 126d88a3ea6SYoshinori Sato [1] = { 127d88a3ea6SYoshinori Sato .start = 85, 128d88a3ea6SYoshinori Sato .end = 85, 129d88a3ea6SYoshinori Sato .flags = IORESOURCE_IRQ, 130d88a3ea6SYoshinori Sato }, 131d88a3ea6SYoshinori Sato }; 132d88a3ea6SYoshinori Sato 133d88a3ea6SYoshinori Sato static struct platform_device eth_device = { 134c18a79abSSergei Shtylyov .name = "sh7619-ether", 135d88a3ea6SYoshinori Sato .id = -1, 136d88a3ea6SYoshinori Sato .dev = { 13706a64f91SSergei Shtylyov .platform_data = ð_platform_data, 138d88a3ea6SYoshinori Sato }, 139d88a3ea6SYoshinori Sato .num_resources = ARRAY_SIZE(eth_resources), 140d88a3ea6SYoshinori Sato .resource = eth_resources, 141d88a3ea6SYoshinori Sato }; 142d88a3ea6SYoshinori Sato 14346a12f74SPaul Mundt static struct sh_timer_config cmt0_platform_data = { 144698aa99dSMagnus Damm .channel_offset = 0x02, 145698aa99dSMagnus Damm .timer_bit = 0, 146698aa99dSMagnus Damm .clockevent_rating = 125, 147698aa99dSMagnus Damm .clocksource_rating = 0, /* disabled due to code generation issues */ 148698aa99dSMagnus Damm }; 149698aa99dSMagnus Damm 150698aa99dSMagnus Damm static struct resource cmt0_resources[] = { 151698aa99dSMagnus Damm [0] = { 152698aa99dSMagnus Damm .start = 0xf84a0072, 153698aa99dSMagnus Damm .end = 0xf84a0077, 154698aa99dSMagnus Damm .flags = IORESOURCE_MEM, 155698aa99dSMagnus Damm }, 156698aa99dSMagnus Damm [1] = { 157698aa99dSMagnus Damm .start = 86, 158698aa99dSMagnus Damm .flags = IORESOURCE_IRQ, 159698aa99dSMagnus Damm }, 160698aa99dSMagnus Damm }; 161698aa99dSMagnus Damm 162698aa99dSMagnus Damm static struct platform_device cmt0_device = { 163698aa99dSMagnus Damm .name = "sh_cmt", 164698aa99dSMagnus Damm .id = 0, 165698aa99dSMagnus Damm .dev = { 166698aa99dSMagnus Damm .platform_data = &cmt0_platform_data, 167698aa99dSMagnus Damm }, 168698aa99dSMagnus Damm .resource = cmt0_resources, 169698aa99dSMagnus Damm .num_resources = ARRAY_SIZE(cmt0_resources), 170698aa99dSMagnus Damm }; 171698aa99dSMagnus Damm 17246a12f74SPaul Mundt static struct sh_timer_config cmt1_platform_data = { 173698aa99dSMagnus Damm .channel_offset = 0x08, 174698aa99dSMagnus Damm .timer_bit = 1, 175698aa99dSMagnus Damm .clockevent_rating = 125, 176698aa99dSMagnus Damm .clocksource_rating = 0, /* disabled due to code generation issues */ 177698aa99dSMagnus Damm }; 178698aa99dSMagnus Damm 179698aa99dSMagnus Damm static struct resource cmt1_resources[] = { 180698aa99dSMagnus Damm [0] = { 181698aa99dSMagnus Damm .start = 0xf84a0078, 182698aa99dSMagnus Damm .end = 0xf84a007d, 183698aa99dSMagnus Damm .flags = IORESOURCE_MEM, 184698aa99dSMagnus Damm }, 185698aa99dSMagnus Damm [1] = { 186698aa99dSMagnus Damm .start = 87, 187698aa99dSMagnus Damm .flags = IORESOURCE_IRQ, 188698aa99dSMagnus Damm }, 189698aa99dSMagnus Damm }; 190698aa99dSMagnus Damm 191698aa99dSMagnus Damm static struct platform_device cmt1_device = { 192698aa99dSMagnus Damm .name = "sh_cmt", 193698aa99dSMagnus Damm .id = 1, 194698aa99dSMagnus Damm .dev = { 195698aa99dSMagnus Damm .platform_data = &cmt1_platform_data, 196698aa99dSMagnus Damm }, 197698aa99dSMagnus Damm .resource = cmt1_resources, 198698aa99dSMagnus Damm .num_resources = ARRAY_SIZE(cmt1_resources), 199698aa99dSMagnus Damm }; 200698aa99dSMagnus Damm 2019d4436a6SYoshinori Sato static struct platform_device *sh7619_devices[] __initdata = { 202632fd800SMagnus Damm &scif0_device, 203632fd800SMagnus Damm &scif1_device, 204632fd800SMagnus Damm &scif2_device, 205d88a3ea6SYoshinori Sato ð_device, 206698aa99dSMagnus Damm &cmt0_device, 207698aa99dSMagnus Damm &cmt1_device, 2089d4436a6SYoshinori Sato }; 2099d4436a6SYoshinori Sato 2109d4436a6SYoshinori Sato static int __init sh7619_devices_setup(void) 2119d4436a6SYoshinori Sato { 2129d4436a6SYoshinori Sato return platform_add_devices(sh7619_devices, 2139d4436a6SYoshinori Sato ARRAY_SIZE(sh7619_devices)); 2149d4436a6SYoshinori Sato } 215ba9a6337SMagnus Damm arch_initcall(sh7619_devices_setup); 216780a1568SYoshinori Sato 21790015c89SMagnus Damm void __init plat_irq_setup(void) 218780a1568SYoshinori Sato { 2190dc3fc04SMagnus Damm register_intc_controller(&intc_desc); 220780a1568SYoshinori Sato } 221698aa99dSMagnus Damm 222698aa99dSMagnus Damm static struct platform_device *sh7619_early_devices[] __initdata = { 223632fd800SMagnus Damm &scif0_device, 224632fd800SMagnus Damm &scif1_device, 225632fd800SMagnus Damm &scif2_device, 226698aa99dSMagnus Damm &cmt0_device, 227698aa99dSMagnus Damm &cmt1_device, 228698aa99dSMagnus Damm }; 229698aa99dSMagnus Damm 230698aa99dSMagnus Damm #define STBCR3 0xf80a0000 231698aa99dSMagnus Damm 232698aa99dSMagnus Damm void __init plat_early_device_setup(void) 233698aa99dSMagnus Damm { 234698aa99dSMagnus Damm /* enable CMT clock */ 235698aa99dSMagnus Damm __raw_writeb(__raw_readb(STBCR3) & ~0x10, STBCR3); 236698aa99dSMagnus Damm 237698aa99dSMagnus Damm early_platform_add_devices(sh7619_early_devices, 238698aa99dSMagnus Damm ARRAY_SIZE(sh7619_early_devices)); 239698aa99dSMagnus Damm } 240