linux/arch/arm/mach-omap2/board-omap3stalker.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-omap2/board-omap3evm.c
   3 *
   4 * Copyright (C) 2008 Guangzhou EMA-Tech
   5 *
   6 * Modified from mach-omap2/board-omap3evm.c
   7 *
   8 * Initial code: Syed Mohammed Khasim
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13 */
  14
  15#include <linux/kernel.h>
  16#include <linux/init.h>
  17#include <linux/platform_device.h>
  18#include <linux/delay.h>
  19#include <linux/err.h>
  20#include <linux/clk.h>
  21#include <linux/io.h>
  22#include <linux/leds.h>
  23#include <linux/gpio.h>
  24#include <linux/input.h>
  25#include <linux/gpio_keys.h>
  26
  27#include <linux/regulator/fixed.h>
  28#include <linux/regulator/machine.h>
  29#include <linux/i2c/twl.h>
  30#include <linux/mmc/host.h>
  31
  32#include <mach/hardware.h>
  33#include <asm/mach-types.h>
  34#include <asm/mach/arch.h>
  35#include <asm/mach/map.h>
  36#include <asm/mach/flash.h>
  37
  38#include <plat/board.h>
  39#include "common.h"
  40#include <plat/gpmc.h>
  41#include <plat/nand.h>
  42#include <plat/usb.h>
  43#include <video/omapdss.h>
  44#include <video/omap-panel-generic-dpi.h>
  45#include <video/omap-panel-tfp410.h>
  46
  47#include <plat/mcspi.h>
  48#include <linux/input/matrix_keypad.h>
  49#include <linux/spi/spi.h>
  50#include <linux/interrupt.h>
  51#include <linux/smsc911x.h>
  52#include <linux/i2c/at24.h>
  53
  54#include "sdram-micron-mt46h32m32lf-6.h"
  55#include "mux.h"
  56#include "hsmmc.h"
  57#include "common-board-devices.h"
  58
  59#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
  60#include <plat/gpmc-smsc911x.h>
  61
  62#define OMAP3STALKER_ETHR_START 0x2c000000
  63#define OMAP3STALKER_ETHR_SIZE  1024
  64#define OMAP3STALKER_ETHR_GPIO_IRQ      19
  65#define OMAP3STALKER_SMC911X_CS 5
  66
  67static struct omap_smsc911x_platform_data smsc911x_cfg = {
  68        .cs             = OMAP3STALKER_SMC911X_CS,
  69        .gpio_irq       = OMAP3STALKER_ETHR_GPIO_IRQ,
  70        .gpio_reset     = -EINVAL,
  71        .flags          = (SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS),
  72};
  73
  74static inline void __init omap3stalker_init_eth(void)
  75{
  76        omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP);
  77        gpmc_smsc911x_init(&smsc911x_cfg);
  78}
  79
  80#else
  81static inline void __init omap3stalker_init_eth(void)
  82{
  83        return;
  84}
  85#endif
  86
  87/*
  88 * OMAP3 DSS control signals
  89 */
  90
  91#define DSS_ENABLE_GPIO 199
  92#define LCD_PANEL_BKLIGHT_GPIO  210
  93#define ENABLE_VPLL2_DEV_GRP    0xE0
  94
  95static void __init omap3_stalker_display_init(void)
  96{
  97        return;
  98}
  99
 100static int omap3_stalker_enable_tv(struct omap_dss_device *dssdev)
 101{
 102        return 0;
 103}
 104
 105static void omap3_stalker_disable_tv(struct omap_dss_device *dssdev)
 106{
 107}
 108
 109static struct omap_dss_device omap3_stalker_tv_device = {
 110        .name                   = "tv",
 111        .driver_name            = "venc",
 112        .type                   = OMAP_DISPLAY_TYPE_VENC,
 113#if defined(CONFIG_OMAP2_VENC_OUT_TYPE_SVIDEO)
 114        .phy.venc.type          = OMAP_DSS_VENC_TYPE_SVIDEO,
 115#elif defined(CONFIG_OMAP2_VENC_OUT_TYPE_COMPOSITE)
 116        .u.venc.type            = OMAP_DSS_VENC_TYPE_COMPOSITE,
 117#endif
 118        .platform_enable        = omap3_stalker_enable_tv,
 119        .platform_disable       = omap3_stalker_disable_tv,
 120};
 121
 122static struct tfp410_platform_data dvi_panel = {
 123        .power_down_gpio        = DSS_ENABLE_GPIO,
 124};
 125
 126static struct omap_dss_device omap3_stalker_dvi_device = {
 127        .name                   = "dvi",
 128        .type                   = OMAP_DISPLAY_TYPE_DPI,
 129        .driver_name            = "tfp410",
 130        .data                   = &dvi_panel,
 131        .phy.dpi.data_lines     = 24,
 132};
 133
 134static struct omap_dss_device *omap3_stalker_dss_devices[] = {
 135        &omap3_stalker_tv_device,
 136        &omap3_stalker_dvi_device,
 137};
 138
 139static struct omap_dss_board_info omap3_stalker_dss_data = {
 140        .num_devices    = ARRAY_SIZE(omap3_stalker_dss_devices),
 141        .devices        = omap3_stalker_dss_devices,
 142        .default_device = &omap3_stalker_dvi_device,
 143};
 144
 145static struct regulator_consumer_supply omap3stalker_vmmc1_supply[] = {
 146        REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
 147};
 148
 149static struct regulator_consumer_supply omap3stalker_vsim_supply[] = {
 150        REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
 151};
 152
 153/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
 154static struct regulator_init_data omap3stalker_vmmc1 = {
 155        .constraints            = {
 156                .min_uV                 = 1850000,
 157                .max_uV                 = 3150000,
 158                .valid_modes_mask       = REGULATOR_MODE_NORMAL
 159                | REGULATOR_MODE_STANDBY,
 160                .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
 161                | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
 162        },
 163        .num_consumer_supplies  = ARRAY_SIZE(omap3stalker_vmmc1_supply),
 164        .consumer_supplies      = omap3stalker_vmmc1_supply,
 165};
 166
 167/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
 168static struct regulator_init_data omap3stalker_vsim = {
 169        .constraints            = {
 170                .min_uV                 = 1800000,
 171                .max_uV                 = 3000000,
 172                .valid_modes_mask       = REGULATOR_MODE_NORMAL
 173                | REGULATOR_MODE_STANDBY,
 174                .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
 175                | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
 176        },
 177        .num_consumer_supplies  = ARRAY_SIZE(omap3stalker_vsim_supply),
 178        .consumer_supplies      = omap3stalker_vsim_supply,
 179};
 180
 181static struct omap2_hsmmc_info mmc[] = {
 182        {
 183                .mmc            = 1,
 184                .caps           = MMC_CAP_4_BIT_DATA,
 185                .gpio_cd        = -EINVAL,
 186                .gpio_wp        = 23,
 187                .deferred       = true,
 188         },
 189        {}                      /* Terminator */
 190};
 191
 192static struct gpio_keys_button gpio_buttons[] = {
 193        {
 194         .code          = BTN_EXTRA,
 195         .gpio          = 18,
 196         .desc          = "user",
 197         .wakeup        = 1,
 198         },
 199};
 200
 201static struct gpio_keys_platform_data gpio_key_info = {
 202        .buttons        = gpio_buttons,
 203        .nbuttons       = ARRAY_SIZE(gpio_buttons),
 204};
 205
 206static struct platform_device keys_gpio = {
 207        .name           = "gpio-keys",
 208        .id             = -1,
 209        .dev            = {
 210                .platform_data  = &gpio_key_info,
 211        },
 212};
 213
 214static struct gpio_led gpio_leds[] = {
 215        {
 216         .name                  = "stalker:D8:usr0",
 217         .default_trigger       = "default-on",
 218         .gpio                  = 126,
 219         },
 220        {
 221         .name                  = "stalker:D9:usr1",
 222         .default_trigger       = "default-on",
 223         .gpio                  = 127,
 224         },
 225        {
 226         .name                  = "stalker:D3:mmc0",
 227         .gpio                  = -EINVAL,      /* gets replaced */
 228         .active_low            = true,
 229         .default_trigger       = "mmc0",
 230         },
 231        {
 232         .name                  = "stalker:D4:heartbeat",
 233         .gpio                  = -EINVAL,      /* gets replaced */
 234         .active_low            = true,
 235         .default_trigger       = "heartbeat",
 236         },
 237};
 238
 239static struct gpio_led_platform_data gpio_led_info = {
 240        .leds           = gpio_leds,
 241        .num_leds       = ARRAY_SIZE(gpio_leds),
 242};
 243
 244static struct platform_device leds_gpio = {
 245        .name   = "leds-gpio",
 246        .id     = -1,
 247        .dev    = {
 248                .platform_data  = &gpio_led_info,
 249        },
 250};
 251
 252static int
 253omap3stalker_twl_gpio_setup(struct device *dev,
 254                            unsigned gpio, unsigned ngpio)
 255{
 256        /* gpio + 0 is "mmc0_cd" (input/IRQ) */
 257        mmc[0].gpio_cd = gpio + 0;
 258        omap_hsmmc_late_init(mmc);
 259
 260        /*
 261         * Most GPIOs are for USB OTG.  Some are mostly sent to
 262         * the P2 connector; notably LEDA for the LCD backlight.
 263         */
 264
 265        /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
 266        gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW,
 267                         "EN_LCD_BKL");
 268
 269        /* gpio + 7 == DVI Enable */
 270        gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");
 271
 272        /* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */
 273        gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
 274        /* GPIO + 13 == ledsync (out, heartbeat) */
 275        gpio_leds[3].gpio = gpio + 13;
 276
 277        platform_device_register(&leds_gpio);
 278        return 0;
 279}
 280
 281static struct twl4030_gpio_platform_data omap3stalker_gpio_data = {
 282        .gpio_base      = OMAP_MAX_GPIO_LINES,
 283        .irq_base       = TWL4030_GPIO_IRQ_BASE,
 284        .irq_end        = TWL4030_GPIO_IRQ_END,
 285        .use_leds       = true,
 286        .setup          = omap3stalker_twl_gpio_setup,
 287};
 288
 289static uint32_t board_keymap[] = {
 290        KEY(0, 0, KEY_LEFT),
 291        KEY(0, 1, KEY_DOWN),
 292        KEY(0, 2, KEY_ENTER),
 293        KEY(0, 3, KEY_M),
 294
 295        KEY(1, 0, KEY_RIGHT),
 296        KEY(1, 1, KEY_UP),
 297        KEY(1, 2, KEY_I),
 298        KEY(1, 3, KEY_N),
 299
 300        KEY(2, 0, KEY_A),
 301        KEY(2, 1, KEY_E),
 302        KEY(2, 2, KEY_J),
 303        KEY(2, 3, KEY_O),
 304
 305        KEY(3, 0, KEY_B),
 306        KEY(3, 1, KEY_F),
 307        KEY(3, 2, KEY_K),
 308        KEY(3, 3, KEY_P)
 309};
 310
 311static struct matrix_keymap_data board_map_data = {
 312        .keymap         = board_keymap,
 313        .keymap_size    = ARRAY_SIZE(board_keymap),
 314};
 315
 316static struct twl4030_keypad_data omap3stalker_kp_data = {
 317        .keymap_data    = &board_map_data,
 318        .rows           = 4,
 319        .cols           = 4,
 320        .rep            = 1,
 321};
 322
 323static struct twl4030_platform_data omap3stalker_twldata = {
 324        /* platform_data for children goes here */
 325        .keypad         = &omap3stalker_kp_data,
 326        .gpio           = &omap3stalker_gpio_data,
 327        .vmmc1          = &omap3stalker_vmmc1,
 328        .vsim           = &omap3stalker_vsim,
 329};
 330
 331static struct at24_platform_data fram_info = {
 332        .byte_len       = (64 * 1024) / 8,
 333        .page_size      = 8192,
 334        .flags          = AT24_FLAG_ADDR16 | AT24_FLAG_IRUGO,
 335};
 336
 337static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
 338        {
 339         I2C_BOARD_INFO("24c64", 0x50),
 340         .flags         = I2C_CLIENT_WAKE,
 341         .platform_data = &fram_info,
 342         },
 343};
 344
 345static int __init omap3_stalker_i2c_init(void)
 346{
 347        omap3_pmic_get_config(&omap3stalker_twldata,
 348                        TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC |
 349                        TWL_COMMON_PDATA_AUDIO,
 350                        TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
 351
 352        omap3stalker_twldata.vdac->constraints.apply_uV = true;
 353        omap3stalker_twldata.vpll2->constraints.apply_uV = true;
 354        omap3stalker_twldata.vpll2->constraints.name = "VDVI";
 355
 356        omap3_pmic_init("twl4030", &omap3stalker_twldata);
 357        omap_register_i2c_bus(2, 400, NULL, 0);
 358        omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3,
 359                              ARRAY_SIZE(omap3stalker_i2c_boardinfo3));
 360        return 0;
 361}
 362
 363#define OMAP3_STALKER_TS_GPIO   175
 364
 365static struct omap_board_config_kernel omap3_stalker_config[] __initdata = {
 366};
 367
 368static struct platform_device *omap3_stalker_devices[] __initdata = {
 369        &keys_gpio,
 370};
 371
 372static struct usbhs_omap_board_data usbhs_bdata __initconst = {
 373        .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
 374        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
 375        .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
 376
 377        .phy_reset = true,
 378        .reset_gpio_port[0] = -EINVAL,
 379        .reset_gpio_port[1] = 21,
 380        .reset_gpio_port[2] = -EINVAL,
 381};
 382
 383#ifdef CONFIG_OMAP_MUX
 384static struct omap_board_mux board_mux[] __initdata = {
 385        OMAP3_MUX(SYS_NIRQ, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP |
 386                  OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE),
 387        OMAP3_MUX(MCSPI1_CS1, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
 388                  OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE),
 389        {.reg_offset = OMAP_MUX_TERMINATOR},
 390};
 391#endif
 392
 393static struct regulator_consumer_supply dummy_supplies[] = {
 394        REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
 395        REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
 396};
 397
 398static void __init omap3_stalker_init(void)
 399{
 400        regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
 401        omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
 402        omap_board_config = omap3_stalker_config;
 403        omap_board_config_size = ARRAY_SIZE(omap3_stalker_config);
 404
 405        omap_mux_init_gpio(23, OMAP_PIN_INPUT);
 406        omap_hsmmc_init(mmc);
 407
 408        omap3_stalker_i2c_init();
 409
 410        platform_add_devices(omap3_stalker_devices,
 411                             ARRAY_SIZE(omap3_stalker_devices));
 412
 413        omap_display_init(&omap3_stalker_dss_data);
 414
 415        omap_serial_init();
 416        omap_sdrc_init(mt46h32m32lf6_sdrc_params, NULL);
 417        usb_musb_init(NULL);
 418        usbhs_init(&usbhs_bdata);
 419        omap_ads7846_init(1, OMAP3_STALKER_TS_GPIO, 310, NULL);
 420
 421        omap_mux_init_gpio(21, OMAP_PIN_OUTPUT);
 422        omap_mux_init_gpio(18, OMAP_PIN_INPUT_PULLUP);
 423
 424        omap3stalker_init_eth();
 425        omap3_stalker_display_init();
 426/* Ensure SDRC pins are mux'd for self-refresh */
 427        omap_mux_init_signal("sdr_cke0", OMAP_PIN_OUTPUT);
 428        omap_mux_init_signal("sdr_cke1", OMAP_PIN_OUTPUT);
 429}
 430
 431MACHINE_START(SBC3530, "OMAP3 STALKER")
 432        /* Maintainer: Jason Lam -lzg@ema-tech.com */
 433        .atag_offset            = 0x100,
 434        .map_io                 = omap3_map_io,
 435        .init_early             = omap35xx_init_early,
 436        .init_irq               = omap3_init_irq,
 437        .handle_irq             = omap3_intc_handle_irq,
 438        .init_machine           = omap3_stalker_init,
 439        .init_late              = omap35xx_init_late,
 440        .timer                  = &omap3_secure_timer,
 441        .restart                = omap_prcm_restart,
 442MACHINE_END
 443