linux/arch/arm/mach-omap2/board-omap3touchbook.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-omap2/board-omap3touchbook.c
   3 *
   4 * Copyright (C) 2009 Always Innovating
   5 *
   6 * Modified from mach-omap2/board-omap3beagleboard.c
   7 *
   8 * Initial code: Grégoire Gentil, Tim Yamin
   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/mtd/mtd.h>
  28#include <linux/mtd/partitions.h>
  29#include <linux/mtd/nand.h>
  30#include <linux/mmc/host.h>
  31#include <linux/usb/phy.h>
  32
  33#include <linux/platform_data/spi-omap2-mcspi.h>
  34#include <linux/spi/spi.h>
  35
  36#include <linux/spi/ads7846.h>
  37
  38#include <linux/regulator/machine.h>
  39#include <linux/i2c/twl.h>
  40
  41#include <asm/mach-types.h>
  42#include <asm/mach/arch.h>
  43#include <asm/mach/map.h>
  44#include <asm/mach/flash.h>
  45#include <asm/system_info.h>
  46
  47#include "common.h"
  48#include "gpmc.h"
  49#include <linux/platform_data/mtd-nand-omap2.h>
  50
  51#include "mux.h"
  52#include "hsmmc.h"
  53#include "board-flash.h"
  54#include "common-board-devices.h"
  55
  56#include <asm/setup.h>
  57
  58#define OMAP3_AC_GPIO           136
  59#define OMAP3_TS_GPIO           162
  60#define TB_BL_PWM_TIMER         9
  61#define TB_KILL_POWER_GPIO      168
  62
  63#define NAND_CS                 0
  64
  65static unsigned long touchbook_revision;
  66
  67static struct mtd_partition omap3touchbook_nand_partitions[] = {
  68        /* All the partition sizes are listed in terms of NAND block size */
  69        {
  70                .name           = "X-Loader",
  71                .offset         = 0,
  72                .size           = 4 * NAND_BLOCK_SIZE,
  73                .mask_flags     = MTD_WRITEABLE,        /* force read-only */
  74        },
  75        {
  76                .name           = "U-Boot",
  77                .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x80000 */
  78                .size           = 15 * NAND_BLOCK_SIZE,
  79                .mask_flags     = MTD_WRITEABLE,        /* force read-only */
  80        },
  81        {
  82                .name           = "U-Boot Env",
  83                .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x260000 */
  84                .size           = 1 * NAND_BLOCK_SIZE,
  85        },
  86        {
  87                .name           = "Kernel",
  88                .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x280000 */
  89                .size           = 32 * NAND_BLOCK_SIZE,
  90        },
  91        {
  92                .name           = "File System",
  93                .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x680000 */
  94                .size           = MTDPART_SIZ_FULL,
  95        },
  96};
  97
  98#include "sdram-micron-mt46h32m32lf-6.h"
  99
 100static struct omap2_hsmmc_info mmc[] = {
 101        {
 102                .mmc            = 1,
 103                .caps           = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
 104                .gpio_wp        = 29,
 105                .deferred       = true,
 106        },
 107        {}      /* Terminator */
 108};
 109
 110static struct regulator_consumer_supply touchbook_vmmc1_supply[] = {
 111        REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
 112};
 113
 114static struct regulator_consumer_supply touchbook_vsim_supply[] = {
 115        REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
 116};
 117
 118static struct gpio_led gpio_leds[];
 119
 120static int touchbook_twl_gpio_setup(struct device *dev,
 121                unsigned gpio, unsigned ngpio)
 122{
 123        /* gpio + 0 is "mmc0_cd" (input/IRQ) */
 124        mmc[0].gpio_cd = gpio + 0;
 125        omap_hsmmc_late_init(mmc);
 126
 127        /* REVISIT: need ehci-omap hooks for external VBUS
 128         * power switch and overcurrent detect
 129         */
 130        gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC");
 131
 132        /* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
 133        gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW,
 134                         "nEN_USB_PWR");
 135
 136        /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
 137        gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
 138
 139        return 0;
 140}
 141
 142static struct twl4030_gpio_platform_data touchbook_gpio_data = {
 143        .use_leds       = true,
 144        .pullups        = BIT(1),
 145        .pulldowns      = BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
 146                                | BIT(15) | BIT(16) | BIT(17),
 147        .setup          = touchbook_twl_gpio_setup,
 148};
 149
 150static struct regulator_consumer_supply touchbook_vdac_supply[] = {
 151{
 152        .supply         = "vdac",
 153},
 154};
 155
 156static struct regulator_consumer_supply touchbook_vdvi_supply[] = {
 157{
 158        .supply         = "vdvi",
 159},
 160};
 161
 162/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
 163static struct regulator_init_data touchbook_vmmc1 = {
 164        .constraints = {
 165                .min_uV                 = 1850000,
 166                .max_uV                 = 3150000,
 167                .valid_modes_mask       = REGULATOR_MODE_NORMAL
 168                                        | REGULATOR_MODE_STANDBY,
 169                .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
 170                                        | REGULATOR_CHANGE_MODE
 171                                        | REGULATOR_CHANGE_STATUS,
 172        },
 173        .num_consumer_supplies  = ARRAY_SIZE(touchbook_vmmc1_supply),
 174        .consumer_supplies      = touchbook_vmmc1_supply,
 175};
 176
 177/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
 178static struct regulator_init_data touchbook_vsim = {
 179        .constraints = {
 180                .min_uV                 = 1800000,
 181                .max_uV                 = 3000000,
 182                .valid_modes_mask       = REGULATOR_MODE_NORMAL
 183                                        | REGULATOR_MODE_STANDBY,
 184                .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
 185                                        | REGULATOR_CHANGE_MODE
 186                                        | REGULATOR_CHANGE_STATUS,
 187        },
 188        .num_consumer_supplies  = ARRAY_SIZE(touchbook_vsim_supply),
 189        .consumer_supplies      = touchbook_vsim_supply,
 190};
 191
 192static struct twl4030_platform_data touchbook_twldata = {
 193        /* platform_data for children goes here */
 194        .gpio           = &touchbook_gpio_data,
 195        .vmmc1          = &touchbook_vmmc1,
 196        .vsim           = &touchbook_vsim,
 197};
 198
 199static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
 200        {
 201                I2C_BOARD_INFO("bq27200", 0x55),
 202        },
 203};
 204
 205static int __init omap3_touchbook_i2c_init(void)
 206{
 207        /* Standard TouchBook bus */
 208        omap3_pmic_get_config(&touchbook_twldata,
 209                        TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
 210                        TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
 211
 212        touchbook_twldata.vdac->num_consumer_supplies =
 213                                        ARRAY_SIZE(touchbook_vdac_supply);
 214        touchbook_twldata.vdac->consumer_supplies = touchbook_vdac_supply;
 215
 216        touchbook_twldata.vpll2->constraints.name = "VDVI";
 217        touchbook_twldata.vpll2->num_consumer_supplies =
 218                                        ARRAY_SIZE(touchbook_vdvi_supply);
 219        touchbook_twldata.vpll2->consumer_supplies = touchbook_vdvi_supply;
 220
 221        omap3_pmic_init("twl4030", &touchbook_twldata);
 222        /* Additional TouchBook bus */
 223        omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo,
 224                        ARRAY_SIZE(touchBook_i2c_boardinfo));
 225
 226        return 0;
 227}
 228
 229static struct ads7846_platform_data ads7846_pdata = {
 230        .x_min                  = 100,
 231        .y_min                  = 265,
 232        .x_max                  = 3950,
 233        .y_max                  = 3750,
 234        .x_plate_ohms           = 40,
 235        .pressure_max           = 255,
 236        .debounce_max           = 10,
 237        .debounce_tol           = 5,
 238        .debounce_rep           = 1,
 239        .gpio_pendown           = OMAP3_TS_GPIO,
 240        .keep_vref_on           = 1,
 241};
 242
 243static struct gpio_led gpio_leds[] = {
 244        {
 245                .name                   = "touchbook::usr0",
 246                .default_trigger        = "heartbeat",
 247                .gpio                   = 150,
 248        },
 249        {
 250                .name                   = "touchbook::usr1",
 251                .default_trigger        = "mmc0",
 252                .gpio                   = 149,
 253        },
 254        {
 255                .name                   = "touchbook::pmu_stat",
 256                .gpio                   = -EINVAL,      /* gets replaced */
 257                .active_low             = true,
 258        },
 259};
 260
 261static struct gpio_led_platform_data gpio_led_info = {
 262        .leds           = gpio_leds,
 263        .num_leds       = ARRAY_SIZE(gpio_leds),
 264};
 265
 266static struct platform_device leds_gpio = {
 267        .name   = "leds-gpio",
 268        .id     = -1,
 269        .dev    = {
 270                .platform_data  = &gpio_led_info,
 271        },
 272};
 273
 274static struct gpio_keys_button gpio_buttons[] = {
 275        {
 276                .code                   = BTN_EXTRA,
 277                .gpio                   = 7,
 278                .desc                   = "user",
 279                .wakeup                 = 1,
 280        },
 281        {
 282                .code                   = KEY_POWER,
 283                .gpio                   = 183,
 284                .desc                   = "power",
 285                .wakeup                 = 1,
 286        },
 287};
 288
 289static struct gpio_keys_platform_data gpio_key_info = {
 290        .buttons        = gpio_buttons,
 291        .nbuttons       = ARRAY_SIZE(gpio_buttons),
 292};
 293
 294static struct platform_device keys_gpio = {
 295        .name   = "gpio-keys",
 296        .id     = -1,
 297        .dev    = {
 298                .platform_data  = &gpio_key_info,
 299        },
 300};
 301
 302#ifdef CONFIG_OMAP_MUX
 303static struct omap_board_mux board_mux[] __initdata = {
 304        { .reg_offset = OMAP_MUX_TERMINATOR },
 305};
 306#endif
 307
 308static struct usbhs_phy_data phy_data[] __initdata = {
 309        {
 310                .port = 2,
 311                .reset_gpio = 147,
 312                .vcc_gpio = -EINVAL,
 313        },
 314};
 315
 316static struct platform_device *omap3_touchbook_devices[] __initdata = {
 317        &leds_gpio,
 318        &keys_gpio,
 319};
 320
 321static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
 322        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
 323        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
 324};
 325
 326static void omap3_touchbook_poweroff(void)
 327{
 328        int pwr_off = TB_KILL_POWER_GPIO;
 329
 330        if (gpio_request_one(pwr_off, GPIOF_OUT_INIT_LOW, "DVI reset") < 0)
 331                printk(KERN_ERR "Unable to get kill power GPIO\n");
 332}
 333
 334static int __init early_touchbook_revision(char *p)
 335{
 336        if (!p)
 337                return 0;
 338
 339        return strict_strtoul(p, 10, &touchbook_revision);
 340}
 341early_param("tbr", early_touchbook_revision);
 342
 343static void __init omap3_touchbook_init(void)
 344{
 345        omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
 346
 347        pm_power_off = omap3_touchbook_poweroff;
 348
 349        if (system_rev >= 0x20 && system_rev <= 0x34301000) {
 350                omap_mux_init_gpio(23, OMAP_PIN_INPUT);
 351                mmc[0].gpio_wp = 23;
 352        } else {
 353                omap_mux_init_gpio(29, OMAP_PIN_INPUT);
 354        }
 355        omap_hsmmc_init(mmc);
 356
 357        omap3_touchbook_i2c_init();
 358        platform_add_devices(omap3_touchbook_devices,
 359                        ARRAY_SIZE(omap3_touchbook_devices));
 360        omap_serial_init();
 361        omap_sdrc_init(mt46h32m32lf6_sdrc_params,
 362                                  mt46h32m32lf6_sdrc_params);
 363
 364        omap_mux_init_gpio(170, OMAP_PIN_INPUT);
 365        /* REVISIT leave DVI powered down until it's needed ... */
 366        gpio_request_one(176, GPIOF_OUT_INIT_HIGH, "DVI_nPD");
 367
 368        /* Touchscreen and accelerometer */
 369        omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata);
 370        usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
 371        usb_musb_init(NULL);
 372
 373        usbhs_init_phys(phy_data, ARRAY_SIZE(phy_data));
 374        usbhs_init(&usbhs_bdata);
 375        board_nand_init(omap3touchbook_nand_partitions,
 376                        ARRAY_SIZE(omap3touchbook_nand_partitions), NAND_CS,
 377                        NAND_BUSWIDTH_16, NULL);
 378
 379        /* Ensure SDRC pins are mux'd for self-refresh */
 380        omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
 381        omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
 382}
 383
 384MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board")
 385        /* Maintainer: Gregoire Gentil - http://www.alwaysinnovating.com */
 386        .atag_offset    = 0x100,
 387        .reserve        = omap_reserve,
 388        .map_io         = omap3_map_io,
 389        .init_early     = omap3430_init_early,
 390        .init_irq       = omap3_init_irq,
 391        .handle_irq     = omap3_intc_handle_irq,
 392        .init_machine   = omap3_touchbook_init,
 393        .init_late      = omap3430_init_late,
 394        .init_time      = omap3_secure_sync32k_timer_init,
 395        .restart        = omap3xxx_restart,
 396MACHINE_END
 397