162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/sh/boards/se/770x/setup.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2000 Kazumoto Kojima 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Hitachi SolutionEngine Support. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci#include <linux/platform_device.h> 1262306a36Sopenharmony_ci#include <linux/sh_eth.h> 1362306a36Sopenharmony_ci#include <mach-se/mach/se.h> 1462306a36Sopenharmony_ci#include <mach-se/mach/mrshpc.h> 1562306a36Sopenharmony_ci#include <asm/machvec.h> 1662306a36Sopenharmony_ci#include <asm/io.h> 1762306a36Sopenharmony_ci#include <asm/smc37c93x.h> 1862306a36Sopenharmony_ci#include <asm/heartbeat.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* 2162306a36Sopenharmony_ci * Configure the Super I/O chip 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_cistatic void __init smsc_config(int index, int data) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci outb_p(index, INDEX_PORT); 2662306a36Sopenharmony_ci outb_p(data, DATA_PORT); 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* XXX: Another candidate for a more generic cchip machine vector */ 3062306a36Sopenharmony_cistatic void __init smsc_setup(char **cmdline_p) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci outb_p(CONFIG_ENTER, CONFIG_PORT); 3362306a36Sopenharmony_ci outb_p(CONFIG_ENTER, CONFIG_PORT); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci /* FDC */ 3662306a36Sopenharmony_ci smsc_config(CURRENT_LDN_INDEX, LDN_FDC); 3762306a36Sopenharmony_ci smsc_config(ACTIVATE_INDEX, 0x01); 3862306a36Sopenharmony_ci smsc_config(IRQ_SELECT_INDEX, 6); /* IRQ6 */ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci /* AUXIO (GPIO): to use IDE1 */ 4162306a36Sopenharmony_ci smsc_config(CURRENT_LDN_INDEX, LDN_AUXIO); 4262306a36Sopenharmony_ci smsc_config(GPIO46_INDEX, 0x00); /* nIOROP */ 4362306a36Sopenharmony_ci smsc_config(GPIO47_INDEX, 0x00); /* nIOWOP */ 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci /* COM1 */ 4662306a36Sopenharmony_ci smsc_config(CURRENT_LDN_INDEX, LDN_COM1); 4762306a36Sopenharmony_ci smsc_config(ACTIVATE_INDEX, 0x01); 4862306a36Sopenharmony_ci smsc_config(IO_BASE_HI_INDEX, 0x03); 4962306a36Sopenharmony_ci smsc_config(IO_BASE_LO_INDEX, 0xf8); 5062306a36Sopenharmony_ci smsc_config(IRQ_SELECT_INDEX, 4); /* IRQ4 */ 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci /* COM2 */ 5362306a36Sopenharmony_ci smsc_config(CURRENT_LDN_INDEX, LDN_COM2); 5462306a36Sopenharmony_ci smsc_config(ACTIVATE_INDEX, 0x01); 5562306a36Sopenharmony_ci smsc_config(IO_BASE_HI_INDEX, 0x02); 5662306a36Sopenharmony_ci smsc_config(IO_BASE_LO_INDEX, 0xf8); 5762306a36Sopenharmony_ci smsc_config(IRQ_SELECT_INDEX, 3); /* IRQ3 */ 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci /* RTC */ 6062306a36Sopenharmony_ci smsc_config(CURRENT_LDN_INDEX, LDN_RTC); 6162306a36Sopenharmony_ci smsc_config(ACTIVATE_INDEX, 0x01); 6262306a36Sopenharmony_ci smsc_config(IRQ_SELECT_INDEX, 8); /* IRQ8 */ 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci /* XXX: PARPORT, KBD, and MOUSE will come here... */ 6562306a36Sopenharmony_ci outb_p(CONFIG_EXIT, CONFIG_PORT); 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic struct resource cf_ide_resources[] = { 7062306a36Sopenharmony_ci [0] = { 7162306a36Sopenharmony_ci .start = PA_MRSHPC_IO + 0x1f0, 7262306a36Sopenharmony_ci .end = PA_MRSHPC_IO + 0x1f0 + 8, 7362306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 7462306a36Sopenharmony_ci }, 7562306a36Sopenharmony_ci [1] = { 7662306a36Sopenharmony_ci .start = PA_MRSHPC_IO + 0x1f0 + 0x206, 7762306a36Sopenharmony_ci .end = PA_MRSHPC_IO + 0x1f0 + 8 + 0x206 + 8, 7862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 7962306a36Sopenharmony_ci }, 8062306a36Sopenharmony_ci [2] = { 8162306a36Sopenharmony_ci .start = IRQ_CFCARD, 8262306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 8362306a36Sopenharmony_ci }, 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistatic struct platform_device cf_ide_device = { 8762306a36Sopenharmony_ci .name = "pata_platform", 8862306a36Sopenharmony_ci .id = -1, 8962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(cf_ide_resources), 9062306a36Sopenharmony_ci .resource = cf_ide_resources, 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 }; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistatic struct heartbeat_data heartbeat_data = { 9662306a36Sopenharmony_ci .bit_pos = heartbeat_bit_pos, 9762306a36Sopenharmony_ci .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatic struct resource heartbeat_resource = { 10162306a36Sopenharmony_ci .start = PA_LED, 10262306a36Sopenharmony_ci .end = PA_LED, 10362306a36Sopenharmony_ci .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistatic struct platform_device heartbeat_device = { 10762306a36Sopenharmony_ci .name = "heartbeat", 10862306a36Sopenharmony_ci .id = -1, 10962306a36Sopenharmony_ci .dev = { 11062306a36Sopenharmony_ci .platform_data = &heartbeat_data, 11162306a36Sopenharmony_ci }, 11262306a36Sopenharmony_ci .num_resources = 1, 11362306a36Sopenharmony_ci .resource = &heartbeat_resource, 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\ 11762306a36Sopenharmony_ci defined(CONFIG_CPU_SUBTYPE_SH7712) 11862306a36Sopenharmony_ci/* SH771X Ethernet driver */ 11962306a36Sopenharmony_cistatic struct sh_eth_plat_data sh_eth_plat = { 12062306a36Sopenharmony_ci .phy = PHY_ID, 12162306a36Sopenharmony_ci .phy_interface = PHY_INTERFACE_MODE_MII, 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic struct resource sh_eth0_resources[] = { 12562306a36Sopenharmony_ci [0] = { 12662306a36Sopenharmony_ci .start = SH_ETH0_BASE, 12762306a36Sopenharmony_ci .end = SH_ETH0_BASE + 0x1B8 - 1, 12862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 12962306a36Sopenharmony_ci }, 13062306a36Sopenharmony_ci [1] = { 13162306a36Sopenharmony_ci .start = SH_TSU_BASE, 13262306a36Sopenharmony_ci .end = SH_TSU_BASE + 0x200 - 1, 13362306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 13462306a36Sopenharmony_ci }, 13562306a36Sopenharmony_ci [2] = { 13662306a36Sopenharmony_ci .start = SH_ETH0_IRQ, 13762306a36Sopenharmony_ci .end = SH_ETH0_IRQ, 13862306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 13962306a36Sopenharmony_ci }, 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cistatic struct platform_device sh_eth0_device = { 14362306a36Sopenharmony_ci .name = "sh771x-ether", 14462306a36Sopenharmony_ci .id = 0, 14562306a36Sopenharmony_ci .dev = { 14662306a36Sopenharmony_ci .platform_data = &sh_eth_plat, 14762306a36Sopenharmony_ci }, 14862306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_eth0_resources), 14962306a36Sopenharmony_ci .resource = sh_eth0_resources, 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic struct resource sh_eth1_resources[] = { 15362306a36Sopenharmony_ci [0] = { 15462306a36Sopenharmony_ci .start = SH_ETH1_BASE, 15562306a36Sopenharmony_ci .end = SH_ETH1_BASE + 0x1B8 - 1, 15662306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 15762306a36Sopenharmony_ci }, 15862306a36Sopenharmony_ci [1] = { 15962306a36Sopenharmony_ci .start = SH_TSU_BASE, 16062306a36Sopenharmony_ci .end = SH_TSU_BASE + 0x200 - 1, 16162306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 16262306a36Sopenharmony_ci }, 16362306a36Sopenharmony_ci [2] = { 16462306a36Sopenharmony_ci .start = SH_ETH1_IRQ, 16562306a36Sopenharmony_ci .end = SH_ETH1_IRQ, 16662306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 16762306a36Sopenharmony_ci }, 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistatic struct platform_device sh_eth1_device = { 17162306a36Sopenharmony_ci .name = "sh771x-ether", 17262306a36Sopenharmony_ci .id = 1, 17362306a36Sopenharmony_ci .dev = { 17462306a36Sopenharmony_ci .platform_data = &sh_eth_plat, 17562306a36Sopenharmony_ci }, 17662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_eth1_resources), 17762306a36Sopenharmony_ci .resource = sh_eth1_resources, 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci#endif 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistatic struct platform_device *se_devices[] __initdata = { 18262306a36Sopenharmony_ci &heartbeat_device, 18362306a36Sopenharmony_ci &cf_ide_device, 18462306a36Sopenharmony_ci#if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\ 18562306a36Sopenharmony_ci defined(CONFIG_CPU_SUBTYPE_SH7712) 18662306a36Sopenharmony_ci &sh_eth0_device, 18762306a36Sopenharmony_ci &sh_eth1_device, 18862306a36Sopenharmony_ci#endif 18962306a36Sopenharmony_ci}; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic int __init se_devices_setup(void) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci mrshpc_setup_windows(); 19462306a36Sopenharmony_ci return platform_add_devices(se_devices, ARRAY_SIZE(se_devices)); 19562306a36Sopenharmony_ci} 19662306a36Sopenharmony_cidevice_initcall(se_devices_setup); 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci/* 19962306a36Sopenharmony_ci * The Machine Vector 20062306a36Sopenharmony_ci */ 20162306a36Sopenharmony_cistatic struct sh_machine_vector mv_se __initmv = { 20262306a36Sopenharmony_ci .mv_name = "SolutionEngine", 20362306a36Sopenharmony_ci .mv_setup = smsc_setup, 20462306a36Sopenharmony_ci .mv_init_irq = init_se_IRQ, 20562306a36Sopenharmony_ci}; 206