1*da2014a2SPaul Mundt /* 2*da2014a2SPaul Mundt * linux/arch/sh/boards/se/770x/setup.c 3*da2014a2SPaul Mundt * 4*da2014a2SPaul Mundt * Copyright (C) 2000 Kazumoto Kojima 5*da2014a2SPaul Mundt * 6*da2014a2SPaul Mundt * Hitachi SolutionEngine Support. 7*da2014a2SPaul Mundt * 8*da2014a2SPaul Mundt */ 9*da2014a2SPaul Mundt #include <linux/init.h> 10*da2014a2SPaul Mundt #include <linux/platform_device.h> 11*da2014a2SPaul Mundt #include <asm/machvec.h> 12*da2014a2SPaul Mundt #include <asm/se.h> 13*da2014a2SPaul Mundt #include <asm/io.h> 14*da2014a2SPaul Mundt #include <asm/smc37c93x.h> 15*da2014a2SPaul Mundt #include <asm/heartbeat.h> 16*da2014a2SPaul Mundt 17*da2014a2SPaul Mundt /* 18*da2014a2SPaul Mundt * Configure the Super I/O chip 19*da2014a2SPaul Mundt */ 20*da2014a2SPaul Mundt static void __init smsc_config(int index, int data) 21*da2014a2SPaul Mundt { 22*da2014a2SPaul Mundt outb_p(index, INDEX_PORT); 23*da2014a2SPaul Mundt outb_p(data, DATA_PORT); 24*da2014a2SPaul Mundt } 25*da2014a2SPaul Mundt 26*da2014a2SPaul Mundt /* XXX: Another candidate for a more generic cchip machine vector */ 27*da2014a2SPaul Mundt static void __init smsc_setup(char **cmdline_p) 28*da2014a2SPaul Mundt { 29*da2014a2SPaul Mundt outb_p(CONFIG_ENTER, CONFIG_PORT); 30*da2014a2SPaul Mundt outb_p(CONFIG_ENTER, CONFIG_PORT); 31*da2014a2SPaul Mundt 32*da2014a2SPaul Mundt /* FDC */ 33*da2014a2SPaul Mundt smsc_config(CURRENT_LDN_INDEX, LDN_FDC); 34*da2014a2SPaul Mundt smsc_config(ACTIVATE_INDEX, 0x01); 35*da2014a2SPaul Mundt smsc_config(IRQ_SELECT_INDEX, 6); /* IRQ6 */ 36*da2014a2SPaul Mundt 37*da2014a2SPaul Mundt /* AUXIO (GPIO): to use IDE1 */ 38*da2014a2SPaul Mundt smsc_config(CURRENT_LDN_INDEX, LDN_AUXIO); 39*da2014a2SPaul Mundt smsc_config(GPIO46_INDEX, 0x00); /* nIOROP */ 40*da2014a2SPaul Mundt smsc_config(GPIO47_INDEX, 0x00); /* nIOWOP */ 41*da2014a2SPaul Mundt 42*da2014a2SPaul Mundt /* COM1 */ 43*da2014a2SPaul Mundt smsc_config(CURRENT_LDN_INDEX, LDN_COM1); 44*da2014a2SPaul Mundt smsc_config(ACTIVATE_INDEX, 0x01); 45*da2014a2SPaul Mundt smsc_config(IO_BASE_HI_INDEX, 0x03); 46*da2014a2SPaul Mundt smsc_config(IO_BASE_LO_INDEX, 0xf8); 47*da2014a2SPaul Mundt smsc_config(IRQ_SELECT_INDEX, 4); /* IRQ4 */ 48*da2014a2SPaul Mundt 49*da2014a2SPaul Mundt /* COM2 */ 50*da2014a2SPaul Mundt smsc_config(CURRENT_LDN_INDEX, LDN_COM2); 51*da2014a2SPaul Mundt smsc_config(ACTIVATE_INDEX, 0x01); 52*da2014a2SPaul Mundt smsc_config(IO_BASE_HI_INDEX, 0x02); 53*da2014a2SPaul Mundt smsc_config(IO_BASE_LO_INDEX, 0xf8); 54*da2014a2SPaul Mundt smsc_config(IRQ_SELECT_INDEX, 3); /* IRQ3 */ 55*da2014a2SPaul Mundt 56*da2014a2SPaul Mundt /* RTC */ 57*da2014a2SPaul Mundt smsc_config(CURRENT_LDN_INDEX, LDN_RTC); 58*da2014a2SPaul Mundt smsc_config(ACTIVATE_INDEX, 0x01); 59*da2014a2SPaul Mundt smsc_config(IRQ_SELECT_INDEX, 8); /* IRQ8 */ 60*da2014a2SPaul Mundt 61*da2014a2SPaul Mundt /* XXX: PARPORT, KBD, and MOUSE will come here... */ 62*da2014a2SPaul Mundt outb_p(CONFIG_EXIT, CONFIG_PORT); 63*da2014a2SPaul Mundt } 64*da2014a2SPaul Mundt 65*da2014a2SPaul Mundt 66*da2014a2SPaul Mundt static struct resource cf_ide_resources[] = { 67*da2014a2SPaul Mundt [0] = { 68*da2014a2SPaul Mundt .start = PA_MRSHPC_IO + 0x1f0, 69*da2014a2SPaul Mundt .end = PA_MRSHPC_IO + 0x1f0 + 8, 70*da2014a2SPaul Mundt .flags = IORESOURCE_MEM, 71*da2014a2SPaul Mundt }, 72*da2014a2SPaul Mundt [1] = { 73*da2014a2SPaul Mundt .start = PA_MRSHPC_IO + 0x1f0 + 0x206, 74*da2014a2SPaul Mundt .end = PA_MRSHPC_IO + 0x1f0 + 8 + 0x206 + 8, 75*da2014a2SPaul Mundt .flags = IORESOURCE_MEM, 76*da2014a2SPaul Mundt }, 77*da2014a2SPaul Mundt [2] = { 78*da2014a2SPaul Mundt .start = IRQ_CFCARD, 79*da2014a2SPaul Mundt .flags = IORESOURCE_IRQ, 80*da2014a2SPaul Mundt }, 81*da2014a2SPaul Mundt }; 82*da2014a2SPaul Mundt 83*da2014a2SPaul Mundt static struct platform_device cf_ide_device = { 84*da2014a2SPaul Mundt .name = "pata_platform", 85*da2014a2SPaul Mundt .id = -1, 86*da2014a2SPaul Mundt .num_resources = ARRAY_SIZE(cf_ide_resources), 87*da2014a2SPaul Mundt .resource = cf_ide_resources, 88*da2014a2SPaul Mundt }; 89*da2014a2SPaul Mundt 90*da2014a2SPaul Mundt static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 }; 91*da2014a2SPaul Mundt 92*da2014a2SPaul Mundt static struct heartbeat_data heartbeat_data = { 93*da2014a2SPaul Mundt .bit_pos = heartbeat_bit_pos, 94*da2014a2SPaul Mundt .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), 95*da2014a2SPaul Mundt .regsize = 16, 96*da2014a2SPaul Mundt }; 97*da2014a2SPaul Mundt 98*da2014a2SPaul Mundt static struct resource heartbeat_resources[] = { 99*da2014a2SPaul Mundt [0] = { 100*da2014a2SPaul Mundt .start = PA_LED, 101*da2014a2SPaul Mundt .end = PA_LED, 102*da2014a2SPaul Mundt .flags = IORESOURCE_MEM, 103*da2014a2SPaul Mundt }, 104*da2014a2SPaul Mundt }; 105*da2014a2SPaul Mundt 106*da2014a2SPaul Mundt static struct platform_device heartbeat_device = { 107*da2014a2SPaul Mundt .name = "heartbeat", 108*da2014a2SPaul Mundt .id = -1, 109*da2014a2SPaul Mundt .dev = { 110*da2014a2SPaul Mundt .platform_data = &heartbeat_data, 111*da2014a2SPaul Mundt }, 112*da2014a2SPaul Mundt .num_resources = ARRAY_SIZE(heartbeat_resources), 113*da2014a2SPaul Mundt .resource = heartbeat_resources, 114*da2014a2SPaul Mundt }; 115*da2014a2SPaul Mundt 116*da2014a2SPaul Mundt #if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\ 117*da2014a2SPaul Mundt defined(CONFIG_CPU_SUBTYPE_SH7712) 118*da2014a2SPaul Mundt /* SH771X Ethernet driver */ 119*da2014a2SPaul Mundt static struct resource sh_eth0_resources[] = { 120*da2014a2SPaul Mundt [0] = { 121*da2014a2SPaul Mundt .start = SH_ETH0_BASE, 122*da2014a2SPaul Mundt .end = SH_ETH0_BASE + 0x1B8, 123*da2014a2SPaul Mundt .flags = IORESOURCE_MEM, 124*da2014a2SPaul Mundt }, 125*da2014a2SPaul Mundt [1] = { 126*da2014a2SPaul Mundt .start = SH_ETH0_IRQ, 127*da2014a2SPaul Mundt .end = SH_ETH0_IRQ, 128*da2014a2SPaul Mundt .flags = IORESOURCE_IRQ, 129*da2014a2SPaul Mundt }, 130*da2014a2SPaul Mundt }; 131*da2014a2SPaul Mundt 132*da2014a2SPaul Mundt static struct platform_device sh_eth0_device = { 133*da2014a2SPaul Mundt .name = "sh-eth", 134*da2014a2SPaul Mundt .id = 0, 135*da2014a2SPaul Mundt .dev = { 136*da2014a2SPaul Mundt .platform_data = PHY_ID, 137*da2014a2SPaul Mundt }, 138*da2014a2SPaul Mundt .num_resources = ARRAY_SIZE(sh_eth0_resources), 139*da2014a2SPaul Mundt .resource = sh_eth0_resources, 140*da2014a2SPaul Mundt }; 141*da2014a2SPaul Mundt 142*da2014a2SPaul Mundt static struct resource sh_eth1_resources[] = { 143*da2014a2SPaul Mundt [0] = { 144*da2014a2SPaul Mundt .start = SH_ETH1_BASE, 145*da2014a2SPaul Mundt .end = SH_ETH1_BASE + 0x1B8, 146*da2014a2SPaul Mundt .flags = IORESOURCE_MEM, 147*da2014a2SPaul Mundt }, 148*da2014a2SPaul Mundt [1] = { 149*da2014a2SPaul Mundt .start = SH_ETH1_IRQ, 150*da2014a2SPaul Mundt .end = SH_ETH1_IRQ, 151*da2014a2SPaul Mundt .flags = IORESOURCE_IRQ, 152*da2014a2SPaul Mundt }, 153*da2014a2SPaul Mundt }; 154*da2014a2SPaul Mundt 155*da2014a2SPaul Mundt static struct platform_device sh_eth1_device = { 156*da2014a2SPaul Mundt .name = "sh-eth", 157*da2014a2SPaul Mundt .id = 1, 158*da2014a2SPaul Mundt .dev = { 159*da2014a2SPaul Mundt .platform_data = PHY_ID, 160*da2014a2SPaul Mundt }, 161*da2014a2SPaul Mundt .num_resources = ARRAY_SIZE(sh_eth1_resources), 162*da2014a2SPaul Mundt .resource = sh_eth1_resources, 163*da2014a2SPaul Mundt }; 164*da2014a2SPaul Mundt #endif 165*da2014a2SPaul Mundt 166*da2014a2SPaul Mundt static struct platform_device *se_devices[] __initdata = { 167*da2014a2SPaul Mundt &heartbeat_device, 168*da2014a2SPaul Mundt &cf_ide_device, 169*da2014a2SPaul Mundt #if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\ 170*da2014a2SPaul Mundt defined(CONFIG_CPU_SUBTYPE_SH7712) 171*da2014a2SPaul Mundt &sh_eth0_device, 172*da2014a2SPaul Mundt &sh_eth1_device, 173*da2014a2SPaul Mundt #endif 174*da2014a2SPaul Mundt }; 175*da2014a2SPaul Mundt 176*da2014a2SPaul Mundt static int __init se_devices_setup(void) 177*da2014a2SPaul Mundt { 178*da2014a2SPaul Mundt return platform_add_devices(se_devices, ARRAY_SIZE(se_devices)); 179*da2014a2SPaul Mundt } 180*da2014a2SPaul Mundt device_initcall(se_devices_setup); 181*da2014a2SPaul Mundt 182*da2014a2SPaul Mundt /* 183*da2014a2SPaul Mundt * The Machine Vector 184*da2014a2SPaul Mundt */ 185*da2014a2SPaul Mundt static struct sh_machine_vector mv_se __initmv = { 186*da2014a2SPaul Mundt .mv_name = "SolutionEngine", 187*da2014a2SPaul Mundt .mv_setup = smsc_setup, 188*da2014a2SPaul Mundt #if defined(CONFIG_CPU_SH4) 189*da2014a2SPaul Mundt .mv_nr_irqs = 48, 190*da2014a2SPaul Mundt #elif defined(CONFIG_CPU_SUBTYPE_SH7708) 191*da2014a2SPaul Mundt .mv_nr_irqs = 32, 192*da2014a2SPaul Mundt #elif defined(CONFIG_CPU_SUBTYPE_SH7709) 193*da2014a2SPaul Mundt .mv_nr_irqs = 61, 194*da2014a2SPaul Mundt #elif defined(CONFIG_CPU_SUBTYPE_SH7705) 195*da2014a2SPaul Mundt .mv_nr_irqs = 86, 196*da2014a2SPaul Mundt #elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712) 197*da2014a2SPaul Mundt .mv_nr_irqs = 104, 198*da2014a2SPaul Mundt #endif 199*da2014a2SPaul Mundt 200*da2014a2SPaul Mundt .mv_inb = se_inb, 201*da2014a2SPaul Mundt .mv_inw = se_inw, 202*da2014a2SPaul Mundt .mv_inl = se_inl, 203*da2014a2SPaul Mundt .mv_outb = se_outb, 204*da2014a2SPaul Mundt .mv_outw = se_outw, 205*da2014a2SPaul Mundt .mv_outl = se_outl, 206*da2014a2SPaul Mundt 207*da2014a2SPaul Mundt .mv_inb_p = se_inb_p, 208*da2014a2SPaul Mundt .mv_inw_p = se_inw, 209*da2014a2SPaul Mundt .mv_inl_p = se_inl, 210*da2014a2SPaul Mundt .mv_outb_p = se_outb_p, 211*da2014a2SPaul Mundt .mv_outw_p = se_outw, 212*da2014a2SPaul Mundt .mv_outl_p = se_outl, 213*da2014a2SPaul Mundt 214*da2014a2SPaul Mundt .mv_insb = se_insb, 215*da2014a2SPaul Mundt .mv_insw = se_insw, 216*da2014a2SPaul Mundt .mv_insl = se_insl, 217*da2014a2SPaul Mundt .mv_outsb = se_outsb, 218*da2014a2SPaul Mundt .mv_outsw = se_outsw, 219*da2014a2SPaul Mundt .mv_outsl = se_outsl, 220*da2014a2SPaul Mundt 221*da2014a2SPaul Mundt .mv_init_irq = init_se_IRQ, 222*da2014a2SPaul Mundt }; 223