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