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 "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      = omap_init_time,
 428        .restart        = omap3xxx_restart,
 429MACHINE_END
 430