Merge tag 'late-omap' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 1 Mar 2013 04:00:40 +0000 (20:00 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 1 Mar 2013 04:00:40 +0000 (20:00 -0800)
Pull ARM SoC late OMAP changes from Olof Johansson:
 "This branch contains changes for OMAP that came in late during the
  release staging, close to when the merge window opened.

  It contains, among other things:

   - OMAP PM fixes and some patches for audio device integration
   - OMAP clock fixes related to common clock conversion
   - A set of patches cleaning up WFI entry and blocking.
   - A set of fixes and IP block support for PM on TI AM33xx SoCs
     (Beaglebone, etc)
   - A set of smaller fixes and cleanups around AM33xx restart and
     revision detection, as well as removal of some dead code
     (CONFIG_32K_TIMER_HZ)"

* tag 'late-omap' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (34 commits)
  ARM: omap2: include linux/errno.h in hwmod_reset
  ARM: OMAP2+: fix some omap_device_build() calls that aren't compiled by default
  ARM: OMAP4: hwmod data: Enable AESS hwmod device
  ARM: OMAP4: hwmod data: Update AESS data with memory bank area
  ARM: OMAP4+: AESS: enable internal auto-gating during initial setup
  ASoC: TI AESS: add autogating-enable function, callable from architecture code
  ARM: OMAP2+: hwmod: add enable_preprogram hook
  ARM: OMAP4: clock data: Add missing clkdm association for dpll_usb
  ARM: OMAP2+: PM: Fix the dt return condition in pm_late_init()
  ARM: OMAP2: am33xx-hwmod: Fix "register offset NULL check" bug
  ARM: OMAP2+: AM33xx: hwmod: add missing HWMOD_NO_IDLEST flags
  ARM: OMAP: AM33xx hwmod: Add parent-child relationship for PWM subsystem
  ARM: OMAP: AM33xx hwmod: Corrects PWM subsystem HWMOD entries
  ARM: DTS: AM33XX: Add nodes for OCMC RAM and WKUP-M3
  ARM: OMAP2+: AM33XX: Update the hardreset API
  ARM: OMAP2+: AM33XX: hwmod: Update the WKUP-M3 hwmod with reset status bit
  ARM: OMAP2+: AM33XX: hwmod: Fixup cpgmac0 hwmod entry
  ARM: OMAP2+: AM33XX: hwmod: Update TPTC0 hwmod with the right flags
  ARM: OMAP2+: AM33XX: hwmod: Register OCMC RAM hwmod
  ARM: OMAP2+: AM33XX: CM/PRM: Use __ASSEMBLER__ macros in header files
  ...

1  2 
arch/arm/Kconfig
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/board-generic.c
arch/arm/mach-omap2/common.h
arch/arm/mach-omap2/devices.c
arch/arm/mach-omap2/omap_hwmod.c
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
arch/arm/mach-omap2/pm.c
arch/arm/mach-omap2/soc.h
arch/arm/plat-omap/Kconfig
drivers/media/platform/omap3isp/isp.c

diff --combined arch/arm/Kconfig
@@@ -4,7 -4,6 +4,7 @@@ config AR
        select ARCH_BINFMT_ELF_RANDOMIZE_PIE
        select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
        select ARCH_HAVE_CUSTOM_GPIO_H
 +      select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
        select ARCH_WANT_IPC_PARSE_VERSION
        select BUILDTIME_EXTABLE_SORT if MMU
        select CPU_PM if (SUSPEND || CPU_IDLE)
@@@ -37,6 -36,7 +37,6 @@@
        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
@@@ -49,7 -49,6 +49,7 @@@
        select HAVE_REGS_AND_STACK_ACCESS_API
        select HAVE_SYSCALL_TRACEPOINTS
        select HAVE_UID16
 +      select HAVE_VIRT_TO_BUS
        select KTIME_SCALAR
        select PERF_USE_VMALLOC
        select RTC_LIB
@@@ -57,8 -56,6 +57,8 @@@
        select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND
        select MODULES_USE_ELF_REL
        select CLONE_BACKWARDS
 +      select OLD_SIGSUSPEND3
 +      select OLD_SIGACTION
        help
          The ARM series is a line of low-power-consumption RISC chip designs
          licensed by ARM Ltd and targeted at embedded applications and
@@@ -78,27 -75,6 +78,27 @@@ config ARM_DMA_USE_IOMM
        select ARM_HAS_SG_CHAIN
        select NEED_SG_DMA_LENGTH
  
 +if ARM_DMA_USE_IOMMU
 +
 +config ARM_DMA_IOMMU_ALIGNMENT
 +      int "Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers"
 +      range 4 9
 +      default 8
 +      help
 +        DMA mapping framework by default aligns all buffers to the smallest
 +        PAGE_SIZE order which is greater than or equal to the requested buffer
 +        size. This works well for buffers up to a few hundreds kilobytes, but
 +        for larger buffers it just a waste of address space. Drivers which has
 +        relatively small addressing window (like 64Mib) might run out of
 +        virtual space with just a few allocations.
 +
 +        With this parameter you can specify the maximum PAGE_SIZE order for
 +        DMA IOMMU buffers. Larger buffers will be aligned only to this
 +        specified order. The order is expressed as a power of two multiplied
 +        by the PAGE_SIZE.
 +
 +endif
 +
  config HAVE_PWM
        bool
  
@@@ -285,8 -261,7 +285,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"
@@@ -369,10 -344,10 +369,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
@@@ -418,7 -393,6 +418,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
@@@ -666,12 -640,11 +666,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
@@@ -725,7 -698,6 +725,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
@@@ -772,6 -744,7 +772,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
@@@ -814,6 -787,7 +814,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
@@@ -828,6 -802,7 +828,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
@@@ -845,6 -820,7 +845,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
@@@ -862,6 -838,7 +862,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
@@@ -896,6 -873,7 +896,6 @@@ config ARCH_U30
        select COMMON_CLK
        select CPU_ARM926T
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
        select HAVE_TCM
        select SPARSE_IRQ
        help
@@@ -921,12 -899,10 +921,12 @@@ config ARCH_NOMADI
        select ARCH_REQUIRE_GPIOLIB
        select ARM_AMBA
        select ARM_VIC
 +      select CLKSRC_NOMADIK_MTU
        select COMMON_CLK
        select CPU_ARM926T
        select GENERIC_CLOCKEVENTS
        select MIGHT_HAVE_CACHE_L2X0
 +      select USE_OF
        select PINCTRL
        select PINCTRL_STN8815
        select SPARSE_IRQ
@@@ -961,24 -937,33 +961,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_REQUIRE_GPIOLIB
 -      select CLKSRC_MMIO
 -      select GENERIC_CLOCKEVENTS
 -      select HAVE_CLK
 -      help
 -        Support for TI's OMAP platform (OMAP1/2/3/4).
 -
 -config ARCH_VT8500_SINGLE
 -      bool "VIA/WonderMedia 85xx"
 -      select ARCH_HAS_CPUFREQ
 +      select ARCH_OMAP
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
 -      select COMMON_CLK
 -      select CPU_ARM926T
 +      select CLKSRC_MMIO
        select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
 +      select GENERIC_IRQ_CHIP
        select HAVE_CLK
 -      select MULTI_IRQ_HANDLER
 -      select SPARSE_IRQ
 -      select USE_OF
 +      select HAVE_IDE
 +      select IRQ_DOMAIN
 +      select NEED_MACH_IO_H if PCCARD
 +      select NEED_MACH_MEMORY_H
        help
 -        Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip.
 +        Support for older TI OMAP1 (omap7xx, omap15xx or omap16xx)
  
  endchoice
  
@@@ -1101,12 -1086,17 +1101,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"
@@@ -1137,8 -1127,6 +1137,8 @@@ source "arch/arm/mach-versatile/Kconfig
  source "arch/arm/mach-vexpress/Kconfig"
  source "arch/arm/plat-versatile/Kconfig"
  
 +source "arch/arm/mach-virt/Kconfig"
 +
  source "arch/arm/mach-vt8500/Kconfig"
  
  source "arch/arm/mach-w90x900/Kconfig"
@@@ -1462,10 -1450,6 +1462,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
@@@ -1547,6 -1531,7 +1547,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
@@@ -1587,10 -1572,9 +1587,10 @@@ config HAVE_ARM_SC
        help
          This option enables support for the ARM system coherency unit
  
 -config ARM_ARCH_TIMER
 +config HAVE_ARM_ARCH_TIMER
        bool "Architected timer support"
        depends on CPU_V7
 +      select ARM_ARCH_TIMER
        help
          This option enables support for the ARM architected timer
  
@@@ -1636,16 -1620,6 +1636,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
@@@ -1663,7 -1637,7 +1663,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.
@@@ -1676,14 -1650,10 +1676,13 @@@ config H
        int
        default 200 if ARCH_EBSA110 || ARCH_S3C24XX || ARCH_S5P64X0 || \
                ARCH_S5PV210 || ARCH_EXYNOS4
-       default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER
        default AT91_TIMER_HZ if ARCH_AT91
        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
@@@ -1748,7 -1718,7 +1747,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
@@@ -1872,6 -1842,7 +1871,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
@@@ -1888,7 -1859,7 +1887,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.
@@@ -1957,7 -1928,7 +1956,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.
@@@ -1986,7 -1957,7 +1985,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
@@@ -2104,7 -2075,7 +2103,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
@@@ -2126,6 -2097,7 +2125,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
@@@ -2192,7 -2164,7 +2191,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
@@@ -2267,7 -2239,7 +2266,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
@@@ -2349,5 -2321,3 +2348,5 @@@ source "security/Kconfig
  source "crypto/Kconfig"
  
  source "lib/Kconfig"
 +
 +source "arch/arm/kvm/Kconfig"
@@@ -2,16 -2,13 +2,16 @@@
  # Makefile for the linux kernel.
  #
  
 +ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \
 +      -I$(srctree)/arch/arm/plat-omap/include
 +
  # Common support
  obj-y := id.o io.o control.o mux.o devices.o fb.o serial.o gpmc.o timer.o pm.o \
         common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o \
         omap_device.o sram.o
  
  omap-2-3-common                               = irq.o
- hwmod-common                          = omap_hwmod.o \
+ hwmod-common                          = omap_hwmod.o omap_hwmod_reset.o \
                                          omap_hwmod_common_data.o
  clock-common                          = clock.o clock_common_data.o \
                                          clkt_dpll.o clkt_clksel.o
@@@ -56,6 -53,7 +56,7 @@@ AFLAGS_sram34xx.o                     :=-Wa,-march=armv7-
  # Restart code (OMAP4/5 currently in omap4-common.c)
  obj-$(CONFIG_SOC_OMAP2420)            += omap2-restart.o
  obj-$(CONFIG_SOC_OMAP2430)            += omap2-restart.o
+ obj-$(CONFIG_SOC_AM33XX)              += am33xx-restart.o
  obj-$(CONFIG_ARCH_OMAP3)              += omap3-restart.o
  
  # Pin multiplexing
@@@ -223,6 -221,7 +224,6 @@@ endi
  obj-$(CONFIG_MACH_OMAP_GENERIC)               += board-generic.o
  obj-$(CONFIG_MACH_OMAP_H4)            += board-h4.o
  obj-$(CONFIG_MACH_OMAP_2430SDP)               += board-2430sdp.o
 -obj-$(CONFIG_MACH_OMAP_APOLLON)               += board-apollon.o
  obj-$(CONFIG_MACH_OMAP3_BEAGLE)               += board-omap3beagle.o
  obj-$(CONFIG_MACH_DEVKIT8000)         += board-devkit8000.o
  obj-$(CONFIG_MACH_OMAP_LDP)           += board-ldp.o
@@@ -16,6 -16,7 +16,6 @@@
  #include <linux/of_platform.h>
  #include <linux/irqdomain.h>
  
 -#include <asm/hardware/gic.h>
  #include <asm/mach/arch.h>
  
  #include "common.h"
@@@ -64,7 -65,7 +64,7 @@@ DT_MACHINE_START(OMAP242X_DT, "Generic 
        .init_irq       = omap_intc_of_init,
        .handle_irq     = omap2_intc_handle_irq,
        .init_machine   = omap_generic_init,
 -      .timer          = &omap2_timer,
 +      .init_time      = omap2_sync32k_timer_init,
        .dt_compat      = omap242x_boards_compat,
        .restart        = omap2xxx_restart,
  MACHINE_END
@@@ -83,7 -84,7 +83,7 @@@ DT_MACHINE_START(OMAP243X_DT, "Generic 
        .init_irq       = omap_intc_of_init,
        .handle_irq     = omap2_intc_handle_irq,
        .init_machine   = omap_generic_init,
 -      .timer          = &omap2_timer,
 +      .init_time      = omap2_sync32k_timer_init,
        .dt_compat      = omap243x_boards_compat,
        .restart        = omap2xxx_restart,
  MACHINE_END
@@@ -102,7 -103,7 +102,7 @@@ DT_MACHINE_START(OMAP3_DT, "Generic OMA
        .init_irq       = omap_intc_of_init,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap_generic_init,
 -      .timer          = &omap3_timer,
 +      .init_time      = omap3_sync32k_timer_init,
        .dt_compat      = omap3_boards_compat,
        .restart        = omap3xxx_restart,
  MACHINE_END
@@@ -119,7 -120,7 +119,7 @@@ DT_MACHINE_START(OMAP3_GP_DT, "Generic 
        .init_irq       = omap_intc_of_init,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap_generic_init,
 -      .timer          = &omap3_secure_timer,
 +      .init_time      = omap3_secure_sync32k_timer_init,
        .dt_compat      = omap3_gp_boards_compat,
        .restart        = omap3xxx_restart,
  MACHINE_END
@@@ -138,8 -139,9 +138,9 @@@ DT_MACHINE_START(AM33XX_DT, "Generic AM
        .init_irq       = omap_intc_of_init,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap_generic_init,
 -      .timer          = &omap3_am33xx_timer,
 +      .init_time      = omap3_am33xx_gptimer_timer_init,
        .dt_compat      = am33xx_boards_compat,
+       .restart        = am33xx_restart,
  MACHINE_END
  #endif
  
@@@ -155,9 -157,10 +156,9 @@@ DT_MACHINE_START(OMAP4_DT, "Generic OMA
        .map_io         = omap4_map_io,
        .init_early     = omap4430_init_early,
        .init_irq       = omap_gic_of_init,
 -      .handle_irq     = gic_handle_irq,
        .init_machine   = omap_generic_init,
        .init_late      = omap4430_init_late,
 -      .timer          = &omap4_timer,
 +      .init_time      = omap4_local_timer_init,
        .dt_compat      = omap4_boards_compat,
        .restart        = omap44xx_restart,
  MACHINE_END
@@@ -175,8 -178,9 +176,8 @@@ DT_MACHINE_START(OMAP5_DT, "Generic OMA
        .map_io         = omap5_map_io,
        .init_early     = omap5_init_early,
        .init_irq       = omap_gic_of_init,
 -      .handle_irq     = gic_handle_irq,
        .init_machine   = omap_generic_init,
 -      .timer          = &omap5_timer,
 +      .init_time      = omap5_realtime_timer_init,
        .dt_compat      = omap5_boards_compat,
        .restart        = omap44xx_restart,
  MACHINE_END
@@@ -79,13 -79,13 +79,13 @@@ static inline int omap_mux_late_init(vo
  
  extern void omap2_init_common_infrastructure(void);
  
 -extern struct sys_timer omap2_timer;
 -extern struct sys_timer omap3_timer;
 -extern struct sys_timer omap3_secure_timer;
 -extern struct sys_timer omap3_gp_timer;
 -extern struct sys_timer omap3_am33xx_timer;
 -extern struct sys_timer omap4_timer;
 -extern struct sys_timer omap5_timer;
 +extern void omap2_sync32k_timer_init(void);
 +extern void omap3_sync32k_timer_init(void);
 +extern void omap3_secure_sync32k_timer_init(void);
 +extern void omap3_gp_gptimer_timer_init(void);
 +extern void omap3_am33xx_gptimer_timer_init(void);
 +extern void omap4_local_timer_init(void);
 +extern void omap5_realtime_timer_init(void);
  
  void omap2420_init_early(void);
  void omap2430_init_early(void);
@@@ -119,6 -119,14 +119,14 @@@ static inline void omap2xxx_restart(cha
  }
  #endif
  
+ #ifdef CONFIG_SOC_AM33XX
+ void am33xx_restart(char mode, const char *cmd);
+ #else
+ static inline void am33xx_restart(char mode, const char *cmd)
+ {
+ }
+ #endif
  #ifdef CONFIG_ARCH_OMAP3
  void omap3xxx_restart(char mode, const char *cmd);
  #else
@@@ -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>
@@@ -68,7 -67,7 +68,7 @@@ static int __init omap3_l3_init(void
  
        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)
  {
  
        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)
  
@@@ -253,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)
  {
@@@ -426,7 -382,7 +426,7 @@@ static void __init omap_init_hdmi_audio
                return;
        }
  
-       pdev = omap_device_build("omap-hdmi-audio-dai", -1, oh, NULL, 0, 0);
+       pdev = omap_device_build("omap-hdmi-audio-dai", -1, oh, NULL, 0);
        WARN(IS_ERR(pdev),
             "Can't build omap_device for omap-hdmi-audio-dai.\n");
  
@@@ -760,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);
@@@ -2054,6 -2054,23 +2054,23 @@@ static int _omap4_get_context_lost(stru
        return oh->prcm.omap4.context_lost_counter;
  }
  
+ /**
+  * _enable_preprogram - Pre-program an IP block during the _enable() process
+  * @oh: struct omap_hwmod *
+  *
+  * Some IP blocks (such as AESS) require some additional programming
+  * after enable before they can enter idle.  If a function pointer to
+  * do so is present in the hwmod data, then call it and pass along the
+  * return value; otherwise, return 0.
+  */
+ static int __init _enable_preprogram(struct omap_hwmod *oh)
+ {
+       if (!oh->class->enable_preprogram)
+               return 0;
+       return oh->class->enable_preprogram(oh);
+ }
  /**
   * _enable - enable an omap_hwmod
   * @oh: struct omap_hwmod *
@@@ -2160,6 -2177,7 +2177,7 @@@ static int _enable(struct omap_hwmod *o
                                _update_sysc_cache(oh);
                        _enable_sysc(oh);
                }
+               r = _enable_preprogram(oh);
        } else {
                if (soc_ops.disable_module)
                        soc_ops.disable_module(oh);
@@@ -3049,11 -3067,8 +3067,8 @@@ static int _am33xx_assert_hardreset(str
  static int _am33xx_deassert_hardreset(struct omap_hwmod *oh,
                                     struct omap_hwmod_rst_info *ohri)
  {
-       if (ohri->st_shift)
-               pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n",
-                      oh->name, ohri->name);
        return am33xx_prm_deassert_hardreset(ohri->rst_shift,
+                               ohri->st_shift,
                                oh->clkdm->pwrdm.ptr->prcm_offs,
                                oh->prcm.omap4.rstctrl_offs,
                                oh->prcm.omap4.rstst_offs);
@@@ -3311,7 -3326,7 +3326,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
@@@ -322,6 -322,7 +322,7 @@@ static struct omap_hwmod_class_sysconfi
  static struct omap_hwmod_class omap44xx_aess_hwmod_class = {
        .name   = "aess",
        .sysc   = &omap44xx_aess_sysc,
+       .enable_preprogram = omap_hwmod_aess_preprogram,
  };
  
  /* aess */
@@@ -348,7 -349,7 +349,7 @@@ static struct omap_hwmod omap44xx_aess_
        .clkdm_name     = "abe_clkdm",
        .mpu_irqs       = omap44xx_aess_irqs,
        .sdma_reqs      = omap44xx_aess_sdma_reqs,
-       .main_clk       = "aess_fck",
+       .main_clk       = "aess_fclk",
        .prcm = {
                .omap4 = {
                        .clkctrl_offs = OMAP4_CM1_ABE_AESS_CLKCTRL_OFFSET,
@@@ -2702,6 -2703,13 +2703,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,
 -      },
        { }
  };
  
@@@ -4241,6 -4249,27 +4242,27 @@@ static struct omap_hwmod_ocp_if omap44x
  
  static struct omap_hwmod_addr_space omap44xx_aess_addrs[] = {
        {
+               .name           = "dmem",
+               .pa_start       = 0x40180000,
+               .pa_end         = 0x4018ffff
+       },
+       {
+               .name           = "cmem",
+               .pa_start       = 0x401a0000,
+               .pa_end         = 0x401a1fff
+       },
+       {
+               .name           = "smem",
+               .pa_start       = 0x401c0000,
+               .pa_end         = 0x401c5fff
+       },
+       {
+               .name           = "pmem",
+               .pa_start       = 0x401e0000,
+               .pa_end         = 0x401e1fff
+       },
+       {
+               .name           = "mpu",
                .pa_start       = 0x401f1000,
                .pa_end         = 0x401f13ff,
                .flags          = ADDR_TYPE_RT
@@@ -4259,6 -4288,27 +4281,27 @@@ static struct omap_hwmod_ocp_if __maybe
  
  static struct omap_hwmod_addr_space omap44xx_aess_dma_addrs[] = {
        {
+               .name           = "dmem_dma",
+               .pa_start       = 0x49080000,
+               .pa_end         = 0x4908ffff
+       },
+       {
+               .name           = "cmem_dma",
+               .pa_start       = 0x490a0000,
+               .pa_end         = 0x490a1fff
+       },
+       {
+               .name           = "smem_dma",
+               .pa_start       = 0x490c0000,
+               .pa_end         = 0x490c5fff
+       },
+       {
+               .name           = "pmem_dma",
+               .pa_start       = 0x490e0000,
+               .pa_end         = 0x490e1fff
+       },
+       {
+               .name           = "dma",
                .pa_start       = 0x490f1000,
                .pa_end         = 0x490f13ff,
                .flags          = ADDR_TYPE_RT
@@@ -6148,6 -6198,12 +6191,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
 -      },
        { }
  };
  
@@@ -6268,7 -6324,7 +6311,7 @@@ static struct omap_hwmod_ocp_if *omap44
        &omap44xx_l3_main_1__l3_main_3,
        &omap44xx_l3_main_2__l3_main_3,
        &omap44xx_l4_cfg__l3_main_3,
-       /* &omap44xx_aess__l4_abe, */
+       &omap44xx_aess__l4_abe,
        &omap44xx_dsp__l4_abe,
        &omap44xx_l3_main_1__l4_abe,
        &omap44xx_mpu__l4_abe,
        &omap44xx_l4_cfg__l4_wkup,
        &omap44xx_mpu__mpu_private,
        &omap44xx_l4_cfg__ocp_wp_noc,
-       /* &omap44xx_l4_abe__aess, */
-       /* &omap44xx_l4_abe__aess_dma, */
+       &omap44xx_l4_abe__aess,
+       &omap44xx_l4_abe__aess_dma,
        &omap44xx_l3_main_2__c2c,
        &omap44xx_l4_wkup__counter_32k,
        &omap44xx_l4_cfg__ctrl_module_core,
diff --combined arch/arm/mach-omap2/pm.c
@@@ -273,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)
  {
         * a completely different mechanism.
         * Disable this part if a DT blob is available.
         */
-       if (of_have_populated_dt())
-               return 0;
+       if (!of_have_populated_dt()) {
  
-       /* Init the voltage layer */
-       omap_pmic_late_init();
-       omap_voltage_late_init();
+               /* Init the voltage layer */
+               omap_pmic_late_init();
+               omap_voltage_late_init();
  
-       /* Initialize the voltages */
-       omap3_init_voltages();
-       omap4_init_voltages();
+               /* Initialize the voltages */
+               omap3_init_voltages();
+               omap4_init_voltages();
  
-       /* Smartreflex device init */
-       omap_devinit_smartreflex();
+               /* Smartreflex device init */
+               omap_devinit_smartreflex();
+       }
  
  #ifdef CONFIG_SUSPEND
        suspend_set_ops(&omap_pm_ops);
@@@ -42,9 -42,6 +42,9 @@@
  #undef MULTI_OMAP2
  #undef OMAP_NAME
  
 +#ifdef CONFIG_ARCH_MULTIPLATFORM
 +#define MULTI_OMAP2
 +#endif
  #ifdef CONFIG_SOC_OMAP2420
  # ifdef OMAP_NAME
  #  undef  MULTI_OMAP2
@@@ -115,11 -112,6 +115,11 @@@ int omap_type(void)
   */
  unsigned int omap_rev(void);
  
 +static inline int soc_is_omap(void)
 +{
 +      return omap_rev() != 0;
 +}
 +
  /*
   * Get the CPU revision for OMAP devices
   */
@@@ -395,6 -387,7 +395,7 @@@ IS_OMAP_TYPE(3430, 0x3430
  
  #define AM335X_CLASS          0x33500033
  #define AM335X_REV_ES1_0      AM335X_CLASS
+ #define AM335X_REV_ES2_0      (AM335X_CLASS | (0x1 << 8))
  
  #define OMAP443X_CLASS                0x44300044
  #define OMAP4430_REV_ES1_0    (OMAP443X_CLASS | (0x10 << 8))
@@@ -473,26 -466,5 +474,26 @@@ static inline unsigned int omap4_has_ #
  
  OMAP4_HAS_FEATURE(perf_silicon, PERF_SILICON)
  
 +/*
 + * We need to make sure omap initcalls don't run when
 + * multiplatform kernels are booted on other SoCs.
 + */
 +#define omap_initcall(level, fn)              \
 +static int __init __used __##fn(void)         \
 +{                                             \
 +      if (!soc_is_omap())                     \
 +              return 0;                       \
 +      return fn();                            \
 +}                                             \
 +level(__##fn);
 +
 +#define omap_early_initcall(fn)               omap_initcall(early_initcall, fn)
 +#define omap_core_initcall(fn)                omap_initcall(core_initcall, fn)
 +#define omap_postcore_initcall(fn)    omap_initcall(postcore_initcall, fn)
 +#define omap_arch_initcall(fn)                omap_initcall(arch_initcall, fn)
 +#define omap_subsys_initcall(fn)      omap_initcall(subsys_initcall, fn)
 +#define omap_device_initcall(fn)      omap_initcall(device_initcall, fn)
 +#define omap_late_initcall(fn)                omap_initcall(late_initcall, fn)
 +
  #endif        /* __ASSEMBLY__ */
  
@@@ -5,6 -5,36 +5,6 @@@ menu "TI OMAP Common Features
  config ARCH_OMAP_OTG
        bool
  
 -choice
 -      prompt "OMAP System Type"
 -      default ARCH_OMAP2PLUS
 -
 -config ARCH_OMAP1
 -      bool "TI OMAP1"
 -      select CLKDEV_LOOKUP
 -      select CLKSRC_MMIO
 -      select GENERIC_IRQ_CHIP
 -      select HAVE_IDE
 -      select IRQ_DOMAIN
 -      select NEED_MACH_IO_H if PCCARD
 -      select NEED_MACH_MEMORY_H
 -      help
 -        "Systems based on omap7xx, omap15xx or omap16xx"
 -
 -config ARCH_OMAP2PLUS
 -      bool "TI OMAP2/3/4"
 -      select CLKDEV_LOOKUP
 -      select GENERIC_IRQ_CHIP
 -      select OMAP_DM_TIMER
 -      select PINCTRL
 -      select PROC_DEVICETREE if PROC_FS
 -      select SPARSE_IRQ
 -      select USE_OF
 -      help
 -        "Systems based on OMAP2, OMAP3, OMAP4 or OMAP5"
 -
 -endchoice
 -
  comment "OMAP Feature Selections"
  
  config OMAP_DEBUG_DEVICES
@@@ -88,7 -118,7 +88,7 @@@ config OMAP_MUX_WARNING
  
  config OMAP_MBOX_FWK
        tristate "Mailbox framework support"
 -      depends on ARCH_OMAP
 +      depends on ARCH_OMAP && !ARCH_MULTIPLATFORM
        help
          Say Y here if you want to use OMAP Mailbox framework support for
          DSP, IVA1.0 and IVA2 in OMAP1/2/3.
@@@ -147,15 -177,6 +147,6 @@@ config OMAP3_L2_AUX_SECURE_SERVICE_SET_
        help
          PPA routine service ID for setting L2 auxiliary control register.
  
- config OMAP_32K_TIMER_HZ
-       int "Kernel internal timer frequency for 32KHz timer"
-       range 32 1024
-       depends on OMAP_32K_TIMER
-       default "128"
-       help
-         Kernel internal timer frequency should be a divisor of 32768,
-         such as 64 or 128.
  config OMAP_DM_TIMER
        bool "Use dual-mode timer"
        depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS
@@@ -1338,28 -1338,15 +1338,15 @@@ static int isp_enable_clocks(struct isp
  {
        int r;
        unsigned long rate;
-       int divisor;
-       /*
-        * cam_mclk clock chain:
-        *   dpll4 -> dpll4_m5 -> dpll4_m5x2 -> cam_mclk
-        *
-        * In OMAP3630 dpll4_m5x2 != 2 x dpll4_m5 but both are
-        * set to the same value. Hence the rate set for dpll4_m5
-        * has to be twice of what is set on OMAP3430 to get
-        * the required value for cam_mclk
-        */
-       divisor = isp->revision == ISP_REVISION_15_0 ? 1 : 2;
  
        r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_ICK]);
        if (r) {
                dev_err(isp->dev, "failed to enable cam_ick clock\n");
                goto out_clk_enable_ick;
        }
-       r = clk_set_rate(isp->clock[ISP_CLK_DPLL4_M5_CK],
-                        CM_CAM_MCLK_HZ/divisor);
+       r = clk_set_rate(isp->clock[ISP_CLK_CAM_MCLK], CM_CAM_MCLK_HZ);
        if (r) {
-               dev_err(isp->dev, "clk_set_rate for dpll4_m5_ck failed\n");
+               dev_err(isp->dev, "clk_set_rate for cam_mclk failed\n");
                goto out_clk_enable_mclk;
        }
        r = clk_prepare_enable(isp->clock[ISP_CLK_CAM_MCLK]);
@@@ -1401,20 -1388,32 +1388,19 @@@ static void isp_disable_clocks(struct i
  static const char *isp_clocks[] = {
        "cam_ick",
        "cam_mclk",
-       "dpll4_m5_ck",
        "csi2_96m_fck",
        "l3_ick",
  };
  
 -static void isp_put_clocks(struct isp_device *isp)
 -{
 -      unsigned int i;
 -
 -      for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) {
 -              if (isp->clock[i]) {
 -                      clk_put(isp->clock[i]);
 -                      isp->clock[i] = NULL;
 -              }
 -      }
 -}
 -
  static int isp_get_clocks(struct isp_device *isp)
  {
        struct clk *clk;
        unsigned int i;
  
        for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) {
 -              clk = clk_get(isp->dev, isp_clocks[i]);
 +              clk = devm_clk_get(isp->dev, isp_clocks[i]);
                if (IS_ERR(clk)) {
                        dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]);
 -                      isp_put_clocks(isp);
                        return PTR_ERR(clk);
                }
  
@@@ -1980,6 -1979,7 +1966,6 @@@ error_csiphy
  static int isp_remove(struct platform_device *pdev)
  {
        struct isp_device *isp = platform_get_drvdata(pdev);
 -      int i;
  
        isp_unregister_entities(isp);
        isp_cleanup_modules(isp);
        isp->domain = NULL;
        omap3isp_put(isp);
  
 -      free_irq(isp->irq_num, isp);
 -      isp_put_clocks(isp);
 -
 -      for (i = 0; i < OMAP3_ISP_IOMEM_LAST; i++) {
 -              if (isp->mmio_base[i]) {
 -                      iounmap(isp->mmio_base[i]);
 -                      isp->mmio_base[i] = NULL;
 -              }
 -
 -              if (isp->mmio_base_phys[i]) {
 -                      release_mem_region(isp->mmio_base_phys[i],
 -                                         isp->mmio_size[i]);
 -                      isp->mmio_base_phys[i] = 0;
 -              }
 -      }
 -
 -      regulator_put(isp->isp_csiphy1.vdd);
 -      regulator_put(isp->isp_csiphy2.vdd);
 -      kfree(isp);
 -
        return 0;
  }
  
@@@ -2007,8 -2027,7 +1993,8 @@@ static int isp_map_mem_resource(struct 
                return -ENODEV;
        }
  
 -      if (!request_mem_region(mem->start, resource_size(mem), pdev->name)) {
 +      if (!devm_request_mem_region(isp->dev, mem->start, resource_size(mem),
 +                                   pdev->name)) {
                dev_err(isp->dev,
                        "cannot reserve camera register I/O region\n");
                return -ENODEV;
        isp->mmio_size[res] = resource_size(mem);
  
        /* map the region */
 -      isp->mmio_base[res] = ioremap_nocache(isp->mmio_base_phys[res],
 -                                            isp->mmio_size[res]);
 +      isp->mmio_base[res] = devm_ioremap_nocache(isp->dev,
 +                                                 isp->mmio_base_phys[res],
 +                                                 isp->mmio_size[res]);
        if (!isp->mmio_base[res]) {
                dev_err(isp->dev, "cannot map camera register I/O region\n");
                return -ENODEV;
@@@ -2049,7 -2067,7 +2035,7 @@@ static int isp_probe(struct platform_de
        if (pdata == NULL)
                return -EINVAL;
  
 -      isp = kzalloc(sizeof(*isp), GFP_KERNEL);
 +      isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL);
        if (!isp) {
                dev_err(&pdev->dev, "could not allocate memory\n");
                return -ENOMEM;
        platform_set_drvdata(pdev, isp);
  
        /* Regulators */
 -      isp->isp_csiphy1.vdd = regulator_get(&pdev->dev, "VDD_CSIPHY1");
 -      isp->isp_csiphy2.vdd = regulator_get(&pdev->dev, "VDD_CSIPHY2");
 +      isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY1");
 +      isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY2");
  
        /* Clocks
         *
                goto detach_dev;
        }
  
 -      if (request_irq(isp->irq_num, isp_isr, IRQF_SHARED, "OMAP3 ISP", isp)) {
 +      if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED,
 +                           "OMAP3 ISP", isp)) {
                dev_err(isp->dev, "Unable to request IRQ\n");
                ret = -EINVAL;
                goto detach_dev;
        /* Entities */
        ret = isp_initialize_modules(isp);
        if (ret < 0)
 -              goto error_irq;
 +              goto detach_dev;
  
        ret = isp_register_entities(isp);
        if (ret < 0)
  
  error_modules:
        isp_cleanup_modules(isp);
 -error_irq:
 -      free_irq(isp->irq_num, isp);
  detach_dev:
        iommu_detach_device(isp->domain, &pdev->dev);
  free_domain:
  error_isp:
        omap3isp_put(isp);
  error:
 -      isp_put_clocks(isp);
 -
 -      for (i = 0; i < OMAP3_ISP_IOMEM_LAST; i++) {
 -              if (isp->mmio_base[i]) {
 -                      iounmap(isp->mmio_base[i]);
 -                      isp->mmio_base[i] = NULL;
 -              }
 -
 -              if (isp->mmio_base_phys[i]) {
 -                      release_mem_region(isp->mmio_base_phys[i],
 -                                         isp->mmio_size[i]);
 -                      isp->mmio_base_phys[i] = 0;
 -              }
 -      }
 -      regulator_put(isp->isp_csiphy2.vdd);
 -      regulator_put(isp->isp_csiphy1.vdd);
        platform_set_drvdata(pdev, NULL);
  
        mutex_destroy(&isp->isp_mutex);
 -      kfree(isp);
  
        return ret;
  }