1/* 2 * arch/sh/boards/mach-x3proto/setup.c 3 * 4 * Renesas SH-X3 Prototype Board Support. 5 * 6 * Copyright (C) 2007 - 2010 Paul Mundt 7 * 8 * This file is subject to the terms and conditions of the GNU General Public 9 * License. See the file "COPYING" in the main directory of this archive 10 * for more details. 11 */ 12#include <linux/init.h> 13#include <linux/platform_device.h> 14#include <linux/kernel.h> 15#include <linux/io.h> 16#include <linux/smc91x.h> 17#include <linux/irq.h> 18#include <linux/interrupt.h> 19#include <linux/input.h> 20#include <linux/usb/r8a66597.h> 21#include <linux/usb/m66592.h> 22#include <linux/gpio.h> 23#include <linux/gpio_keys.h> 24#include <mach/ilsel.h> 25#include <mach/hardware.h> 26#include <asm/smp-ops.h> 27 28static struct resource heartbeat_resources[] = { 29 [0] = { 30 .start = 0xb8140020, 31 .end = 0xb8140020, 32 .flags = IORESOURCE_MEM, 33 }, 34}; 35 36static struct platform_device heartbeat_device = { 37 .name = "heartbeat", 38 .id = -1, 39 .num_resources = ARRAY_SIZE(heartbeat_resources), 40 .resource = heartbeat_resources, 41}; 42 43static struct smc91x_platdata smc91x_info = { 44 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, 45}; 46 47static struct resource smc91x_resources[] = { 48 [0] = { 49 .start = 0x18000300, 50 .end = 0x18000300 + 0x10 - 1, 51 .flags = IORESOURCE_MEM, 52 }, 53 [1] = { 54 /* Filled in by ilsel */ 55 .flags = IORESOURCE_IRQ, 56 }, 57}; 58 59static struct platform_device smc91x_device = { 60 .name = "smc91x", 61 .id = -1, 62 .resource = smc91x_resources, 63 .num_resources = ARRAY_SIZE(smc91x_resources), 64 .dev = { 65 .platform_data = &smc91x_info, 66 }, 67}; 68 69static struct r8a66597_platdata r8a66597_data = { 70 .xtal = R8A66597_PLATDATA_XTAL_12MHZ, 71 .vif = 1, 72}; 73 74static struct resource r8a66597_usb_host_resources[] = { 75 [0] = { 76 .start = 0x18040000, 77 .end = 0x18080000 - 1, 78 .flags = IORESOURCE_MEM, 79 }, 80 [1] = { 81 /* Filled in by ilsel */ 82 .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 83 }, 84}; 85 86static struct platform_device r8a66597_usb_host_device = { 87 .name = "r8a66597_hcd", 88 .id = -1, 89 .dev = { 90 .dma_mask = NULL, /* don't use dma */ 91 .coherent_dma_mask = 0xffffffff, 92 .platform_data = &r8a66597_data, 93 }, 94 .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), 95 .resource = r8a66597_usb_host_resources, 96}; 97 98static struct m66592_platdata usbf_platdata = { 99 .xtal = M66592_PLATDATA_XTAL_24MHZ, 100 .vif = 1, 101}; 102 103static struct resource m66592_usb_peripheral_resources[] = { 104 [0] = { 105 .name = "m66592_udc", 106 .start = 0x18080000, 107 .end = 0x180c0000 - 1, 108 .flags = IORESOURCE_MEM, 109 }, 110 [1] = { 111 .name = "m66592_udc", 112 /* Filled in by ilsel */ 113 .flags = IORESOURCE_IRQ, 114 }, 115}; 116 117static struct platform_device m66592_usb_peripheral_device = { 118 .name = "m66592_udc", 119 .id = -1, 120 .dev = { 121 .dma_mask = NULL, /* don't use dma */ 122 .coherent_dma_mask = 0xffffffff, 123 .platform_data = &usbf_platdata, 124 }, 125 .num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources), 126 .resource = m66592_usb_peripheral_resources, 127}; 128 129static struct gpio_keys_button baseboard_buttons[NR_BASEBOARD_GPIOS] = { 130 { 131 .desc = "key44", 132 .code = KEY_POWER, 133 .active_low = 1, 134 .wakeup = 1, 135 }, { 136 .desc = "key43", 137 .code = KEY_SUSPEND, 138 .active_low = 1, 139 .wakeup = 1, 140 }, { 141 .desc = "key42", 142 .code = KEY_KATAKANAHIRAGANA, 143 .active_low = 1, 144 }, { 145 .desc = "key41", 146 .code = KEY_SWITCHVIDEOMODE, 147 .active_low = 1, 148 }, { 149 .desc = "key34", 150 .code = KEY_F12, 151 .active_low = 1, 152 }, { 153 .desc = "key33", 154 .code = KEY_F11, 155 .active_low = 1, 156 }, { 157 .desc = "key32", 158 .code = KEY_F10, 159 .active_low = 1, 160 }, { 161 .desc = "key31", 162 .code = KEY_F9, 163 .active_low = 1, 164 }, { 165 .desc = "key24", 166 .code = KEY_F8, 167 .active_low = 1, 168 }, { 169 .desc = "key23", 170 .code = KEY_F7, 171 .active_low = 1, 172 }, { 173 .desc = "key22", 174 .code = KEY_F6, 175 .active_low = 1, 176 }, { 177 .desc = "key21", 178 .code = KEY_F5, 179 .active_low = 1, 180 }, { 181 .desc = "key14", 182 .code = KEY_F4, 183 .active_low = 1, 184 }, { 185 .desc = "key13", 186 .code = KEY_F3, 187 .active_low = 1, 188 }, { 189 .desc = "key12", 190 .code = KEY_F2, 191 .active_low = 1, 192 }, { 193 .desc = "key11", 194 .code = KEY_F1, 195 .active_low = 1, 196 }, 197}; 198 199static struct gpio_keys_platform_data baseboard_buttons_data = { 200 .buttons = baseboard_buttons, 201 .nbuttons = ARRAY_SIZE(baseboard_buttons), 202}; 203 204static struct platform_device baseboard_buttons_device = { 205 .name = "gpio-keys", 206 .id = -1, 207 .dev = { 208 .platform_data = &baseboard_buttons_data, 209 }, 210}; 211 212static struct platform_device *x3proto_devices[] __initdata = { 213 &heartbeat_device, 214 &smc91x_device, 215 &r8a66597_usb_host_device, 216 &m66592_usb_peripheral_device, 217 &baseboard_buttons_device, 218}; 219 220static void __init x3proto_init_irq(void) 221{ 222 plat_irq_setup_pins(IRQ_MODE_IRL3210); 223 224 /* Set ICR0.LVLMODE */ 225 __raw_writel(__raw_readl(0xfe410000) | (1 << 21), 0xfe410000); 226} 227 228static int __init x3proto_devices_setup(void) 229{ 230 int ret, i; 231 232 /* 233 * IRLs are only needed for ILSEL mappings, so flip over the INTC 234 * pins at a later point to enable the GPIOs to settle. 235 */ 236 x3proto_init_irq(); 237 238 /* 239 * Now that ILSELs are available, set up the baseboard GPIOs. 240 */ 241 ret = x3proto_gpio_setup(); 242 if (unlikely(ret)) 243 return ret; 244 245 /* 246 * Propagate dynamic GPIOs for the baseboard button device. 247 */ 248 for (i = 0; i < ARRAY_SIZE(baseboard_buttons); i++) 249 baseboard_buttons[i].gpio = x3proto_gpio_chip.base + i; 250 251 r8a66597_usb_host_resources[1].start = 252 r8a66597_usb_host_resources[1].end = ilsel_enable(ILSEL_USBH_I); 253 254 m66592_usb_peripheral_resources[1].start = 255 m66592_usb_peripheral_resources[1].end = ilsel_enable(ILSEL_USBP_I); 256 257 smc91x_resources[1].start = 258 smc91x_resources[1].end = ilsel_enable(ILSEL_LAN); 259 260 return platform_add_devices(x3proto_devices, 261 ARRAY_SIZE(x3proto_devices)); 262} 263device_initcall(x3proto_devices_setup); 264 265static void __init x3proto_setup(char **cmdline_p) 266{ 267 register_smp_ops(&shx3_smp_ops); 268} 269 270static struct sh_machine_vector mv_x3proto __initmv = { 271 .mv_name = "x3proto", 272 .mv_setup = x3proto_setup, 273}; 274