1/* 2 * linux/arch/arm/mach-omap2/board-ldp.c 3 * 4 * Copyright (C) 2008 Texas Instruments Inc. 5 * Nishant Kamat <nskamat@ti.com> 6 * 7 * Modified from mach-omap2/board-3430sdp.c 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#include <linux/gpio.h> 14#include <linux/kernel.h> 15#include <linux/init.h> 16#include <linux/platform_device.h> 17#include <linux/delay.h> 18#include <linux/input.h> 19#include <linux/input/matrix_keypad.h> 20#include <linux/gpio_keys.h> 21#include <linux/workqueue.h> 22#include <linux/err.h> 23#include <linux/clk.h> 24#include <linux/spi/spi.h> 25#include <linux/regulator/fixed.h> 26#include <linux/regulator/machine.h> 27#include <linux/i2c/twl.h> 28#include <linux/io.h> 29#include <linux/smsc911x.h> 30#include <linux/mmc/host.h> 31#include <linux/usb/phy.h> 32#include <linux/platform_data/spi-omap2-mcspi.h> 33 34#include <asm/mach-types.h> 35#include <asm/mach/arch.h> 36#include <asm/mach/map.h> 37 38#include "common.h" 39#include "gpmc.h" 40#include "gpmc-smsc911x.h" 41 42#include <video/omapdss.h> 43#include <video/omap-panel-data.h> 44 45#include "board-flash.h" 46#include "mux.h" 47#include "hsmmc.h" 48#include "control.h" 49#include "common-board-devices.h" 50 51#define LDP_SMSC911X_CS 1 52#define LDP_SMSC911X_GPIO 152 53#define DEBUG_BASE 0x08000000 54#define LDP_ETHR_START DEBUG_BASE 55 56static uint32_t board_keymap[] = { 57 KEY(0, 0, KEY_1), 58 KEY(1, 0, KEY_2), 59 KEY(2, 0, KEY_3), 60 KEY(0, 1, KEY_4), 61 KEY(1, 1, KEY_5), 62 KEY(2, 1, KEY_6), 63 KEY(3, 1, KEY_F5), 64 KEY(0, 2, KEY_7), 65 KEY(1, 2, KEY_8), 66 KEY(2, 2, KEY_9), 67 KEY(3, 2, KEY_F6), 68 KEY(0, 3, KEY_F7), 69 KEY(1, 3, KEY_0), 70 KEY(2, 3, KEY_F8), 71 PERSISTENT_KEY(4, 5), 72 KEY(4, 4, KEY_VOLUMEUP), 73 KEY(5, 5, KEY_VOLUMEDOWN), 74 0 75}; 76 77static struct matrix_keymap_data board_map_data = { 78 .keymap = board_keymap, 79 .keymap_size = ARRAY_SIZE(board_keymap), 80}; 81 82static struct twl4030_keypad_data ldp_kp_twl4030_data = { 83 .keymap_data = &board_map_data, 84 .rows = 6, 85 .cols = 6, 86 .rep = 1, 87}; 88 89static struct gpio_keys_button ldp_gpio_keys_buttons[] = { 90 [0] = { 91 .code = KEY_ENTER, 92 .gpio = 101, 93 .desc = "enter sw", 94 .active_low = 1, 95 .debounce_interval = 30, 96 }, 97 [1] = { 98 .code = KEY_F1, 99 .gpio = 102, 100 .desc = "func 1", 101 .active_low = 1, 102 .debounce_interval = 30, 103 }, 104 [2] = { 105 .code = KEY_F2, 106 .gpio = 103, 107 .desc = "func 2", 108 .active_low = 1, 109 .debounce_interval = 30, 110 }, 111 [3] = { 112 .code = KEY_F3, 113 .gpio = 104, 114 .desc = "func 3", 115 .active_low = 1, 116 .debounce_interval = 30, 117 }, 118 [4] = { 119 .code = KEY_F4, 120 .gpio = 105, 121 .desc = "func 4", 122 .active_low = 1, 123 .debounce_interval = 30, 124 }, 125 [5] = { 126 .code = KEY_LEFT, 127 .gpio = 106, 128 .desc = "left sw", 129 .active_low = 1, 130 .debounce_interval = 30, 131 }, 132 [6] = { 133 .code = KEY_RIGHT, 134 .gpio = 107, 135 .desc = "right sw", 136 .active_low = 1, 137 .debounce_interval = 30, 138 }, 139 [7] = { 140 .code = KEY_UP, 141 .gpio = 108, 142 .desc = "up sw", 143 .active_low = 1, 144 .debounce_interval = 30, 145 }, 146 [8] = { 147 .code = KEY_DOWN, 148 .gpio = 109, 149 .desc = "down sw", 150 .active_low = 1, 151 .debounce_interval = 30, 152 }, 153}; 154 155static struct gpio_keys_platform_data ldp_gpio_keys = { 156 .buttons = ldp_gpio_keys_buttons, 157 .nbuttons = ARRAY_SIZE(ldp_gpio_keys_buttons), 158 .rep = 1, 159}; 160 161static struct platform_device ldp_gpio_keys_device = { 162 .name = "gpio-keys", 163 .id = -1, 164 .dev = { 165 .platform_data = &ldp_gpio_keys, 166 }, 167}; 168 169static struct omap_smsc911x_platform_data smsc911x_cfg = { 170 .cs = LDP_SMSC911X_CS, 171 .gpio_irq = LDP_SMSC911X_GPIO, 172 .gpio_reset = -EINVAL, 173 .flags = SMSC911X_USE_32BIT, 174}; 175 176static inline void __init ldp_init_smsc911x(void) 177{ 178 gpmc_smsc911x_init(&smsc911x_cfg); 179} 180 181/* LCD */ 182 183#define LCD_PANEL_RESET_GPIO 55 184#define LCD_PANEL_QVGA_GPIO 56 185 186static const struct display_timing ldp_lcd_videomode = { 187 .pixelclock = { 0, 5400000, 0 }, 188 189 .hactive = { 0, 240, 0 }, 190 .hfront_porch = { 0, 3, 0 }, 191 .hback_porch = { 0, 39, 0 }, 192 .hsync_len = { 0, 3, 0 }, 193 194 .vactive = { 0, 320, 0 }, 195 .vfront_porch = { 0, 2, 0 }, 196 .vback_porch = { 0, 7, 0 }, 197 .vsync_len = { 0, 1, 0 }, 198 199 .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW | 200 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE, 201}; 202 203static struct panel_dpi_platform_data ldp_lcd_pdata = { 204 .name = "lcd", 205 .source = "dpi.0", 206 207 .data_lines = 18, 208 209 .display_timing = &ldp_lcd_videomode, 210 211 .enable_gpio = -1, /* filled in code */ 212 .backlight_gpio = -1, /* filled in code */ 213}; 214 215static struct platform_device ldp_lcd_device = { 216 .name = "panel-dpi", 217 .id = 0, 218 .dev.platform_data = &ldp_lcd_pdata, 219}; 220 221static struct omap_dss_board_info ldp_dss_data = { 222 .default_display_name = "lcd", 223}; 224 225static void __init ldp_display_init(void) 226{ 227 int r; 228 229 static struct gpio gpios[] __initdata = { 230 {LCD_PANEL_RESET_GPIO, GPIOF_OUT_INIT_HIGH, "LCD RESET"}, 231 {LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "LCD QVGA"}, 232 }; 233 234 r = gpio_request_array(gpios, ARRAY_SIZE(gpios)); 235 if (r) { 236 pr_err("Cannot request LCD GPIOs, error %d\n", r); 237 return; 238 } 239 240 omap_display_init(&ldp_dss_data); 241} 242 243static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio) 244{ 245 int res; 246 247 /* LCD enable GPIO */ 248 ldp_lcd_pdata.enable_gpio = gpio + 7; 249 250 /* Backlight enable GPIO */ 251 ldp_lcd_pdata.backlight_gpio = gpio + 15; 252 253 res = platform_device_register(&ldp_lcd_device); 254 if (res) 255 pr_err("Unable to register LCD: %d\n", res); 256 257 return 0; 258} 259 260static struct twl4030_gpio_platform_data ldp_gpio_data = { 261 .setup = ldp_twl_gpio_setup, 262}; 263 264static struct regulator_consumer_supply ldp_vmmc1_supply[] = { 265 REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), 266}; 267 268/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ 269static struct regulator_init_data ldp_vmmc1 = { 270 .constraints = { 271 .min_uV = 1850000, 272 .max_uV = 3150000, 273 .valid_modes_mask = REGULATOR_MODE_NORMAL 274 | REGULATOR_MODE_STANDBY, 275 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE 276 | REGULATOR_CHANGE_MODE 277 | REGULATOR_CHANGE_STATUS, 278 }, 279 .num_consumer_supplies = ARRAY_SIZE(ldp_vmmc1_supply), 280 .consumer_supplies = ldp_vmmc1_supply, 281}; 282 283/* ads7846 on SPI */ 284static struct regulator_consumer_supply ldp_vaux1_supplies[] = { 285 REGULATOR_SUPPLY("vcc", "spi1.0"), 286}; 287 288/* VAUX1 */ 289static struct regulator_init_data ldp_vaux1 = { 290 .constraints = { 291 .min_uV = 3000000, 292 .max_uV = 3000000, 293 .apply_uV = true, 294 .valid_modes_mask = REGULATOR_MODE_NORMAL 295 | REGULATOR_MODE_STANDBY, 296 .valid_ops_mask = REGULATOR_CHANGE_MODE 297 | REGULATOR_CHANGE_STATUS, 298 }, 299 .num_consumer_supplies = ARRAY_SIZE(ldp_vaux1_supplies), 300 .consumer_supplies = ldp_vaux1_supplies, 301}; 302 303static struct regulator_consumer_supply ldp_vpll2_supplies[] = { 304 REGULATOR_SUPPLY("vdds_dsi", "omapdss"), 305 REGULATOR_SUPPLY("vdds_dsi", "omapdss_dpi.0"), 306 REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"), 307}; 308 309static struct regulator_init_data ldp_vpll2 = { 310 .constraints = { 311 .name = "VDVI", 312 .min_uV = 1800000, 313 .max_uV = 1800000, 314 .apply_uV = true, 315 .valid_modes_mask = REGULATOR_MODE_NORMAL 316 | REGULATOR_MODE_STANDBY, 317 .valid_ops_mask = REGULATOR_CHANGE_MODE 318 | REGULATOR_CHANGE_STATUS, 319 }, 320 .num_consumer_supplies = ARRAY_SIZE(ldp_vpll2_supplies), 321 .consumer_supplies = ldp_vpll2_supplies, 322}; 323 324static struct twl4030_platform_data ldp_twldata = { 325 /* platform_data for children goes here */ 326 .vmmc1 = &ldp_vmmc1, 327 .vaux1 = &ldp_vaux1, 328 .vpll2 = &ldp_vpll2, 329 .gpio = &ldp_gpio_data, 330 .keypad = &ldp_kp_twl4030_data, 331}; 332 333static int __init omap_i2c_init(void) 334{ 335 omap3_pmic_get_config(&ldp_twldata, 336 TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC, 0); 337 omap3_pmic_init("twl4030", &ldp_twldata); 338 omap_register_i2c_bus(2, 400, NULL, 0); 339 omap_register_i2c_bus(3, 400, NULL, 0); 340 return 0; 341} 342 343static struct omap2_hsmmc_info mmc[] __initdata = { 344 { 345 .mmc = 1, 346 .caps = MMC_CAP_4_BIT_DATA, 347 .gpio_cd = -EINVAL, 348 .gpio_wp = -EINVAL, 349 }, 350 {} /* Terminator */ 351}; 352 353static struct platform_device *ldp_devices[] __initdata = { 354 &ldp_gpio_keys_device, 355}; 356 357#ifdef CONFIG_OMAP_MUX 358static struct omap_board_mux board_mux[] __initdata = { 359 { .reg_offset = OMAP_MUX_TERMINATOR }, 360}; 361#endif 362 363static struct mtd_partition ldp_nand_partitions[] = { 364 /* All the partition sizes are listed in terms of NAND block size */ 365 { 366 .name = "X-Loader-NAND", 367 .offset = 0, 368 .size = 4 * (64 * 2048), /* 512KB, 0x80000 */ 369 .mask_flags = MTD_WRITEABLE, /* force read-only */ 370 }, 371 { 372 .name = "U-Boot-NAND", 373 .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */ 374 .size = 10 * (64 * 2048), /* 1.25MB, 0x140000 */ 375 .mask_flags = MTD_WRITEABLE, /* force read-only */ 376 }, 377 { 378 .name = "Boot Env-NAND", 379 .offset = MTDPART_OFS_APPEND, /* Offset = 0x1c0000 */ 380 .size = 2 * (64 * 2048), /* 256KB, 0x40000 */ 381 }, 382 { 383 .name = "Kernel-NAND", 384 .offset = MTDPART_OFS_APPEND, /* Offset = 0x0200000*/ 385 .size = 240 * (64 * 2048), /* 30M, 0x1E00000 */ 386 }, 387 { 388 .name = "File System - NAND", 389 .offset = MTDPART_OFS_APPEND, /* Offset = 0x2000000 */ 390 .size = MTDPART_SIZ_FULL, /* 96MB, 0x6000000 */ 391 }, 392 393}; 394 395static struct regulator_consumer_supply dummy_supplies[] = { 396 REGULATOR_SUPPLY("vddvario", "smsc911x.0"), 397 REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), 398}; 399 400static void __init omap_ldp_init(void) 401{ 402 regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); 403 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); 404 ldp_init_smsc911x(); 405 omap_i2c_init(); 406 platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices)); 407 omap_ads7846_init(1, 54, 310, NULL); 408 omap_serial_init(); 409 omap_sdrc_init(NULL, NULL); 410 usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); 411 usb_musb_init(NULL); 412 board_nand_init(ldp_nand_partitions, ARRAY_SIZE(ldp_nand_partitions), 413 0, 0, nand_default_timings); 414 415 omap_hsmmc_init(mmc); 416 ldp_display_init(); 417} 418 419MACHINE_START(OMAP_LDP, "OMAP LDP board") 420 .atag_offset = 0x100, 421 .reserve = omap_reserve, 422 .map_io = omap3_map_io, 423 .init_early = omap3430_init_early, 424 .init_irq = omap3_init_irq, 425 .init_machine = omap_ldp_init, 426 .init_late = omap3430_init_late, 427 .init_time = omap3_sync32k_timer_init, 428 .restart = omap3xxx_restart, 429MACHINE_END 430