Merge tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 21 Feb 2013 23:27:22 +0000 (15:27 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 21 Feb 2013 23:27:22 +0000 (15:27 -0800)
Pull ARM SoC-specific updates from Arnd Bergmann:
 "This is a larger set of new functionality for the existing SoC
  families, including:

   - vt8500 gains support for new CPU cores, notably the Cortex-A9 based
     wm8850

   - prima2 gains support for the "marco" SoC family, its SMP based
     cousin

   - tegra gains support for the new Tegra4 (Tegra114) family

   - socfpga now supports a newer version of the hardware including SMP

   - i.mx31 and bcm2835 are now using DT probing for their clocks

   - lots of updates for sh-mobile

   - OMAP updates for clocks, power management and USB

   - i.mx6q and tegra now support cpuidle

   - kirkwood now supports PCIe hot plugging

   - tegra clock support is updated

   - tegra USB PHY probing gets implemented diffently"

* tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (148 commits)
  ARM: prima2: remove duplicate v7_invalidate_l1
  ARM: shmobile: r8a7779: Correct TMU clock support again
  ARM: prima2: fix __init section for cpu hotplug
  ARM: OMAP: Consolidate OMAP USB-HS platform data (part 3/3)
  ARM: OMAP: Consolidate OMAP USB-HS platform data (part 1/3)
  arm: socfpga: Add SMP support for actual socfpga harware
  arm: Add v7_invalidate_l1 to cache-v7.S
  arm: socfpga: Add entries to enable make dtbs socfpga
  arm: socfpga: Add new device tree source for actual socfpga HW
  ARM: tegra: sort Kconfig selects for Tegra114
  ARM: tegra: enable ARCH_REQUIRE_GPIOLIB for Tegra114
  ARM: tegra: Fix build error w/ ARCH_TEGRA_114_SOC w/o ARCH_TEGRA_3x_SOC
  ARM: tegra: Fix build error for gic update
  ARM: tegra: remove empty tegra_smp_init_cpus()
  ARM: shmobile: Register ARM architected timer
  ARM: MARCO: fix the build issue due to gic-vic-to-irqchip move
  ARM: shmobile: r8a7779: Correct TMU clock support
  ARM: mxs_defconfig: Select CONFIG_DEVTMPFS_MOUNT
  ARM: mxs: decrease mxs_clockevent_device.min_delta_ns to 2 clock cycles
  ARM: mxs: use apbx bus clock to drive the timers on timrotv2
  ...

59 files changed:
1  2 
arch/arm/Kconfig
arch/arm/Kconfig.debug
arch/arm/include/asm/smp_scu.h
arch/arm/mach-bcm2835/bcm2835.c
arch/arm/mach-imx/clk-imx27.c
arch/arm/mach-imx/imx31-dt.c
arch/arm/mach-omap2/board-3430sdp.c
arch/arm/mach-omap2/board-cm-t35.c
arch/arm/mach-omap2/board-devkit8000.c
arch/arm/mach-omap2/board-igep0020.c
arch/arm/mach-omap2/board-omap3beagle.c
arch/arm/mach-omap2/board-omap3evm.c
arch/arm/mach-omap2/board-omap3pandora.c
arch/arm/mach-omap2/board-omap3stalker.c
arch/arm/mach-omap2/board-omap3touchbook.c
arch/arm/mach-omap2/board-omap4panda.c
arch/arm/mach-omap2/board-overo.c
arch/arm/mach-omap2/devices.c
arch/arm/mach-omap2/dma.c
arch/arm/mach-omap2/drm.c
arch/arm/mach-omap2/gpio.c
arch/arm/mach-omap2/gpmc.c
arch/arm/mach-omap2/hdq1w.c
arch/arm/mach-omap2/hwspinlock.c
arch/arm/mach-omap2/i2c.c
arch/arm/mach-omap2/mcbsp.c
arch/arm/mach-omap2/omap-iommu.c
arch/arm/mach-omap2/omap_device.c
arch/arm/mach-omap2/omap_hwmod.c
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
arch/arm/mach-omap2/pm-debug.c
arch/arm/mach-omap2/pm.c
arch/arm/mach-omap2/pmu.c
arch/arm/mach-omap2/serial.c
arch/arm/mach-omap2/timer.c
arch/arm/mach-omap2/usb-musb.c
arch/arm/mach-omap2/wd_timer.c
arch/arm/mach-prima2/include/mach/uncompress.h
arch/arm/mach-shmobile/Makefile
arch/arm/mach-shmobile/board-armadillo800eva.c
arch/arm/mach-shmobile/board-kzm9g.c
arch/arm/mach-shmobile/setup-r8a7740.c
arch/arm/mach-shmobile/setup-r8a7779.c
arch/arm/mach-shmobile/setup-sh73a0.c
arch/arm/mach-tegra/cpu-tegra.c
arch/arm/mach-vt8500/Kconfig
arch/arm/mach-vt8500/vt8500.c
drivers/clk/Makefile
drivers/clk/mxs/clk-imx28.c
drivers/dma/tegra20-apb-dma.c
drivers/gpu/drm/tegra/dc.c
drivers/gpu/drm/tegra/hdmi.c
drivers/i2c/busses/i2c-tegra.c
drivers/input/keyboard/tegra-kbc.c
drivers/rtc/Kconfig
drivers/spi/spi-tegra20-sflash.c
drivers/spi/spi-tegra20-slink.c
drivers/staging/nvec/nvec.c
sound/soc/tegra/tegra30_ahub.c

diff --combined arch/arm/Kconfig
@@@ -36,6 -36,7 +36,6 @@@ config AR
        select HAVE_GENERIC_HARDIRQS
        select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7))
        select HAVE_IDE if PCI || ISA || PCMCIA
 -      select HAVE_IRQ_WORK
        select HAVE_KERNEL_GZIP
        select HAVE_KERNEL_LZMA
        select HAVE_KERNEL_LZO
@@@ -260,8 -261,7 +260,8 @@@ config MM
  #
  choice
        prompt "ARM system type"
 -      default ARCH_MULTIPLATFORM
 +      default ARCH_VERSATILE if !MMU
 +      default ARCH_MULTIPLATFORM if MMU
  
  config ARCH_MULTIPLATFORM
        bool "Allow multiple platforms to be selected"
@@@ -344,10 -344,10 +344,10 @@@ config ARCH_BCM283
        select ARM_ERRATA_411920
        select ARM_TIMER_SP804
        select CLKDEV_LOOKUP
 +      select CLKSRC_OF
        select COMMON_CLK
        select CPU_V6
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
        select MULTI_IRQ_HANDLER
        select PINCTRL
        select PINCTRL_BCM2835
@@@ -393,6 -393,7 +393,7 @@@ config ARCH_GEMIN
  config ARCH_SIRF
        bool "CSR SiRF"
        select ARCH_REQUIRE_GPIOLIB
+       select AUTO_ZRELADDR
        select COMMON_CLK
        select GENERIC_CLOCKEVENTS
        select GENERIC_IRQ_CHIP
@@@ -640,11 -641,13 +641,12 @@@ config ARCH_LPC32X
  config ARCH_TEGRA
        bool "NVIDIA Tegra"
        select ARCH_HAS_CPUFREQ
+       select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
        select CLKSRC_MMIO
        select CLKSRC_OF
        select COMMON_CLK
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_SMP
        select MIGHT_HAVE_CACHE_L2X0
@@@ -698,7 -701,6 +700,7 @@@ config ARCH_SHMOBIL
        select MULTI_IRQ_HANDLER
        select NEED_MACH_MEMORY_H
        select NO_IOPORT
 +      select PINCTRL
        select PM_GENERIC_DOMAINS if PM
        select SPARSE_IRQ
        help
@@@ -745,6 -747,7 +747,6 @@@ config ARCH_S3C24X
        select ARCH_HAS_CPUFREQ
        select ARCH_USES_GETTIMEOFFSET
        select CLKDEV_LOOKUP
 -      select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
@@@ -787,6 -790,7 +789,6 @@@ config ARCH_S5P64X
        select CLKSRC_MMIO
        select CPU_V6
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
@@@ -801,6 -805,7 +803,6 @@@ config ARCH_S5PC10
        select ARCH_USES_GETTIMEOFFSET
        select CLKDEV_LOOKUP
        select CPU_V7
 -      select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
@@@ -818,6 -823,7 +820,6 @@@ config ARCH_S5PV21
        select CLKSRC_MMIO
        select CPU_V7
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
@@@ -835,6 -841,7 +837,6 @@@ config ARCH_EXYNO
        select CLKDEV_LOOKUP
        select CPU_V7
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
@@@ -869,6 -876,7 +871,6 @@@ config ARCH_U30
        select COMMON_CLK
        select CPU_ARM926T
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
        select HAVE_TCM
        select SPARSE_IRQ
        help
@@@ -932,24 -940,17 +934,24 @@@ config ARCH_DAVINC
        help
          Support for TI's DaVinci platform.
  
 -config ARCH_OMAP
 -      bool "TI OMAP"
 +config ARCH_OMAP1
 +      bool "TI OMAP1"
        depends on MMU
        select ARCH_HAS_CPUFREQ
        select ARCH_HAS_HOLES_MEMORYMODEL
 +      select ARCH_OMAP
        select ARCH_REQUIRE_GPIOLIB
 +      select CLKDEV_LOOKUP
        select CLKSRC_MMIO
        select GENERIC_CLOCKEVENTS
 +      select GENERIC_IRQ_CHIP
        select HAVE_CLK
 +      select HAVE_IDE
 +      select IRQ_DOMAIN
 +      select NEED_MACH_IO_H if PCCARD
 +      select NEED_MACH_MEMORY_H
        help
 -        Support for TI's OMAP platform (OMAP1/2/3/4).
 +        Support for older TI OMAP1 (omap7xx, omap15xx or omap16xx)
  
  endchoice
  
@@@ -1072,12 -1073,17 +1074,12 @@@ source "arch/arm/mach-realview/Kconfig
  source "arch/arm/mach-sa1100/Kconfig"
  
  source "arch/arm/plat-samsung/Kconfig"
 -source "arch/arm/plat-s3c24xx/Kconfig"
  
  source "arch/arm/mach-socfpga/Kconfig"
  
  source "arch/arm/plat-spear/Kconfig"
  
  source "arch/arm/mach-s3c24xx/Kconfig"
 -if ARCH_S3C24XX
 -source "arch/arm/mach-s3c2412/Kconfig"
 -source "arch/arm/mach-s3c2440/Kconfig"
 -endif
  
  if ARCH_S3C64XX
  source "arch/arm/mach-s3c64xx/Kconfig"
@@@ -1431,10 -1437,6 +1433,10 @@@ config ISA_DM
        bool
        select ISA_DMA_API
  
 +config ARCH_NO_VIRT_TO_BUS
 +      def_bool y
 +      depends on !ARCH_RPC && !ARCH_NETWINDER && !ARCH_SHARK
 +
  # Select ISA DMA interface
  config ISA_DMA_API
        bool
@@@ -1516,6 -1518,7 +1518,6 @@@ config SM
  
  config SMP_ON_UP
        bool "Allow booting SMP kernel on uniprocessor systems (EXPERIMENTAL)"
 -      depends on EXPERIMENTAL
        depends on SMP && !XIP_KERNEL
        default y
        help
@@@ -1604,16 -1607,6 +1606,16 @@@ config HOTPLUG_CP
          Say Y here to experiment with turning CPUs off and on.  CPUs
          can be controlled through /sys/devices/system/cpu.
  
 +config ARM_PSCI
 +      bool "Support for the ARM Power State Coordination Interface (PSCI)"
 +      depends on CPU_V7
 +      help
 +        Say Y here if you want Linux to communicate with system firmware
 +        implementing the PSCI specification for CPU-centric power
 +        management operations described in ARM document number ARM DEN
 +        0022A ("Power State Coordination Interface System Software on
 +        ARM processors").
 +
  config LOCAL_TIMERS
        bool "Use local timer interrupts"
        depends on SMP
@@@ -1631,7 -1624,7 +1633,7 @@@ config ARCH_NR_GPI
        default 355 if ARCH_U8500
        default 264 if MACH_H4700
        default 512 if SOC_OMAP5
 -      default 288 if ARCH_VT8500
 +      default 288 if ARCH_VT8500 || ARCH_SUNXI
        default 0
        help
          Maximum number of GPIOs in the system.
@@@ -1649,9 -1642,6 +1651,9 @@@ config H
        default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE
        default 100
  
 +config SCHED_HRTICK
 +      def_bool HIGH_RES_TIMERS
 +
  config THUMB2_KERNEL
        bool "Compile the kernel in Thumb-2 mode"
        depends on CPU_V7 && !CPU_V6 && !CPU_V6K
@@@ -1716,7 -1706,7 +1718,7 @@@ config AEAB
  
  config OABI_COMPAT
        bool "Allow old ABI binaries to run with this kernel (EXPERIMENTAL)"
 -      depends on AEABI && EXPERIMENTAL && !THUMB2_KERNEL
 +      depends on AEABI && !THUMB2_KERNEL
        default y
        help
          This option preserves the old syscall interface along with the
@@@ -1840,6 -1830,7 +1842,6 @@@ config SECCOM
  
  config CC_STACKPROTECTOR
        bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)"
 -      depends on EXPERIMENTAL
        help
          This option turns on the -fstack-protector GCC feature. This
          feature puts, at the beginning of functions, a canary value on
@@@ -1856,7 -1847,7 +1858,7 @@@ config XEN_DOM
  
  config XEN
        bool "Xen guest support on ARM (EXPERIMENTAL)"
 -      depends on EXPERIMENTAL && ARM && OF
 +      depends on ARM && OF
        depends on CPU_V7 && !CPU_V6
        help
          Say Y if you want to run Linux in a Virtual Machine on Xen on ARM.
@@@ -1925,7 -1916,7 +1927,7 @@@ config ZBOOT_RO
  
  choice
        prompt "Include SD/MMC loader in zImage (EXPERIMENTAL)"
 -      depends on ZBOOT_ROM && ARCH_SH7372 && EXPERIMENTAL
 +      depends on ZBOOT_ROM && ARCH_SH7372
        default ZBOOT_ROM_NONE
        help
          Include experimental SD/MMC loading code in the ROM-able zImage.
@@@ -1954,7 -1945,7 +1956,7 @@@ endchoic
  
  config ARM_APPENDED_DTB
        bool "Use appended device tree blob to zImage (EXPERIMENTAL)"
 -      depends on OF && !ZBOOT_ROM && EXPERIMENTAL
 +      depends on OF && !ZBOOT_ROM
        help
          With this option, the boot code will look for a device tree binary
          (DTB) appended to zImage
@@@ -2072,7 -2063,7 +2074,7 @@@ config XIP_PHYS_ADD
  
  config KEXEC
        bool "Kexec system call (EXPERIMENTAL)"
 -      depends on EXPERIMENTAL && (!SMP || HOTPLUG_CPU)
 +      depends on (!SMP || HOTPLUG_CPU)
        help
          kexec is a system call that implements the ability to shutdown your
          current kernel, and to start another kernel.  It is like a reboot
@@@ -2094,6 -2085,7 +2096,6 @@@ config ATAGS_PRO
  
  config CRASH_DUMP
        bool "Build kdump crash kernel (EXPERIMENTAL)"
 -      depends on EXPERIMENTAL
        help
          Generate crash dump after being started by kexec. This should
          be normally only set in special crash dump kernels which are
@@@ -2160,7 -2152,7 +2162,7 @@@ config CPU_FREQ_S3
  
  config CPU_FREQ_S3C24XX
        bool "CPUfreq driver for Samsung S3C24XX series CPUs (EXPERIMENTAL)"
 -      depends on ARCH_S3C24XX && CPU_FREQ && EXPERIMENTAL
 +      depends on ARCH_S3C24XX && CPU_FREQ
        select CPU_FREQ_S3C
        help
          This enables the CPUfreq driver for the Samsung S3C24XX family
  
  config CPU_FREQ_S3C24XX_PLL
        bool "Support CPUfreq changing of PLL frequency (EXPERIMENTAL)"
 -      depends on CPU_FREQ_S3C24XX && EXPERIMENTAL
 +      depends on CPU_FREQ_S3C24XX
        help
          Compile in support for changing the PLL frequency from the
          S3C24XX series CPUfreq driver. The PLL takes time to settle
@@@ -2235,7 -2227,7 +2237,7 @@@ config FPE_NWFPE_X
  
  config FPE_FASTFPE
        bool "FastFPE math emulation (EXPERIMENTAL)"
 -      depends on (!AEABI || OABI_COMPAT) && !CPU_32v3 && EXPERIMENTAL
 +      depends on (!AEABI || OABI_COMPAT) && !CPU_32v3
        ---help---
          Say Y here to include the FAST floating point emulator in the kernel.
          This is an experimental much faster emulator which now also has full
@@@ -2317,5 -2309,3 +2319,5 @@@ source "security/Kconfig
  source "crypto/Kconfig"
  
  source "lib/Kconfig"
 +
 +source "arch/arm/kvm/Kconfig"
diff --combined arch/arm/Kconfig.debug
@@@ -32,7 -32,7 +32,7 @@@ config FRAME_POINTE
  
  config ARM_UNWIND
        bool "Enable stack unwinding support (EXPERIMENTAL)"
 -      depends on AEABI && EXPERIMENTAL
 +      depends on AEABI
        default y
        help
          This option enables stack unwinding support in the kernel
@@@ -205,12 -205,19 +205,19 @@@ choic
                  Say Y here if you want kernel low-level debugging support
                  on i.MX28.
  
-       config DEBUG_IMX31_IMX35_UART
-               bool "i.MX31 and i.MX35 Debug UART"
-               depends on SOC_IMX31 || SOC_IMX35
+       config DEBUG_IMX31_UART
+               bool "i.MX31 Debug UART"
+               depends on SOC_IMX31
                help
                  Say Y here if you want kernel low-level debugging support
-                 on i.MX31 or i.MX35.
+                 on i.MX31.
+       config DEBUG_IMX35_UART
+               bool "i.MX35 Debug UART"
+               depends on SOC_IMX35
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on i.MX35.
  
        config DEBUG_IMX51_UART
                bool "i.MX51 Debug UART"
                  Say Y here if you want kernel low-level debugging support
                  on MVEBU based platforms.
  
 +      config DEBUG_OMAP2PLUS_UART
 +              bool "Kernel low-level debugging messages via OMAP2PLUS UART"
 +              depends on ARCH_OMAP2PLUS
 +              help
 +                Say Y here if you want kernel low-level debugging support
 +                on OMAP2PLUS based platforms.
 +
        config DEBUG_PICOXCELL_UART
                depends on ARCH_PICOXCELL
                bool "Use PicoXcell UART for low-level debug"
                  Say Y here if you want kernel low-level debugging support
                  on Tegra based platforms.
  
+       config DEBUG_SIRFPRIMA2_UART1
+               bool "Kernel low-level debugging messages via SiRFprimaII UART1"
+               depends on ARCH_PRIMA2
+               help
+                 Say Y here if you want the debug print routines to direct
+                 their output to the uart1 port on SiRFprimaII devices.
+       config DEBUG_SIRFMARCO_UART1
+               bool "Kernel low-level debugging messages via SiRFmarco UART1"
+               depends on ARCH_MARCO
+               help
+                 Say Y here if you want the debug print routines to direct
+                 their output to the uart1 port on SiRFmarco devices.
        config DEBUG_VEXPRESS_UART0_DETECT
                bool "Autodetect UART0 on Versatile Express Cortex-A core tiles"
                depends on ARCH_VEXPRESS && CPU_CP15_MMU
  
  endchoice
  
- config DEBUG_IMX6Q_UART_PORT
-       int "i.MX6Q Debug UART Port (1-5)" if DEBUG_IMX6Q_UART
-       range 1 5
+ config DEBUG_IMX_UART_PORT
+       int "i.MX Debug UART Port Selection" if DEBUG_IMX1_UART || \
+                                               DEBUG_IMX25_UART || \
+                                               DEBUG_IMX21_IMX27_UART || \
+                                               DEBUG_IMX31_UART || \
+                                               DEBUG_IMX35_UART || \
+                                               DEBUG_IMX51_UART || \
+                                               DEBUG_IMX50_IMX53_UART || \
+                                               DEBUG_IMX6Q_UART
        default 1
-       depends on SOC_IMX6Q
        help
          Choose UART port on which kernel low-level debug messages
          should be output.
  
 +choice
 +      prompt "Low-level debug console UART"
 +      depends on DEBUG_OMAP2PLUS_UART
 +
 +      config DEBUG_OMAP2UART1
 +              bool "OMAP2/3/4 UART1 (omap2/3 sdp boards and some omap3 boards)"
 +              help
 +                This covers at least h4, 2430sdp, 3430sdp, 3630sdp,
 +                omap3 torpedo and 3530 lv som.
 +
 +      config DEBUG_OMAP2UART2
 +              bool "OMAP2/3/4 UART2"
 +
 +      config DEBUG_OMAP2UART3
 +              bool "OMAP2 UART3 (n8x0)"
 +
 +      config DEBUG_OMAP3UART3
 +              bool "OMAP3 UART3 (most omap3 boards)"
 +              help
 +                This covers at least cm_t3x, beagle, crane, devkit8000,
 +                igep00x0, ldp, n900, n9(50), pandora, overo, touchbook,
 +                and 3517evm.
 +
 +      config DEBUG_OMAP4UART3
 +              bool "OMAP4/5 UART3 (omap4 blaze, panda, omap5 sevm)"
 +
 +      config DEBUG_OMAP3UART4
 +              bool "OMAP36XX UART4"
 +
 +      config DEBUG_OMAP4UART4
 +              bool "OMAP4/5 UART4"
 +
 +      config DEBUG_TI81XXUART1
 +              bool "TI81XX UART1 (ti8148evm)"
 +
 +      config DEBUG_TI81XXUART2
 +              bool "TI81XX UART2"
 +
 +      config DEBUG_TI81XXUART3
 +              bool "TI81XX UART3 (ti8168evm)"
 +
 +      config DEBUG_AM33XXUART1
 +              bool "AM33XX UART1"
 +
 +      config DEBUG_ZOOM_UART
 +              bool "Zoom2/3 UART"
 +endchoice
 +
  choice
        prompt "Low-level debug console UART"
        depends on DEBUG_LL && DEBUG_TEGRA_UART
@@@ -557,13 -528,13 +583,14 @@@ config DEBUG_LL_INCLUD
        default "debug/imx.S" if DEBUG_IMX1_UART || \
                                 DEBUG_IMX25_UART || \
                                 DEBUG_IMX21_IMX27_UART || \
-                                DEBUG_IMX31_IMX35_UART || \
+                                DEBUG_IMX31_UART || \
+                                DEBUG_IMX35_UART || \
                                 DEBUG_IMX51_UART || \
                                 DEBUG_IMX53_UART ||\
                                 DEBUG_IMX6Q_UART
        default "debug/highbank.S" if DEBUG_HIGHBANK_UART
        default "debug/mvebu.S" if DEBUG_MVEBU_UART
 +      default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
        default "debug/picoxcell.S" if DEBUG_PICOXCELL_UART
        default "debug/socfpga.S" if DEBUG_SOCFPGA_UART
        default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1
@@@ -6,15 -6,26 +6,32 @@@
  #define SCU_PM_POWEROFF       3
  
  #ifndef __ASSEMBLER__
+ #include <asm/cputype.h>
+ static inline bool scu_a9_has_base(void)
+ {
+       return read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9;
+ }
+ static inline unsigned long scu_a9_get_base(void)
+ {
+       unsigned long pa;
+       asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (pa));
+       return pa;
+ }
  unsigned int scu_get_core_count(void __iomem *);
 -void scu_enable(void __iomem *);
  int scu_power_mode(void __iomem *, unsigned int);
 +
 +#ifdef CONFIG_SMP
 +void scu_enable(void __iomem *scu_base);
 +#else
 +static inline void scu_enable(void __iomem *scu_base) {}
 +#endif
 +
  #endif
  
  #endif
@@@ -17,8 -17,8 +17,8 @@@
  #include <linux/irqchip/bcm2835.h>
  #include <linux/of_address.h>
  #include <linux/of_platform.h>
 -#include <linux/bcm2835_timer.h>
  #include <linux/clk/bcm2835.h>
 +#include <linux/clocksource.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <mach/bcm2835_soc.h>
  
  #define PM_RSTC                               0x1c
+ #define PM_RSTS                               0x20
  #define PM_WDOG                               0x24
  
  #define PM_PASSWORD                   0x5a000000
  #define PM_RSTC_WRCFG_MASK            0x00000030
  #define PM_RSTC_WRCFG_FULL_RESET      0x00000020
+ #define PM_RSTS_HADWRH_SET            0x00000040
  
  static void __iomem *wdt_regs;
  
@@@ -67,6 -69,29 +69,29 @@@ static void bcm2835_restart(char mode, 
        mdelay(1);
  }
  
+ /*
+  * We can't really power off, but if we do the normal reset scheme, and
+  * indicate to bootcode.bin not to reboot, then most of the chip will be
+  * powered off.
+  */
+ static void bcm2835_power_off(void)
+ {
+       u32 val;
+       /*
+        * We set the watchdog hard reset bit here to distinguish this reset
+        * from the normal (full) reset. bootcode.bin will not reboot after a
+        * hard reset.
+        */
+       val = readl_relaxed(wdt_regs + PM_RSTS);
+       val &= ~PM_RSTC_WRCFG_MASK;
+       val |= PM_PASSWORD | PM_RSTS_HADWRH_SET;
+       writel_relaxed(val, wdt_regs + PM_RSTS);
+       /* Continue with normal reset mechanism */
+       bcm2835_restart(0, "");
+ }
  static struct map_desc io_map __initdata = {
        .virtual = BCM2835_PERIPH_VIRT,
        .pfn = __phys_to_pfn(BCM2835_PERIPH_PHYS),
@@@ -84,6 -109,9 +109,9 @@@ static void __init bcm2835_init(void
        int ret;
  
        bcm2835_setup_restart();
+       if (wdt_regs)
+               pm_power_off = bcm2835_power_off;
        bcm2835_init_clocks();
  
        ret = of_platform_populate(NULL, of_default_bus_match_table, NULL,
@@@ -104,7 -132,7 +132,7 @@@ DT_MACHINE_START(BCM2835, "BCM2835"
        .init_irq = bcm2835_init_irq,
        .handle_irq = bcm2835_handle_irq,
        .init_machine = bcm2835_init,
 -      .init_time = bcm2835_timer_init,
 +      .init_time = clocksource_of_init,
        .restart = bcm2835_restart,
        .dt_compat = bcm2835_compat
  MACHINE_END
@@@ -62,7 -62,7 +62,7 @@@ static const char *clko_sel_clks[] = 
        "32k", "usb_div", "dptc",
  };
  
- static const char *ssi_sel_clks[] = { "spll", "mpll", };
+ static const char *ssi_sel_clks[] = { "spll_gate", "mpll", };
  
  enum mx27_clks {
        dummy, ckih, ckil, mpll, spll, mpll_main2, ahb, ipg, nfc_div, per1_div,
@@@ -82,7 -82,7 +82,7 @@@
        csi_ahb_gate, brom_ahb_gate, ata_ahb_gate, wdog_ipg_gate, usb_ipg_gate,
        uart6_ipg_gate, uart5_ipg_gate, uart4_ipg_gate, uart3_ipg_gate,
        uart2_ipg_gate, uart1_ipg_gate, ckih_div1p5, fpm, mpll_osc_sel,
-       mpll_sel, clk_max
+       mpll_sel, spll_gate, clk_max
  };
  
  static struct clk *clk[clk_max];
@@@ -104,6 -104,7 +104,7 @@@ int __init mx27_clocks_init(unsigned lo
                        ARRAY_SIZE(mpll_sel_clks));
        clk[mpll] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);
        clk[spll] = imx_clk_pllv1("spll", "ckih", CCM_SPCTL0);
+       clk[spll_gate] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);
        clk[mpll_main2] = imx_clk_fixed_factor("mpll_main2", "mpll", 2, 3);
  
        if (mx27_revision() >= IMX_CHIP_REVISION_2_0) {
        clk[per4_div] = imx_clk_divider("per4_div", "mpll_main2", CCM_PCDR1, 24, 6);
        clk[vpu_sel] = imx_clk_mux("vpu_sel", CCM_CSCR, 21, 1, vpu_sel_clks, ARRAY_SIZE(vpu_sel_clks));
        clk[vpu_div] = imx_clk_divider("vpu_div", "vpu_sel", CCM_PCDR0, 10, 6);
-       clk[usb_div] = imx_clk_divider("usb_div", "spll", CCM_CSCR, 28, 3);
+       clk[usb_div] = imx_clk_divider("usb_div", "spll_gate", CCM_CSCR, 28, 3);
        clk[cpu_sel] = imx_clk_mux("cpu_sel", CCM_CSCR, 15, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks));
        clk[clko_sel] = imx_clk_mux("clko_sel", CCM_CCSR, 0, 5, clko_sel_clks, ARRAY_SIZE(clko_sel_clks));
        if (mx27_revision() >= IMX_CHIP_REVISION_2_0)
        clk_register_clkdev(clk[sdhc2_ipg_gate], "ipg", "imx21-mmc.1");
        clk_register_clkdev(clk[per2_gate], "per", "imx21-mmc.2");
        clk_register_clkdev(clk[sdhc2_ipg_gate], "ipg", "imx21-mmc.2");
 -      clk_register_clkdev(clk[cspi1_ipg_gate], NULL, "imx27-cspi.0");
 -      clk_register_clkdev(clk[cspi2_ipg_gate], NULL, "imx27-cspi.1");
 -      clk_register_clkdev(clk[cspi3_ipg_gate], NULL, "imx27-cspi.2");
 +      clk_register_clkdev(clk[per2_gate], "per", "imx27-cspi.0");
 +      clk_register_clkdev(clk[cspi1_ipg_gate], "ipg", "imx27-cspi.0");
 +      clk_register_clkdev(clk[per2_gate], "per", "imx27-cspi.1");
 +      clk_register_clkdev(clk[cspi2_ipg_gate], "ipg", "imx27-cspi.1");
 +      clk_register_clkdev(clk[per2_gate], "per", "imx27-cspi.2");
 +      clk_register_clkdev(clk[cspi3_ipg_gate], "ipg", "imx27-cspi.2");
        clk_register_clkdev(clk[per3_gate], "per", "imx21-fb.0");
        clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx21-fb.0");
        clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx21-fb.0");
  #include "common.h"
  #include "mx31.h"
  
- static const struct of_dev_auxdata imx31_auxdata_lookup[] __initconst = {
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART1_BASE_ADDR,
-                       "imx21-uart.0", NULL),
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART2_BASE_ADDR,
-                       "imx21-uart.1", NULL),
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART3_BASE_ADDR,
-                       "imx21-uart.2", NULL),
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART4_BASE_ADDR,
-                       "imx21-uart.3", NULL),
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART5_BASE_ADDR,
-                       "imx21-uart.4", NULL),
-       { /* sentinel */ }
- };
  static void __init imx31_dt_init(void)
  {
-       of_platform_populate(NULL, of_default_bus_match_table,
-                            imx31_auxdata_lookup, NULL);
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
  }
  
  static const char *imx31_dt_board_compat[] __initdata = {
        NULL
  };
  
 +static void __init imx31_dt_timer_init(void)
 +{
 +      mx31_clocks_init_dt();
 +}
 +
  DT_MACHINE_START(IMX31_DT, "Freescale i.MX31 (Device Tree Support)")
        .map_io         = mx31_map_io,
        .init_early     = imx31_init_early,
        .init_irq       = mx31_init_irq,
        .handle_irq     = imx31_handle_irq,
 -      .init_time      = mx31_clocks_init_dt,
 +      .init_time      = imx31_dt_timer_init,
        .init_machine   = imx31_dt_init,
        .dt_compat      = imx31_dt_board_compat,
        .restart        = mxc_restart,
@@@ -25,7 -25,6 +25,7 @@@
  #include <linux/gpio.h>
  #include <linux/mmc/host.h>
  #include <linux/platform_data/spi-omap2-mcspi.h>
 +#include <linux/usb/phy.h>
  
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
@@@ -425,7 -424,7 +425,7 @@@ static void enable_board_wakeup_source(
                OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP);
  }
  
- static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
  
        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
@@@ -580,7 -579,6 +580,7 @@@ static void __init omap_3430sdp_init(vo
        omap_ads7846_init(1, gpio_pendown, 310, NULL);
        omap_serial_init();
        omap_sdrc_init(hyb18m512160af6_sdrc_params, NULL);
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
        board_smc91x_init();
        board_flash_init(sdp_flash_partitions, chip_sel_3430, 0);
@@@ -30,7 -30,6 +30,7 @@@
  #include <linux/regulator/fixed.h>
  #include <linux/regulator/machine.h>
  #include <linux/mmc/host.h>
 +#include <linux/usb/phy.h>
  
  #include <linux/spi/spi.h>
  #include <linux/spi/tdo24m.h>
@@@ -419,7 -418,7 +419,7 @@@ static struct omap2_hsmmc_info mmc[] = 
        {}      /* Terminator */
  };
  
- static struct usbhs_omap_board_data usbhs_bdata __initdata = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
@@@ -725,7 -724,6 +725,7 @@@ static void __init cm_t3x_common_init(v
        cm_t35_init_display();
        omap_twl4030_audio_init("cm-t3x");
  
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
        cm_t35_init_usbh();
        cm_t35_init_camera();
@@@ -29,7 -29,6 +29,7 @@@
  #include <linux/mtd/partitions.h>
  #include <linux/mtd/nand.h>
  #include <linux/mmc/host.h>
 +#include <linux/usb/phy.h>
  
  #include <linux/regulator/machine.h>
  #include <linux/i2c/twl.h>
@@@ -436,7 -435,7 +436,7 @@@ static struct platform_device *devkit80
        &omap_dm9000_dev,
  };
  
- static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
  
        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
@@@ -623,7 -622,6 +623,7 @@@ static void __init devkit8000_init(void
  
        omap_ads7846_init(2, OMAP3_DEVKIT_TS_GPIO, 0, NULL);
  
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
        usbhs_init(&usbhs_bdata);
        board_nand_init(devkit8000_nand_partitions,
@@@ -18,7 -18,6 +18,7 @@@
  #include <linux/gpio.h>
  #include <linux/interrupt.h>
  #include <linux/input.h>
 +#include <linux/usb/phy.h>
  
  #include <linux/regulator/machine.h>
  #include <linux/regulator/fixed.h>
@@@ -527,7 -526,7 +527,7 @@@ static void __init igep_i2c_init(void
        omap3_pmic_init("twl4030", &igep_twldata);
  }
  
- static const struct usbhs_omap_board_data igep2_usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data igep2_usbhs_bdata __initdata = {
        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
        .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
        .reset_gpio_port[2] = -EINVAL,
  };
  
- static const struct usbhs_omap_board_data igep3_usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data igep3_usbhs_bdata __initdata = {
        .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
@@@ -626,7 -625,6 +626,7 @@@ static void __init igep_init(void
        omap_serial_init();
        omap_sdrc_init(m65kxxxxam_sdrc_params,
                                  m65kxxxxam_sdrc_params);
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
  
        igep_flash_init();
@@@ -30,7 -30,6 +30,7 @@@
  #include <linux/mtd/partitions.h>
  #include <linux/mtd/nand.h>
  #include <linux/mmc/host.h>
 +#include <linux/usb/phy.h>
  
  #include <linux/regulator/machine.h>
  #include <linux/i2c/twl.h>
@@@ -431,7 -430,7 +431,7 @@@ static struct platform_device *omap3_be
        &madc_hwmon,
  };
  
- static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
  
        .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
@@@ -495,7 -494,7 +495,7 @@@ static int __init beagle_opp_init(void
        }
        return 0;
  }
 -device_initcall(beagle_opp_init);
 +omap_device_initcall(beagle_opp_init);
  
  static void __init omap3_beagle_init(void)
  {
        omap_sdrc_init(mt46h32m32lf6_sdrc_params,
                                  mt46h32m32lf6_sdrc_params);
  
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
        usbhs_init(&usbhs_bdata);
        board_nand_init(omap3beagle_nand_partitions,
@@@ -41,7 -41,6 +41,7 @@@
  #include <linux/regulator/machine.h>
  #include <linux/mmc/host.h>
  #include <linux/export.h>
 +#include <linux/usb/phy.h>
  
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
@@@ -310,7 -309,7 +310,7 @@@ static struct omap2_hsmmc_info mmc[] = 
                .gpio_wp        = 63,
                .deferred       = true,
        },
 -#ifdef CONFIG_WL12XX_PLATFORM_DATA
 +#ifdef CONFIG_WILINK_PLATFORM_DATA
        {
                .name           = "wl1271",
                .mmc            = 2,
@@@ -451,7 -450,7 +451,7 @@@ static struct regulator_init_data omap3
        .consumer_supplies      = omap3evm_vio_supply,
  };
  
 -#ifdef CONFIG_WL12XX_PLATFORM_DATA
 +#ifdef CONFIG_WILINK_PLATFORM_DATA
  
  #define OMAP3EVM_WLAN_PMENA_GPIO      (150)
  #define OMAP3EVM_WLAN_IRQ_GPIO                (149)
@@@ -539,7 -538,7 +539,7 @@@ static int __init omap3_evm_i2c_init(vo
        return 0;
  }
  
- static struct usbhs_omap_board_data usbhs_bdata __initdata = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
  
        .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
@@@ -564,7 -563,7 +564,7 @@@ static struct omap_board_mux omap35x_bo
                                OMAP_PIN_OFF_NONE),
        OMAP3_MUX(GPMC_WAIT2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
                                OMAP_PIN_OFF_NONE),
 -#ifdef CONFIG_WL12XX_PLATFORM_DATA
 +#ifdef CONFIG_WILINK_PLATFORM_DATA
        /* WLAN IRQ - GPIO 149 */
        OMAP3_MUX(UART1_RTS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
  
@@@ -602,7 -601,7 +602,7 @@@ static struct omap_board_mux omap36x_bo
        OMAP3_MUX(SYS_BOOT4, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE),
        OMAP3_MUX(SYS_BOOT5, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE),
        OMAP3_MUX(SYS_BOOT6, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE),
 -#ifdef CONFIG_WL12XX_PLATFORM_DATA
 +#ifdef CONFIG_WILINK_PLATFORM_DATA
        /* WLAN IRQ - GPIO 149 */
        OMAP3_MUX(UART1_RTS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
  
@@@ -638,7 -637,7 +638,7 @@@ static struct gpio omap3_evm_ehci_gpios
  
  static void __init omap3_evm_wl12xx_init(void)
  {
 -#ifdef CONFIG_WL12XX_PLATFORM_DATA
 +#ifdef CONFIG_WILINK_PLATFORM_DATA
        int ret;
  
        /* WL12xx WLAN Init */
@@@ -735,7 -734,6 +735,7 @@@ static void __init omap3_evm_init(void
                omap_mux_init_gpio(135, OMAP_PIN_OUTPUT);
                usbhs_bdata.reset_gpio_port[1] = 135;
        }
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(&musb_board_data);
        usbhs_init(&usbhs_bdata);
        board_nand_init(omap3evm_nand_partitions,
@@@ -35,7 -35,6 +35,7 @@@
  #include <linux/mmc/host.h>
  #include <linux/mmc/card.h>
  #include <linux/regulator/fixed.h>
 +#include <linux/usb/phy.h>
  #include <linux/platform_data/spi-omap2-mcspi.h>
  
  #include <asm/mach-types.h>
@@@ -568,7 -567,7 +568,7 @@@ static struct platform_device *omap3pan
        &pandora_backlight,
  };
  
- static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
  
        .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
@@@ -602,7 -601,6 +602,7 @@@ static void __init omap3pandora_init(vo
                        ARRAY_SIZE(omap3pandora_spi_board_info));
        omap_ads7846_init(1, OMAP3_PANDORA_TS_GPIO, 0, NULL);
        usbhs_init(&usbhs_bdata);
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
        gpmc_nand_init(&pandora_nand_data, NULL);
  
@@@ -33,7 -33,6 +33,7 @@@
  #include <linux/interrupt.h>
  #include <linux/smsc911x.h>
  #include <linux/i2c/at24.h>
 +#include <linux/usb/phy.h>
  
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
@@@ -362,7 -361,7 +362,7 @@@ static struct platform_device *omap3_st
        &keys_gpio,
  };
  
- static struct usbhs_omap_board_data usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
        .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
@@@ -405,7 -404,6 +405,7 @@@ static void __init omap3_stalker_init(v
  
        omap_serial_init();
        omap_sdrc_init(mt46h32m32lf6_sdrc_params, NULL);
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
        usbhs_init(&usbhs_bdata);
        omap_ads7846_init(1, OMAP3_STALKER_TS_GPIO, 310, NULL);
@@@ -28,7 -28,6 +28,7 @@@
  #include <linux/mtd/partitions.h>
  #include <linux/mtd/nand.h>
  #include <linux/mmc/host.h>
 +#include <linux/usb/phy.h>
  
  #include <linux/platform_data/spi-omap2-mcspi.h>
  #include <linux/spi/spi.h>
@@@ -310,7 -309,7 +310,7 @@@ static struct platform_device *omap3_to
        &keys_gpio,
  };
  
- static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
  
        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
@@@ -366,7 -365,6 +366,7 @@@ static void __init omap3_touchbook_init
  
        /* Touchscreen and accelerometer */
        omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata);
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
        usbhs_init(&usbhs_bdata);
        board_nand_init(omap3touchbook_nand_partitions,
@@@ -30,7 -30,6 +30,7 @@@
  #include <linux/regulator/fixed.h>
  #include <linux/ti_wilink_st.h>
  #include <linux/usb/musb.h>
 +#include <linux/usb/phy.h>
  #include <linux/wl12xx.h>
  #include <linux/irqchip/arm-gic.h>
  #include <linux/platform_data/omap-abe-twl6040.h>
@@@ -140,7 -139,7 +140,7 @@@ static struct platform_device *panda_de
        &btwilink_device,
  };
  
- static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
        .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
        .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
@@@ -448,7 -447,6 +448,7 @@@ static void __init omap4_panda_init(voi
        omap_sdrc_init(NULL, NULL);
        omap4_twl6030_hsmmc_init(mmc);
        omap4_ehci_init();
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "omap-usb2.1.auto");
        usb_musb_init(&musb_board_data);
        omap4_panda_display_init();
  }
@@@ -36,7 -36,6 +36,7 @@@
  #include <linux/mtd/nand.h>
  #include <linux/mtd/partitions.h>
  #include <linux/mmc/host.h>
 +#include <linux/usb/phy.h>
  
  #include <linux/platform_data/mtd-nand-omap2.h>
  #include <linux/platform_data/spi-omap2-mcspi.h>
@@@ -458,7 -457,7 +458,7 @@@ static int __init overo_spi_init(void
        return 0;
  }
  
- static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
        .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
        .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
        .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
@@@ -500,7 -499,6 +500,7 @@@ static void __init overo_init(void
                                  mt46h32m32lf6_sdrc_params);
        board_nand_init(overo_nand_partitions,
                        ARRAY_SIZE(overo_nand_partitions), NAND_CS, 0, NULL);
 +      usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
        usb_musb_init(NULL);
        usbhs_init(&usbhs_bdata);
        overo_spi_init();
@@@ -20,7 -20,6 +20,7 @@@
  #include <linux/pinctrl/machine.h>
  #include <linux/platform_data/omap4-keypad.h>
  #include <linux/platform_data/omap_ocp2scp.h>
 +#include <linux/usb/omap_control_usb.h>
  
  #include <asm/mach-types.h>
  #include <asm/mach/map.h>
@@@ -62,14 -61,13 +62,13 @@@ static int __init omap3_l3_init(void
        if (!oh)
                pr_err("could not look up %s\n", oh_name);
  
-       pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0,
-                                                          NULL, 0, 0);
+       pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0);
  
        WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
  
        return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
  }
 -postcore_initcall(omap3_l3_init);
 +omap_postcore_initcall(omap3_l3_init);
  
  static int __init omap4_l3_init(void)
  {
                        pr_err("could not look up %s\n", oh_name);
        }
  
-       pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL,
-                                                    0, NULL, 0, 0);
+       pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL, 0);
  
        WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
  
        return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
  }
 -postcore_initcall(omap4_l3_init);
 +omap_postcore_initcall(omap4_l3_init);
  
  #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
  
@@@ -255,49 -252,6 +253,49 @@@ static inline void omap_init_camera(voi
  #endif
  }
  
 +#if IS_ENABLED(CONFIG_OMAP_CONTROL_USB)
 +static struct omap_control_usb_platform_data omap4_control_usb_pdata = {
 +      .type = 1,
 +};
 +
 +struct resource omap4_control_usb_res[] = {
 +      {
 +              .name   = "control_dev_conf",
 +              .start  = 0x4a002300,
 +              .end    = 0x4a002303,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +      {
 +              .name   = "otghs_control",
 +              .start  = 0x4a00233c,
 +              .end    = 0x4a00233f,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +};
 +
 +static struct platform_device omap4_control_usb = {
 +      .name = "omap-control-usb",
 +      .id = -1,
 +      .dev = {
 +              .platform_data = &omap4_control_usb_pdata,
 +      },
 +      .num_resources = 2,
 +      .resource = omap4_control_usb_res,
 +};
 +
 +static inline void __init omap_init_control_usb(void)
 +{
 +      if (!cpu_is_omap44xx())
 +              return;
 +
 +      if (platform_device_register(&omap4_control_usb))
 +              pr_err("Error registering omap_control_usb device\n");
 +}
 +
 +#else
 +static inline void omap_init_control_usb(void) { }
 +#endif /* CONFIG_OMAP_CONTROL_USB */
 +
  int __init omap4_keyboard_init(struct omap4_keypad_platform_data
                        *sdp4430_keypad_data, struct omap_board_data *bdata)
  {
        keypad_data = sdp4430_keypad_data;
  
        pdev = omap_device_build(name, id, oh, keypad_data,
-                       sizeof(struct omap4_keypad_platform_data), NULL, 0, 0);
+                                sizeof(struct omap4_keypad_platform_data));
  
        if (IS_ERR(pdev)) {
                WARN(1, "Can't build omap_device for %s:%s.\n",
@@@ -341,7 -295,7 +339,7 @@@ static inline void __init omap_init_mbo
                return;
        }
  
-       pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0, NULL, 0, 0);
+       pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0);
        WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n",
                                                __func__, PTR_ERR(pdev));
  }
@@@ -381,7 -335,7 +379,7 @@@ static void __init omap_init_mcpdm(void
                return;
        }
  
-       pdev = omap_device_build("omap-mcpdm", -1, oh, NULL, 0, NULL, 0, 0);
+       pdev = omap_device_build("omap-mcpdm", -1, oh, NULL, 0);
        WARN(IS_ERR(pdev), "Can't build omap_device for omap-mcpdm.\n");
  }
  #else
@@@ -402,7 -356,7 +400,7 @@@ static void __init omap_init_dmic(void
                return;
        }
  
-       pdev = omap_device_build("omap-dmic", -1, oh, NULL, 0, NULL, 0, 0);
+       pdev = omap_device_build("omap-dmic", -1, oh, NULL, 0);
        WARN(IS_ERR(pdev), "Can't build omap_device for omap-dmic.\n");
  }
  #else
@@@ -428,8 -382,7 +426,7 @@@ static void __init omap_init_hdmi_audio
                return;
        }
  
-       pdev = omap_device_build("omap-hdmi-audio-dai",
-               -1, oh, NULL, 0, NULL, 0, 0);
+       pdev = omap_device_build("omap-hdmi-audio-dai", -1, oh, NULL, 0, 0);
        WARN(IS_ERR(pdev),
             "Can't build omap_device for omap-hdmi-audio-dai.\n");
  
@@@ -473,8 -426,7 +470,7 @@@ static int __init omap_mcspi_init(struc
        }
  
        spi_num++;
-       pdev = omap_device_build(name, spi_num, oh, pdata,
-                               sizeof(*pdata), NULL, 0, 0);
+       pdev = omap_device_build(name, spi_num, oh, pdata, sizeof(*pdata));
        WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s\n",
                                name, oh->name);
        kfree(pdata);
@@@ -504,7 -456,7 +500,7 @@@ static void omap_init_rng(void
        if (!oh)
                return;
  
-       pdev = omap_device_build("omap_rng", -1, oh, NULL, 0, NULL, 0, 0);
+       pdev = omap_device_build("omap_rng", -1, oh, NULL, 0);
        WARN(IS_ERR(pdev), "Can't build omap_device for omap_rng\n");
  }
  
@@@ -733,8 -685,7 +729,7 @@@ static void __init omap_init_ocp2scp(vo
  
        pdata->dev_cnt  = dev_cnt;
  
-       pdev = omap_device_build(name, bus_id, oh, pdata, sizeof(*pdata), NULL,
-                                                               0, false);
+       pdev = omap_device_build(name, bus_id, oh, pdata, sizeof(*pdata));
        if (IS_ERR(pdev)) {
                pr_err("Could not build omap_device for %s %s\n",
                                                name, oh_name);
@@@ -765,7 -716,6 +760,7 @@@ static int __init omap2_init_devices(vo
        omap_init_mbox();
        /* If dtb is there, the devices will be created dynamically */
        if (!of_have_populated_dt()) {
 +              omap_init_control_usb();
                omap_init_dmic();
                omap_init_mcpdm();
                omap_init_mcspi();
  
        return 0;
  }
 -arch_initcall(omap2_init_devices);
 +omap_arch_initcall(omap2_init_devices);
@@@ -27,7 -27,7 +27,7 @@@
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/device.h>
 -
 +#include <linux/dma-mapping.h>
  #include <linux/omap-dma.h>
  
  #include "soc.h"
@@@ -248,7 -248,7 +248,7 @@@ static int __init omap2_system_dma_init
  
        p->errata               = configure_dma_errata();
  
-       pdev = omap_device_build(name, 0, oh, p, sizeof(*p), NULL, 0, 0);
+       pdev = omap_device_build(name, 0, oh, p, sizeof(*p));
        kfree(p);
        if (IS_ERR(pdev)) {
                pr_err("%s: Can't build omap_device for %s:%s.\n",
        return 0;
  }
  
 +static const struct platform_device_info omap_dma_dev_info = {
 +      .name = "omap-dma-engine",
 +      .id = -1,
 +      .dma_mask = DMA_BIT_MASK(32),
 +};
 +
  static int __init omap2_system_dma_init(void)
  {
 -      return omap_hwmod_for_each_by_class("dma",
 +      struct platform_device *pdev;
 +      int res;
 +
 +      res = omap_hwmod_for_each_by_class("dma",
                        omap2_system_dma_init_dev, NULL);
 +      if (res)
 +              return res;
 +
 +      pdev = platform_device_register_full(&omap_dma_dev_info);
 +      if (IS_ERR(pdev))
 +              return PTR_ERR(pdev);
 +
 +      return res;
  }
 -arch_initcall(omap2_system_dma_init);
 +omap_arch_initcall(omap2_system_dma_init);
@@@ -51,8 -51,7 +51,7 @@@ static int __init omap_init_drm(void
        oh = omap_hwmod_lookup("dmm");
  
        if (oh) {
-               pdev = omap_device_build(oh->name, -1, oh, NULL, 0, NULL, 0,
-                                       false);
+               pdev = omap_device_build(oh->name, -1, oh, NULL, 0);
                WARN(IS_ERR(pdev), "Could not build omap_device for %s\n",
                        oh->name);
        }
@@@ -63,6 -62,6 +62,6 @@@
  
  }
  
 -arch_initcall(omap_init_drm);
 +omap_arch_initcall(omap_init_drm);
  
  #endif
@@@ -23,7 -23,6 +23,7 @@@
  #include <linux/of.h>
  #include <linux/platform_data/gpio-omap.h>
  
 +#include "soc.h"
  #include "omap_hwmod.h"
  #include "omap_device.h"
  #include "omap-pm.h"
@@@ -132,8 -131,7 +132,7 @@@ static int __init omap2_gpio_dev_init(s
        pwrdm = omap_hwmod_get_pwrdm(oh);
        pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm);
  
-       pdev = omap_device_build(name, id - 1, oh, pdata,
-                               sizeof(*pdata), NULL, 0, false);
+       pdev = omap_device_build(name, id - 1, oh, pdata, sizeof(*pdata));
        kfree(pdata);
  
        if (IS_ERR(pdev)) {
  /*
   * gpio_init needs to be done before
   * machine_init functions access gpio APIs.
 - * Hence gpio_init is a postcore_initcall.
 + * Hence gpio_init is a omap_postcore_initcall.
   */
  static int __init omap2_gpio_init(void)
  {
  
        return omap_hwmod_for_each_by_class("gpio", omap2_gpio_dev_init, NULL);
  }
 -postcore_initcall(omap2_gpio_init);
 +omap_postcore_initcall(omap2_gpio_init);
  #include <linux/module.h>
  #include <linux/interrupt.h>
  #include <linux/platform_device.h>
 +#include <linux/of.h>
 +#include <linux/of_mtd.h>
 +#include <linux/of_device.h>
 +#include <linux/mtd/nand.h>
  
  #include <linux/platform_data/mtd-nand-omap2.h>
  
@@@ -38,8 -34,6 +38,8 @@@
  #include "common.h"
  #include "omap_device.h"
  #include "gpmc.h"
 +#include "gpmc-nand.h"
 +#include "gpmc-onenand.h"
  
  #define       DEVICE_NAME             "omap-gpmc"
  
@@@ -151,8 -145,7 +151,8 @@@ static unsigned gpmc_irq_start
  static struct resource        gpmc_mem_root;
  static struct resource        gpmc_cs_mem[GPMC_CS_NUM];
  static DEFINE_SPINLOCK(gpmc_mem_lock);
 -static unsigned int gpmc_cs_map;      /* flag for cs which are initialized */
 +/* Define chip-selects as reserved by default until probe completes */
 +static unsigned int gpmc_cs_map = ((1 << GPMC_CS_NUM) - 1);
  static struct device *gpmc_dev;
  static int gpmc_irq;
  static resource_size_t phys_base, mem_size;
@@@ -1125,215 -1118,8 +1125,215 @@@ int gpmc_calc_timings(struct gpmc_timin
        /* TODO: remove, see function definition */
        gpmc_convert_ps_to_ns(gpmc_t);
  
 +      /* Now the GPMC is initialised, unreserve the chip-selects */
 +      gpmc_cs_map = 0;
 +
 +      return 0;
 +}
 +
 +#ifdef CONFIG_OF
 +static struct of_device_id gpmc_dt_ids[] = {
 +      { .compatible = "ti,omap2420-gpmc" },
 +      { .compatible = "ti,omap2430-gpmc" },
 +      { .compatible = "ti,omap3430-gpmc" },   /* omap3430 & omap3630 */
 +      { .compatible = "ti,omap4430-gpmc" },   /* omap4430 & omap4460 & omap543x */
 +      { .compatible = "ti,am3352-gpmc" },     /* am335x devices */
 +      { }
 +};
 +MODULE_DEVICE_TABLE(of, gpmc_dt_ids);
 +
 +static void __maybe_unused gpmc_read_timings_dt(struct device_node *np,
 +                                              struct gpmc_timings *gpmc_t)
 +{
 +      u32 val;
 +
 +      memset(gpmc_t, 0, sizeof(*gpmc_t));
 +
 +      /* minimum clock period for syncronous mode */
 +      if (!of_property_read_u32(np, "gpmc,sync-clk", &val))
 +              gpmc_t->sync_clk = val;
 +
 +      /* chip select timtings */
 +      if (!of_property_read_u32(np, "gpmc,cs-on", &val))
 +              gpmc_t->cs_on = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,cs-rd-off", &val))
 +              gpmc_t->cs_rd_off = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,cs-wr-off", &val))
 +              gpmc_t->cs_wr_off = val;
 +
 +      /* ADV signal timings */
 +      if (!of_property_read_u32(np, "gpmc,adv-on", &val))
 +              gpmc_t->adv_on = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,adv-rd-off", &val))
 +              gpmc_t->adv_rd_off = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,adv-wr-off", &val))
 +              gpmc_t->adv_wr_off = val;
 +
 +      /* WE signal timings */
 +      if (!of_property_read_u32(np, "gpmc,we-on", &val))
 +              gpmc_t->we_on = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,we-off", &val))
 +              gpmc_t->we_off = val;
 +
 +      /* OE signal timings */
 +      if (!of_property_read_u32(np, "gpmc,oe-on", &val))
 +              gpmc_t->oe_on = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,oe-off", &val))
 +              gpmc_t->oe_off = val;
 +
 +      /* access and cycle timings */
 +      if (!of_property_read_u32(np, "gpmc,page-burst-access", &val))
 +              gpmc_t->page_burst_access = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,access", &val))
 +              gpmc_t->access = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,rd-cycle", &val))
 +              gpmc_t->rd_cycle = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,wr-cycle", &val))
 +              gpmc_t->wr_cycle = val;
 +
 +      /* only for OMAP3430 */
 +      if (!of_property_read_u32(np, "gpmc,wr-access", &val))
 +              gpmc_t->wr_access = val;
 +
 +      if (!of_property_read_u32(np, "gpmc,wr-data-mux-bus", &val))
 +              gpmc_t->wr_data_mux_bus = val;
 +}
 +
 +#ifdef CONFIG_MTD_NAND
 +
 +static const char * const nand_ecc_opts[] = {
 +      [OMAP_ECC_HAMMING_CODE_DEFAULT]         = "sw",
 +      [OMAP_ECC_HAMMING_CODE_HW]              = "hw",
 +      [OMAP_ECC_HAMMING_CODE_HW_ROMCODE]      = "hw-romcode",
 +      [OMAP_ECC_BCH4_CODE_HW]                 = "bch4",
 +      [OMAP_ECC_BCH8_CODE_HW]                 = "bch8",
 +};
 +
 +static int gpmc_probe_nand_child(struct platform_device *pdev,
 +                               struct device_node *child)
 +{
 +      u32 val;
 +      const char *s;
 +      struct gpmc_timings gpmc_t;
 +      struct omap_nand_platform_data *gpmc_nand_data;
 +
 +      if (of_property_read_u32(child, "reg", &val) < 0) {
 +              dev_err(&pdev->dev, "%s has no 'reg' property\n",
 +                      child->full_name);
 +              return -ENODEV;
 +      }
 +
 +      gpmc_nand_data = devm_kzalloc(&pdev->dev, sizeof(*gpmc_nand_data),
 +                                    GFP_KERNEL);
 +      if (!gpmc_nand_data)
 +              return -ENOMEM;
 +
 +      gpmc_nand_data->cs = val;
 +      gpmc_nand_data->of_node = child;
 +
 +      if (!of_property_read_string(child, "ti,nand-ecc-opt", &s))
 +              for (val = 0; val < ARRAY_SIZE(nand_ecc_opts); val++)
 +                      if (!strcasecmp(s, nand_ecc_opts[val])) {
 +                              gpmc_nand_data->ecc_opt = val;
 +                              break;
 +                      }
 +
 +      val = of_get_nand_bus_width(child);
 +      if (val == 16)
 +              gpmc_nand_data->devsize = NAND_BUSWIDTH_16;
 +
 +      gpmc_read_timings_dt(child, &gpmc_t);
 +      gpmc_nand_init(gpmc_nand_data, &gpmc_t);
 +
 +      return 0;
 +}
 +#else
 +static int gpmc_probe_nand_child(struct platform_device *pdev,
 +                               struct device_node *child)
 +{
        return 0;
  }
 +#endif
 +
 +#ifdef CONFIG_MTD_ONENAND
 +static int gpmc_probe_onenand_child(struct platform_device *pdev,
 +                               struct device_node *child)
 +{
 +      u32 val;
 +      struct omap_onenand_platform_data *gpmc_onenand_data;
 +
 +      if (of_property_read_u32(child, "reg", &val) < 0) {
 +              dev_err(&pdev->dev, "%s has no 'reg' property\n",
 +                      child->full_name);
 +              return -ENODEV;
 +      }
 +
 +      gpmc_onenand_data = devm_kzalloc(&pdev->dev, sizeof(*gpmc_onenand_data),
 +                                       GFP_KERNEL);
 +      if (!gpmc_onenand_data)
 +              return -ENOMEM;
 +
 +      gpmc_onenand_data->cs = val;
 +      gpmc_onenand_data->of_node = child;
 +      gpmc_onenand_data->dma_channel = -1;
 +
 +      if (!of_property_read_u32(child, "dma-channel", &val))
 +              gpmc_onenand_data->dma_channel = val;
 +
 +      gpmc_onenand_init(gpmc_onenand_data);
 +
 +      return 0;
 +}
 +#else
 +static int gpmc_probe_onenand_child(struct platform_device *pdev,
 +                                  struct device_node *child)
 +{
 +      return 0;
 +}
 +#endif
 +
 +static int gpmc_probe_dt(struct platform_device *pdev)
 +{
 +      int ret;
 +      struct device_node *child;
 +      const struct of_device_id *of_id =
 +              of_match_device(gpmc_dt_ids, &pdev->dev);
 +
 +      if (!of_id)
 +              return 0;
 +
 +      for_each_node_by_name(child, "nand") {
 +              ret = gpmc_probe_nand_child(pdev, child);
 +              if (ret < 0) {
 +                      of_node_put(child);
 +                      return ret;
 +              }
 +      }
 +
 +      for_each_node_by_name(child, "onenand") {
 +              ret = gpmc_probe_onenand_child(pdev, child);
 +              if (ret < 0) {
 +                      of_node_put(child);
 +                      return ret;
 +              }
 +      }
 +      return 0;
 +}
 +#else
 +static int gpmc_probe_dt(struct platform_device *pdev)
 +{
 +      return 0;
 +}
 +#endif
  
  static int gpmc_probe(struct platform_device *pdev)
  {
        phys_base = res->start;
        mem_size = resource_size(res);
  
 -      gpmc_base = devm_request_and_ioremap(&pdev->dev, res);
 -      if (!gpmc_base) {
 -              dev_err(&pdev->dev, "error: request memory / ioremap\n");
 -              return -EADDRNOTAVAIL;
 -      }
 +      gpmc_base = devm_ioremap_resource(&pdev->dev, res);
 +      if (IS_ERR(gpmc_base))
 +              return PTR_ERR(gpmc_base);
  
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (res == NULL)
        if (IS_ERR_VALUE(gpmc_setup_irq()))
                dev_warn(gpmc_dev, "gpmc_setup_irq failed\n");
  
 +      rc = gpmc_probe_dt(pdev);
 +      if (rc < 0) {
 +              clk_disable_unprepare(gpmc_l3_clk);
 +              clk_put(gpmc_l3_clk);
 +              dev_err(gpmc_dev, "failed to probe DT parameters\n");
 +              return rc;
 +      }
 +
        return 0;
  }
  
@@@ -1411,7 -1191,6 +1411,7 @@@ static struct platform_driver gpmc_driv
        .driver         = {
                .name   = DEVICE_NAME,
                .owner  = THIS_MODULE,
 +              .of_match_table = of_match_ptr(gpmc_dt_ids),
        },
  };
  
@@@ -1426,7 -1205,7 +1426,7 @@@ static __exit void gpmc_exit(void
  
  }
  
 -postcore_initcall(gpmc_init);
 +omap_postcore_initcall(gpmc_init);
  module_exit(gpmc_exit);
  
  static int __init omap_gpmc_init(void)
        struct platform_device *pdev;
        char *oh_name = "gpmc";
  
 +      /*
 +       * if the board boots up with a populated DT, do not
 +       * manually add the device from this initcall
 +       */
 +      if (of_have_populated_dt())
 +              return -ENODEV;
 +
        oh = omap_hwmod_lookup(oh_name);
        if (!oh) {
                pr_err("Could not look up %s\n", oh_name);
                return -ENODEV;
        }
  
-       pdev = omap_device_build(DEVICE_NAME, -1, oh, NULL, 0, NULL, 0, 0);
+       pdev = omap_device_build(DEVICE_NAME, -1, oh, NULL, 0);
        WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
  
        return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
  }
 -postcore_initcall(omap_gpmc_init);
 +omap_postcore_initcall(omap_gpmc_init);
  
  static irqreturn_t gpmc_handle_irq(int irq, void *dev)
  {
@@@ -27,7 -27,6 +27,7 @@@
  #include <linux/err.h>
  #include <linux/platform_device.h>
  
 +#include "soc.h"
  #include "omap_hwmod.h"
  #include "omap_device.h"
  #include "hdq1w.h"
@@@ -88,10 -87,10 +88,10 @@@ static int __init omap_init_hdq(void
        if (!oh)
                return 0;
  
-       pdev = omap_device_build(devname, id, oh, NULL, 0, NULL, 0, 0);
+       pdev = omap_device_build(devname, id, oh, NULL, 0);
        WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n",
             devname, oh->name);
  
        return 0;
  }
 -arch_initcall(omap_init_hdq);
 +omap_arch_initcall(omap_init_hdq);
@@@ -21,7 -21,6 +21,7 @@@
  #include <linux/err.h>
  #include <linux/hwspinlock.h>
  
 +#include "soc.h"
  #include "omap_hwmod.h"
  #include "omap_device.h"
  
@@@ -47,8 -46,7 +47,7 @@@ static int __init hwspinlocks_init(void
                return -EINVAL;
  
        pdev = omap_device_build(dev_name, 0, oh, &omap_hwspinlock_pdata,
-                               sizeof(struct hwspinlock_pdata),
-                               NULL, 0, false);
+                               sizeof(struct hwspinlock_pdata));
        if (IS_ERR(pdev)) {
                pr_err("Can't build omap_device for %s:%s\n", dev_name,
                                                                oh_name);
@@@ -58,4 -56,4 +57,4 @@@
        return retval;
  }
  /* early board code might need to reserve specific hwspinlock instances */
 -postcore_initcall(hwspinlocks_init);
 +omap_postcore_initcall(hwspinlocks_init);
@@@ -178,15 -178,9 +178,14 @@@ int __init omap_i2c_add_bus(struct omap
        if (cpu_is_omap34xx())
                pdata->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat;
        pdev = omap_device_build(name, bus_id, oh, pdata,
-                       sizeof(struct omap_i2c_bus_platform_data),
-                       NULL, 0, 0);
+                                sizeof(struct omap_i2c_bus_platform_data));
        WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", name);
  
        return PTR_RET(pdev);
  }
  
 +static  int __init omap_i2c_cmdline(void)
 +{
 +      return omap_register_i2c_bus_cmdline();
 +}
 +omap_subsys_initcall(omap_i2c_cmdline);
@@@ -23,7 -23,6 +23,7 @@@
  
  #include <linux/omap-dma.h>
  
 +#include "soc.h"
  #include "omap_device.h"
  
  /*
@@@ -102,7 -101,7 +102,7 @@@ static int __init omap_init_mcbsp(struc
                count++;
        }
        pdev = omap_device_build_ss(name, id, oh_device, count, pdata,
-                               sizeof(*pdata), NULL, 0, false);
+                                   sizeof(*pdata));
        kfree(pdata);
        if (IS_ERR(pdev))  {
                pr_err("%s: Can't build omap_device for %s:%s.\n", __func__,
@@@ -119,4 -118,4 +119,4 @@@ static int __init omap2_mcbsp_init(void
  
        return 0;
  }
 -arch_initcall(omap2_mcbsp_init);
 +omap_arch_initcall(omap2_mcbsp_init);
@@@ -16,7 -16,6 +16,7 @@@
  #include <linux/slab.h>
  
  #include <linux/platform_data/iommu-omap.h>
 +#include "soc.h"
  #include "omap_hwmod.h"
  #include "omap_device.h"
  
@@@ -42,8 -41,7 +42,7 @@@ static int __init omap_iommu_dev_init(s
                pdata->deassert_reset = omap_device_deassert_hardreset;
        }
  
-       pdev = omap_device_build("omap-iommu", i, oh, pdata, sizeof(*pdata),
-                               NULL, 0, 0);
+       pdev = omap_device_build("omap-iommu", i, oh, pdata, sizeof(*pdata));
  
        kfree(pdata);
  
@@@ -62,7 -60,7 +61,7 @@@ static int __init omap_iommu_init(void
        return omap_hwmod_for_each_by_class("mmu", omap_iommu_dev_init, NULL);
  }
  /* must be ready before omap3isp is probed */
 -subsys_initcall(omap_iommu_init);
 +omap_subsys_initcall(omap_iommu_init);
  
  static void __exit omap_iommu_exit(void)
  {
   * to control power management and interconnect properties of their
   * devices.
   *
-  * In the medium- to long-term, this code should either be
-  * a) implemented via arch-specific pointers in platform_data
-  * or
-  * b) implemented as a proper omap_bus/omap_device in Linux, no more
-  *    platform_data func pointers
+  * In the medium- to long-term, this code should be implemented as a
+  * proper omap_bus/omap_device in Linux, no more platform_data func
+  * pointers
   *
   *
-  * Guidelines for usage by driver authors:
-  *
-  * 1. These functions are intended to be used by device drivers via
-  * function pointers in struct platform_data.  As an example,
-  * omap_device_enable() should be passed to the driver as
-  *
-  * struct foo_driver_platform_data {
-  * ...
-  *      int (*device_enable)(struct platform_device *pdev);
-  * ...
-  * }
-  *
-  * Note that the generic "device_enable" name is used, rather than
-  * "omap_device_enable".  This is so other architectures can pass in their
-  * own enable/disable functions here.
-  *
-  * This should be populated during device setup:
-  *
-  * ...
-  * pdata->device_enable = omap_device_enable;
-  * ...
-  *
-  * 2. Drivers should first check to ensure the function pointer is not null
-  * before calling it, as in:
-  *
-  * if (pdata->device_enable)
-  *     pdata->device_enable(pdev);
-  *
-  * This allows other architectures that don't use similar device_enable()/
-  * device_shutdown() functions to execute normally.
-  *
-  * ...
-  *
-  * Suggested usage by device drivers:
-  *
-  * During device initialization:
-  * device_enable()
-  *
-  * During device idle:
-  * (save remaining device context if necessary)
-  * device_idle();
-  *
-  * During device resume:
-  * device_enable();
-  * (restore context if necessary)
-  *
-  * During device shutdown:
-  * device_shutdown()
-  * (device must be reinitialized at this point to use it again)
-  *
   */
  #undef DEBUG
  
  #include <linux/kernel.h>
- #include <linux/export.h>
  #include <linux/platform_device.h>
  #include <linux/slab.h>
  #include <linux/err.h>
  #include <linux/of.h>
  #include <linux/notifier.h>
  
 +#include "soc.h"
  #include "omap_device.h"
  #include "omap_hwmod.h"
  
- /* These parameters are passed to _omap_device_{de,}activate() */
- #define USE_WAKEUP_LAT                        0
- #define IGNORE_WAKEUP_LAT             1
- static int omap_early_device_register(struct platform_device *pdev);
- static struct omap_device_pm_latency omap_default_latency[] = {
-       {
-               .deactivate_func = omap_device_idle_hwmods,
-               .activate_func   = omap_device_enable_hwmods,
-               .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
-       }
- };
  /* Private functions */
  
- /**
-  * _omap_device_activate - increase device readiness
-  * @od: struct omap_device *
-  * @ignore_lat: increase to latency target (0) or full readiness (1)?
-  *
-  * Increase readiness of omap_device @od (thus decreasing device
-  * wakeup latency, but consuming more power).  If @ignore_lat is
-  * IGNORE_WAKEUP_LAT, make the omap_device fully active.  Otherwise,
-  * if @ignore_lat is USE_WAKEUP_LAT, and the device's maximum wakeup
-  * latency is greater than the requested maximum wakeup latency, step
-  * backwards in the omap_device_pm_latency table to ensure the
-  * device's maximum wakeup latency is less than or equal to the
-  * requested maximum wakeup latency.  Returns 0.
-  */
- static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
- {
-       struct timespec a, b, c;
-       dev_dbg(&od->pdev->dev, "omap_device: activating\n");
-       while (od->pm_lat_level > 0) {
-               struct omap_device_pm_latency *odpl;
-               unsigned long long act_lat = 0;
-               od->pm_lat_level--;
-               odpl = od->pm_lats + od->pm_lat_level;
-               if (!ignore_lat &&
-                   (od->dev_wakeup_lat <= od->_dev_wakeup_lat_limit))
-                       break;
-               read_persistent_clock(&a);
-               /* XXX check return code */
-               odpl->activate_func(od);
-               read_persistent_clock(&b);
-               c = timespec_sub(b, a);
-               act_lat = timespec_to_ns(&c);
-               dev_dbg(&od->pdev->dev,
-                       "omap_device: pm_lat %d: activate: elapsed time %llu nsec\n",
-                       od->pm_lat_level, act_lat);
-               if (act_lat > odpl->activate_lat) {
-                       odpl->activate_lat_worst = act_lat;
-                       if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) {
-                               odpl->activate_lat = act_lat;
-                               dev_dbg(&od->pdev->dev,
-                                       "new worst case activate latency %d: %llu\n",
-                                       od->pm_lat_level, act_lat);
-                       } else
-                               dev_warn(&od->pdev->dev,
-                                        "activate latency %d higher than expected. (%llu > %d)\n",
-                                        od->pm_lat_level, act_lat,
-                                        odpl->activate_lat);
-               }
-               od->dev_wakeup_lat -= odpl->activate_lat;
-       }
-       return 0;
- }
- /**
-  * _omap_device_deactivate - decrease device readiness
-  * @od: struct omap_device *
-  * @ignore_lat: decrease to latency target (0) or full inactivity (1)?
-  *
-  * Decrease readiness of omap_device @od (thus increasing device
-  * wakeup latency, but conserving power).  If @ignore_lat is
-  * IGNORE_WAKEUP_LAT, make the omap_device fully inactive.  Otherwise,
-  * if @ignore_lat is USE_WAKEUP_LAT, and the device's maximum wakeup
-  * latency is less than the requested maximum wakeup latency, step
-  * forwards in the omap_device_pm_latency table to ensure the device's
-  * maximum wakeup latency is less than or equal to the requested
-  * maximum wakeup latency.  Returns 0.
-  */
- static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
- {
-       struct timespec a, b, c;
-       dev_dbg(&od->pdev->dev, "omap_device: deactivating\n");
-       while (od->pm_lat_level < od->pm_lats_cnt) {
-               struct omap_device_pm_latency *odpl;
-               unsigned long long deact_lat = 0;
-               odpl = od->pm_lats + od->pm_lat_level;
-               if (!ignore_lat &&
-                   ((od->dev_wakeup_lat + odpl->activate_lat) >
-                    od->_dev_wakeup_lat_limit))
-                       break;
-               read_persistent_clock(&a);
-               /* XXX check return code */
-               odpl->deactivate_func(od);
-               read_persistent_clock(&b);
-               c = timespec_sub(b, a);
-               deact_lat = timespec_to_ns(&c);
-               dev_dbg(&od->pdev->dev,
-                       "omap_device: pm_lat %d: deactivate: elapsed time %llu nsec\n",
-                       od->pm_lat_level, deact_lat);
-               if (deact_lat > odpl->deactivate_lat) {
-                       odpl->deactivate_lat_worst = deact_lat;
-                       if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) {
-                               odpl->deactivate_lat = deact_lat;
-                               dev_dbg(&od->pdev->dev,
-                                       "new worst case deactivate latency %d: %llu\n",
-                                       od->pm_lat_level, deact_lat);
-                       } else
-                               dev_warn(&od->pdev->dev,
-                                        "deactivate latency %d higher than expected. (%llu > %d)\n",
-                                        od->pm_lat_level, deact_lat,
-                                        odpl->deactivate_lat);
-               }
-               od->dev_wakeup_lat += odpl->activate_lat;
-               od->pm_lat_level++;
-       }
-       return 0;
- }
  static void _add_clkdev(struct omap_device *od, const char *clk_alias,
                       const char *clk_name)
  {
@@@ -316,9 -115,6 +116,6 @@@ static void _add_hwmod_clocks_clkdev(st
   * @oh: ptr to the single omap_hwmod that backs this omap_device
   * @pdata: platform_data ptr to associate with the platform_device
   * @pdata_len: amount of memory pointed to by @pdata
-  * @pm_lats: pointer to a omap_device_pm_latency array for this device
-  * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats
-  * @is_early_device: should the device be registered as an early device or not
   *
   * Function for building an omap_device already registered from device-tree
   *
@@@ -357,7 -153,7 +154,7 @@@ static int omap_device_build_from_dt(st
                hwmods[i] = oh;
        }
  
-       od = omap_device_alloc(pdev, hwmods, oh_cnt, NULL, 0);
+       od = omap_device_alloc(pdev, hwmods, oh_cnt);
        if (!od) {
                dev_err(&pdev->dev, "Cannot allocate omap_device for :%s\n",
                        oh_name);
@@@ -408,6 -204,39 +205,39 @@@ static int _omap_device_notifier_call(s
        return NOTIFY_DONE;
  }
  
+ /**
+  * _omap_device_enable_hwmods - call omap_hwmod_enable() on all hwmods
+  * @od: struct omap_device *od
+  *
+  * Enable all underlying hwmods.  Returns 0.
+  */
+ static int _omap_device_enable_hwmods(struct omap_device *od)
+ {
+       int i;
+       for (i = 0; i < od->hwmods_cnt; i++)
+               omap_hwmod_enable(od->hwmods[i]);
+       /* XXX pass along return value here? */
+       return 0;
+ }
+ /**
+  * _omap_device_idle_hwmods - call omap_hwmod_idle() on all hwmods
+  * @od: struct omap_device *od
+  *
+  * Idle all underlying hwmods.  Returns 0.
+  */
+ static int _omap_device_idle_hwmods(struct omap_device *od)
+ {
+       int i;
+       for (i = 0; i < od->hwmods_cnt; i++)
+               omap_hwmod_idle(od->hwmods[i]);
+       /* XXX pass along return value here? */
+       return 0;
+ }
  
  /* Public functions for use by core code */
  
@@@ -527,18 -356,14 +357,14 @@@ static int _od_fill_dma_resources(struc
   * @oh: ptr to the single omap_hwmod that backs this omap_device
   * @pdata: platform_data ptr to associate with the platform_device
   * @pdata_len: amount of memory pointed to by @pdata
-  * @pm_lats: pointer to a omap_device_pm_latency array for this device
-  * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats
   *
   * Convenience function for allocating an omap_device structure and filling
-  * hwmods, resources and pm_latency attributes.
+  * hwmods, and resources.
   *
   * Returns an struct omap_device pointer or ERR_PTR() on error;
   */
  struct omap_device *omap_device_alloc(struct platform_device *pdev,
-                                       struct omap_hwmod **ohs, int oh_cnt,
-                                       struct omap_device_pm_latency *pm_lats,
-                                       int pm_lats_cnt)
+                                       struct omap_hwmod **ohs, int oh_cnt)
  {
        int ret = -ENOMEM;
        struct omap_device *od;
                goto oda_exit3;
  
  have_everything:
-       if (!pm_lats) {
-               pm_lats = omap_default_latency;
-               pm_lats_cnt = ARRAY_SIZE(omap_default_latency);
-       }
-       od->pm_lats_cnt = pm_lats_cnt;
-       od->pm_lats = kmemdup(pm_lats,
-                       sizeof(struct omap_device_pm_latency) * pm_lats_cnt,
-                       GFP_KERNEL);
-       if (!od->pm_lats)
-               goto oda_exit3;
        pdev->archdata.od = od;
  
        for (i = 0; i < oh_cnt; i++) {
@@@ -664,7 -477,6 +478,6 @@@ void omap_device_delete(struct omap_dev
                return;
  
        od->pdev->archdata.od = NULL;
-       kfree(od->pm_lats);
        kfree(od->hwmods);
        kfree(od);
  }
   * @oh: ptr to the single omap_hwmod that backs this omap_device
   * @pdata: platform_data ptr to associate with the platform_device
   * @pdata_len: amount of memory pointed to by @pdata
-  * @pm_lats: pointer to a omap_device_pm_latency array for this device
-  * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats
-  * @is_early_device: should the device be registered as an early device or not
   *
   * Convenience function for building and registering a single
   * omap_device record, which in turn builds and registers a
   * information.  Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise,
   * passes along the return value of omap_device_build_ss().
   */
- struct platform_device __init *omap_device_build(const char *pdev_name, int pdev_id,
-                                     struct omap_hwmod *oh, void *pdata,
-                                     int pdata_len,
-                                     struct omap_device_pm_latency *pm_lats,
-                                     int pm_lats_cnt, int is_early_device)
+ struct platform_device __init *omap_device_build(const char *pdev_name,
+                                                int pdev_id,
+                                                struct omap_hwmod *oh,
+                                                void *pdata, int pdata_len)
  {
        struct omap_hwmod *ohs[] = { oh };
  
                return ERR_PTR(-EINVAL);
  
        return omap_device_build_ss(pdev_name, pdev_id, ohs, 1, pdata,
-                                   pdata_len, pm_lats, pm_lats_cnt,
-                                   is_early_device);
+                                   pdata_len);
  }
  
  /**
   * @oh: ptr to the single omap_hwmod that backs this omap_device
   * @pdata: platform_data ptr to associate with the platform_device
   * @pdata_len: amount of memory pointed to by @pdata
-  * @pm_lats: pointer to a omap_device_pm_latency array for this device
-  * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats
-  * @is_early_device: should the device be registered as an early device or not
   *
   * Convenience function for building and registering an omap_device
   * subsystem record.  Subsystem records consist of multiple
   * platform_device record.  Returns an ERR_PTR() on error, or passes
   * along the return value of omap_device_register().
   */
- struct platform_device __init *omap_device_build_ss(const char *pdev_name, int pdev_id,
-                                        struct omap_hwmod **ohs, int oh_cnt,
-                                        void *pdata, int pdata_len,
-                                        struct omap_device_pm_latency *pm_lats,
-                                        int pm_lats_cnt, int is_early_device)
+ struct platform_device __init *omap_device_build_ss(const char *pdev_name,
+                                                   int pdev_id,
+                                                   struct omap_hwmod **ohs,
+                                                   int oh_cnt, void *pdata,
+                                                   int pdata_len)
  {
        int ret = -ENOMEM;
        struct platform_device *pdev;
        else
                dev_set_name(&pdev->dev, "%s", pdev->name);
  
-       od = omap_device_alloc(pdev, ohs, oh_cnt, pm_lats, pm_lats_cnt);
+       od = omap_device_alloc(pdev, ohs, oh_cnt);
        if (IS_ERR(od))
                goto odbs_exit1;
  
        if (ret)
                goto odbs_exit2;
  
-       if (is_early_device)
-               ret = omap_early_device_register(pdev);
-       else
-               ret = omap_device_register(pdev);
+       ret = omap_device_register(pdev);
        if (ret)
                goto odbs_exit2;
  
@@@ -775,24 -576,6 +577,6 @@@ odbs_exit
        return ERR_PTR(ret);
  }
  
- /**
-  * omap_early_device_register - register an omap_device as an early platform
-  * device.
-  * @od: struct omap_device * to register
-  *
-  * Register the omap_device structure.  This currently just calls
-  * platform_early_add_device() on the underlying platform_device.
-  * Returns 0 by default.
-  */
- static int __init omap_early_device_register(struct platform_device *pdev)
- {
-       struct platform_device *devices[1];
-       devices[0] = pdev;
-       early_platform_add_devices(devices, 1);
-       return 0;
- }
  #ifdef CONFIG_PM_RUNTIME
  static int _od_runtime_suspend(struct device *dev)
  {
@@@ -903,10 -686,9 +687,9 @@@ int omap_device_register(struct platfor
   * to be accessible and ready to operate.  This generally involves
   * enabling clocks, setting SYSCONFIG registers; and in the future may
   * involve remuxing pins.  Device drivers should call this function
-  * (through platform_data function pointers) where they would normally
-  * enable clocks, etc.  Returns -EINVAL if called when the omap_device
-  * is already enabled, or passes along the return value of
-  * _omap_device_activate().
+  * indirectly via pm_runtime_get*().  Returns -EINVAL if called when
+  * the omap_device is already enabled, or passes along the return
+  * value of _omap_device_enable_hwmods().
   */
  int omap_device_enable(struct platform_device *pdev)
  {
                return -EINVAL;
        }
  
-       /* Enable everything if we're enabling this device from scratch */
-       if (od->_state == OMAP_DEVICE_STATE_UNKNOWN)
-               od->pm_lat_level = od->pm_lats_cnt;
-       ret = _omap_device_activate(od, IGNORE_WAKEUP_LAT);
+       ret = _omap_device_enable_hwmods(od);
  
-       od->dev_wakeup_lat = 0;
-       od->_dev_wakeup_lat_limit = UINT_MAX;
        od->_state = OMAP_DEVICE_STATE_ENABLED;
  
        return ret;
   * omap_device_idle - idle an omap_device
   * @od: struct omap_device * to idle
   *
-  * Idle omap_device @od by calling as many .deactivate_func() entries
-  * in the omap_device's pm_lats table as is possible without exceeding
-  * the device's maximum wakeup latency limit, pm_lat_limit.  Device
-  * drivers should call this function (through platform_data function
-  * pointers) where they would normally disable clocks after operations
-  * complete, etc..  Returns -EINVAL if the omap_device is not
+  * Idle omap_device @od.  Device drivers call this function indirectly
+  * via pm_runtime_put*().  Returns -EINVAL if the omap_device is not
   * currently enabled, or passes along the return value of
-  * _omap_device_deactivate().
+  * _omap_device_idle_hwmods().
   */
  int omap_device_idle(struct platform_device *pdev)
  {
                return -EINVAL;
        }
  
-       ret = _omap_device_deactivate(od, USE_WAKEUP_LAT);
+       ret = _omap_device_idle_hwmods(od);
  
        od->_state = OMAP_DEVICE_STATE_IDLE;
  
        return ret;
  }
  
- /**
-  * omap_device_shutdown - shut down an omap_device
-  * @od: struct omap_device * to shut down
-  *
-  * Shut down omap_device @od by calling all .deactivate_func() entries
-  * in the omap_device's pm_lats table and then shutting down all of
-  * the underlying omap_hwmods.  Used when a device is being "removed"
-  * or a device driver is being unloaded.  Returns -EINVAL if the
-  * omap_device is not currently enabled or idle, or passes along the
-  * return value of _omap_device_deactivate().
-  */
- int omap_device_shutdown(struct platform_device *pdev)
- {
-       int ret, i;
-       struct omap_device *od;
-       od = to_omap_device(pdev);
-       if (od->_state != OMAP_DEVICE_STATE_ENABLED &&
-           od->_state != OMAP_DEVICE_STATE_IDLE) {
-               dev_warn(&pdev->dev,
-                        "omap_device: %s() called from invalid state %d\n",
-                        __func__, od->_state);
-               return -EINVAL;
-       }
-       ret = _omap_device_deactivate(od, IGNORE_WAKEUP_LAT);
-       for (i = 0; i < od->hwmods_cnt; i++)
-               omap_hwmod_shutdown(od->hwmods[i]);
-       od->_state = OMAP_DEVICE_STATE_SHUTDOWN;
-       return ret;
- }
  /**
   * omap_device_assert_hardreset - set a device's hardreset line
   * @pdev: struct platform_device * to reset
@@@ -1060,86 -796,6 +797,6 @@@ int omap_device_deassert_hardreset(stru
        return ret;
  }
  
- /**
-  * omap_device_align_pm_lat - activate/deactivate device to match wakeup lat lim
-  * @od: struct omap_device *
-  *
-  * When a device's maximum wakeup latency limit changes, call some of
-  * the .activate_func or .deactivate_func function pointers in the
-  * omap_device's pm_lats array to ensure that the device's maximum
-  * wakeup latency is less than or equal to the new latency limit.
-  * Intended to be called by OMAP PM code whenever a device's maximum
-  * wakeup latency limit changes (e.g., via
-  * omap_pm_set_dev_wakeup_lat()).  Returns 0 if nothing needs to be
-  * done (e.g., if the omap_device is not currently idle, or if the
-  * wakeup latency is already current with the new limit) or passes
-  * along the return value of _omap_device_deactivate() or
-  * _omap_device_activate().
-  */
- int omap_device_align_pm_lat(struct platform_device *pdev,
-                            u32 new_wakeup_lat_limit)
- {
-       int ret = -EINVAL;
-       struct omap_device *od;
-       od = to_omap_device(pdev);
-       if (new_wakeup_lat_limit == od->dev_wakeup_lat)
-               return 0;
-       od->_dev_wakeup_lat_limit = new_wakeup_lat_limit;
-       if (od->_state != OMAP_DEVICE_STATE_IDLE)
-               return 0;
-       else if (new_wakeup_lat_limit > od->dev_wakeup_lat)
-               ret = _omap_device_deactivate(od, USE_WAKEUP_LAT);
-       else if (new_wakeup_lat_limit < od->dev_wakeup_lat)
-               ret = _omap_device_activate(od, USE_WAKEUP_LAT);
-       return ret;
- }
- /**
-  * omap_device_get_pwrdm - return the powerdomain * associated with @od
-  * @od: struct omap_device *
-  *
-  * Return the powerdomain associated with the first underlying
-  * omap_hwmod for this omap_device.  Intended for use by core OMAP PM
-  * code.  Returns NULL on error or a struct powerdomain * upon
-  * success.
-  */
- struct powerdomain *omap_device_get_pwrdm(struct omap_device *od)
- {
-       /*
-        * XXX Assumes that all omap_hwmod powerdomains are identical.
-        * This may not necessarily be true.  There should be a sanity
-        * check in here to WARN() if any difference appears.
-        */
-       if (!od->hwmods_cnt)
-               return NULL;
-       return omap_hwmod_get_pwrdm(od->hwmods[0]);
- }
- /**
-  * omap_device_get_mpu_rt_va - return the MPU's virtual addr for the hwmod base
-  * @od: struct omap_device *
-  *
-  * Return the MPU's virtual address for the base of the hwmod, from
-  * the ioremap() that the hwmod code does.  Only valid if there is one
-  * hwmod associated with this device.  Returns NULL if there are zero
-  * or more than one hwmods associated with this omap_device;
-  * otherwise, passes along the return value from
-  * omap_hwmod_get_mpu_rt_va().
-  */
- void __iomem *omap_device_get_rt_va(struct omap_device *od)
- {
-       if (od->hwmods_cnt != 1)
-               return NULL;
-       return omap_hwmod_get_mpu_rt_va(od->hwmods[0]);
- }
  /**
   * omap_device_get_by_hwmod_name() - convert a hwmod name to
   * device pointer.
@@@ -1174,82 -830,6 +831,6 @@@ struct device *omap_device_get_by_hwmod
  
        return &oh->od->pdev->dev;
  }
- EXPORT_SYMBOL(omap_device_get_by_hwmod_name);
- /*
-  * Public functions intended for use in omap_device_pm_latency
-  * .activate_func and .deactivate_func function pointers
-  */
- /**
-  * omap_device_enable_hwmods - call omap_hwmod_enable() on all hwmods
-  * @od: struct omap_device *od
-  *
-  * Enable all underlying hwmods.  Returns 0.
-  */
- int omap_device_enable_hwmods(struct omap_device *od)
- {
-       int i;
-       for (i = 0; i < od->hwmods_cnt; i++)
-               omap_hwmod_enable(od->hwmods[i]);
-       /* XXX pass along return value here? */
-       return 0;
- }
- /**
-  * omap_device_idle_hwmods - call omap_hwmod_idle() on all hwmods
-  * @od: struct omap_device *od
-  *
-  * Idle all underlying hwmods.  Returns 0.
-  */
- int omap_device_idle_hwmods(struct omap_device *od)
- {
-       int i;
-       for (i = 0; i < od->hwmods_cnt; i++)
-               omap_hwmod_idle(od->hwmods[i]);
-       /* XXX pass along return value here? */
-       return 0;
- }
- /**
-  * omap_device_disable_clocks - disable all main and interface clocks
-  * @od: struct omap_device *od
-  *
-  * Disable the main functional clock and interface clock for all of the
-  * omap_hwmods associated with the omap_device.  Returns 0.
-  */
- int omap_device_disable_clocks(struct omap_device *od)
- {
-       int i;
-       for (i = 0; i < od->hwmods_cnt; i++)
-               omap_hwmod_disable_clocks(od->hwmods[i]);
-       /* XXX pass along return value here? */
-       return 0;
- }
- /**
-  * omap_device_enable_clocks - enable all main and interface clocks
-  * @od: struct omap_device *od
-  *
-  * Enable the main functional clock and interface clock for all of the
-  * omap_hwmods associated with the omap_device.  Returns 0.
-  */
- int omap_device_enable_clocks(struct omap_device *od)
- {
-       int i;
-       for (i = 0; i < od->hwmods_cnt; i++)
-               omap_hwmod_enable_clocks(od->hwmods[i]);
-       /* XXX pass along return value here? */
-       return 0;
- }
  
  static struct notifier_block platform_nb = {
        .notifier_call = _omap_device_notifier_call,
@@@ -1260,7 -840,7 +841,7 @@@ static int __init omap_device_init(void
        bus_register_notifier(&platform_bus_type, &platform_nb);
        return 0;
  }
 -core_initcall(omap_device_init);
 +omap_core_initcall(omap_device_init);
  
  /**
   * omap_device_late_idle - idle devices without drivers
@@@ -1298,4 -878,4 +879,4 @@@ static int __init omap_device_late_init
        bus_for_each_dev(&platform_bus_type, NULL, NULL, omap_device_late_idle);
        return 0;
  }
 -late_initcall(omap_device_late_init);
 +omap_late_initcall(omap_device_late_init);
  #include <linux/slab.h>
  #include <linux/bootmem.h>
  
+ #include <asm/system_misc.h>
  #include "clock.h"
  #include "omap_hwmod.h"
  
@@@ -2134,6 -2136,8 +2136,8 @@@ static int _enable(struct omap_hwmod *o
        _enable_clocks(oh);
        if (soc_ops.enable_module)
                soc_ops.enable_module(oh);
+       if (oh->flags & HWMOD_BLOCK_WFI)
+               disable_hlt();
  
        if (soc_ops.update_context_lost)
                soc_ops.update_context_lost(oh);
@@@ -2195,6 -2199,8 +2199,8 @@@ static int _idle(struct omap_hwmod *oh
                _idle_sysc(oh);
        _del_initiator_dep(oh, mpu_oh);
  
+       if (oh->flags & HWMOD_BLOCK_WFI)
+               enable_hlt();
        if (soc_ops.disable_module)
                soc_ops.disable_module(oh);
  
@@@ -2303,6 -2309,8 +2309,8 @@@ static int _shutdown(struct omap_hwmod 
        if (oh->_state == _HWMOD_STATE_ENABLED) {
                _del_initiator_dep(oh, mpu_oh);
                /* XXX what about the other system initiators here? dma, dsp */
+               if (oh->flags & HWMOD_BLOCK_WFI)
+                       enable_hlt();
                if (soc_ops.disable_module)
                        soc_ops.disable_module(oh);
                _disable_clocks(oh);
@@@ -3303,7 -3311,7 +3311,7 @@@ static int __init omap_hwmod_setup_all(
  
        return 0;
  }
 -core_initcall(omap_hwmod_setup_all);
 +omap_core_initcall(omap_hwmod_setup_all);
  
  /**
   * omap_hwmod_enable - enable an omap_hwmod
@@@ -616,7 -616,7 +616,7 @@@ static struct omap_hwmod omap44xx_dmic_
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_dmic_irqs,
        .sdma_reqs      = omap44xx_dmic_sdma_reqs,
-       .main_clk       = "dmic_fck",
+       .main_clk       = "func_dmic_abe_gfclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_DMIC_CLKCTRL_OFFSET,
@@@ -1161,7 -1161,7 +1161,7 @@@ static struct omap_hwmod omap44xx_gpio1
        .class          = &omap44xx_gpio_hwmod_class,
        .clkdm_name     = "l4_wkup_clkdm",
        .mpu_irqs       = omap44xx_gpio1_irqs,
-       .main_clk       = "gpio1_ick",
+       .main_clk       = "l4_wkup_clk_mux_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_WKUP_GPIO1_CLKCTRL_OFFSET,
@@@ -1190,7 -1190,7 +1190,7 @@@ static struct omap_hwmod omap44xx_gpio2
        .clkdm_name     = "l4_per_clkdm",
        .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
        .mpu_irqs       = omap44xx_gpio2_irqs,
-       .main_clk       = "gpio2_ick",
+       .main_clk       = "l4_div_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_GPIO2_CLKCTRL_OFFSET,
@@@ -1219,7 -1219,7 +1219,7 @@@ static struct omap_hwmod omap44xx_gpio3
        .clkdm_name     = "l4_per_clkdm",
        .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
        .mpu_irqs       = omap44xx_gpio3_irqs,
-       .main_clk       = "gpio3_ick",
+       .main_clk       = "l4_div_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_GPIO3_CLKCTRL_OFFSET,
@@@ -1248,7 -1248,7 +1248,7 @@@ static struct omap_hwmod omap44xx_gpio4
        .clkdm_name     = "l4_per_clkdm",
        .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
        .mpu_irqs       = omap44xx_gpio4_irqs,
-       .main_clk       = "gpio4_ick",
+       .main_clk       = "l4_div_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_GPIO4_CLKCTRL_OFFSET,
@@@ -1277,7 -1277,7 +1277,7 @@@ static struct omap_hwmod omap44xx_gpio5
        .clkdm_name     = "l4_per_clkdm",
        .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
        .mpu_irqs       = omap44xx_gpio5_irqs,
-       .main_clk       = "gpio5_ick",
+       .main_clk       = "l4_div_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_GPIO5_CLKCTRL_OFFSET,
@@@ -1306,7 -1306,7 +1306,7 @@@ static struct omap_hwmod omap44xx_gpio6
        .clkdm_name     = "l4_per_clkdm",
        .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
        .mpu_irqs       = omap44xx_gpio6_irqs,
-       .main_clk       = "gpio6_ick",
+       .main_clk       = "l4_div_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_GPIO6_CLKCTRL_OFFSET,
@@@ -1405,7 -1405,7 +1405,7 @@@ static struct omap_hwmod omap44xx_gpu_h
        .class          = &omap44xx_gpu_hwmod_class,
        .clkdm_name     = "l3_gfx_clkdm",
        .mpu_irqs       = omap44xx_gpu_irqs,
-       .main_clk       = "gpu_fck",
+       .main_clk       = "sgx_clk_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_GFX_GFX_CLKCTRL_OFFSET,
@@@ -1446,7 -1446,7 +1446,7 @@@ static struct omap_hwmod omap44xx_hdq1w
        .clkdm_name     = "l4_per_clkdm",
        .flags          = HWMOD_INIT_NO_RESET, /* XXX temporary */
        .mpu_irqs       = omap44xx_hdq1w_irqs,
-       .main_clk       = "hdq1w_fck",
+       .main_clk       = "func_12m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_HDQ1W_CLKCTRL_OFFSET,
@@@ -1550,7 -1550,7 +1550,7 @@@ static struct omap_hwmod omap44xx_i2c1_
        .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
        .mpu_irqs       = omap44xx_i2c1_irqs,
        .sdma_reqs      = omap44xx_i2c1_sdma_reqs,
-       .main_clk       = "i2c1_fck",
+       .main_clk       = "func_96m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_I2C1_CLKCTRL_OFFSET,
@@@ -1580,7 -1580,7 +1580,7 @@@ static struct omap_hwmod omap44xx_i2c2_
        .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
        .mpu_irqs       = omap44xx_i2c2_irqs,
        .sdma_reqs      = omap44xx_i2c2_sdma_reqs,
-       .main_clk       = "i2c2_fck",
+       .main_clk       = "func_96m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_I2C2_CLKCTRL_OFFSET,
@@@ -1610,7 -1610,7 +1610,7 @@@ static struct omap_hwmod omap44xx_i2c3_
        .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
        .mpu_irqs       = omap44xx_i2c3_irqs,
        .sdma_reqs      = omap44xx_i2c3_sdma_reqs,
-       .main_clk       = "i2c3_fck",
+       .main_clk       = "func_96m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_I2C3_CLKCTRL_OFFSET,
@@@ -1640,7 -1640,7 +1640,7 @@@ static struct omap_hwmod omap44xx_i2c4_
        .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
        .mpu_irqs       = omap44xx_i2c4_irqs,
        .sdma_reqs      = omap44xx_i2c4_sdma_reqs,
-       .main_clk       = "i2c4_fck",
+       .main_clk       = "func_96m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_I2C4_CLKCTRL_OFFSET,
@@@ -1743,7 -1743,7 +1743,7 @@@ static struct omap_hwmod omap44xx_iss_h
        .clkdm_name     = "iss_clkdm",
        .mpu_irqs       = omap44xx_iss_irqs,
        .sdma_reqs      = omap44xx_iss_sdma_reqs,
-       .main_clk       = "iss_fck",
+       .main_clk       = "ducati_clk_mux_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_CAM_ISS_CLKCTRL_OFFSET,
@@@ -1785,7 -1785,7 +1785,7 @@@ static struct omap_hwmod omap44xx_iva_h
        .mpu_irqs       = omap44xx_iva_irqs,
        .rst_lines      = omap44xx_iva_resets,
        .rst_lines_cnt  = ARRAY_SIZE(omap44xx_iva_resets),
-       .main_clk       = "iva_fck",
+       .main_clk       = "dpll_iva_m5x2_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_IVAHD_IVAHD_CLKCTRL_OFFSET,
@@@ -1829,7 -1829,7 +1829,7 @@@ static struct omap_hwmod omap44xx_kbd_h
        .class          = &omap44xx_kbd_hwmod_class,
        .clkdm_name     = "l4_wkup_clkdm",
        .mpu_irqs       = omap44xx_kbd_irqs,
-       .main_clk       = "kbd_fck",
+       .main_clk       = "sys_32k_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_WKUP_KEYBOARD_CLKCTRL_OFFSET,
@@@ -1920,7 -1920,7 +1920,7 @@@ static struct omap_hwmod omap44xx_mcasp
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_mcasp_irqs,
        .sdma_reqs      = omap44xx_mcasp_sdma_reqs,
-       .main_clk       = "mcasp_fck",
+       .main_clk       = "func_mcasp_abe_gfclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_MCASP_CLKCTRL_OFFSET,
@@@ -1972,7 -1972,7 +1972,7 @@@ static struct omap_hwmod omap44xx_mcbsp
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_mcbsp1_irqs,
        .sdma_reqs      = omap44xx_mcbsp1_sdma_reqs,
-       .main_clk       = "mcbsp1_fck",
+       .main_clk       = "func_mcbsp1_gfclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_MCBSP1_CLKCTRL_OFFSET,
@@@ -2007,7 -2007,7 +2007,7 @@@ static struct omap_hwmod omap44xx_mcbsp
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_mcbsp2_irqs,
        .sdma_reqs      = omap44xx_mcbsp2_sdma_reqs,
-       .main_clk       = "mcbsp2_fck",
+       .main_clk       = "func_mcbsp2_gfclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_MCBSP2_CLKCTRL_OFFSET,
@@@ -2042,7 -2042,7 +2042,7 @@@ static struct omap_hwmod omap44xx_mcbsp
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_mcbsp3_irqs,
        .sdma_reqs      = omap44xx_mcbsp3_sdma_reqs,
-       .main_clk       = "mcbsp3_fck",
+       .main_clk       = "func_mcbsp3_gfclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_MCBSP3_CLKCTRL_OFFSET,
@@@ -2077,7 -2077,7 +2077,7 @@@ static struct omap_hwmod omap44xx_mcbsp
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_mcbsp4_irqs,
        .sdma_reqs      = omap44xx_mcbsp4_sdma_reqs,
-       .main_clk       = "mcbsp4_fck",
+       .main_clk       = "per_mcbsp4_gfclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_MCBSP4_CLKCTRL_OFFSET,
@@@ -2140,7 -2140,7 +2140,7 @@@ static struct omap_hwmod omap44xx_mcpdm
        .flags          = HWMOD_EXT_OPT_MAIN_CLK | HWMOD_SWSUP_SIDLE,
        .mpu_irqs       = omap44xx_mcpdm_irqs,
        .sdma_reqs      = omap44xx_mcpdm_sdma_reqs,
-       .main_clk       = "mcpdm_fck",
+       .main_clk       = "pad_clks_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_PDM_CLKCTRL_OFFSET,
@@@ -2201,7 -2201,7 +2201,7 @@@ static struct omap_hwmod omap44xx_mcspi
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_mcspi1_irqs,
        .sdma_reqs      = omap44xx_mcspi1_sdma_reqs,
-       .main_clk       = "mcspi1_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_MCSPI1_CLKCTRL_OFFSET,
@@@ -2237,7 -2237,7 +2237,7 @@@ static struct omap_hwmod omap44xx_mcspi
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_mcspi2_irqs,
        .sdma_reqs      = omap44xx_mcspi2_sdma_reqs,
-       .main_clk       = "mcspi2_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_MCSPI2_CLKCTRL_OFFSET,
@@@ -2273,7 -2273,7 +2273,7 @@@ static struct omap_hwmod omap44xx_mcspi
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_mcspi3_irqs,
        .sdma_reqs      = omap44xx_mcspi3_sdma_reqs,
-       .main_clk       = "mcspi3_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_MCSPI3_CLKCTRL_OFFSET,
@@@ -2307,7 -2307,7 +2307,7 @@@ static struct omap_hwmod omap44xx_mcspi
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_mcspi4_irqs,
        .sdma_reqs      = omap44xx_mcspi4_sdma_reqs,
-       .main_clk       = "mcspi4_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_MCSPI4_CLKCTRL_OFFSET,
@@@ -2363,7 -2363,7 +2363,7 @@@ static struct omap_hwmod omap44xx_mmc1_
        .clkdm_name     = "l3_init_clkdm",
        .mpu_irqs       = omap44xx_mmc1_irqs,
        .sdma_reqs      = omap44xx_mmc1_sdma_reqs,
-       .main_clk       = "mmc1_fck",
+       .main_clk       = "hsmmc1_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L3INIT_MMC1_CLKCTRL_OFFSET,
@@@ -2392,7 -2392,7 +2392,7 @@@ static struct omap_hwmod omap44xx_mmc2_
        .clkdm_name     = "l3_init_clkdm",
        .mpu_irqs       = omap44xx_mmc2_irqs,
        .sdma_reqs      = omap44xx_mmc2_sdma_reqs,
-       .main_clk       = "mmc2_fck",
+       .main_clk       = "hsmmc2_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L3INIT_MMC2_CLKCTRL_OFFSET,
@@@ -2420,7 -2420,7 +2420,7 @@@ static struct omap_hwmod omap44xx_mmc3_
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_mmc3_irqs,
        .sdma_reqs      = omap44xx_mmc3_sdma_reqs,
-       .main_clk       = "mmc3_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_MMCSD3_CLKCTRL_OFFSET,
@@@ -2448,7 -2448,7 +2448,7 @@@ static struct omap_hwmod omap44xx_mmc4_
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_mmc4_irqs,
        .sdma_reqs      = omap44xx_mmc4_sdma_reqs,
-       .main_clk       = "mmc4_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_MMCSD4_CLKCTRL_OFFSET,
@@@ -2476,7 -2476,7 +2476,7 @@@ static struct omap_hwmod omap44xx_mmc5_
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_mmc5_irqs,
        .sdma_reqs      = omap44xx_mmc5_sdma_reqs,
-       .main_clk       = "mmc5_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_MMCSD5_CLKCTRL_OFFSET,
@@@ -2702,6 -2702,13 +2702,6 @@@ static struct resource omap44xx_usb_phy
                .end            = 0x4a0ae000,
                .flags          = IORESOURCE_MEM,
        },
 -      {
 -              /* XXX: Remove this once control module driver is in place */
 -              .name           = "ctrl_dev",
 -              .start          = 0x4a002300,
 -              .end            = 0x4a002303,
 -              .flags          = IORESOURCE_MEM,
 -      },
        { }
  };
  
@@@ -2718,7 -2725,7 +2718,7 @@@ static struct omap_hwmod omap44xx_ocp2s
        .name           = "ocp2scp_usb_phy",
        .class          = &omap44xx_ocp2scp_hwmod_class,
        .clkdm_name     = "l3_init_clkdm",
-       .main_clk       = "ocp2scp_usb_phy_phy_48m",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL_OFFSET,
@@@ -3155,7 -3162,7 +3155,7 @@@ static struct omap_hwmod omap44xx_timer
        .clkdm_name     = "l4_wkup_clkdm",
        .flags          = HWMOD_SET_DEFAULT_CLOCKACT,
        .mpu_irqs       = omap44xx_timer1_irqs,
-       .main_clk       = "timer1_fck",
+       .main_clk       = "dmt1_clk_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_WKUP_TIMER1_CLKCTRL_OFFSET,
@@@ -3178,7 -3185,7 +3178,7 @@@ static struct omap_hwmod omap44xx_timer
        .clkdm_name     = "l4_per_clkdm",
        .flags          = HWMOD_SET_DEFAULT_CLOCKACT,
        .mpu_irqs       = omap44xx_timer2_irqs,
-       .main_clk       = "timer2_fck",
+       .main_clk       = "cm2_dm2_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER2_CLKCTRL_OFFSET,
@@@ -3199,7 -3206,7 +3199,7 @@@ static struct omap_hwmod omap44xx_timer
        .class          = &omap44xx_timer_hwmod_class,
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_timer3_irqs,
-       .main_clk       = "timer3_fck",
+       .main_clk       = "cm2_dm3_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER3_CLKCTRL_OFFSET,
@@@ -3220,7 -3227,7 +3220,7 @@@ static struct omap_hwmod omap44xx_timer
        .class          = &omap44xx_timer_hwmod_class,
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_timer4_irqs,
-       .main_clk       = "timer4_fck",
+       .main_clk       = "cm2_dm4_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER4_CLKCTRL_OFFSET,
@@@ -3241,7 -3248,7 +3241,7 @@@ static struct omap_hwmod omap44xx_timer
        .class          = &omap44xx_timer_hwmod_class,
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_timer5_irqs,
-       .main_clk       = "timer5_fck",
+       .main_clk       = "timer5_sync_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_TIMER5_CLKCTRL_OFFSET,
@@@ -3263,8 -3270,7 +3263,7 @@@ static struct omap_hwmod omap44xx_timer
        .class          = &omap44xx_timer_hwmod_class,
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_timer6_irqs,
-       .main_clk       = "timer6_fck",
+       .main_clk       = "timer6_sync_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_TIMER6_CLKCTRL_OFFSET,
@@@ -3286,7 -3292,7 +3285,7 @@@ static struct omap_hwmod omap44xx_timer
        .class          = &omap44xx_timer_hwmod_class,
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_timer7_irqs,
-       .main_clk       = "timer7_fck",
+       .main_clk       = "timer7_sync_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_TIMER7_CLKCTRL_OFFSET,
@@@ -3308,7 -3314,7 +3307,7 @@@ static struct omap_hwmod omap44xx_timer
        .class          = &omap44xx_timer_hwmod_class,
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_timer8_irqs,
-       .main_clk       = "timer8_fck",
+       .main_clk       = "timer8_sync_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_TIMER8_CLKCTRL_OFFSET,
@@@ -3330,7 -3336,7 +3329,7 @@@ static struct omap_hwmod omap44xx_timer
        .class          = &omap44xx_timer_hwmod_class,
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_timer9_irqs,
-       .main_clk       = "timer9_fck",
+       .main_clk       = "cm2_dm9_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER9_CLKCTRL_OFFSET,
@@@ -3353,7 -3359,7 +3352,7 @@@ static struct omap_hwmod omap44xx_timer
        .clkdm_name     = "l4_per_clkdm",
        .flags          = HWMOD_SET_DEFAULT_CLOCKACT,
        .mpu_irqs       = omap44xx_timer10_irqs,
-       .main_clk       = "timer10_fck",
+       .main_clk       = "cm2_dm10_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET,
@@@ -3375,7 -3381,7 +3374,7 @@@ static struct omap_hwmod omap44xx_timer
        .class          = &omap44xx_timer_hwmod_class,
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_timer11_irqs,
-       .main_clk       = "timer11_fck",
+       .main_clk       = "cm2_dm11_mux",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER11_CLKCTRL_OFFSET,
@@@ -3426,7 -3432,7 +3425,7 @@@ static struct omap_hwmod omap44xx_uart1
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_uart1_irqs,
        .sdma_reqs      = omap44xx_uart1_sdma_reqs,
-       .main_clk       = "uart1_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_UART1_CLKCTRL_OFFSET,
@@@ -3454,7 -3460,7 +3453,7 @@@ static struct omap_hwmod omap44xx_uart2
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_uart2_irqs,
        .sdma_reqs      = omap44xx_uart2_sdma_reqs,
-       .main_clk       = "uart2_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_UART2_CLKCTRL_OFFSET,
@@@ -3483,7 -3489,7 +3482,7 @@@ static struct omap_hwmod omap44xx_uart3
        .flags          = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET,
        .mpu_irqs       = omap44xx_uart3_irqs,
        .sdma_reqs      = omap44xx_uart3_sdma_reqs,
-       .main_clk       = "uart3_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_UART3_CLKCTRL_OFFSET,
@@@ -3511,7 -3517,7 +3510,7 @@@ static struct omap_hwmod omap44xx_uart4
        .clkdm_name     = "l4_per_clkdm",
        .mpu_irqs       = omap44xx_uart4_irqs,
        .sdma_reqs      = omap44xx_uart4_sdma_reqs,
-       .main_clk       = "uart4_fck",
+       .main_clk       = "func_48m_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_L4PER_UART4_CLKCTRL_OFFSET,
@@@ -3790,7 -3796,7 +3789,7 @@@ static struct omap_hwmod omap44xx_wd_ti
        .class          = &omap44xx_wd_timer_hwmod_class,
        .clkdm_name     = "l4_wkup_clkdm",
        .mpu_irqs       = omap44xx_wd_timer2_irqs,
-       .main_clk       = "wd_timer2_fck",
+       .main_clk       = "sys_32k_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM_WKUP_WDT2_CLKCTRL_OFFSET,
@@@ -3811,7 -3817,7 +3810,7 @@@ static struct omap_hwmod omap44xx_wd_ti
        .class          = &omap44xx_wd_timer_hwmod_class,
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_wd_timer3_irqs,
-       .main_clk       = "wd_timer3_fck",
+       .main_clk       = "sys_32k_ck",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_WDT3_CLKCTRL_OFFSET,
@@@ -6149,6 -6155,12 +6148,6 @@@ static struct omap_hwmod_addr_space oma
                .pa_end         = 0x4a0ab7ff,
                .flags          = ADDR_TYPE_RT
        },
 -      {
 -              /* XXX: Remove this once control module driver is in place */
 -              .pa_start       = 0x4a00233c,
 -              .pa_end         = 0x4a00233f,
 -              .flags          = ADDR_TYPE_RT
 -      },
        { }
  };
  
@@@ -83,10 -83,8 +83,8 @@@ static int clkdm_dbg_show_counter(struc
                strncmp(clkdm->name, "dpll", 4) == 0)
                return 0;
  
-       seq_printf(s, "%s->%s (%d)", clkdm->name,
-                       clkdm->pwrdm.ptr->name,
-                       atomic_read(&clkdm->usecount));
-       seq_printf(s, "\n");
+       seq_printf(s, "%s->%s (%d)\n", clkdm->name, clkdm->pwrdm.ptr->name,
+                  clkdm->usecount);
  
        return 0;
  }
@@@ -279,6 -277,6 +277,6 @@@ static int __init pm_dbg_init(void
  
        return 0;
  }
 -arch_initcall(pm_dbg_init);
 +omap_arch_initcall(pm_dbg_init);
  
  #endif
diff --combined arch/arm/mach-omap2/pm.c
@@@ -32,8 -32,6 +32,6 @@@
  #include "pm.h"
  #include "twl-common.h"
  
- static struct omap_device_pm_latency *pm_lats;
  /*
   * omap_pm_suspend: points to a function that does the SoC-specific
   * suspend work
@@@ -82,7 -80,7 +80,7 @@@ static int __init _init_omap_device(cha
                 __func__, name))
                return -ENODEV;
  
-       pdev = omap_device_build(oh->name, 0, oh, NULL, 0, pm_lats, 0, false);
+       pdev = omap_device_build(oh->name, 0, oh, NULL, 0);
        if (WARN(IS_ERR(pdev), "%s: could not build omap_device for %s\n",
                 __func__, name))
                return -ENODEV;
@@@ -108,79 -106,18 +106,18 @@@ static void __init omap2_init_processor
        }
  }
  
- /* Types of sleep_switch used in omap_set_pwrdm_state */
- #define FORCEWAKEUP_SWITCH    0
- #define LOWPOWERSTATE_SWITCH  1
  int __init omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused)
  {
+       /* XXX The usecount test is racy */
        if ((clkdm->flags & CLKDM_CAN_ENABLE_AUTO) &&
            !(clkdm->flags & CLKDM_MISSING_IDLE_REPORTING))
                clkdm_allow_idle(clkdm);
        else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
-                atomic_read(&clkdm->usecount) == 0)
+                clkdm->usecount == 0)
                clkdm_sleep(clkdm);
        return 0;
  }
  
- /*
-  * This sets pwrdm state (other than mpu & core. Currently only ON &
-  * RET are supported.
-  */
- int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 pwrst)
- {
-       u8 curr_pwrst, next_pwrst;
-       int sleep_switch = -1, ret = 0, hwsup = 0;
-       if (!pwrdm || IS_ERR(pwrdm))
-               return -EINVAL;
-       while (!(pwrdm->pwrsts & (1 << pwrst))) {
-               if (pwrst == PWRDM_POWER_OFF)
-                       return ret;
-               pwrst--;
-       }
-       next_pwrst = pwrdm_read_next_pwrst(pwrdm);
-       if (next_pwrst == pwrst)
-               return ret;
-       curr_pwrst = pwrdm_read_pwrst(pwrdm);
-       if (curr_pwrst < PWRDM_POWER_ON) {
-               if ((curr_pwrst > pwrst) &&
-                       (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) {
-                       sleep_switch = LOWPOWERSTATE_SWITCH;
-               } else {
-                       hwsup = clkdm_in_hwsup(pwrdm->pwrdm_clkdms[0]);
-                       clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
-                       sleep_switch = FORCEWAKEUP_SWITCH;
-               }
-       }
-       ret = pwrdm_set_next_pwrst(pwrdm, pwrst);
-       if (ret)
-               pr_err("%s: unable to set power state of powerdomain: %s\n",
-                      __func__, pwrdm->name);
-       switch (sleep_switch) {
-       case FORCEWAKEUP_SWITCH:
-               if (hwsup)
-                       clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
-               else
-                       clkdm_sleep(pwrdm->pwrdm_clkdms[0]);
-               break;
-       case LOWPOWERSTATE_SWITCH:
-               pwrdm_set_lowpwrstchange(pwrdm);
-               pwrdm_wait_transition(pwrdm);
-               pwrdm_state_switch(pwrdm);
-               break;
-       }
-       return ret;
- }
  /*
   * This API is to be called during init to set the various voltage
   * domains to the voltage as per the opp table. Typically we boot up
@@@ -336,7 -273,7 +273,7 @@@ static int __init omap2_common_pm_init(
  
        return 0;
  }
 -postcore_initcall(omap2_common_pm_init);
 +omap_postcore_initcall(omap2_common_pm_init);
  
  int __init omap2_common_pm_late_init(void)
  {
@@@ -48,8 -48,7 +48,7 @@@ static int __init omap2_init_pmu(unsign
                }
        }
  
-       omap_pmu_dev = omap_device_build_ss(dev_name, -1, oh, oh_num, NULL, 0,
-                                           NULL, 0, 0);
+       omap_pmu_dev = omap_device_build_ss(dev_name, -1, oh, oh_num, NULL, 0);
        WARN(IS_ERR(omap_pmu_dev), "Can't build omap_device for %s.\n",
             dev_name);
  
@@@ -89,4 -88,4 +88,4 @@@ static int __init omap_init_pmu(void
  
        return omap2_init_pmu(oh_num, oh_names);
  }
 -subsys_initcall(omap_init_pmu);
 +omap_subsys_initcall(omap_init_pmu);
@@@ -254,7 -254,7 +254,7 @@@ static int __init omap_serial_early_ini
  
        return 0;
  }
 -core_initcall(omap_serial_early_init);
 +omap_core_initcall(omap_serial_early_init);
  
  /**
   * omap_serial_init_port() - initialize single serial port
@@@ -316,8 -316,7 +316,7 @@@ void __init omap_serial_init_port(struc
        if (WARN_ON(!oh))
                return;
  
-       pdev = omap_device_build(name, uart->num, oh, pdata, pdata_size,
-                                NULL, 0, false);
+       pdev = omap_device_build(name, uart->num, oh, pdata, pdata_size);
        if (IS_ERR(pdev)) {
                WARN(1, "Could not build omap_device for %s: %s.\n", name,
                     oh->name);
@@@ -227,7 -227,7 +227,7 @@@ static int __init omap_dm_timer_init_on
        int r = 0;
  
        if (of_have_populated_dt()) {
 -              np = omap_get_timer_dt(omap_timer_match, NULL);
 +              np = omap_get_timer_dt(omap_timer_match, property);
                if (!np)
                        return -ENODEV;
  
@@@ -683,8 -683,7 +683,7 @@@ static int __init omap_timer_init(struc
        pdata->timer_errata = omap_dm_timer_get_errata();
        pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count;
  
-       pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata),
-                                NULL, 0, 0);
+       pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata));
  
        if (IS_ERR(pdev)) {
                pr_err("%s: Can't build omap_device for %s: %s.\n",
@@@ -719,7 -718,7 +718,7 @@@ static int __init omap2_dm_timer_init(v
  
        return 0;
  }
 -arch_initcall(omap2_dm_timer_init);
 +omap_arch_initcall(omap2_dm_timer_init);
  
  /**
   * omap2_override_clocksource - clocksource override with user configuration
@@@ -85,9 -85,6 +85,9 @@@ void __init usb_musb_init(struct omap_m
        musb_plat.mode = board_data->mode;
        musb_plat.extvbus = board_data->extvbus;
  
 +      if (cpu_is_omap44xx())
 +              musb_plat.has_mailbox = true;
 +
        if (soc_is_am35xx()) {
                oh_name = "am35x_otg_hs";
                name = "musb-am35x";
                  return;
  
        pdev = omap_device_build(name, bus_id, oh, &musb_plat,
-                              sizeof(musb_plat), NULL, 0, false);
+                                sizeof(musb_plat));
        if (IS_ERR(pdev)) {
                pr_err("Could not build omap_device for %s %s\n",
                                                name, oh_name);
@@@ -124,10 -124,9 +124,9 @@@ static int __init omap_init_wdt(void
        pdata.read_reset_sources = prm_read_reset_sources;
  
        pdev = omap_device_build(dev_name, id, oh, &pdata,
-                                sizeof(struct omap_wd_timer_platform_data),
-                                NULL, 0, 0);
+                                sizeof(struct omap_wd_timer_platform_data));
        WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n",
             dev_name, oh->name);
        return 0;
  }
 -subsys_initcall(omap_init_wdt);
 +omap_subsys_initcall(omap_init_wdt);
@@@ -17,12 -17,17 +17,15 @@@ void arch_decomp_setup(void
  {
  }
  
 -#define arch_decomp_wdog()
 -
  static __inline__ void putc(char c)
  {
        /*
         * during kernel decompression, all mappings are flat:
         *  virt_addr == phys_addr
         */
+       if (!SIRFSOC_UART1_PA_BASE)
+               return;
        while (__raw_readl((void __iomem *)SIRFSOC_UART1_PA_BASE + SIRFSOC_UART_TXFIFO_STATUS)
                & SIRFSOC_UART1_TXFIFO_FULL)
                barrier();
@@@ -15,10 -15,17 +15,10 @@@ obj-$(CONFIG_ARCH_EMEV2)   += setup-emev2
  # SMP objects
  smp-y                         := platsmp.o headsmp.o
  smp-$(CONFIG_HOTPLUG_CPU)     += hotplug.o
- smp-$(CONFIG_ARCH_SH73A0)     += smp-sh73a0.o
+ smp-$(CONFIG_ARCH_SH73A0)     += smp-sh73a0.o headsmp-sh73a0.o
  smp-$(CONFIG_ARCH_R8A7779)    += smp-r8a7779.o
  smp-$(CONFIG_ARCH_EMEV2)      += smp-emev2.o
  
 -# Pinmux setup
 -pfc-y                         :=
 -pfc-$(CONFIG_ARCH_SH7372)     += pfc-sh7372.o
 -pfc-$(CONFIG_ARCH_SH73A0)     += pfc-sh73a0.o
 -pfc-$(CONFIG_ARCH_R8A7740)    += pfc-r8a7740.o
 -pfc-$(CONFIG_ARCH_R8A7779)    += pfc-r8a7779.o
 -
  # IRQ objects
  obj-$(CONFIG_ARCH_SH7372)     += entry-intc.o
  obj-$(CONFIG_ARCH_R8A7740)    += entry-intc.o
@@@ -30,6 -37,7 +30,7 @@@ obj-$(CONFIG_ARCH_SHMOBILE)   += pm-rmobi
  obj-$(CONFIG_ARCH_SH7372)     += pm-sh7372.o sleep-sh7372.o
  obj-$(CONFIG_ARCH_R8A7740)    += pm-r8a7740.o
  obj-$(CONFIG_ARCH_R8A7779)    += pm-r8a7779.o
+ obj-$(CONFIG_ARCH_SH73A0)     += pm-sh73a0.o
  
  # Board objects
  obj-$(CONFIG_MACH_AP4EVB)     += board-ap4evb.o
@@@ -44,3 -52,4 +45,3 @@@ obj-$(CONFIG_MACH_KZM9G)      += board-kzm9g
  
  # Framework support
  obj-$(CONFIG_SMP)             += $(smp-y)
 -obj-$(CONFIG_GENERIC_GPIO)    += $(pfc-y)
@@@ -806,21 -806,21 +806,21 @@@ static struct platform_device fsi_devic
  };
  
  /* FSI-WM8978 */
 -static struct asoc_simple_dai_init_info fsi_wm8978_init_info = {
 -      .fmt            = SND_SOC_DAIFMT_I2S,
 -      .codec_daifmt   = SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_NB_NF,
 -      .cpu_daifmt     = SND_SOC_DAIFMT_CBS_CFS,
 -      .sysclk         = 12288000,
 -};
 -
  static struct asoc_simple_card_info fsi_wm8978_info = {
        .name           = "wm8978",
        .card           = "FSI2A-WM8978",
 -      .cpu_dai        = "fsia-dai",
        .codec          = "wm8978.0-001a",
        .platform       = "sh_fsi2",
 -      .codec_dai      = "wm8978-hifi",
 -      .init           = &fsi_wm8978_init_info,
 +      .daifmt         = SND_SOC_DAIFMT_I2S,
 +      .cpu_dai = {
 +              .name   = "fsia-dai",
 +              .fmt    = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_IB_NF,
 +      },
 +      .codec_dai = {
 +              .name   = "wm8978-hifi",
 +              .fmt    = SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_NB_NF,
 +              .sysclk = 12288000,
 +      },
  };
  
  static struct platform_device fsi_wm8978_device = {
  };
  
  /* FSI-HDMI */
 -static struct asoc_simple_dai_init_info fsi2_hdmi_init_info = {
 -      .cpu_daifmt     = SND_SOC_DAIFMT_CBM_CFM,
 -};
 -
  static struct asoc_simple_card_info fsi2_hdmi_info = {
        .name           = "HDMI",
        .card           = "FSI2B-HDMI",
 -      .cpu_dai        = "fsib-dai",
        .codec          = "sh-mobile-hdmi",
        .platform       = "sh_fsi2",
 -      .codec_dai      = "sh_mobile_hdmi-hifi",
 -      .init           = &fsi2_hdmi_init_info,
 +      .cpu_dai = {
 +              .name   = "fsib-dai",
 +              .fmt    = SND_SOC_DAIFMT_CBM_CFM,
 +      },
 +      .codec_dai = {
 +              .name = "sh_mobile_hdmi-hifi",
 +      },
  };
  
  static struct platform_device fsi_hdmi_device = {
@@@ -1181,6 -1181,8 +1181,8 @@@ static void __init eva_init(void
        rmobile_add_device_to_domain("A4LC", &hdmi_lcdc_device);
        if (usb)
                rmobile_add_device_to_domain("A3SP", usb);
+       r8a7740_pm_init();
  }
  
  static void __init eva_earlytimer_init(void)
@@@ -525,21 -525,21 +525,21 @@@ static struct platform_device fsi_devic
        },
  };
  
 -static struct asoc_simple_dai_init_info fsi2_ak4648_init_info = {
 -      .fmt            = SND_SOC_DAIFMT_LEFT_J,
 -      .codec_daifmt   = SND_SOC_DAIFMT_CBM_CFM,
 -      .cpu_daifmt     = SND_SOC_DAIFMT_CBS_CFS,
 -      .sysclk         = 11289600,
 -};
 -
  static struct asoc_simple_card_info fsi2_ak4648_info = {
        .name           = "AK4648",
        .card           = "FSI2A-AK4648",
 -      .cpu_dai        = "fsia-dai",
        .codec          = "ak4642-codec.0-0012",
        .platform       = "sh_fsi2",
 -      .codec_dai      = "ak4642-hifi",
 -      .init           = &fsi2_ak4648_init_info,
 +      .daifmt         = SND_SOC_DAIFMT_LEFT_J,
 +      .cpu_dai = {
 +              .name   = "fsia-dai",
 +              .fmt    = SND_SOC_DAIFMT_CBS_CFS,
 +      },
 +      .codec_dai = {
 +              .name   = "ak4642-hifi",
 +              .fmt    = SND_SOC_DAIFMT_CBM_CFM,
 +              .sysclk = 11289600,
 +      },
  };
  
  static struct platform_device fsi_ak4648_device = {
@@@ -772,6 -772,8 +772,8 @@@ static void __init kzm_init(void
  
        sh73a0_add_standard_devices();
        platform_add_devices(kzm_devices, ARRAY_SIZE(kzm_devices));
+       sh73a0_pm_init();
  }
  
  static void kzm9g_restart(char mode, const char *cmd)
@@@ -27,7 -27,6 +27,6 @@@
  #include <linux/serial_sci.h>
  #include <linux/sh_dma.h>
  #include <linux/sh_timer.h>
- #include <linux/dma-mapping.h>
  #include <mach/dma-register.h>
  #include <mach/r8a7740.h>
  #include <mach/pm-rmobile.h>
@@@ -68,32 -67,6 +67,32 @@@ void __init r8a7740_map_io(void
        iotable_init(r8a7740_io_desc, ARRAY_SIZE(r8a7740_io_desc));
  }
  
 +/* PFC */
 +static struct resource r8a7740_pfc_resources[] = {
 +      [0] = {
 +              .start  = 0xe6050000,
 +              .end    = 0xe6057fff,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +      [1] = {
 +              .start  = 0xe605800c,
 +              .end    = 0xe605802b,
 +              .flags  = IORESOURCE_MEM,
 +      }
 +};
 +
 +static struct platform_device r8a7740_pfc_device = {
 +      .name           = "pfc-r8a7740",
 +      .id             = -1,
 +      .resource       = r8a7740_pfc_resources,
 +      .num_resources  = ARRAY_SIZE(r8a7740_pfc_resources),
 +};
 +
 +void __init r8a7740_pinmux_init(void)
 +{
 +      platform_device_register(&r8a7740_pfc_device);
 +}
 +
  /* SCIFA0 */
  static struct plat_sci_port scif0_platform_data = {
        .mapbase        = 0xe6c40000,
@@@ -288,6 -261,97 +287,97 @@@ static struct platform_device cmt10_dev
        .num_resources  = ARRAY_SIZE(cmt10_resources),
  };
  
+ /* TMU */
+ static struct sh_timer_config tmu00_platform_data = {
+       .name = "TMU00",
+       .channel_offset = 0x4,
+       .timer_bit = 0,
+       .clockevent_rating = 200,
+ };
+ static struct resource tmu00_resources[] = {
+       [0] = {
+               .name   = "TMU00",
+               .start  = 0xfff80008,
+               .end    = 0xfff80014 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xe80),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu00_device = {
+       .name           = "sh_tmu",
+       .id             = 0,
+       .dev = {
+               .platform_data  = &tmu00_platform_data,
+       },
+       .resource       = tmu00_resources,
+       .num_resources  = ARRAY_SIZE(tmu00_resources),
+ };
+ static struct sh_timer_config tmu01_platform_data = {
+       .name = "TMU01",
+       .channel_offset = 0x10,
+       .timer_bit = 1,
+       .clocksource_rating = 200,
+ };
+ static struct resource tmu01_resources[] = {
+       [0] = {
+               .name   = "TMU01",
+               .start  = 0xfff80014,
+               .end    = 0xfff80020 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xea0),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu01_device = {
+       .name           = "sh_tmu",
+       .id             = 1,
+       .dev = {
+               .platform_data  = &tmu01_platform_data,
+       },
+       .resource       = tmu01_resources,
+       .num_resources  = ARRAY_SIZE(tmu01_resources),
+ };
+ static struct sh_timer_config tmu02_platform_data = {
+       .name = "TMU02",
+       .channel_offset = 0x1C,
+       .timer_bit = 2,
+       .clocksource_rating = 200,
+ };
+ static struct resource tmu02_resources[] = {
+       [0] = {
+               .name   = "TMU02",
+               .start  = 0xfff80020,
+               .end    = 0xfff8002C - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xec0),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu02_device = {
+       .name           = "sh_tmu",
+       .id             = 2,
+       .dev = {
+               .platform_data  = &tmu02_platform_data,
+       },
+       .resource       = tmu02_resources,
+       .num_resources  = ARRAY_SIZE(tmu02_resources),
+ };
  static struct platform_device *r8a7740_early_devices[] __initdata = {
        &scif0_device,
        &scif1_device,
        &scif7_device,
        &scifb_device,
        &cmt10_device,
+       &tmu00_device,
+       &tmu01_device,
+       &tmu02_device,
  };
  
  /* DMA */
@@@ -60,39 -60,13 +60,38 @@@ void __init r8a7779_map_io(void
        iotable_init(r8a7779_io_desc, ARRAY_SIZE(r8a7779_io_desc));
  }
  
 +static struct resource r8a7779_pfc_resources[] = {
 +      [0] = {
 +              .start  = 0xfffc0000,
 +              .end    = 0xfffc023b,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +      [1] = {
 +              .start  = 0xffc40000,
 +              .end    = 0xffc46fff,
 +              .flags  = IORESOURCE_MEM,
 +      }
 +};
 +
 +static struct platform_device r8a7779_pfc_device = {
 +      .name           = "pfc-r8a7779",
 +      .id             = -1,
 +      .resource       = r8a7779_pfc_resources,
 +      .num_resources  = ARRAY_SIZE(r8a7779_pfc_resources),
 +};
 +
 +void __init r8a7779_pinmux_init(void)
 +{
 +      platform_device_register(&r8a7779_pfc_device);
 +}
 +
  static struct plat_sci_port scif0_platform_data = {
        .mapbase        = 0xffe40000,
        .flags          = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(88), gic_spi(88),
-                           gic_spi(88), gic_spi(88) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(88)),
  };
  
  static struct platform_device scif0_device = {
@@@ -109,8 -83,7 +108,7 @@@ static struct plat_sci_port scif1_platf
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(89), gic_spi(89),
-                           gic_spi(89), gic_spi(89) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(89)),
  };
  
  static struct platform_device scif1_device = {
@@@ -127,8 -100,7 +125,7 @@@ static struct plat_sci_port scif2_platf
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(90), gic_spi(90),
-                           gic_spi(90), gic_spi(90) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(90)),
  };
  
  static struct platform_device scif2_device = {
@@@ -145,8 -117,7 +142,7 @@@ static struct plat_sci_port scif3_platf
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(91), gic_spi(91),
-                           gic_spi(91), gic_spi(91) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(91)),
  };
  
  static struct platform_device scif3_device = {
@@@ -163,8 -134,7 +159,7 @@@ static struct plat_sci_port scif4_platf
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(92), gic_spi(92),
-                           gic_spi(92), gic_spi(92) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(92)),
  };
  
  static struct platform_device scif4_device = {
@@@ -181,8 -151,7 +176,7 @@@ static struct plat_sci_port scif5_platf
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(93), gic_spi(93),
-                           gic_spi(93), gic_spi(93) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(93)),
  };
  
  static struct platform_device scif5_device = {
@@@ -23,6 -23,7 +23,7 @@@
  #include <linux/interrupt.h>
  #include <linux/irq.h>
  #include <linux/platform_device.h>
+ #include <linux/of_platform.h>
  #include <linux/delay.h>
  #include <linux/input.h>
  #include <linux/io.h>
@@@ -57,31 -58,6 +58,31 @@@ void __init sh73a0_map_io(void
        iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc));
  }
  
 +static struct resource sh73a0_pfc_resources[] = {
 +      [0] = {
 +              .start  = 0xe6050000,
 +              .end    = 0xe6057fff,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +      [1] = {
 +              .start  = 0xe605801c,
 +              .end    = 0xe6058027,
 +              .flags  = IORESOURCE_MEM,
 +      }
 +};
 +
 +static struct platform_device sh73a0_pfc_device = {
 +      .name           = "pfc-sh73a0",
 +      .id             = -1,
 +      .resource       = sh73a0_pfc_resources,
 +      .num_resources  = ARRAY_SIZE(sh73a0_pfc_resources),
 +};
 +
 +void __init sh73a0_pinmux_init(void)
 +{
 +      platform_device_register(&sh73a0_pfc_device);
 +}
 +
  static struct plat_sci_port scif0_platform_data = {
        .mapbase        = 0xe6c40000,
        .flags          = UPF_BOOT_AUTOCONF,
@@@ -779,7 -755,7 +780,7 @@@ static struct platform_device pmu_devic
        .resource       = pmu_resources,
  };
  
- static struct platform_device *sh73a0_early_devices[] __initdata = {
+ static struct platform_device *sh73a0_early_devices_dt[] __initdata = {
        &scif0_device,
        &scif1_device,
        &scif2_device,
        &scif7_device,
        &scif8_device,
        &cmt10_device,
+ };
+ static struct platform_device *sh73a0_early_devices[] __initdata = {
        &tmu00_device,
        &tmu01_device,
  };
@@@ -812,6 -791,8 +816,8 @@@ void __init sh73a0_add_standard_devices
        /* Clear software reset bit on SY-DMAC module */
        __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
  
+       platform_add_devices(sh73a0_early_devices_dt,
+                           ARRAY_SIZE(sh73a0_early_devices_dt));
        platform_add_devices(sh73a0_early_devices,
                            ARRAY_SIZE(sh73a0_early_devices));
        platform_add_devices(sh73a0_late_devices,
@@@ -830,9 -811,63 +836,63 @@@ void __init sh73a0_earlytimer_init(void
  
  void __init sh73a0_add_early_devices(void)
  {
+       early_platform_add_devices(sh73a0_early_devices_dt,
+                                  ARRAY_SIZE(sh73a0_early_devices_dt));
        early_platform_add_devices(sh73a0_early_devices,
                                   ARRAY_SIZE(sh73a0_early_devices));
  
        /* setup early console here as well */
        shmobile_setup_console();
  }
+ #ifdef CONFIG_USE_OF
+ /* Please note that the clock initialisation shcheme used in
+  * sh73a0_add_early_devices_dt() and sh73a0_add_standard_devices_dt()
+  * does not work with SMP as there is a yet to be resolved lock-up in
+  * workqueue initialisation.
+  *
+  * CONFIG_SMP should be disabled when using this code.
+  */
+ void __init sh73a0_add_early_devices_dt(void)
+ {
+       shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */
+       early_platform_add_devices(sh73a0_early_devices_dt,
+                                  ARRAY_SIZE(sh73a0_early_devices_dt));
+       /* setup early console here as well */
+       shmobile_setup_console();
+ }
+ static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = {
+       {},
+ };
+ void __init sh73a0_add_standard_devices_dt(void)
+ {
+       /* clocks are setup late during boot in the case of DT */
+       sh73a0_clock_init();
+       platform_add_devices(sh73a0_early_devices_dt,
+                            ARRAY_SIZE(sh73a0_early_devices_dt));
+       of_platform_populate(NULL, of_default_bus_match_table,
+                            sh73a0_auxdata_lookup, NULL);
+ }
+ static const char *sh73a0_boards_compat_dt[] __initdata = {
+       "renesas,sh73a0",
+       NULL,
+ };
+ DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)")
+       .map_io         = sh73a0_map_io,
+       .init_early     = sh73a0_add_early_devices_dt,
+       .nr_irqs        = NR_IRQS_LEGACY,
+       .init_irq       = sh73a0_init_irq_dt,
+       .init_machine   = sh73a0_add_standard_devices_dt,
+       .init_time      = shmobile_timer_init,
+       .dt_compat      = sh73a0_boards_compat_dt,
+ MACHINE_END
+ #endif /* CONFIG_USE_OF */
@@@ -225,7 -225,8 +225,7 @@@ static int tegra_cpu_init(struct cpufre
        /* FIXME: what's the actual transition time? */
        policy->cpuinfo.transition_latency = 300 * 1000;
  
 -      policy->shared_type = CPUFREQ_SHARED_TYPE_ALL;
 -      cpumask_copy(policy->related_cpus, cpu_possible_mask);
 +      cpumask_copy(policy->cpus, cpu_possible_mask);
  
        if (policy->cpu == 0)
                register_pm_notifier(&tegra_cpu_pm_notifier);
@@@ -265,7 -266,7 +265,7 @@@ static int __init tegra_cpufreq_init(vo
        if (IS_ERR(pll_x_clk))
                return PTR_ERR(pll_x_clk);
  
-       pll_p_clk = clk_get_sys(NULL, "pll_p");
+       pll_p_clk = clk_get_sys(NULL, "pll_p_cclk");
        if (IS_ERR(pll_p_clk))
                return PTR_ERR(pll_p_clk);
  
@@@ -3,8 -3,8 +3,8 @@@ config ARCH_VT850
        select ARCH_HAS_CPUFREQ
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
 +      select CLKSRC_OF
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
        select HAVE_CLK
        select VT8500_TIMER
        help
@@@ -16,3 -16,19 +16,19 @@@ config ARCH_WM850
        select ARCH_VT8500
        select CPU_ARM926T
        help
+ config ARCH_WM8750
+       bool "WonderMedia WM8750"
+       depends on ARCH_MULTI_V6
+       select ARCH_VT8500
+       select CPU_V6
+       help
+         Support for WonderMedia WM8750 System-on-Chip.
+ config ARCH_WM8850
+       bool "WonderMedia WM8850"
+       depends on ARCH_MULTI_V7
+       select ARCH_VT8500
+       select CPU_V7
+       help
+         Support for WonderMedia WM8850 System-on-Chip.
@@@ -18,9 -18,9 +18,9 @@@
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
 +#include <linux/clocksource.h>
  #include <linux/io.h>
  #include <linux/pm.h>
 -#include <linux/vt8500_timer.h>
  
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
@@@ -180,14 -180,16 +180,16 @@@ static const char * const vt8500_dt_com
        "via,vt8500",
        "wm,wm8650",
        "wm,wm8505",
+       "wm,wm8750",
+       "wm,wm8850",
  };
  
  DT_MACHINE_START(WMT_DT, "VIA/Wondermedia SoC (Device Tree Support)")
        .dt_compat      = vt8500_dt_compat,
        .map_io         = vt8500_map_io,
        .init_irq       = vt8500_init_irq,
 -      .init_time      = vt8500_timer_init,
        .init_machine   = vt8500_init,
 +      .init_time      = clocksource_of_init,
        .restart        = vt8500_restart,
        .handle_irq     = vt8500_handle_irq,
  MACHINE_END
diff --combined drivers/clk/Makefile
@@@ -1,13 -1,8 +1,13 @@@
  # common clock types
  obj-$(CONFIG_HAVE_CLK)                += clk-devres.o
  obj-$(CONFIG_CLKDEV_LOOKUP)   += clkdev.o
 -obj-$(CONFIG_COMMON_CLK)      += clk.o clk-fixed-rate.o clk-gate.o \
 -                                 clk-mux.o clk-divider.o clk-fixed-factor.o
 +obj-$(CONFIG_COMMON_CLK)      += clk.o
 +obj-$(CONFIG_COMMON_CLK)      += clk-divider.o
 +obj-$(CONFIG_COMMON_CLK)      += clk-fixed-factor.o
 +obj-$(CONFIG_COMMON_CLK)      += clk-fixed-rate.o
 +obj-$(CONFIG_COMMON_CLK)      += clk-gate.o
 +obj-$(CONFIG_COMMON_CLK)      += clk-mux.o
 +
  # SoCs specific
  obj-$(CONFIG_ARCH_BCM2835)    += clk-bcm2835.o
  obj-$(CONFIG_ARCH_NOMADIK)    += clk-nomadik.o
@@@ -25,9 -20,10 +25,11 @@@ endi
  obj-$(CONFIG_MACH_LOONGSON1)  += clk-ls1x.o
  obj-$(CONFIG_ARCH_U8500)      += ux500/
  obj-$(CONFIG_ARCH_VT8500)     += clk-vt8500.o
 -obj-$(CONFIG_ARCH_SUNXI)      += clk-sunxi.o
  obj-$(CONFIG_ARCH_ZYNQ)               += clk-zynq.o
+ obj-$(CONFIG_ARCH_TEGRA)      += tegra/
 +obj-$(CONFIG_X86)             += x86/
 +
  # Chip specific
  obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o
  obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o
@@@ -154,7 -154,7 +154,7 @@@ static enum imx28_clk clks_init_on[] __
  int __init mx28_clocks_init(void)
  {
        struct device_node *np;
 -      int i;
 +      u32 i;
  
        clk_misc_init();
  
                of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
        }
  
-       clk_register_clkdev(clks[clk32k], NULL, "timrot");
+       clk_register_clkdev(clks[xbus], NULL, "timrot");
        clk_register_clkdev(clks[enet_out], NULL, "enet_out");
  
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
@@@ -21,7 -21,6 +21,7 @@@
  #include <linux/delay.h>
  #include <linux/dmaengine.h>
  #include <linux/dma-mapping.h>
 +#include <linux/err.h>
  #include <linux/init.h>
  #include <linux/interrupt.h>
  #include <linux/io.h>
@@@ -32,8 -31,8 +32,8 @@@
  #include <linux/platform_device.h>
  #include <linux/pm_runtime.h>
  #include <linux/slab.h>
+ #include <linux/clk/tegra.h>
  
- #include <mach/clk.h>
  #include "dmaengine.h"
  
  #define TEGRA_APBDMA_GENERAL                  0x0
@@@ -1241,9 -1240,12 +1241,9 @@@ static int tegra_dma_probe(struct platf
                return -EINVAL;
        }
  
 -      tdma->base_addr = devm_request_and_ioremap(&pdev->dev, res);
 -      if (!tdma->base_addr) {
 -              dev_err(&pdev->dev,
 -                      "Cannot request memregion/iomap dma address\n");
 -              return -EADDRNOTAVAIL;
 -      }
 +      tdma->base_addr = devm_ioremap_resource(&pdev->dev, res);
 +      if (IS_ERR(tdma->base_addr))
 +              return PTR_ERR(tdma->base_addr);
  
        tdma->dma_clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(tdma->dma_clk)) {
@@@ -12,8 -12,7 +12,7 @@@
  #include <linux/module.h>
  #include <linux/of.h>
  #include <linux/platform_device.h>
- #include <mach/clk.h>
+ #include <linux/clk/tegra.h>
  
  #include "drm.h"
  #include "dc.h"
@@@ -764,9 -763,11 +763,9 @@@ static int tegra_dc_probe(struct platfo
                return -ENXIO;
        }
  
 -      dc->regs = devm_request_and_ioremap(&pdev->dev, regs);
 -      if (!dc->regs) {
 -              dev_err(&pdev->dev, "failed to remap registers\n");
 -              return -ENXIO;
 -      }
 +      dc->regs = devm_ioremap_resource(&pdev->dev, regs);
 +      if (IS_ERR(dc->regs))
 +              return PTR_ERR(dc->regs);
  
        dc->irq = platform_get_irq(pdev, 0);
        if (dc->irq < 0) {
@@@ -14,8 -14,7 +14,7 @@@
  #include <linux/of.h>
  #include <linux/platform_device.h>
  #include <linux/regulator/consumer.h>
- #include <mach/clk.h>
+ #include <linux/clk/tegra.h>
  
  #include "hdmi.h"
  #include "drm.h"
@@@ -1259,9 -1258,9 +1258,9 @@@ static int tegra_hdmi_probe(struct plat
        if (!regs)
                return -ENXIO;
  
 -      hdmi->regs = devm_request_and_ioremap(&pdev->dev, regs);
 -      if (!hdmi->regs)
 -              return -EADDRNOTAVAIL;
 +      hdmi->regs = devm_ioremap_resource(&pdev->dev, regs);
 +      if (IS_ERR(hdmi->regs))
 +              return PTR_ERR(hdmi->regs);
  
        err = platform_get_irq(pdev, 0);
        if (err < 0)
  #include <linux/of_i2c.h>
  #include <linux/of_device.h>
  #include <linux/module.h>
+ #include <linux/clk/tegra.h>
  
  #include <asm/unaligned.h>
  
- #include <mach/clk.h>
  #define TEGRA_I2C_TIMEOUT (msecs_to_jiffies(1000))
  #define BYTES_PER_FIFO_WORD 4
  
@@@ -669,9 -668,11 +668,9 @@@ static int tegra_i2c_probe(struct platf
                return -EINVAL;
        }
  
 -      base = devm_request_and_ioremap(&pdev->dev, res);
 -      if (!base) {
 -              dev_err(&pdev->dev, "Cannot request/ioremap I2C registers\n");
 -              return -EADDRNOTAVAIL;
 -      }
 +      base = devm_ioremap_resource(&pdev->dev, res);
 +      if (IS_ERR(base))
 +              return PTR_ERR(base);
  
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!res) {
  #include <linux/of.h>
  #include <linux/clk.h>
  #include <linux/slab.h>
 -#include <linux/input/tegra_kbc.h>
 +#include <linux/input/matrix_keypad.h>
- #include <mach/clk.h>
+ #include <linux/clk/tegra.h>
  
 +#define KBC_MAX_GPIO  24
 +#define KBC_MAX_KPENT 8
 +
 +#define KBC_MAX_ROW   16
 +#define KBC_MAX_COL   8
 +#define KBC_MAX_KEY   (KBC_MAX_ROW * KBC_MAX_COL)
 +
  #define KBC_MAX_DEBOUNCE_CNT  0x3ffu
  
  /* KBC row scan time and delay for beginning the row scan. */
  
  #define KBC_ROW_SHIFT 3
  
 +enum tegra_pin_type {
 +      PIN_CFG_IGNORE,
 +      PIN_CFG_COL,
 +      PIN_CFG_ROW,
 +};
 +
 +struct tegra_kbc_pin_cfg {
 +      enum tegra_pin_type type;
 +      unsigned char num;
 +};
 +
  struct tegra_kbc {
 +      struct device *dev;
 +      unsigned int debounce_cnt;
 +      unsigned int repeat_cnt;
 +      struct tegra_kbc_pin_cfg pin_cfg[KBC_MAX_GPIO];
 +      const struct matrix_keymap_data *keymap_data;
 +      bool wakeup;
        void __iomem *mmio;
        struct input_dev *idev;
 -      unsigned int irq;
 +      int irq;
        spinlock_t lock;
        unsigned int repoll_dly;
        unsigned long cp_dly_jiffies;
        bool use_fn_map;
        bool use_ghost_filter;
        bool keypress_caused_wake;
 -      const struct tegra_kbc_platform_data *pdata;
        unsigned short keycode[KBC_MAX_KEY * 2];
        unsigned short current_keys[KBC_MAX_KPENT];
        unsigned int num_pressed_keys;
        struct clk *clk;
  };
  
 -static const u32 tegra_kbc_default_keymap[] = {
 -      KEY(0, 2, KEY_W),
 -      KEY(0, 3, KEY_S),
 -      KEY(0, 4, KEY_A),
 -      KEY(0, 5, KEY_Z),
 -      KEY(0, 7, KEY_FN),
 -
 -      KEY(1, 7, KEY_LEFTMETA),
 -
 -      KEY(2, 6, KEY_RIGHTALT),
 -      KEY(2, 7, KEY_LEFTALT),
 -
 -      KEY(3, 0, KEY_5),
 -      KEY(3, 1, KEY_4),
 -      KEY(3, 2, KEY_R),
 -      KEY(3, 3, KEY_E),
 -      KEY(3, 4, KEY_F),
 -      KEY(3, 5, KEY_D),
 -      KEY(3, 6, KEY_X),
 -
 -      KEY(4, 0, KEY_7),
 -      KEY(4, 1, KEY_6),
 -      KEY(4, 2, KEY_T),
 -      KEY(4, 3, KEY_H),
 -      KEY(4, 4, KEY_G),
 -      KEY(4, 5, KEY_V),
 -      KEY(4, 6, KEY_C),
 -      KEY(4, 7, KEY_SPACE),
 -
 -      KEY(5, 0, KEY_9),
 -      KEY(5, 1, KEY_8),
 -      KEY(5, 2, KEY_U),
 -      KEY(5, 3, KEY_Y),
 -      KEY(5, 4, KEY_J),
 -      KEY(5, 5, KEY_N),
 -      KEY(5, 6, KEY_B),
 -      KEY(5, 7, KEY_BACKSLASH),
 -
 -      KEY(6, 0, KEY_MINUS),
 -      KEY(6, 1, KEY_0),
 -      KEY(6, 2, KEY_O),
 -      KEY(6, 3, KEY_I),
 -      KEY(6, 4, KEY_L),
 -      KEY(6, 5, KEY_K),
 -      KEY(6, 6, KEY_COMMA),
 -      KEY(6, 7, KEY_M),
 -
 -      KEY(7, 1, KEY_EQUAL),
 -      KEY(7, 2, KEY_RIGHTBRACE),
 -      KEY(7, 3, KEY_ENTER),
 -      KEY(7, 7, KEY_MENU),
 -
 -      KEY(8, 4, KEY_RIGHTSHIFT),
 -      KEY(8, 5, KEY_LEFTSHIFT),
 -
 -      KEY(9, 5, KEY_RIGHTCTRL),
 -      KEY(9, 7, KEY_LEFTCTRL),
 -
 -      KEY(11, 0, KEY_LEFTBRACE),
 -      KEY(11, 1, KEY_P),
 -      KEY(11, 2, KEY_APOSTROPHE),
 -      KEY(11, 3, KEY_SEMICOLON),
 -      KEY(11, 4, KEY_SLASH),
 -      KEY(11, 5, KEY_DOT),
 -
 -      KEY(12, 0, KEY_F10),
 -      KEY(12, 1, KEY_F9),
 -      KEY(12, 2, KEY_BACKSPACE),
 -      KEY(12, 3, KEY_3),
 -      KEY(12, 4, KEY_2),
 -      KEY(12, 5, KEY_UP),
 -      KEY(12, 6, KEY_PRINT),
 -      KEY(12, 7, KEY_PAUSE),
 -
 -      KEY(13, 0, KEY_INSERT),
 -      KEY(13, 1, KEY_DELETE),
 -      KEY(13, 3, KEY_PAGEUP),
 -      KEY(13, 4, KEY_PAGEDOWN),
 -      KEY(13, 5, KEY_RIGHT),
 -      KEY(13, 6, KEY_DOWN),
 -      KEY(13, 7, KEY_LEFT),
 -
 -      KEY(14, 0, KEY_F11),
 -      KEY(14, 1, KEY_F12),
 -      KEY(14, 2, KEY_F8),
 -      KEY(14, 3, KEY_Q),
 -      KEY(14, 4, KEY_F4),
 -      KEY(14, 5, KEY_F3),
 -      KEY(14, 6, KEY_1),
 -      KEY(14, 7, KEY_F7),
 -
 -      KEY(15, 0, KEY_ESC),
 -      KEY(15, 1, KEY_GRAVE),
 -      KEY(15, 2, KEY_F5),
 -      KEY(15, 3, KEY_TAB),
 -      KEY(15, 4, KEY_F1),
 -      KEY(15, 5, KEY_F2),
 -      KEY(15, 6, KEY_CAPSLOCK),
 -      KEY(15, 7, KEY_F6),
 -
 -      /* Software Handled Function Keys */
 -      KEY(20, 0, KEY_KP7),
 -
 -      KEY(21, 0, KEY_KP9),
 -      KEY(21, 1, KEY_KP8),
 -      KEY(21, 2, KEY_KP4),
 -      KEY(21, 4, KEY_KP1),
 -
 -      KEY(22, 1, KEY_KPSLASH),
 -      KEY(22, 2, KEY_KP6),
 -      KEY(22, 3, KEY_KP5),
 -      KEY(22, 4, KEY_KP3),
 -      KEY(22, 5, KEY_KP2),
 -      KEY(22, 7, KEY_KP0),
 -
 -      KEY(27, 1, KEY_KPASTERISK),
 -      KEY(27, 3, KEY_KPMINUS),
 -      KEY(27, 4, KEY_KPPLUS),
 -      KEY(27, 5, KEY_KPDOT),
 -
 -      KEY(28, 5, KEY_VOLUMEUP),
 -
 -      KEY(29, 3, KEY_HOME),
 -      KEY(29, 4, KEY_END),
 -      KEY(29, 5, KEY_BRIGHTNESSDOWN),
 -      KEY(29, 6, KEY_VOLUMEDOWN),
 -      KEY(29, 7, KEY_BRIGHTNESSUP),
 -
 -      KEY(30, 0, KEY_NUMLOCK),
 -      KEY(30, 1, KEY_SCROLLLOCK),
 -      KEY(30, 2, KEY_MUTE),
 -
 -      KEY(31, 4, KEY_HELP),
 -};
 -
 -static const
 -struct matrix_keymap_data tegra_kbc_default_keymap_data = {
 -      .keymap         = tegra_kbc_default_keymap,
 -      .keymap_size    = ARRAY_SIZE(tegra_kbc_default_keymap),
 -};
 -
  static void tegra_kbc_report_released_keys(struct input_dev *input,
                                           unsigned short old_keycodes[],
                                           unsigned int old_num_keys,
@@@ -239,6 -357,18 +239,6 @@@ static void tegra_kbc_set_fifo_interrup
        writel(val, kbc->mmio + KBC_CONTROL_0);
  }
  
 -static void tegra_kbc_set_keypress_interrupt(struct tegra_kbc *kbc, bool enable)
 -{
 -      u32 val;
 -
 -      val = readl(kbc->mmio + KBC_CONTROL_0);
 -      if (enable)
 -              val |= KBC_CONTROL_KEYPRESS_INT_EN;
 -      else
 -              val &= ~KBC_CONTROL_KEYPRESS_INT_EN;
 -      writel(val, kbc->mmio + KBC_CONTROL_0);
 -}
 -
  static void tegra_kbc_keypress_timer(unsigned long data)
  {
        struct tegra_kbc *kbc = (struct tegra_kbc *)data;
@@@ -309,11 -439,12 +309,11 @@@ static irqreturn_t tegra_kbc_isr(int ir
  
  static void tegra_kbc_setup_wakekeys(struct tegra_kbc *kbc, bool filter)
  {
 -      const struct tegra_kbc_platform_data *pdata = kbc->pdata;
        int i;
        unsigned int rst_val;
  
        /* Either mask all keys or none. */
 -      rst_val = (filter && !pdata->wakeup) ? ~0 : 0;
 +      rst_val = (filter && !kbc->wakeup) ? ~0 : 0;
  
        for (i = 0; i < KBC_MAX_ROW; i++)
                writel(rst_val, kbc->mmio + KBC_ROW0_MASK_0 + i * 4);
  
  static void tegra_kbc_config_pins(struct tegra_kbc *kbc)
  {
 -      const struct tegra_kbc_platform_data *pdata = kbc->pdata;
        int i;
  
        for (i = 0; i < KBC_MAX_GPIO; i++) {
                row_cfg &= ~r_mask;
                col_cfg &= ~c_mask;
  
 -              switch (pdata->pin_cfg[i].type) {
 +              switch (kbc->pin_cfg[i].type) {
                case PIN_CFG_ROW:
 -                      row_cfg |= ((pdata->pin_cfg[i].num << 1) | 1) << r_shft;
 +                      row_cfg |= ((kbc->pin_cfg[i].num << 1) | 1) << r_shft;
                        break;
  
                case PIN_CFG_COL:
 -                      col_cfg |= ((pdata->pin_cfg[i].num << 1) | 1) << c_shft;
 +                      col_cfg |= ((kbc->pin_cfg[i].num << 1) | 1) << c_shft;
                        break;
  
                case PIN_CFG_IGNORE:
  
  static int tegra_kbc_start(struct tegra_kbc *kbc)
  {
 -      const struct tegra_kbc_platform_data *pdata = kbc->pdata;
        unsigned int debounce_cnt;
        u32 val = 0;
  
        tegra_kbc_config_pins(kbc);
        tegra_kbc_setup_wakekeys(kbc, false);
  
 -      writel(pdata->repeat_cnt, kbc->mmio + KBC_RPT_DLY_0);
 +      writel(kbc->repeat_cnt, kbc->mmio + KBC_RPT_DLY_0);
  
        /* Keyboard debounce count is maximum of 12 bits. */
 -      debounce_cnt = min(pdata->debounce_cnt, KBC_MAX_DEBOUNCE_CNT);
 +      debounce_cnt = min(kbc->debounce_cnt, KBC_MAX_DEBOUNCE_CNT);
        val = KBC_DEBOUNCE_CNT_SHIFT(debounce_cnt);
        val |= KBC_FIFO_TH_CNT_SHIFT(1); /* set fifo interrupt threshold to 1 */
        val |= KBC_CONTROL_FIFO_CNT_INT_EN;  /* interrupt on FIFO threshold */
@@@ -440,20 -573,21 +440,20 @@@ static void tegra_kbc_close(struct inpu
        return tegra_kbc_stop(kbc);
  }
  
 -static bool
 -tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
 -                      struct device *dev, unsigned int *num_rows)
 +static bool tegra_kbc_check_pin_cfg(const struct tegra_kbc *kbc,
 +                                      unsigned int *num_rows)
  {
        int i;
  
        *num_rows = 0;
  
        for (i = 0; i < KBC_MAX_GPIO; i++) {
 -              const struct tegra_kbc_pin_cfg *pin_cfg = &pdata->pin_cfg[i];
 +              const struct tegra_kbc_pin_cfg *pin_cfg = &kbc->pin_cfg[i];
  
                switch (pin_cfg->type) {
                case PIN_CFG_ROW:
                        if (pin_cfg->num >= KBC_MAX_ROW) {
 -                              dev_err(dev,
 +                              dev_err(kbc->dev,
                                        "pin_cfg[%d]: invalid row number %d\n",
                                        i, pin_cfg->num);
                                return false;
  
                case PIN_CFG_COL:
                        if (pin_cfg->num >= KBC_MAX_COL) {
 -                              dev_err(dev,
 +                              dev_err(kbc->dev,
                                        "pin_cfg[%d]: invalid column number %d\n",
                                        i, pin_cfg->num);
                                return false;
                        break;
  
                default:
 -                      dev_err(dev,
 +                      dev_err(kbc->dev,
                                "pin_cfg[%d]: invalid entry type %d\n",
                                pin_cfg->type, pin_cfg->num);
                        return false;
        return true;
  }
  
 -#ifdef CONFIG_OF
 -static struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
 -      struct platform_device *pdev)
 +static int tegra_kbc_parse_dt(struct tegra_kbc *kbc)
  {
 -      struct tegra_kbc_platform_data *pdata;
 -      struct device_node *np = pdev->dev.of_node;
 +      struct device_node *np = kbc->dev->of_node;
        u32 prop;
        int i;
 -
 -      if (!np)
 -              return NULL;
 -
 -      pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
 -      if (!pdata)
 -              return NULL;
 +      u32 num_rows = 0;
 +      u32 num_cols = 0;
 +      u32 cols_cfg[KBC_MAX_GPIO];
 +      u32 rows_cfg[KBC_MAX_GPIO];
 +      int proplen;
 +      int ret;
  
        if (!of_property_read_u32(np, "nvidia,debounce-delay-ms", &prop))
 -              pdata->debounce_cnt = prop;
 +              kbc->debounce_cnt = prop;
  
        if (!of_property_read_u32(np, "nvidia,repeat-delay-ms", &prop))
 -              pdata->repeat_cnt = prop;
 +              kbc->repeat_cnt = prop;
  
        if (of_find_property(np, "nvidia,needs-ghost-filter", NULL))
 -              pdata->use_ghost_filter = true;
 +              kbc->use_ghost_filter = true;
  
        if (of_find_property(np, "nvidia,wakeup-source", NULL))
 -              pdata->wakeup = true;
 +              kbc->wakeup = true;
  
 -      /*
 -       * All currently known keymaps with device tree support use the same
 -       * pin_cfg, so set it up here.
 -       */
 -      for (i = 0; i < KBC_MAX_ROW; i++) {
 -              pdata->pin_cfg[i].num = i;
 -              pdata->pin_cfg[i].type = PIN_CFG_ROW;
 +      if (!of_get_property(np, "nvidia,kbc-row-pins", &proplen)) {
 +              dev_err(kbc->dev, "property nvidia,kbc-row-pins not found\n");
 +              return -ENOENT;
        }
 +      num_rows = proplen / sizeof(u32);
  
 -      for (i = 0; i < KBC_MAX_COL; i++) {
 -              pdata->pin_cfg[KBC_MAX_ROW + i].num = i;
 -              pdata->pin_cfg[KBC_MAX_ROW + i].type = PIN_CFG_COL;
 +      if (!of_get_property(np, "nvidia,kbc-col-pins", &proplen)) {
 +              dev_err(kbc->dev, "property nvidia,kbc-col-pins not found\n");
 +              return -ENOENT;
        }
 +      num_cols = proplen / sizeof(u32);
  
 -      return pdata;
 -}
 -#else
 -static inline struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
 -      struct platform_device *pdev)
 -{
 -      return NULL;
 -}
 -#endif
 +      if (!of_get_property(np, "linux,keymap", &proplen)) {
 +              dev_err(kbc->dev, "property linux,keymap not found\n");
 +              return -ENOENT;
 +      }
  
 -static int tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
 -{
 -      const struct tegra_kbc_platform_data *pdata = kbc->pdata;
 -      const struct matrix_keymap_data *keymap_data = pdata->keymap_data;
 -      unsigned int keymap_rows = KBC_MAX_KEY;
 -      int retval;
 +      if (!num_rows || !num_cols || ((num_rows + num_cols) > KBC_MAX_GPIO)) {
 +              dev_err(kbc->dev,
 +                      "keypad rows/columns not porperly specified\n");
 +              return -EINVAL;
 +      }
  
 -      if (keymap_data && pdata->use_fn_map)
 -              keymap_rows *= 2;
 +      /* Set all pins as non-configured */
 +      for (i = 0; i < KBC_MAX_GPIO; i++)
 +              kbc->pin_cfg[i].type = PIN_CFG_IGNORE;
  
 -      retval = matrix_keypad_build_keymap(keymap_data, NULL,
 -                                          keymap_rows, KBC_MAX_COL,
 -                                          kbc->keycode, kbc->idev);
 -      if (retval == -ENOSYS || retval == -ENOENT) {
 -              /*
 -               * If there is no OF support in kernel or keymap
 -               * property is missing, use default keymap.
 -               */
 -              retval = matrix_keypad_build_keymap(
 -                                      &tegra_kbc_default_keymap_data, NULL,
 -                                      keymap_rows, KBC_MAX_COL,
 -                                      kbc->keycode, kbc->idev);
 +      ret = of_property_read_u32_array(np, "nvidia,kbc-row-pins",
 +                              rows_cfg, num_rows);
 +      if (ret < 0) {
 +              dev_err(kbc->dev, "Rows configurations are not proper\n");
 +              return -EINVAL;
 +      }
 +
 +      ret = of_property_read_u32_array(np, "nvidia,kbc-col-pins",
 +                              cols_cfg, num_cols);
 +      if (ret < 0) {
 +              dev_err(kbc->dev, "Cols configurations are not proper\n");
 +              return -EINVAL;
 +      }
 +
 +      for (i = 0; i < num_rows; i++) {
 +              kbc->pin_cfg[rows_cfg[i]].type = PIN_CFG_ROW;
 +              kbc->pin_cfg[rows_cfg[i]].num = i;
        }
  
 -      return retval;
 +      for (i = 0; i < num_cols; i++) {
 +              kbc->pin_cfg[cols_cfg[i]].type = PIN_CFG_COL;
 +              kbc->pin_cfg[cols_cfg[i]].num = i;
 +      }
 +
 +      return 0;
  }
  
  static int tegra_kbc_probe(struct platform_device *pdev)
  {
 -      const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data;
        struct tegra_kbc *kbc;
 -      struct input_dev *input_dev;
        struct resource *res;
 -      int irq;
        int err;
        int num_rows = 0;
        unsigned int debounce_cnt;
        unsigned int scan_time_rows;
 +      unsigned int keymap_rows = KBC_MAX_KEY;
  
 -      if (!pdata)
 -              pdata = tegra_kbc_dt_parse_pdata(pdev);
 +      kbc = devm_kzalloc(&pdev->dev, sizeof(*kbc), GFP_KERNEL);
 +      if (!kbc) {
 +              dev_err(&pdev->dev, "failed to alloc memory for kbc\n");
 +              return -ENOMEM;
 +      }
  
 -      if (!pdata)
 -              return -EINVAL;
 +      kbc->dev = &pdev->dev;
 +      spin_lock_init(&kbc->lock);
  
 -      if (!tegra_kbc_check_pin_cfg(pdata, &pdev->dev, &num_rows)) {
 -              err = -EINVAL;
 -              goto err_free_pdata;
 -      }
 +      err = tegra_kbc_parse_dt(kbc);
 +      if (err)
 +              return err;
 +
 +      if (!tegra_kbc_check_pin_cfg(kbc, &num_rows))
 +              return -EINVAL;
  
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(&pdev->dev, "failed to get I/O memory\n");
 -              err = -ENXIO;
 -              goto err_free_pdata;
 +              return -ENXIO;
        }
  
 -      irq = platform_get_irq(pdev, 0);
 -      if (irq < 0) {
 +      kbc->irq = platform_get_irq(pdev, 0);
 +      if (kbc->irq < 0) {
                dev_err(&pdev->dev, "failed to get keyboard IRQ\n");
 -              err = -ENXIO;
 -              goto err_free_pdata;
 +              return -ENXIO;
        }
  
 -      kbc = kzalloc(sizeof(*kbc), GFP_KERNEL);
 -      input_dev = input_allocate_device();
 -      if (!kbc || !input_dev) {
 -              err = -ENOMEM;
 -              goto err_free_mem;
 +      kbc->idev = devm_input_allocate_device(&pdev->dev);
 +      if (!kbc->idev) {
 +              dev_err(&pdev->dev, "failed to allocate input device\n");
 +              return -ENOMEM;
        }
  
 -      kbc->pdata = pdata;
 -      kbc->idev = input_dev;
 -      kbc->irq = irq;
 -      spin_lock_init(&kbc->lock);
        setup_timer(&kbc->timer, tegra_kbc_keypress_timer, (unsigned long)kbc);
  
 -      res = request_mem_region(res->start, resource_size(res), pdev->name);
 -      if (!res) {
 -              dev_err(&pdev->dev, "failed to request I/O memory\n");
 -              err = -EBUSY;
 -              goto err_free_mem;
 -      }
 -
 -      kbc->mmio = ioremap(res->start, resource_size(res));
 +      kbc->mmio = devm_request_and_ioremap(&pdev->dev, res);
        if (!kbc->mmio) {
 -              dev_err(&pdev->dev, "failed to remap I/O memory\n");
 -              err = -ENXIO;
 -              goto err_free_mem_region;
 +              dev_err(&pdev->dev, "Cannot request memregion/iomap address\n");
 +              return -EBUSY;
        }
  
 -      kbc->clk = clk_get(&pdev->dev, NULL);
 +      kbc->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(kbc->clk)) {
                dev_err(&pdev->dev, "failed to get keyboard clock\n");
 -              err = PTR_ERR(kbc->clk);
 -              goto err_iounmap;
 +              return PTR_ERR(kbc->clk);
        }
  
        /*
         * the rows. There is an additional delay before the row scanning
         * starts. The repoll delay is computed in milliseconds.
         */
 -      debounce_cnt = min(pdata->debounce_cnt, KBC_MAX_DEBOUNCE_CNT);
 +      debounce_cnt = min(kbc->debounce_cnt, KBC_MAX_DEBOUNCE_CNT);
        scan_time_rows = (KBC_ROW_SCAN_TIME + debounce_cnt) * num_rows;
 -      kbc->repoll_dly = KBC_ROW_SCAN_DLY + scan_time_rows + pdata->repeat_cnt;
 +      kbc->repoll_dly = KBC_ROW_SCAN_DLY + scan_time_rows + kbc->repeat_cnt;
        kbc->repoll_dly = DIV_ROUND_UP(kbc->repoll_dly, KBC_CYCLE_MS);
  
 -      kbc->wakeup_key = pdata->wakeup_key;
 -      kbc->use_fn_map = pdata->use_fn_map;
 -      kbc->use_ghost_filter = pdata->use_ghost_filter;
 +      kbc->idev->name = pdev->name;
 +      kbc->idev->id.bustype = BUS_HOST;
 +      kbc->idev->dev.parent = &pdev->dev;
 +      kbc->idev->open = tegra_kbc_open;
 +      kbc->idev->close = tegra_kbc_close;
  
 -      input_dev->name = pdev->name;
 -      input_dev->id.bustype = BUS_HOST;
 -      input_dev->dev.parent = &pdev->dev;
 -      input_dev->open = tegra_kbc_open;
 -      input_dev->close = tegra_kbc_close;
 +      if (kbc->keymap_data && kbc->use_fn_map)
 +              keymap_rows *= 2;
  
 -      err = tegra_kbd_setup_keymap(kbc);
 +      err = matrix_keypad_build_keymap(kbc->keymap_data, NULL,
 +                                       keymap_rows, KBC_MAX_COL,
 +                                       kbc->keycode, kbc->idev);
        if (err) {
                dev_err(&pdev->dev, "failed to setup keymap\n");
 -              goto err_put_clk;
 +              return err;
        }
  
 -      __set_bit(EV_REP, input_dev->evbit);
 -      input_set_capability(input_dev, EV_MSC, MSC_SCAN);
 +      __set_bit(EV_REP, kbc->idev->evbit);
 +      input_set_capability(kbc->idev, EV_MSC, MSC_SCAN);
  
 -      input_set_drvdata(input_dev, kbc);
 +      input_set_drvdata(kbc->idev, kbc);
  
 -      err = request_irq(kbc->irq, tegra_kbc_isr,
 +      err = devm_request_irq(&pdev->dev, kbc->irq, tegra_kbc_isr,
                          IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, pdev->name, kbc);
        if (err) {
                dev_err(&pdev->dev, "failed to request keyboard IRQ\n");
 -              goto err_put_clk;
 +              return err;
        }
  
        disable_irq(kbc->irq);
        err = input_register_device(kbc->idev);
        if (err) {
                dev_err(&pdev->dev, "failed to register input device\n");
 -              goto err_free_irq;
 +              return err;
        }
  
        platform_set_drvdata(pdev, kbc);
 -      device_init_wakeup(&pdev->dev, pdata->wakeup);
 +      device_init_wakeup(&pdev->dev, kbc->wakeup);
  
        return 0;
 -
 -err_free_irq:
 -      free_irq(kbc->irq, pdev);
 -err_put_clk:
 -      clk_put(kbc->clk);
 -err_iounmap:
 -      iounmap(kbc->mmio);
 -err_free_mem_region:
 -      release_mem_region(res->start, resource_size(res));
 -err_free_mem:
 -      input_free_device(input_dev);
 -      kfree(kbc);
 -err_free_pdata:
 -      if (!pdev->dev.platform_data)
 -              kfree(pdata);
 -
 -      return err;
  }
  
 -static int tegra_kbc_remove(struct platform_device *pdev)
 +#ifdef CONFIG_PM_SLEEP
 +static void tegra_kbc_set_keypress_interrupt(struct tegra_kbc *kbc, bool enable)
  {
 -      struct tegra_kbc *kbc = platform_get_drvdata(pdev);
 -      struct resource *res;
 -
 -      platform_set_drvdata(pdev, NULL);
 -
 -      free_irq(kbc->irq, pdev);
 -      clk_put(kbc->clk);
 -
 -      input_unregister_device(kbc->idev);
 -      iounmap(kbc->mmio);
 -      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 -      release_mem_region(res->start, resource_size(res));
 -
 -      /*
 -       * If we do not have platform data attached to the device we
 -       * allocated it ourselves and thus need to free it.
 -       */
 -      if (!pdev->dev.platform_data)
 -              kfree(kbc->pdata);
 -
 -      kfree(kbc);
 +      u32 val;
  
 -      return 0;
 +      val = readl(kbc->mmio + KBC_CONTROL_0);
 +      if (enable)
 +              val |= KBC_CONTROL_KEYPRESS_INT_EN;
 +      else
 +              val &= ~KBC_CONTROL_KEYPRESS_INT_EN;
 +      writel(val, kbc->mmio + KBC_CONTROL_0);
  }
  
 -#ifdef CONFIG_PM_SLEEP
  static int tegra_kbc_suspend(struct device *dev)
  {
        struct platform_device *pdev = to_platform_device(dev);
@@@ -775,6 -954,7 +775,6 @@@ MODULE_DEVICE_TABLE(of, tegra_kbc_of_ma
  
  static struct platform_driver tegra_kbc_driver = {
        .probe          = tegra_kbc_probe,
 -      .remove         = tegra_kbc_remove,
        .driver = {
                .name   = "tegra-kbc",
                .owner  = THIS_MODULE,
diff --combined drivers/rtc/Kconfig
@@@ -20,24 -20,14 +20,24 @@@ if RTC_CLAS
  config RTC_HCTOSYS
        bool "Set system time from RTC on startup and resume"
        default y
 +      depends on !ALWAYS_USE_PERSISTENT_CLOCK
        help
          If you say yes here, the system time (wall clock) will be set using
          the value read from a specified RTC device. This is useful to avoid
          unnecessary fsck runs at boot time, and to network better.
  
 +config RTC_SYSTOHC
 +      bool "Set the RTC time based on NTP synchronization"
 +      default y
 +      depends on !ALWAYS_USE_PERSISTENT_CLOCK
 +      help
 +        If you say yes here, the system time (wall clock) will be stored
 +        in the RTC specified by RTC_HCTOSYS_DEVICE approximately every 11
 +        minutes if userspace reports synchronized NTP status.
 +
  config RTC_HCTOSYS_DEVICE
        string "RTC used to set the system time"
 -      depends on RTC_HCTOSYS = y
 +      depends on RTC_HCTOSYS = y || RTC_SYSTOHC = y
        default "rtc0"
        help
          The RTC device that will be used to (re)initialize the system
@@@ -1033,7 -1023,7 +1033,7 @@@ config RTC_DRV_TX493
  
  config RTC_DRV_MV
        tristate "Marvell SoC RTC"
-       depends on ARCH_KIRKWOOD || ARCH_DOVE
+       depends on ARCH_KIRKWOOD || ARCH_DOVE || ARCH_MVEBU
        help
          If you say yes here you will get support for the in-chip RTC
          that can be found in some of Marvell's SoC devices, such as
@@@ -1183,20 -1173,4 +1183,20 @@@ config RTC_DRV_SNV
           This driver can also be built as a module, if so, the module
           will be called "rtc-snvs".
  
 +comment "HID Sensor RTC drivers"
 +
 +config RTC_DRV_HID_SENSOR_TIME
 +      tristate "HID Sensor Time"
 +      depends on USB_HID
 +      select IIO
 +      select HID_SENSOR_HUB
 +      select HID_SENSOR_IIO_COMMON
 +      help
 +        Say yes here to build support for the HID Sensors of type Time.
 +        This drivers makes such sensors available as RTCs.
 +
 +        If this driver is compiled as a module, it will be named
 +        rtc-hid-sensor-time.
 +
 +
  endif # RTC_CLASS
@@@ -34,7 -34,7 +34,7 @@@
  #include <linux/of_device.h>
  #include <linux/spi/spi.h>
  #include <linux/spi/spi-tegra.h>
- #include <mach/clk.h>
+ #include <linux/clk/tegra.h>
  
  #define SPI_COMMAND                           0x000
  #define SPI_GO                                        BIT(30)
@@@ -269,7 -269,9 +269,7 @@@ static int tegra_sflash_start_transfer_
        u32 speed;
        unsigned long command;
  
 -      speed = t->speed_hz ? t->speed_hz : spi->max_speed_hz;
 -      if (!speed)
 -              speed = tsd->spi_max_frequency;
 +      speed = t->speed_hz;
        if (speed != tsd->cur_speed) {
                clk_set_rate(tsd->clk, speed);
                tsd->cur_speed = speed;
        return  tegra_sflash_start_cpu_based_transfer(tsd, t);
  }
  
 +static int tegra_sflash_setup(struct spi_device *spi)
 +{
 +      struct tegra_sflash_data *tsd = spi_master_get_devdata(spi->master);
 +
 +      /* Set speed to the spi max fequency if spi device has not set */
 +      spi->max_speed_hz = spi->max_speed_hz ? : tsd->spi_max_frequency;
 +      return 0;
 +}
 +
  static int tegra_sflash_transfer_one_message(struct spi_master *master,
                        struct spi_message *msg)
  {
@@@ -499,7 -492,6 +499,7 @@@ static int tegra_sflash_probe(struct pl
  
        /* the spi->mode bits understood by this driver: */
        master->mode_bits = SPI_CPOL | SPI_CPHA;
 +      master->setup = tegra_sflash_setup;
        master->transfer_one_message = tegra_sflash_transfer_one_message;
        master->num_chipselect = MAX_CHIP_SELECT;
        master->bus_num = -1;
                ret = -ENODEV;
                goto exit_free_master;
        }
 -      tsd->base = devm_request_and_ioremap(&pdev->dev, r);
 -      if (!tsd->base) {
 -              dev_err(&pdev->dev,
 -                      "Cannot request memregion/iomap dma address\n");
 -              ret = -EADDRNOTAVAIL;
 +      tsd->base = devm_ioremap_resource(&pdev->dev, r);
 +      if (IS_ERR(tsd->base)) {
 +              ret = PTR_ERR(tsd->base);
                goto exit_free_master;
        }
  
                goto exit_free_master;
        }
  
-       tsd->clk = devm_clk_get(&pdev->dev, "spi");
+       tsd->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(tsd->clk)) {
                dev_err(&pdev->dev, "can not get clock\n");
                ret = PTR_ERR(tsd->clk);
@@@ -35,7 -35,7 +35,7 @@@
  #include <linux/of_device.h>
  #include <linux/spi/spi.h>
  #include <linux/spi/spi-tegra.h>
- #include <mach/clk.h>
+ #include <linux/clk/tegra.h>
  
  #define SLINK_COMMAND                 0x000
  #define SLINK_BIT_LENGTH(x)           (((x) & 0x1f) << 0)
@@@ -284,7 -284,8 +284,7 @@@ static unsigned tegra_slink_calculate_c
        unsigned max_len;
        unsigned total_fifo_words;
  
 -      bits_per_word = t->bits_per_word ? t->bits_per_word :
 -                                              spi->bits_per_word;
 +      bits_per_word = t->bits_per_word;
        tspi->bytes_per_word = (bits_per_word - 1) / 8 + 1;
  
        if (bits_per_word == 8 || bits_per_word == 16) {
@@@ -377,7 -378,8 +377,7 @@@ static unsigned int tegra_slink_read_rx
        } else {
                unsigned int bits_per_word;
  
 -              bits_per_word = t->bits_per_word ? t->bits_per_word :
 -                                              tspi->cur_spi->bits_per_word;
 +              bits_per_word = t->bits_per_word;
                for (count = 0; count < rx_full_count; count++) {
                        x = tegra_slink_readl(tspi, SLINK_RX_FIFO);
                        for (i = 0; (i < tspi->bytes_per_word); i++)
@@@ -442,7 -444,8 +442,7 @@@ static void tegra_slink_copy_spi_rxbuf_
                unsigned int x;
                unsigned int rx_mask, bits_per_word;
  
 -              bits_per_word = t->bits_per_word ? t->bits_per_word :
 -                                              tspi->cur_spi->bits_per_word;
 +              bits_per_word = t->bits_per_word;
                rx_mask = (1 << bits_per_word) - 1;
                for (count = 0; count < tspi->curr_dma_words; count++) {
                        x = tspi->rx_dma_buf[count];
@@@ -725,7 -728,9 +725,7 @@@ static int tegra_slink_start_transfer_o
        unsigned long command2;
  
        bits_per_word = t->bits_per_word;
 -      speed = t->speed_hz ? t->speed_hz : spi->max_speed_hz;
 -      if (!speed)
 -              speed = tspi->spi_max_frequency;
 +      speed = t->speed_hz;
        if (speed != tspi->cur_speed) {
                clk_set_rate(tspi->clk, speed * 4);
                tspi->cur_speed = speed;
@@@ -836,8 -841,6 +836,8 @@@ static int tegra_slink_setup(struct spi
  
        BUG_ON(spi->chip_select >= MAX_CHIP_SELECT);
  
 +      /* Set speed to the spi max fequency if spi device has not set */
 +      spi->max_speed_hz = spi->max_speed_hz ? : tspi->spi_max_frequency;
        ret = pm_runtime_get_sync(tspi->dev);
        if (ret < 0) {
                dev_err(tspi->dev, "pm runtime failed, e = %d\n", ret);
@@@ -1169,9 -1172,11 +1169,9 @@@ static int tegra_slink_probe(struct pla
                goto exit_free_master;
        }
        tspi->phys = r->start;
 -      tspi->base = devm_request_and_ioremap(&pdev->dev, r);
 -      if (!tspi->base) {
 -              dev_err(&pdev->dev,
 -                      "Cannot request memregion/iomap dma address\n");
 -              ret = -EADDRNOTAVAIL;
 +      tspi->base = devm_ioremap_resource(&pdev->dev, r);
 +      if (IS_ERR(tspi->base)) {
 +              ret = PTR_ERR(tspi->base);
                goto exit_free_master;
        }
  
                goto exit_free_master;
        }
  
-       tspi->clk = devm_clk_get(&pdev->dev, "slink");
+       tspi->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(tspi->clk)) {
                dev_err(&pdev->dev, "can not get clock\n");
                ret = PTR_ERR(tspi->clk);
@@@ -37,8 -37,7 +37,7 @@@
  #include <linux/slab.h>
  #include <linux/spinlock.h>
  #include <linux/workqueue.h>
- #include <mach/clk.h>
+ #include <linux/clk/tegra.h>
  
  #include "nvec.h"
  
@@@ -72,16 -71,9 +71,16 @@@ enum nvec_msg_category  
        NVEC_MSG_TX,
  };
  
 -static const unsigned char EC_DISABLE_EVENT_REPORTING[3] = "\x04\x00\x00";
 -static const unsigned char EC_ENABLE_EVENT_REPORTING[3]  = "\x04\x00\x01";
 -static const unsigned char EC_GET_FIRMWARE_VERSION[2]    = "\x07\x15";
 +enum nvec_sleep_subcmds {
 +      GLOBAL_EVENTS,
 +      AP_PWR_DOWN,
 +      AP_SUSPEND,
 +};
 +
 +#define CNF_EVENT_REPORTING 0x01
 +#define GET_FIRMWARE_VERSION 0x15
 +#define LID_SWITCH BIT(1)
 +#define PWR_BUTTON BIT(15)
  
  static struct nvec_chip *nvec_power_handle;
  
@@@ -324,41 -316,6 +323,41 @@@ struct nvec_msg *nvec_write_sync(struc
  }
  EXPORT_SYMBOL(nvec_write_sync);
  
 +/**
 + * nvec_toggle_global_events - enables or disables global event reporting
 + * @nvec: nvec handle
 + * @state: true for enable, false for disable
 + *
 + * This switches on/off global event reports by the embedded controller.
 + */
 +static void nvec_toggle_global_events(struct nvec_chip *nvec, bool state)
 +{
 +      unsigned char global_events[] = { NVEC_SLEEP, GLOBAL_EVENTS, state };
 +
 +      nvec_write_async(nvec, global_events, 3);
 +}
 +
 +/**
 + * nvec_event_mask - fill the command string with event bitfield
 + * ev: points to event command string
 + * mask: bit to insert into the event mask
 + *
 + * Configure event command expects a 32 bit bitfield which describes
 + * which events to enable. The bitfield has the following structure
 + * (from highest byte to lowest):
 + *    system state bits 7-0
 + *    system state bits 15-8
 + *    oem system state bits 7-0
 + *    oem system state bits 15-8
 + */
 +static void nvec_event_mask(char *ev, u32 mask)
 +{
 +      ev[3] = mask >> 16 && 0xff;
 +      ev[4] = mask >> 24 && 0xff;
 +      ev[5] = mask >> 0  && 0xff;
 +      ev[6] = mask >> 8  && 0xff;
 +}
 +
  /**
   * nvec_request_master - Process outgoing messages
   * @work: A &struct work_struct (the tx_worker member of &struct nvec_chip)
@@@ -753,10 -710,8 +752,10 @@@ static void nvec_disable_i2c_slave(stru
  
  static void nvec_power_off(void)
  {
 -      nvec_write_async(nvec_power_handle, EC_DISABLE_EVENT_REPORTING, 3);
 -      nvec_write_async(nvec_power_handle, "\x04\x01", 2);
 +      char ap_pwr_down[] = { NVEC_SLEEP, AP_PWR_DOWN };
 +
 +      nvec_toggle_global_events(nvec_power_handle, false);
 +      nvec_write_async(nvec_power_handle, ap_pwr_down, 2);
  }
  
  static int tegra_nvec_probe(struct platform_device *pdev)
        struct nvec_msg *msg;
        struct resource *res;
        void __iomem *base;
 +      char    get_firmware_version[] = { NVEC_CNTL, GET_FIRMWARE_VERSION },
 +              unmute_speakers[] = { NVEC_OEM0, 0x10, 0x59, 0x95 },
 +              enable_event[7] = { NVEC_SYS, CNF_EVENT_REPORTING, true };
  
        nvec = devm_kzalloc(&pdev->dev, sizeof(struct nvec_chip), GFP_KERNEL);
        if (nvec == NULL) {
                return -ENODEV;
        }
  
 -      base = devm_request_and_ioremap(&pdev->dev, res);
 -      if (!base) {
 -              dev_err(&pdev->dev, "Can't ioremap I2C region\n");
 -              return -ENOMEM;
 -      }
 +      base = devm_ioremap_resource(&pdev->dev, res);
 +      if (IS_ERR(base))
 +              return PTR_ERR(base);
  
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!res) {
                return -ENODEV;
        }
  
-       i2c_clk = clk_get_sys("tegra-i2c.2", "div-clk");
+       i2c_clk = clk_get(&pdev->dev, "div-clk");
        if (IS_ERR(i2c_clk)) {
                dev_err(nvec->dev, "failed to get controller clock\n");
                return -ENODEV;
  
  
        /* enable event reporting */
 -      nvec_write_async(nvec, EC_ENABLE_EVENT_REPORTING,
 -                       sizeof(EC_ENABLE_EVENT_REPORTING));
 +      nvec_toggle_global_events(nvec, true);
  
        nvec->nvec_status_notifier.notifier_call = nvec_status_notifier;
        nvec_register_notifier(nvec, &nvec->nvec_status_notifier, 0);
        pm_power_off = nvec_power_off;
  
        /* Get Firmware Version */
 -      msg = nvec_write_sync(nvec, EC_GET_FIRMWARE_VERSION,
 -              sizeof(EC_GET_FIRMWARE_VERSION));
 +      msg = nvec_write_sync(nvec, get_firmware_version, 2);
  
        if (msg) {
                dev_warn(nvec->dev, "ec firmware version %02x.%02x.%02x / %02x\n",
                dev_err(nvec->dev, "error adding subdevices\n");
  
        /* unmute speakers? */
 -      nvec_write_async(nvec, "\x0d\x10\x59\x95", 4);
 +      nvec_write_async(nvec, unmute_speakers, 4);
  
        /* enable lid switch event */
 -      nvec_write_async(nvec, "\x01\x01\x01\x00\x00\x02\x00", 7);
 +      nvec_event_mask(enable_event, LID_SWITCH);
 +      nvec_write_async(nvec, enable_event, 7);
  
        /* enable power button event */
 -      nvec_write_async(nvec, "\x01\x01\x01\x00\x00\x80\x00", 7);
 +      nvec_event_mask(enable_event, PWR_BUTTON);
 +      nvec_write_async(nvec, enable_event, 7);
  
        return 0;
  }
@@@ -901,7 -855,7 +900,7 @@@ static int tegra_nvec_remove(struct pla
  {
        struct nvec_chip *nvec = platform_get_drvdata(pdev);
  
 -      nvec_write_async(nvec, EC_DISABLE_EVENT_REPORTING, 3);
 +      nvec_toggle_global_events(nvec, false);
        mfd_remove_devices(nvec->dev);
        cancel_work_sync(&nvec->rx_work);
        cancel_work_sync(&nvec->tx_work);
@@@ -915,14 -869,13 +914,14 @@@ static int nvec_suspend(struct device *
        struct platform_device *pdev = to_platform_device(dev);
        struct nvec_chip *nvec = platform_get_drvdata(pdev);
        struct nvec_msg *msg;
 +      char ap_suspend[] = { NVEC_SLEEP, AP_SUSPEND };
  
        dev_dbg(nvec->dev, "suspending\n");
  
        /* keep these sync or you'll break suspend */
 -      msg = nvec_write_sync(nvec, EC_DISABLE_EVENT_REPORTING, 3);
 -      nvec_msg_free(nvec, msg);
 -      msg = nvec_write_sync(nvec, "\x04\x02", 2);
 +      nvec_toggle_global_events(nvec, false);
 +
 +      msg = nvec_write_sync(nvec, ap_suspend, sizeof(ap_suspend));
        nvec_msg_free(nvec, msg);
  
        nvec_disable_i2c_slave(nvec);
@@@ -937,7 -890,7 +936,7 @@@ static int nvec_resume(struct device *d
  
        dev_dbg(nvec->dev, "resuming\n");
        tegra_init_i2c_slave(nvec);
 -      nvec_write_async(nvec, EC_ENABLE_EVENT_REPORTING, 3);
 +      nvec_toggle_global_events(nvec, true);
  
        return 0;
  }
@@@ -25,7 -25,7 +25,7 @@@
  #include <linux/pm_runtime.h>
  #include <linux/regmap.h>
  #include <linux/slab.h>
- #include <mach/clk.h>
+ #include <linux/clk/tegra.h>
  #include <sound/soc.h>
  #include "tegra30_ahub.h"
  
@@@ -299,15 -299,6 +299,6 @@@ static const char * const configlink_cl
        "spdif_in",
  };
  
- struct of_dev_auxdata ahub_auxdata[] = {
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080300, "tegra30-i2s.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080400, "tegra30-i2s.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080500, "tegra30-i2s.2", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080600, "tegra30-i2s.3", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080700, "tegra30-i2s.4", NULL),
-       {}
- };
  #define LAST_REG(name) \
        (TEGRA30_AHUB_##name + \
         (TEGRA30_AHUB_##name##_STRIDE * TEGRA30_AHUB_##name##_COUNT) - 4)
@@@ -451,7 -442,7 +442,7 @@@ static int tegra30_ahub_probe(struct pl
         * Ensure that here.
         */
        for (i = 0; i < ARRAY_SIZE(configlink_clocks); i++) {
-               clk = clk_get_sys(NULL, configlink_clocks[i]);
+               clk = clk_get(&pdev->dev, configlink_clocks[i]);
                if (IS_ERR(clk)) {
                        dev_err(&pdev->dev, "Can't get clock %s\n",
                                configlink_clocks[i]);
                        goto err_pm_disable;
        }
  
-       of_platform_populate(pdev->dev.of_node, NULL, ahub_auxdata,
-                            &pdev->dev);
+       of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
  
        return 0;
  
@@@ -580,7 -570,7 +570,7 @@@ err_clk_put_apbif
        clk_put(ahub->clk_apbif);
  err_clk_put_d_audio:
        clk_put(ahub->clk_d_audio);
 -      ahub = 0;
 +      ahub = NULL;
  err:
        return ret;
  }
@@@ -597,7 -587,7 +587,7 @@@ static int tegra30_ahub_remove(struct p
        clk_put(ahub->clk_apbif);
        clk_put(ahub->clk_d_audio);
  
 -      ahub = 0;
 +      ahub = NULL;
  
        return 0;
  }