linux/arch/arm/mach-omap2/board-igep0020.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2009 Integration Software and Electronic Engineering.
   3 *
   4 * Modified from mach-omap2/board-generic.c
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#include <linux/kernel.h>
  12#include <linux/init.h>
  13#include <linux/platform_device.h>
  14#include <linux/delay.h>
  15#include <linux/err.h>
  16#include <linux/clk.h>
  17#include <linux/io.h>
  18#include <linux/gpio.h>
  19#include <linux/interrupt.h>
  20#include <linux/input.h>
  21#include <linux/usb/phy.h>
  22
  23#include <linux/regulator/machine.h>
  24#include <linux/regulator/fixed.h>
  25#include <linux/i2c/twl.h>
  26#include <linux/mmc/host.h>
  27
  28#include <linux/mtd/nand.h>
  29
  30#include <asm/mach-types.h>
  31#include <asm/mach/arch.h>
  32
  33#include <video/omapdss.h>
  34#include <video/omap-panel-data.h>
  35#include <linux/platform_data/mtd-onenand-omap2.h>
  36
  37#include "common.h"
  38#include "gpmc.h"
  39#include "mux.h"
  40#include "hsmmc.h"
  41#include "sdram-numonyx-m65kxxxxam.h"
  42#include "common-board-devices.h"
  43#include "board-flash.h"
  44#include "control.h"
  45#include "gpmc-onenand.h"
  46
  47#define IGEP2_SMSC911X_CS       5
  48#define IGEP2_SMSC911X_GPIO     176
  49#define IGEP2_GPIO_USBH_NRESET  24
  50#define IGEP2_GPIO_LED0_GREEN   26
  51#define IGEP2_GPIO_LED0_RED     27
  52#define IGEP2_GPIO_LED1_RED     28
  53#define IGEP2_GPIO_DVI_PUP      170
  54
  55#define IGEP2_RB_GPIO_WIFI_NPD     94
  56#define IGEP2_RB_GPIO_WIFI_NRESET  95
  57#define IGEP2_RB_GPIO_BT_NRESET    137
  58#define IGEP2_RC_GPIO_WIFI_NPD     138
  59#define IGEP2_RC_GPIO_WIFI_NRESET  139
  60#define IGEP2_RC_GPIO_BT_NRESET    137
  61
  62#define IGEP3_GPIO_LED0_GREEN   54
  63#define IGEP3_GPIO_LED0_RED     53
  64#define IGEP3_GPIO_LED1_RED     16
  65#define IGEP3_GPIO_USBH_NRESET  183
  66
  67#define IGEP_SYSBOOT_MASK           0x1f
  68#define IGEP_SYSBOOT_NAND           0x0f
  69#define IGEP_SYSBOOT_ONENAND        0x10
  70
  71/*
  72 * IGEP2 Hardware Revision Table
  73 *
  74 *  --------------------------------------------------------------------------
  75 * | Id. | Hw Rev.            | HW0 (28) | WIFI_NPD | WIFI_NRESET | BT_NRESET |
  76 *  --------------------------------------------------------------------------
  77 * |  0  | B                  |   high   |  gpio94  |   gpio95    |     -     |
  78 * |  0  | B/C (B-compatible) |   high   |  gpio94  |   gpio95    |  gpio137  |
  79 * |  1  | C                  |   low    |  gpio138 |   gpio139   |  gpio137  |
  80 *  --------------------------------------------------------------------------
  81 */
  82
  83#define IGEP2_BOARD_HWREV_B     0
  84#define IGEP2_BOARD_HWREV_C     1
  85#define IGEP3_BOARD_HWREV       2
  86
  87static u8 hwrev;
  88
  89static void __init igep2_get_revision(void)
  90{
  91        u8 ret;
  92
  93        if (machine_is_igep0030()) {
  94                hwrev = IGEP3_BOARD_HWREV;
  95                return;
  96        }
  97
  98        omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT);
  99
 100        if (gpio_request_one(IGEP2_GPIO_LED1_RED, GPIOF_IN, "GPIO_HW0_REV")) {
 101                pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n");
 102                pr_err("IGEP2: Unknown Hardware Revision\n");
 103                return;
 104        }
 105
 106        ret = gpio_get_value(IGEP2_GPIO_LED1_RED);
 107        if (ret == 0) {
 108                pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n");
 109                hwrev = IGEP2_BOARD_HWREV_C;
 110        } else if (ret ==  1) {
 111                pr_info("IGEP2: Hardware Revision B/C (B compatible)\n");
 112                hwrev = IGEP2_BOARD_HWREV_B;
 113        } else {
 114                pr_err("IGEP2: Unknown Hardware Revision\n");
 115                hwrev = -1;
 116        }
 117
 118        gpio_free(IGEP2_GPIO_LED1_RED);
 119}
 120
 121#if defined(CONFIG_MTD_ONENAND_OMAP2) ||                \
 122        defined(CONFIG_MTD_ONENAND_OMAP2_MODULE) ||     \
 123        defined(CONFIG_MTD_NAND_OMAP2) ||               \
 124        defined(CONFIG_MTD_NAND_OMAP2_MODULE)
 125
 126#define ONENAND_MAP             0x20000000
 127
 128/* NAND04GR4E1A ( x2 Flash built-in COMBO POP MEMORY )
 129 * Since the device is equipped with two DataRAMs, and two-plane NAND
 130 * Flash memory array, these two component enables simultaneous program
 131 * of 4KiB. Plane1 has only even blocks such as block0, block2, block4
 132 * while Plane2 has only odd blocks such as block1, block3, block5.
 133 * So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048)
 134 */
 135
 136static struct mtd_partition igep_flash_partitions[] = {
 137        {
 138                .name           = "X-Loader",
 139                .offset         = 0,
 140                .size           = 2 * (64*(2*2048))
 141        },
 142        {
 143                .name           = "U-Boot",
 144                .offset         = MTDPART_OFS_APPEND,
 145                .size           = 6 * (64*(2*2048)),
 146        },
 147        {
 148                .name           = "Environment",
 149                .offset         = MTDPART_OFS_APPEND,
 150                .size           = 2 * (64*(2*2048)),
 151        },
 152        {
 153                .name           = "Kernel",
 154                .offset         = MTDPART_OFS_APPEND,
 155                .size           = 12 * (64*(2*2048)),
 156        },
 157        {
 158                .name           = "File System",
 159                .offset         = MTDPART_OFS_APPEND,
 160                .size           = MTDPART_SIZ_FULL,
 161        },
 162};
 163
 164static inline u32 igep_get_sysboot_value(void)
 165{
 166        return omap_ctrl_readl(OMAP343X_CONTROL_STATUS) & IGEP_SYSBOOT_MASK;
 167}
 168
 169static void __init igep_flash_init(void)
 170{
 171        u32 mux;
 172        mux = igep_get_sysboot_value();
 173
 174        if (mux == IGEP_SYSBOOT_NAND) {
 175                pr_info("IGEP: initializing NAND memory device\n");
 176                board_nand_init(igep_flash_partitions,
 177                                ARRAY_SIZE(igep_flash_partitions),
 178                                0, NAND_BUSWIDTH_16, nand_default_timings);
 179        } else if (mux == IGEP_SYSBOOT_ONENAND) {
 180                pr_info("IGEP: initializing OneNAND memory device\n");
 181                board_onenand_init(igep_flash_partitions,
 182                                   ARRAY_SIZE(igep_flash_partitions), 0);
 183        } else {
 184                pr_err("IGEP: Flash: unsupported sysboot sequence found\n");
 185        }
 186}
 187
 188#else
 189static void __init igep_flash_init(void) {}
 190#endif
 191
 192#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
 193
 194#include <linux/smsc911x.h>
 195#include "gpmc-smsc911x.h"
 196
 197static struct omap_smsc911x_platform_data smsc911x_cfg = {
 198        .cs             = IGEP2_SMSC911X_CS,
 199        .gpio_irq       = IGEP2_SMSC911X_GPIO,
 200        .gpio_reset     = -EINVAL,
 201        .flags          = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
 202};
 203
 204static inline void __init igep2_init_smsc911x(void)
 205{
 206        gpmc_smsc911x_init(&smsc911x_cfg);
 207}
 208
 209#else
 210static inline void __init igep2_init_smsc911x(void) { }
 211#endif
 212
 213static struct regulator_consumer_supply igep_vmmc1_supply[] = {
 214        REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
 215};
 216
 217/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
 218static struct regulator_init_data igep_vmmc1 = {
 219        .constraints = {
 220                .min_uV                 = 1850000,
 221                .max_uV                 = 3150000,
 222                .valid_modes_mask       = REGULATOR_MODE_NORMAL
 223                                        | REGULATOR_MODE_STANDBY,
 224                .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
 225                                        | REGULATOR_CHANGE_MODE
 226                                        | REGULATOR_CHANGE_STATUS,
 227        },
 228        .num_consumer_supplies  = ARRAY_SIZE(igep_vmmc1_supply),
 229        .consumer_supplies      = igep_vmmc1_supply,
 230};
 231
 232static struct regulator_consumer_supply igep_vio_supply[] = {
 233        REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"),
 234};
 235
 236static struct regulator_init_data igep_vio = {
 237        .constraints = {
 238                .min_uV                 = 1800000,
 239                .max_uV                 = 1800000,
 240                .apply_uV               = 1,
 241                .valid_modes_mask       = REGULATOR_MODE_NORMAL
 242                                        | REGULATOR_MODE_STANDBY,
 243                .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
 244                                        | REGULATOR_CHANGE_MODE
 245                                        | REGULATOR_CHANGE_STATUS,
 246        },
 247        .num_consumer_supplies  = ARRAY_SIZE(igep_vio_supply),
 248        .consumer_supplies      = igep_vio_supply,
 249};
 250
 251static struct regulator_consumer_supply igep_vmmc2_supply[] = {
 252        REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
 253};
 254
 255static struct regulator_init_data igep_vmmc2 = {
 256        .constraints            = {
 257                .valid_modes_mask       = REGULATOR_MODE_NORMAL,
 258                .always_on              = 1,
 259        },
 260        .num_consumer_supplies  = ARRAY_SIZE(igep_vmmc2_supply),
 261        .consumer_supplies      = igep_vmmc2_supply,
 262};
 263
 264static struct fixed_voltage_config igep_vwlan = {
 265        .supply_name            = "vwlan",
 266        .microvolts             = 3300000,
 267        .gpio                   = -EINVAL,
 268        .enabled_at_boot        = 1,
 269        .init_data              = &igep_vmmc2,
 270};
 271
 272static struct platform_device igep_vwlan_device = {
 273        .name           = "reg-fixed-voltage",
 274        .id             = 0,
 275        .dev = {
 276                .platform_data  = &igep_vwlan,
 277        },
 278};
 279
 280static struct omap2_hsmmc_info mmc[] = {
 281        {
 282                .mmc            = 1,
 283                .caps           = MMC_CAP_4_BIT_DATA,
 284                .gpio_cd        = -EINVAL,
 285                .gpio_wp        = -EINVAL,
 286                .deferred       = true,
 287        },
 288#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
 289        {
 290                .mmc            = 2,
 291                .caps           = MMC_CAP_4_BIT_DATA,
 292                .gpio_cd        = -EINVAL,
 293                .gpio_wp        = -EINVAL,
 294        },
 295#endif
 296        {}      /* Terminator */
 297};
 298
 299#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
 300#include <linux/leds.h>
 301
 302static struct gpio_led igep_gpio_leds[] = {
 303        [0] = {
 304                .name                   = "omap3:red:user0",
 305                .default_state          = 0,
 306        },
 307        [1] = {
 308                .name                   = "omap3:green:boot",
 309                .default_state          = 1,
 310        },
 311        [2] = {
 312                .name                   = "omap3:red:user1",
 313                .default_state          = 0,
 314        },
 315        [3] = {
 316                .name                   = "omap3:green:user1",
 317                .default_state          = 0,
 318                .gpio                   = -EINVAL, /* gets replaced */
 319                .active_low             = 1,
 320        },
 321};
 322
 323static struct gpio_led_platform_data igep_led_pdata = {
 324        .leds           = igep_gpio_leds,
 325        .num_leds       = ARRAY_SIZE(igep_gpio_leds),
 326};
 327
 328static struct platform_device igep_led_device = {
 329         .name   = "leds-gpio",
 330         .id     = -1,
 331         .dev    = {
 332                 .platform_data  =  &igep_led_pdata,
 333        },
 334};
 335
 336static void __init igep_leds_init(void)
 337{
 338        if (machine_is_igep0020()) {
 339                igep_gpio_leds[0].gpio = IGEP2_GPIO_LED0_RED;
 340                igep_gpio_leds[1].gpio = IGEP2_GPIO_LED0_GREEN;
 341                igep_gpio_leds[2].gpio = IGEP2_GPIO_LED1_RED;
 342        } else {
 343                igep_gpio_leds[0].gpio = IGEP3_GPIO_LED0_RED;
 344                igep_gpio_leds[1].gpio = IGEP3_GPIO_LED0_GREEN;
 345                igep_gpio_leds[2].gpio = IGEP3_GPIO_LED1_RED;
 346        }
 347
 348        platform_device_register(&igep_led_device);
 349}
 350
 351#else
 352static struct gpio igep_gpio_leds[] __initdata = {
 353        { -EINVAL,      GPIOF_OUT_INIT_LOW, "gpio-led:red:d0"   },
 354        { -EINVAL,      GPIOF_OUT_INIT_LOW, "gpio-led:green:d0" },
 355        { -EINVAL,      GPIOF_OUT_INIT_LOW, "gpio-led:red:d1"   },
 356};
 357
 358static inline void igep_leds_init(void)
 359{
 360        int i;
 361
 362        if (machine_is_igep0020()) {
 363                igep_gpio_leds[0].gpio = IGEP2_GPIO_LED0_RED;
 364                igep_gpio_leds[1].gpio = IGEP2_GPIO_LED0_GREEN;
 365                igep_gpio_leds[2].gpio = IGEP2_GPIO_LED1_RED;
 366        } else {
 367                igep_gpio_leds[0].gpio = IGEP3_GPIO_LED0_RED;
 368                igep_gpio_leds[1].gpio = IGEP3_GPIO_LED0_GREEN;
 369                igep_gpio_leds[2].gpio = IGEP3_GPIO_LED1_RED;
 370        }
 371
 372        if (gpio_request_array(igep_gpio_leds, ARRAY_SIZE(igep_gpio_leds))) {
 373                pr_warning("IGEP v2: Could not obtain leds gpios\n");
 374                return;
 375        }
 376
 377        for (i = 0; i < ARRAY_SIZE(igep_gpio_leds); i++)
 378                gpio_export(igep_gpio_leds[i].gpio, 0);
 379}
 380#endif
 381
 382static struct gpio igep2_twl_gpios[] = {
 383        { -EINVAL, GPIOF_IN,            "GPIO_EHCI_NOC"  },
 384        { -EINVAL, GPIOF_OUT_INIT_LOW,  "GPIO_USBH_CPEN" },
 385};
 386
 387static int igep_twl_gpio_setup(struct device *dev,
 388                unsigned gpio, unsigned ngpio)
 389{
 390        int ret;
 391
 392        /* gpio + 0 is "mmc0_cd" (input/IRQ) */
 393        mmc[0].gpio_cd = gpio + 0;
 394        omap_hsmmc_late_init(mmc);
 395
 396        /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
 397#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
 398        ret = gpio_request_one(gpio + TWL4030_GPIO_MAX + 1, GPIOF_OUT_INIT_HIGH,
 399                               "gpio-led:green:d1");
 400        if (ret == 0)
 401                gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);
 402        else
 403                pr_warning("IGEP: Could not obtain gpio GPIO_LED1_GREEN\n");
 404#else
 405        igep_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
 406#endif
 407
 408        if (machine_is_igep0030())
 409                return 0;
 410
 411        /*
 412         * REVISIT: need ehci-omap hooks for external VBUS
 413         * power switch and overcurrent detect
 414         */
 415        igep2_twl_gpios[0].gpio = gpio + 1;
 416
 417        /* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN (out, active low) */
 418        igep2_twl_gpios[1].gpio = gpio + TWL4030_GPIO_MAX;
 419
 420        ret = gpio_request_array(igep2_twl_gpios, ARRAY_SIZE(igep2_twl_gpios));
 421        if (ret < 0)
 422                pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");
 423
 424        return 0;
 425};
 426
 427static struct twl4030_gpio_platform_data igep_twl4030_gpio_pdata = {
 428        .use_leds       = true,
 429        .setup          = igep_twl_gpio_setup,
 430};
 431
 432static struct connector_dvi_platform_data omap3stalker_dvi_connector_pdata = {
 433        .name                   = "dvi",
 434        .source                 = "tfp410.0",
 435        .i2c_bus_num            = 3,
 436};
 437
 438static struct platform_device omap3stalker_dvi_connector_device = {
 439        .name                   = "connector-dvi",
 440        .id                     = 0,
 441        .dev.platform_data      = &omap3stalker_dvi_connector_pdata,
 442};
 443
 444static struct encoder_tfp410_platform_data omap3stalker_tfp410_pdata = {
 445        .name                   = "tfp410.0",
 446        .source                 = "dpi.0",
 447        .data_lines             = 24,
 448        .power_down_gpio        = IGEP2_GPIO_DVI_PUP,
 449};
 450
 451static struct platform_device omap3stalker_tfp410_device = {
 452        .name                   = "tfp410",
 453        .id                     = 0,
 454        .dev.platform_data      = &omap3stalker_tfp410_pdata,
 455};
 456
 457static struct omap_dss_board_info igep2_dss_data = {
 458        .default_display_name = "dvi",
 459};
 460
 461static struct platform_device *igep_devices[] __initdata = {
 462        &igep_vwlan_device,
 463        &omap3stalker_tfp410_device,
 464        &omap3stalker_dvi_connector_device,
 465};
 466
 467static int igep2_keymap[] = {
 468        KEY(0, 0, KEY_LEFT),
 469        KEY(0, 1, KEY_RIGHT),
 470        KEY(0, 2, KEY_A),
 471        KEY(0, 3, KEY_B),
 472        KEY(1, 0, KEY_DOWN),
 473        KEY(1, 1, KEY_UP),
 474        KEY(1, 2, KEY_E),
 475        KEY(1, 3, KEY_F),
 476        KEY(2, 0, KEY_ENTER),
 477        KEY(2, 1, KEY_I),
 478        KEY(2, 2, KEY_J),
 479        KEY(2, 3, KEY_K),
 480        KEY(3, 0, KEY_M),
 481        KEY(3, 1, KEY_N),
 482        KEY(3, 2, KEY_O),
 483        KEY(3, 3, KEY_P)
 484};
 485
 486static struct matrix_keymap_data igep2_keymap_data = {
 487        .keymap                 = igep2_keymap,
 488        .keymap_size            = ARRAY_SIZE(igep2_keymap),
 489};
 490
 491static struct twl4030_keypad_data igep2_keypad_pdata = {
 492        .keymap_data    = &igep2_keymap_data,
 493        .rows           = 4,
 494        .cols           = 4,
 495        .rep            = 1,
 496};
 497
 498static struct twl4030_platform_data igep_twldata = {
 499        /* platform_data for children goes here */
 500        .gpio           = &igep_twl4030_gpio_pdata,
 501        .vmmc1          = &igep_vmmc1,
 502        .vio            = &igep_vio,
 503};
 504
 505static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
 506        {
 507                I2C_BOARD_INFO("eeprom", 0x50),
 508        },
 509};
 510
 511static void __init igep_i2c_init(void)
 512{
 513        int ret;
 514
 515        omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_USB,
 516                              TWL_COMMON_REGULATOR_VPLL2);
 517        igep_twldata.vpll2->constraints.apply_uV = true;
 518        igep_twldata.vpll2->constraints.name = "VDVI";
 519
 520        if (machine_is_igep0020()) {
 521                /*
 522                 * Bus 3 is attached to the DVI port where devices like the
 523                 * pico DLP projector don't work reliably with 400kHz
 524                 */
 525                ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo,
 526                                            ARRAY_SIZE(igep2_i2c3_boardinfo));
 527                if (ret)
 528                        pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret);
 529
 530                igep_twldata.keypad     = &igep2_keypad_pdata;
 531                /* Get common pmic data */
 532                omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_AUDIO, 0);
 533        }
 534
 535        omap3_pmic_init("twl4030", &igep_twldata);
 536}
 537
 538static struct usbhs_phy_data igep2_phy_data[] __initdata = {
 539        {
 540                .port = 1,
 541                .reset_gpio = IGEP2_GPIO_USBH_NRESET,
 542                .vcc_gpio = -EINVAL,
 543        },
 544};
 545
 546static struct usbhs_phy_data igep3_phy_data[] __initdata = {
 547        {
 548                .port = 2,
 549                .reset_gpio = IGEP3_GPIO_USBH_NRESET,
 550                .vcc_gpio = -EINVAL,
 551        },
 552};
 553
 554static struct usbhs_omap_platform_data igep2_usbhs_bdata __initdata = {
 555        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
 556};
 557
 558static struct usbhs_omap_platform_data igep3_usbhs_bdata __initdata = {
 559        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
 560};
 561
 562#ifdef CONFIG_OMAP_MUX
 563static struct omap_board_mux board_mux[] __initdata = {
 564        /* Display Sub System */
 565        OMAP3_MUX(DSS_PCLK, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 566        OMAP3_MUX(DSS_HSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 567        OMAP3_MUX(DSS_VSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 568        OMAP3_MUX(DSS_ACBIAS, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 569        OMAP3_MUX(DSS_DATA0, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 570        OMAP3_MUX(DSS_DATA1, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 571        OMAP3_MUX(DSS_DATA2, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 572        OMAP3_MUX(DSS_DATA3, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 573        OMAP3_MUX(DSS_DATA4, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 574        OMAP3_MUX(DSS_DATA5, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 575        OMAP3_MUX(DSS_DATA6, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 576        OMAP3_MUX(DSS_DATA7, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 577        OMAP3_MUX(DSS_DATA8, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 578        OMAP3_MUX(DSS_DATA9, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 579        OMAP3_MUX(DSS_DATA10, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 580        OMAP3_MUX(DSS_DATA11, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 581        OMAP3_MUX(DSS_DATA12, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 582        OMAP3_MUX(DSS_DATA13, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 583        OMAP3_MUX(DSS_DATA14, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 584        OMAP3_MUX(DSS_DATA15, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 585        OMAP3_MUX(DSS_DATA16, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 586        OMAP3_MUX(DSS_DATA17, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 587        OMAP3_MUX(DSS_DATA18, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 588        OMAP3_MUX(DSS_DATA19, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 589        OMAP3_MUX(DSS_DATA20, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 590        OMAP3_MUX(DSS_DATA21, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 591        OMAP3_MUX(DSS_DATA22, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 592        OMAP3_MUX(DSS_DATA23, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
 593        /* TFP410 PanelBus DVI Transmitte (GPIO_170) */
 594        OMAP3_MUX(HDQ_SIO, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
 595        /* SMSC9221 LAN Controller ETH IRQ (GPIO_176) */
 596        OMAP3_MUX(MCSPI1_CS2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
 597        { .reg_offset = OMAP_MUX_TERMINATOR },
 598};
 599#endif
 600
 601#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
 602static struct gpio igep_wlan_bt_gpios[] __initdata = {
 603        { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NPD"    },
 604        { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NRESET" },
 605        { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_BT_NRESET"   },
 606};
 607
 608static void __init igep_wlan_bt_init(void)
 609{
 610        int err;
 611
 612        /* GPIO's for WLAN-BT combo depends on hardware revision */
 613        if (hwrev == IGEP2_BOARD_HWREV_B) {
 614                igep_wlan_bt_gpios[0].gpio = IGEP2_RB_GPIO_WIFI_NPD;
 615                igep_wlan_bt_gpios[1].gpio = IGEP2_RB_GPIO_WIFI_NRESET;
 616                igep_wlan_bt_gpios[2].gpio = IGEP2_RB_GPIO_BT_NRESET;
 617        } else if (hwrev == IGEP2_BOARD_HWREV_C || machine_is_igep0030()) {
 618                igep_wlan_bt_gpios[0].gpio = IGEP2_RC_GPIO_WIFI_NPD;
 619                igep_wlan_bt_gpios[1].gpio = IGEP2_RC_GPIO_WIFI_NRESET;
 620                igep_wlan_bt_gpios[2].gpio = IGEP2_RC_GPIO_BT_NRESET;
 621        } else
 622                return;
 623
 624        /* Make sure that the GPIO pins are muxed correctly */
 625        omap_mux_init_gpio(igep_wlan_bt_gpios[0].gpio, OMAP_PIN_OUTPUT);
 626        omap_mux_init_gpio(igep_wlan_bt_gpios[1].gpio, OMAP_PIN_OUTPUT);
 627        omap_mux_init_gpio(igep_wlan_bt_gpios[2].gpio, OMAP_PIN_OUTPUT);
 628
 629        err = gpio_request_array(igep_wlan_bt_gpios,
 630                                 ARRAY_SIZE(igep_wlan_bt_gpios));
 631        if (err) {
 632                pr_warning("IGEP2: Could not obtain WIFI/BT gpios\n");
 633                return;
 634        }
 635
 636        gpio_export(igep_wlan_bt_gpios[0].gpio, 0);
 637        gpio_export(igep_wlan_bt_gpios[1].gpio, 0);
 638        gpio_export(igep_wlan_bt_gpios[2].gpio, 0);
 639
 640        gpio_set_value(igep_wlan_bt_gpios[1].gpio, 0);
 641        udelay(10);
 642        gpio_set_value(igep_wlan_bt_gpios[1].gpio, 1);
 643
 644}
 645#else
 646static inline void __init igep_wlan_bt_init(void) { }
 647#endif
 648
 649static struct regulator_consumer_supply dummy_supplies[] = {
 650        REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
 651        REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
 652};
 653
 654static void __init igep_init(void)
 655{
 656        regulator_register_fixed(1, dummy_supplies, ARRAY_SIZE(dummy_supplies));
 657        omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
 658
 659        /* Get IGEP2 hardware revision */
 660        igep2_get_revision();
 661
 662        omap_hsmmc_init(mmc);
 663
 664        /* Register I2C busses and drivers */
 665        igep_i2c_init();
 666        platform_add_devices(igep_devices, ARRAY_SIZE(igep_devices));
 667        omap_serial_init();
 668        omap_sdrc_init(m65kxxxxam_sdrc_params,
 669                                  m65kxxxxam_sdrc_params);
 670        usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
 671        usb_musb_init(NULL);
 672
 673        igep_flash_init();
 674        igep_leds_init();
 675        omap_twl4030_audio_init("igep2", NULL);
 676
 677        /*
 678         * WLAN-BT combo module from MuRata which has a Marvell WLAN
 679         * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
 680         */
 681        igep_wlan_bt_init();
 682
 683        if (machine_is_igep0020()) {
 684                omap_display_init(&igep2_dss_data);
 685                igep2_init_smsc911x();
 686                usbhs_init_phys(igep2_phy_data, ARRAY_SIZE(igep2_phy_data));
 687                usbhs_init(&igep2_usbhs_bdata);
 688        } else {
 689                usbhs_init_phys(igep3_phy_data, ARRAY_SIZE(igep3_phy_data));
 690                usbhs_init(&igep3_usbhs_bdata);
 691        }
 692}
 693
 694MACHINE_START(IGEP0020, "IGEP v2 board")
 695        .atag_offset    = 0x100,
 696        .reserve        = omap_reserve,
 697        .map_io         = omap3_map_io,
 698        .init_early     = omap35xx_init_early,
 699        .init_irq       = omap3_init_irq,
 700        .handle_irq     = omap3_intc_handle_irq,
 701        .init_machine   = igep_init,
 702        .init_late      = omap35xx_init_late,
 703        .init_time      = omap3_sync32k_timer_init,
 704        .restart        = omap3xxx_restart,
 705MACHINE_END
 706
 707MACHINE_START(IGEP0030, "IGEP OMAP3 module")
 708        .atag_offset    = 0x100,
 709        .reserve        = omap_reserve,
 710        .map_io         = omap3_map_io,
 711        .init_early     = omap35xx_init_early,
 712        .init_irq       = omap3_init_irq,
 713        .handle_irq     = omap3_intc_handle_irq,
 714        .init_machine   = igep_init,
 715        .init_late      = omap35xx_init_late,
 716        .init_time      = omap3_sync32k_timer_init,
 717        .restart        = omap3xxx_restart,
 718MACHINE_END
 719