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