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