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