162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/sh/boards/mach-x3proto/setup.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Renesas SH-X3 Prototype Board Support. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2007 - 2010 Paul Mundt 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#include <linux/init.h> 1062306a36Sopenharmony_ci#include <linux/platform_device.h> 1162306a36Sopenharmony_ci#include <linux/kernel.h> 1262306a36Sopenharmony_ci#include <linux/io.h> 1362306a36Sopenharmony_ci#include <linux/smc91x.h> 1462306a36Sopenharmony_ci#include <linux/irq.h> 1562306a36Sopenharmony_ci#include <linux/interrupt.h> 1662306a36Sopenharmony_ci#include <linux/input.h> 1762306a36Sopenharmony_ci#include <linux/usb/r8a66597.h> 1862306a36Sopenharmony_ci#include <linux/usb/m66592.h> 1962306a36Sopenharmony_ci#include <linux/gpio/driver.h> 2062306a36Sopenharmony_ci#include <linux/gpio_keys.h> 2162306a36Sopenharmony_ci#include <mach/ilsel.h> 2262306a36Sopenharmony_ci#include <mach/hardware.h> 2362306a36Sopenharmony_ci#include <asm/smp-ops.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic struct resource heartbeat_resources[] = { 2662306a36Sopenharmony_ci [0] = { 2762306a36Sopenharmony_ci .start = 0xb8140020, 2862306a36Sopenharmony_ci .end = 0xb8140020, 2962306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 3062306a36Sopenharmony_ci }, 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic struct platform_device heartbeat_device = { 3462306a36Sopenharmony_ci .name = "heartbeat", 3562306a36Sopenharmony_ci .id = -1, 3662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(heartbeat_resources), 3762306a36Sopenharmony_ci .resource = heartbeat_resources, 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic struct smc91x_platdata smc91x_info = { 4162306a36Sopenharmony_ci .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic struct resource smc91x_resources[] = { 4562306a36Sopenharmony_ci [0] = { 4662306a36Sopenharmony_ci .start = 0x18000300, 4762306a36Sopenharmony_ci .end = 0x18000300 + 0x10 - 1, 4862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 4962306a36Sopenharmony_ci }, 5062306a36Sopenharmony_ci [1] = { 5162306a36Sopenharmony_ci /* Filled in by ilsel */ 5262306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 5362306a36Sopenharmony_ci }, 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic struct platform_device smc91x_device = { 5762306a36Sopenharmony_ci .name = "smc91x", 5862306a36Sopenharmony_ci .id = -1, 5962306a36Sopenharmony_ci .resource = smc91x_resources, 6062306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(smc91x_resources), 6162306a36Sopenharmony_ci .dev = { 6262306a36Sopenharmony_ci .platform_data = &smc91x_info, 6362306a36Sopenharmony_ci }, 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic struct r8a66597_platdata r8a66597_data = { 6762306a36Sopenharmony_ci .xtal = R8A66597_PLATDATA_XTAL_12MHZ, 6862306a36Sopenharmony_ci .vif = 1, 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic struct resource r8a66597_usb_host_resources[] = { 7262306a36Sopenharmony_ci [0] = { 7362306a36Sopenharmony_ci .start = 0x18040000, 7462306a36Sopenharmony_ci .end = 0x18080000 - 1, 7562306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 7662306a36Sopenharmony_ci }, 7762306a36Sopenharmony_ci [1] = { 7862306a36Sopenharmony_ci /* Filled in by ilsel */ 7962306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 8062306a36Sopenharmony_ci }, 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic struct platform_device r8a66597_usb_host_device = { 8462306a36Sopenharmony_ci .name = "r8a66597_hcd", 8562306a36Sopenharmony_ci .id = -1, 8662306a36Sopenharmony_ci .dev = { 8762306a36Sopenharmony_ci .dma_mask = NULL, /* don't use dma */ 8862306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 8962306a36Sopenharmony_ci .platform_data = &r8a66597_data, 9062306a36Sopenharmony_ci }, 9162306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), 9262306a36Sopenharmony_ci .resource = r8a66597_usb_host_resources, 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistatic struct m66592_platdata usbf_platdata = { 9662306a36Sopenharmony_ci .xtal = M66592_PLATDATA_XTAL_24MHZ, 9762306a36Sopenharmony_ci .vif = 1, 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatic struct resource m66592_usb_peripheral_resources[] = { 10162306a36Sopenharmony_ci [0] = { 10262306a36Sopenharmony_ci .name = "m66592_udc", 10362306a36Sopenharmony_ci .start = 0x18080000, 10462306a36Sopenharmony_ci .end = 0x180c0000 - 1, 10562306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 10662306a36Sopenharmony_ci }, 10762306a36Sopenharmony_ci [1] = { 10862306a36Sopenharmony_ci .name = "m66592_udc", 10962306a36Sopenharmony_ci /* Filled in by ilsel */ 11062306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 11162306a36Sopenharmony_ci }, 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistatic struct platform_device m66592_usb_peripheral_device = { 11562306a36Sopenharmony_ci .name = "m66592_udc", 11662306a36Sopenharmony_ci .id = -1, 11762306a36Sopenharmony_ci .dev = { 11862306a36Sopenharmony_ci .dma_mask = NULL, /* don't use dma */ 11962306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 12062306a36Sopenharmony_ci .platform_data = &usbf_platdata, 12162306a36Sopenharmony_ci }, 12262306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources), 12362306a36Sopenharmony_ci .resource = m66592_usb_peripheral_resources, 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistatic struct gpio_keys_button baseboard_buttons[NR_BASEBOARD_GPIOS] = { 12762306a36Sopenharmony_ci { 12862306a36Sopenharmony_ci .desc = "key44", 12962306a36Sopenharmony_ci .code = KEY_POWER, 13062306a36Sopenharmony_ci .active_low = 1, 13162306a36Sopenharmony_ci .wakeup = 1, 13262306a36Sopenharmony_ci }, { 13362306a36Sopenharmony_ci .desc = "key43", 13462306a36Sopenharmony_ci .code = KEY_SUSPEND, 13562306a36Sopenharmony_ci .active_low = 1, 13662306a36Sopenharmony_ci .wakeup = 1, 13762306a36Sopenharmony_ci }, { 13862306a36Sopenharmony_ci .desc = "key42", 13962306a36Sopenharmony_ci .code = KEY_KATAKANAHIRAGANA, 14062306a36Sopenharmony_ci .active_low = 1, 14162306a36Sopenharmony_ci }, { 14262306a36Sopenharmony_ci .desc = "key41", 14362306a36Sopenharmony_ci .code = KEY_SWITCHVIDEOMODE, 14462306a36Sopenharmony_ci .active_low = 1, 14562306a36Sopenharmony_ci }, { 14662306a36Sopenharmony_ci .desc = "key34", 14762306a36Sopenharmony_ci .code = KEY_F12, 14862306a36Sopenharmony_ci .active_low = 1, 14962306a36Sopenharmony_ci }, { 15062306a36Sopenharmony_ci .desc = "key33", 15162306a36Sopenharmony_ci .code = KEY_F11, 15262306a36Sopenharmony_ci .active_low = 1, 15362306a36Sopenharmony_ci }, { 15462306a36Sopenharmony_ci .desc = "key32", 15562306a36Sopenharmony_ci .code = KEY_F10, 15662306a36Sopenharmony_ci .active_low = 1, 15762306a36Sopenharmony_ci }, { 15862306a36Sopenharmony_ci .desc = "key31", 15962306a36Sopenharmony_ci .code = KEY_F9, 16062306a36Sopenharmony_ci .active_low = 1, 16162306a36Sopenharmony_ci }, { 16262306a36Sopenharmony_ci .desc = "key24", 16362306a36Sopenharmony_ci .code = KEY_F8, 16462306a36Sopenharmony_ci .active_low = 1, 16562306a36Sopenharmony_ci }, { 16662306a36Sopenharmony_ci .desc = "key23", 16762306a36Sopenharmony_ci .code = KEY_F7, 16862306a36Sopenharmony_ci .active_low = 1, 16962306a36Sopenharmony_ci }, { 17062306a36Sopenharmony_ci .desc = "key22", 17162306a36Sopenharmony_ci .code = KEY_F6, 17262306a36Sopenharmony_ci .active_low = 1, 17362306a36Sopenharmony_ci }, { 17462306a36Sopenharmony_ci .desc = "key21", 17562306a36Sopenharmony_ci .code = KEY_F5, 17662306a36Sopenharmony_ci .active_low = 1, 17762306a36Sopenharmony_ci }, { 17862306a36Sopenharmony_ci .desc = "key14", 17962306a36Sopenharmony_ci .code = KEY_F4, 18062306a36Sopenharmony_ci .active_low = 1, 18162306a36Sopenharmony_ci }, { 18262306a36Sopenharmony_ci .desc = "key13", 18362306a36Sopenharmony_ci .code = KEY_F3, 18462306a36Sopenharmony_ci .active_low = 1, 18562306a36Sopenharmony_ci }, { 18662306a36Sopenharmony_ci .desc = "key12", 18762306a36Sopenharmony_ci .code = KEY_F2, 18862306a36Sopenharmony_ci .active_low = 1, 18962306a36Sopenharmony_ci }, { 19062306a36Sopenharmony_ci .desc = "key11", 19162306a36Sopenharmony_ci .code = KEY_F1, 19262306a36Sopenharmony_ci .active_low = 1, 19362306a36Sopenharmony_ci }, 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistatic struct gpio_keys_platform_data baseboard_buttons_data = { 19762306a36Sopenharmony_ci .buttons = baseboard_buttons, 19862306a36Sopenharmony_ci .nbuttons = ARRAY_SIZE(baseboard_buttons), 19962306a36Sopenharmony_ci}; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistatic struct platform_device baseboard_buttons_device = { 20262306a36Sopenharmony_ci .name = "gpio-keys", 20362306a36Sopenharmony_ci .id = -1, 20462306a36Sopenharmony_ci .dev = { 20562306a36Sopenharmony_ci .platform_data = &baseboard_buttons_data, 20662306a36Sopenharmony_ci }, 20762306a36Sopenharmony_ci}; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistatic struct platform_device *x3proto_devices[] __initdata = { 21062306a36Sopenharmony_ci &heartbeat_device, 21162306a36Sopenharmony_ci &smc91x_device, 21262306a36Sopenharmony_ci &r8a66597_usb_host_device, 21362306a36Sopenharmony_ci &m66592_usb_peripheral_device, 21462306a36Sopenharmony_ci &baseboard_buttons_device, 21562306a36Sopenharmony_ci}; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_cistatic void __init x3proto_init_irq(void) 21862306a36Sopenharmony_ci{ 21962306a36Sopenharmony_ci plat_irq_setup_pins(IRQ_MODE_IRL3210); 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci /* Set ICR0.LVLMODE */ 22262306a36Sopenharmony_ci __raw_writel(__raw_readl(0xfe410000) | (1 << 21), 0xfe410000); 22362306a36Sopenharmony_ci} 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistatic int __init x3proto_devices_setup(void) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci int ret, i; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci /* 23062306a36Sopenharmony_ci * IRLs are only needed for ILSEL mappings, so flip over the INTC 23162306a36Sopenharmony_ci * pins at a later point to enable the GPIOs to settle. 23262306a36Sopenharmony_ci */ 23362306a36Sopenharmony_ci x3proto_init_irq(); 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci /* 23662306a36Sopenharmony_ci * Now that ILSELs are available, set up the baseboard GPIOs. 23762306a36Sopenharmony_ci */ 23862306a36Sopenharmony_ci ret = x3proto_gpio_setup(); 23962306a36Sopenharmony_ci if (unlikely(ret)) 24062306a36Sopenharmony_ci return ret; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci /* 24362306a36Sopenharmony_ci * Propagate dynamic GPIOs for the baseboard button device. 24462306a36Sopenharmony_ci */ 24562306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(baseboard_buttons); i++) 24662306a36Sopenharmony_ci baseboard_buttons[i].gpio = x3proto_gpio_chip.base + i; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci r8a66597_usb_host_resources[1].start = 24962306a36Sopenharmony_ci r8a66597_usb_host_resources[1].end = ilsel_enable(ILSEL_USBH_I); 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci m66592_usb_peripheral_resources[1].start = 25262306a36Sopenharmony_ci m66592_usb_peripheral_resources[1].end = ilsel_enable(ILSEL_USBP_I); 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci smc91x_resources[1].start = 25562306a36Sopenharmony_ci smc91x_resources[1].end = ilsel_enable(ILSEL_LAN); 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci return platform_add_devices(x3proto_devices, 25862306a36Sopenharmony_ci ARRAY_SIZE(x3proto_devices)); 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_cidevice_initcall(x3proto_devices_setup); 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_cistatic void __init x3proto_setup(char **cmdline_p) 26362306a36Sopenharmony_ci{ 26462306a36Sopenharmony_ci register_smp_ops(&shx3_smp_ops); 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic struct sh_machine_vector mv_x3proto __initmv = { 26862306a36Sopenharmony_ci .mv_name = "x3proto", 26962306a36Sopenharmony_ci .mv_setup = x3proto_setup, 27062306a36Sopenharmony_ci}; 271