Merge branch 'tegra/soc' into next/boards
authorArnd Bergmann <arnd@arndb.de>
Fri, 6 Jan 2012 23:09:14 +0000 (23:09 +0000)
committerArnd Bergmann <arnd@arndb.de>
Fri, 6 Jan 2012 23:09:14 +0000 (23:09 +0000)
Conflicts:
arch/arm/mach-tegra/board-harmony-pcie.c

To fix an internal merge conflict between the tegra/soc and tegra/boards
branches.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
1  2 
arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/board-dt-tegra20.c
arch/arm/mach-tegra/board-harmony-pinmux.c
arch/arm/mach-tegra/board-paz00-pinmux.c
arch/arm/mach-tegra/board-paz00.c
arch/arm/mach-tegra/board-seaboard-pinmux.c
arch/arm/mach-tegra/board-trimslice-pinmux.c

@@@ -1,4 -1,3 +1,4 @@@
 +obj-y                                   += board-pinmux.o
  obj-y                                   += common.o
  obj-y                                   += devices.o
  obj-y                                   += io.o
@@@ -6,12 -5,13 +6,13 @@@ obj-
  obj-y                                   += clock.o
  obj-y                                   += timer.o
  obj-y                                   += pinmux.o
- obj-y                                   += powergate.o
  obj-y                                 += fuse.o
- obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += clock.o
+ obj-$(CONFIG_ARCH_TEGRA_2x_SOC)               += powergate.o
  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra2_clocks.o
  obj-$(CONFIG_ARCH_TEGRA_2x_SOC)               += tegra2_emc.o
- obj-$(CONFIG_ARCH_TEGRA_2x_SOC)               += pinmux-t2-tables.o
+ obj-$(CONFIG_ARCH_TEGRA_2x_SOC)               += pinmux-tegra20-tables.o
+ obj-$(CONFIG_ARCH_TEGRA_3x_SOC)               += pinmux-tegra30-tables.o
+ obj-$(CONFIG_ARCH_TEGRA_3x_SOC)               += board-dt-tegra30.o
  obj-$(CONFIG_SMP)                       += platsmp.o localtimer.o headsmp.o
  obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o
  obj-$(CONFIG_TEGRA_SYSTEM_DMA)                += dma.o
@@@ -19,20 -19,22 +20,22 @@@ obj-$(CONFIG_CPU_FREQ
  obj-$(CONFIG_TEGRA_PCI)                       += pcie.o
  obj-$(CONFIG_USB_SUPPORT)             += usb_phy.o
  
- obj-${CONFIG_MACH_HARMONY}              += board-harmony.o
- obj-${CONFIG_MACH_HARMONY}              += board-harmony-pinmux.o
- obj-${CONFIG_MACH_HARMONY}              += board-harmony-pcie.o
- obj-${CONFIG_MACH_HARMONY}              += board-harmony-power.o
+ obj-$(CONFIG_MACH_HARMONY)              += board-harmony.o
+ obj-$(CONFIG_MACH_HARMONY)              += board-harmony-pinmux.o
+ obj-$(CONFIG_MACH_HARMONY)              += board-harmony-pcie.o
+ obj-$(CONFIG_MACH_HARMONY)              += board-harmony-power.o
  
- obj-${CONFIG_MACH_PAZ00}              += board-paz00.o
- obj-${CONFIG_MACH_PAZ00}              += board-paz00-pinmux.o
+ obj-$(CONFIG_MACH_PAZ00)              += board-paz00.o
+ obj-$(CONFIG_MACH_PAZ00)              += board-paz00-pinmux.o
  
- obj-${CONFIG_MACH_SEABOARD}             += board-seaboard.o
- obj-${CONFIG_MACH_SEABOARD}             += board-seaboard-pinmux.o
+ obj-$(CONFIG_MACH_SEABOARD)             += board-seaboard.o
+ obj-$(CONFIG_MACH_SEABOARD)             += board-seaboard-pinmux.o
  
- obj-${CONFIG_MACH_TEGRA_DT}             += board-dt.o
- obj-${CONFIG_MACH_TEGRA_DT}             += board-harmony-pinmux.o
- obj-${CONFIG_MACH_TEGRA_DT}             += board-seaboard-pinmux.o
+ obj-$(CONFIG_MACH_TEGRA_DT)             += board-dt-tegra20.o
+ obj-$(CONFIG_MACH_TEGRA_DT)             += board-harmony-pinmux.o
+ obj-$(CONFIG_MACH_TEGRA_DT)             += board-seaboard-pinmux.o
+ obj-$(CONFIG_MACH_TEGRA_DT)             += board-paz00-pinmux.o
+ obj-$(CONFIG_MACH_TEGRA_DT)             += board-trimslice-pinmux.o
  
- obj-${CONFIG_MACH_TRIMSLICE}            += board-trimslice.o
- obj-${CONFIG_MACH_TRIMSLICE}            += board-trimslice-pinmux.o
+ obj-$(CONFIG_MACH_TRIMSLICE)            += board-trimslice.o
+ obj-$(CONFIG_MACH_TRIMSLICE)            += board-trimslice-pinmux.o
@@@ -37,6 -37,7 +37,7 @@@
  #include <asm/mach/arch.h>
  #include <asm/mach/time.h>
  #include <asm/setup.h>
+ #include <asm/hardware/gic.h>
  
  #include <mach/iomap.h>
  #include <mach/irqs.h>
  #include "devices.h"
  
  void harmony_pinmux_init(void);
+ void paz00_pinmux_init(void);
  void seaboard_pinmux_init(void);
+ void trimslice_pinmux_init(void);
  void ventana_pinmux_init(void);
  
  struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
 +      OF_DEV_AUXDATA("nvidia,tegra20-pinmux", TEGRA_APB_MISC_BASE + 0x14, "tegra-pinmux", NULL),
 +      OF_DEV_AUXDATA("nvidia,tegra20-gpio", TEGRA_GPIO_BASE, "tegra-gpio", NULL),
        OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC1_BASE, "sdhci-tegra.0", NULL),
        OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC2_BASE, "sdhci-tegra.1", NULL),
        OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC3_BASE, "sdhci-tegra.2", NULL),
        OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C3_BASE, "tegra-i2c.2", NULL),
        OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_DVC_BASE, "tegra-i2c.3", NULL),
        OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S1_BASE, "tegra-i2s.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S1_BASE, "tegra-i2s.1", NULL),
+       OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S2_BASE, "tegra-i2s.1", NULL),
        OF_DEV_AUXDATA("nvidia,tegra20-das", TEGRA_APB_MISC_DAS_BASE, "tegra-das", NULL),
+       OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB_BASE, "tegra-ehci.0",
+                      &tegra_ehci1_device.dev.platform_data),
+       OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB2_BASE, "tegra-ehci.1",
+                      &tegra_ehci2_device.dev.platform_data),
+       OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2",
+                      &tegra_ehci3_device.dev.platform_data),
        {}
  };
  
  static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = {
        /* name         parent          rate            enabled */
        { "uartd",      "pll_p",        216000000,      true },
+       { "usbd",       "clk_m",        12000000,       false },
+       { "usb2",       "clk_m",        12000000,       false },
+       { "usb3",       "clk_m",        12000000,       false },
+       { "pll_a",      "pll_p_out1",   56448000,       true },
+       { "pll_a_out0", "pll_a",        11289600,       true },
+       { "cdev1",      NULL,           0,              true },
+       { "i2s1",       "pll_a_out0",   11289600,       false},
+       { "i2s2",       "pll_a_out0",   11289600,       false},
        { NULL,         NULL,           0,              0},
  };
  
@@@ -78,32 -93,30 +95,23 @@@ static struct of_device_id tegra_dt_mat
        {}
  };
  
- static struct of_device_id tegra_dt_gic_match[] __initdata = {
-       { .compatible = "nvidia,tegra20-gic", },
-       {}
- };
  static struct {
        char *machine;
        void (*init)(void);
  } pinmux_configs[] = {
+       { "compulab,trimslice", trimslice_pinmux_init },
        { "nvidia,harmony", harmony_pinmux_init },
+       { "compal,paz00", paz00_pinmux_init },
        { "nvidia,seaboard", seaboard_pinmux_init },
        { "nvidia,ventana", ventana_pinmux_init },
  };
  
  static void __init tegra_dt_init(void)
  {
-       struct device_node *node;
        int i;
  
-       node = of_find_matching_node_by_address(NULL, tegra_dt_gic_match,
-                                               TEGRA_ARM_INT_DIST_BASE);
-       if (node)
-               irq_domain_add_simple(node, INT_GIC_BASE);
        tegra_clk_init_from_table(tegra_dt_clk_init_table);
  
 -      /*
 -       * Finished with the static registrations now; fill in the missing
 -       * devices
 -       */
 -      of_platform_populate(NULL, tegra_dt_match_table,
 -                              tegra20_auxdata_lookup, NULL);
 -
        for (i = 0; i < ARRAY_SIZE(pinmux_configs); i++) {
                if (of_machine_is_compatible(pinmux_configs[i].machine)) {
                        pinmux_configs[i].init();
  
        WARN(i == ARRAY_SIZE(pinmux_configs),
                "Unknown platform! Pinmuxing not initialized\n");
 +
 +      /*
 +       * Finished with the static registrations now; fill in the missing
 +       * devices
 +       */
 +      of_platform_populate(NULL, tegra_dt_match_table,
 +                              tegra20_auxdata_lookup, NULL);
  }
  
- static const char * tegra_dt_board_compat[] = {
+ static const char *tegra20_dt_board_compat[] = {
+       "compulab,trimslice",
        "nvidia,harmony",
+       "compal,paz00",
        "nvidia,seaboard",
        "nvidia,ventana",
        NULL
  };
  
- DT_MACHINE_START(TEGRA_DT, "nVidia Tegra (Flattened Device Tree)")
+ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra20 (Flattened Device Tree)")
        .map_io         = tegra_map_common_io,
-       .init_early     = tegra_init_early,
-       .init_irq       = tegra_init_irq,
+       .init_early     = tegra20_init_early,
+       .init_irq       = tegra_dt_init_irq,
        .handle_irq     = gic_handle_irq,
        .timer          = &tegra_timer,
        .init_machine   = tegra_dt_init,
-       .dt_compat      = tegra_dt_board_compat,
+       .dt_compat      = tegra20_dt_board_compat,
  MACHINE_END
  #include <linux/of.h>
  
  #include <mach/pinmux.h>
+ #include <mach/pinmux-tegra20.h>
  
  #include "gpio-names.h"
  #include "board-harmony.h"
 -#include "devices.h"
 +#include "board-pinmux.h"
  
  static struct tegra_pingroup_config harmony_pinmux[] = {
        {TEGRA_PINGROUP_ATA,   TEGRA_MUX_IDE,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_XM2D,  TEGRA_MUX_NONE,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
  };
  
 -static struct platform_device *pinmux_devices[] = {
 -      &tegra_gpio_device,
 -      &tegra_pinmux_device,
 -};
 -
  static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TEGRA_GPIO_SD2_CD,            .enable = true  },
        { .gpio = TEGRA_GPIO_SD2_WP,            .enable = true  },
        { .gpio = TEGRA_GPIO_EXT_MIC_EN,        .enable = true  },
  };
  
 +static struct tegra_board_pinmux_conf conf = {
 +      .pgs = harmony_pinmux,
 +      .pg_count = ARRAY_SIZE(harmony_pinmux),
 +      .gpios = gpio_table,
 +      .gpio_count = ARRAY_SIZE(gpio_table),
 +};
 +
  void harmony_pinmux_init(void)
  {
 -      if (!of_machine_is_compatible("nvidia,tegra20"))
 -              platform_add_devices(pinmux_devices,
 -                                      ARRAY_SIZE(pinmux_devices));
 -
 -      tegra_pinmux_config_table(harmony_pinmux, ARRAY_SIZE(harmony_pinmux));
 -
 -      tegra_gpio_config(gpio_table, ARRAY_SIZE(gpio_table));
 +      tegra_board_pinmux_init(&conf, NULL);
  }
  #include <linux/of.h>
  
  #include <mach/pinmux.h>
+ #include <mach/pinmux-tegra20.h>
  
  #include "gpio-names.h"
  #include "board-paz00.h"
 -#include "devices.h"
 +#include "board-pinmux.h"
  
  static struct tegra_pingroup_config paz00_pinmux[] = {
        {TEGRA_PINGROUP_ATA,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
@@@ -30,7 -31,7 +31,7 @@@
        {TEGRA_PINGROUP_ATC,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_ATD,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_ATE,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_PLLA_OUT,      TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE},
 +      {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_PLLA_OUT,      TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_CDEV2, TEGRA_MUX_PLLP_OUT4,     TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_CRTP,  TEGRA_MUX_CRT,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_CSUS,  TEGRA_MUX_PLLC_OUT1,     TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_XM2D,  TEGRA_MUX_NONE,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
  };
  
 -static struct platform_device *pinmux_devices[] = {
 -      &tegra_gpio_device,
 -      &tegra_pinmux_device,
 -};
 -
  static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TEGRA_GPIO_SD1_CD,    .enable = true },
        { .gpio = TEGRA_GPIO_SD1_WP,    .enable = true },
        { .gpio = TEGRA_WIFI_LED,       .enable = true },
  };
  
 +static struct tegra_board_pinmux_conf conf = {
 +      .pgs = paz00_pinmux,
 +      .pg_count = ARRAY_SIZE(paz00_pinmux),
 +      .gpios = gpio_table,
 +      .gpio_count = ARRAY_SIZE(gpio_table),
 +};
 +
  void paz00_pinmux_init(void)
  {
 -      if (!of_machine_is_compatible("nvidia,tegra20"))
 -              platform_add_devices(pinmux_devices,
 -                                      ARRAY_SIZE(pinmux_devices));
 -
 -      tegra_pinmux_config_table(paz00_pinmux, ARRAY_SIZE(paz00_pinmux));
 -
 -      tegra_gpio_config(gpio_table, ARRAY_SIZE(gpio_table));
 +      tegra_board_pinmux_init(&conf, NULL);
  }
  #include <linux/serial_8250.h>
  #include <linux/clk.h>
  #include <linux/dma-mapping.h>
 +#include <linux/gpio_keys.h>
  #include <linux/pda_power.h>
  #include <linux/io.h>
 +#include <linux/input.h>
  #include <linux/i2c.h>
  #include <linux/gpio.h>
  #include <linux/rfkill-gpio.h>
@@@ -117,37 -115,12 +117,37 @@@ static struct platform_device leds_gpi
          },
  };
  
 +static struct gpio_keys_button paz00_gpio_keys_buttons[] = {
 +      {
 +              .code           = KEY_POWER,
 +              .gpio           = TEGRA_GPIO_POWERKEY,
 +              .active_low     = 1,
 +              .desc           = "Power",
 +              .type           = EV_KEY,
 +              .wakeup         = 1,
 +      },
 +};
 +
 +static struct gpio_keys_platform_data paz00_gpio_keys = {
 +      .buttons        = paz00_gpio_keys_buttons,
 +      .nbuttons       = ARRAY_SIZE(paz00_gpio_keys_buttons),
 +};
 +
 +static struct platform_device gpio_keys_device = {
 +      .name   = "gpio-keys",
 +      .id     = -1,
 +      .dev    = {
 +              .platform_data = &paz00_gpio_keys,
 +      },
 +};
 +
  static struct platform_device *paz00_devices[] __initdata = {
        &debug_uart,
        &tegra_sdhci_device4,
        &tegra_sdhci_device1,
        &wifi_rfkill_device,
        &leds_gpio,
 +      &gpio_keys_device,
  };
  
  static void paz00_i2c_init(void)
@@@ -216,7 -189,7 +216,7 @@@ MACHINE_START(PAZ00, "Toshiba AC100 / D
        .atag_offset    = 0x100,
        .fixup          = tegra_paz00_fixup,
        .map_io         = tegra_map_common_io,
-       .init_early     = tegra_init_early,
+       .init_early     = tegra20_init_early,
        .init_irq       = tegra_init_irq,
        .handle_irq     = gic_handle_irq,
        .timer          = &tegra_timer,
  #include <linux/of.h>
  
  #include <mach/pinmux.h>
- #include <mach/pinmux-t2.h>
+ #include <mach/pinmux-tegra20.h>
  
  #include "gpio-names.h"
 +#include "board-pinmux.h"
  #include "board-seaboard.h"
 -#include "devices.h"
  
  #define DEFAULT_DRIVE(_name)                                  \
        {                                                       \
                .slew_falling = TEGRA_SLEW_SLOWEST,             \
        }
  
 -static __initdata struct tegra_drive_pingroup_config seaboard_drive_pinmux[] = {
 +static struct tegra_drive_pingroup_config seaboard_drive_pinmux[] = {
        DEFAULT_DRIVE(SDIO1),
  };
  
 -static __initdata struct tegra_pingroup_config seaboard_pinmux[] = {
 +static struct tegra_pingroup_config common_pinmux[] = {
        {TEGRA_PINGROUP_ATA,   TEGRA_MUX_IDE,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_ATB,   TEGRA_MUX_SDIO4,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_ATC,   TEGRA_MUX_NAND,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
@@@ -55,6 -55,7 +55,6 @@@
        {TEGRA_PINGROUP_DAP2,  TEGRA_MUX_DAP2,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_DAP3,  TEGRA_MUX_DAP3,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_DAP4,  TEGRA_MUX_DAP4,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_DDC,   TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_DTA,   TEGRA_MUX_VI,            TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_DTB,   TEGRA_MUX_VI,            TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_DTC,   TEGRA_MUX_VI,            TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
@@@ -64,6 -65,7 +64,6 @@@
        {TEGRA_PINGROUP_GMA,   TEGRA_MUX_SDIO4,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_GMB,   TEGRA_MUX_GMI,           TEGRA_PUPD_PULL_UP,   TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_GMC,   TEGRA_MUX_UARTD,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_GMD,   TEGRA_MUX_SFLASH,        TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_GME,   TEGRA_MUX_SDIO4,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_GPU,   TEGRA_MUX_PWM,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_GPU7,  TEGRA_MUX_RTCK,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_LM0,   TEGRA_MUX_RSVD4,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_LM1,   TEGRA_MUX_CRT,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_LPP,   TEGRA_MUX_DISPLAYA,      TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_LPW0,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_LPW1,  TEGRA_MUX_RSVD4,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 -      {TEGRA_PINGROUP_LPW2,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_LSC0,  TEGRA_MUX_DISPLAYA,      TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_LSC1,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 -      {TEGRA_PINGROUP_LSCK,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 -      {TEGRA_PINGROUP_LSDA,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_LSDI,  TEGRA_MUX_RSVD4,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_LSPI,  TEGRA_MUX_DISPLAYA,      TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_LVP0,  TEGRA_MUX_RSVD4,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_LVS,   TEGRA_MUX_DISPLAYA,      TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_OWC,   TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_PMC,   TEGRA_MUX_PWR_ON,        TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_PTA,   TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_RM,    TEGRA_MUX_I2C,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SDB,   TEGRA_MUX_SDIO3,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SDC,   TEGRA_MUX_SDIO3,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SDD,   TEGRA_MUX_SDIO3,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SDIO1, TEGRA_MUX_SDIO1,         TEGRA_PUPD_PULL_UP,   TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SLXA,  TEGRA_MUX_PCIE,          TEGRA_PUPD_PULL_UP,   TEGRA_TRI_TRISTATE},
 -      {TEGRA_PINGROUP_SLXC,  TEGRA_MUX_SPDIF,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_SLXD,  TEGRA_MUX_SPDIF,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_SLXK,  TEGRA_MUX_PCIE,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SPDI,  TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SPDO,  TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_SPIA,  TEGRA_MUX_GMI,           TEGRA_PUPD_PULL_UP,   TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_SPIB,  TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 -      {TEGRA_PINGROUP_SPIC,  TEGRA_MUX_GMI,           TEGRA_PUPD_PULL_UP,   TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SPID,  TEGRA_MUX_SPI1,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_SPIE,  TEGRA_MUX_SPI1,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_SPIF,  TEGRA_MUX_SPI1,          TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_TRISTATE},
 -      {TEGRA_PINGROUP_SPIG,  TEGRA_MUX_SPI2_ALT,      TEGRA_PUPD_PULL_UP,   TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_SPIH,  TEGRA_MUX_SPI2_ALT,      TEGRA_PUPD_PULL_UP,   TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UAA,   TEGRA_MUX_ULPI,          TEGRA_PUPD_PULL_UP,   TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_UAB,   TEGRA_MUX_ULPI,          TEGRA_PUPD_PULL_UP,   TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_XM2D,  TEGRA_MUX_NONE,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
  };
  
 -static __initdata struct tegra_pingroup_config ventana_pinmux[] = {
 -      {TEGRA_PINGROUP_DAP3, TEGRA_MUX_DAP3,     TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 +static struct tegra_pingroup_config seaboard_pinmux[] = {
 +      {TEGRA_PINGROUP_DDC,   TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 +      {TEGRA_PINGROUP_GMD,   TEGRA_MUX_SFLASH,        TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 +      {TEGRA_PINGROUP_LPW0,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 +      {TEGRA_PINGROUP_LPW2,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 +      {TEGRA_PINGROUP_LSC1,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 +      {TEGRA_PINGROUP_LSCK,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 +      {TEGRA_PINGROUP_LSDA,  TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 +      {TEGRA_PINGROUP_PTA,   TEGRA_MUX_HDMI,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 +      {TEGRA_PINGROUP_SLXC,  TEGRA_MUX_SPDIF,         TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
 +      {TEGRA_PINGROUP_SLXK,  TEGRA_MUX_PCIE,          TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 +      {TEGRA_PINGROUP_SPIA,  TEGRA_MUX_GMI,           TEGRA_PUPD_PULL_UP,   TEGRA_TRI_TRISTATE},
 +      {TEGRA_PINGROUP_SPIC,  TEGRA_MUX_GMI,           TEGRA_PUPD_PULL_UP,   TEGRA_TRI_NORMAL},
 +      {TEGRA_PINGROUP_SPIG,  TEGRA_MUX_SPI2_ALT,      TEGRA_PUPD_PULL_UP,   TEGRA_TRI_TRISTATE},
 +};
 +
 +static struct tegra_pingroup_config ventana_pinmux[] = {
        {TEGRA_PINGROUP_DDC,  TEGRA_MUX_RSVD2,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_DTA,  TEGRA_MUX_VI,       TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_DTB,  TEGRA_MUX_VI,       TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_DTC,  TEGRA_MUX_VI,       TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
 -      {TEGRA_PINGROUP_DTD,  TEGRA_MUX_VI,       TEGRA_PUPD_PULL_DOWN, TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_GMD,  TEGRA_MUX_SFLASH,   TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_LPW0, TEGRA_MUX_RSVD4,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_LPW2, TEGRA_MUX_RSVD4,    TEGRA_PUPD_NORMAL,    TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SPIG, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_NORMAL,    TEGRA_TRI_TRISTATE},
  };
  
 -static struct platform_device *pinmux_devices[] = {
 -      &tegra_gpio_device,
 -      &tegra_pinmux_device,
 -};
 -
  static struct tegra_gpio_table common_gpio_table[] = {
        { .gpio = TEGRA_GPIO_SD2_CD,            .enable = true },
        { .gpio = TEGRA_GPIO_SD2_WP,            .enable = true },
        { .gpio = TEGRA_GPIO_SD2_POWER,         .enable = true },
 +      { .gpio = TEGRA_GPIO_CDC_IRQ,           .enable = true },
 +};
 +
 +static struct tegra_gpio_table seaboard_gpio_table[] = {
        { .gpio = TEGRA_GPIO_LIDSWITCH,         .enable = true },
        { .gpio = TEGRA_GPIO_POWERKEY,          .enable = true },
        { .gpio = TEGRA_GPIO_HP_DET,            .enable = true },
        { .gpio = TEGRA_GPIO_ISL29018_IRQ,      .enable = true },
 -      { .gpio = TEGRA_GPIO_CDC_IRQ,           .enable = true },
        { .gpio = TEGRA_GPIO_USB1,              .enable = true },
  };
  
 -static void __init update_pinmux(struct tegra_pingroup_config *newtbl, int size)
 -{
 -      int i, j;
 -      struct tegra_pingroup_config *new_pingroup, *base_pingroup;
 -
 -      /* Update base seaboard pinmux table with secondary board
 -       * specific pinmux table table.
 -       */
 -      for (i = 0; i < size; i++) {
 -              new_pingroup = &newtbl[i];
 -              for (j = 0; j < ARRAY_SIZE(seaboard_pinmux); j++) {
 -                      base_pingroup = &seaboard_pinmux[j];
 -                      if (new_pingroup->pingroup == base_pingroup->pingroup) {
 -                              *base_pingroup = *new_pingroup;
 -                              break;
 -                      }
 -              }
 -      }
 -}
 -
 -void __init seaboard_common_pinmux_init(void)
 -{
 -      if (!of_machine_is_compatible("nvidia,tegra20"))
 -              platform_add_devices(pinmux_devices,
 -                                      ARRAY_SIZE(pinmux_devices));
 +static struct tegra_gpio_table ventana_gpio_table[] = {
 +      /* hp_det */
 +      { .gpio = TEGRA_GPIO_PW2,               .enable = true },
 +      /* int_mic_en */
 +      { .gpio = TEGRA_GPIO_PX0,               .enable = true },
 +      /* ext_mic_en */
 +      { .gpio = TEGRA_GPIO_PX1,               .enable = true },
 +};
  
 -      tegra_pinmux_config_table(seaboard_pinmux, ARRAY_SIZE(seaboard_pinmux));
 +static struct tegra_board_pinmux_conf common_conf = {
 +      .pgs = common_pinmux,
 +      .pg_count = ARRAY_SIZE(common_pinmux),
 +      .gpios = common_gpio_table,
 +      .gpio_count = ARRAY_SIZE(common_gpio_table),
 +};
  
 -      tegra_drive_pinmux_config_table(seaboard_drive_pinmux,
 -                                      ARRAY_SIZE(seaboard_drive_pinmux));
 +static struct tegra_board_pinmux_conf seaboard_conf = {
 +      .pgs = seaboard_pinmux,
 +      .pg_count = ARRAY_SIZE(seaboard_pinmux),
 +      .drives = seaboard_drive_pinmux,
 +      .drive_count = ARRAY_SIZE(seaboard_drive_pinmux),
 +      .gpios = seaboard_gpio_table,
 +      .gpio_count = ARRAY_SIZE(seaboard_gpio_table),
 +};
  
 -      tegra_gpio_config(common_gpio_table, ARRAY_SIZE(common_gpio_table));
 -}
 +static struct tegra_board_pinmux_conf ventana_conf = {
 +      .pgs = ventana_pinmux,
 +      .pg_count = ARRAY_SIZE(ventana_pinmux),
 +      .gpios = ventana_gpio_table,
 +      .gpio_count = ARRAY_SIZE(ventana_gpio_table),
 +};
  
 -void __init seaboard_pinmux_init(void)
 +void seaboard_pinmux_init(void)
  {
 -      seaboard_common_pinmux_init();
 +      tegra_board_pinmux_init(&common_conf, &seaboard_conf);
  }
  
 -void __init ventana_pinmux_init(void)
 +void ventana_pinmux_init(void)
  {
 -      update_pinmux(ventana_pinmux, ARRAY_SIZE(ventana_pinmux));
 -      seaboard_common_pinmux_init();
 +      tegra_board_pinmux_init(&common_conf, &ventana_conf);
  }
 -
  #include <linux/of.h>
  
  #include <mach/pinmux.h>
+ #include <mach/pinmux-tegra20.h>
  
  #include "gpio-names.h"
 +#include "board-pinmux.h"
  #include "board-trimslice.h"
 -#include "devices.h"
  
 -static __initdata struct tegra_pingroup_config trimslice_pinmux[] = {
 +static struct tegra_pingroup_config trimslice_pinmux[] = {
        {TEGRA_PINGROUP_ATA,   TEGRA_MUX_IDE,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_ATB,   TEGRA_MUX_SDIO4,         TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_ATC,   TEGRA_MUX_NAND,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_LVS,   TEGRA_MUX_DISPLAYA,      TEGRA_PUPD_PULL_UP,     TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_OWC,   TEGRA_MUX_RSVD2,         TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_PMC,   TEGRA_MUX_PWR_ON,        TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
 -      {TEGRA_PINGROUP_PTA,   TEGRA_MUX_RSVD3,         TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
 +      {TEGRA_PINGROUP_PTA,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_RM,    TEGRA_MUX_I2C,           TEGRA_PUPD_PULL_UP,     TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SDB,   TEGRA_MUX_PWM,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_SDC,   TEGRA_MUX_PWM,           TEGRA_PUPD_PULL_UP,     TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_XM2D,  TEGRA_MUX_NONE,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
  };
  
 -static struct platform_device *pinmux_devices[] = {
 -      &tegra_gpio_device,
 -      &tegra_pinmux_device,
 -};
 -
  static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TRIMSLICE_GPIO_SD4_CD, .enable = true }, /* mmc4 cd */
        { .gpio = TRIMSLICE_GPIO_SD4_WP, .enable = true }, /* mmc4 wp */
        { .gpio = TRIMSLICE_GPIO_USB2_RST,  .enable = true }, /* USB2 PHY rst */
  };
  
 -void __init trimslice_pinmux_init(void)
 +static struct tegra_board_pinmux_conf conf = {
 +      .pgs = trimslice_pinmux,
 +      .pg_count = ARRAY_SIZE(trimslice_pinmux),
 +      .gpios = gpio_table,
 +      .gpio_count = ARRAY_SIZE(gpio_table),
 +};
 +
 +void trimslice_pinmux_init(void)
  {
 -      if (!of_machine_is_compatible("nvidia,tegra20"))
 -              platform_add_devices(pinmux_devices,
 -                                      ARRAY_SIZE(pinmux_devices));
 -      tegra_pinmux_config_table(trimslice_pinmux, ARRAY_SIZE(trimslice_pinmux));
 -      tegra_gpio_config(gpio_table, ARRAY_SIZE(gpio_table));
 +      tegra_board_pinmux_init(&conf, NULL);
  }