]> Git Repo - linux.git/commitdiff
Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm
authorLinus Torvalds <[email protected]>
Sun, 7 Oct 2012 12:20:57 +0000 (21:20 +0900)
committerLinus Torvalds <[email protected]>
Sun, 7 Oct 2012 12:20:57 +0000 (21:20 +0900)
Pull ARM updates from Russell King:
 "This is the first chunk of ARM updates for this merge window.
  Conflicts are expected in two files - asm/timex.h and
  mach-integrator/integrator_cp.c.  Nothing particularly stands out more
  than anything else.

  Most of the growth is down to the opcodes stuff from Dave Martin,
  which is countered by Rob's patches to use more of the asm-generic
  headers on ARM."

(A few more conflicts grew since then, but it all looked fairly trivial)

* 'for-linus' of git://git.linaro.org/people/rmk/linux-arm: (44 commits)
  ARM: 7548/1: include linux/sched.h in syscall.h
  ARM: 7541/1: Add ARM ERRATA 775420 workaround
  ARM: ensure vm_struct has its phys_addr member filled in
  ARM: 7540/1: kexec: Check segment memory addresses
  ARM: 7539/1: kexec: scan for dtb magic in segments
  ARM: 7538/1: delay: add registration mechanism for delay timer sources
  ARM: 7536/1: smp: Formalize an IPI for wakeup
  ARM: 7525/1: ptrace: use updated syscall number for syscall auditing
  ARM: 7524/1: support syscall tracing
  ARM: 7519/1: integrator: convert platform devices to Device Tree
  ARM: 7518/1: integrator: convert AMBA devices to device tree
  ARM: 7517/1: integrator: initial device tree support
  ARM: 7516/1: plat-versatile: add DT support to FPGA IRQ
  ARM: 7515/1: integrator: check PL010 base address from resource
  ARM: 7514/1: integrator: call common init function from machine
  ARM: 7522/1: arch_timers: register a time/cycle counter
  ARM: 7523/1: arch_timers: enable the use of the virtual timer
  ARM: 7531/1: mark kernelmode mem{cpy,set} non-experimental
  ARM: 7520/1: Build dtb files in all target
  ARM: Fix build warning in arch/arm/mm/alignment.c
  ...

14 files changed:
1  2 
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/include/asm/io.h
arch/arm/include/asm/timex.h
arch/arm/kernel/Makefile
arch/arm/kernel/setup.c
arch/arm/kernel/smp.c
arch/arm/mach-exynos/platsmp.c
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-shmobile/smp-emev2.c
arch/arm/mm/cache-l2x0.c
arch/arm/mm/ioremap.c

diff --combined arch/arm/Kconfig
index 8ac460a8f4ca64dfd33238af132775bac1a6d6dd,117e81b12009fe3872eaf4828c24ecf38e58140c..6d2f7f5c0036fee1d6d2a033d6ea3e1cc6729235
@@@ -16,6 -16,7 +16,7 @@@ config AR
        select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
        select HAVE_ARCH_KGDB
        select HAVE_ARCH_TRACEHOOK
+       select HAVE_SYSCALL_TRACEPOINTS
        select HAVE_KPROBES if !XIP_KERNEL
        select HAVE_KRETPROBES if (HAVE_KPROBES)
        select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
@@@ -202,13 -203,6 +203,13 @@@ config ARM_PATCH_PHYS_VIR
          this feature (eg, building a kernel for a single machine) and
          you need to shrink the kernel to the minimal size.
  
 +config NEED_MACH_GPIO_H
 +      bool
 +      help
 +        Select this when mach/gpio.h is required to provide special
 +        definitions for this platform. The need for mach/gpio.h should
 +        be avoided when possible.
 +
  config NEED_MACH_IO_H
        bool
        help
@@@ -254,29 -248,39 +255,29 @@@ config MM
  #
  choice
        prompt "ARM system type"
 -      default ARCH_VERSATILE
 +      default ARCH_MULTIPLATFORM
  
 -config ARCH_SOCFPGA
 -      bool "Altera SOCFPGA family"
 -      select ARCH_WANT_OPTIONAL_GPIOLIB
 -      select ARM_AMBA
 -      select ARM_GIC
 -      select CACHE_L2X0
 -      select CLKDEV_LOOKUP
 +config ARCH_MULTIPLATFORM
 +      bool "Allow multiple platforms to be selected"
 +      select ARM_PATCH_PHYS_VIRT
 +      select AUTO_ZRELADDR
        select COMMON_CLK
 -      select CPU_V7
 -      select DW_APB_TIMER
 -      select DW_APB_TIMER_OF
 -      select GENERIC_CLOCKEVENTS
 -      select GPIO_PL061 if GPIOLIB
 -      select HAVE_ARM_SCU
 +      select MULTI_IRQ_HANDLER
        select SPARSE_IRQ
        select USE_OF
 -      help
 -        This enables support for Altera SOCFPGA Cyclone V platform
 +      depends on MMU
  
  config ARCH_INTEGRATOR
        bool "ARM Ltd. Integrator family"
        select ARM_AMBA
        select ARCH_HAS_CPUFREQ
        select COMMON_CLK
 -      select CLK_VERSATILE
 +      select COMMON_CLK_VERSATILE
        select HAVE_TCM
        select ICST
        select GENERIC_CLOCKEVENTS
        select PLAT_VERSATILE
        select PLAT_VERSATILE_FPGA_IRQ
 -      select NEED_MACH_IO_H
        select NEED_MACH_MEMORY_H
        select SPARSE_IRQ
        select MULTI_IRQ_HANDLER
  config ARCH_REALVIEW
        bool "ARM Ltd. RealView family"
        select ARM_AMBA
 -      select CLKDEV_LOOKUP
 -      select HAVE_MACH_CLKDEV
 +      select COMMON_CLK
 +      select COMMON_CLK_VERSATILE
        select ICST
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
        select PLAT_VERSATILE
 -      select PLAT_VERSATILE_CLOCK
        select PLAT_VERSATILE_CLCD
        select ARM_TIMER_SP804
        select GPIO_PL061 if GPIOLIB
@@@ -308,6 -313,7 +309,6 @@@ config ARCH_VERSATIL
        select ICST
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
 -      select NEED_MACH_IO_H if PCI
        select PLAT_VERSATILE
        select PLAT_VERSATILE_CLOCK
        select PLAT_VERSATILE_CLCD
        help
          This enables support for ARM Ltd Versatile board.
  
 -config ARCH_VEXPRESS
 -      bool "ARM Ltd. Versatile Express family"
 -      select ARCH_WANT_OPTIONAL_GPIOLIB
 -      select ARM_AMBA
 -      select ARM_TIMER_SP804
 -      select CLKDEV_LOOKUP
 -      select COMMON_CLK
 -      select GENERIC_CLOCKEVENTS
 -      select HAVE_CLK
 -      select HAVE_PATA_PLATFORM
 -      select ICST
 -      select NO_IOPORT
 -      select PLAT_VERSATILE
 -      select PLAT_VERSATILE_CLCD
 -      select REGULATOR_FIXED_VOLTAGE if REGULATOR
 -      help
 -        This enables support for the ARM Ltd Versatile Express boards.
 -
  config ARCH_AT91
        bool "Atmel AT91"
        select ARCH_REQUIRE_GPIOLIB
        select HAVE_CLK
        select CLKDEV_LOOKUP
        select IRQ_DOMAIN
 +      select NEED_MACH_GPIO_H
        select NEED_MACH_IO_H if PCCARD
        help
          This enables support for systems based on Atmel
          AT91RM9200 and AT91SAM9* processors.
  
 -config ARCH_BCMRING
 -      bool "Broadcom BCMRING"
 -      depends on MMU
 -      select CPU_V6
 -      select ARM_AMBA
 -      select ARM_TIMER_SP804
 -      select CLKDEV_LOOKUP
 -      select GENERIC_CLOCKEVENTS
 -      select ARCH_WANT_OPTIONAL_GPIOLIB
 -      help
 -        Support for Broadcom's BCMRing platform.
 -
 -config ARCH_HIGHBANK
 -      bool "Calxeda Highbank-based"
 +config ARCH_BCM2835
 +      bool "Broadcom BCM2835 family"
        select ARCH_WANT_OPTIONAL_GPIOLIB
        select ARM_AMBA
 -      select ARM_GIC
 +      select ARM_ERRATA_411920
        select ARM_TIMER_SP804
 -      select CACHE_L2X0
        select CLKDEV_LOOKUP
        select COMMON_CLK
 -      select CPU_V7
 +      select CPU_V6
        select GENERIC_CLOCKEVENTS
 -      select HAVE_ARM_SCU
 -      select HAVE_SMP
 +      select MULTI_IRQ_HANDLER
        select SPARSE_IRQ
        select USE_OF
        help
 -        Support for the Calxeda Highbank SoC based boards.
 +        This enables support for the Broadcom BCM2835 SoC. This SoC is
 +        use in the Raspberry Pi, and Roku 2 devices.
  
  config ARCH_CLPS711X
        bool "Cirrus Logic CLPS711x/EP721x/EP731x-based"
        select CPU_ARM720T
        select ARCH_USES_GETTIMEOFFSET
 +      select COMMON_CLK
 +      select CLKDEV_LOOKUP
        select NEED_MACH_MEMORY_H
        help
          Support for Cirrus Logic 711x/721x/731x based boards.
@@@ -374,19 -408,21 +375,19 @@@ config ARCH_GEMIN
        help
          Support for the Cortina Systems Gemini family SoCs
  
 -config ARCH_PRIMA2
 -      bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
 -      select CPU_V7
 +config ARCH_SIRF
 +      bool "CSR SiRF"
        select NO_IOPORT
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
 -      select CLKDEV_LOOKUP
 +      select COMMON_CLK
        select GENERIC_IRQ_CHIP
        select MIGHT_HAVE_CACHE_L2X0
        select PINCTRL
        select PINCTRL_SIRF
        select USE_OF
 -      select ZONE_DMA
        help
 -          Support for CSR SiRFSoC ARM Cortex A9 Platform
 +        Support for CSR SiRFprimaII/Marco/Polo platforms
  
  config ARCH_EBSA110
        bool "EBSA-110"
@@@ -421,7 -457,7 +422,7 @@@ config ARCH_FOOTBRIDG
        select FOOTBRIDGE
        select GENERIC_CLOCKEVENTS
        select HAVE_IDE
 -      select NEED_MACH_IO_H
 +      select NEED_MACH_IO_H if !MMU
        select NEED_MACH_MEMORY_H
        help
          Support for systems based on the DC21285 companion chip
@@@ -448,9 -484,7 +449,9 @@@ config ARCH_MX
        select CLKSRC_MMIO
        select COMMON_CLK
        select HAVE_CLK_PREPARE
 +      select MULTI_IRQ_HANDLER
        select PINCTRL
 +      select SPARSE_IRQ
        select USE_OF
        help
          Support for Freescale MXS-based family of processors
@@@ -480,6 -514,7 +481,6 @@@ config ARCH_IOP13X
        select PCI
        select ARCH_SUPPORTS_MSI
        select VMSPLIT_1G
 -      select NEED_MACH_IO_H
        select NEED_MACH_MEMORY_H
        select NEED_RET_TO_USER
        help
@@@ -489,7 -524,6 +490,7 @@@ config ARCH_IOP32
        bool "IOP32x-based"
        depends on MMU
        select CPU_XSCALE
 +      select NEED_MACH_GPIO_H
        select NEED_MACH_IO_H
        select NEED_RET_TO_USER
        select PLAT_IOP
@@@ -503,7 -537,6 +504,7 @@@ config ARCH_IOP33
        bool "IOP33x-based"
        depends on MMU
        select CPU_XSCALE
 +      select NEED_MACH_GPIO_H
        select NEED_MACH_IO_H
        select NEED_RET_TO_USER
        select PLAT_IOP
@@@ -526,14 -559,26 +527,14 @@@ config ARCH_IXP4X
        help
          Support for Intel's IXP4XX (XScale) family of processors.
  
 -config ARCH_MVEBU
 -      bool "Marvell SOCs with Device Tree support"
 -      select GENERIC_CLOCKEVENTS
 -      select MULTI_IRQ_HANDLER
 -      select SPARSE_IRQ
 -      select CLKSRC_MMIO
 -      select GENERIC_IRQ_CHIP
 -      select IRQ_DOMAIN
 -      select COMMON_CLK
 -      help
 -        Support for the Marvell SoC Family with device tree support
 -
  config ARCH_DOVE
        bool "Marvell Dove"
        select CPU_V7
 -      select PCI
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
 -      select NEED_MACH_IO_H
 -      select PLAT_ORION
 +      select MIGHT_HAVE_PCI
 +      select PLAT_ORION_LEGACY
 +      select USB_ARCH_HAS_EHCI
        help
          Support for the Marvell Dove SoC 88AP510
  
@@@ -543,7 -588,8 +544,7 @@@ config ARCH_KIRKWOO
        select PCI
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
 -      select NEED_MACH_IO_H
 -      select PLAT_ORION
 +      select PLAT_ORION_LEGACY
        help
          Support for the following Marvell Kirkwood series SoCs:
          88F6180, 88F6192 and 88F6281.
@@@ -569,7 -615,8 +570,7 @@@ config ARCH_MV78XX
        select PCI
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
 -      select NEED_MACH_IO_H
 -      select PLAT_ORION
 +      select PLAT_ORION_LEGACY
        help
          Support for the following Marvell MV78xx0 series SoCs:
          MV781x0, MV782x0.
@@@ -581,7 -628,8 +582,7 @@@ config ARCH_ORION5
        select PCI
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
 -      select NEED_MACH_IO_H
 -      select PLAT_ORION
 +      select PLAT_ORION_LEGACY
        help
          Support for the following Marvell Orion 5x series SoCs:
          Orion-1 (5181), Orion-VoIP (5181L), Orion-NAS (5182),
@@@ -598,7 -646,6 +599,7 @@@ config ARCH_MM
        select PLAT_PXA
        select SPARSE_IRQ
        select GENERIC_ALLOCATOR
 +      select NEED_MACH_GPIO_H
        help
          Support for Marvell's PXA168/PXA910(MMP) and MMP2 processor line.
  
@@@ -606,9 -653,8 +607,9 @@@ config ARCH_KS869
        bool "Micrel/Kendin KS8695"
        select CPU_ARM922T
        select ARCH_REQUIRE_GPIOLIB
 -      select ARCH_USES_GETTIMEOFFSET
        select NEED_MACH_MEMORY_H
 +      select CLKSRC_MMIO
 +      select GENERIC_CLOCKEVENTS
        help
          Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based
          System-on-Chip devices.
@@@ -638,13 -684,40 +639,13 @@@ config ARCH_TEGR
        select HAVE_CLK
        select HAVE_SMP
        select MIGHT_HAVE_CACHE_L2X0
 -      select NEED_MACH_IO_H if PCI
        select ARCH_HAS_CPUFREQ
        select USE_OF
 +      select COMMON_CLK
        help
          This enables support for NVIDIA Tegra based systems (Tegra APX,
          Tegra 6xx and Tegra 2 series).
  
 -config ARCH_PICOXCELL
 -      bool "Picochip picoXcell"
 -      select ARCH_REQUIRE_GPIOLIB
 -      select ARM_PATCH_PHYS_VIRT
 -      select ARM_VIC
 -      select CPU_V6K
 -      select DW_APB_TIMER
 -      select DW_APB_TIMER_OF
 -      select GENERIC_CLOCKEVENTS
 -      select GENERIC_GPIO
 -      select HAVE_TCM
 -      select NO_IOPORT
 -      select SPARSE_IRQ
 -      select USE_OF
 -      help
 -        This enables support for systems based on the Picochip picoXcell
 -        family of Femtocell devices.  The picoxcell support requires device tree
 -        for all boards.
 -
 -config ARCH_PNX4008
 -      bool "Philips Nexperia PNX4008 Mobile"
 -      select CPU_ARM926T
 -      select CLKDEV_LOOKUP
 -      select ARCH_USES_GETTIMEOFFSET
 -      help
 -        This enables support for Philips PNX4008 mobile platform.
 -
  config ARCH_PXA
        bool "PXA2xx/PXA3xx-based"
        depends on MMU
        select MULTI_IRQ_HANDLER
        select ARM_CPU_SUSPEND if PM
        select HAVE_IDE
 +      select NEED_MACH_GPIO_H
        help
          Support for Intel/Marvell's PXA2xx/PXA3xx processor line.
  
@@@ -724,7 -796,6 +725,7 @@@ config ARCH_SA110
        select CLKDEV_LOOKUP
        select ARCH_REQUIRE_GPIOLIB
        select HAVE_IDE
 +      select NEED_MACH_GPIO_H
        select NEED_MACH_MEMORY_H
        select SPARSE_IRQ
        help
@@@ -740,7 -811,6 +741,7 @@@ config ARCH_S3C24X
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C_RTC if RTC_CLASS
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
 +      select NEED_MACH_GPIO_H
        select NEED_MACH_IO_H
        help
          Samsung S3C2410, S3C2412, S3C2413, S3C2416, S3C2440, S3C2442, S3C2443
@@@ -768,7 -838,6 +769,7 @@@ config ARCH_S3C64X
        select SAMSUNG_GPIOLIB_4BIT
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
 +      select NEED_MACH_GPIO_H
        help
          Samsung S3C64XX series based systems
  
@@@ -783,7 -852,6 +784,7 @@@ config ARCH_S5P64X
        select GENERIC_CLOCKEVENTS
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C_RTC if RTC_CLASS
 +      select NEED_MACH_GPIO_H
        help
          Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440,
          SMDK6450.
@@@ -798,7 -866,6 +799,7 @@@ config ARCH_S5PC10
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C_RTC if RTC_CLASS
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
 +      select NEED_MACH_GPIO_H
        help
          Samsung S5PC100 series based systems
  
@@@ -816,7 -883,6 +817,7 @@@ config ARCH_S5PV21
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C_RTC if RTC_CLASS
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
 +      select NEED_MACH_GPIO_H
        select NEED_MACH_MEMORY_H
        help
          Samsung S5PV210/S5PC110 series based systems
@@@ -834,7 -900,6 +835,7 @@@ config ARCH_EXYNO
        select HAVE_S3C_RTC if RTC_CLASS
        select HAVE_S3C2410_I2C if I2C
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
 +      select NEED_MACH_GPIO_H
        select NEED_MACH_MEMORY_H
        help
          Support for SAMSUNG's EXYNOS SoCs (EXYNOS4/5)
@@@ -848,6 -913,7 +849,6 @@@ config ARCH_SHAR
        select PCI
        select ARCH_USES_GETTIMEOFFSET
        select NEED_MACH_MEMORY_H
 -      select NEED_MACH_IO_H
        help
          Support for the StrongARM based Digital DNARD machine, also known
          as "Shark" (<http://www.shark-linux.de/shark.html>).
@@@ -866,7 -932,6 +867,7 @@@ config ARCH_U30
        select COMMON_CLK
        select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
 +      select SPARSE_IRQ
        help
          Support for ST-Ericsson U300 series mobile platforms.
  
@@@ -892,7 -957,6 +893,7 @@@ config ARCH_NOMADI
        select COMMON_CLK
        select GENERIC_CLOCKEVENTS
        select PINCTRL
 +      select PINCTRL_STN8815
        select MIGHT_HAVE_CACHE_L2X0
        select ARCH_REQUIRE_GPIOLIB
        help
@@@ -908,7 -972,6 +909,7 @@@ config ARCH_DAVINC
        select GENERIC_ALLOCATOR
        select GENERIC_IRQ_CHIP
        select ARCH_HAS_HOLES_MEMORYMODEL
 +      select NEED_MACH_GPIO_H
        help
          Support for TI's DaVinci platform.
  
@@@ -921,7 -984,6 +922,7 @@@ config ARCH_OMA
        select CLKSRC_MMIO
        select GENERIC_CLOCKEVENTS
        select ARCH_HAS_HOLES_MEMORYMODEL
 +      select NEED_MACH_GPIO_H
        help
          Support for TI's OMAP platform (OMAP1/2/3/4).
  
@@@ -944,10 -1006,6 +945,10 @@@ config ARCH_VT850
        select ARCH_HAS_CPUFREQ
        select GENERIC_CLOCKEVENTS
        select ARCH_REQUIRE_GPIOLIB
 +      select USE_OF
 +      select COMMON_CLK
 +      select HAVE_CLK
 +      select CLKDEV_LOOKUP
        help
          Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip.
  
@@@ -965,50 -1023,6 +966,50 @@@ config ARCH_ZYN
          Support for Xilinx Zynq ARM Cortex A9 Platform
  endchoice
  
 +menu "Multiple platform selection"
 +      depends on ARCH_MULTIPLATFORM
 +
 +comment "CPU Core family selection"
 +
 +config ARCH_MULTI_V4
 +      bool "ARMv4 based platforms (FA526, StrongARM)"
 +      select ARCH_MULTI_V4_V5
 +      depends on !ARCH_MULTI_V6_V7
 +
 +config ARCH_MULTI_V4T
 +      bool "ARMv4T based platforms (ARM720T, ARM920T, ...)"
 +      select ARCH_MULTI_V4_V5
 +      depends on !ARCH_MULTI_V6_V7
 +
 +config ARCH_MULTI_V5
 +      bool "ARMv5 based platforms (ARM926T, XSCALE, PJ1, ...)"
 +      select ARCH_MULTI_V4_V5
 +      depends on !ARCH_MULTI_V6_V7
 +
 +config ARCH_MULTI_V4_V5
 +      bool
 +
 +config ARCH_MULTI_V6
 +      bool "ARMv6 based platforms (ARM11, Scorpion, ...)"
 +      select CPU_V6
 +      select ARCH_MULTI_V6_V7
 +
 +config ARCH_MULTI_V7
 +      bool "ARMv7 based platforms (Cortex-A, PJ4, Krait)"
 +      select CPU_V7
 +      select ARCH_VEXPRESS
 +      default y
 +      select ARCH_MULTI_V6_V7
 +
 +config ARCH_MULTI_V6_V7
 +      bool
 +
 +config ARCH_MULTI_CPU_AUTO
 +      def_bool !(ARCH_MULTI_V4 || ARCH_MULTI_V4T || ARCH_MULTI_V6_V7)
 +      select ARCH_MULTI_V5
 +
 +endmenu
 +
  #
  # This is sorted alphabetically by mach-* pathname.  However, plat-*
  # Kconfigs may be included either alphabetically (according to the
@@@ -1018,6 -1032,8 +1019,6 @@@ source "arch/arm/mach-mvebu/Kconfig
  
  source "arch/arm/mach-at91/Kconfig"
  
 -source "arch/arm/mach-bcmring/Kconfig"
 -
  source "arch/arm/mach-clps711x/Kconfig"
  
  source "arch/arm/mach-cns3xxx/Kconfig"
@@@ -1034,8 -1050,6 +1035,8 @@@ source "arch/arm/mach-gemini/Kconfig
  
  source "arch/arm/mach-h720x/Kconfig"
  
 +source "arch/arm/mach-highbank/Kconfig"
 +
  source "arch/arm/mach-integrator/Kconfig"
  
  source "arch/arm/mach-iop32x/Kconfig"
@@@ -1071,8 -1085,6 +1072,8 @@@ source "arch/arm/mach-omap2/Kconfig
  
  source "arch/arm/mach-orion5x/Kconfig"
  
 +source "arch/arm/mach-picoxcell/Kconfig"
 +
  source "arch/arm/mach-pxa/Kconfig"
  source "arch/arm/plat-pxa/Kconfig"
  
@@@ -1085,8 -1097,6 +1086,8 @@@ 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"
@@@ -1109,8 -1119,6 +1110,8 @@@ source "arch/arm/mach-exynos/Kconfig
  
  source "arch/arm/mach-shmobile/Kconfig"
  
 +source "arch/arm/mach-prima2/Kconfig"
 +
  source "arch/arm/mach-tegra/Kconfig"
  
  source "arch/arm/mach-u300/Kconfig"
@@@ -1122,6 -1130,8 +1123,6 @@@ source "arch/arm/mach-versatile/Kconfig
  source "arch/arm/mach-vexpress/Kconfig"
  source "arch/arm/plat-versatile/Kconfig"
  
 -source "arch/arm/mach-vt8500/Kconfig"
 -
  source "arch/arm/mach-w90x900/Kconfig"
  
  # Definitions to make life easier
@@@ -1139,10 -1149,6 +1140,10 @@@ config PLAT_ORIO
        select IRQ_DOMAIN
        select COMMON_CLK
  
 +config PLAT_ORION_LEGACY
 +      bool
 +      select PLAT_ORION
 +
  config PLAT_PXA
        bool
  
@@@ -1174,6 -1180,12 +1175,6 @@@ config XSCALE_PM
        depends on CPU_XSCALE
        default y
  
 -config CPU_HAS_PMU
 -      depends on (CPU_V6 || CPU_V6K || CPU_V7 || XSCALE_PMU) && \
 -                 (!ARCH_OMAP3 || OMAP3_EMU)
 -      default y
 -      bool
 -
  config MULTI_IRQ_HANDLER
        bool
        help
@@@ -1402,6 -1414,16 +1403,16 @@@ config PL310_ERRATA_76941
          on systems with an outer cache, the store buffer is drained
          explicitly.
  
+ config ARM_ERRATA_775420
+        bool "ARM errata: A data cache maintenance operation which aborts, might lead to deadlock"
+        depends on CPU_V7
+        help
+        This option enables the workaround for the 775420 Cortex-A9 (r2p2,
+        r2p6,r2p8,r2p10,r3p0) erratum. In case a date cache maintenance
+        operation aborts with MMU exception, it might cause the processor
+        to deadlock. This workaround puts DSB before executing ISB if
+        an abort may occur on cache maintenance.
  endmenu
  
  source "arch/arm/common/Kconfig"
@@@ -1612,7 -1634,6 +1623,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 0
        help
          Maximum number of GPIOs in the system.
@@@ -1747,7 -1768,7 +1758,7 @@@ config HIGHPT
  
  config HW_PERF_EVENTS
        bool "Enable hardware performance counter support for perf events"
 -      depends on PERF_EVENTS && CPU_HAS_PMU
 +      depends on PERF_EVENTS
        default y
        help
          Enable hardware performance counter support for perf events. If
@@@ -1771,6 -1792,59 +1782,6 @@@ config FORCE_MAX_ZONEORDE
          This config option is actually maximum order plus one. For example,
          a value of 11 means that the largest free memory block is 2^10 pages.
  
 -config LEDS
 -      bool "Timer and CPU usage LEDs"
 -      depends on ARCH_CDB89712 || ARCH_EBSA110 || \
 -                 ARCH_EBSA285 || ARCH_INTEGRATOR || \
 -                 ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
 -                 ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
 -                 ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
 -                 ARCH_AT91 || ARCH_DAVINCI || \
 -                 ARCH_KS8695 || MACH_RD88F5182 || ARCH_REALVIEW
 -      help
 -        If you say Y here, the LEDs on your machine will be used
 -        to provide useful information about your current system status.
 -
 -        If you are compiling a kernel for a NetWinder or EBSA-285, you will
 -        be able to select which LEDs are active using the options below. If
 -        you are compiling a kernel for the EBSA-110 or the LART however, the
 -        red LED will simply flash regularly to indicate that the system is
 -        still functional. It is safe to say Y here if you have a CATS
 -        system, but the driver will do nothing.
 -
 -config LEDS_TIMER
 -      bool "Timer LED" if (!ARCH_CDB89712 && !ARCH_OMAP) || \
 -                          OMAP_OSK_MISTRAL || MACH_OMAP_H2 \
 -                          || MACH_OMAP_PERSEUS2
 -      depends on LEDS
 -      depends on !GENERIC_CLOCKEVENTS
 -      default y if ARCH_EBSA110
 -      help
 -        If you say Y here, one of the system LEDs (the green one on the
 -        NetWinder, the amber one on the EBSA285, or the red one on the LART)
 -        will flash regularly to indicate that the system is still
 -        operational. This is mainly useful to kernel hackers who are
 -        debugging unstable kernels.
 -
 -        The LART uses the same LED for both Timer LED and CPU usage LED
 -        functions. You may choose to use both, but the Timer LED function
 -        will overrule the CPU usage LED.
 -
 -config LEDS_CPU
 -      bool "CPU usage LED" if (!ARCH_CDB89712 && !ARCH_EBSA110 && \
 -                      !ARCH_OMAP) \
 -                      || OMAP_OSK_MISTRAL || MACH_OMAP_H2 \
 -                      || MACH_OMAP_PERSEUS2
 -      depends on LEDS
 -      help
 -        If you say Y here, the red LED will be used to give a good real
 -        time indication of CPU usage, by lighting whenever the idle task
 -        is not currently executing.
 -
 -        The LART uses the same LED for both Timer LED and CPU usage LED
 -        functions. You may choose to use both, but the Timer LED function
 -        will overrule the CPU usage LED.
 -
  config ALIGNMENT_TRAP
        bool
        depends on CPU_CP15_MMU
          configuration it is safe to say N, otherwise say Y.
  
  config UACCESS_WITH_MEMCPY
-       bool "Use kernel mem{cpy,set}() for {copy_to,clear}_user() (EXPERIMENTAL)"
-       depends on MMU && EXPERIMENTAL
+       bool "Use kernel mem{cpy,set}() for {copy_to,clear}_user()"
+       depends on MMU
        default y if CPU_FEROCEON
        help
          Implement faster copy_to_user and clear_user methods for CPU
@@@ -1828,22 -1902,6 +1839,16 @@@ config CC_STACKPROTECTO
          neutralized via a kernel panic.
          This feature requires gcc version 4.2 or above.
  
- config DEPRECATED_PARAM_STRUCT
-       bool "Provide old way to pass kernel parameters"
-       help
-         This was deprecated in 2001 and announced to live on for 5 years.
-         Some old boot loaders still use this way.
 +config XEN_DOM0
 +      def_bool y
 +      depends on XEN
 +
 +config XEN
 +      bool "Xen guest support on ARM (EXPERIMENTAL)"
 +      depends on EXPERIMENTAL && ARM && OF
 +      help
 +        Say Y if you want to run Linux in a Virtual Machine on Xen on ARM.
 +
  endmenu
  
  menu "Boot options"
@@@ -1856,6 -1914,23 +1861,23 @@@ config USE_O
        help
          Include support for flattened device tree machine descriptions.
  
+ config ATAGS
+       bool "Support for the traditional ATAGS boot data passing" if USE_OF
+       default y
+       help
+         This is the traditional way of passing data to the kernel at boot
+         time. If you are solely relying on the flattened device tree (or
+         the ARM_ATAG_DTB_COMPAT option) then you may unselect this option
+         to remove ATAGS support from your kernel binary.  If unsure,
+         leave this to y.
+ config DEPRECATED_PARAM_STRUCT
+       bool "Provide old way to pass kernel parameters"
+       depends on ATAGS
+       help
+         This was deprecated in 2001 and announced to live on for 5 years.
+         Some old boot loaders still use this way.
  # Compressed boot loader in ROM.  Yes, we really want to ask about
  # TEXT and BSS so we preserve their values in the config files.
  config ZBOOT_ROM_TEXT
@@@ -1982,6 -2057,7 +2004,7 @@@ config CMDLIN
  choice
        prompt "Kernel command line type" if CMDLINE != ""
        default CMDLINE_FROM_BOOTLOADER
+       depends on ATAGS
  
  config CMDLINE_FROM_BOOTLOADER
        bool "Use bootloader kernel arguments if available"
@@@ -2007,7 -2083,7 +2030,7 @@@ endchoic
  
  config XIP_KERNEL
        bool "Kernel Execute-In-Place from ROM"
 -      depends on !ZBOOT_ROM && !ARM_LPAE
 +      depends on !ZBOOT_ROM && !ARM_LPAE && !ARCH_MULTIPLATFORM
        help
          Execute-In-Place allows the kernel to run from non-volatile storage
          directly addressable by the CPU, such as NOR flash. This saves RAM
@@@ -2051,7 -2127,7 +2074,7 @@@ config KEXE
  
  config ATAGS_PROC
        bool "Export atags in procfs"
-       depends on KEXEC
+       depends on ATAGS && KEXEC
        default y
        help
          Should the atags used to boot the kernel be exported in an "atags"
@@@ -2260,7 -2336,7 +2283,7 @@@ menu "Power management options
  source "kernel/power/Kconfig"
  
  config ARCH_SUSPEND_POSSIBLE
 -      depends on !ARCH_S5PC100 && !ARCH_TEGRA
 +      depends on !ARCH_S5PC100
        depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \
                CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE || CPU_MOHAWK
        def_bool y
diff --combined arch/arm/Makefile
index 40ea991b67824e73b3409191e0f8767ad594f83e,361936a3d191df3201707c4ab6ace8190e24a3a7..f023e3acdfbd8c7c17335cfa9518df05119f4ab7
@@@ -135,78 -135,84 +135,78 @@@ textofs-$(CONFIG_ARCH_MSM8960) := 0x002
  
  # Machine directory name.  This list is sorted alphanumerically
  # by CONFIG_* macro name.
 -machine-$(CONFIG_ARCH_AT91)           := at91
 -machine-$(CONFIG_ARCH_BCMRING)                := bcmring
 -machine-$(CONFIG_ARCH_CLPS711X)               := clps711x
 -machine-$(CONFIG_ARCH_CNS3XXX)                := cns3xxx
 -machine-$(CONFIG_ARCH_DAVINCI)                := davinci
 -machine-$(CONFIG_ARCH_DOVE)           := dove
 -machine-$(CONFIG_ARCH_EBSA110)                := ebsa110
 -machine-$(CONFIG_ARCH_EP93XX)         := ep93xx
 -machine-$(CONFIG_ARCH_GEMINI)         := gemini
 -machine-$(CONFIG_ARCH_H720X)          := h720x
 -machine-$(CONFIG_ARCH_HIGHBANK)               := highbank
 -machine-$(CONFIG_ARCH_INTEGRATOR)     := integrator
 -machine-$(CONFIG_ARCH_IOP13XX)                := iop13xx
 -machine-$(CONFIG_ARCH_IOP32X)         := iop32x
 -machine-$(CONFIG_ARCH_IOP33X)         := iop33x
 -machine-$(CONFIG_ARCH_IXP4XX)         := ixp4xx
 -machine-$(CONFIG_ARCH_KIRKWOOD)               := kirkwood
 -machine-$(CONFIG_ARCH_KS8695)         := ks8695
 -machine-$(CONFIG_ARCH_LPC32XX)                := lpc32xx
 -machine-$(CONFIG_ARCH_MMP)            := mmp
 -machine-$(CONFIG_ARCH_MSM)            := msm
 -machine-$(CONFIG_ARCH_MV78XX0)                := mv78xx0
 -machine-$(CONFIG_ARCH_IMX_V4_V5)      := imx
 -machine-$(CONFIG_ARCH_IMX_V6_V7)      := imx
 -machine-$(CONFIG_ARCH_MXS)            := mxs
 -machine-$(CONFIG_ARCH_MVEBU)          := mvebu
 -machine-$(CONFIG_ARCH_NETX)           := netx
 -machine-$(CONFIG_ARCH_NOMADIK)                := nomadik
 -machine-$(CONFIG_ARCH_OMAP1)          := omap1
 -machine-$(CONFIG_ARCH_OMAP2PLUS)      := omap2
 -machine-$(CONFIG_ARCH_ORION5X)                := orion5x
 -machine-$(CONFIG_ARCH_PICOXCELL)      := picoxcell
 -machine-$(CONFIG_ARCH_PNX4008)                := pnx4008
 -machine-$(CONFIG_ARCH_PRIMA2)         := prima2
 -machine-$(CONFIG_ARCH_PXA)            := pxa
 -machine-$(CONFIG_ARCH_REALVIEW)               := realview
 -machine-$(CONFIG_ARCH_RPC)            := rpc
 -machine-$(CONFIG_ARCH_S3C24XX)                := s3c24xx s3c2412 s3c2440
 -machine-$(CONFIG_ARCH_S3C64XX)                := s3c64xx
 -machine-$(CONFIG_ARCH_S5P64X0)                := s5p64x0
 -machine-$(CONFIG_ARCH_S5PC100)                := s5pc100
 -machine-$(CONFIG_ARCH_S5PV210)                := s5pv210
 -machine-$(CONFIG_ARCH_EXYNOS4)                := exynos
 -machine-$(CONFIG_ARCH_EXYNOS5)                := exynos
 -machine-$(CONFIG_ARCH_SA1100)         := sa1100
 -machine-$(CONFIG_ARCH_SHARK)          := shark
 -machine-$(CONFIG_ARCH_SHMOBILE)       := shmobile
 -machine-$(CONFIG_ARCH_TEGRA)          := tegra
 -machine-$(CONFIG_ARCH_U300)           := u300
 -machine-$(CONFIG_ARCH_U8500)          := ux500
 -machine-$(CONFIG_ARCH_VERSATILE)      := versatile
 -machine-$(CONFIG_ARCH_VEXPRESS)               := vexpress
 -machine-$(CONFIG_ARCH_VT8500)         := vt8500
 -machine-$(CONFIG_ARCH_W90X900)                := w90x900
 -machine-$(CONFIG_FOOTBRIDGE)          := footbridge
 -machine-$(CONFIG_ARCH_SOCFPGA)                := socfpga
 -machine-$(CONFIG_MACH_SPEAR1310)      := spear13xx
 -machine-$(CONFIG_MACH_SPEAR1340)      := spear13xx
 -machine-$(CONFIG_MACH_SPEAR300)               := spear3xx
 -machine-$(CONFIG_MACH_SPEAR310)               := spear3xx
 -machine-$(CONFIG_MACH_SPEAR320)               := spear3xx
 -machine-$(CONFIG_MACH_SPEAR600)               := spear6xx
 -machine-$(CONFIG_ARCH_ZYNQ)           := zynq
 +machine-$(CONFIG_ARCH_AT91)           += at91
 +machine-$(CONFIG_ARCH_BCM2835)                += bcm2835
 +machine-$(CONFIG_ARCH_CLPS711X)               += clps711x
 +machine-$(CONFIG_ARCH_CNS3XXX)                += cns3xxx
 +machine-$(CONFIG_ARCH_DAVINCI)                += davinci
 +machine-$(CONFIG_ARCH_DOVE)           += dove
 +machine-$(CONFIG_ARCH_EBSA110)                += ebsa110
 +machine-$(CONFIG_ARCH_EP93XX)         += ep93xx
 +machine-$(CONFIG_ARCH_GEMINI)         += gemini
 +machine-$(CONFIG_ARCH_H720X)          += h720x
 +machine-$(CONFIG_ARCH_HIGHBANK)               += highbank
 +machine-$(CONFIG_ARCH_INTEGRATOR)     += integrator
 +machine-$(CONFIG_ARCH_IOP13XX)                += iop13xx
 +machine-$(CONFIG_ARCH_IOP32X)         += iop32x
 +machine-$(CONFIG_ARCH_IOP33X)         += iop33x
 +machine-$(CONFIG_ARCH_IXP4XX)         += ixp4xx
 +machine-$(CONFIG_ARCH_KIRKWOOD)               += kirkwood
 +machine-$(CONFIG_ARCH_KS8695)         += ks8695
 +machine-$(CONFIG_ARCH_LPC32XX)                += lpc32xx
 +machine-$(CONFIG_ARCH_MMP)            += mmp
 +machine-$(CONFIG_ARCH_MSM)            += msm
 +machine-$(CONFIG_ARCH_MV78XX0)                += mv78xx0
 +machine-$(CONFIG_ARCH_MXC)            += imx
 +machine-$(CONFIG_ARCH_MXS)            += mxs
 +machine-$(CONFIG_ARCH_MVEBU)          += mvebu
 +machine-$(CONFIG_ARCH_NETX)           += netx
 +machine-$(CONFIG_ARCH_NOMADIK)                += nomadik
 +machine-$(CONFIG_ARCH_OMAP1)          += omap1
 +machine-$(CONFIG_ARCH_OMAP2PLUS)      += omap2
 +machine-$(CONFIG_ARCH_ORION5X)                += orion5x
 +machine-$(CONFIG_ARCH_PICOXCELL)      += picoxcell
 +machine-$(CONFIG_ARCH_PRIMA2)         += prima2
 +machine-$(CONFIG_ARCH_PXA)            += pxa
 +machine-$(CONFIG_ARCH_REALVIEW)               += realview
 +machine-$(CONFIG_ARCH_RPC)            += rpc
 +machine-$(CONFIG_ARCH_S3C24XX)                += s3c24xx s3c2412 s3c2440
 +machine-$(CONFIG_ARCH_S3C64XX)                += s3c64xx
 +machine-$(CONFIG_ARCH_S5P64X0)                += s5p64x0
 +machine-$(CONFIG_ARCH_S5PC100)                += s5pc100
 +machine-$(CONFIG_ARCH_S5PV210)                += s5pv210
 +machine-$(CONFIG_ARCH_EXYNOS)         += exynos
 +machine-$(CONFIG_ARCH_SA1100)         += sa1100
 +machine-$(CONFIG_ARCH_SHARK)          += shark
 +machine-$(CONFIG_ARCH_SHMOBILE)       += shmobile
 +machine-$(CONFIG_ARCH_TEGRA)          += tegra
 +machine-$(CONFIG_ARCH_U300)           += u300
 +machine-$(CONFIG_ARCH_U8500)          += ux500
 +machine-$(CONFIG_ARCH_VERSATILE)      += versatile
 +machine-$(CONFIG_ARCH_VEXPRESS)               += vexpress
 +machine-$(CONFIG_ARCH_VT8500)         += vt8500
 +machine-$(CONFIG_ARCH_W90X900)                += w90x900
 +machine-$(CONFIG_FOOTBRIDGE)          += footbridge
 +machine-$(CONFIG_ARCH_SOCFPGA)                += socfpga
 +machine-$(CONFIG_ARCH_SPEAR13XX)      += spear13xx
 +machine-$(CONFIG_ARCH_SPEAR3XX)               += spear3xx
 +machine-$(CONFIG_MACH_SPEAR600)               += spear6xx
 +machine-$(CONFIG_ARCH_ZYNQ)           += zynq
  
  # Platform directory name.  This list is sorted alphanumerically
  # by CONFIG_* macro name.
 -plat-$(CONFIG_ARCH_MXC)               := mxc
 -plat-$(CONFIG_ARCH_OMAP)      := omap
 -plat-$(CONFIG_ARCH_S3C64XX)   := samsung
 -plat-$(CONFIG_ARCH_ZYNQ)      := versatile
 -plat-$(CONFIG_PLAT_IOP)               := iop
 -plat-$(CONFIG_PLAT_NOMADIK)   := nomadik
 -plat-$(CONFIG_PLAT_ORION)     := orion
 -plat-$(CONFIG_PLAT_PXA)               := pxa
 -plat-$(CONFIG_PLAT_S3C24XX)   := s3c24xx samsung
 -plat-$(CONFIG_PLAT_S5P)               := samsung
 -plat-$(CONFIG_PLAT_SPEAR)     := spear
 -plat-$(CONFIG_PLAT_VERSATILE) := versatile
 +plat-$(CONFIG_ARCH_MXC)               += mxc
 +plat-$(CONFIG_ARCH_OMAP)      += omap
 +plat-$(CONFIG_ARCH_S3C64XX)   += samsung
 +plat-$(CONFIG_ARCH_ZYNQ)      += versatile
 +plat-$(CONFIG_PLAT_IOP)               += iop
 +plat-$(CONFIG_PLAT_NOMADIK)   += nomadik
 +plat-$(CONFIG_PLAT_ORION)     += orion
 +plat-$(CONFIG_PLAT_PXA)               += pxa
 +plat-$(CONFIG_PLAT_S3C24XX)   += s3c24xx samsung
 +plat-$(CONFIG_PLAT_S5P)               += samsung
 +plat-$(CONFIG_PLAT_SPEAR)     += spear
 +plat-$(CONFIG_PLAT_VERSATILE) += versatile
  
  ifeq ($(CONFIG_ARCH_EBSA110),y)
  # This is what happens if you forget the IOCS16 line.
@@@ -224,20 -230,15 +224,20 @@@ MACHINE  := arch/arm/mach-$(word 1,$(ma
  else
  MACHINE  :=
  endif
 +ifeq ($(CONFIG_ARCH_MULTIPLATFORM),y)
 +MACHINE  :=
 +endif
  
  machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
  platdirs := $(patsubst %,arch/arm/plat-%/,$(plat-y))
  
 +ifneq ($(CONFIG_ARCH_MULTIPLATFORM),y)
  ifeq ($(KBUILD_SRC),)
  KBUILD_CPPFLAGS += $(patsubst %,-I%include,$(machdirs) $(platdirs))
  else
  KBUILD_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(machdirs) $(platdirs))
  endif
 +endif
  
  export        TEXT_OFFSET GZFLAGS MMUEXT
  
@@@ -250,12 -251,10 +250,12 @@@ endi
  core-$(CONFIG_FPE_NWFPE)      += arch/arm/nwfpe/
  core-$(CONFIG_FPE_FASTFPE)    += $(FASTFPE_OBJ)
  core-$(CONFIG_VFP)            += arch/arm/vfp/
 +core-$(CONFIG_XEN)            += arch/arm/xen/
  
  # If we have a machine-specific directory, then include it in the build.
  core-y                                += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
  core-y                                += arch/arm/net/
 +core-y                                += arch/arm/crypto/
  core-y                                += $(machdirs) $(platdirs)
  
  drivers-$(CONFIG_OPROFILE)      += arch/arm/oprofile/
@@@ -269,7 -268,12 +269,12 @@@ els
  KBUILD_IMAGE := zImage
  endif
  
- all:  $(KBUILD_IMAGE)
+ # Build the DT binary blobs if we have OF configured
+ ifeq ($(CONFIG_USE_OF),y)
+ KBUILD_DTBS := dtbs
+ endif
+ all:  $(KBUILD_IMAGE) $(KBUILD_DTBS)
  
  boot := arch/arm/boot
  
@@@ -307,7 -311,7 +312,7 @@@ define archhel
    echo  '  uImage        - U-Boot wrapped zImage'
    echo  '  bootpImage    - Combined zImage and initial RAM disk' 
    echo  '                  (supply initrd image via make variable INITRD=<path>)'
-   echo  '  dtbs          - Build device tree blobs for enabled boards'
+   echo  '* dtbs          - Build device tree blobs for enabled boards'
    echo  '  install       - Install uncompressed kernel'
    echo  '  zinstall      - Install compressed kernel'
    echo  '  uinstall      - Install U-Boot wrapped compressed kernel'
index 8f4db67533e5a7bf937ce94396e6b7bd19367036,09c4628efbe7b5111e224f83066f84df486266a8..35c1ed89b93652688dc99ede919b55b0d5051b1d
@@@ -47,13 -47,68 +47,68 @@@ extern void __raw_readsb(const void __i
  extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
  extern void __raw_readsl(const void __iomem *addr, void *data, int longlen);
  
- #define __raw_writeb(v,a)     ((void)(__chk_io_ptr(a), *(volatile unsigned char __force  *)(a) = (v)))
- #define __raw_writew(v,a)     ((void)(__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v)))
- #define __raw_writel(v,a)     ((void)(__chk_io_ptr(a), *(volatile unsigned int __force   *)(a) = (v)))
+ #if __LINUX_ARM_ARCH__ < 6
+ /*
+  * Half-word accesses are problematic with RiscPC due to limitations of
+  * the bus. Rather than special-case the machine, just let the compiler
+  * generate the access for CPUs prior to ARMv6.
+  */
+ #define __raw_readw(a)         (__chk_io_ptr(a), *(volatile unsigned short __force *)(a))
+ #define __raw_writew(v,a)      ((void)(__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v)))
+ #else
+ /*
+  * When running under a hypervisor, we want to avoid I/O accesses with
+  * writeback addressing modes as these incur a significant performance
+  * overhead (the address generation must be emulated in software).
+  */
+ static inline void __raw_writew(u16 val, volatile void __iomem *addr)
+ {
+       asm volatile("strh %1, %0"
+                    : "+Qo" (*(volatile u16 __force *)addr)
+                    : "r" (val));
+ }
+ static inline u16 __raw_readw(const volatile void __iomem *addr)
+ {
+       u16 val;
+       asm volatile("ldrh %1, %0"
+                    : "+Qo" (*(volatile u16 __force *)addr),
+                      "=r" (val));
+       return val;
+ }
+ #endif
+ static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
+ {
+       asm volatile("strb %1, %0"
+                    : "+Qo" (*(volatile u8 __force *)addr)
+                    : "r" (val));
+ }
+ static inline void __raw_writel(u32 val, volatile void __iomem *addr)
+ {
+       asm volatile("str %1, %0"
+                    : "+Qo" (*(volatile u32 __force *)addr)
+                    : "r" (val));
+ }
+ static inline u8 __raw_readb(const volatile void __iomem *addr)
+ {
+       u8 val;
+       asm volatile("ldrb %1, %0"
+                    : "+Qo" (*(volatile u8 __force *)addr),
+                      "=r" (val));
+       return val;
+ }
  
- #define __raw_readb(a)                (__chk_io_ptr(a), *(volatile unsigned char __force  *)(a))
- #define __raw_readw(a)                (__chk_io_ptr(a), *(volatile unsigned short __force *)(a))
- #define __raw_readl(a)                (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a))
+ static inline u32 __raw_readl(const volatile void __iomem *addr)
+ {
+       u32 val;
+       asm volatile("ldr %1, %0"
+                    : "+Qo" (*(volatile u32 __force *)addr),
+                      "=r" (val));
+       return val;
+ }
  
  /*
   * Architecture ioremap implementation.
@@@ -113,19 -168,11 +168,19 @@@ static inline void __iomem *__typesafe_
  #define __iowmb()             do { } while (0)
  #endif
  
 +/* PCI fixed i/o mapping */
 +#define PCI_IO_VIRT_BASE      0xfee00000
 +
 +extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr);
 +
  /*
   * Now, pick up the machine-defined IO definitions
   */
  #ifdef CONFIG_NEED_MACH_IO_H
  #include <mach/io.h>
 +#elif defined(CONFIG_PCI)
 +#define IO_SPACE_LIMIT        ((resource_size_t)0xfffff)
 +#define __io(a)               __typesafe_io(PCI_IO_VIRT_BASE + ((a) & IO_SPACE_LIMIT))
  #else
  #define __io(a)               __typesafe_io((a) & IO_SPACE_LIMIT)
  #endif
index 963342acebb7200445970aeb51907e6cdf2eceed,9acc135dad94b6aac6f20c5c02492b20fbac28f3..83f2aa83899c4b14cede7dd798178655884c951f
  #ifndef _ASMARM_TIMEX_H
  #define _ASMARM_TIMEX_H
  
- #include <asm/arch_timer.h>
 +#ifdef CONFIG_ARCH_MULTIPLATFORM
 +#define CLOCK_TICK_RATE 1000000
 +#else
  #include <mach/timex.h>
 +#endif
  
  typedef unsigned long cycles_t;
- #ifdef ARCH_HAS_READ_CURRENT_TIMER
  #define get_cycles()  ({ cycles_t c; read_current_timer(&c) ? 0 : c; })
- #else
- #define get_cycles()  (0)
- #endif
  
  #endif
diff --combined arch/arm/kernel/Makefile
index d81f3a6d9ad84df7917d2a1edefb68b0dcae6ac9,79e346a5d78bd59ccfdf571575a8b5dfd2d28251..5dfef9d97ed92b960d8d359997a20108759d60c8
@@@ -19,8 -19,11 +19,10 @@@ obj-y               := elf.o entry-armv.o entry-comm
                   process.o ptrace.o return_address.o sched_clock.o \
                   setup.o signal.o stacktrace.o sys_arm.o time.o traps.o
  
- obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += compat.o
+ obj-$(CONFIG_ATAGS)           += atags_parse.o
+ obj-$(CONFIG_ATAGS_PROC)      += atags_proc.o
+ obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o
  
 -obj-$(CONFIG_LEDS)            += leds.o
  obj-$(CONFIG_OC_ETM)          += etm.o
  obj-$(CONFIG_CPU_IDLE)                += cpuidle.o
  obj-$(CONFIG_ISA_DMA_API)     += dma.o
@@@ -51,7 -54,6 +53,6 @@@ test-kprobes-objs             += kprobes-test-thum
  else
  test-kprobes-objs             += kprobes-test-arm.o
  endif
- obj-$(CONFIG_ATAGS_PROC)      += atags.o
  obj-$(CONFIG_OABI_COMPAT)     += sys_oabi-compat.o
  obj-$(CONFIG_ARM_THUMBEE)     += thumbee.o
  obj-$(CONFIG_KGDB)            += kgdb.o
@@@ -68,7 -70,8 +69,7 @@@ obj-$(CONFIG_CPU_XSC3)                += xscale-cp0.
  obj-$(CONFIG_CPU_MOHAWK)      += xscale-cp0.o
  obj-$(CONFIG_CPU_PJ4)         += pj4-cp0.o
  obj-$(CONFIG_IWMMXT)          += iwmmxt.o
 -obj-$(CONFIG_CPU_HAS_PMU)     += pmu.o
 -obj-$(CONFIG_HW_PERF_EVENTS)  += perf_event.o
 +obj-$(CONFIG_HW_PERF_EVENTS)  += perf_event.o perf_event_cpu.o
  AFLAGS_iwmmxt.o                       := -Wa,-mcpu=iwmmxt
  obj-$(CONFIG_ARM_CPU_TOPOLOGY)  += topology.o
  
diff --combined arch/arm/kernel/setup.c
index 725f9f2a95414e10d8f73a0360741031dd16db48,0785472460a8dd168c96be3c6b84b5acd43bca97..febafa0f552d6a75e2bc51755054a8b6e68cf5a8
  #include <linux/init.h>
  #include <linux/kexec.h>
  #include <linux/of_fdt.h>
- #include <linux/root_dev.h>
  #include <linux/cpu.h>
  #include <linux/interrupt.h>
  #include <linux/smp.h>
- #include <linux/fs.h>
  #include <linux/proc_fs.h>
  #include <linux/memblock.h>
  #include <linux/bug.h>
  #include <asm/unwind.h>
  #include <asm/memblock.h>
  
- #if defined(CONFIG_DEPRECATED_PARAM_STRUCT)
- #include "compat.h"
- #endif
  #include "atags.h"
  #include "tcm.h"
  
- #ifndef MEM_SIZE
- #define MEM_SIZE      (16*1024*1024)
- #endif
  
  #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
  char fpe_type[8];
@@@ -145,7 -137,6 +137,6 @@@ static const char *machine_name
  static char __initdata cmd_line[COMMAND_LINE_SIZE];
  struct machine_desc *machine_desc __initdata;
  
- static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
  static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
  #define ENDIANNESS ((char)endian_test.l)
  
@@@ -583,21 -574,6 +574,6 @@@ static int __init early_mem(char *p
  }
  early_param("mem", early_mem);
  
- static void __init
- setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz)
- {
- #ifdef CONFIG_BLK_DEV_RAM
-       extern int rd_size, rd_image_start, rd_prompt, rd_doload;
-       rd_image_start = image_start;
-       rd_prompt = prompt;
-       rd_doload = doload;
-       if (rd_sz)
-               rd_size = rd_sz;
- #endif
- }
  static void __init request_standard_resources(struct machine_desc *mdesc)
  {
        struct memblock_region *region;
                request_resource(&ioport_resource, &lp2);
  }
  
- /*
-  *  Tag parsing.
-  *
-  * This is the new way of passing data to the kernel at boot time.  Rather
-  * than passing a fixed inflexible structure to the kernel, we pass a list
-  * of variable-sized tags to the kernel.  The first tag must be a ATAG_CORE
-  * tag for the list to be recognised (to distinguish the tagged list from
-  * a param_struct).  The list is terminated with a zero-length tag (this tag
-  * is not parsed in any way).
-  */
- static int __init parse_tag_core(const struct tag *tag)
- {
-       if (tag->hdr.size > 2) {
-               if ((tag->u.core.flags & 1) == 0)
-                       root_mountflags &= ~MS_RDONLY;
-               ROOT_DEV = old_decode_dev(tag->u.core.rootdev);
-       }
-       return 0;
- }
- __tagtable(ATAG_CORE, parse_tag_core);
- static int __init parse_tag_mem32(const struct tag *tag)
- {
-       return arm_add_memory(tag->u.mem.start, tag->u.mem.size);
- }
- __tagtable(ATAG_MEM, parse_tag_mem32);
  #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
  struct screen_info screen_info = {
   .orig_video_lines    = 30,
   .orig_video_isVGA    = 1,
   .orig_video_points   = 8
  };
- static int __init parse_tag_videotext(const struct tag *tag)
- {
-       screen_info.orig_x            = tag->u.videotext.x;
-       screen_info.orig_y            = tag->u.videotext.y;
-       screen_info.orig_video_page   = tag->u.videotext.video_page;
-       screen_info.orig_video_mode   = tag->u.videotext.video_mode;
-       screen_info.orig_video_cols   = tag->u.videotext.video_cols;
-       screen_info.orig_video_ega_bx = tag->u.videotext.video_ega_bx;
-       screen_info.orig_video_lines  = tag->u.videotext.video_lines;
-       screen_info.orig_video_isVGA  = tag->u.videotext.video_isvga;
-       screen_info.orig_video_points = tag->u.videotext.video_points;
-       return 0;
- }
- __tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);
  #endif
  
- static int __init parse_tag_ramdisk(const struct tag *tag)
- {
-       setup_ramdisk((tag->u.ramdisk.flags & 1) == 0,
-                     (tag->u.ramdisk.flags & 2) == 0,
-                     tag->u.ramdisk.start, tag->u.ramdisk.size);
-       return 0;
- }
- __tagtable(ATAG_RAMDISK, parse_tag_ramdisk);
- static int __init parse_tag_serialnr(const struct tag *tag)
- {
-       system_serial_low = tag->u.serialnr.low;
-       system_serial_high = tag->u.serialnr.high;
-       return 0;
- }
- __tagtable(ATAG_SERIAL, parse_tag_serialnr);
- static int __init parse_tag_revision(const struct tag *tag)
- {
-       system_rev = tag->u.revision.rev;
-       return 0;
- }
- __tagtable(ATAG_REVISION, parse_tag_revision);
- static int __init parse_tag_cmdline(const struct tag *tag)
- {
- #if defined(CONFIG_CMDLINE_EXTEND)
-       strlcat(default_command_line, " ", COMMAND_LINE_SIZE);
-       strlcat(default_command_line, tag->u.cmdline.cmdline,
-               COMMAND_LINE_SIZE);
- #elif defined(CONFIG_CMDLINE_FORCE)
-       pr_warning("Ignoring tag cmdline (using the default kernel command line)\n");
- #else
-       strlcpy(default_command_line, tag->u.cmdline.cmdline,
-               COMMAND_LINE_SIZE);
- #endif
-       return 0;
- }
- __tagtable(ATAG_CMDLINE, parse_tag_cmdline);
- /*
-  * Scan the tag table for this tag, and call its parse function.
-  * The tag table is built by the linker from all the __tagtable
-  * declarations.
-  */
- static int __init parse_tag(const struct tag *tag)
- {
-       extern struct tagtable __tagtable_begin, __tagtable_end;
-       struct tagtable *t;
-       for (t = &__tagtable_begin; t < &__tagtable_end; t++)
-               if (tag->hdr.tag == t->tag) {
-                       t->parse(tag);
-                       break;
-               }
-       return t < &__tagtable_end;
- }
- /*
-  * Parse all tags in the list, checking both the global and architecture
-  * specific tag tables.
-  */
- static void __init parse_tags(const struct tag *t)
- {
-       for (; t->hdr.size; t = tag_next(t))
-               if (!parse_tag(t))
-                       printk(KERN_WARNING
-                               "Ignoring unrecognised tag 0x%08x\n",
-                               t->hdr.tag);
- }
- /*
-  * This holds our defaults.
-  */
- static struct init_tags {
-       struct tag_header hdr1;
-       struct tag_core   core;
-       struct tag_header hdr2;
-       struct tag_mem32  mem;
-       struct tag_header hdr3;
- } init_tags __initdata = {
-       { tag_size(tag_core), ATAG_CORE },
-       { 1, PAGE_SIZE, 0xff },
-       { tag_size(tag_mem32), ATAG_MEM },
-       { MEM_SIZE },
-       { 0, ATAG_NONE }
- };
  static int __init customize_machine(void)
  {
        /* customizes platform devices, or adds new ones */
@@@ -858,78 -696,6 +696,6 @@@ static void __init reserve_crashkernel(
  static inline void reserve_crashkernel(void) {}
  #endif /* CONFIG_KEXEC */
  
- static void __init squash_mem_tags(struct tag *tag)
- {
-       for (; tag->hdr.size; tag = tag_next(tag))
-               if (tag->hdr.tag == ATAG_MEM)
-                       tag->hdr.tag = ATAG_NONE;
- }
- static struct machine_desc * __init setup_machine_tags(unsigned int nr)
- {
-       struct tag *tags = (struct tag *)&init_tags;
-       struct machine_desc *mdesc = NULL, *p;
-       char *from = default_command_line;
-       init_tags.mem.start = PHYS_OFFSET;
-       /*
-        * locate machine in the list of supported machines.
-        */
-       for_each_machine_desc(p)
-               if (nr == p->nr) {
-                       printk("Machine: %s\n", p->name);
-                       mdesc = p;
-                       break;
-               }
-       if (!mdesc) {
-               early_print("\nError: unrecognized/unsupported machine ID"
-                       " (r1 = 0x%08x).\n\n", nr);
-               dump_machine_table(); /* does not return */
-       }
-       if (__atags_pointer)
-               tags = phys_to_virt(__atags_pointer);
-       else if (mdesc->atag_offset)
-               tags = (void *)(PAGE_OFFSET + mdesc->atag_offset);
- #if defined(CONFIG_DEPRECATED_PARAM_STRUCT)
-       /*
-        * If we have the old style parameters, convert them to
-        * a tag list.
-        */
-       if (tags->hdr.tag != ATAG_CORE)
-               convert_to_tag_list(tags);
- #endif
-       if (tags->hdr.tag != ATAG_CORE) {
- #if defined(CONFIG_OF)
-               /*
-                * If CONFIG_OF is set, then assume this is a reasonably
-                * modern system that should pass boot parameters
-                */
-               early_print("Warning: Neither atags nor dtb found\n");
- #endif
-               tags = (struct tag *)&init_tags;
-       }
-       if (mdesc->fixup)
-               mdesc->fixup(tags, &from, &meminfo);
-       if (tags->hdr.tag == ATAG_CORE) {
-               if (meminfo.nr_banks != 0)
-                       squash_mem_tags(tags);
-               save_atags(tags);
-               parse_tags(tags);
-       }
-       /* parse_early_param needs a boot_command_line */
-       strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);
-       return mdesc;
- }
  static int __init meminfo_cmp(const void *_a, const void *_b)
  {
        const struct membank *a = _a, *b = _b;
@@@ -944,7 -710,7 +710,7 @@@ void __init setup_arch(char **cmdline_p
        setup_processor();
        mdesc = setup_machine_fdt(__atags_pointer);
        if (!mdesc)
-               mdesc = setup_machine_tags(machine_arch_type);
+               mdesc = setup_machine_tags(__atags_pointer, machine_arch_type);
        machine_desc = mdesc;
        machine_name = mdesc->name;
  
        unflatten_device_tree();
  
  #ifdef CONFIG_SMP
 -      if (is_smp())
 +      if (is_smp()) {
 +              smp_set_ops(mdesc->smp);
                smp_init_cpus();
 +      }
  #endif
        reserve_crashkernel();
  
diff --combined arch/arm/kernel/smp.c
index dea7a925c7e249375a86c9c943302a926c865433,d98c37e97d9dfeea77bf4531d3827f1904873669..d100eacdb7983f8e490a8dc88d4f830b7fab3b8c
  #include <linux/mm.h>
  #include <linux/err.h>
  #include <linux/cpu.h>
 -#include <linux/smp.h>
  #include <linux/seq_file.h>
  #include <linux/irq.h>
  #include <linux/percpu.h>
  #include <linux/clockchips.h>
  #include <linux/completion.h>
 +#include <linux/cpufreq.h>
  
  #include <linux/atomic.h>
 +#include <asm/smp.h>
  #include <asm/cacheflush.h>
  #include <asm/cpu.h>
  #include <asm/cputype.h>
@@@ -43,7 -42,6 +43,7 @@@
  #include <asm/ptrace.h>
  #include <asm/localtimer.h>
  #include <asm/smp_plat.h>
 +#include <asm/mach/arch.h>
  
  /*
   * as from 2.5, kernels no longer have an init_tasks structure
   */
  struct secondary_data secondary_data;
  
 +/*
 + * control for which core is the next to come out of the secondary
 + * boot "holding pen"
 + */
 +volatile int __cpuinitdata pen_release = -1;
 +
  enum ipi_msg_type {
-       IPI_TIMER = 2,
+       IPI_WAKEUP,
+       IPI_TIMER,
        IPI_RESCHEDULE,
        IPI_CALL_FUNC,
        IPI_CALL_FUNC_SINGLE,
  
  static DECLARE_COMPLETION(cpu_running);
  
 +static struct smp_operations smp_ops;
 +
 +void __init smp_set_ops(struct smp_operations *ops)
 +{
 +      if (ops)
 +              smp_ops = *ops;
 +};
 +
  int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *idle)
  {
        int ret;
        return ret;
  }
  
 +/* platform specific SMP operations */
 +void __init smp_init_cpus(void)
 +{
 +      if (smp_ops.smp_init_cpus)
 +              smp_ops.smp_init_cpus();
 +}
 +
 +static void __init platform_smp_prepare_cpus(unsigned int max_cpus)
 +{
 +      if (smp_ops.smp_prepare_cpus)
 +              smp_ops.smp_prepare_cpus(max_cpus);
 +}
 +
 +static void __cpuinit platform_secondary_init(unsigned int cpu)
 +{
 +      if (smp_ops.smp_secondary_init)
 +              smp_ops.smp_secondary_init(cpu);
 +}
 +
 +int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
 +{
 +      if (smp_ops.smp_boot_secondary)
 +              return smp_ops.smp_boot_secondary(cpu, idle);
 +      return -ENOSYS;
 +}
 +
  #ifdef CONFIG_HOTPLUG_CPU
  static void percpu_timer_stop(void);
  
 +static int platform_cpu_kill(unsigned int cpu)
 +{
 +      if (smp_ops.cpu_kill)
 +              return smp_ops.cpu_kill(cpu);
 +      return 1;
 +}
 +
 +static void platform_cpu_die(unsigned int cpu)
 +{
 +      if (smp_ops.cpu_die)
 +              smp_ops.cpu_die(cpu);
 +}
 +
 +static int platform_cpu_disable(unsigned int cpu)
 +{
 +      if (smp_ops.cpu_disable)
 +              return smp_ops.cpu_disable(cpu);
 +
 +      /*
 +       * By default, allow disabling all CPUs except the first one,
 +       * since this is special on a lot of platforms, e.g. because
 +       * of clock tick interrupts.
 +       */
 +      return cpu == 0 ? -EPERM : 0;
 +}
  /*
   * __cpu_disable runs on the processor to be shutdown.
   */
 -int __cpu_disable(void)
 +int __cpuinit __cpu_disable(void)
  {
        unsigned int cpu = smp_processor_id();
        int ret;
@@@ -216,7 -150,7 +217,7 @@@ static DECLARE_COMPLETION(cpu_died)
   * called on the thread which is asking for a CPU to be shutdown -
   * waits until shutdown has completed, or it is timed out.
   */
 -void __cpu_die(unsigned int cpu)
 +void __cpuinit __cpu_die(unsigned int cpu)
  {
        if (!wait_for_completion_timeout(&cpu_died, msecs_to_jiffies(5000))) {
                pr_err("CPU%u: cpu didn't die\n", cpu);
@@@ -414,7 -348,8 +415,8 @@@ void arch_send_call_function_single_ipi
  }
  
  static const char *ipi_types[NR_IPI] = {
- #define S(x,s)        [x - IPI_TIMER] = s
+ #define S(x,s)        [x] = s
+       S(IPI_WAKEUP, "CPU wakeup interrupts"),
        S(IPI_TIMER, "Timer broadcast interrupts"),
        S(IPI_RESCHEDULE, "Rescheduling interrupts"),
        S(IPI_CALL_FUNC, "Function call interrupts"),
@@@ -567,10 -502,13 +569,13 @@@ void handle_IPI(int ipinr, struct pt_re
        unsigned int cpu = smp_processor_id();
        struct pt_regs *old_regs = set_irq_regs(regs);
  
-       if (ipinr >= IPI_TIMER && ipinr < IPI_TIMER + NR_IPI)
-               __inc_irq_stat(cpu, ipi_irqs[ipinr - IPI_TIMER]);
+       if (ipinr < NR_IPI)
+               __inc_irq_stat(cpu, ipi_irqs[ipinr]);
  
        switch (ipinr) {
+       case IPI_WAKEUP:
+               break;
        case IPI_TIMER:
                irq_enter();
                ipi_timer();
@@@ -651,56 -589,3 +656,56 @@@ int setup_profiling_timer(unsigned int 
  {
        return -EINVAL;
  }
 +
 +#ifdef CONFIG_CPU_FREQ
 +
 +static DEFINE_PER_CPU(unsigned long, l_p_j_ref);
 +static DEFINE_PER_CPU(unsigned long, l_p_j_ref_freq);
 +static unsigned long global_l_p_j_ref;
 +static unsigned long global_l_p_j_ref_freq;
 +
 +static int cpufreq_callback(struct notifier_block *nb,
 +                                      unsigned long val, void *data)
 +{
 +      struct cpufreq_freqs *freq = data;
 +      int cpu = freq->cpu;
 +
 +      if (freq->flags & CPUFREQ_CONST_LOOPS)
 +              return NOTIFY_OK;
 +
 +      if (!per_cpu(l_p_j_ref, cpu)) {
 +              per_cpu(l_p_j_ref, cpu) =
 +                      per_cpu(cpu_data, cpu).loops_per_jiffy;
 +              per_cpu(l_p_j_ref_freq, cpu) = freq->old;
 +              if (!global_l_p_j_ref) {
 +                      global_l_p_j_ref = loops_per_jiffy;
 +                      global_l_p_j_ref_freq = freq->old;
 +              }
 +      }
 +
 +      if ((val == CPUFREQ_PRECHANGE  && freq->old < freq->new) ||
 +          (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) ||
 +          (val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
 +              loops_per_jiffy = cpufreq_scale(global_l_p_j_ref,
 +                                              global_l_p_j_ref_freq,
 +                                              freq->new);
 +              per_cpu(cpu_data, cpu).loops_per_jiffy =
 +                      cpufreq_scale(per_cpu(l_p_j_ref, cpu),
 +                                      per_cpu(l_p_j_ref_freq, cpu),
 +                                      freq->new);
 +      }
 +      return NOTIFY_OK;
 +}
 +
 +static struct notifier_block cpufreq_notifier = {
 +      .notifier_call  = cpufreq_callback,
 +};
 +
 +static int __init register_cpufreq_notifier(void)
 +{
 +      return cpufreq_register_notifier(&cpufreq_notifier,
 +                                              CPUFREQ_TRANSITION_NOTIFIER);
 +}
 +core_initcall(register_cpufreq_notifier);
 +
 +#endif
index 8d57e4223bdb3a1c520ef0fdb8d8e5d1b062d57c,090e32b0cd5467b9a41a03fa4f6a91575007668e..f93d820ecab5793863c11d8c62b057aca7930f82
  
  #include <plat/cpu.h>
  
 +#include "common.h"
 +
  extern void exynos4_secondary_startup(void);
  
  #define CPU1_BOOT_REG         (samsung_rev() == EXYNOS4210_REV_1_1 ? \
                                S5P_INFORM5 : S5P_VA_SYSRAM)
  
 -/*
 - * control for which core is the next to come out of the secondary
 - * boot "holding pen"
 - */
 -
 -volatile int __cpuinitdata pen_release = -1;
 -
  /*
   * Write pen_release in a way that is guaranteed to be visible to all
   * observers, irrespective of whether they're taking part in coherency
@@@ -59,7 -64,7 +59,7 @@@ static void __iomem *scu_base_addr(void
  
  static DEFINE_SPINLOCK(boot_lock);
  
 -void __cpuinit platform_secondary_init(unsigned int cpu)
 +static void __cpuinit exynos_secondary_init(unsigned int cpu)
  {
        /*
         * if any interrupts are already enabled for the primary
@@@ -81,7 -86,7 +81,7 @@@
        spin_unlock(&boot_lock);
  }
  
 -int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
 +static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
  {
        unsigned long timeout;
  
  
                __raw_writel(virt_to_phys(exynos4_secondary_startup),
                        CPU1_BOOT_REG);
-               gic_raise_softirq(cpumask_of(cpu), 1);
+               gic_raise_softirq(cpumask_of(cpu), 0);
  
                if (pen_release == -1)
                        break;
   * which may be present or become present in the system.
   */
  
 -void __init smp_init_cpus(void)
 +static void __init exynos_smp_init_cpus(void)
  {
        void __iomem *scu_base = scu_base_addr();
        unsigned int i, ncores;
        set_smp_cross_call(gic_raise_softirq);
  }
  
 -void __init platform_smp_prepare_cpus(unsigned int max_cpus)
 +static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
  {
        if (!soc_is_exynos5250())
                scu_enable(scu_base_addr());
        __raw_writel(virt_to_phys(exynos4_secondary_startup),
                        CPU1_BOOT_REG);
  }
 +
 +struct smp_operations exynos_smp_ops __initdata = {
 +      .smp_init_cpus          = exynos_smp_init_cpus,
 +      .smp_prepare_cpus       = exynos_smp_prepare_cpus,
 +      .smp_secondary_init     = exynos_secondary_init,
 +      .smp_boot_secondary     = exynos_boot_secondary,
 +#ifdef CONFIG_HOTPLUG_CPU
 +      .cpu_die                = exynos_cpu_die,
 +#endif
 +};
index dad3cb74ed31489332d94a1c4f6d4c8984ec0deb,1772c024e789f406ed507d2c8db460b0ec7024b6..ea22a17246d702722958ed0dbb96b63d8e45ae1a
  #include <mach/cm.h>
  #include <mach/irqs.h>
  
 -#include <asm/leds.h>
  #include <asm/mach-types.h>
  #include <asm/mach/time.h>
  #include <asm/pgtable.h>
  
- static struct amba_pl010_data integrator_uart_data;
+ #include "common.h"
+ #ifdef CONFIG_ATAGS
  
  #define INTEGRATOR_RTC_IRQ    { IRQ_RTCINT }
  #define INTEGRATOR_UART0_IRQ  { IRQ_UARTINT0 }
@@@ -60,7 -63,7 +62,7 @@@ static struct amba_device *amba_devs[] 
        &kmi1_device,
  };
  
static int __init integrator_init(void)
int __init integrator_init(bool is_cp)
  {
        int i;
  
@@@ -69,7 -72,7 +71,7 @@@
         * hard-code them. The Integator/CP and forward have proper cell IDs.
         * Else we leave them undefined to the bus driver can autoprobe them.
         */
-       if (machine_is_integrator()) {
+       if (!is_cp) {
                rtc_device.periphid     = 0x00041030;
                uart0_device.periphid   = 0x00041010;
                uart1_device.periphid   = 0x00041010;
@@@ -85,7 -88,7 +87,7 @@@
        return 0;
  }
  
- arch_initcall(integrator_init);
+ #endif
  
  /*
   * On the Integrator platform, the port RTS and DTR are provided by
   *  UART0  7    6
   *  UART1  5    4
   */
 -#define SC_CTRLC      IO_ADDRESS(INTEGRATOR_SC_CTRLC)
 -#define SC_CTRLS      IO_ADDRESS(INTEGRATOR_SC_CTRLS)
 +#define SC_CTRLC      __io_address(INTEGRATOR_SC_CTRLC)
 +#define SC_CTRLS      __io_address(INTEGRATOR_SC_CTRLS)
  
  static void integrator_uart_set_mctrl(struct amba_device *dev, void __iomem *base, unsigned int mctrl)
  {
        unsigned int ctrls = 0, ctrlc = 0, rts_mask, dtr_mask;
+       u32 phybase = dev->res.start;
  
-       if (dev == &uart0_device) {
+       if (phybase == INTEGRATOR_UART0_BASE) {
+               /* UART0 */
                rts_mask = 1 << 4;
                dtr_mask = 1 << 5;
        } else {
+               /* UART1 */
                rts_mask = 1 << 6;
                dtr_mask = 1 << 7;
        }
        __raw_writel(ctrlc, SC_CTRLC);
  }
  
- static struct amba_pl010_data integrator_uart_data = {
+ struct amba_pl010_data integrator_uart_data = {
        .set_mctrl = integrator_uart_set_mctrl,
  };
  
 -#define CM_CTRL       IO_ADDRESS(INTEGRATOR_HDR_CTRL)
 -
  static DEFINE_RAW_SPINLOCK(cm_lock);
  
  /**
index 2215d96cd7357b0c28a5cfc9ad72f1a990bddc29,ff1255ae712151fb0df7331f7f68a07870cf099d..d5b5435a09aed30896817ce1930c1af6ab4aa88a
@@@ -34,6 -34,9 +34,9 @@@
  #include <linux/mtd/physmap.h>
  #include <linux/clk.h>
  #include <linux/platform_data/clk-integrator.h>
+ #include <linux/of_irq.h>
+ #include <linux/of_address.h>
+ #include <linux/of_platform.h>
  #include <video/vga.h>
  
  #include <mach/hardware.h>
@@@ -50,7 -53,6 +53,7 @@@
  #include <asm/mach/arch.h>
  #include <asm/mach/irq.h>
  #include <asm/mach/map.h>
 +#include <asm/mach/pci.h>
  #include <asm/mach/time.h>
  
  #include <plat/fpga-irq.h>
@@@ -74,7 -76,7 +77,7 @@@
   * e8000000   40000000        PCI memory              PHYS_PCI_MEM_BASE       (max 512M)
   * ec000000   61000000        PCI config space        PHYS_PCI_CONFIG_BASE    (max 16M)
   * ed000000   62000000        PCI V3 regs             PHYS_PCI_V3_BASE        (max 64k)
 - * ee000000   60000000        PCI IO                  PHYS_PCI_IO_BASE        (max 16M)
 + * fee00000   60000000        PCI IO                  PHYS_PCI_IO_BASE        (max 16M)
   * ef000000                   Cache flush
   * f1000000   10000000        Core module registers
   * f1100000   11000000        System controller registers
@@@ -134,20 -136,25 +137,20 @@@ static struct map_desc ap_io_desc[] __i
                .length         = SZ_4K,
                .type           = MT_DEVICE
        }, {
 -              .virtual        = PCI_MEMORY_VADDR,
 +              .virtual        = (unsigned long)PCI_MEMORY_VADDR,
                .pfn            = __phys_to_pfn(PHYS_PCI_MEM_BASE),
                .length         = SZ_16M,
                .type           = MT_DEVICE
        }, {
 -              .virtual        = PCI_CONFIG_VADDR,
 +              .virtual        = (unsigned long)PCI_CONFIG_VADDR,
                .pfn            = __phys_to_pfn(PHYS_PCI_CONFIG_BASE),
                .length         = SZ_16M,
                .type           = MT_DEVICE
        }, {
 -              .virtual        = PCI_V3_VADDR,
 +              .virtual        = (unsigned long)PCI_V3_VADDR,
                .pfn            = __phys_to_pfn(PHYS_PCI_V3_BASE),
                .length         = SZ_64K,
                .type           = MT_DEVICE
 -      }, {
 -              .virtual        = PCI_IO_VADDR,
 -              .pfn            = __phys_to_pfn(PHYS_PCI_IO_BASE),
 -              .length         = SZ_64K,
 -              .type           = MT_DEVICE
        }
  };
  
@@@ -155,26 -162,8 +158,9 @@@ static void __init ap_map_io(void
  {
        iotable_init(ap_io_desc, ARRAY_SIZE(ap_io_desc));
        vga_base = PCI_MEMORY_VADDR;
 +      pci_map_io_early(__phys_to_pfn(PHYS_PCI_IO_BASE));
  }
  
- #define INTEGRATOR_SC_VALID_INT       0x003fffff
- static void __init ap_init_irq(void)
- {
-       /* Disable all interrupts initially. */
-       /* Do the core module ones */
-       writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
-       /* do the header card stuff next */
-       writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR);
-       writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
-       fpga_irq_init(VA_IC_BASE, "SC", IRQ_PIC_START,
-               -1, INTEGRATOR_SC_VALID_INT, NULL);
-       integrator_clk_init(false);
- }
  #ifdef CONFIG_PM
  static unsigned long ic_irq_enable;
  
@@@ -267,56 -256,12 +253,12 @@@ static struct physmap_flash_data ap_fla
        .set_vpp        = ap_flash_set_vpp,
  };
  
- static struct resource cfi_flash_resource = {
-       .start          = INTEGRATOR_FLASH_BASE,
-       .end            = INTEGRATOR_FLASH_BASE + INTEGRATOR_FLASH_SIZE - 1,
-       .flags          = IORESOURCE_MEM,
- };
- static struct platform_device cfi_flash_device = {
-       .name           = "physmap-flash",
-       .id             = 0,
-       .dev            = {
-               .platform_data  = &ap_flash_data,
-       },
-       .num_resources  = 1,
-       .resource       = &cfi_flash_resource,
- };
- static void __init ap_init(void)
- {
-       unsigned long sc_dec;
-       int i;
-       platform_device_register(&cfi_flash_device);
-       sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET);
-       for (i = 0; i < 4; i++) {
-               struct lm_device *lmdev;
-               if ((sc_dec & (16 << i)) == 0)
-                       continue;
-               lmdev = kzalloc(sizeof(struct lm_device), GFP_KERNEL);
-               if (!lmdev)
-                       continue;
-               lmdev->resource.start = 0xc0000000 + 0x10000000 * i;
-               lmdev->resource.end = lmdev->resource.start + 0x0fffffff;
-               lmdev->resource.flags = IORESOURCE_MEM;
-               lmdev->irq = IRQ_AP_EXPINT0 + i;
-               lmdev->id = i;
-               lm_device_register(lmdev);
-       }
- }
  /*
   * Where is the timer (VA)?
   */
 -#define TIMER0_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER0_BASE)
 -#define TIMER1_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER1_BASE)
 -#define TIMER2_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER2_BASE)
 +#define TIMER0_VA_BASE __io_address(INTEGRATOR_TIMER0_BASE)
 +#define TIMER1_VA_BASE __io_address(INTEGRATOR_TIMER1_BASE)
 +#define TIMER2_VA_BASE __io_address(INTEGRATOR_TIMER2_BASE)
  
  static unsigned long timer_reload;
  
@@@ -325,9 -270,9 +267,9 @@@ static u32 notrace integrator_read_sche
        return -readl((void __iomem *) TIMER2_VA_BASE + TIMER_VALUE);
  }
  
- static void integrator_clocksource_init(unsigned long inrate)
+ static void integrator_clocksource_init(unsigned long inrate,
+                                       void __iomem *base)
  {
-       void __iomem *base = (void __iomem *)TIMER2_VA_BASE;
        u32 ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC;
        unsigned long rate = inrate;
  
        setup_sched_clock(integrator_read_sched_clock, 16, rate);
  }
  
- static void __iomem * const clkevt_base = (void __iomem *)TIMER1_VA_BASE;
+ static void __iomem * clkevt_base;
  
  /*
   * IRQ handler for the timer
@@@ -416,11 -361,13 +358,13 @@@ static struct irqaction integrator_time
        .dev_id         = &integrator_clockevent,
  };
  
- static void integrator_clockevent_init(unsigned long inrate)
+ static void integrator_clockevent_init(unsigned long inrate,
+                               void __iomem *base, int irq)
  {
        unsigned long rate = inrate;
        unsigned int ctrl = 0;
  
+       clkevt_base = base;
        /* Calculate and program a divisor */
        if (rate > 0x100000 * HZ) {
                rate /= 256;
        timer_reload = rate / HZ;
        writel(ctrl, clkevt_base + TIMER_CTRL);
  
-       setup_irq(IRQ_TIMERINT1, &integrator_timer_irq);
+       setup_irq(irq, &integrator_timer_irq);
        clockevents_config_and_register(&integrator_clockevent,
                                        rate,
                                        1,
@@@ -443,9 -390,153 +387,153 @@@ void __init ap_init_early(void
  {
  }
  
+ #ifdef CONFIG_OF
+ static void __init ap_init_timer_of(void)
+ {
+       struct device_node *node;
+       const char *path;
+       void __iomem *base;
+       int err;
+       int irq;
+       struct clk *clk;
+       unsigned long rate;
+       clk = clk_get_sys("ap_timer", NULL);
+       BUG_ON(IS_ERR(clk));
+       clk_prepare_enable(clk);
+       rate = clk_get_rate(clk);
+       err = of_property_read_string(of_aliases,
+                               "arm,timer-primary", &path);
+       if (WARN_ON(err))
+               return;
+       node = of_find_node_by_path(path);
+       base = of_iomap(node, 0);
+       if (WARN_ON(!base))
+               return;
+       writel(0, base + TIMER_CTRL);
+       integrator_clocksource_init(rate, base);
+       err = of_property_read_string(of_aliases,
+                               "arm,timer-secondary", &path);
+       if (WARN_ON(err))
+               return;
+       node = of_find_node_by_path(path);
+       base = of_iomap(node, 0);
+       if (WARN_ON(!base))
+               return;
+       irq = irq_of_parse_and_map(node, 0);
+       writel(0, base + TIMER_CTRL);
+       integrator_clockevent_init(rate, base, irq);
+ }
+ static struct sys_timer ap_of_timer = {
+       .init           = ap_init_timer_of,
+ };
+ static const struct of_device_id fpga_irq_of_match[] __initconst = {
+       { .compatible = "arm,versatile-fpga-irq", .data = fpga_irq_of_init, },
+       { /* Sentinel */ }
+ };
+ static void __init ap_init_irq_of(void)
+ {
+       /* disable core module IRQs */
+       writel(0xffffffffU, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
+       of_irq_init(fpga_irq_of_match);
+       integrator_clk_init(false);
+ }
+ /* For the Device Tree, add in the UART callbacks as AUXDATA */
+ static struct of_dev_auxdata ap_auxdata_lookup[] __initdata = {
+       OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_RTC_BASE,
+               "rtc", NULL),
+       OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_UART0_BASE,
+               "uart0", &integrator_uart_data),
+       OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_UART1_BASE,
+               "uart1", &integrator_uart_data),
+       OF_DEV_AUXDATA("arm,primecell", KMI0_BASE,
+               "kmi0", NULL),
+       OF_DEV_AUXDATA("arm,primecell", KMI1_BASE,
+               "kmi1", NULL),
+       OF_DEV_AUXDATA("cfi-flash", INTEGRATOR_FLASH_BASE,
+               "physmap-flash", &ap_flash_data),
+       { /* sentinel */ },
+ };
+ static void __init ap_init_of(void)
+ {
+       unsigned long sc_dec;
+       int i;
+       of_platform_populate(NULL, of_default_bus_match_table,
+                       ap_auxdata_lookup, NULL);
+       sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET);
+       for (i = 0; i < 4; i++) {
+               struct lm_device *lmdev;
+               if ((sc_dec & (16 << i)) == 0)
+                       continue;
+               lmdev = kzalloc(sizeof(struct lm_device), GFP_KERNEL);
+               if (!lmdev)
+                       continue;
+               lmdev->resource.start = 0xc0000000 + 0x10000000 * i;
+               lmdev->resource.end = lmdev->resource.start + 0x0fffffff;
+               lmdev->resource.flags = IORESOURCE_MEM;
+               lmdev->irq = IRQ_AP_EXPINT0 + i;
+               lmdev->id = i;
+               lm_device_register(lmdev);
+       }
+ }
+ static const char * ap_dt_board_compat[] = {
+       "arm,integrator-ap",
+       NULL,
+ };
+ DT_MACHINE_START(INTEGRATOR_AP_DT, "ARM Integrator/AP (Device Tree)")
+       .reserve        = integrator_reserve,
+       .map_io         = ap_map_io,
+       .nr_irqs        = NR_IRQS_INTEGRATOR_AP,
+       .init_early     = ap_init_early,
+       .init_irq       = ap_init_irq_of,
+       .handle_irq     = fpga_handle_irq,
+       .timer          = &ap_of_timer,
+       .init_machine   = ap_init_of,
+       .restart        = integrator_restart,
+       .dt_compat      = ap_dt_board_compat,
+ MACHINE_END
+ #endif
+ #ifdef CONFIG_ATAGS
  /*
-  * Set up timer(s).
+  * This is where non-devicetree initialization code is collected and stashed
+  * for eventual deletion.
   */
+ static struct resource cfi_flash_resource = {
+       .start          = INTEGRATOR_FLASH_BASE,
+       .end            = INTEGRATOR_FLASH_BASE + INTEGRATOR_FLASH_SIZE - 1,
+       .flags          = IORESOURCE_MEM,
+ };
+ static struct platform_device cfi_flash_device = {
+       .name           = "physmap-flash",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &ap_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &cfi_flash_resource,
+ };
  static void __init ap_init_timer(void)
  {
        struct clk *clk;
        writel(0, TIMER1_VA_BASE + TIMER_CTRL);
        writel(0, TIMER2_VA_BASE + TIMER_CTRL);
  
-       integrator_clocksource_init(rate);
-       integrator_clockevent_init(rate);
+       integrator_clocksource_init(rate, (void __iomem *)TIMER2_VA_BASE);
+       integrator_clockevent_init(rate, (void __iomem *)TIMER1_VA_BASE,
+                               IRQ_TIMERINT1);
  }
  
  static struct sys_timer ap_timer = {
        .init           = ap_init_timer,
  };
  
+ #define INTEGRATOR_SC_VALID_INT       0x003fffff
+ static void __init ap_init_irq(void)
+ {
+       /* Disable all interrupts initially. */
+       /* Do the core module ones */
+       writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
+       /* do the header card stuff next */
+       writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR);
+       writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
+       fpga_irq_init(VA_IC_BASE, "SC", IRQ_PIC_START,
+               -1, INTEGRATOR_SC_VALID_INT, NULL);
+       integrator_clk_init(false);
+ }
+ static void __init ap_init(void)
+ {
+       unsigned long sc_dec;
+       int i;
+       platform_device_register(&cfi_flash_device);
+       sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET);
+       for (i = 0; i < 4; i++) {
+               struct lm_device *lmdev;
+               if ((sc_dec & (16 << i)) == 0)
+                       continue;
+               lmdev = kzalloc(sizeof(struct lm_device), GFP_KERNEL);
+               if (!lmdev)
+                       continue;
+               lmdev->resource.start = 0xc0000000 + 0x10000000 * i;
+               lmdev->resource.end = lmdev->resource.start + 0x0fffffff;
+               lmdev->resource.flags = IORESOURCE_MEM;
+               lmdev->irq = IRQ_AP_EXPINT0 + i;
+               lmdev->id = i;
+               lm_device_register(lmdev);
+       }
+       integrator_init(false);
+ }
  MACHINE_START(INTEGRATOR, "ARM-Integrator")
        /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
        .atag_offset    = 0x100,
        .init_machine   = ap_init,
        .restart        = integrator_restart,
  MACHINE_END
+ #endif
index 3df5fc36936172ce4cf3e47dc4cf6a87918f6917,f51363e2d6feb0f7e22179c89c15b1d27e30d683..6870a1fbcd7870233d20746d1ab892d10c989161
@@@ -23,6 -23,9 +23,9 @@@
  #include <linux/gfp.h>
  #include <linux/mtd/physmap.h>
  #include <linux/platform_data/clk-integrator.h>
+ #include <linux/of_irq.h>
+ #include <linux/of_address.h>
+ #include <linux/of_platform.h>
  
  #include <mach/hardware.h>
  #include <mach/platform.h>
  #include "common.h"
  
  #define INTCP_PA_FLASH_BASE           0x24000000
- #define INTCP_FLASH_SIZE              SZ_32M
  
  #define INTCP_PA_CLCD_BASE            0xc0000000
  
- #define INTCP_VA_CIC_BASE             __io_address(INTEGRATOR_HDR_BASE + 0x40)
- #define INTCP_VA_PIC_BASE             __io_address(INTEGRATOR_IC_BASE)
- #define INTCP_VA_SIC_BASE             __io_address(INTEGRATOR_CP_SIC_BASE)
- #define INTCP_ETH_SIZE                        0x10
 -#define INTCP_VA_CTRL_BASE            IO_ADDRESS(INTEGRATOR_CP_CTL_BASE)
 +#define INTCP_VA_CTRL_BASE            __io_address(INTEGRATOR_CP_CTL_BASE)
  #define INTCP_FLASHPROG                       0x04
  #define CINTEGRATOR_FLASHPROG_FLVPPEN (1 << 0)
  #define CINTEGRATOR_FLASHPROG_FLWREN  (1 << 1)
@@@ -143,37 -139,6 +139,6 @@@ static void __init intcp_map_io(void
        iotable_init(intcp_io_desc, ARRAY_SIZE(intcp_io_desc));
  }
  
- static void __init intcp_init_irq(void)
- {
-       u32 pic_mask, cic_mask, sic_mask;
-       /* These masks are for the HW IRQ registers */
-       pic_mask = ~((~0u) << (11 - IRQ_PIC_START));
-       pic_mask |= (~((~0u) << (29 - 22))) << 22;
-       cic_mask = ~((~0u) << (1 + IRQ_CIC_END - IRQ_CIC_START));
-       sic_mask = ~((~0u) << (1 + IRQ_SIC_END - IRQ_SIC_START));
-       /*
-        * Disable all interrupt sources
-        */
-       writel(0xffffffff, INTCP_VA_PIC_BASE + IRQ_ENABLE_CLEAR);
-       writel(0xffffffff, INTCP_VA_PIC_BASE + FIQ_ENABLE_CLEAR);
-       writel(0xffffffff, INTCP_VA_CIC_BASE + IRQ_ENABLE_CLEAR);
-       writel(0xffffffff, INTCP_VA_CIC_BASE + FIQ_ENABLE_CLEAR);
-       writel(sic_mask, INTCP_VA_SIC_BASE + IRQ_ENABLE_CLEAR);
-       writel(sic_mask, INTCP_VA_SIC_BASE + FIQ_ENABLE_CLEAR);
-       fpga_irq_init(INTCP_VA_PIC_BASE, "PIC", IRQ_PIC_START,
-                     -1, pic_mask, NULL);
-       fpga_irq_init(INTCP_VA_CIC_BASE, "CIC", IRQ_CIC_START,
-                     -1, cic_mask, NULL);
-       fpga_irq_init(INTCP_VA_SIC_BASE, "SIC", IRQ_SIC_START,
-                     IRQ_CP_CPPLDINT, sic_mask, NULL);
-       integrator_clk_init(true);
- }
  /*
   * Flash handling.
   */
@@@ -216,47 -181,6 +181,6 @@@ static struct physmap_flash_data intcp_
        .set_vpp        = intcp_flash_set_vpp,
  };
  
- static struct resource intcp_flash_resource = {
-       .start          = INTCP_PA_FLASH_BASE,
-       .end            = INTCP_PA_FLASH_BASE + INTCP_FLASH_SIZE - 1,
-       .flags          = IORESOURCE_MEM,
- };
- static struct platform_device intcp_flash_device = {
-       .name           = "physmap-flash",
-       .id             = 0,
-       .dev            = {
-               .platform_data  = &intcp_flash_data,
-       },
-       .num_resources  = 1,
-       .resource       = &intcp_flash_resource,
- };
- static struct resource smc91x_resources[] = {
-       [0] = {
-               .start  = INTEGRATOR_CP_ETH_BASE,
-               .end    = INTEGRATOR_CP_ETH_BASE + INTCP_ETH_SIZE - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = IRQ_CP_ETHINT,
-               .end    = IRQ_CP_ETHINT,
-               .flags  = IORESOURCE_IRQ,
-       },
- };
- static struct platform_device smc91x_device = {
-       .name           = "smc91x",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(smc91x_resources),
-       .resource       = smc91x_resources,
- };
- static struct platform_device *intcp_devs[] __initdata = {
-       &intcp_flash_device,
-       &smc91x_device,
- };
  /*
   * It seems that the card insertion interrupt remains active after
   * we've acknowledged it.  We therefore ignore the interrupt, and
   */
  static unsigned int mmc_status(struct device *dev)
  {
 -      unsigned int status = readl(IO_ADDRESS(0xca000000 + 4));
 -      writel(8, IO_ADDRESS(INTEGRATOR_CP_CTL_BASE + 8));
 +      unsigned int status = readl(__io_address(0xca000000 + 4));
 +      writel(8, __io_address(INTEGRATOR_CP_CTL_BASE + 8));
  
        return status & 8;
  }
@@@ -278,16 -202,6 +202,6 @@@ static struct mmci_platform_data mmc_da
        .gpio_cd        = -1,
  };
  
- #define INTEGRATOR_CP_MMC_IRQS        { IRQ_CP_MMCIINT0, IRQ_CP_MMCIINT1 }
- #define INTEGRATOR_CP_AACI_IRQS       { IRQ_CP_AACIINT }
- static AMBA_APB_DEVICE(mmc, "mmci", 0, INTEGRATOR_CP_MMC_BASE,
-       INTEGRATOR_CP_MMC_IRQS, &mmc_data);
- static AMBA_APB_DEVICE(aaci, "aaci", 0, INTEGRATOR_CP_AACI_BASE,
-       INTEGRATOR_CP_AACI_IRQS, NULL);
  /*
   * CLCD support
   */
@@@ -338,15 -252,6 +252,6 @@@ static struct clcd_board clcd_data = 
        .remove         = versatile_clcd_remove_dma,
  };
  
- static AMBA_AHB_DEVICE(clcd, "clcd", 0, INTCP_PA_CLCD_BASE,
-       { IRQ_CP_CLCDCINT }, &clcd_data);
- static struct amba_device *amba_devs[] __initdata = {
-       &mmc_device,
-       &aaci_device,
-       &clcd_device,
- };
  #define REFCOUNTER (__io_address(INTEGRATOR_HDR_BASE) + 0x28)
  
  static void __init intcp_init_early(void)
  #endif
  }
  
- static void __init intcp_init(void)
+ static void __init intcp_timer_init_of(void)
  {
-       int i;
+       struct device_node *node;
+       const char *path;
+       void __iomem *base;
+       int err;
+       int irq;
+       err = of_property_read_string(of_aliases,
+                               "arm,timer-primary", &path);
+       if (WARN_ON(err))
+               return;
+       node = of_find_node_by_path(path);
+       base = of_iomap(node, 0);
+       if (WARN_ON(!base))
+               return;
+       writel(0, base + TIMER_CTRL);
+       sp804_clocksource_init(base, node->name);
+       err = of_property_read_string(of_aliases,
+                               "arm,timer-secondary", &path);
+       if (WARN_ON(err))
+               return;
+       node = of_find_node_by_path(path);
+       base = of_iomap(node, 0);
+       if (WARN_ON(!base))
+               return;
+       irq = irq_of_parse_and_map(node, 0);
+       writel(0, base + TIMER_CTRL);
+       sp804_clockevents_init(base, irq, node->name);
+ }
  
-       platform_add_devices(intcp_devs, ARRAY_SIZE(intcp_devs));
+ static struct sys_timer cp_of_timer = {
+       .init           = intcp_timer_init_of,
+ };
  
-       for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
-               struct amba_device *d = amba_devs[i];
-               amba_device_register(d, &iomem_resource);
-       }
+ #ifdef CONFIG_OF
+ static const struct of_device_id fpga_irq_of_match[] __initconst = {
+       { .compatible = "arm,versatile-fpga-irq", .data = fpga_irq_of_init, },
+       { /* Sentinel */ }
+ };
+ static void __init intcp_init_irq_of(void)
+ {
+       of_irq_init(fpga_irq_of_match);
+       integrator_clk_init(true);
+ }
+ /*
+  * For the Device Tree, add in the UART, MMC and CLCD specifics as AUXDATA
+  * and enforce the bus names since these are used for clock lookups.
+  */
+ static struct of_dev_auxdata intcp_auxdata_lookup[] __initdata = {
+       OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_RTC_BASE,
+               "rtc", NULL),
+       OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_UART0_BASE,
+               "uart0", &integrator_uart_data),
+       OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_UART1_BASE,
+               "uart1", &integrator_uart_data),
+       OF_DEV_AUXDATA("arm,primecell", KMI0_BASE,
+               "kmi0", NULL),
+       OF_DEV_AUXDATA("arm,primecell", KMI1_BASE,
+               "kmi1", NULL),
+       OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_CP_MMC_BASE,
+               "mmci", &mmc_data),
+       OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_CP_AACI_BASE,
+               "aaci", &mmc_data),
+       OF_DEV_AUXDATA("arm,primecell", INTCP_PA_CLCD_BASE,
+               "clcd", &clcd_data),
+       OF_DEV_AUXDATA("cfi-flash", INTCP_PA_FLASH_BASE,
+               "physmap-flash", &intcp_flash_data),
+       { /* sentinel */ },
+ };
+ static void __init intcp_init_of(void)
+ {
+       of_platform_populate(NULL, of_default_bus_match_table,
+                       intcp_auxdata_lookup, NULL);
+ }
+ static const char * intcp_dt_board_compat[] = {
+       "arm,integrator-cp",
+       NULL,
+ };
+ DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")
+       .reserve        = integrator_reserve,
+       .map_io         = intcp_map_io,
+       .nr_irqs        = NR_IRQS_INTEGRATOR_CP,
+       .init_early     = intcp_init_early,
+       .init_irq       = intcp_init_irq_of,
+       .handle_irq     = fpga_handle_irq,
+       .timer          = &cp_of_timer,
+       .init_machine   = intcp_init_of,
+       .restart        = integrator_restart,
+       .dt_compat      = intcp_dt_board_compat,
+ MACHINE_END
+ #endif
+ #ifdef CONFIG_ATAGS
+ /*
+  * This is where non-devicetree initialization code is collected and stashed
+  * for eventual deletion.
+  */
+ #define INTCP_FLASH_SIZE              SZ_32M
+ static struct resource intcp_flash_resource = {
+       .start          = INTCP_PA_FLASH_BASE,
+       .end            = INTCP_PA_FLASH_BASE + INTCP_FLASH_SIZE - 1,
+       .flags          = IORESOURCE_MEM,
+ };
+ static struct platform_device intcp_flash_device = {
+       .name           = "physmap-flash",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &intcp_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &intcp_flash_resource,
+ };
+ #define INTCP_ETH_SIZE                        0x10
+ static struct resource smc91x_resources[] = {
+       [0] = {
+               .start  = INTEGRATOR_CP_ETH_BASE,
+               .end    = INTEGRATOR_CP_ETH_BASE + INTCP_ETH_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_CP_ETHINT,
+               .end    = IRQ_CP_ETHINT,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device smc91x_device = {
+       .name           = "smc91x",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(smc91x_resources),
+       .resource       = smc91x_resources,
+ };
+ static struct platform_device *intcp_devs[] __initdata = {
+       &intcp_flash_device,
+       &smc91x_device,
+ };
+ #define INTCP_VA_CIC_BASE             __io_address(INTEGRATOR_HDR_BASE + 0x40)
+ #define INTCP_VA_PIC_BASE             __io_address(INTEGRATOR_IC_BASE)
+ #define INTCP_VA_SIC_BASE             __io_address(INTEGRATOR_CP_SIC_BASE)
+ static void __init intcp_init_irq(void)
+ {
+       u32 pic_mask, cic_mask, sic_mask;
+       /* These masks are for the HW IRQ registers */
+       pic_mask = ~((~0u) << (11 - IRQ_PIC_START));
+       pic_mask |= (~((~0u) << (29 - 22))) << 22;
+       cic_mask = ~((~0u) << (1 + IRQ_CIC_END - IRQ_CIC_START));
+       sic_mask = ~((~0u) << (1 + IRQ_SIC_END - IRQ_SIC_START));
+       /*
+        * Disable all interrupt sources
+        */
+       writel(0xffffffff, INTCP_VA_PIC_BASE + IRQ_ENABLE_CLEAR);
+       writel(0xffffffff, INTCP_VA_PIC_BASE + FIQ_ENABLE_CLEAR);
+       writel(0xffffffff, INTCP_VA_CIC_BASE + IRQ_ENABLE_CLEAR);
+       writel(0xffffffff, INTCP_VA_CIC_BASE + FIQ_ENABLE_CLEAR);
+       writel(sic_mask, INTCP_VA_SIC_BASE + IRQ_ENABLE_CLEAR);
+       writel(sic_mask, INTCP_VA_SIC_BASE + FIQ_ENABLE_CLEAR);
+       fpga_irq_init(INTCP_VA_PIC_BASE, "PIC", IRQ_PIC_START,
+                     -1, pic_mask, NULL);
+       fpga_irq_init(INTCP_VA_CIC_BASE, "CIC", IRQ_CIC_START,
+                     -1, cic_mask, NULL);
+       fpga_irq_init(INTCP_VA_SIC_BASE, "SIC", IRQ_SIC_START,
+                     IRQ_CP_CPPLDINT, sic_mask, NULL);
+       integrator_clk_init(true);
  }
  
  #define TIMER0_VA_BASE __io_address(INTEGRATOR_TIMER0_BASE)
@@@ -386,6 -468,37 +468,37 @@@ static struct sys_timer cp_timer = 
        .init           = intcp_timer_init,
  };
  
+ #define INTEGRATOR_CP_MMC_IRQS        { IRQ_CP_MMCIINT0, IRQ_CP_MMCIINT1 }
+ #define INTEGRATOR_CP_AACI_IRQS       { IRQ_CP_AACIINT }
+ static AMBA_APB_DEVICE(mmc, "mmci", 0, INTEGRATOR_CP_MMC_BASE,
+       INTEGRATOR_CP_MMC_IRQS, &mmc_data);
+ static AMBA_APB_DEVICE(aaci, "aaci", 0, INTEGRATOR_CP_AACI_BASE,
+       INTEGRATOR_CP_AACI_IRQS, NULL);
+ static AMBA_AHB_DEVICE(clcd, "clcd", 0, INTCP_PA_CLCD_BASE,
+       { IRQ_CP_CLCDCINT }, &clcd_data);
+ static struct amba_device *amba_devs[] __initdata = {
+       &mmc_device,
+       &aaci_device,
+       &clcd_device,
+ };
+ static void __init intcp_init(void)
+ {
+       int i;
+       platform_add_devices(intcp_devs, ARRAY_SIZE(intcp_devs));
+       for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
+               struct amba_device *d = amba_devs[i];
+               amba_device_register(d, &iomem_resource);
+       }
+       integrator_init(true);
+ }
  MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
        /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
        .atag_offset    = 0x100,
        .init_machine   = intcp_init,
        .restart        = integrator_restart,
  MACHINE_END
+ #endif
index f978c5d0e1ae98051159b6b6dce04db532f09a2d,030558f474a4f13f6bf37c68d79f0e272ac76888..f6745628628003f6f23e5e16c3ea175177f256a6
@@@ -50,7 -50,7 +50,7 @@@ static void modify_scu_cpu_psr(unsigne
  
  }
  
 -unsigned int __init emev2_get_core_count(void)
 +static unsigned int __init emev2_get_core_count(void)
  {
        if (!scu_base) {
                scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
        return scu_base ? scu_get_core_count(scu_base) : 1;
  }
  
 -int emev2_platform_cpu_kill(unsigned int cpu)
 +static int emev2_platform_cpu_kill(unsigned int cpu)
  {
        return 0; /* not supported yet */
  }
  
 -void __cpuinit emev2_secondary_init(unsigned int cpu)
 +static int __maybe_unused emev2_cpu_kill(unsigned int cpu)
 +{
 +      int k;
 +
 +      /* this function is running on another CPU than the offline target,
 +       * here we need wait for shutdown code in platform_cpu_die() to
 +       * finish before asking SoC-specific code to power off the CPU core.
 +       */
 +      for (k = 0; k < 1000; k++) {
 +              if (shmobile_cpu_is_dead(cpu))
 +                      return emev2_platform_cpu_kill(cpu);
 +              mdelay(1);
 +      }
 +
 +      return 0;
 +}
 +
 +
 +static void __cpuinit emev2_secondary_init(unsigned int cpu)
  {
        gic_secondary_init(0);
  }
  
 -int __cpuinit emev2_boot_secondary(unsigned int cpu)
 +static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
  {
        cpu = cpu_logical_map(cpu);
  
        /* Tell ROM loader about our vector (in headsmp.S) */
        emev2_set_boot_vector(__pa(shmobile_secondary_vector));
  
-       gic_raise_softirq(cpumask_of(cpu), 1);
+       gic_raise_softirq(cpumask_of(cpu), 0);
        return 0;
  }
  
 -void __init emev2_smp_prepare_cpus(void)
 +static void __init emev2_smp_prepare_cpus(unsigned int max_cpus)
  {
        int cpu = cpu_logical_map(0);
  
        /* enable cache coherency on CPU0 */
        modify_scu_cpu_psr(0, 3 << (cpu * 8));
  }
 +
 +static void __init emev2_smp_init_cpus(void)
 +{
 +      unsigned int ncores = emev2_get_core_count();
 +
 +      shmobile_smp_init_cpus(ncores);
 +}
 +
 +struct smp_operations emev2_smp_ops __initdata = {
 +      .smp_init_cpus          = emev2_smp_init_cpus,
 +      .smp_prepare_cpus       = emev2_smp_prepare_cpus,
 +      .smp_secondary_init     = emev2_secondary_init,
 +      .smp_boot_secondary     = emev2_boot_secondary,
 +#ifdef CONFIG_HOTPLUG_CPU
 +      .cpu_kill               = emev2_cpu_kill,
 +      .cpu_die                = shmobile_cpu_die,
 +      .cpu_disable            = shmobile_cpu_disable,
 +#endif
 +};
diff --combined arch/arm/mm/cache-l2x0.c
index 577baf7d0a8de418aa7a949dcbfb0ec824b7c3d0,97ec2565805a3475585ed6a397b8a1035472a891..8a97e6443c62935f3083a950590cd13ce6b4de90
@@@ -368,14 -368,18 +368,18 @@@ void __init l2x0_init(void __iomem *bas
                /* l2x0 controller is disabled */
                writel_relaxed(aux, l2x0_base + L2X0_AUX_CTRL);
  
-               l2x0_saved_regs.aux_ctrl = aux;
                l2x0_inv_all();
  
                /* enable L2X0 */
                writel_relaxed(1, l2x0_base + L2X0_CTRL);
        }
  
+       /* Re-read it in case some bits are reserved. */
+       aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);
+       /* Save the value for resuming. */
+       l2x0_saved_regs.aux_ctrl = aux;
        outer_cache.inv_range = l2x0_inv_range;
        outer_cache.clean_range = l2x0_clean_range;
        outer_cache.flush_range = l2x0_flush_range;
@@@ -554,7 -558,7 +558,7 @@@ static const struct of_device_id l2x0_i
  int __init l2x0_of_init(u32 aux_val, u32 aux_mask)
  {
        struct device_node *np;
 -      struct l2x0_of_data *data;
 +      const struct l2x0_of_data *data;
        struct resource res;
  
        np = of_find_matching_node(NULL, l2x0_ids);
diff --combined arch/arm/mm/ioremap.c
index 9d869f93a3da29a275101418cceba6fb122189b4,491f6b3336f52a4a8da8670ceeed366862e77b53..5dcc2fd46c465fcf5ed2e8fc8f68767afe288408
@@@ -36,7 -36,6 +36,7 @@@
  #include <asm/system_info.h>
  
  #include <asm/mach/map.h>
 +#include <asm/mach/pci.h>
  #include "mm.h"
  
  int ioremap_page(unsigned long virt, unsigned long phys,
@@@ -248,6 -247,7 +248,7 @@@ void __iomem * __arm_ioremap_pfn_caller
        if (!area)
                return NULL;
        addr = (unsigned long)area->addr;
+       area->phys_addr = __pfn_to_phys(pfn);
  
  #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE)
        if (DOMAIN_IO == 0 &&
@@@ -384,16 -384,3 +385,16 @@@ void __arm_iounmap(volatile void __iome
        arch_iounmap(io_addr);
  }
  EXPORT_SYMBOL(__arm_iounmap);
 +
 +#ifdef CONFIG_PCI
 +int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr)
 +{
 +      BUG_ON(offset + SZ_64K > IO_SPACE_LIMIT);
 +
 +      return ioremap_page_range(PCI_IO_VIRT_BASE + offset,
 +                                PCI_IO_VIRT_BASE + offset + SZ_64K,
 +                                phys_addr,
 +                                __pgprot(get_mem_type(MT_DEVICE)->prot_pte));
 +}
 +EXPORT_SYMBOL_GPL(pci_ioremap_io);
 +#endif
This page took 0.21471 seconds and 4 git commands to generate.