1/* 2 * linux/arch/arm/mach-omap1/board-h2.c 3 * 4 * Board specific inits for OMAP-1610 H2 5 * 6 * Copyright (C) 2001 RidgeRun, Inc. 7 * Author: Greg Lonnon <glonnon@ridgerun.com> 8 * 9 * Copyright (C) 2002 MontaVista Software, Inc. 10 * 11 * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6 12 * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com> 13 * 14 * H2 specific changes and cleanup 15 * Copyright (C) 2004 Nokia Corporation by Imre Deak <imre.deak@nokia.com> 16 * 17 * This program is free software; you can redistribute it and/or modify 18 * it under the terms of the GNU General Public License version 2 as 19 * published by the Free Software Foundation. 20 */ 21 22#include <linux/kernel.h> 23#include <linux/init.h> 24#include <linux/platform_device.h> 25#include <linux/delay.h> 26#include <linux/mtd/mtd.h> 27#include <linux/mtd/nand.h> 28#include <linux/mtd/partitions.h> 29#include <linux/input.h> 30#include <linux/workqueue.h> 31 32#include <asm/hardware.h> 33#include <asm/mach-types.h> 34#include <asm/mach/arch.h> 35#include <asm/mach/flash.h> 36#include <asm/mach/map.h> 37 38#include <asm/arch/gpio.h> 39#include <asm/arch/mux.h> 40#include <asm/arch/tc.h> 41#include <asm/arch/irda.h> 42#include <asm/arch/usb.h> 43#include <asm/arch/keypad.h> 44#include <asm/arch/common.h> 45#include <asm/arch/mcbsp.h> 46#include <asm/arch/omap-alsa.h> 47 48extern int omap_gpio_init(void); 49 50static int h2_keymap[] = { 51 KEY(0, 0, KEY_LEFT), 52 KEY(0, 1, KEY_RIGHT), 53 KEY(0, 2, KEY_3), 54 KEY(0, 3, KEY_F10), 55 KEY(0, 4, KEY_F5), 56 KEY(0, 5, KEY_9), 57 KEY(1, 0, KEY_DOWN), 58 KEY(1, 1, KEY_UP), 59 KEY(1, 2, KEY_2), 60 KEY(1, 3, KEY_F9), 61 KEY(1, 4, KEY_F7), 62 KEY(1, 5, KEY_0), 63 KEY(2, 0, KEY_ENTER), 64 KEY(2, 1, KEY_6), 65 KEY(2, 2, KEY_1), 66 KEY(2, 3, KEY_F2), 67 KEY(2, 4, KEY_F6), 68 KEY(2, 5, KEY_HOME), 69 KEY(3, 0, KEY_8), 70 KEY(3, 1, KEY_5), 71 KEY(3, 2, KEY_F12), 72 KEY(3, 3, KEY_F3), 73 KEY(3, 4, KEY_F8), 74 KEY(3, 5, KEY_END), 75 KEY(4, 0, KEY_7), 76 KEY(4, 1, KEY_4), 77 KEY(4, 2, KEY_F11), 78 KEY(4, 3, KEY_F1), 79 KEY(4, 4, KEY_F4), 80 KEY(4, 5, KEY_ESC), 81 KEY(5, 0, KEY_F13), 82 KEY(5, 1, KEY_F14), 83 KEY(5, 2, KEY_F15), 84 KEY(5, 3, KEY_F16), 85 KEY(5, 4, KEY_SLEEP), 86 0 87}; 88 89static struct mtd_partition h2_nor_partitions[] = { 90 /* bootloader (U-Boot, etc) in first sector */ 91 { 92 .name = "bootloader", 93 .offset = 0, 94 .size = SZ_128K, 95 .mask_flags = MTD_WRITEABLE, /* force read-only */ 96 }, 97 /* bootloader params in the next sector */ 98 { 99 .name = "params", 100 .offset = MTDPART_OFS_APPEND, 101 .size = SZ_128K, 102 .mask_flags = 0, 103 }, 104 /* kernel */ 105 { 106 .name = "kernel", 107 .offset = MTDPART_OFS_APPEND, 108 .size = SZ_2M, 109 .mask_flags = 0 110 }, 111 /* file system */ 112 { 113 .name = "filesystem", 114 .offset = MTDPART_OFS_APPEND, 115 .size = MTDPART_SIZ_FULL, 116 .mask_flags = 0 117 } 118}; 119 120static struct flash_platform_data h2_nor_data = { 121 .map_name = "cfi_probe", 122 .width = 2, 123 .parts = h2_nor_partitions, 124 .nr_parts = ARRAY_SIZE(h2_nor_partitions), 125}; 126 127static struct resource h2_nor_resource = { 128 /* This is on CS3, wherever it's mapped */ 129 .flags = IORESOURCE_MEM, 130}; 131 132static struct platform_device h2_nor_device = { 133 .name = "omapflash", 134 .id = 0, 135 .dev = { 136 .platform_data = &h2_nor_data, 137 }, 138 .num_resources = 1, 139 .resource = &h2_nor_resource, 140}; 141 142static struct resource h2_smc91x_resources[] = { 143 [0] = { 144 .start = OMAP1610_ETHR_START, /* Physical */ 145 .end = OMAP1610_ETHR_START + 0xf, 146 .flags = IORESOURCE_MEM, 147 }, 148 [1] = { 149 .start = OMAP_GPIO_IRQ(0), 150 .end = OMAP_GPIO_IRQ(0), 151 .flags = IORESOURCE_IRQ, 152 }, 153}; 154 155static struct platform_device h2_smc91x_device = { 156 .name = "smc91x", 157 .id = 0, 158 .num_resources = ARRAY_SIZE(h2_smc91x_resources), 159 .resource = h2_smc91x_resources, 160}; 161 162static struct resource h2_kp_resources[] = { 163 [0] = { 164 .start = INT_KEYBOARD, 165 .end = INT_KEYBOARD, 166 .flags = IORESOURCE_IRQ, 167 }, 168}; 169 170static struct omap_kp_platform_data h2_kp_data = { 171 .rows = 8, 172 .cols = 8, 173 .keymap = h2_keymap, 174 .keymapsize = ARRAY_SIZE(h2_keymap), 175 .rep = 1, 176 .delay = 9, 177 .dbounce = 1, 178}; 179 180static struct platform_device h2_kp_device = { 181 .name = "omap-keypad", 182 .id = -1, 183 .dev = { 184 .platform_data = &h2_kp_data, 185 }, 186 .num_resources = ARRAY_SIZE(h2_kp_resources), 187 .resource = h2_kp_resources, 188}; 189 190#define H2_IRDA_FIRSEL_GPIO_PIN 17 191 192#if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) 193static int h2_transceiver_mode(struct device *dev, int state) 194{ 195 if (state & IR_SIRMODE) 196 omap_set_gpio_dataout(H2_IRDA_FIRSEL_GPIO_PIN, 0); 197 else /* MIR/FIR */ 198 omap_set_gpio_dataout(H2_IRDA_FIRSEL_GPIO_PIN, 1); 199 200 return 0; 201} 202#endif 203 204static struct omap_irda_config h2_irda_data = { 205 .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, 206 .rx_channel = OMAP_DMA_UART3_RX, 207 .tx_channel = OMAP_DMA_UART3_TX, 208 .dest_start = UART3_THR, 209 .src_start = UART3_RHR, 210 .tx_trigger = 0, 211 .rx_trigger = 0, 212}; 213 214static struct resource h2_irda_resources[] = { 215 [0] = { 216 .start = INT_UART3, 217 .end = INT_UART3, 218 .flags = IORESOURCE_IRQ, 219 }, 220}; 221static struct platform_device h2_irda_device = { 222 .name = "omapirda", 223 .id = 0, 224 .dev = { 225 .platform_data = &h2_irda_data, 226 }, 227 .num_resources = ARRAY_SIZE(h2_irda_resources), 228 .resource = h2_irda_resources, 229}; 230 231static struct platform_device h2_lcd_device = { 232 .name = "lcd_h2", 233 .id = -1, 234}; 235 236static struct omap_mcbsp_reg_cfg mcbsp_regs = { 237 .spcr2 = FREE | FRST | GRST | XRST | XINTM(3), 238 .spcr1 = RINTM(3) | RRST, 239 .rcr2 = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) | 240 RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(1), 241 .rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16), 242 .xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) | 243 XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG, 244 .xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16), 245 .srgr1 = FWID(15), 246 .srgr2 = GSYNC | CLKSP | FSGM | FPER(31), 247 248 .pcr0 = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP, 249 //.pcr0 = CLKXP | CLKRP, /* mcbsp: slave */ 250}; 251 252static struct omap_alsa_codec_config alsa_config = { 253 .name = "H2 TSC2101", 254 .mcbsp_regs_alsa = &mcbsp_regs, 255 .codec_configure_dev = NULL, // tsc2101_configure, 256 .codec_set_samplerate = NULL, // tsc2101_set_samplerate, 257 .codec_clock_setup = NULL, // tsc2101_clock_setup, 258 .codec_clock_on = NULL, // tsc2101_clock_on, 259 .codec_clock_off = NULL, // tsc2101_clock_off, 260 .get_default_samplerate = NULL, // tsc2101_get_default_samplerate, 261}; 262 263static struct platform_device h2_mcbsp1_device = { 264 .name = "omap_alsa_mcbsp", 265 .id = 1, 266 .dev = { 267 .platform_data = &alsa_config, 268 }, 269}; 270 271static struct platform_device *h2_devices[] __initdata = { 272 &h2_nor_device, 273 &h2_smc91x_device, 274 &h2_irda_device, 275 &h2_kp_device, 276 &h2_lcd_device, 277 &h2_mcbsp1_device, 278}; 279 280static void __init h2_init_smc91x(void) 281{ 282 if ((omap_request_gpio(0)) < 0) { 283 printk("Error requesting gpio 0 for smc91x irq\n"); 284 return; 285 } 286} 287 288static void __init h2_init_irq(void) 289{ 290 omap1_init_common_hw(); 291 omap_init_irq(); 292 omap_gpio_init(); 293 h2_init_smc91x(); 294} 295 296static struct omap_usb_config h2_usb_config __initdata = { 297 /* usb1 has a Mini-AB port and external isp1301 transceiver */ 298 .otg = 2, 299 300#ifdef CONFIG_USB_GADGET_OMAP 301 .hmc_mode = 19, // 0:host(off) 1:dev|otg 2:disabled 302 // .hmc_mode = 21, // 0:host(off) 1:dev(loopback) 2:host(loopback) 303#elif defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) 304 /* needs OTG cable, or NONSTANDARD (B-to-MiniB) */ 305 .hmc_mode = 20, // 1:dev|otg(off) 1:host 2:disabled 306#endif 307 308 .pins[1] = 3, 309}; 310 311static struct omap_mmc_config h2_mmc_config __initdata = { 312 .mmc [0] = { 313 .enabled = 1, 314 .wire4 = 1, 315 .wp_pin = OMAP_MPUIO(3), 316 .power_pin = -1, /* tps65010 gpio3 */ 317 .switch_pin = OMAP_MPUIO(1), 318 }, 319}; 320 321static struct omap_uart_config h2_uart_config __initdata = { 322 .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), 323}; 324 325static struct omap_lcd_config h2_lcd_config __initdata = { 326 .ctrl_name = "internal", 327}; 328 329static struct omap_board_config_kernel h2_config[] __initdata = { 330 { OMAP_TAG_USB, &h2_usb_config }, 331 { OMAP_TAG_MMC, &h2_mmc_config }, 332 { OMAP_TAG_UART, &h2_uart_config }, 333 { OMAP_TAG_LCD, &h2_lcd_config }, 334}; 335 336static void __init h2_init(void) 337{ 338 h2_nor_resource.end = h2_nor_resource.start = omap_cs3_phys(); 339 h2_nor_resource.end += SZ_32M - 1; 340 341 omap_cfg_reg(L3_1610_FLASH_CS2B_OE); 342 omap_cfg_reg(M8_1610_FLASH_CS2B_WE); 343 344 /* MMC: card detect and WP */ 345 // omap_cfg_reg(U19_ARMIO1); /* CD */ 346 omap_cfg_reg(BALLOUT_V8_ARMIO3); /* WP */ 347 348 /* Irda */ 349#if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) 350 omap_writel(omap_readl(FUNC_MUX_CTRL_A) | 7, FUNC_MUX_CTRL_A); 351 if (!(omap_request_gpio(H2_IRDA_FIRSEL_GPIO_PIN))) { 352 omap_set_gpio_direction(H2_IRDA_FIRSEL_GPIO_PIN, 0); 353 h2_irda_data.transceiver_mode = h2_transceiver_mode; 354 } 355#endif 356 357 platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices)); 358 omap_board_config = h2_config; 359 omap_board_config_size = ARRAY_SIZE(h2_config); 360 omap_serial_init(); 361} 362 363static void __init h2_map_io(void) 364{ 365 omap1_map_common_io(); 366} 367 368MACHINE_START(OMAP_H2, "TI-H2") 369 /* Maintainer: Imre Deak <imre.deak@nokia.com> */ 370 .phys_io = 0xfff00000, 371 .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc, 372 .boot_params = 0x10000100, 373 .map_io = h2_map_io, 374 .init_irq = h2_init_irq, 375 .init_machine = h2_init, 376 .timer = &omap_timer, 377MACHINE_END 378