1/* 2 * linux/arch/arm/mach-omap1/board-fsample.c 3 * 4 * Modified from board-perseus2.c 5 * 6 * Original OMAP730 support by Jean Pihet <j-pihet@ti.com> 7 * Updated for 2.6 by Kevin Hilman <kjh@hilman.org> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14#include <linux/kernel.h> 15#include <linux/init.h> 16#include <linux/platform_device.h> 17#include <linux/delay.h> 18#include <linux/mtd/mtd.h> 19#include <linux/mtd/nand.h> 20#include <linux/mtd/partitions.h> 21#include <linux/input.h> 22 23#include <asm/hardware.h> 24#include <asm/mach-types.h> 25#include <asm/mach/arch.h> 26#include <asm/mach/flash.h> 27#include <asm/mach/map.h> 28 29#include <asm/arch/tc.h> 30#include <asm/arch/gpio.h> 31#include <asm/arch/mux.h> 32#include <asm/arch/fpga.h> 33#include <asm/arch/keypad.h> 34#include <asm/arch/common.h> 35#include <asm/arch/board.h> 36#include <asm/arch/board-fsample.h> 37 38static int fsample_keymap[] = { 39 KEY(0,0,KEY_UP), 40 KEY(0,1,KEY_RIGHT), 41 KEY(0,2,KEY_LEFT), 42 KEY(0,3,KEY_DOWN), 43 KEY(0,4,KEY_CENTER), 44 KEY(0,5,KEY_0_5), 45 KEY(1,0,KEY_SOFT2), 46 KEY(1,1,KEY_SEND), 47 KEY(1,2,KEY_END), 48 KEY(1,3,KEY_VOLUMEDOWN), 49 KEY(1,4,KEY_VOLUMEUP), 50 KEY(1,5,KEY_RECORD), 51 KEY(2,0,KEY_SOFT1), 52 KEY(2,1,KEY_3), 53 KEY(2,2,KEY_6), 54 KEY(2,3,KEY_9), 55 KEY(2,4,KEY_SHARP), 56 KEY(2,5,KEY_2_5), 57 KEY(3,0,KEY_BACK), 58 KEY(3,1,KEY_2), 59 KEY(3,2,KEY_5), 60 KEY(3,3,KEY_8), 61 KEY(3,4,KEY_0), 62 KEY(3,5,KEY_HEADSETHOOK), 63 KEY(4,0,KEY_HOME), 64 KEY(4,1,KEY_1), 65 KEY(4,2,KEY_4), 66 KEY(4,3,KEY_7), 67 KEY(4,4,KEY_STAR), 68 KEY(4,5,KEY_POWER), 69 0 70}; 71 72static struct resource smc91x_resources[] = { 73 [0] = { 74 .start = H2P2_DBG_FPGA_ETHR_START, /* Physical */ 75 .end = H2P2_DBG_FPGA_ETHR_START + 0xf, 76 .flags = IORESOURCE_MEM, 77 }, 78 [1] = { 79 .start = INT_730_MPU_EXT_NIRQ, 80 .end = 0, 81 .flags = IORESOURCE_IRQ, 82 }, 83}; 84 85static struct mtd_partition nor_partitions[] = { 86 /* bootloader (U-Boot, etc) in first sector */ 87 { 88 .name = "bootloader", 89 .offset = 0, 90 .size = SZ_128K, 91 .mask_flags = MTD_WRITEABLE, /* force read-only */ 92 }, 93 /* bootloader params in the next sector */ 94 { 95 .name = "params", 96 .offset = MTDPART_OFS_APPEND, 97 .size = SZ_128K, 98 .mask_flags = 0, 99 }, 100 /* kernel */ 101 { 102 .name = "kernel", 103 .offset = MTDPART_OFS_APPEND, 104 .size = SZ_2M, 105 .mask_flags = 0 106 }, 107 /* rest of flash is a file system */ 108 { 109 .name = "rootfs", 110 .offset = MTDPART_OFS_APPEND, 111 .size = MTDPART_SIZ_FULL, 112 .mask_flags = 0 113 }, 114}; 115 116static struct flash_platform_data nor_data = { 117 .map_name = "cfi_probe", 118 .width = 2, 119 .parts = nor_partitions, 120 .nr_parts = ARRAY_SIZE(nor_partitions), 121}; 122 123static struct resource nor_resource = { 124 .start = OMAP_CS0_PHYS, 125 .end = OMAP_CS0_PHYS + SZ_32M - 1, 126 .flags = IORESOURCE_MEM, 127}; 128 129static struct platform_device nor_device = { 130 .name = "omapflash", 131 .id = 0, 132 .dev = { 133 .platform_data = &nor_data, 134 }, 135 .num_resources = 1, 136 .resource = &nor_resource, 137}; 138 139static struct nand_platform_data nand_data = { 140 .options = NAND_SAMSUNG_LP_OPTIONS, 141}; 142 143static struct resource nand_resource = { 144 .start = OMAP_CS3_PHYS, 145 .end = OMAP_CS3_PHYS + SZ_4K - 1, 146 .flags = IORESOURCE_MEM, 147}; 148 149static struct platform_device nand_device = { 150 .name = "omapnand", 151 .id = 0, 152 .dev = { 153 .platform_data = &nand_data, 154 }, 155 .num_resources = 1, 156 .resource = &nand_resource, 157}; 158 159static struct platform_device smc91x_device = { 160 .name = "smc91x", 161 .id = 0, 162 .num_resources = ARRAY_SIZE(smc91x_resources), 163 .resource = smc91x_resources, 164}; 165 166static struct resource kp_resources[] = { 167 [0] = { 168 .start = INT_730_MPUIO_KEYPAD, 169 .end = INT_730_MPUIO_KEYPAD, 170 .flags = IORESOURCE_IRQ, 171 }, 172}; 173 174static struct omap_kp_platform_data kp_data = { 175 .rows = 8, 176 .cols = 8, 177 .keymap = fsample_keymap, 178 .keymapsize = ARRAY_SIZE(fsample_keymap), 179 .delay = 4, 180}; 181 182static struct platform_device kp_device = { 183 .name = "omap-keypad", 184 .id = -1, 185 .dev = { 186 .platform_data = &kp_data, 187 }, 188 .num_resources = ARRAY_SIZE(kp_resources), 189 .resource = kp_resources, 190}; 191 192static struct platform_device lcd_device = { 193 .name = "lcd_p2", 194 .id = -1, 195}; 196 197static struct platform_device *devices[] __initdata = { 198 &nor_device, 199 &nand_device, 200 &smc91x_device, 201 &kp_device, 202 &lcd_device, 203}; 204 205#define P2_NAND_RB_GPIO_PIN 62 206 207static int nand_dev_ready(struct nand_platform_data *data) 208{ 209 return omap_get_gpio_datain(P2_NAND_RB_GPIO_PIN); 210} 211 212static struct omap_uart_config fsample_uart_config __initdata = { 213 .enabled_uarts = ((1 << 0) | (1 << 1)), 214}; 215 216static struct omap_lcd_config fsample_lcd_config __initdata = { 217 .ctrl_name = "internal", 218}; 219 220static struct omap_board_config_kernel fsample_config[] = { 221 { OMAP_TAG_UART, &fsample_uart_config }, 222 { OMAP_TAG_LCD, &fsample_lcd_config }, 223}; 224 225static void __init omap_fsample_init(void) 226{ 227 if (!(omap_request_gpio(P2_NAND_RB_GPIO_PIN))) 228 nand_data.dev_ready = nand_dev_ready; 229 230 omap_cfg_reg(L3_1610_FLASH_CS2B_OE); 231 omap_cfg_reg(M8_1610_FLASH_CS2B_WE); 232 233 platform_add_devices(devices, ARRAY_SIZE(devices)); 234 235 omap_board_config = fsample_config; 236 omap_board_config_size = ARRAY_SIZE(fsample_config); 237 omap_serial_init(); 238} 239 240static void __init fsample_init_smc91x(void) 241{ 242 fpga_write(1, H2P2_DBG_FPGA_LAN_RESET); 243 mdelay(50); 244 fpga_write(fpga_read(H2P2_DBG_FPGA_LAN_RESET) & ~1, 245 H2P2_DBG_FPGA_LAN_RESET); 246 mdelay(50); 247} 248 249static void __init omap_fsample_init_irq(void) 250{ 251 omap1_init_common_hw(); 252 omap_init_irq(); 253 omap_gpio_init(); 254 fsample_init_smc91x(); 255} 256 257/* Only FPGA needs to be mapped here. All others are done with ioremap */ 258static struct map_desc omap_fsample_io_desc[] __initdata = { 259 { 260 .virtual = H2P2_DBG_FPGA_BASE, 261 .pfn = __phys_to_pfn(H2P2_DBG_FPGA_START), 262 .length = H2P2_DBG_FPGA_SIZE, 263 .type = MT_DEVICE 264 }, 265 { 266 .virtual = FSAMPLE_CPLD_BASE, 267 .pfn = __phys_to_pfn(FSAMPLE_CPLD_START), 268 .length = FSAMPLE_CPLD_SIZE, 269 .type = MT_DEVICE 270 } 271}; 272 273static void __init omap_fsample_map_io(void) 274{ 275 omap1_map_common_io(); 276 iotable_init(omap_fsample_io_desc, 277 ARRAY_SIZE(omap_fsample_io_desc)); 278 279 /* Early, board-dependent init */ 280 281 /* 282 * Hold GSM Reset until needed 283 */ 284 omap_writew(omap_readw(OMAP730_DSP_M_CTL) & ~1, OMAP730_DSP_M_CTL); 285 286 /* 287 * UARTs -> done automagically by 8250 driver 288 */ 289 290 /* 291 * CSx timings, GPIO Mux ... setup 292 */ 293 294 /* Flash: CS0 timings setup */ 295 omap_writel(0x0000fff3, OMAP730_FLASH_CFG_0); 296 omap_writel(0x00000088, OMAP730_FLASH_ACFG_0); 297 298 /* 299 * Ethernet support through the debug board 300 * CS1 timings setup 301 */ 302 omap_writel(0x0000fff3, OMAP730_FLASH_CFG_1); 303 omap_writel(0x00000000, OMAP730_FLASH_ACFG_1); 304 305 /* 306 * Configure MPU_EXT_NIRQ IO in IO_CONF9 register, 307 * It is used as the Ethernet controller interrupt 308 */ 309 omap_writel(omap_readl(OMAP730_IO_CONF_9) & 0x1FFFFFFF, OMAP730_IO_CONF_9); 310} 311 312MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample") 313/* Maintainer: Brian Swetland <swetland@google.com> */ 314 .phys_io = 0xfff00000, 315 .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc, 316 .boot_params = 0x10000100, 317 .map_io = omap_fsample_map_io, 318 .init_irq = omap_fsample_init_irq, 319 .init_machine = omap_fsample_init, 320 .timer = &omap_timer, 321MACHINE_END 322