Merge branch 'next/fixes' into next/cleanup
authorArnd Bergmann <arnd@arndb.de>
Mon, 31 Oct 2011 22:25:41 +0000 (23:25 +0100)
committerArnd Bergmann <arnd@arndb.de>
Mon, 31 Oct 2011 22:25:41 +0000 (23:25 +0100)
Conflicts:
arch/arm/mach-mxs/include/mach/gpio.h
arch/arm/plat-mxc/include/mach/gpio.h
drivers/video/omap/lcd_apollon.c
drivers/video/omap/lcd_ldp.c
drivers/video/omap/lcd_overo.c

21 files changed:
1  2 
arch/arm/Kconfig
arch/arm/mach-davinci/dm355.c
arch/arm/mach-davinci/dm644x.c
arch/arm/mach-davinci/dm646x.c
arch/arm/mach-mx5/pm-imx5.c
arch/arm/mach-mxs/include/mach/gpio.h
arch/arm/mach-omap2/board-2430sdp.c
arch/arm/mach-omap2/board-4430sdp.c
arch/arm/mach-omap2/board-generic.c
arch/arm/mach-omap2/board-h4.c
arch/arm/mach-omap2/board-ldp.c
arch/arm/mach-omap2/devices.c
arch/arm/mach-omap2/hsmmc.c
arch/arm/mach-prima2/prima2.c
arch/arm/mach-u300/Kconfig
arch/arm/mach-u300/core.c
arch/arm/mach-ux500/board-mop500-pins.c
arch/arm/mach-ux500/board-mop500.c
arch/arm/plat-mxc/include/mach/gpio.h
arch/arm/plat-mxc/include/mach/iomux-v3.h
arch/arm/plat-omap/devices.c

diff --combined arch/arm/Kconfig
@@@ -29,7 -29,6 +29,7 @@@ config AR
        select HAVE_GENERIC_HARDIRQS
        select HAVE_SPARSE_IRQ
        select GENERIC_IRQ_SHOW
 +      select CPU_PM if (SUSPEND || CPU_IDLE)
        help
          The ARM series is a line of low-power-consumption RISC chip designs
          licensed by ARM Ltd and targeted at embedded applications and
@@@ -196,7 -195,8 +196,8 @@@ config VECTORS_BAS
          The base address of exception vectors.
  
  config ARM_PATCH_PHYS_VIRT
-       bool "Patch physical to virtual translations at runtime"
+       bool "Patch physical to virtual translations at runtime" if EMBEDDED
+       default y
        depends on !XIP_KERNEL && MMU
        depends on !ARCH_REALVIEW || !SPARSEMEM
        help
          kernel in system memory.
  
          This can only be used with non-XIP MMU kernels where the base
-         of physical memory is at a 16MB boundary, or theoretically 64K
-         for the MSM machine class.
+         of physical memory is at a 16MB boundary.
+         Only disable this option if you know that you do not require
+         this feature (eg, building a kernel for a single machine) and
+         you need to shrink the kernel to the minimal size.
+ config NEED_MACH_MEMORY_H
+       bool
+       help
+         Select this when mach/memory.h is required to provide special
+         definitions for this platform.  The need for mach/memory.h should
+         be avoided when possible.
  
- config ARM_PATCH_PHYS_VIRT_16BIT
-       def_bool y
-       depends on ARM_PATCH_PHYS_VIRT && ARCH_MSM
+ config PHYS_OFFSET
+       hex "Physical address of main memory"
+       depends on !ARM_PATCH_PHYS_VIRT && !NEED_MACH_MEMORY_H
        help
-         This option extends the physical to virtual translation patching
-         to allow physical memory down to a theoretical minimum of 64K
-         boundaries.
+         Please provide the physical address corresponding to the
+         location of main memory in your system.
  
  source "init/Kconfig"
  
@@@ -247,6 -256,7 +257,7 @@@ config ARCH_INTEGRATO
        select GENERIC_CLOCKEVENTS
        select PLAT_VERSATILE
        select PLAT_VERSATILE_FPGA_IRQ
+       select NEED_MACH_MEMORY_H
        help
          Support for ARM's Integrator platform.
  
@@@ -262,6 -272,7 +273,7 @@@ config ARCH_REALVIE
        select PLAT_VERSATILE_CLCD
        select ARM_TIMER_SP804
        select GPIO_PL061 if GPIOLIB
+       select NEED_MACH_MEMORY_H
        help
          This enables support for ARM Ltd RealView boards.
  
@@@ -302,7 -313,6 +314,6 @@@ config ARCH_AT9
        select ARCH_REQUIRE_GPIOLIB
        select HAVE_CLK
        select CLKDEV_LOOKUP
-       select ARM_PATCH_PHYS_VIRT if MMU
        help
          This enables support for systems based on the Atmel AT91RM9200,
          AT91SAM9 and AT91CAP9 processors.
@@@ -323,6 -333,7 +334,7 @@@ config ARCH_CLPS711
        bool "Cirrus Logic CLPS711x/EP721x-based"
        select CPU_ARM720T
        select ARCH_USES_GETTIMEOFFSET
+       select NEED_MACH_MEMORY_H
        help
          Support for Cirrus Logic 711x/721x based boards.
  
@@@ -363,6 -374,7 +375,7 @@@ config ARCH_EBSA11
        select ISA
        select NO_IOPORT
        select ARCH_USES_GETTIMEOFFSET
+       select NEED_MACH_MEMORY_H
        help
          This is an evaluation board for the StrongARM processor available
          from Digital. It has limited hardware on-board, including an
@@@ -378,6 -390,7 +391,7 @@@ config ARCH_EP93X
        select ARCH_REQUIRE_GPIOLIB
        select ARCH_HAS_HOLES_MEMORYMODEL
        select ARCH_USES_GETTIMEOFFSET
+       select NEED_MEMORY_H
        help
          This enables support for the Cirrus EP93xx series of CPUs.
  
@@@ -386,6 -399,7 +400,7 @@@ config ARCH_FOOTBRIDG
        select CPU_SA110
        select FOOTBRIDGE
        select GENERIC_CLOCKEVENTS
+       select NEED_MACH_MEMORY_H
        help
          Support for systems based on the DC21285 companion chip
          ("FootBridge"), such as the Simtec CATS and the Rebel NetWinder.
@@@ -435,6 -449,7 +450,7 @@@ config ARCH_IOP13X
        select PCI
        select ARCH_SUPPORTS_MSI
        select VMSPLIT_1G
+       select NEED_MACH_MEMORY_H
        help
          Support for Intel's IOP13XX (XScale) family of processors.
  
@@@ -465,6 -480,7 +481,7 @@@ config ARCH_IXP23X
        select CPU_XSC3
        select PCI
        select ARCH_USES_GETTIMEOFFSET
+       select NEED_MACH_MEMORY_H
        help
          Support for Intel's IXP23xx (XScale) family of processors.
  
@@@ -474,6 -490,7 +491,7 @@@ config ARCH_IXP200
        select CPU_XSCALE
        select PCI
        select ARCH_USES_GETTIMEOFFSET
+       select NEED_MACH_MEMORY_H
        help
          Support for Intel's IXP2400/2800 (XScale) family of processors.
  
@@@ -567,6 -584,7 +585,7 @@@ config ARCH_KS869
        select CPU_ARM922T
        select ARCH_REQUIRE_GPIOLIB
        select ARCH_USES_GETTIMEOFFSET
+       select NEED_MACH_MEMORY_H
        help
          Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based
          System-on-Chip devices.
@@@ -658,6 -676,7 +677,7 @@@ config ARCH_SHMOBIL
        select SPARSE_IRQ
        select MULTI_IRQ_HANDLER
        select PM_GENERIC_DOMAINS if PM
+       select NEED_MACH_MEMORY_H
        help
          Support for Renesas's SH-Mobile and R-Mobile ARM platforms.
  
@@@ -672,6 -691,7 +692,7 @@@ config ARCH_RP
        select NO_IOPORT
        select ARCH_SPARSEMEM_ENABLE
        select ARCH_USES_GETTIMEOFFSET
+       select NEED_MACH_MEMORY_H
        help
          On the Acorn Risc-PC, Linux can support the internal IDE disk and
          CD-ROM interface, serial and parallel port, and the floppy drive.
@@@ -690,6 -710,7 +711,7 @@@ config ARCH_SA110
        select HAVE_SCHED_CLOCK
        select TICK_ONESHOT
        select ARCH_REQUIRE_GPIOLIB
+       select NEED_MACH_MEMORY_H
        help
          Support for StrongARM 11x0 based boards.
  
@@@ -782,6 -803,7 +804,7 @@@ config ARCH_S5PV21
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C_RTC if RTC_CLASS
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
+       select NEED_MACH_MEMORY_H
        help
          Samsung S5PV210/S5PC110 series based systems
  
@@@ -798,6 -820,7 +821,7 @@@ config ARCH_EXYNOS
        select HAVE_S3C_RTC if RTC_CLASS
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
+       select NEED_MACH_MEMORY_H
        help
          Samsung EXYNOS4 series based systems
  
@@@ -809,6 -832,7 +833,7 @@@ config ARCH_SHAR
        select ZONE_DMA
        select PCI
        select ARCH_USES_GETTIMEOFFSET
+       select NEED_MACH_MEMORY_H
        help
          Support for the StrongARM based Digital DNARD machine, also known
          as "Shark" (<http://www.shark-linux.de/shark.html>).
@@@ -831,12 -855,13 +856,14 @@@ config ARCH_U30
        select HAVE_SCHED_CLOCK
        select HAVE_TCM
        select ARM_AMBA
 +      select ARM_PATCH_PHYS_VIRT
        select ARM_VIC
        select GENERIC_CLOCKEVENTS
        select CLKDEV_LOOKUP
        select HAVE_MACH_CLKDEV
        select GENERIC_GPIO
+       select ARCH_REQUIRE_GPIOLIB
+       select NEED_MACH_MEMORY_H
        help
          Support for ST-Ericsson U300 series mobile platforms.
  
@@@ -1809,38 -1834,6 +1836,38 @@@ config ZBOOT_ROM_SH_MOBILE_SDH
  
  endchoice
  
 +config ARM_APPENDED_DTB
 +      bool "Use appended device tree blob to zImage (EXPERIMENTAL)"
 +      depends on OF && !ZBOOT_ROM && EXPERIMENTAL
 +      help
 +        With this option, the boot code will look for a device tree binary
 +        (DTB) appended to zImage
 +        (e.g. cat zImage <filename>.dtb > zImage_w_dtb).
 +
 +        This is meant as a backward compatibility convenience for those
 +        systems with a bootloader that can't be upgraded to accommodate
 +        the documented boot protocol using a device tree.
 +
 +        Beware that there is very little in terms of protection against
 +        this option being confused by leftover garbage in memory that might
 +        look like a DTB header after a reboot if no actual DTB is appended
 +        to zImage.  Do not leave this option active in a production kernel
 +        if you don't intend to always append a DTB.  Proper passing of the
 +        location into r2 of a bootloader provided DTB is always preferable
 +        to this option.
 +
 +config ARM_ATAG_DTB_COMPAT
 +      bool "Supplement the appended DTB with traditional ATAG information"
 +      depends on ARM_APPENDED_DTB
 +      help
 +        Some old bootloaders can't be updated to a DTB capable one, yet
 +        they provide ATAGs with memory configuration, the ramdisk address,
 +        the kernel cmdline string, etc.  Such information is dynamically
 +        provided by the bootloader and can't always be stored in a static
 +        DTB.  To allow a device tree enabled kernel to be used with such
 +        bootloaders, this option allows zImage to extract the information
 +        from the ATAG list and store it at run time into the appended DTB.
 +
  config CMDLINE
        string "Default kernel command string"
        default ""
@@@ -1987,6 -1980,7 +2014,7 @@@ config CPU_FREQ_PX
        bool
        depends on CPU_FREQ && ARCH_PXA && PXA25x
        default y
+       select CPU_FREQ_TABLE
        select CPU_FREQ_DEFAULT_GOV_USERSPACE
  
  config CPU_FREQ_S3C
@@@ -13,7 -13,6 +13,6 @@@
  #include <linux/serial_8250.h>
  #include <linux/platform_device.h>
  #include <linux/dma-mapping.h>
- #include <linux/gpio.h>
  
  #include <linux/spi/spi.h>
  
@@@ -30,6 -29,7 +29,7 @@@
  #include <mach/common.h>
  #include <mach/asp.h>
  #include <mach/spi.h>
+ #include <mach/gpio-davinci.h>
  
  #include "clock.h"
  #include "mux.h"
@@@ -591,7 -591,6 +591,7 @@@ static struct edma_soc_info edma_cc0_in
        .n_cc                   = 1,
        .queue_tc_mapping       = queue_tc_mapping,
        .queue_priority_mapping = queue_priority_mapping,
 +      .default_queue          = EVENTQ_1,
  };
  
  static struct edma_soc_info *dm355_edma_info[EDMA_MAX_CC] = {
@@@ -12,7 -12,6 +12,6 @@@
  #include <linux/clk.h>
  #include <linux/serial_8250.h>
  #include <linux/platform_device.h>
- #include <linux/gpio.h>
  
  #include <asm/mach/map.h>
  
@@@ -26,6 -25,7 +25,7 @@@
  #include <mach/serial.h>
  #include <mach/common.h>
  #include <mach/asp.h>
+ #include <mach/gpio-davinci.h>
  
  #include "clock.h"
  #include "mux.h"
@@@ -514,7 -514,6 +514,7 @@@ static struct edma_soc_info edma_cc0_in
        .n_cc                   = 1,
        .queue_tc_mapping       = queue_tc_mapping,
        .queue_priority_mapping = queue_priority_mapping,
 +      .default_queue          = EVENTQ_1,
  };
  
  static struct edma_soc_info *dm644x_edma_info[EDMA_MAX_CC] = {
@@@ -13,7 -13,6 +13,6 @@@
  #include <linux/clk.h>
  #include <linux/serial_8250.h>
  #include <linux/platform_device.h>
- #include <linux/gpio.h>
  
  #include <asm/mach/map.h>
  
@@@ -27,6 -26,7 +26,7 @@@
  #include <mach/serial.h>
  #include <mach/common.h>
  #include <mach/asp.h>
+ #include <mach/gpio-davinci.h>
  
  #include "clock.h"
  #include "mux.h"
@@@ -555,7 -555,6 +555,7 @@@ static struct edma_soc_info edma_cc0_in
        .n_cc                   = 1,
        .queue_tc_mapping       = dm646x_queue_tc_mapping,
        .queue_priority_mapping = dm646x_queue_priority_mapping,
 +      .default_queue          = EVENTQ_1,
  };
  
  static struct edma_soc_info *dm646x_edma_info[EDMA_MAX_CC] = {
  #include <linux/err.h>
  #include <asm/cacheflush.h>
  #include <asm/tlbflush.h>
 -#include <mach/system.h>
 +#include <mach/common.h>
 +#include <mach/hardware.h>
  #include "crm_regs.h"
  
  static struct clk *gpc_dvfs_clk;
  
+ static int mx5_suspend_prepare(void)
+ {
+       return clk_enable(gpc_dvfs_clk);
+ }
  static int mx5_suspend_enter(suspend_state_t state)
  {
-       clk_enable(gpc_dvfs_clk);
        switch (state) {
        case PM_SUSPEND_MEM:
                mx5_cpu_lp_set(STOP_POWER_OFF);
                __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR);
        }
        cpu_do_idle();
-       clk_disable(gpc_dvfs_clk);
        return 0;
  }
  
+ static void mx5_suspend_finish(void)
+ {
+       clk_disable(gpc_dvfs_clk);
+ }
  static int mx5_pm_valid(suspend_state_t state)
  {
        return (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX);
@@@ -55,7 -61,9 +62,9 @@@
  
  static const struct platform_suspend_ops mx5_suspend_ops = {
        .valid = mx5_pm_valid,
+       .prepare = mx5_suspend_prepare,
        .enter = mx5_suspend_enter,
+       .finish = mx5_suspend_finish,
  };
  
  static int __init mx5_pm_init(void)
@@@ -1,31 -1,27 +1,1 @@@
--/*
-- * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
-- * Copyright 2008 Juergen Beisert, kernel@pengutronix.de
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * as published by the Free Software Foundation; either version 2
-- * of the License, or (at your option) any later version.
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-- * MA  02110-1301, USA.
-- */
--
--#ifndef __MACH_MXS_GPIO_H__
--#define __MACH_MXS_GPIO_H__
--
- #include <asm-generic/gpio.h>
 -#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
--
- /* use gpiolib dispatchers */
- #define gpio_get_value                __gpio_get_value
- #define gpio_set_value                __gpio_set_value
- #define gpio_cansleep         __gpio_cansleep
- #define gpio_to_irq           __gpio_to_irq
 -#define irq_to_gpio(irq)      ((irq) - MXS_GPIO_IRQ_START)
--
--#endif /* __MACH_MXS_GPIO_H__ */
++/* empty */
@@@ -39,9 -39,6 +39,9 @@@
  #include <plat/usb.h>
  #include <plat/gpmc-smc91x.h>
  
 +#include <video/omapdss.h>
 +#include <video/omap-panel-generic-dpi.h>
 +
  #include "mux.h"
  #include "hsmmc.h"
  #include "common-board-devices.h"
@@@ -102,72 -99,20 +102,72 @@@ static struct platform_device sdp2430_f
        .resource       = &sdp2430_flash_resource,
  };
  
 -static struct platform_device sdp2430_lcd_device = {
 -      .name           = "sdp2430_lcd",
 -      .id             = -1,
 -};
 -
  static struct platform_device *sdp2430_devices[] __initdata = {
        &sdp2430_flash_device,
 +};
 +
 +/* LCD */
 +#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO      91
 +#define SDP2430_LCD_PANEL_ENABLE_GPIO         154
 +
 +static int sdp2430_panel_enable_lcd(struct omap_dss_device *dssdev)
 +{
 +      gpio_direction_output(SDP2430_LCD_PANEL_ENABLE_GPIO, 1);
 +      gpio_direction_output(SDP2430_LCD_PANEL_BACKLIGHT_GPIO, 1);
 +
 +      return 0;
 +}
 +
 +static void sdp2430_panel_disable_lcd(struct omap_dss_device *dssdev)
 +{
 +      gpio_direction_output(SDP2430_LCD_PANEL_ENABLE_GPIO, 0);
 +      gpio_direction_output(SDP2430_LCD_PANEL_BACKLIGHT_GPIO, 0);
 +}
 +
 +static struct panel_generic_dpi_data sdp2430_panel_data = {
 +      .name                   = "nec_nl2432dr22-11b",
 +      .platform_enable        = sdp2430_panel_enable_lcd,
 +      .platform_disable       = sdp2430_panel_disable_lcd,
 +};
 +
 +static struct omap_dss_device sdp2430_lcd_device = {
 +      .name                   = "lcd",
 +      .driver_name            = "generic_dpi_panel",
 +      .type                   = OMAP_DISPLAY_TYPE_DPI,
 +      .phy.dpi.data_lines     = 16,
 +      .data                   = &sdp2430_panel_data,
 +};
 +
 +static struct omap_dss_device *sdp2430_dss_devices[] = {
        &sdp2430_lcd_device,
  };
  
 -static struct omap_lcd_config sdp2430_lcd_config __initdata = {
 -      .ctrl_name      = "internal",
 +static struct omap_dss_board_info sdp2430_dss_data = {
 +      .num_devices    = ARRAY_SIZE(sdp2430_dss_devices),
 +      .devices        = sdp2430_dss_devices,
 +      .default_device = &sdp2430_lcd_device,
  };
  
 +static void __init sdp2430_display_init(void)
 +{
 +      int r;
 +
 +      static struct gpio gpios[] __initdata = {
 +              { SDP2430_LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW,
 +                      "LCD reset" },
 +              { SDP2430_LCD_PANEL_BACKLIGHT_GPIO, GPIOF_OUT_INIT_LOW,
 +                      "LCD Backlight" },
 +      };
 +
 +      r = gpio_request_array(gpios, ARRAY_SIZE(gpios));
 +      if (r) {
 +              pr_err("Cannot request LCD GPIOs, error %d\n", r);
 +              return;
 +      }
 +
 +      omap_display_init(&sdp2430_dss_data);
 +}
 +
  #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91x_MODULE)
  
  static struct omap_smc91x_platform_data board_smc91x_data = {
@@@ -192,6 -137,16 +192,6 @@@ static inline void board_smc91x_init(vo
  
  #endif
  
 -static struct omap_board_config_kernel sdp2430_config[] __initdata = {
 -      {OMAP_TAG_LCD, &sdp2430_lcd_config},
 -};
 -
 -static void __init omap_2430sdp_init_early(void)
 -{
 -      omap2_init_common_infrastructure();
 -      omap2_init_common_devices(NULL, NULL);
 -}
 -
  static struct regulator_consumer_supply sdp2430_vmmc1_supplies[] = {
        REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
  };
@@@ -238,7 -193,8 +238,8 @@@ static int __init omap2430_i2c_init(voi
  {
        omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo,
                        ARRAY_SIZE(sdp2430_i2c1_boardinfo));
-       omap2_pmic_init("twl4030", &sdp2430_twldata);
+       omap_pmic_init(2, 100, "twl4030", INT_24XX_SYS_NIRQ,
+                       &sdp2430_twldata);
        return 0;
  }
  
@@@ -273,11 -229,13 +274,11 @@@ static void __init omap_2430sdp_init(vo
  {
        omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC);
  
 -      omap_board_config = sdp2430_config;
 -      omap_board_config_size = ARRAY_SIZE(sdp2430_config);
 -
        omap2430_i2c_init();
  
        platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices));
        omap_serial_init();
 +      omap_sdrc_init(NULL, NULL);
        omap2_hsmmc_init(mmc);
        omap2_usbfs_init(&sdp2430_usb_config);
  
        /* Turn off secondary LCD backlight */
        gpio_request_one(SECONDARY_LCD_GPIO, GPIOF_OUT_INIT_LOW,
                         "Secondary LCD backlight");
 -}
  
 -static void __init omap_2430sdp_map_io(void)
 -{
 -      omap2_set_globals_243x();
 -      omap243x_map_common_io();
 +      sdp2430_display_init();
  }
  
  MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board")
        /* Maintainer: Syed Khasim - Texas Instruments Inc */
        .atag_offset    = 0x100,
        .reserve        = omap_reserve,
 -      .map_io         = omap_2430sdp_map_io,
 -      .init_early     = omap_2430sdp_init_early,
 +      .map_io         = omap243x_map_io,
 +      .init_early     = omap2430_init_early,
        .init_irq       = omap2_init_irq,
        .init_machine   = omap_2430sdp_init,
        .timer          = &omap2_timer,
@@@ -38,8 -38,6 +38,8 @@@
  #include <plat/mmc.h>
  #include <plat/omap4-keypad.h>
  #include <video/omapdss.h>
 +#include <video/omap-panel-nokia-dsi.h>
 +#include <video/omap-panel-picodlp.h>
  #include <linux/wl12xx.h>
  
  #include "mux.h"
@@@ -54,8 -52,6 +54,8 @@@
  #define OMAP4_SFH7741_ENABLE_GPIO             188
  #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
  #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
 +#define DISPLAY_SEL_GPIO      59      /* LCD2/PicoDLP switch */
 +#define DLP_POWER_ON_GPIO     40
  
  #define GPIO_WIFI_PMENA               54
  #define GPIO_WIFI_IRQ         53
@@@ -133,7 -129,7 +133,7 @@@ static const int sdp4430_keymap[] = 
        KEY(7, 6, KEY_OK),
        KEY(7, 7, KEY_DOWN),
  };
- static struct omap_device_pad keypad_pads[] __initdata = {
+ static struct omap_device_pad keypad_pads[] = {
        {       .name   = "kpd_col1.kpd_col1",
                .enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
        },
@@@ -344,6 -340,11 +344,6 @@@ static int __init omap_ethernet_init(vo
        return status;
  }
  
 -static struct platform_device sdp4430_lcd_device = {
 -      .name           = "sdp4430_lcd",
 -      .id             = -1,
 -};
 -
  static struct regulator_consumer_supply sdp4430_vbat_supply[] = {
        REGULATOR_SUPPLY("vddvibl", "twl6040-vibra"),
        REGULATOR_SUPPLY("vddvibr", "twl6040-vibra"),
@@@ -373,12 -374,27 +373,12 @@@ static struct platform_device sdp4430_v
  };
  
  static struct platform_device *sdp4430_devices[] __initdata = {
 -      &sdp4430_lcd_device,
        &sdp4430_gpio_keys_device,
        &sdp4430_leds_gpio,
        &sdp4430_leds_pwm,
        &sdp4430_vbat,
  };
  
 -static struct omap_lcd_config sdp4430_lcd_config __initdata = {
 -      .ctrl_name      = "internal",
 -};
 -
 -static struct omap_board_config_kernel sdp4430_config[] __initdata = {
 -      { OMAP_TAG_LCD,         &sdp4430_lcd_config },
 -};
 -
 -static void __init omap_4430sdp_init_early(void)
 -{
 -      omap2_init_common_infrastructure();
 -      omap2_init_common_devices(NULL, NULL);
 -}
 -
  static struct omap_musb_board_data musb_board_data = {
        .interface_type         = MUSB_INTERFACE_UTMI,
        .mode                   = MUSB_OTG,
@@@ -632,202 -648,37 +632,202 @@@ static void sdp4430_panel_disable_hdmi(
        gpio_free(HDMI_GPIO_HPD);
  }
  
 -static struct omap_dss_device sdp4430_hdmi_device = {
 -      .name = "hdmi",
 -      .driver_name = "hdmi_panel",
 -      .type = OMAP_DISPLAY_TYPE_HDMI,
 -      .clocks = {
 -              .dispc  = {
 +static struct nokia_dsi_panel_data dsi1_panel = {
 +              .name           = "taal",
 +              .reset_gpio     = 102,
 +              .use_ext_te     = false,
 +              .ext_te_gpio    = 101,
 +              .esd_interval   = 0,
 +};
 +
 +static struct omap_dss_device sdp4430_lcd_device = {
 +      .name                   = "lcd",
 +      .driver_name            = "taal",
 +      .type                   = OMAP_DISPLAY_TYPE_DSI,
 +      .data                   = &dsi1_panel,
 +      .phy.dsi                = {
 +              .clk_lane       = 1,
 +              .clk_pol        = 0,
 +              .data1_lane     = 2,
 +              .data1_pol      = 0,
 +              .data2_lane     = 3,
 +              .data2_pol      = 0,
 +
 +              .module         = 0,
 +      },
 +
 +      .clocks = {
 +              .dispc = {
 +                      .channel = {
 +                              /* Logic Clock = 172.8 MHz */
 +                              .lck_div        = 1,
 +                              /* Pixel Clock = 34.56 MHz */
 +                              .pck_div        = 5,
 +                              .lcd_clk_src    = OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC,
 +                      },
 +                      .dispc_fclk_src = OMAP_DSS_CLK_SRC_FCK,
 +              },
 +
 +              .dsi = {
 +                      .regn           = 16,   /* Fint = 2.4 MHz */
 +                      .regm           = 180,  /* DDR Clock = 216 MHz */
 +                      .regm_dispc     = 5,    /* PLL1_CLK1 = 172.8 MHz */
 +                      .regm_dsi       = 5,    /* PLL1_CLK2 = 172.8 MHz */
 +
 +                      .lp_clk_div     = 10,   /* LP Clock = 8.64 MHz */
 +                      .dsi_fclk_src   = OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI,
 +              },
 +      },
 +      .channel                = OMAP_DSS_CHANNEL_LCD,
 +};
 +
 +static struct nokia_dsi_panel_data dsi2_panel = {
 +              .name           = "taal",
 +              .reset_gpio     = 104,
 +              .use_ext_te     = false,
 +              .ext_te_gpio    = 103,
 +              .esd_interval   = 0,
 +};
 +
 +static struct omap_dss_device sdp4430_lcd2_device = {
 +      .name                   = "lcd2",
 +      .driver_name            = "taal",
 +      .type                   = OMAP_DISPLAY_TYPE_DSI,
 +      .data                   = &dsi2_panel,
 +      .phy.dsi                = {
 +              .clk_lane       = 1,
 +              .clk_pol        = 0,
 +              .data1_lane     = 2,
 +              .data1_pol      = 0,
 +              .data2_lane     = 3,
 +              .data2_pol      = 0,
 +
 +              .module         = 1,
 +      },
 +
 +      .clocks = {
 +              .dispc = {
 +                      .channel = {
 +                              /* Logic Clock = 172.8 MHz */
 +                              .lck_div        = 1,
 +                              /* Pixel Clock = 34.56 MHz */
 +                              .pck_div        = 5,
 +                              .lcd_clk_src    = OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC,
 +                      },
                        .dispc_fclk_src = OMAP_DSS_CLK_SRC_FCK,
                },
 -              .hdmi   = {
 -                      .regn   = 15,
 -                      .regm2  = 1,
 +
 +              .dsi = {
 +                      .regn           = 16,   /* Fint = 2.4 MHz */
 +                      .regm           = 180,  /* DDR Clock = 216 MHz */
 +                      .regm_dispc     = 5,    /* PLL1_CLK1 = 172.8 MHz */
 +                      .regm_dsi       = 5,    /* PLL1_CLK2 = 172.8 MHz */
 +
 +                      .lp_clk_div     = 10,   /* LP Clock = 8.64 MHz */
 +                      .dsi_fclk_src   = OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI,
                },
        },
 +      .channel                = OMAP_DSS_CHANNEL_LCD2,
 +};
 +
 +static void sdp4430_lcd_init(void)
 +{
 +      int r;
 +
 +      r = gpio_request_one(dsi1_panel.reset_gpio, GPIOF_DIR_OUT,
 +              "lcd1_reset_gpio");
 +      if (r)
 +              pr_err("%s: Could not get lcd1_reset_gpio\n", __func__);
 +
 +      r = gpio_request_one(dsi2_panel.reset_gpio, GPIOF_DIR_OUT,
 +              "lcd2_reset_gpio");
 +      if (r)
 +              pr_err("%s: Could not get lcd2_reset_gpio\n", __func__);
 +}
 +
 +static struct omap_dss_device sdp4430_hdmi_device = {
 +      .name = "hdmi",
 +      .driver_name = "hdmi_panel",
 +      .type = OMAP_DISPLAY_TYPE_HDMI,
        .platform_enable = sdp4430_panel_enable_hdmi,
        .platform_disable = sdp4430_panel_disable_hdmi,
        .channel = OMAP_DSS_CHANNEL_DIGIT,
  };
  
 +static struct picodlp_panel_data sdp4430_picodlp_pdata = {
 +      .picodlp_adapter_id     = 2,
 +      .emu_done_gpio          = 44,
 +      .pwrgood_gpio           = 45,
 +};
 +
 +static void sdp4430_picodlp_init(void)
 +{
 +      int r;
 +      const struct gpio picodlp_gpios[] = {
 +              {DLP_POWER_ON_GPIO, GPIOF_OUT_INIT_LOW,
 +                      "DLP POWER ON"},
 +              {sdp4430_picodlp_pdata.emu_done_gpio, GPIOF_IN,
 +                      "DLP EMU DONE"},
 +              {sdp4430_picodlp_pdata.pwrgood_gpio, GPIOF_OUT_INIT_LOW,
 +                      "DLP PWRGOOD"},
 +      };
 +
 +      r = gpio_request_array(picodlp_gpios, ARRAY_SIZE(picodlp_gpios));
 +      if (r)
 +              pr_err("Cannot request PicoDLP GPIOs, error %d\n", r);
 +}
 +
 +static int sdp4430_panel_enable_picodlp(struct omap_dss_device *dssdev)
 +{
 +      gpio_set_value(DISPLAY_SEL_GPIO, 0);
 +      gpio_set_value(DLP_POWER_ON_GPIO, 1);
 +
 +      return 0;
 +}
 +
 +static void sdp4430_panel_disable_picodlp(struct omap_dss_device *dssdev)
 +{
 +      gpio_set_value(DLP_POWER_ON_GPIO, 0);
 +      gpio_set_value(DISPLAY_SEL_GPIO, 1);
 +}
 +
 +static struct omap_dss_device sdp4430_picodlp_device = {
 +      .name                   = "picodlp",
 +      .driver_name            = "picodlp_panel",
 +      .type                   = OMAP_DISPLAY_TYPE_DPI,
 +      .phy.dpi.data_lines     = 24,
 +      .channel                = OMAP_DSS_CHANNEL_LCD2,
 +      .platform_enable        = sdp4430_panel_enable_picodlp,
 +      .platform_disable       = sdp4430_panel_disable_picodlp,
 +      .data                   = &sdp4430_picodlp_pdata,
 +};
 +
  static struct omap_dss_device *sdp4430_dss_devices[] = {
 +      &sdp4430_lcd_device,
 +      &sdp4430_lcd2_device,
        &sdp4430_hdmi_device,
 +      &sdp4430_picodlp_device,
  };
  
  static struct omap_dss_board_info sdp4430_dss_data = {
        .num_devices    = ARRAY_SIZE(sdp4430_dss_devices),
        .devices        = sdp4430_dss_devices,
 -      .default_device = &sdp4430_hdmi_device,
 +      .default_device = &sdp4430_lcd_device,
  };
  
 -void omap_4430sdp_display_init(void)
 +static void omap_4430sdp_display_init(void)
  {
 +      int r;
 +
 +      /* Enable LCD2 by default (instead of Pico DLP) */
 +      r = gpio_request_one(DISPLAY_SEL_GPIO, GPIOF_OUT_INIT_HIGH,
 +                      "display_sel");
 +      if (r)
 +              pr_err("%s: Could not get display_sel GPIO\n", __func__);
 +
 +      sdp4430_lcd_init();
        sdp4430_hdmi_mux_init();
 +      sdp4430_picodlp_init();
        omap_display_init(&sdp4430_dss_data);
  }
  
@@@ -951,11 -802,13 +951,11 @@@ static void __init omap_4430sdp_init(vo
                package = OMAP_PACKAGE_CBL;
        omap4_mux_init(board_mux, NULL, package);
  
 -      omap_board_config = sdp4430_config;
 -      omap_board_config_size = ARRAY_SIZE(sdp4430_config);
 -
        omap4_i2c_init();
        omap_sfh7741prox_init();
        platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices));
        board_serial_init();
 +      omap_sdrc_init(NULL, NULL);
        omap4_sdp4430_wifi_init();
        omap4_twl6030_hsmmc_init(mmc);
  
        omap_4430sdp_display_init();
  }
  
 -static void __init omap_4430sdp_map_io(void)
 -{
 -      omap2_set_globals_443x();
 -      omap44xx_map_common_io();
 -}
 -
  MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")
        /* Maintainer: Santosh Shilimkar - Texas Instruments Inc */
        .atag_offset    = 0x100,
        .reserve        = omap_reserve,
 -      .map_io         = omap_4430sdp_map_io,
 -      .init_early     = omap_4430sdp_init_early,
 +      .map_io         = omap4_map_io,
 +      .init_early     = omap4430_init_early,
        .init_irq       = gic_init_irq,
        .init_machine   = omap_4430sdp_init,
        .timer          = &omap4_timer,
@@@ -15,7 -15,7 +15,7 @@@
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
+ #include <linux/gpio.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/device.h>
@@@ -25,7 -25,6 +25,6 @@@
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  
- #include <mach/gpio.h>
  #include <plat/usb.h>
  #include <plat/board.h>
  #include <plat/common.h>
@@@ -36,12 -35,12 +35,12 @@@ static struct omap_board_config_kernel 
  static void __init omap_generic_init_early(void)
  {
        omap2_init_common_infrastructure();
 -      omap2_init_common_devices(NULL, NULL);
  }
  
  static void __init omap_generic_init(void)
  {
        omap_serial_init();
 +      omap_sdrc_init(NULL, NULL);
        omap_board_config = generic_config;
        omap_board_config_size = ARRAY_SIZE(generic_config);
  }
@@@ -10,7 -10,7 +10,7 @@@
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
+ #include <linux/gpio.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/platform_device.h>
@@@ -31,7 -31,6 +31,6 @@@
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  
- #include <mach/gpio.h>
  #include <plat/usb.h>
  #include <plat/board.h>
  #include <plat/common.h>
@@@ -40,9 -39,6 +39,9 @@@
  #include <plat/dma.h>
  #include <plat/gpmc.h>
  
 +#include <video/omapdss.h>
 +#include <video/omap-panel-generic-dpi.h>
 +
  #include "mux.h"
  #include "control.h"
  
@@@ -160,33 -156,17 +159,33 @@@ static struct platform_device h4_kp_dev
        },
  };
  
 -static struct platform_device h4_lcd_device = {
 -      .name           = "lcd_h4",
 -      .id             = -1,
 -};
 -
  static struct platform_device *h4_devices[] __initdata = {
        &h4_flash_device,
        &h4_kp_device,
 +};
 +
 +static struct panel_generic_dpi_data h4_panel_data = {
 +      .name                   = "h4",
 +};
 +
 +static struct omap_dss_device h4_lcd_device = {
 +      .name                   = "lcd",
 +      .driver_name            = "generic_dpi_panel",
 +      .type                   = OMAP_DISPLAY_TYPE_DPI,
 +      .phy.dpi.data_lines     = 16,
 +      .data                   = &h4_panel_data,
 +};
 +
 +static struct omap_dss_device *h4_dss_devices[] = {
        &h4_lcd_device,
  };
  
 +static struct omap_dss_board_info h4_dss_data = {
 +      .num_devices    = ARRAY_SIZE(h4_dss_devices),
 +      .devices        = h4_dss_devices,
 +      .default_device = &h4_lcd_device,
 +};
 +
  /* 2420 Sysboot setup (2430 is different) */
  static u32 get_sysboot_value(void)
  {
@@@ -290,6 -270,10 +289,6 @@@ static void __init h4_init_flash(void
        h4_flash_resource.end   = base + SZ_64M - 1;
  }
  
 -static struct omap_lcd_config h4_lcd_config __initdata = {
 -      .ctrl_name      = "internal",
 -};
 -
  static struct omap_usb_config h4_usb_config __initdata = {
        /* S1.10 OFF -- usb "download port"
         * usb0 switched to Mini-B port and isp1105 transceiver;
        .hmc_mode       = 0x00,         /* 0:dev|otg 1:disable 2:disable */
  };
  
 -static struct omap_board_config_kernel h4_config[] __initdata = {
 -      { OMAP_TAG_LCD,         &h4_lcd_config },
 -};
 -
 -static void __init omap_h4_init_early(void)
 -{
 -      omap2_init_common_infrastructure();
 -      omap2_init_common_devices(NULL, NULL);
 -}
 -
 -static void __init omap_h4_init_irq(void)
 -{
 -      omap2_init_irq();
 -}
 -
  static struct at24_platform_data m24c01 = {
        .byte_len       = SZ_1K / 8,
        .page_size      = 16,
@@@ -331,6 -330,9 +330,6 @@@ static void __init omap_h4_init(void
  {
        omap2420_mux_init(board_mux, OMAP_PACKAGE_ZAF);
  
 -      omap_board_config = h4_config;
 -      omap_board_config_size = ARRAY_SIZE(h4_config);
 -
        /*
         * Make sure the serial ports are muxed on at this point.
         * You have to mux them off in device drivers later on
        platform_add_devices(h4_devices, ARRAY_SIZE(h4_devices));
        omap2_usbfs_init(&h4_usb_config);
        omap_serial_init();
 +      omap_sdrc_init(NULL, NULL);
        h4_init_flash();
 -}
  
 -static void __init omap_h4_map_io(void)
 -{
 -      omap2_set_globals_242x();
 -      omap242x_map_common_io();
 +      omap_display_init(&h4_dss_data);
  }
  
  MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
        /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */
        .atag_offset    = 0x100,
        .reserve        = omap_reserve,
 -      .map_io         = omap_h4_map_io,
 -      .init_early     = omap_h4_init_early,
 -      .init_irq       = omap_h4_init_irq,
 +      .map_io         = omap242x_map_io,
 +      .init_early     = omap2420_init_early,
 +      .init_irq       = omap2_init_irq,
        .init_machine   = omap_h4_init,
        .timer          = &omap2_timer,
  MACHINE_END
@@@ -10,7 -10,7 +10,7 @@@
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
+ #include <linux/gpio.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/platform_device.h>
@@@ -27,7 -27,6 +27,7 @@@
  #include <linux/io.h>
  #include <linux/smsc911x.h>
  #include <linux/mmc/host.h>
 +#include <linux/gpio.h>
  
  #include <mach/hardware.h>
  #include <asm/mach-types.h>
@@@ -44,9 -43,6 +44,9 @@@
  #include <plat/usb.h>
  #include <plat/gpmc-smsc911x.h>
  
 +#include <video/omapdss.h>
 +#include <video/omap-panel-generic-dpi.h>
 +
  #include "board-flash.h"
  #include "mux.h"
  #include "hsmmc.h"
@@@ -183,102 -179,29 +183,102 @@@ static inline void __init ldp_init_smsc
        gpmc_smsc911x_init(&smsc911x_cfg);
  }
  
 -static struct platform_device ldp_lcd_device = {
 -      .name           = "ldp_lcd",
 -      .id             = -1,
 +/* LCD */
 +
 +static int ldp_backlight_gpio;
 +static int ldp_lcd_enable_gpio;
 +
 +#define LCD_PANEL_RESET_GPIO          55
 +#define LCD_PANEL_QVGA_GPIO           56
 +
 +static int ldp_panel_enable_lcd(struct omap_dss_device *dssdev)
 +{
 +      if (gpio_is_valid(ldp_lcd_enable_gpio))
 +              gpio_direction_output(ldp_lcd_enable_gpio, 1);
 +      if (gpio_is_valid(ldp_backlight_gpio))
 +              gpio_direction_output(ldp_backlight_gpio, 1);
 +
 +      return 0;
 +}
 +
 +static void ldp_panel_disable_lcd(struct omap_dss_device *dssdev)
 +{
 +      if (gpio_is_valid(ldp_lcd_enable_gpio))
 +              gpio_direction_output(ldp_lcd_enable_gpio, 0);
 +      if (gpio_is_valid(ldp_backlight_gpio))
 +              gpio_direction_output(ldp_backlight_gpio, 0);
 +}
 +
 +static struct panel_generic_dpi_data ldp_panel_data = {
 +      .name                   = "nec_nl2432dr22-11b",
 +      .platform_enable        = ldp_panel_enable_lcd,
 +      .platform_disable       = ldp_panel_disable_lcd,
 +};
 +
 +static struct omap_dss_device ldp_lcd_device = {
 +      .name                   = "lcd",
 +      .driver_name            = "generic_dpi_panel",
 +      .type                   = OMAP_DISPLAY_TYPE_DPI,
 +      .phy.dpi.data_lines     = 18,
 +      .data                   = &ldp_panel_data,
  };
  
 -static struct omap_lcd_config ldp_lcd_config __initdata = {
 -      .ctrl_name      = "internal",
 +static struct omap_dss_device *ldp_dss_devices[] = {
 +      &ldp_lcd_device,
  };
  
 -static struct omap_board_config_kernel ldp_config[] __initdata = {
 -      { OMAP_TAG_LCD,         &ldp_lcd_config },
 +static struct omap_dss_board_info ldp_dss_data = {
 +      .num_devices    = ARRAY_SIZE(ldp_dss_devices),
 +      .devices        = ldp_dss_devices,
 +      .default_device = &ldp_lcd_device,
  };
  
 -static void __init omap_ldp_init_early(void)
 +static void __init ldp_display_init(void)
 +{
 +      int r;
 +
 +      static struct gpio gpios[] __initdata = {
 +              {LCD_PANEL_RESET_GPIO, GPIOF_OUT_INIT_HIGH, "LCD RESET"},
 +              {LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "LCD QVGA"},
 +      };
 +
 +      r = gpio_request_array(gpios, ARRAY_SIZE(gpios));
 +      if (r) {
 +              pr_err("Cannot request LCD GPIOs, error %d\n", r);
 +              return;
 +      }
 +
 +      omap_display_init(&ldp_dss_data);
 +}
 +
 +static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio)
  {
 -      omap2_init_common_infrastructure();
 -      omap2_init_common_devices(NULL, NULL);
 +      int r;
 +
 +      struct gpio gpios[] = {
 +              {gpio + 7 , GPIOF_OUT_INIT_LOW, "LCD ENABLE"},
 +              {gpio + 15, GPIOF_OUT_INIT_LOW, "LCD BACKLIGHT"},
 +      };
 +
 +      r = gpio_request_array(gpios, ARRAY_SIZE(gpios));
 +      if (r) {
 +              pr_err("Cannot request LCD GPIOs, error %d\n", r);
 +              ldp_backlight_gpio = -EINVAL;
 +              ldp_lcd_enable_gpio = -EINVAL;
 +              return r;
 +      }
 +
 +      ldp_backlight_gpio = gpio + 15;
 +      ldp_lcd_enable_gpio = gpio + 7;
 +
 +      return 0;
  }
  
  static struct twl4030_gpio_platform_data ldp_gpio_data = {
        .gpio_base      = OMAP_MAX_GPIO_LINES,
        .irq_base       = TWL4030_GPIO_IRQ_BASE,
        .irq_end        = TWL4030_GPIO_IRQ_END,
 +      .setup          = ldp_twl_gpio_setup,
  };
  
  static struct regulator_consumer_supply ldp_vmmc1_supply[] = {
@@@ -320,31 -243,10 +320,31 @@@ static struct regulator_init_data ldp_v
        .consumer_supplies              = ldp_vaux1_supplies,
  };
  
 +static struct regulator_consumer_supply ldp_vpll2_supplies[] = {
 +      REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
 +      REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
 +};
 +
 +static struct regulator_init_data ldp_vpll2 = {
 +      .constraints = {
 +              .name                   = "VDVI",
 +              .min_uV                 = 1800000,
 +              .max_uV                 = 1800000,
 +              .apply_uV               = true,
 +              .valid_modes_mask       = REGULATOR_MODE_NORMAL
 +                                      | REGULATOR_MODE_STANDBY,
 +              .valid_ops_mask         = REGULATOR_CHANGE_MODE
 +                                      | REGULATOR_CHANGE_STATUS,
 +      },
 +      .num_consumer_supplies  = ARRAY_SIZE(ldp_vpll2_supplies),
 +      .consumer_supplies      = ldp_vpll2_supplies,
 +};
 +
  static struct twl4030_platform_data ldp_twldata = {
        /* platform_data for children goes here */
        .vmmc1          = &ldp_vmmc1,
        .vaux1          = &ldp_vaux1,
 +      .vpll2          = &ldp_vpll2,
        .gpio           = &ldp_gpio_data,
        .keypad         = &ldp_kp_twl4030_data,
  };
@@@ -370,6 -272,7 +370,6 @@@ static struct omap2_hsmmc_info mmc[] __
  };
  
  static struct platform_device *ldp_devices[] __initdata = {
 -      &ldp_lcd_device,
        &ldp_gpio_keys_device,
  };
  
@@@ -414,25 -317,25 +414,25 @@@ static struct mtd_partition ldp_nand_pa
  static void __init omap_ldp_init(void)
  {
        omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
 -      omap_board_config = ldp_config;
 -      omap_board_config_size = ARRAY_SIZE(ldp_config);
        ldp_init_smsc911x();
        omap_i2c_init();
        platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
        omap_ads7846_init(1, 54, 310, NULL);
        omap_serial_init();
 +      omap_sdrc_init(NULL, NULL);
        usb_musb_init(NULL);
        board_nand_init(ldp_nand_partitions,
                ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
  
        omap2_hsmmc_init(mmc);
 +      ldp_display_init();
  }
  
  MACHINE_START(OMAP_LDP, "OMAP LDP board")
        .atag_offset    = 0x100,
        .reserve        = omap_reserve,
        .map_io         = omap3_map_io,
 -      .init_early     = omap_ldp_init_early,
 +      .init_early     = omap3430_init_early,
        .init_irq       = omap3_init_irq,
        .init_machine   = omap_ldp_init,
        .timer          = &omap3_timer,
@@@ -8,7 -8,7 +8,7 @@@
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   */
+ #include <linux/gpio.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/platform_device.h>
@@@ -26,7 -26,6 +26,6 @@@
  #include <plat/tc.h>
  #include <plat/board.h>
  #include <plat/mcbsp.h>
- #include <mach/gpio.h>
  #include <plat/mmc.h>
  #include <plat/dma.h>
  #include <plat/omap_hwmod.h>
@@@ -44,7 -43,7 +43,7 @@@ static int __init omap3_l3_init(void
  {
        int l;
        struct omap_hwmod *oh;
 -      struct omap_device *od;
 +      struct platform_device *pdev;
        char oh_name[L3_MODULES_MAX_LEN];
  
        /*
        if (!oh)
                pr_err("could not look up %s\n", oh_name);
  
 -      od = omap_device_build("omap_l3_smx", 0, oh, NULL, 0,
 +      pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0,
                                                           NULL, 0, 0);
  
 -      WARN(IS_ERR(od), "could not build omap_device for %s\n", oh_name);
 +      WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
  
 -      return IS_ERR(od) ? PTR_ERR(od) : 0;
 +      return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
  }
  postcore_initcall(omap3_l3_init);
  
@@@ -74,7 -73,7 +73,7 @@@ static int __init omap4_l3_init(void
  {
        int l, i;
        struct omap_hwmod *oh[3];
 -      struct omap_device *od;
 +      struct platform_device *pdev;
        char oh_name[L3_MODULES_MAX_LEN];
  
        /*
                        pr_err("could not look up %s\n", oh_name);
        }
  
 -      od = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL,
 +      pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL,
                                                     0, NULL, 0, 0);
  
 -      WARN(IS_ERR(od), "could not build omap_device for %s\n", oh_name);
 +      WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
  
 -      return IS_ERR(od) ? PTR_ERR(od) : 0;
 +      return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
  }
  postcore_initcall(omap4_l3_init);
  
@@@ -232,7 -231,7 +231,7 @@@ struct omap_device_pm_latency omap_keyb
  int __init omap4_keyboard_init(struct omap4_keypad_platform_data
                        *sdp4430_keypad_data, struct omap_board_data *bdata)
  {
 -      struct omap_device *od;
 +      struct platform_device *pdev;
        struct omap_hwmod *oh;
        struct omap4_keypad_platform_data *keypad_data;
        unsigned int id = -1;
  
        keypad_data = sdp4430_keypad_data;
  
 -      od = omap_device_build(name, id, oh, keypad_data,
 +      pdev = omap_device_build(name, id, oh, keypad_data,
                        sizeof(struct omap4_keypad_platform_data),
                        omap_keyboard_latency,
                        ARRAY_SIZE(omap_keyboard_latency), 0);
  
 -      if (IS_ERR(od)) {
 +      if (IS_ERR(pdev)) {
                WARN(1, "Can't build omap_device for %s:%s.\n",
                                                name, oh->name);
 -              return PTR_ERR(od);
 +              return PTR_ERR(pdev);
        }
        oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);
  
@@@ -274,7 -273,7 +273,7 @@@ static struct omap_device_pm_latency mb
  static inline void omap_init_mbox(void)
  {
        struct omap_hwmod *oh;
 -      struct omap_device *od;
 +      struct platform_device *pdev;
  
        oh = omap_hwmod_lookup("mailbox");
        if (!oh) {
                return;
        }
  
 -      od = omap_device_build("omap-mailbox", -1, oh, NULL, 0,
 +      pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0,
                                mbox_latencies, ARRAY_SIZE(mbox_latencies), 0);
 -      WARN(IS_ERR(od), "%s: could not build device, err %ld\n",
 -                                              __func__, PTR_ERR(od));
 +      WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n",
 +                                              __func__, PTR_ERR(pdev));
  }
  #else
  static inline void omap_init_mbox(void) { }
@@@ -344,7 -343,7 +343,7 @@@ struct omap_device_pm_latency omap_mcsp
  
  static int omap_mcspi_init(struct omap_hwmod *oh, void *unused)
  {
 -      struct omap_device *od;
 +      struct platform_device *pdev;
        char *name = "omap2_mcspi";
        struct omap2_mcspi_platform_config *pdata;
        static int spi_num;
        }
  
        spi_num++;
 -      od = omap_device_build(name, spi_num, oh, pdata,
 +      pdev = omap_device_build(name, spi_num, oh, pdata,
                                sizeof(*pdata), omap_mcspi_latency,
                                ARRAY_SIZE(omap_mcspi_latency), 0);
 -      WARN(IS_ERR(od), "Can't build omap_device for %s:%s\n",
 +      WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s\n",
                                name, oh->name);
        kfree(pdata);
        return 0;
@@@ -709,7 -708,7 +708,7 @@@ static struct omap_device_pm_latency om
  static int __init omap_init_wdt(void)
  {
        int id = -1;
 -      struct omap_device *od;
 +      struct platform_device *pdev;
        struct omap_hwmod *oh;
        char *oh_name = "wd_timer2";
        char *dev_name = "omap_wdt";
                return -EINVAL;
        }
  
 -      od = omap_device_build(dev_name, id, oh, NULL, 0,
 +      pdev = omap_device_build(dev_name, id, oh, NULL, 0,
                                omap_wdt_latency,
                                ARRAY_SIZE(omap_wdt_latency), 0);
 -      WARN(IS_ERR(od), "Can't build omap_device for %s:%s.\n",
 +      WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n",
                                dev_name, oh->name);
        return 0;
  }
@@@ -137,8 -137,7 +137,7 @@@ static void omap4_hsmmc1_before_set_reg
         */
        reg = omap4_ctrl_pad_readl(control_pbias_offset);
        reg &= ~(OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
-               OMAP4_MMC1_PWRDNZ_MASK |
-               OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
+               OMAP4_MMC1_PWRDNZ_MASK);
        omap4_ctrl_pad_writel(reg, control_pbias_offset);
  }
  
@@@ -156,8 -155,7 +155,7 @@@ static void omap4_hsmmc1_after_set_reg(
                else
                        reg |= OMAP4_MMC1_PBIASLITE_VMODE_MASK;
                reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
-                       OMAP4_MMC1_PWRDNZ_MASK |
-                       OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
+                       OMAP4_MMC1_PWRDNZ_MASK);
                omap4_ctrl_pad_writel(reg, control_pbias_offset);
  
                timeout = jiffies + msecs_to_jiffies(5);
                if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK) {
                        pr_err("Pbias Voltage is not same as LDO\n");
                        /* Caution : On VMODE_ERROR Power Down MMC IO */
-                       reg &= ~(OMAP4_MMC1_PWRDNZ_MASK |
-                               OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
+                       reg &= ~(OMAP4_MMC1_PWRDNZ_MASK);
                        omap4_ctrl_pad_writel(reg, control_pbias_offset);
                }
        } else {
                reg = omap4_ctrl_pad_readl(control_pbias_offset);
                reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
                        OMAP4_MMC1_PWRDNZ_MASK |
-                       OMAP4_MMC1_PBIASLITE_VMODE_MASK |
-                       OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
+                       OMAP4_MMC1_PBIASLITE_VMODE_MASK);
                omap4_ctrl_pad_writel(reg, control_pbias_offset);
        }
  }
@@@ -430,7 -426,7 +426,7 @@@ static struct omap_device_pm_latency om
  void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr)
  {
        struct omap_hwmod *oh;
 -      struct omap_device *od;
 +      struct platform_device *pdev;
        struct omap_device_pm_latency *ohl;
        char oh_name[MAX_OMAP_MMC_HWMOD_NAME_LEN];
        struct omap_mmc_platform_data *mmc_data;
                mmc_data->controller_flags = mmc_dev_attr->flags;
        }
  
 -      od = omap_device_build(name, ctrl_nr - 1, oh, mmc_data,
 +      pdev = omap_device_build(name, ctrl_nr - 1, oh, mmc_data,
                sizeof(struct omap_mmc_platform_data), ohl, ohl_cnt, false);
 -      if (IS_ERR(od)) {
 +      if (IS_ERR(pdev)) {
                WARN(1, "Can't build omap_device for %s:%s.\n", name, oh->name);
                kfree(mmc_data->slots[0].name);
                goto done;
         * return device handle to board setup code
         * required to populate for regulator framework structure
         */
 -      hsmmcinfo->dev = &od->pdev.dev;
 +      hsmmcinfo->dev = &pdev->dev;
  
  done:
        kfree(mmc_data);
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * Defines machines for CSR SiRFprimaII 
 + * Defines machines for CSR SiRFprimaII
   *
   * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
   *
@@@ -36,6 -36,7 +36,7 @@@ MACHINE_START(PRIMA2_EVB, "prima2cb"
        .map_io         = sirfsoc_map_lluart,
        .init_irq       = sirfsoc_of_irq_init,
        .timer          = &sirfsoc_timer,
+       .dma_zone_size  = SZ_256M,
        .init_machine   = sirfsoc_mach_init,
        .dt_compat      = prima2cb_dt_match,
  MACHINE_END
@@@ -6,6 -6,7 +6,7 @@@ comment "ST-Ericsson Mobile Platform Pr
  
  config MACH_U300
        bool "U300"
+       select GPIO_U300
  
  comment "ST-Ericsson U300/U330/U335/U365 Feature Selections"
  
@@@ -48,12 -49,39 +49,12 @@@ config MACH_U300_BS36
  
  endchoice
  
 -choice
 -      prompt "Memory configuration"
 -      default MACH_U300_SINGLE_RAM
 -      ---help---
 -      You have to config the kernel according to the physical memory
 -      configuration.
 -
 -config MACH_U300_SINGLE_RAM
 -      bool "Single RAM"
 -      help
 -              Select this if you want support for Single RAM phones.
 -
 -config MACH_U300_DUAL_RAM
 -      bool "Dual RAM"
 -      help
 -              Select this if you want support for Dual RAM phones.
 -              This is two RAM memories on different EMIFs.
 -endchoice
 -
  config U300_DEBUG
        bool "Debug support for U300"
        depends on PM
        help
                Debug support for U300 in sysfs, procfs etc.
  
 -config MACH_U300_SEMI_IS_SHARED
 -      bool "The SEMI is used by both the access and application side"
 -      depends on MACH_U300
 -      help
 -              This makes it possible to use the SEMI (Shared External
 -              Memory Interface) from both from access and application
 -              side.
 -
  config MACH_U300_SPIDUMMY
        bool "SSP/SPI dummy chip"
        select SPI
                you don't need it. Selecting this will activate the
                SPI framework and ARM PL022 support.
  
 -comment "All the settings below must match the bootloader's settings"
 -
 -config MACH_U300_ACCESS_MEM_SIZE
 -       int "Access CPU memory allocation"
 -       range 7 25
 -       depends on MACH_U300_SINGLE_RAM
 -       default 13
 -       help
 -              How much memory in MiB that the Access side CPU has allocated
 -
 -config MACH_U300_2MB_ALIGNMENT_FIX
 -       bool "2MiB alignment fix"
 -       depends on MACH_U300_SINGLE_RAM
 -       default y
 -       help
 -              If yes and the Access side CPU has allocated an odd size in
 -              MiB, this fix gives you one MiB extra that would otherwise be
 -              lost due to Linux 2 MiB alignment policy.
 -
  endmenu
  
  endif
@@@ -38,6 -38,7 +38,7 @@@
  #include <mach/hardware.h>
  #include <mach/syscon.h>
  #include <mach/dma_channels.h>
+ #include <mach/gpio-u300.h>
  
  #include "clock.h"
  #include "mmc.h"
@@@ -69,6 -70,25 +70,6 @@@ static struct map_desc u300_io_desc[] _
                .length         = SZ_32K,
                .type           = MT_DEVICE,
        },
 -      {
 -              .virtual        = 0xffff2000, /* TCM memory */
 -              .pfn            = __phys_to_pfn(0xffff2000),
 -              .length         = SZ_16K,
 -              .type           = MT_DEVICE,
 -      },
 -
 -      /*
 -       * This overlaps with the IRQ vectors etc at 0xffff0000, so these
 -       * may have to be moved to 0x00000000 in order to use the ROM.
 -       */
 -      /*
 -      {
 -              .virtual        = U300_BOOTROM_VIRT_BASE,
 -              .pfn            = __phys_to_pfn(U300_BOOTROM_PHYS_BASE),
 -              .length         = SZ_64K,
 -              .type           = MT_ROM,
 -      },
 -      */
  };
  
  void __init u300_map_io(void)
@@@ -223,7 -243,7 +224,7 @@@ static struct resource gpio_resources[
                .end   = IRQ_U300_GPIO_PORT2,
                .flags = IORESOURCE_IRQ,
        },
- #ifdef U300_COH901571_3
+ #if defined(CONFIG_MACH_U300_BS365) || defined(CONFIG_MACH_U300_BS335)
        {
                .name  = "gpio3",
                .start = IRQ_U300_GPIO_PORT3,
                .end   = IRQ_U300_GPIO_PORT4,
                .flags = IORESOURCE_IRQ,
        },
+ #endif
  #ifdef CONFIG_MACH_U300_BS335
        {
                .name  = "gpio5",
                .flags = IORESOURCE_IRQ,
        },
  #endif /* CONFIG_MACH_U300_BS335 */
- #endif /* U300_COH901571_3 */
  };
  
  static struct resource keypad_resources[] = {
@@@ -345,6 -365,51 +346,6 @@@ static struct resource wdog_resources[
        }
  };
  
 -/* TODO: These should be protected by suitable #ifdef's */
 -static struct resource ave_resources[] = {
 -      {
 -              .name  = "AVE3e I/O Area",
 -              .start = U300_VIDEOENC_BASE,
 -              .end   = U300_VIDEOENC_BASE + SZ_512K - 1,
 -              .flags = IORESOURCE_MEM,
 -      },
 -      {
 -              .name  = "AVE3e IRQ0",
 -              .start = IRQ_U300_VIDEO_ENC_0,
 -              .end   = IRQ_U300_VIDEO_ENC_0,
 -              .flags = IORESOURCE_IRQ,
 -      },
 -      {
 -              .name  = "AVE3e IRQ1",
 -              .start = IRQ_U300_VIDEO_ENC_1,
 -              .end   = IRQ_U300_VIDEO_ENC_1,
 -              .flags = IORESOURCE_IRQ,
 -      },
 -      {
 -              .name  = "AVE3e Physmem Area",
 -              .start = 0, /* 0 will be remapped to reserved memory */
 -              .end   = SZ_1M - 1,
 -              .flags = IORESOURCE_MEM,
 -      },
 -      /*
 -       * The AVE3e requires two regions of 256MB that it considers
 -       * "invisible". The hardware will not be able to access these
 -       * addresses, so they should never point to system RAM.
 -       */
 -      {
 -              .name  = "AVE3e Reserved 0",
 -              .start = 0xd0000000,
 -              .end   = 0xd0000000 + SZ_256M - 1,
 -              .flags = IORESOURCE_MEM,
 -      },
 -      {
 -              .name  = "AVE3e Reserved 1",
 -              .start = 0xe0000000,
 -              .end   = 0xe0000000 + SZ_256M - 1,
 -              .flags = IORESOURCE_MEM,
 -      },
 -};
 -
  static struct resource dma_resource[] = {
        {
                .start = U300_DMAC_BASE,
@@@ -1495,11 -1560,35 +1496,35 @@@ static struct platform_device i2c1_devi
        .resource = i2c1_resources,
  };
  
+ /*
+  * The different variants have a few different versions of the
+  * GPIO block, with different number of ports.
+  */
+ static struct u300_gpio_platform u300_gpio_plat = {
+ #if defined(CONFIG_MACH_U300_BS2X) || defined(CONFIG_MACH_U300_BS330)
+       .variant = U300_GPIO_COH901335,
+       .ports = 3,
+ #endif
+ #ifdef CONFIG_MACH_U300_BS335
+       .variant = U300_GPIO_COH901571_3_BS335,
+       .ports = 7,
+ #endif
+ #ifdef CONFIG_MACH_U300_BS365
+       .variant = U300_GPIO_COH901571_3_BS365,
+       .ports = 5,
+ #endif
+       .gpio_base = 0,
+       .gpio_irq_base = IRQ_U300_GPIO_BASE,
+ };
  static struct platform_device gpio_device = {
        .name = "u300-gpio",
        .id = -1,
        .num_resources = ARRAY_SIZE(gpio_resources),
        .resource = gpio_resources,
+       .dev = {
+               .platform_data = &u300_gpio_plat,
+       },
  };
  
  static struct platform_device keypad_device = {
@@@ -1551,6 -1640,13 +1576,6 @@@ static struct platform_device nand_devi
        },
  };
  
 -static struct platform_device ave_device = {
 -      .name = "video_enc",
 -      .id = -1,
 -      .num_resources = ARRAY_SIZE(ave_resources),
 -      .resource = ave_resources,
 -};
 -
  static struct platform_device dma_device = {
        .name           = "coh901318",
        .id             = -1,
@@@ -1575,8 -1671,10 +1600,8 @@@ static struct platform_device *platform
        &gpio_device,
        &nand_device,
        &wdog_device,
 -      &ave_device
  };
  
 -
  /*
   * Interrupts: the U300 platforms have two pl190 ARM PrimeCells connected
   * together so some interrupts are connected to the first one and some
@@@ -1596,7 -1694,7 +1621,7 @@@ void __init u300_init_irq(void
        BUG_ON(IS_ERR(clk));
        clk_enable(clk);
  
-       for (i = 0; i < NR_IRQS; i++)
+       for (i = 0; i < U300_VIC_IRQS_END; i++)
                set_bit(i, (unsigned long *) &mask[0]);
        vic_init((void __iomem *) U300_INTCON0_VBASE, 0, mask[0], mask[0]);
        vic_init((void __iomem *) U300_INTCON1_VBASE, 32, mask[1], mask[1]);
@@@ -1767,10 -1865,17 +1792,10 @@@ void __init u300_init_devices(void
        /* Register subdevices on the SPI bus */
        u300_spi_register_board_devices();
  
 -#ifndef CONFIG_MACH_U300_SEMI_IS_SHARED
 -      /*
 -       * Enable SEMI self refresh. Self-refresh of the SDRAM is entered when
 -       * both subsystems are requesting this mode.
 -       * If we not share the Acc SDRAM, this is never the case. Therefore
 -       * enable it here from the App side.
 -       */
 +      /* Enable SEMI self refresh */
        val = readw(U300_SYSCON_VBASE + U300_SYSCON_SMCR) |
                U300_SYSCON_SMCR_SEMI_SREFREQ_ENABLE;
        writew(val, U300_SYSCON_VBASE + U300_SYSCON_SMCR);
 -#endif /* CONFIG_MACH_U300_SEMI_IS_SHARED */
  }
  
  static int core_module_init(void)
@@@ -6,10 -6,10 +6,10 @@@
  
  #include <linux/kernel.h>
  #include <linux/init.h>
- #include <linux/gpio.h>
  
  #include <asm/mach-types.h>
  #include <plat/pincfg.h>
+ #include <plat/gpio-nomadik.h>
  #include <mach/hardware.h>
  
  #include "pins-db8500.h"
@@@ -153,7 -153,7 +153,7 @@@ static pin_cfg_t mop500_pins_default[] 
        GPIO7_U1_RTSn   | PIN_OUTPUT_HIGH,
  };
  
 -static pin_cfg_t mop500_pins_hrefv60[] = {
 +static pin_cfg_t hrefv60_pins[] = {
        /* WLAN */
        GPIO4_GPIO              | PIN_INPUT_PULLUP,/* WLAN_IRQ */
        GPIO85_GPIO             | PIN_OUTPUT_LOW,/* WLAN_ENA */
@@@ -279,26 -279,14 +279,26 @@@ static pin_cfg_t snowball_pins[] = 
  void __init mop500_pins_init(void)
  {
        nmk_config_pins(mop500_pins_common,
 -                              ARRAY_SIZE(mop500_pins_common));
 -      if (machine_is_hrefv60())
 -              nmk_config_pins(mop500_pins_hrefv60,
 -                              ARRAY_SIZE(mop500_pins_hrefv60));
 -      else if (machine_is_snowball())
 -              nmk_config_pins(snowball_pins,
 -                              ARRAY_SIZE(snowball_pins));
 -      else
 -              nmk_config_pins(mop500_pins_default,
 -                              ARRAY_SIZE(mop500_pins_default));
 +                      ARRAY_SIZE(mop500_pins_common));
 +
 +      nmk_config_pins(mop500_pins_default,
 +                      ARRAY_SIZE(mop500_pins_default));
 +}
 +
 +void __init snowball_pins_init(void)
 +{
 +      nmk_config_pins(mop500_pins_common,
 +                      ARRAY_SIZE(mop500_pins_common));
 +
 +      nmk_config_pins(snowball_pins,
 +                      ARRAY_SIZE(snowball_pins));
 +}
 +
 +void __init hrefv60_pins_init(void)
 +{
 +      nmk_config_pins(mop500_pins_common,
 +                      ARRAY_SIZE(mop500_pins_common));
 +
 +      nmk_config_pins(hrefv60_pins,
 +                      ARRAY_SIZE(hrefv60_pins));
  }
@@@ -37,6 -37,7 +37,7 @@@
  #include <plat/i2c.h>
  #include <plat/ste_dma40.h>
  #include <plat/pincfg.h>
+ #include <plat/gpio-nomadik.h>
  
  #include <mach/hardware.h>
  #include <mach/setup.h>
@@@ -603,72 -604,28 +604,72 @@@ static void __init mop500_init_machine(
  {
        int i2c0_devs;
  
 +      mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
 +
 +      u8500_init_devices();
 +
 +      mop500_pins_init();
 +
 +      platform_add_devices(mop500_platform_devs,
 +                      ARRAY_SIZE(mop500_platform_devs));
 +
 +      mop500_i2c_init();
 +      mop500_sdi_init();
 +      mop500_spi_init();
 +      mop500_uart_init();
 +
 +      i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
 +
 +      i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
 +      i2c_register_board_info(2, mop500_i2c2_devices,
 +                              ARRAY_SIZE(mop500_i2c2_devices));
 +
 +      /* This board has full regulator constraints */
 +      regulator_has_full_constraints();
 +}
 +
 +static void __init snowball_init_machine(void)
 +{
 +      int i2c0_devs;
 +
 +      u8500_init_devices();
 +
 +      snowball_pins_init();
 +
 +      platform_add_devices(snowball_platform_devs,
 +                      ARRAY_SIZE(snowball_platform_devs));
 +
 +      mop500_i2c_init();
 +      snowball_sdi_init();
 +      mop500_spi_init();
 +      mop500_uart_init();
 +
 +      i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
 +      i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
 +      i2c_register_board_info(2, mop500_i2c2_devices,
 +                              ARRAY_SIZE(mop500_i2c2_devices));
 +
 +      /* This board has full regulator constraints */
 +      regulator_has_full_constraints();
 +}
 +
 +static void __init hrefv60_init_machine(void)
 +{
 +      int i2c0_devs;
 +
        /*
         * The HREFv60 board removed a GPIO expander and routed
         * all these GPIO pins to the internal GPIO controller
         * instead.
         */
 -      if (!machine_is_snowball()) {
 -              if (machine_is_hrefv60())
 -                      mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
 -              else
 -                      mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
 -      }
 +      mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
  
        u8500_init_devices();
  
 -      mop500_pins_init();
 +      hrefv60_pins_init();
  
 -      if (machine_is_snowball())
 -              platform_add_devices(snowball_platform_devs,
 -                                      ARRAY_SIZE(snowball_platform_devs));
 -      else
 -              platform_add_devices(mop500_platform_devs,
 -                                      ARRAY_SIZE(mop500_platform_devs));
 +      platform_add_devices(mop500_platform_devs,
 +                      ARRAY_SIZE(mop500_platform_devs));
  
        mop500_i2c_init();
        mop500_sdi_init();
        mop500_uart_init();
  
        i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
 -      if (machine_is_hrefv60())
 -              i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
 +
 +      i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
  
        i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
        i2c_register_board_info(2, mop500_i2c2_devices,
@@@ -702,7 -659,7 +703,7 @@@ MACHINE_START(HREFV60, "ST-Ericsson U85
        .map_io         = u8500_map_io,
        .init_irq       = ux500_init_irq,
        .timer          = &ux500_timer,
 -      .init_machine   = mop500_init_machine,
 +      .init_machine   = hrefv60_init_machine,
  MACHINE_END
  
  MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
        .init_irq       = ux500_init_irq,
        /* we re-use nomadik timer here */
        .timer          = &ux500_timer,
 -      .init_machine   = mop500_init_machine,
 +      .init_machine   = snowball_init_machine,
  MACHINE_END
@@@ -1,32 -1,33 +1,1 @@@
--/*
-- * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
-- * Copyright 2008 Juergen Beisert, kernel@pengutronix.de
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * as published by the Free Software Foundation; either version 2
-- * of the License, or (at your option) any later version.
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-- */
--
--#ifndef __ASM_ARCH_MXC_GPIO_H__
--#define __ASM_ARCH_MXC_GPIO_H__
--
--#include <linux/spinlock.h>
--#include <mach/hardware.h>
- #include <asm-generic/gpio.h>
--
- /* use gpiolib dispatchers */
- #define gpio_get_value                __gpio_get_value
- #define gpio_set_value                __gpio_set_value
- #define gpio_cansleep         __gpio_cansleep
- #define gpio_to_irq           __gpio_to_irq
 -
 -/* There's a off-by-one betweem the gpio bank number and the gpiochip */
 -/* range e.g. GPIO_1_5 is gpio 5 under linux */
 -#define IMX_GPIO_NR(bank, nr)         (((bank) - 1) * 32 + (nr))
 -
 -#define gpio_to_irq(gpio)     (MXC_GPIO_IRQ_START + (gpio))
 -#define irq_to_gpio(irq)      ((irq) - MXC_GPIO_IRQ_START)
--
--#endif
++/* empty */
@@@ -80,7 -80,6 +80,7 @@@ typedef u64 iomux_v3_cfg_t
                ((iomux_v3_cfg_t)(_sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT) | \
                ((iomux_v3_cfg_t)(_sel_input) << MUX_SEL_INPUT_SHIFT))
  
 +#define NEW_PAD_CTRL(cfg, pad)        (((cfg) & ~MUX_PAD_CTRL_MASK) | MUX_PAD_CTRL(pad))
  /*
   * Use to set PAD control
   */
  #define PAD_CTL_HYS                   (1 << 8)
  
  #define PAD_CTL_PKE                   (1 << 7)
- #define PAD_CTL_PUE                   (1 << 6)
- #define PAD_CTL_PUS_100K_DOWN         (0 << 4)
- #define PAD_CTL_PUS_47K_UP            (1 << 4)
- #define PAD_CTL_PUS_100K_UP           (2 << 4)
- #define PAD_CTL_PUS_22K_UP            (3 << 4)
+ #define PAD_CTL_PUE                   (1 << 6 | PAD_CTL_PKE)
+ #define PAD_CTL_PUS_100K_DOWN         (0 << 4 | PAD_CTL_PUE)
+ #define PAD_CTL_PUS_47K_UP            (1 << 4 | PAD_CTL_PUE)
+ #define PAD_CTL_PUS_100K_UP           (2 << 4 | PAD_CTL_PUE)
+ #define PAD_CTL_PUS_22K_UP            (3 << 4 | PAD_CTL_PUE)
  
  #define PAD_CTL_ODE                   (1 << 3)
  
@@@ -8,7 -8,7 +8,7 @@@
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   */
+ #include <linux/gpio.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <plat/tc.h>
  #include <plat/board.h>
  #include <plat/mmc.h>
- #include <mach/gpio.h>
  #include <plat/menelaus.h>
 -#include <plat/mcbsp.h>
  #include <plat/omap44xx.h>
  
 -/*-------------------------------------------------------------------------*/
 -
 -#if defined(CONFIG_OMAP_MCBSP) || defined(CONFIG_OMAP_MCBSP_MODULE)
 -
 -static struct platform_device **omap_mcbsp_devices;
 -
 -void omap_mcbsp_register_board_cfg(struct resource *res, int res_count,
 -                      struct omap_mcbsp_platform_data *config, int size)
 -{
 -      int i;
 -
 -      omap_mcbsp_devices = kzalloc(size * sizeof(struct platform_device *),
 -                                   GFP_KERNEL);
 -      if (!omap_mcbsp_devices) {
 -              printk(KERN_ERR "Could not register McBSP devices\n");
 -              return;
 -      }
 -
 -      for (i = 0; i < size; i++) {
 -              struct platform_device *new_mcbsp;
 -              int ret;
 -
 -              new_mcbsp = platform_device_alloc("omap-mcbsp", i + 1);
 -              if (!new_mcbsp)
 -                      continue;
 -              platform_device_add_resources(new_mcbsp, &res[i * res_count],
 -                                      res_count);
 -              new_mcbsp->dev.platform_data = &config[i];
 -              ret = platform_device_add(new_mcbsp);
 -              if (ret) {
 -                      platform_device_put(new_mcbsp);
 -                      continue;
 -              }
 -              omap_mcbsp_devices[i] = new_mcbsp;
 -      }
 -}
 -
 -#else
 -void omap_mcbsp_register_board_cfg(struct resource *res, int res_count,
 -                      struct omap_mcbsp_platform_data *config, int size)
 -{  }
 -#endif
 -
 -/*-------------------------------------------------------------------------*/
 -
  #if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
                defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE)