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