Эх сурвалжийг харах

Merge branches 'iommu/fixes', 'x86/vt-d', 'x86/amd', 'ppc/pamu', 'core' and 'arm/tegra' into next

Joerg Roedel 12 жил өмнө
100 өөрчлөгдсөн 571 нэмэгдсэн , 458 устгасан
  1. 1 1
      Documentation/DocBook/device-drivers.tmpl
  2. 40 3
      Documentation/kernel-parameters.txt
  3. 7 0
      Documentation/networking/ipvs-sysctl.txt
  4. 1 1
      Documentation/scsi/LICENSE.qla2xxx
  5. 2 3
      Documentation/sound/alsa/ALSA-Configuration.txt
  6. 24 18
      MAINTAINERS
  7. 3 2
      Makefile
  8. 1 1
      arch/alpha/Makefile
  9. 1 1
      arch/alpha/include/asm/floppy.h
  10. 0 7
      arch/alpha/kernel/irq.c
  11. 8 2
      arch/alpha/kernel/irq_alpha.c
  12. 5 0
      arch/alpha/kernel/sys_nautilus.c
  13. 7 7
      arch/alpha/kernel/sys_titan.c
  14. 1 1
      arch/arc/include/asm/dma-mapping.h
  15. 0 3
      arch/arc/include/asm/elf.h
  16. 1 1
      arch/arc/include/asm/entry.h
  17. 8 4
      arch/arc/include/asm/irqflags.h
  18. 2 4
      arch/arc/include/asm/kgdb.h
  19. 1 1
      arch/arc/include/asm/ptrace.h
  20. 0 2
      arch/arc/include/asm/syscalls.h
  21. 2 2
      arch/arc/include/uapi/asm/ptrace.h
  22. 1 26
      arch/arc/kernel/entry.S
  23. 1 0
      arch/arc/kernel/kgdb.c
  24. 1 3
      arch/arc/kernel/setup.c
  25. 0 2
      arch/arc/kernel/sys.c
  26. 12 2
      arch/arm/Kconfig
  27. 1 0
      arch/arm/Kconfig.debug
  28. 1 1
      arch/arm/boot/dts/armada-370-mirabox.dts
  29. 6 0
      arch/arm/boot/dts/armada-370.dtsi
  30. 2 2
      arch/arm/boot/dts/dbx5x0.dtsi
  31. 0 1
      arch/arm/boot/dts/imx28-m28evk.dts
  32. 0 1
      arch/arm/boot/dts/imx28-sps1.dts
  33. 1 0
      arch/arm/boot/dts/imx6qdl.dtsi
  34. 1 0
      arch/arm/boot/dts/kirkwood-goflexnet.dts
  35. 7 7
      arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts
  36. 7 2
      arch/arm/boot/dts/orion5x.dtsi
  37. 1 1
      arch/arm/boot/dts/tegra20.dtsi
  38. 1 1
      arch/arm/boot/dts/tegra30.dtsi
  39. 1 1
      arch/arm/include/asm/delay.h
  40. 0 8
      arch/arm/include/asm/glue-cache.h
  41. 1 1
      arch/arm/include/asm/hardware/iop3xx.h
  42. 7 0
      arch/arm/include/asm/highmem.h
  43. 2 0
      arch/arm/include/asm/mmu_context.h
  44. 1 1
      arch/arm/include/asm/pgtable-3level.h
  45. 17 9
      arch/arm/include/asm/tlbflush.h
  46. 12 0
      arch/arm/kernel/entry-common.S
  47. 1 1
      arch/arm/kernel/head.S
  48. 4 4
      arch/arm/kernel/hw_breakpoint.c
  49. 4 1
      arch/arm/kernel/perf_event.c
  50. 2 2
      arch/arm/kernel/sched_clock.c
  51. 22 5
      arch/arm/kernel/setup.c
  52. 0 3
      arch/arm/kernel/smp.c
  53. 66 0
      arch/arm/kernel/smp_tlb.c
  54. 0 1
      arch/arm/kernel/tcm.c
  55. 1 0
      arch/arm/kvm/arm.c
  56. 2 2
      arch/arm/kvm/coproc.c
  57. 14 21
      arch/arm/kvm/vgic.c
  58. 5 3
      arch/arm/lib/delay.c
  59. 3 13
      arch/arm/mach-cns3xxx/core.c
  60. 8 8
      arch/arm/mach-cns3xxx/include/mach/cns3xxx.h
  61. 7 3
      arch/arm/mach-ep93xx/include/mach/uncompress.h
  62. 4 6
      arch/arm/mach-highbank/hotplug.c
  63. 2 0
      arch/arm/mach-imx/clk-imx35.c
  64. 1 2
      arch/arm/mach-imx/clk-imx6q.c
  65. 2 0
      arch/arm/mach-imx/common.h
  66. 12 0
      arch/arm/mach-imx/hotplug.c
  67. 12 0
      arch/arm/mach-imx/src.c
  68. 6 1
      arch/arm/mach-kirkwood/board-iomega_ix2_200.c
  69. 2 0
      arch/arm/mach-kirkwood/guruplug-setup.c
  70. 1 0
      arch/arm/mach-kirkwood/openrd-setup.c
  71. 1 0
      arch/arm/mach-kirkwood/rd88f6281-setup.c
  72. 4 1
      arch/arm/mach-msm/timer.c
  73. 10 14
      arch/arm/mach-mvebu/irq-armada-370-xp.c
  74. 12 12
      arch/arm/mach-mxs/mach-mxs.c
  75. 1 11
      arch/arm/mach-omap1/clock_data.c
  76. 20 0
      arch/arm/mach-omap2/cclock44xx_data.c
  77. 3 0
      arch/arm/mach-omap2/common.h
  78. 12 6
      arch/arm/mach-omap2/io.c
  79. 5 2
      arch/arm/mach-omap2/omap_hwmod.c
  80. 7 2
      arch/arm/mach-omap2/omap_hwmod.h
  81. 6 1
      arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
  82. 11 1
      arch/arm/mach-omap2/omap_hwmod_44xx_data.c
  83. 4 0
      arch/arm/mach-omap2/timer.c
  84. 1 3
      arch/arm/mach-s3c24xx/include/mach/irqs.h
  85. 1 1
      arch/arm/mach-s3c24xx/irq.c
  86. 0 1
      arch/arm/mach-ux500/board-mop500-sdi.c
  87. 12 0
      arch/arm/mach-ux500/board-mop500.c
  88. 1 0
      arch/arm/mach-ux500/board-mop500.h
  89. 3 2
      arch/arm/mach-ux500/cpu-db8500.c
  90. 1 4
      arch/arm/mm/Kconfig
  91. 0 1
      arch/arm/mm/Makefile
  92. 1 0
      arch/arm/mm/cache-feroceon-l2.c
  93. 4 7
      arch/arm/mm/cache-l2x0.c
  94. 0 137
      arch/arm/mm/cache-v3.S
  95. 1 1
      arch/arm/mm/cache-v4.S
  96. 2 1
      arch/arm/mm/context.c
  97. 49 26
      arch/arm/mm/mmu.c
  98. 17 13
      arch/arm/mm/proc-arm740.S
  99. 1 1
      arch/arm/mm/proc-arm920.S
  100. 1 1
      arch/arm/mm/proc-arm926.S

+ 1 - 1
Documentation/DocBook/device-drivers.tmpl

@@ -227,7 +227,7 @@ X!Isound/sound_firmware.c
   <chapter id="uart16x50">
   <chapter id="uart16x50">
      <title>16x50 UART Driver</title>
      <title>16x50 UART Driver</title>
 !Edrivers/tty/serial/serial_core.c
 !Edrivers/tty/serial/serial_core.c
-!Edrivers/tty/serial/8250/8250.c
+!Edrivers/tty/serial/8250/8250_core.c
   </chapter>
   </chapter>
 
 
   <chapter id="fbdev">
   <chapter id="fbdev">

+ 40 - 3
Documentation/kernel-parameters.txt

@@ -596,9 +596,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 			is selected automatically. Check
 			is selected automatically. Check
 			Documentation/kdump/kdump.txt for further details.
 			Documentation/kdump/kdump.txt for further details.
 
 
-	crashkernel_low=size[KMG]
-			[KNL, x86] parts under 4G.
-
 	crashkernel=range1:size1[,range2:size2,...][@offset]
 	crashkernel=range1:size1[,range2:size2,...][@offset]
 			[KNL] Same as above, but depends on the memory
 			[KNL] Same as above, but depends on the memory
 			in the running system. The syntax of range is
 			in the running system. The syntax of range is
@@ -606,6 +603,26 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 			a memory unit (amount[KMG]). See also
 			a memory unit (amount[KMG]). See also
 			Documentation/kdump/kdump.txt for an example.
 			Documentation/kdump/kdump.txt for an example.
 
 
+	crashkernel=size[KMG],high
+			[KNL, x86_64] range could be above 4G. Allow kernel
+			to allocate physical memory region from top, so could
+			be above 4G if system have more than 4G ram installed.
+			Otherwise memory region will be allocated below 4G, if
+			available.
+			It will be ignored if crashkernel=X is specified.
+	crashkernel=size[KMG],low
+			[KNL, x86_64] range under 4G. When crashkernel=X,high
+			is passed, kernel could allocate physical memory region
+			above 4G, that cause second kernel crash on system
+			that require some amount of low memory, e.g. swiotlb
+			requires at least 64M+32K low memory.  Kernel would
+			try to allocate 72M below 4G automatically.
+			This one let user to specify own low range under 4G
+			for second kernel instead.
+			0: to disable low allocation.
+			It will be ignored when crashkernel=X,high is not used
+			or memory reserved is below 4G.
+
 	cs89x0_dma=	[HW,NET]
 	cs89x0_dma=	[HW,NET]
 			Format: <dma>
 			Format: <dma>
 
 
@@ -788,6 +805,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 	edd=		[EDD]
 	edd=		[EDD]
 			Format: {"off" | "on" | "skip[mbr]"}
 			Format: {"off" | "on" | "skip[mbr]"}
 
 
+	efi_no_storage_paranoia [EFI; X86]
+			Using this parameter you can use more than 50% of
+			your efi variable storage. Use this parameter only if
+			you are really sure that your UEFI does sane gc and
+			fulfills the spec otherwise your board may brick.
+
 	eisa_irq_edge=	[PARISC,HW]
 	eisa_irq_edge=	[PARISC,HW]
 			See header of drivers/parisc/eisa.c.
 			See header of drivers/parisc/eisa.c.
 
 
@@ -1226,6 +1249,20 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 
 
 	iucv=		[HW,NET]
 	iucv=		[HW,NET]
 
 
+	ivrs_ioapic	[HW,X86_64]
+			Provide an override to the IOAPIC-ID<->DEVICE-ID
+			mapping provided in the IVRS ACPI table. For
+			example, to map IOAPIC-ID decimal 10 to
+			PCI device 00:14.0 write the parameter as:
+				ivrs_ioapic[10]=00:14.0
+
+	ivrs_hpet	[HW,X86_64]
+			Provide an override to the HPET-ID<->DEVICE-ID
+			mapping provided in the IVRS ACPI table. For
+			example, to map HPET-ID decimal 0 to
+			PCI device 00:14.0 write the parameter as:
+				ivrs_hpet[0]=00:14.0
+
 	js=		[HW,JOY] Analog joystick
 	js=		[HW,JOY] Analog joystick
 			See Documentation/input/joystick.txt.
 			See Documentation/input/joystick.txt.
 
 

+ 7 - 0
Documentation/networking/ipvs-sysctl.txt

@@ -15,6 +15,13 @@ amemthresh - INTEGER
         enabled and the variable is automatically set to 2, otherwise
         enabled and the variable is automatically set to 2, otherwise
         the strategy is disabled and the variable is  set  to 1.
         the strategy is disabled and the variable is  set  to 1.
 
 
+backup_only - BOOLEAN
+	0 - disabled (default)
+	not 0 - enabled
+
+	If set, disable the director function while the server is
+	in backup mode to avoid packet loops for DR/TUN methods.
+
 conntrack - BOOLEAN
 conntrack - BOOLEAN
 	0 - disabled (default)
 	0 - disabled (default)
 	not 0 - enabled
 	not 0 - enabled

+ 1 - 1
Documentation/scsi/LICENSE.qla2xxx

@@ -1,4 +1,4 @@
-Copyright (c) 2003-2012 QLogic Corporation
+Copyright (c) 2003-2013 QLogic Corporation
 QLogic Linux FC-FCoE Driver
 QLogic Linux FC-FCoE Driver
 
 
 This program includes a device driver for Linux 3.x.
 This program includes a device driver for Linux 3.x.

+ 2 - 3
Documentation/sound/alsa/ALSA-Configuration.txt

@@ -890,9 +890,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
     enable_msi	- Enable Message Signaled Interrupt (MSI) (default = off)
     enable_msi	- Enable Message Signaled Interrupt (MSI) (default = off)
     power_save	- Automatic power-saving timeout (in second, 0 =
     power_save	- Automatic power-saving timeout (in second, 0 =
 		disable)
 		disable)
-    power_save_controller - Support runtime D3 of HD-audio controller
-		(-1 = on for supported chip (default), false = off,
-		 true = force to on even for unsupported hardware)
+    power_save_controller - Reset HD-audio controller in power-saving mode
+		(default = on)
     align_buffer_size - Force rounding of buffer/period sizes to multiples
     align_buffer_size - Force rounding of buffer/period sizes to multiples
     		      of 128 bytes. This is more efficient in terms of memory
     		      of 128 bytes. This is more efficient in terms of memory
 		      access but isn't required by the HDA spec and prevents
 		      access but isn't required by the HDA spec and prevents

+ 24 - 18
MAINTAINERS

@@ -3242,6 +3242,12 @@ F:	Documentation/firmware_class/
 F:	drivers/base/firmware*.c
 F:	drivers/base/firmware*.c
 F:	include/linux/firmware.h
 F:	include/linux/firmware.h
 
 
+FLASHSYSTEM DRIVER (IBM FlashSystem 70/80 PCI SSD Flash Card)
+M:	Joshua Morris <josh.h.morris@us.ibm.com>
+M:	Philip Kelleher <pjk1939@linux.vnet.ibm.com>
+S:	Maintained
+F:	drivers/block/rsxx/
+
 FLOPPY DRIVER
 FLOPPY DRIVER
 M:	Jiri Kosina <jkosina@suse.cz>
 M:	Jiri Kosina <jkosina@suse.cz>
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/floppy.git
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/floppy.git
@@ -4935,6 +4941,12 @@ W:	logfs.org
 S:	Maintained
 S:	Maintained
 F:	fs/logfs/
 F:	fs/logfs/
 
 
+LPC32XX MACHINE SUPPORT
+M:	Roland Stigge <stigge@antcom.de>
+L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+S:	Maintained
+F:	arch/arm/mach-lpc32xx/
+
 LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
 LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
 M:	Nagalakshmi Nandigama <Nagalakshmi.Nandigama@lsi.com>
 M:	Nagalakshmi Nandigama <Nagalakshmi.Nandigama@lsi.com>
 M:	Sreekanth Reddy <Sreekanth.Reddy@lsi.com>
 M:	Sreekanth Reddy <Sreekanth.Reddy@lsi.com>
@@ -5059,9 +5071,8 @@ S:	Maintained
 F:	drivers/net/ethernet/marvell/sk*
 F:	drivers/net/ethernet/marvell/sk*
 
 
 MARVELL LIBERTAS WIRELESS DRIVER
 MARVELL LIBERTAS WIRELESS DRIVER
-M:	Dan Williams <dcbw@redhat.com>
 L:	libertas-dev@lists.infradead.org
 L:	libertas-dev@lists.infradead.org
-S:	Maintained
+S:	Orphan
 F:	drivers/net/wireless/libertas/
 F:	drivers/net/wireless/libertas/
 
 
 MARVELL MV643XX ETHERNET DRIVER
 MARVELL MV643XX ETHERNET DRIVER
@@ -5563,6 +5574,7 @@ F:	include/uapi/linux/if_*
 F:	include/uapi/linux/netdevice.h
 F:	include/uapi/linux/netdevice.h
 
 
 NETXEN (1/10) GbE SUPPORT
 NETXEN (1/10) GbE SUPPORT
+M:	Manish Chopra <manish.chopra@qlogic.com>
 M:	Sony Chacko <sony.chacko@qlogic.com>
 M:	Sony Chacko <sony.chacko@qlogic.com>
 M:	Rajesh Borundia <rajesh.borundia@qlogic.com>
 M:	Rajesh Borundia <rajesh.borundia@qlogic.com>
 L:	netdev@vger.kernel.org
 L:	netdev@vger.kernel.org
@@ -5683,7 +5695,7 @@ S:	Maintained
 F:	arch/arm/*omap*/*clock*
 F:	arch/arm/*omap*/*clock*
 
 
 OMAP POWER MANAGEMENT SUPPORT
 OMAP POWER MANAGEMENT SUPPORT
-M:	Kevin Hilman <khilman@ti.com>
+M:	Kevin Hilman <khilman@deeprootsystems.com>
 L:	linux-omap@vger.kernel.org
 L:	linux-omap@vger.kernel.org
 S:	Maintained
 S:	Maintained
 F:	arch/arm/*omap*/*pm*
 F:	arch/arm/*omap*/*pm*
@@ -5777,7 +5789,7 @@ F:	arch/arm/*omap*/usb*
 
 
 OMAP GPIO DRIVER
 OMAP GPIO DRIVER
 M:	Santosh Shilimkar <santosh.shilimkar@ti.com>
 M:	Santosh Shilimkar <santosh.shilimkar@ti.com>
-M:	Kevin Hilman <khilman@ti.com>
+M:	Kevin Hilman <khilman@deeprootsystems.com>
 L:	linux-omap@vger.kernel.org
 L:	linux-omap@vger.kernel.org
 S:	Maintained
 S:	Maintained
 F:	drivers/gpio/gpio-omap.c
 F:	drivers/gpio/gpio-omap.c
@@ -6209,7 +6221,7 @@ F:	include/linux/power_supply.h
 F:	drivers/power/
 F:	drivers/power/
 
 
 PNP SUPPORT
 PNP SUPPORT
-M:	Adam Belay <abelay@mit.edu>
+M:	Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 M:	Bjorn Helgaas <bhelgaas@google.com>
 M:	Bjorn Helgaas <bhelgaas@google.com>
 S:	Maintained
 S:	Maintained
 F:	drivers/pnp/
 F:	drivers/pnp/
@@ -6551,12 +6563,6 @@ S:	Maintained
 F:	Documentation/blockdev/ramdisk.txt
 F:	Documentation/blockdev/ramdisk.txt
 F:	drivers/block/brd.c
 F:	drivers/block/brd.c
 
 
-RAMSAM DRIVER (IBM RamSan 70/80 PCI SSD Flash Card)
-M:	Joshua Morris <josh.h.morris@us.ibm.com>
-M:	Philip Kelleher <pjk1939@linux.vnet.ibm.com>
-S:	Maintained
-F:	drivers/block/rsxx/
-
 RANDOM NUMBER DRIVER
 RANDOM NUMBER DRIVER
 M:	Theodore Ts'o" <tytso@mit.edu>
 M:	Theodore Ts'o" <tytso@mit.edu>
 S:	Maintained
 S:	Maintained
@@ -6625,7 +6631,7 @@ S:	Supported
 F:	fs/reiserfs/
 F:	fs/reiserfs/
 
 
 REGISTER MAP ABSTRACTION
 REGISTER MAP ABSTRACTION
-M:	Mark Brown <broonie@opensource.wolfsonmicro.com>
+M:	Mark Brown <broonie@kernel.org>
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git
 S:	Supported
 S:	Supported
 F:	drivers/base/regmap/
 F:	drivers/base/regmap/
@@ -6951,7 +6957,6 @@ F:	drivers/scsi/st*
 
 
 SCTP PROTOCOL
 SCTP PROTOCOL
 M:	Vlad Yasevich <vyasevich@gmail.com>
 M:	Vlad Yasevich <vyasevich@gmail.com>
-M:	Sridhar Samudrala <sri@us.ibm.com>
 M:	Neil Horman <nhorman@tuxdriver.com>
 M:	Neil Horman <nhorman@tuxdriver.com>
 L:	linux-sctp@vger.kernel.org
 L:	linux-sctp@vger.kernel.org
 W:	http://lksctp.sourceforge.net
 W:	http://lksctp.sourceforge.net
@@ -7173,7 +7178,7 @@ F:	arch/arm/mach-s3c2410/bast-irq.c
 
 
 TI DAVINCI MACHINE SUPPORT
 TI DAVINCI MACHINE SUPPORT
 M:	Sekhar Nori <nsekhar@ti.com>
 M:	Sekhar Nori <nsekhar@ti.com>
-M:	Kevin Hilman <khilman@ti.com>
+M:	Kevin Hilman <khilman@deeprootsystems.com>
 L:	davinci-linux-open-source@linux.davincidsp.com (moderated for non-subscribers)
 L:	davinci-linux-open-source@linux.davincidsp.com (moderated for non-subscribers)
 T:	git git://gitorious.org/linux-davinci/linux-davinci.git
 T:	git git://gitorious.org/linux-davinci/linux-davinci.git
 Q:	http://patchwork.kernel.org/project/linux-davinci/list/
 Q:	http://patchwork.kernel.org/project/linux-davinci/list/
@@ -7374,7 +7379,7 @@ F:	sound/
 
 
 SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
 SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
 M:	Liam Girdwood <lgirdwood@gmail.com>
 M:	Liam Girdwood <lgirdwood@gmail.com>
-M:	Mark Brown <broonie@opensource.wolfsonmicro.com>
+M:	Mark Brown <broonie@kernel.org>
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
 L:	alsa-devel@alsa-project.org (moderated for non-subscribers)
 L:	alsa-devel@alsa-project.org (moderated for non-subscribers)
 W:	http://alsa-project.org/main/index.php/ASoC
 W:	http://alsa-project.org/main/index.php/ASoC
@@ -7463,7 +7468,7 @@ F:	drivers/clk/spear/
 
 
 SPI SUBSYSTEM
 SPI SUBSYSTEM
 M:	Grant Likely <grant.likely@secretlab.ca>
 M:	Grant Likely <grant.likely@secretlab.ca>
-M:	Mark Brown <broonie@opensource.wolfsonmicro.com>
+M:	Mark Brown <broonie@kernel.org>
 L:	spi-devel-general@lists.sourceforge.net
 L:	spi-devel-general@lists.sourceforge.net
 Q:	http://patchwork.kernel.org/project/spi-devel-general/list/
 Q:	http://patchwork.kernel.org/project/spi-devel-general/list/
 T:	git git://git.secretlab.ca/git/linux-2.6.git
 T:	git git://git.secretlab.ca/git/linux-2.6.git
@@ -7706,9 +7711,10 @@ F:	include/linux/swiotlb.h
 
 
 SYNOPSYS ARC ARCHITECTURE
 SYNOPSYS ARC ARCHITECTURE
 M:	Vineet Gupta <vgupta@synopsys.com>
 M:	Vineet Gupta <vgupta@synopsys.com>
-L:	linux-snps-arc@vger.kernel.org
 S:	Supported
 S:	Supported
 F:	arch/arc/
 F:	arch/arc/
+F:	Documentation/devicetree/bindings/arc/
+F:	drivers/tty/serial/arc-uart.c
 
 
 SYSV FILESYSTEM
 SYSV FILESYSTEM
 M:	Christoph Hellwig <hch@infradead.org>
 M:	Christoph Hellwig <hch@infradead.org>
@@ -8707,7 +8713,7 @@ F:	drivers/scsi/vmw_pvscsi.h
 
 
 VOLTAGE AND CURRENT REGULATOR FRAMEWORK
 VOLTAGE AND CURRENT REGULATOR FRAMEWORK
 M:	Liam Girdwood <lrg@ti.com>
 M:	Liam Girdwood <lrg@ti.com>
-M:	Mark Brown <broonie@opensource.wolfsonmicro.com>
+M:	Mark Brown <broonie@kernel.org>
 W:	http://opensource.wolfsonmicro.com/node/15
 W:	http://opensource.wolfsonmicro.com/node/15
 W:	http://www.slimlogic.co.uk/?p=48
 W:	http://www.slimlogic.co.uk/?p=48
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/regulator.git
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/lrg/regulator.git

+ 3 - 2
Makefile

@@ -1,7 +1,7 @@
 VERSION = 3
 VERSION = 3
 PATCHLEVEL = 9
 PATCHLEVEL = 9
 SUBLEVEL = 0
 SUBLEVEL = 0
-EXTRAVERSION = -rc4
+EXTRAVERSION =
 NAME = Unicycling Gorilla
 NAME = Unicycling Gorilla
 
 
 # *DOCUMENTATION*
 # *DOCUMENTATION*
@@ -513,7 +513,8 @@ ifeq ($(KBUILD_EXTMOD),)
 # Carefully list dependencies so we do not try to build scripts twice
 # Carefully list dependencies so we do not try to build scripts twice
 # in parallel
 # in parallel
 PHONY += scripts
 PHONY += scripts
-scripts: scripts_basic include/config/auto.conf include/config/tristate.conf
+scripts: scripts_basic include/config/auto.conf include/config/tristate.conf \
+	 asm-generic
 	$(Q)$(MAKE) $(build)=$(@)
 	$(Q)$(MAKE) $(build)=$(@)
 
 
 # Objects we will link into vmlinux / subdirs we need to visit
 # Objects we will link into vmlinux / subdirs we need to visit

+ 1 - 1
arch/alpha/Makefile

@@ -12,7 +12,7 @@ NM := $(NM) -B
 
 
 LDFLAGS_vmlinux	:= -static -N #-relax
 LDFLAGS_vmlinux	:= -static -N #-relax
 CHECKFLAGS	+= -D__alpha__ -m64
 CHECKFLAGS	+= -D__alpha__ -m64
-cflags-y	:= -pipe -mno-fp-regs -ffixed-8 -msmall-data
+cflags-y	:= -pipe -mno-fp-regs -ffixed-8
 cflags-y	+= $(call cc-option, -fno-jump-tables)
 cflags-y	+= $(call cc-option, -fno-jump-tables)
 
 
 cpuflags-$(CONFIG_ALPHA_EV4)		:= -mcpu=ev4
 cpuflags-$(CONFIG_ALPHA_EV4)		:= -mcpu=ev4

+ 1 - 1
arch/alpha/include/asm/floppy.h

@@ -26,7 +26,7 @@
 #define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
 #define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
 #define fd_cacheflush(addr,size) /* nothing */
 #define fd_cacheflush(addr,size) /* nothing */
 #define fd_request_irq()        request_irq(FLOPPY_IRQ, floppy_interrupt,\
 #define fd_request_irq()        request_irq(FLOPPY_IRQ, floppy_interrupt,\
-					    IRQF_DISABLED, "floppy", NULL)
+					    0, "floppy", NULL)
 #define fd_free_irq()           free_irq(FLOPPY_IRQ, NULL)
 #define fd_free_irq()           free_irq(FLOPPY_IRQ, NULL)
 
 
 #ifdef CONFIG_PCI
 #ifdef CONFIG_PCI

+ 0 - 7
arch/alpha/kernel/irq.c

@@ -117,13 +117,6 @@ handle_irq(int irq)
 		return;
 		return;
 	}
 	}
 
 
-	/*
-	 * From here we must proceed with IPL_MAX. Note that we do not
-	 * explicitly enable interrupts afterwards - some MILO PALcode
-	 * (namely LX164 one) seems to have severe problems with RTI
-	 * at IPL 0.
-	 */
-	local_irq_disable();
 	irq_enter();
 	irq_enter();
 	generic_handle_irq_desc(irq, desc);
 	generic_handle_irq_desc(irq, desc);
 	irq_exit();
 	irq_exit();

+ 8 - 2
arch/alpha/kernel/irq_alpha.c

@@ -45,6 +45,14 @@ do_entInt(unsigned long type, unsigned long vector,
 	  unsigned long la_ptr, struct pt_regs *regs)
 	  unsigned long la_ptr, struct pt_regs *regs)
 {
 {
 	struct pt_regs *old_regs;
 	struct pt_regs *old_regs;
+
+	/*
+	 * Disable interrupts during IRQ handling.
+	 * Note that there is no matching local_irq_enable() due to
+	 * severe problems with RTI at IPL0 and some MILO PALcode
+	 * (namely LX164).
+	 */
+	local_irq_disable();
 	switch (type) {
 	switch (type) {
 	case 0:
 	case 0:
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP
@@ -62,7 +70,6 @@ do_entInt(unsigned long type, unsigned long vector,
 	  {
 	  {
 		long cpu;
 		long cpu;
 
 
-		local_irq_disable();
 		smp_percpu_timer_interrupt(regs);
 		smp_percpu_timer_interrupt(regs);
 		cpu = smp_processor_id();
 		cpu = smp_processor_id();
 		if (cpu != boot_cpuid) {
 		if (cpu != boot_cpuid) {
@@ -222,7 +229,6 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr,
 
 
 struct irqaction timer_irqaction = {
 struct irqaction timer_irqaction = {
 	.handler	= timer_interrupt,
 	.handler	= timer_interrupt,
-	.flags		= IRQF_DISABLED,
 	.name		= "timer",
 	.name		= "timer",
 };
 };
 
 

+ 5 - 0
arch/alpha/kernel/sys_nautilus.c

@@ -188,6 +188,10 @@ nautilus_machine_check(unsigned long vector, unsigned long la_ptr)
 extern void free_reserved_mem(void *, void *);
 extern void free_reserved_mem(void *, void *);
 extern void pcibios_claim_one_bus(struct pci_bus *);
 extern void pcibios_claim_one_bus(struct pci_bus *);
 
 
+static struct resource irongate_io = {
+	.name	= "Irongate PCI IO",
+	.flags	= IORESOURCE_IO,
+};
 static struct resource irongate_mem = {
 static struct resource irongate_mem = {
 	.name	= "Irongate PCI MEM",
 	.name	= "Irongate PCI MEM",
 	.flags	= IORESOURCE_MEM,
 	.flags	= IORESOURCE_MEM,
@@ -209,6 +213,7 @@ nautilus_init_pci(void)
 
 
 	irongate = pci_get_bus_and_slot(0, 0);
 	irongate = pci_get_bus_and_slot(0, 0);
 	bus->self = irongate;
 	bus->self = irongate;
+	bus->resource[0] = &irongate_io;
 	bus->resource[1] = &irongate_mem;
 	bus->resource[1] = &irongate_mem;
 
 
 	pci_bus_size_bridges(bus);
 	pci_bus_size_bridges(bus);

+ 7 - 7
arch/alpha/kernel/sys_titan.c

@@ -280,15 +280,15 @@ titan_late_init(void)
 	 * all reported to the kernel as machine checks, so the handler
 	 * all reported to the kernel as machine checks, so the handler
 	 * is a nop so it can be called to count the individual events.
 	 * is a nop so it can be called to count the individual events.
 	 */
 	 */
-	titan_request_irq(63+16, titan_intr_nop, IRQF_DISABLED,
+	titan_request_irq(63+16, titan_intr_nop, 0,
 		    "CChip Error", NULL);
 		    "CChip Error", NULL);
-	titan_request_irq(62+16, titan_intr_nop, IRQF_DISABLED,
+	titan_request_irq(62+16, titan_intr_nop, 0,
 		    "PChip 0 H_Error", NULL);
 		    "PChip 0 H_Error", NULL);
-	titan_request_irq(61+16, titan_intr_nop, IRQF_DISABLED,
+	titan_request_irq(61+16, titan_intr_nop, 0,
 		    "PChip 1 H_Error", NULL);
 		    "PChip 1 H_Error", NULL);
-	titan_request_irq(60+16, titan_intr_nop, IRQF_DISABLED,
+	titan_request_irq(60+16, titan_intr_nop, 0,
 		    "PChip 0 C_Error", NULL);
 		    "PChip 0 C_Error", NULL);
-	titan_request_irq(59+16, titan_intr_nop, IRQF_DISABLED,
+	titan_request_irq(59+16, titan_intr_nop, 0,
 		    "PChip 1 C_Error", NULL);
 		    "PChip 1 C_Error", NULL);
 
 
 	/* 
 	/* 
@@ -348,9 +348,9 @@ privateer_init_pci(void)
 	 * Hook a couple of extra err interrupts that the
 	 * Hook a couple of extra err interrupts that the
 	 * common titan code won't.
 	 * common titan code won't.
 	 */
 	 */
-	titan_request_irq(53+16, titan_intr_nop, IRQF_DISABLED,
+	titan_request_irq(53+16, titan_intr_nop, 0,
 		    "NMI", NULL);
 		    "NMI", NULL);
-	titan_request_irq(50+16, titan_intr_nop, IRQF_DISABLED,
+	titan_request_irq(50+16, titan_intr_nop, 0,
 		    "Temperature Warning", NULL);
 		    "Temperature Warning", NULL);
 
 
 	/*
 	/*

+ 1 - 1
arch/arc/include/asm/dma-mapping.h

@@ -126,7 +126,7 @@ dma_map_sg(struct device *dev, struct scatterlist *sg,
 	int i;
 	int i;
 
 
 	for_each_sg(sg, s, nents, i)
 	for_each_sg(sg, s, nents, i)
-		sg->dma_address = dma_map_page(dev, sg_page(s), s->offset,
+		s->dma_address = dma_map_page(dev, sg_page(s), s->offset,
 					       s->length, dir);
 					       s->length, dir);
 
 
 	return nents;
 	return nents;

+ 0 - 3
arch/arc/include/asm/elf.h

@@ -72,7 +72,4 @@ extern int elf_check_arch(const struct elf32_hdr *);
  */
  */
 #define ELF_PLATFORM	(NULL)
 #define ELF_PLATFORM	(NULL)
 
 
-#define SET_PERSONALITY(ex) \
-	set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
-
 #endif
 #endif

+ 1 - 1
arch/arc/include/asm/entry.h

@@ -415,7 +415,7 @@
  *-------------------------------------------------------------*/
  *-------------------------------------------------------------*/
 .macro SAVE_ALL_EXCEPTION   marker
 .macro SAVE_ALL_EXCEPTION   marker
 
 
-	st      \marker, [sp, 8]
+	st      \marker, [sp, 8]	/* orig_r8 */
 	st      r0, [sp, 4]    /* orig_r0, needed only for sys calls */
 	st      r0, [sp, 4]    /* orig_r0, needed only for sys calls */
 
 
 	/* Restore r9 used to code the early prologue */
 	/* Restore r9 used to code the early prologue */

+ 8 - 4
arch/arc/include/asm/irqflags.h

@@ -39,7 +39,7 @@ static inline long arch_local_irq_save(void)
 	"	flag.nz %0		\n"
 	"	flag.nz %0		\n"
 	: "=r"(temp), "=r"(flags)
 	: "=r"(temp), "=r"(flags)
 	: "n"((STATUS_E1_MASK | STATUS_E2_MASK))
 	: "n"((STATUS_E1_MASK | STATUS_E2_MASK))
-	: "cc");
+	: "memory", "cc");
 
 
 	return flags;
 	return flags;
 }
 }
@@ -53,7 +53,8 @@ static inline void arch_local_irq_restore(unsigned long flags)
 	__asm__ __volatile__(
 	__asm__ __volatile__(
 	"	flag %0			\n"
 	"	flag %0			\n"
 	:
 	:
-	: "r"(flags));
+	: "r"(flags)
+	: "memory");
 }
 }
 
 
 /*
 /*
@@ -73,7 +74,8 @@ static inline void arch_local_irq_disable(void)
 	"	and %0, %0, %1		\n"
 	"	and %0, %0, %1		\n"
 	"	flag %0			\n"
 	"	flag %0			\n"
 	: "=&r"(temp)
 	: "=&r"(temp)
-	: "n"(~(STATUS_E1_MASK | STATUS_E2_MASK)));
+	: "n"(~(STATUS_E1_MASK | STATUS_E2_MASK))
+	: "memory");
 }
 }
 
 
 /*
 /*
@@ -85,7 +87,9 @@ static inline long arch_local_save_flags(void)
 
 
 	__asm__ __volatile__(
 	__asm__ __volatile__(
 	"	lr  %0, [status32]	\n"
 	"	lr  %0, [status32]	\n"
-	: "=&r"(temp));
+	: "=&r"(temp)
+	:
+	: "memory");
 
 
 	return temp;
 	return temp;
 }
 }

+ 2 - 4
arch/arc/include/asm/kgdb.h

@@ -13,7 +13,7 @@
 
 
 #ifdef CONFIG_KGDB
 #ifdef CONFIG_KGDB
 
 
-#include <asm/user.h>
+#include <asm/ptrace.h>
 
 
 /* to ensure compatibility with Linux 2.6.35, we don't implement the get/set
 /* to ensure compatibility with Linux 2.6.35, we don't implement the get/set
  * register API yet */
  * register API yet */
@@ -53,9 +53,7 @@ enum arc700_linux_regnums {
 };
 };
 
 
 #else
 #else
-static inline void kgdb_trap(struct pt_regs *regs, int param)
-{
-}
+#define kgdb_trap(regs, param)
 #endif
 #endif
 
 
 #endif	/* __ARC_KGDB_H__ */
 #endif	/* __ARC_KGDB_H__ */

+ 1 - 1
arch/arc/include/asm/ptrace.h

@@ -123,7 +123,7 @@ static inline long regs_return_value(struct pt_regs *regs)
 #define orig_r8_IS_SCALL		0x0001
 #define orig_r8_IS_SCALL		0x0001
 #define orig_r8_IS_SCALL_RESTARTED	0x0002
 #define orig_r8_IS_SCALL_RESTARTED	0x0002
 #define orig_r8_IS_BRKPT		0x0004
 #define orig_r8_IS_BRKPT		0x0004
-#define orig_r8_IS_EXCPN		0x0004
+#define orig_r8_IS_EXCPN		0x0008
 #define orig_r8_IS_IRQ1			0x0010
 #define orig_r8_IS_IRQ1			0x0010
 #define orig_r8_IS_IRQ2			0x0020
 #define orig_r8_IS_IRQ2			0x0020
 
 

+ 0 - 2
arch/arc/include/asm/syscalls.h

@@ -16,8 +16,6 @@
 #include <linux/types.h>
 #include <linux/types.h>
 
 
 int sys_clone_wrapper(int, int, int, int, int);
 int sys_clone_wrapper(int, int, int, int, int);
-int sys_fork_wrapper(void);
-int sys_vfork_wrapper(void);
 int sys_cacheflush(uint32_t, uint32_t uint32_t);
 int sys_cacheflush(uint32_t, uint32_t uint32_t);
 int sys_arc_settls(void *);
 int sys_arc_settls(void *);
 int sys_arc_gettls(void);
 int sys_arc_gettls(void);

+ 2 - 2
arch/arc/include/uapi/asm/ptrace.h

@@ -28,14 +28,14 @@
 */
 */
 struct user_regs_struct {
 struct user_regs_struct {
 
 
-	struct scratch {
+	struct {
 		long pad;
 		long pad;
 		long bta, lp_start, lp_end, lp_count;
 		long bta, lp_start, lp_end, lp_count;
 		long status32, ret, blink, fp, gp;
 		long status32, ret, blink, fp, gp;
 		long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
 		long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
 		long sp;
 		long sp;
 	} scratch;
 	} scratch;
-	struct callee {
+	struct {
 		long pad;
 		long pad;
 		long r25, r24, r23, r22, r21, r20;
 		long r25, r24, r23, r22, r21, r20;
 		long r19, r18, r17, r16, r15, r14, r13;
 		long r19, r18, r17, r16, r15, r14, r13;

+ 1 - 26
arch/arc/kernel/entry.S

@@ -452,7 +452,7 @@ tracesys:
 	; using ERET won't work since next-PC has already committed
 	; using ERET won't work since next-PC has already committed
 	lr  r12, [efa]
 	lr  r12, [efa]
 	GET_CURR_TASK_FIELD_PTR   TASK_THREAD, r11
 	GET_CURR_TASK_FIELD_PTR   TASK_THREAD, r11
-	st  r12, [r11, THREAD_FAULT_ADDR]
+	st  r12, [r11, THREAD_FAULT_ADDR]	; thread.fault_address
 
 
 	; PRE Sys Call Ptrace hook
 	; PRE Sys Call Ptrace hook
 	mov r0, sp			; pt_regs needed
 	mov r0, sp			; pt_regs needed
@@ -792,31 +792,6 @@ ARC_EXIT ret_from_fork
 
 
 ;################### Special Sys Call Wrappers ##########################
 ;################### Special Sys Call Wrappers ##########################
 
 
-; TBD: call do_fork directly from here
-ARC_ENTRY sys_fork_wrapper
-	SAVE_CALLEE_SAVED_USER
-	bl  @sys_fork
-	DISCARD_CALLEE_SAVED_USER
-
-	GET_CURR_THR_INFO_FLAGS   r10
-	btst r10, TIF_SYSCALL_TRACE
-	bnz  tracesys_exit
-
-	b ret_from_system_call
-ARC_EXIT sys_fork_wrapper
-
-ARC_ENTRY sys_vfork_wrapper
-	SAVE_CALLEE_SAVED_USER
-	bl  @sys_vfork
-	DISCARD_CALLEE_SAVED_USER
-
-	GET_CURR_THR_INFO_FLAGS   r10
-	btst r10, TIF_SYSCALL_TRACE
-	bnz  tracesys_exit
-
-	b ret_from_system_call
-ARC_EXIT sys_vfork_wrapper
-
 ARC_ENTRY sys_clone_wrapper
 ARC_ENTRY sys_clone_wrapper
 	SAVE_CALLEE_SAVED_USER
 	SAVE_CALLEE_SAVED_USER
 	bl  @sys_clone
 	bl  @sys_clone

+ 1 - 0
arch/arc/kernel/kgdb.c

@@ -9,6 +9,7 @@
  */
  */
 
 
 #include <linux/kgdb.h>
 #include <linux/kgdb.h>
+#include <linux/sched.h>
 #include <asm/disasm.h>
 #include <asm/disasm.h>
 #include <asm/cacheflush.h>
 #include <asm/cacheflush.h>
 
 

+ 1 - 3
arch/arc/kernel/setup.c

@@ -232,10 +232,8 @@ char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)
 
 
 	n += scnprintf(buf + n, len - n, "\n");
 	n += scnprintf(buf + n, len - n, "\n");
 
 
-#ifdef _ASM_GENERIC_UNISTD_H
 	n += scnprintf(buf + n, len - n,
 	n += scnprintf(buf + n, len - n,
-		       "OS ABI [v2]\t: asm-generic/{unistd,stat,fcntl}\n");
-#endif
+		       "OS ABI [v3]\t: no-legacy-syscalls\n");
 
 
 	return buf;
 	return buf;
 }
 }

+ 0 - 2
arch/arc/kernel/sys.c

@@ -6,8 +6,6 @@
 #include <asm/syscalls.h>
 #include <asm/syscalls.h>
 
 
 #define sys_clone	sys_clone_wrapper
 #define sys_clone	sys_clone_wrapper
-#define sys_fork	sys_fork_wrapper
-#define sys_vfork	sys_vfork_wrapper
 
 
 #undef __SYSCALL
 #undef __SYSCALL
 #define __SYSCALL(nr, call) [nr] = (call),
 #define __SYSCALL(nr, call) [nr] = (call),

+ 12 - 2
arch/arm/Kconfig

@@ -1183,9 +1183,9 @@ config ARM_NR_BANKS
 	default 8
 	default 8
 
 
 config IWMMXT
 config IWMMXT
-	bool "Enable iWMMXt support"
+	bool "Enable iWMMXt support" if !CPU_PJ4
 	depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
 	depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
-	default y if PXA27x || PXA3xx || ARCH_MMP
+	default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4
 	help
 	help
 	  Enable support for iWMMXt context switching at run time if
 	  Enable support for iWMMXt context switching at run time if
 	  running on a CPU that supports it.
 	  running on a CPU that supports it.
@@ -1439,6 +1439,16 @@ config ARM_ERRATA_775420
 	 to deadlock. This workaround puts DSB before executing ISB if
 	 to deadlock. This workaround puts DSB before executing ISB if
 	 an abort may occur on cache maintenance.
 	 an abort may occur on cache maintenance.
 
 
+config ARM_ERRATA_798181
+	bool "ARM errata: TLBI/DSB failure on Cortex-A15"
+	depends on CPU_V7 && SMP
+	help
+	  On Cortex-A15 (r0p0..r3p2) the TLBI*IS/DSB operations are not
+	  adequately shooting down all use of the old entries. This
+	  option enables the Linux kernel workaround for this erratum
+	  which sends an IPI to the CPUs that are running the same ASID
+	  as the one being invalidated.
+
 endmenu
 endmenu
 
 
 source "arch/arm/common/Kconfig"
 source "arch/arm/common/Kconfig"

+ 1 - 0
arch/arm/Kconfig.debug

@@ -495,6 +495,7 @@ config DEBUG_IMX_UART_PORT
 						DEBUG_IMX53_UART || \
 						DEBUG_IMX53_UART || \
 						DEBUG_IMX6Q_UART
 						DEBUG_IMX6Q_UART
 	default 1
 	default 1
+	depends on ARCH_MXC
 	help
 	help
 	  Choose UART port on which kernel low-level debug messages
 	  Choose UART port on which kernel low-level debug messages
 	  should be output.
 	  should be output.

+ 1 - 1
arch/arm/boot/dts/armada-370-mirabox.dts

@@ -54,7 +54,7 @@
 		};
 		};
 
 
 		mvsdio@d00d4000 {
 		mvsdio@d00d4000 {
-			pinctrl-0 = <&sdio_pins2>;
+			pinctrl-0 = <&sdio_pins3>;
 			pinctrl-names = "default";
 			pinctrl-names = "default";
 			status = "okay";
 			status = "okay";
 			/*
 			/*

+ 6 - 0
arch/arm/boot/dts/armada-370.dtsi

@@ -59,6 +59,12 @@
 					     "mpp50", "mpp51", "mpp52";
 					     "mpp50", "mpp51", "mpp52";
 			      marvell,function = "sd0";
 			      marvell,function = "sd0";
 			};
 			};
+
+			sdio_pins3: sdio-pins3 {
+			      marvell,pins = "mpp48", "mpp49", "mpp50",
+					     "mpp51", "mpp52", "mpp53";
+			      marvell,function = "sd0";
+			};
 	        };
 	        };
 
 
 		gpio0: gpio@d0018100 {
 		gpio0: gpio@d0018100 {

+ 2 - 2
arch/arm/boot/dts/dbx5x0.dtsi

@@ -191,8 +191,8 @@
 
 
 		prcmu: prcmu@80157000 {
 		prcmu: prcmu@80157000 {
 			compatible = "stericsson,db8500-prcmu";
 			compatible = "stericsson,db8500-prcmu";
-			reg = <0x80157000 0x1000>;
-			reg-names = "prcmu";
+			reg = <0x80157000 0x1000>, <0x801b0000 0x8000>, <0x801b8000 0x1000>;
+			reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm";
 			interrupts = <0 47 0x4>;
 			interrupts = <0 47 0x4>;
 			#address-cells = <1>;
 			#address-cells = <1>;
 			#size-cells = <1>;
 			#size-cells = <1>;

+ 0 - 1
arch/arm/boot/dts/imx28-m28evk.dts

@@ -152,7 +152,6 @@
 			i2c0: i2c@80058000 {
 			i2c0: i2c@80058000 {
 				pinctrl-names = "default";
 				pinctrl-names = "default";
 				pinctrl-0 = <&i2c0_pins_a>;
 				pinctrl-0 = <&i2c0_pins_a>;
-				clock-frequency = <400000>;
 				status = "okay";
 				status = "okay";
 
 
 				sgtl5000: codec@0a {
 				sgtl5000: codec@0a {

+ 0 - 1
arch/arm/boot/dts/imx28-sps1.dts

@@ -70,7 +70,6 @@
 			i2c0: i2c@80058000 {
 			i2c0: i2c@80058000 {
 				pinctrl-names = "default";
 				pinctrl-names = "default";
 				pinctrl-0 = <&i2c0_pins_a>;
 				pinctrl-0 = <&i2c0_pins_a>;
-				clock-frequency = <400000>;
 				status = "okay";
 				status = "okay";
 
 
 				rtc: rtc@51 {
 				rtc: rtc@51 {

+ 1 - 0
arch/arm/boot/dts/imx6qdl.dtsi

@@ -91,6 +91,7 @@
 			compatible = "arm,cortex-a9-twd-timer";
 			compatible = "arm,cortex-a9-twd-timer";
 			reg = <0x00a00600 0x20>;
 			reg = <0x00a00600 0x20>;
 			interrupts = <1 13 0xf01>;
 			interrupts = <1 13 0xf01>;
+			clocks = <&clks 15>;
 		};
 		};
 
 
 		L2: l2-cache@00a02000 {
 		L2: l2-cache@00a02000 {

+ 1 - 0
arch/arm/boot/dts/kirkwood-goflexnet.dts

@@ -77,6 +77,7 @@
 		};
 		};
 
 
 		nand@3000000 {
 		nand@3000000 {
+			chip-delay = <40>;
 			status = "okay";
 			status = "okay";
 
 
 			partition@0 {
 			partition@0 {

+ 7 - 7
arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts

@@ -96,11 +96,11 @@
 				marvell,function = "gpio";
 				marvell,function = "gpio";
 			};
 			};
 			pmx_led_rebuild_brt_ctrl_1: pmx-led-rebuild-brt-ctrl-1 {
 			pmx_led_rebuild_brt_ctrl_1: pmx-led-rebuild-brt-ctrl-1 {
-				marvell,pins = "mpp44";
+				marvell,pins = "mpp46";
 				marvell,function = "gpio";
 				marvell,function = "gpio";
 			};
 			};
 			pmx_led_rebuild_brt_ctrl_2: pmx-led-rebuild-brt-ctrl-2 {
 			pmx_led_rebuild_brt_ctrl_2: pmx-led-rebuild-brt-ctrl-2 {
-				marvell,pins = "mpp45";
+				marvell,pins = "mpp47";
 				marvell,function = "gpio";
 				marvell,function = "gpio";
 			};
 			};
 
 
@@ -157,14 +157,14 @@
 			gpios = <&gpio0 16 0>;
 			gpios = <&gpio0 16 0>;
 			linux,default-trigger = "default-on";
 			linux,default-trigger = "default-on";
 		};
 		};
-		health_led1 {
+		rebuild_led {
+			label = "status:white:rebuild_led";
+			gpios = <&gpio1 4 0>;
+		};
+		health_led {
 			label = "status:red:health_led";
 			label = "status:red:health_led";
 			gpios = <&gpio1 5 0>;
 			gpios = <&gpio1 5 0>;
 		};
 		};
-		health_led2 {
-			label = "status:white:health_led";
-			gpios = <&gpio1 4 0>;
-		};
 		backup_led {
 		backup_led {
 			label = "status:blue:backup_led";
 			label = "status:blue:backup_led";
 			gpios = <&gpio0 15 0>;
 			gpios = <&gpio0 15 0>;

+ 7 - 2
arch/arm/boot/dts/orion5x.dtsi

@@ -13,6 +13,9 @@
 	compatible = "marvell,orion5x";
 	compatible = "marvell,orion5x";
 	interrupt-parent = <&intc>;
 	interrupt-parent = <&intc>;
 
 
+	aliases {
+		gpio0 = &gpio0;
+	};
 	intc: interrupt-controller {
 	intc: interrupt-controller {
 		compatible = "marvell,orion-intc", "marvell,intc";
 		compatible = "marvell,orion-intc", "marvell,intc";
 		interrupt-controller;
 		interrupt-controller;
@@ -32,7 +35,9 @@
 			#gpio-cells = <2>;
 			#gpio-cells = <2>;
 			gpio-controller;
 			gpio-controller;
 			reg = <0x10100 0x40>;
 			reg = <0x10100 0x40>;
-			ngpio = <32>;
+			ngpios = <32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
 			interrupts = <6>, <7>, <8>, <9>;
 			interrupts = <6>, <7>, <8>, <9>;
 		};
 		};
 
 
@@ -91,7 +96,7 @@
 			reg = <0x90000 0x10000>,
 			reg = <0x90000 0x10000>,
 			      <0xf2200000 0x800>;
 			      <0xf2200000 0x800>;
 			reg-names = "regs", "sram";
 			reg-names = "regs", "sram";
-			interrupts = <22>;
+			interrupts = <28>;
 			status = "okay";
 			status = "okay";
 		};
 		};
 	};
 	};

+ 1 - 1
arch/arm/boot/dts/tegra20.dtsi

@@ -385,7 +385,7 @@
 
 
 	spi@7000d800 {
 	spi@7000d800 {
 		compatible = "nvidia,tegra20-slink";
 		compatible = "nvidia,tegra20-slink";
-		reg = <0x7000d480 0x200>;
+		reg = <0x7000d800 0x200>;
 		interrupts = <0 83 0x04>;
 		interrupts = <0 83 0x04>;
 		nvidia,dma-request-selector = <&apbdma 17>;
 		nvidia,dma-request-selector = <&apbdma 17>;
 		#address-cells = <1>;
 		#address-cells = <1>;

+ 1 - 1
arch/arm/boot/dts/tegra30.dtsi

@@ -372,7 +372,7 @@
 
 
 	spi@7000d800 {
 	spi@7000d800 {
 		compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
 		compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
-		reg = <0x7000d480 0x200>;
+		reg = <0x7000d800 0x200>;
 		interrupts = <0 83 0x04>;
 		interrupts = <0 83 0x04>;
 		nvidia,dma-request-selector = <&apbdma 17>;
 		nvidia,dma-request-selector = <&apbdma 17>;
 		#address-cells = <1>;
 		#address-cells = <1>;

+ 1 - 1
arch/arm/include/asm/delay.h

@@ -24,7 +24,7 @@ extern struct arm_delay_ops {
 	void (*delay)(unsigned long);
 	void (*delay)(unsigned long);
 	void (*const_udelay)(unsigned long);
 	void (*const_udelay)(unsigned long);
 	void (*udelay)(unsigned long);
 	void (*udelay)(unsigned long);
-	bool const_clock;
+	unsigned long ticks_per_jiffy;
 } arm_delay_ops;
 } arm_delay_ops;
 
 
 #define __delay(n)		arm_delay_ops.delay(n)
 #define __delay(n)		arm_delay_ops.delay(n)

+ 0 - 8
arch/arm/include/asm/glue-cache.h

@@ -19,14 +19,6 @@
 #undef _CACHE
 #undef _CACHE
 #undef MULTI_CACHE
 #undef MULTI_CACHE
 
 
-#if defined(CONFIG_CPU_CACHE_V3)
-# ifdef _CACHE
-#  define MULTI_CACHE 1
-# else
-#  define _CACHE v3
-# endif
-#endif
-
 #if defined(CONFIG_CPU_CACHE_V4)
 #if defined(CONFIG_CPU_CACHE_V4)
 # ifdef _CACHE
 # ifdef _CACHE
 #  define MULTI_CACHE 1
 #  define MULTI_CACHE 1

+ 1 - 1
arch/arm/include/asm/hardware/iop3xx.h

@@ -37,7 +37,7 @@ extern int iop3xx_get_init_atu(void);
  * IOP3XX processor registers
  * IOP3XX processor registers
  */
  */
 #define IOP3XX_PERIPHERAL_PHYS_BASE	0xffffe000
 #define IOP3XX_PERIPHERAL_PHYS_BASE	0xffffe000
-#define IOP3XX_PERIPHERAL_VIRT_BASE	0xfeffe000
+#define IOP3XX_PERIPHERAL_VIRT_BASE	0xfedfe000
 #define IOP3XX_PERIPHERAL_SIZE		0x00002000
 #define IOP3XX_PERIPHERAL_SIZE		0x00002000
 #define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\
 #define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\
 					IOP3XX_PERIPHERAL_SIZE - 1)
 					IOP3XX_PERIPHERAL_SIZE - 1)

+ 7 - 0
arch/arm/include/asm/highmem.h

@@ -41,6 +41,13 @@ extern void kunmap_high(struct page *page);
 #endif
 #endif
 #endif
 #endif
 
 
+/*
+ * Needed to be able to broadcast the TLB invalidation for kmap.
+ */
+#ifdef CONFIG_ARM_ERRATA_798181
+#undef ARCH_NEEDS_KMAP_HIGH_GET
+#endif
+
 #ifdef ARCH_NEEDS_KMAP_HIGH_GET
 #ifdef ARCH_NEEDS_KMAP_HIGH_GET
 extern void *kmap_high_get(struct page *page);
 extern void *kmap_high_get(struct page *page);
 #else
 #else

+ 2 - 0
arch/arm/include/asm/mmu_context.h

@@ -27,6 +27,8 @@ void __check_vmalloc_seq(struct mm_struct *mm);
 void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk);
 void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk);
 #define init_new_context(tsk,mm)	({ atomic64_set(&mm->context.id, 0); 0; })
 #define init_new_context(tsk,mm)	({ atomic64_set(&mm->context.id, 0); 0; })
 
 
+DECLARE_PER_CPU(atomic64_t, active_asids);
+
 #else	/* !CONFIG_CPU_HAS_ASID */
 #else	/* !CONFIG_CPU_HAS_ASID */
 
 
 #ifdef CONFIG_MMU
 #ifdef CONFIG_MMU

+ 1 - 1
arch/arm/include/asm/pgtable-3level.h

@@ -111,7 +111,7 @@
 #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */
 #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */
 #define L_PTE_S2_MT_WRITEBACK	 (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */
 #define L_PTE_S2_MT_WRITEBACK	 (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */
 #define L_PTE_S2_RDONLY		 (_AT(pteval_t, 1) << 6)   /* HAP[1]   */
 #define L_PTE_S2_RDONLY		 (_AT(pteval_t, 1) << 6)   /* HAP[1]   */
-#define L_PTE_S2_RDWR		 (_AT(pteval_t, 2) << 6)   /* HAP[2:1] */
+#define L_PTE_S2_RDWR		 (_AT(pteval_t, 3) << 6)   /* HAP[2:1] */
 
 
 /*
 /*
  * Hyp-mode PL2 PTE definitions for LPAE.
  * Hyp-mode PL2 PTE definitions for LPAE.

+ 17 - 9
arch/arm/include/asm/tlbflush.h

@@ -14,7 +14,6 @@
 
 
 #include <asm/glue.h>
 #include <asm/glue.h>
 
 
-#define TLB_V3_PAGE	(1 << 0)
 #define TLB_V4_U_PAGE	(1 << 1)
 #define TLB_V4_U_PAGE	(1 << 1)
 #define TLB_V4_D_PAGE	(1 << 2)
 #define TLB_V4_D_PAGE	(1 << 2)
 #define TLB_V4_I_PAGE	(1 << 3)
 #define TLB_V4_I_PAGE	(1 << 3)
@@ -22,7 +21,6 @@
 #define TLB_V6_D_PAGE	(1 << 5)
 #define TLB_V6_D_PAGE	(1 << 5)
 #define TLB_V6_I_PAGE	(1 << 6)
 #define TLB_V6_I_PAGE	(1 << 6)
 
 
-#define TLB_V3_FULL	(1 << 8)
 #define TLB_V4_U_FULL	(1 << 9)
 #define TLB_V4_U_FULL	(1 << 9)
 #define TLB_V4_D_FULL	(1 << 10)
 #define TLB_V4_D_FULL	(1 << 10)
 #define TLB_V4_I_FULL	(1 << 11)
 #define TLB_V4_I_FULL	(1 << 11)
@@ -52,7 +50,6 @@
  *	=============
  *	=============
  *
  *
  *	We have the following to choose from:
  *	We have the following to choose from:
- *	  v3    - ARMv3
  *	  v4    - ARMv4 without write buffer
  *	  v4    - ARMv4 without write buffer
  *	  v4wb  - ARMv4 with write buffer without I TLB flush entry instruction
  *	  v4wb  - ARMv4 with write buffer without I TLB flush entry instruction
  *	  v4wbi - ARMv4 with write buffer with I TLB flush entry instruction
  *	  v4wbi - ARMv4 with write buffer with I TLB flush entry instruction
@@ -330,7 +327,6 @@ static inline void local_flush_tlb_all(void)
 	if (tlb_flag(TLB_WB))
 	if (tlb_flag(TLB_WB))
 		dsb();
 		dsb();
 
 
-	tlb_op(TLB_V3_FULL, "c6, c0, 0", zero);
 	tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero);
 	tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero);
 	tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero);
 	tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero);
 	tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero);
 	tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero);
@@ -351,9 +347,8 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm)
 	if (tlb_flag(TLB_WB))
 	if (tlb_flag(TLB_WB))
 		dsb();
 		dsb();
 
 
-	if (possible_tlb_flags & (TLB_V3_FULL|TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) {
+	if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) {
 		if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) {
 		if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) {
-			tlb_op(TLB_V3_FULL, "c6, c0, 0", zero);
 			tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero);
 			tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero);
 			tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero);
 			tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero);
 			tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero);
 			tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero);
@@ -385,9 +380,8 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
 	if (tlb_flag(TLB_WB))
 	if (tlb_flag(TLB_WB))
 		dsb();
 		dsb();
 
 
-	if (possible_tlb_flags & (TLB_V3_PAGE|TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) &&
+	if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) &&
 	    cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) {
 	    cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) {
-		tlb_op(TLB_V3_PAGE, "c6, c0, 0", uaddr);
 		tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr);
 		tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr);
 		tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", uaddr);
 		tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", uaddr);
 		tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", uaddr);
 		tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", uaddr);
@@ -418,7 +412,6 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
 	if (tlb_flag(TLB_WB))
 	if (tlb_flag(TLB_WB))
 		dsb();
 		dsb();
 
 
-	tlb_op(TLB_V3_PAGE, "c6, c0, 0", kaddr);
 	tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr);
 	tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr);
 	tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr);
 	tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr);
 	tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr);
 	tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr);
@@ -450,6 +443,21 @@ static inline void local_flush_bp_all(void)
 		isb();
 		isb();
 }
 }
 
 
+#ifdef CONFIG_ARM_ERRATA_798181
+static inline void dummy_flush_tlb_a15_erratum(void)
+{
+	/*
+	 * Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0.
+	 */
+	asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0));
+	dsb();
+}
+#else
+static inline void dummy_flush_tlb_a15_erratum(void)
+{
+}
+#endif
+
 /*
 /*
  *	flush_pmd_entry
  *	flush_pmd_entry
  *
  *

+ 12 - 0
arch/arm/kernel/entry-common.S

@@ -276,7 +276,13 @@ ENDPROC(ftrace_graph_caller_old)
  */
  */
 
 
 .macro mcount_enter
 .macro mcount_enter
+/*
+ * This pad compensates for the push {lr} at the call site.  Note that we are
+ * unable to unwind through a function which does not otherwise save its lr.
+ */
+ UNWIND(.pad	#4)
 	stmdb	sp!, {r0-r3, lr}
 	stmdb	sp!, {r0-r3, lr}
+ UNWIND(.save	{r0-r3, lr})
 .endm
 .endm
 
 
 .macro mcount_get_lr reg
 .macro mcount_get_lr reg
@@ -289,6 +295,7 @@ ENDPROC(ftrace_graph_caller_old)
 .endm
 .endm
 
 
 ENTRY(__gnu_mcount_nc)
 ENTRY(__gnu_mcount_nc)
+UNWIND(.fnstart)
 #ifdef CONFIG_DYNAMIC_FTRACE
 #ifdef CONFIG_DYNAMIC_FTRACE
 	mov	ip, lr
 	mov	ip, lr
 	ldmia	sp!, {lr}
 	ldmia	sp!, {lr}
@@ -296,17 +303,22 @@ ENTRY(__gnu_mcount_nc)
 #else
 #else
 	__mcount
 	__mcount
 #endif
 #endif
+UNWIND(.fnend)
 ENDPROC(__gnu_mcount_nc)
 ENDPROC(__gnu_mcount_nc)
 
 
 #ifdef CONFIG_DYNAMIC_FTRACE
 #ifdef CONFIG_DYNAMIC_FTRACE
 ENTRY(ftrace_caller)
 ENTRY(ftrace_caller)
+UNWIND(.fnstart)
 	__ftrace_caller
 	__ftrace_caller
+UNWIND(.fnend)
 ENDPROC(ftrace_caller)
 ENDPROC(ftrace_caller)
 #endif
 #endif
 
 
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 ENTRY(ftrace_graph_caller)
 ENTRY(ftrace_graph_caller)
+UNWIND(.fnstart)
 	__ftrace_graph_caller
 	__ftrace_graph_caller
+UNWIND(.fnend)
 ENDPROC(ftrace_graph_caller)
 ENDPROC(ftrace_graph_caller)
 #endif
 #endif
 
 

+ 1 - 1
arch/arm/kernel/head.S

@@ -267,7 +267,7 @@ __create_page_tables:
 	addne	r6, r6, #1 << SECTION_SHIFT
 	addne	r6, r6, #1 << SECTION_SHIFT
 	strne	r6, [r3]
 	strne	r6, [r3]
 
 
-#if defined(CONFIG_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8)
+#if defined(CONFIG_ARM_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8)
 	sub	r4, r4, #4			@ Fixup page table pointer
 	sub	r4, r4, #4			@ Fixup page table pointer
 						@ for 64-bit descriptors
 						@ for 64-bit descriptors
 #endif
 #endif

+ 4 - 4
arch/arm/kernel/hw_breakpoint.c

@@ -966,7 +966,7 @@ static void reset_ctrl_regs(void *unused)
 	}
 	}
 
 
 	if (err) {
 	if (err) {
-		pr_warning("CPU %d debug is powered down!\n", cpu);
+		pr_warn_once("CPU %d debug is powered down!\n", cpu);
 		cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu));
 		cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu));
 		return;
 		return;
 	}
 	}
@@ -987,7 +987,7 @@ clear_vcr:
 	isb();
 	isb();
 
 
 	if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
 	if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
-		pr_warning("CPU %d failed to disable vector catch\n", cpu);
+		pr_warn_once("CPU %d failed to disable vector catch\n", cpu);
 		return;
 		return;
 	}
 	}
 
 
@@ -1007,7 +1007,7 @@ clear_vcr:
 	}
 	}
 
 
 	if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
 	if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
-		pr_warning("CPU %d failed to clear debug register pairs\n", cpu);
+		pr_warn_once("CPU %d failed to clear debug register pairs\n", cpu);
 		return;
 		return;
 	}
 	}
 
 
@@ -1043,7 +1043,7 @@ static int dbg_cpu_pm_notify(struct notifier_block *self, unsigned long action,
 	return NOTIFY_OK;
 	return NOTIFY_OK;
 }
 }
 
 
-static struct notifier_block __cpuinitdata dbg_cpu_pm_nb = {
+static struct notifier_block dbg_cpu_pm_nb = {
 	.notifier_call = dbg_cpu_pm_notify,
 	.notifier_call = dbg_cpu_pm_notify,
 };
 };
 
 

+ 4 - 1
arch/arm/kernel/perf_event.c

@@ -253,7 +253,10 @@ validate_event(struct pmu_hw_events *hw_events,
 	struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
 	struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
 	struct pmu *leader_pmu = event->group_leader->pmu;
 	struct pmu *leader_pmu = event->group_leader->pmu;
 
 
-	if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF)
+	if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF)
+		return 1;
+
+	if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec)
 		return 1;
 		return 1;
 
 
 	return armpmu->get_event_idx(hw_events, event) >= 0;
 	return armpmu->get_event_idx(hw_events, event) >= 0;

+ 2 - 2
arch/arm/kernel/sched_clock.c

@@ -45,12 +45,12 @@ static u32 notrace jiffy_sched_clock_read(void)
 
 
 static u32 __read_mostly (*read_sched_clock)(void) = jiffy_sched_clock_read;
 static u32 __read_mostly (*read_sched_clock)(void) = jiffy_sched_clock_read;
 
 
-static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift)
+static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift)
 {
 {
 	return (cyc * mult) >> shift;
 	return (cyc * mult) >> shift;
 }
 }
 
 
-static unsigned long long cyc_to_sched_clock(u32 cyc, u32 mask)
+static unsigned long long notrace cyc_to_sched_clock(u32 cyc, u32 mask)
 {
 {
 	u64 epoch_ns;
 	u64 epoch_ns;
 	u32 epoch_cyc;
 	u32 epoch_cyc;

+ 22 - 5
arch/arm/kernel/setup.c

@@ -56,7 +56,6 @@
 #include <asm/virt.h>
 #include <asm/virt.h>
 
 
 #include "atags.h"
 #include "atags.h"
-#include "tcm.h"
 
 
 
 
 #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
 #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
@@ -353,6 +352,23 @@ void __init early_print(const char *str, ...)
 	printk("%s", buf);
 	printk("%s", buf);
 }
 }
 
 
+static void __init cpuid_init_hwcaps(void)
+{
+	unsigned int divide_instrs;
+
+	if (cpu_architecture() < CPU_ARCH_ARMv7)
+		return;
+
+	divide_instrs = (read_cpuid_ext(CPUID_EXT_ISAR0) & 0x0f000000) >> 24;
+
+	switch (divide_instrs) {
+	case 2:
+		elf_hwcap |= HWCAP_IDIVA;
+	case 1:
+		elf_hwcap |= HWCAP_IDIVT;
+	}
+}
+
 static void __init feat_v6_fixup(void)
 static void __init feat_v6_fixup(void)
 {
 {
 	int id = read_cpuid_id();
 	int id = read_cpuid_id();
@@ -483,8 +499,11 @@ static void __init setup_processor(void)
 	snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
 	snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
 		 list->elf_name, ENDIANNESS);
 		 list->elf_name, ENDIANNESS);
 	elf_hwcap = list->elf_hwcap;
 	elf_hwcap = list->elf_hwcap;
+
+	cpuid_init_hwcaps();
+
 #ifndef CONFIG_ARM_THUMB
 #ifndef CONFIG_ARM_THUMB
-	elf_hwcap &= ~HWCAP_THUMB;
+	elf_hwcap &= ~(HWCAP_THUMB | HWCAP_IDIVT);
 #endif
 #endif
 
 
 	feat_v6_fixup();
 	feat_v6_fixup();
@@ -524,7 +543,7 @@ int __init arm_add_memory(phys_addr_t start, phys_addr_t size)
 	size -= start & ~PAGE_MASK;
 	size -= start & ~PAGE_MASK;
 	bank->start = PAGE_ALIGN(start);
 	bank->start = PAGE_ALIGN(start);
 
 
-#ifndef CONFIG_LPAE
+#ifndef CONFIG_ARM_LPAE
 	if (bank->start + size < bank->start) {
 	if (bank->start + size < bank->start) {
 		printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in "
 		printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in "
 			"32-bit physical address space\n", (long long)start);
 			"32-bit physical address space\n", (long long)start);
@@ -778,8 +797,6 @@ void __init setup_arch(char **cmdline_p)
 
 
 	reserve_crashkernel();
 	reserve_crashkernel();
 
 
-	tcm_init();
-
 #ifdef CONFIG_MULTI_IRQ_HANDLER
 #ifdef CONFIG_MULTI_IRQ_HANDLER
 	handle_arch_irq = mdesc->handle_irq;
 	handle_arch_irq = mdesc->handle_irq;
 #endif
 #endif

+ 0 - 3
arch/arm/kernel/smp.c

@@ -673,9 +673,6 @@ static int cpufreq_callback(struct notifier_block *nb,
 	if (freq->flags & CPUFREQ_CONST_LOOPS)
 	if (freq->flags & CPUFREQ_CONST_LOOPS)
 		return NOTIFY_OK;
 		return NOTIFY_OK;
 
 
-	if (arm_delay_ops.const_clock)
-		return NOTIFY_OK;
-
 	if (!per_cpu(l_p_j_ref, cpu)) {
 	if (!per_cpu(l_p_j_ref, cpu)) {
 		per_cpu(l_p_j_ref, cpu) =
 		per_cpu(l_p_j_ref, cpu) =
 			per_cpu(cpu_data, cpu).loops_per_jiffy;
 			per_cpu(cpu_data, cpu).loops_per_jiffy;

+ 66 - 0
arch/arm/kernel/smp_tlb.c

@@ -12,6 +12,7 @@
 
 
 #include <asm/smp_plat.h>
 #include <asm/smp_plat.h>
 #include <asm/tlbflush.h>
 #include <asm/tlbflush.h>
+#include <asm/mmu_context.h>
 
 
 /**********************************************************************/
 /**********************************************************************/
 
 
@@ -69,12 +70,72 @@ static inline void ipi_flush_bp_all(void *ignored)
 	local_flush_bp_all();
 	local_flush_bp_all();
 }
 }
 
 
+#ifdef CONFIG_ARM_ERRATA_798181
+static int erratum_a15_798181(void)
+{
+	unsigned int midr = read_cpuid_id();
+
+	/* Cortex-A15 r0p0..r3p2 affected */
+	if ((midr & 0xff0ffff0) != 0x410fc0f0 || midr > 0x413fc0f2)
+		return 0;
+	return 1;
+}
+#else
+static int erratum_a15_798181(void)
+{
+	return 0;
+}
+#endif
+
+static void ipi_flush_tlb_a15_erratum(void *arg)
+{
+	dmb();
+}
+
+static void broadcast_tlb_a15_erratum(void)
+{
+	if (!erratum_a15_798181())
+		return;
+
+	dummy_flush_tlb_a15_erratum();
+	smp_call_function_many(cpu_online_mask, ipi_flush_tlb_a15_erratum,
+			       NULL, 1);
+}
+
+static void broadcast_tlb_mm_a15_erratum(struct mm_struct *mm)
+{
+	int cpu;
+	cpumask_t mask = { CPU_BITS_NONE };
+
+	if (!erratum_a15_798181())
+		return;
+
+	dummy_flush_tlb_a15_erratum();
+	for_each_online_cpu(cpu) {
+		if (cpu == smp_processor_id())
+			continue;
+		/*
+		 * We only need to send an IPI if the other CPUs are running
+		 * the same ASID as the one being invalidated. There is no
+		 * need for locking around the active_asids check since the
+		 * switch_mm() function has at least one dmb() (as required by
+		 * this workaround) in case a context switch happens on
+		 * another CPU after the condition below.
+		 */
+		if (atomic64_read(&mm->context.id) ==
+		    atomic64_read(&per_cpu(active_asids, cpu)))
+			cpumask_set_cpu(cpu, &mask);
+	}
+	smp_call_function_many(&mask, ipi_flush_tlb_a15_erratum, NULL, 1);
+}
+
 void flush_tlb_all(void)
 void flush_tlb_all(void)
 {
 {
 	if (tlb_ops_need_broadcast())
 	if (tlb_ops_need_broadcast())
 		on_each_cpu(ipi_flush_tlb_all, NULL, 1);
 		on_each_cpu(ipi_flush_tlb_all, NULL, 1);
 	else
 	else
 		local_flush_tlb_all();
 		local_flush_tlb_all();
+	broadcast_tlb_a15_erratum();
 }
 }
 
 
 void flush_tlb_mm(struct mm_struct *mm)
 void flush_tlb_mm(struct mm_struct *mm)
@@ -83,6 +144,7 @@ void flush_tlb_mm(struct mm_struct *mm)
 		on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1);
 		on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1);
 	else
 	else
 		local_flush_tlb_mm(mm);
 		local_flush_tlb_mm(mm);
+	broadcast_tlb_mm_a15_erratum(mm);
 }
 }
 
 
 void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
 void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
@@ -95,6 +157,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
 					&ta, 1);
 					&ta, 1);
 	} else
 	} else
 		local_flush_tlb_page(vma, uaddr);
 		local_flush_tlb_page(vma, uaddr);
+	broadcast_tlb_mm_a15_erratum(vma->vm_mm);
 }
 }
 
 
 void flush_tlb_kernel_page(unsigned long kaddr)
 void flush_tlb_kernel_page(unsigned long kaddr)
@@ -105,6 +168,7 @@ void flush_tlb_kernel_page(unsigned long kaddr)
 		on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1);
 		on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1);
 	} else
 	} else
 		local_flush_tlb_kernel_page(kaddr);
 		local_flush_tlb_kernel_page(kaddr);
+	broadcast_tlb_a15_erratum();
 }
 }
 
 
 void flush_tlb_range(struct vm_area_struct *vma,
 void flush_tlb_range(struct vm_area_struct *vma,
@@ -119,6 +183,7 @@ void flush_tlb_range(struct vm_area_struct *vma,
 					&ta, 1);
 					&ta, 1);
 	} else
 	} else
 		local_flush_tlb_range(vma, start, end);
 		local_flush_tlb_range(vma, start, end);
+	broadcast_tlb_mm_a15_erratum(vma->vm_mm);
 }
 }
 
 
 void flush_tlb_kernel_range(unsigned long start, unsigned long end)
 void flush_tlb_kernel_range(unsigned long start, unsigned long end)
@@ -130,6 +195,7 @@ void flush_tlb_kernel_range(unsigned long start, unsigned long end)
 		on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1);
 		on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1);
 	} else
 	} else
 		local_flush_tlb_kernel_range(start, end);
 		local_flush_tlb_kernel_range(start, end);
+	broadcast_tlb_a15_erratum();
 }
 }
 
 
 void flush_bp_all(void)
 void flush_bp_all(void)

+ 0 - 1
arch/arm/kernel/tcm.c

@@ -17,7 +17,6 @@
 #include <asm/mach/map.h>
 #include <asm/mach/map.h>
 #include <asm/memory.h>
 #include <asm/memory.h>
 #include <asm/system_info.h>
 #include <asm/system_info.h>
-#include "tcm.h"
 
 
 static struct gen_pool *tcm_pool;
 static struct gen_pool *tcm_pool;
 static bool dtcm_present;
 static bool dtcm_present;

+ 1 - 0
arch/arm/kvm/arm.c

@@ -201,6 +201,7 @@ int kvm_dev_ioctl_check_extension(long ext)
 		break;
 		break;
 	case KVM_CAP_ARM_SET_DEVICE_ADDR:
 	case KVM_CAP_ARM_SET_DEVICE_ADDR:
 		r = 1;
 		r = 1;
+		break;
 	case KVM_CAP_NR_VCPUS:
 	case KVM_CAP_NR_VCPUS:
 		r = num_online_cpus();
 		r = num_online_cpus();
 		break;
 		break;

+ 2 - 2
arch/arm/kvm/coproc.c

@@ -79,11 +79,11 @@ static bool access_dcsw(struct kvm_vcpu *vcpu,
 	u32 val;
 	u32 val;
 	int cpu;
 	int cpu;
 
 
-	cpu = get_cpu();
-
 	if (!p->is_write)
 	if (!p->is_write)
 		return read_from_write_only(vcpu, p);
 		return read_from_write_only(vcpu, p);
 
 
+	cpu = get_cpu();
+
 	cpumask_setall(&vcpu->arch.require_dcache_flush);
 	cpumask_setall(&vcpu->arch.require_dcache_flush);
 	cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush);
 	cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush);
 
 

+ 14 - 21
arch/arm/kvm/vgic.c

@@ -883,8 +883,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
 			  lr, irq, vgic_cpu->vgic_lr[lr]);
 			  lr, irq, vgic_cpu->vgic_lr[lr]);
 		BUG_ON(!test_bit(lr, vgic_cpu->lr_used));
 		BUG_ON(!test_bit(lr, vgic_cpu->lr_used));
 		vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT;
 		vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT;
-
-		goto out;
+		return true;
 	}
 	}
 
 
 	/* Try to use another LR for this interrupt */
 	/* Try to use another LR for this interrupt */
@@ -898,7 +897,6 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
 	vgic_cpu->vgic_irq_lr_map[irq] = lr;
 	vgic_cpu->vgic_irq_lr_map[irq] = lr;
 	set_bit(lr, vgic_cpu->lr_used);
 	set_bit(lr, vgic_cpu->lr_used);
 
 
-out:
 	if (!vgic_irq_is_edge(vcpu, irq))
 	if (!vgic_irq_is_edge(vcpu, irq))
 		vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI;
 		vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI;
 
 
@@ -1018,21 +1016,6 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
 
 
 	kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr);
 	kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr);
 
 
-	/*
-	 * We do not need to take the distributor lock here, since the only
-	 * action we perform is clearing the irq_active_bit for an EOIed
-	 * level interrupt.  There is a potential race with
-	 * the queuing of an interrupt in __kvm_vgic_flush_hwstate(), where we
-	 * check if the interrupt is already active. Two possibilities:
-	 *
-	 * - The queuing is occurring on the same vcpu: cannot happen,
-	 *   as we're already in the context of this vcpu, and
-	 *   executing the handler
-	 * - The interrupt has been migrated to another vcpu, and we
-	 *   ignore this interrupt for this run. Big deal. It is still
-	 *   pending though, and will get considered when this vcpu
-	 *   exits.
-	 */
 	if (vgic_cpu->vgic_misr & GICH_MISR_EOI) {
 	if (vgic_cpu->vgic_misr & GICH_MISR_EOI) {
 		/*
 		/*
 		 * Some level interrupts have been EOIed. Clear their
 		 * Some level interrupts have been EOIed. Clear their
@@ -1054,6 +1037,13 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
 			} else {
 			} else {
 				vgic_cpu_irq_clear(vcpu, irq);
 				vgic_cpu_irq_clear(vcpu, irq);
 			}
 			}
+
+			/*
+			 * Despite being EOIed, the LR may not have
+			 * been marked as empty.
+			 */
+			set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr);
+			vgic_cpu->vgic_lr[lr] &= ~GICH_LR_ACTIVE_BIT;
 		}
 		}
 	}
 	}
 
 
@@ -1064,9 +1054,8 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
 }
 }
 
 
 /*
 /*
- * Sync back the VGIC state after a guest run. We do not really touch
- * the distributor here (the irq_pending_on_cpu bit is safe to set),
- * so there is no need for taking its lock.
+ * Sync back the VGIC state after a guest run. The distributor lock is
+ * needed so we don't get preempted in the middle of the state processing.
  */
  */
 static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
 static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
 {
 {
@@ -1112,10 +1101,14 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
 
 
 void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
 void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
 {
 {
+	struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
+
 	if (!irqchip_in_kernel(vcpu->kvm))
 	if (!irqchip_in_kernel(vcpu->kvm))
 		return;
 		return;
 
 
+	spin_lock(&dist->lock);
 	__kvm_vgic_sync_hwstate(vcpu);
 	__kvm_vgic_sync_hwstate(vcpu);
+	spin_unlock(&dist->lock);
 }
 }
 
 
 int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu)
 int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu)

+ 5 - 3
arch/arm/lib/delay.c

@@ -58,7 +58,7 @@ static void __timer_delay(unsigned long cycles)
 static void __timer_const_udelay(unsigned long xloops)
 static void __timer_const_udelay(unsigned long xloops)
 {
 {
 	unsigned long long loops = xloops;
 	unsigned long long loops = xloops;
-	loops *= loops_per_jiffy;
+	loops *= arm_delay_ops.ticks_per_jiffy;
 	__timer_delay(loops >> UDELAY_SHIFT);
 	__timer_delay(loops >> UDELAY_SHIFT);
 }
 }
 
 
@@ -73,11 +73,13 @@ void __init register_current_timer_delay(const struct delay_timer *timer)
 		pr_info("Switching to timer-based delay loop\n");
 		pr_info("Switching to timer-based delay loop\n");
 		delay_timer			= timer;
 		delay_timer			= timer;
 		lpj_fine			= timer->freq / HZ;
 		lpj_fine			= timer->freq / HZ;
-		loops_per_jiffy			= lpj_fine;
+
+		/* cpufreq may scale loops_per_jiffy, so keep a private copy */
+		arm_delay_ops.ticks_per_jiffy	= lpj_fine;
 		arm_delay_ops.delay		= __timer_delay;
 		arm_delay_ops.delay		= __timer_delay;
 		arm_delay_ops.const_udelay	= __timer_const_udelay;
 		arm_delay_ops.const_udelay	= __timer_const_udelay;
 		arm_delay_ops.udelay		= __timer_udelay;
 		arm_delay_ops.udelay		= __timer_udelay;
-		arm_delay_ops.const_clock	= true;
+
 		delay_calibrated		= true;
 		delay_calibrated		= true;
 	} else {
 	} else {
 		pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");
 		pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");

+ 3 - 13
arch/arm/mach-cns3xxx/core.c

@@ -22,19 +22,9 @@
 
 
 static struct map_desc cns3xxx_io_desc[] __initdata = {
 static struct map_desc cns3xxx_io_desc[] __initdata = {
 	{
 	{
-		.virtual	= CNS3XXX_TC11MP_TWD_BASE_VIRT,
-		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_TWD_BASE),
-		.length		= SZ_4K,
-		.type		= MT_DEVICE,
-	}, {
-		.virtual	= CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT,
-		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_GIC_CPU_BASE),
-		.length		= SZ_4K,
-		.type		= MT_DEVICE,
-	}, {
-		.virtual	= CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT,
-		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_GIC_DIST_BASE),
-		.length		= SZ_4K,
+		.virtual	= CNS3XXX_TC11MP_SCU_BASE_VIRT,
+		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_SCU_BASE),
+		.length		= SZ_8K,
 		.type		= MT_DEVICE,
 		.type		= MT_DEVICE,
 	}, {
 	}, {
 		.virtual	= CNS3XXX_TIMER1_2_3_BASE_VIRT,
 		.virtual	= CNS3XXX_TIMER1_2_3_BASE_VIRT,

+ 8 - 8
arch/arm/mach-cns3xxx/include/mach/cns3xxx.h

@@ -94,10 +94,10 @@
 #define RTC_INTR_STS_OFFSET			0x34
 #define RTC_INTR_STS_OFFSET			0x34
 
 
 #define CNS3XXX_MISC_BASE			0x76000000	/* Misc Control */
 #define CNS3XXX_MISC_BASE			0x76000000	/* Misc Control */
-#define CNS3XXX_MISC_BASE_VIRT			0xFFF07000	/* Misc Control */
+#define CNS3XXX_MISC_BASE_VIRT			0xFB000000	/* Misc Control */
 
 
 #define CNS3XXX_PM_BASE				0x77000000	/* Power Management Control */
 #define CNS3XXX_PM_BASE				0x77000000	/* Power Management Control */
-#define CNS3XXX_PM_BASE_VIRT			0xFFF08000
+#define CNS3XXX_PM_BASE_VIRT			0xFB001000
 
 
 #define PM_CLK_GATE_OFFSET			0x00
 #define PM_CLK_GATE_OFFSET			0x00
 #define PM_SOFT_RST_OFFSET			0x04
 #define PM_SOFT_RST_OFFSET			0x04
@@ -109,7 +109,7 @@
 #define PM_PLL_HM_PD_OFFSET			0x1C
 #define PM_PLL_HM_PD_OFFSET			0x1C
 
 
 #define CNS3XXX_UART0_BASE			0x78000000	/* UART 0 */
 #define CNS3XXX_UART0_BASE			0x78000000	/* UART 0 */
-#define CNS3XXX_UART0_BASE_VIRT			0xFFF09000
+#define CNS3XXX_UART0_BASE_VIRT			0xFB002000
 
 
 #define CNS3XXX_UART1_BASE			0x78400000	/* UART 1 */
 #define CNS3XXX_UART1_BASE			0x78400000	/* UART 1 */
 #define CNS3XXX_UART1_BASE_VIRT			0xFFF0A000
 #define CNS3XXX_UART1_BASE_VIRT			0xFFF0A000
@@ -130,7 +130,7 @@
 #define CNS3XXX_I2S_BASE_VIRT			0xFFF10000
 #define CNS3XXX_I2S_BASE_VIRT			0xFFF10000
 
 
 #define CNS3XXX_TIMER1_2_3_BASE			0x7C800000	/* Timer */
 #define CNS3XXX_TIMER1_2_3_BASE			0x7C800000	/* Timer */
-#define CNS3XXX_TIMER1_2_3_BASE_VIRT		0xFFF10800
+#define CNS3XXX_TIMER1_2_3_BASE_VIRT		0xFB003000
 
 
 #define TIMER1_COUNTER_OFFSET			0x00
 #define TIMER1_COUNTER_OFFSET			0x00
 #define TIMER1_AUTO_RELOAD_OFFSET		0x04
 #define TIMER1_AUTO_RELOAD_OFFSET		0x04
@@ -227,16 +227,16 @@
  * Testchip peripheral and fpga gic regions
  * Testchip peripheral and fpga gic regions
  */
  */
 #define CNS3XXX_TC11MP_SCU_BASE			0x90000000	/* IRQ, Test chip */
 #define CNS3XXX_TC11MP_SCU_BASE			0x90000000	/* IRQ, Test chip */
-#define CNS3XXX_TC11MP_SCU_BASE_VIRT		0xFF000000
+#define CNS3XXX_TC11MP_SCU_BASE_VIRT		0xFB004000
 
 
 #define CNS3XXX_TC11MP_GIC_CPU_BASE		0x90000100	/* Test chip interrupt controller CPU interface */
 #define CNS3XXX_TC11MP_GIC_CPU_BASE		0x90000100	/* Test chip interrupt controller CPU interface */
-#define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT	0xFF000100
+#define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT	(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x100)
 
 
 #define CNS3XXX_TC11MP_TWD_BASE			0x90000600
 #define CNS3XXX_TC11MP_TWD_BASE			0x90000600
-#define CNS3XXX_TC11MP_TWD_BASE_VIRT		0xFF000600
+#define CNS3XXX_TC11MP_TWD_BASE_VIRT		(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x600)
 
 
 #define CNS3XXX_TC11MP_GIC_DIST_BASE		0x90001000	/* Test chip interrupt controller distributor */
 #define CNS3XXX_TC11MP_GIC_DIST_BASE		0x90001000	/* Test chip interrupt controller distributor */
-#define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT	0xFF001000
+#define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT	(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x1000)
 
 
 #define CNS3XXX_TC11MP_L220_BASE		0x92002000	/* L220 registers */
 #define CNS3XXX_TC11MP_L220_BASE		0x92002000	/* L220 registers */
 #define CNS3XXX_TC11MP_L220_BASE_VIRT		0xFF002000
 #define CNS3XXX_TC11MP_L220_BASE_VIRT		0xFF002000

+ 7 - 3
arch/arm/mach-ep93xx/include/mach/uncompress.h

@@ -47,9 +47,13 @@ static void __raw_writel(unsigned int value, unsigned int ptr)
 
 
 static inline void putc(int c)
 static inline void putc(int c)
 {
 {
-	/* Transmit fifo not full?  */
-	while (__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF)
-		;
+	int i;
+
+	for (i = 0; i < 10000; i++) {
+		/* Transmit fifo not full? */
+		if (!(__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF))
+			break;
+	}
 
 
 	__raw_writeb(c, PHYS_UART_DATA);
 	__raw_writeb(c, PHYS_UART_DATA);
 }
 }

+ 4 - 6
arch/arm/mach-highbank/hotplug.c

@@ -28,13 +28,11 @@ extern void secondary_startup(void);
  */
  */
 void __ref highbank_cpu_die(unsigned int cpu)
 void __ref highbank_cpu_die(unsigned int cpu)
 {
 {
-	flush_cache_all();
-
 	highbank_set_cpu_jump(cpu, phys_to_virt(0));
 	highbank_set_cpu_jump(cpu, phys_to_virt(0));
-	highbank_set_core_pwr();
 
 
-	cpu_do_idle();
+	flush_cache_louis();
+	highbank_set_core_pwr();
 
 
-	/* We should never return from idle */
-	panic("highbank: cpu %d unexpectedly exit from shutdown\n", cpu);
+	while (1)
+		cpu_do_idle();
 }
 }

+ 2 - 0
arch/arm/mach-imx/clk-imx35.c

@@ -257,6 +257,7 @@ int __init mx35_clocks_init(void)
 	clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");
 	clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");
 	clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0");
 	clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0");
 	clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0");
 	clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0");
+	clk_register_clkdev(clk[admux_gate], "audmux", NULL);
 
 
 	clk_prepare_enable(clk[spba_gate]);
 	clk_prepare_enable(clk[spba_gate]);
 	clk_prepare_enable(clk[gpio1_gate]);
 	clk_prepare_enable(clk[gpio1_gate]);
@@ -265,6 +266,7 @@ int __init mx35_clocks_init(void)
 	clk_prepare_enable(clk[iim_gate]);
 	clk_prepare_enable(clk[iim_gate]);
 	clk_prepare_enable(clk[emi_gate]);
 	clk_prepare_enable(clk[emi_gate]);
 	clk_prepare_enable(clk[max_gate]);
 	clk_prepare_enable(clk[max_gate]);
+	clk_prepare_enable(clk[iomuxc_gate]);
 
 
 	/*
 	/*
 	 * SCC is needed to boot via mmc after a watchdog reset. The clock code
 	 * SCC is needed to boot via mmc after a watchdog reset. The clock code

+ 1 - 2
arch/arm/mach-imx/clk-imx6q.c

@@ -115,7 +115,7 @@ static const char *gpu2d_core_sels[]	= { "axi", "pll3_usb_otg", "pll2_pfd0_352m"
 static const char *gpu3d_core_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
 static const char *gpu3d_core_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
 static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", };
 static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", };
 static const char *ipu_sels[]		= { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
 static const char *ipu_sels[]		= { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
-static const char *ldb_di_sels[]	= { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_pfd1_540m", };
+static const char *ldb_di_sels[]	= { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };
 static const char *ipu_di_pre_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
 static const char *ipu_di_pre_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
 static const char *ipu1_di0_sels[]	= { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
 static const char *ipu1_di0_sels[]	= { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
 static const char *ipu1_di1_sels[]	= { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
 static const char *ipu1_di1_sels[]	= { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
@@ -443,7 +443,6 @@ int __init mx6q_clocks_init(void)
 
 
 	clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0");
 	clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0");
 	clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
 	clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
-	clk_register_clkdev(clk[twd], NULL, "smp_twd");
 	clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL);
 	clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL);
 	clk_register_clkdev(clk[ahb], "ahb", NULL);
 	clk_register_clkdev(clk[ahb], "ahb", NULL);
 	clk_register_clkdev(clk[cko1], "cko1", NULL);
 	clk_register_clkdev(clk[cko1], "cko1", NULL);

+ 2 - 0
arch/arm/mach-imx/common.h

@@ -110,6 +110,8 @@ void tzic_handle_irq(struct pt_regs *);
 
 
 extern void imx_enable_cpu(int cpu, bool enable);
 extern void imx_enable_cpu(int cpu, bool enable);
 extern void imx_set_cpu_jump(int cpu, void *jump_addr);
 extern void imx_set_cpu_jump(int cpu, void *jump_addr);
+extern u32 imx_get_cpu_arg(int cpu);
+extern void imx_set_cpu_arg(int cpu, u32 arg);
 extern void v7_cpu_resume(void);
 extern void v7_cpu_resume(void);
 extern u32 *pl310_get_save_ptr(void);
 extern u32 *pl310_get_save_ptr(void);
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP

+ 12 - 0
arch/arm/mach-imx/hotplug.c

@@ -46,11 +46,23 @@ static inline void cpu_enter_lowpower(void)
 void imx_cpu_die(unsigned int cpu)
 void imx_cpu_die(unsigned int cpu)
 {
 {
 	cpu_enter_lowpower();
 	cpu_enter_lowpower();
+	/*
+	 * We use the cpu jumping argument register to sync with
+	 * imx_cpu_kill() which is running on cpu0 and waiting for
+	 * the register being cleared to kill the cpu.
+	 */
+	imx_set_cpu_arg(cpu, ~0);
 	cpu_do_idle();
 	cpu_do_idle();
 }
 }
 
 
 int imx_cpu_kill(unsigned int cpu)
 int imx_cpu_kill(unsigned int cpu)
 {
 {
+	unsigned long timeout = jiffies + msecs_to_jiffies(50);
+
+	while (imx_get_cpu_arg(cpu) == 0)
+		if (time_after(jiffies, timeout))
+			return 0;
 	imx_enable_cpu(cpu, false);
 	imx_enable_cpu(cpu, false);
+	imx_set_cpu_arg(cpu, 0);
 	return 1;
 	return 1;
 }
 }

+ 12 - 0
arch/arm/mach-imx/src.c

@@ -43,6 +43,18 @@ void imx_set_cpu_jump(int cpu, void *jump_addr)
 		       src_base + SRC_GPR1 + cpu * 8);
 		       src_base + SRC_GPR1 + cpu * 8);
 }
 }
 
 
+u32 imx_get_cpu_arg(int cpu)
+{
+	cpu = cpu_logical_map(cpu);
+	return readl_relaxed(src_base + SRC_GPR1 + cpu * 8 + 4);
+}
+
+void imx_set_cpu_arg(int cpu, u32 arg)
+{
+	cpu = cpu_logical_map(cpu);
+	writel_relaxed(arg, src_base + SRC_GPR1 + cpu * 8 + 4);
+}
+
 void imx_src_prepare_restart(void)
 void imx_src_prepare_restart(void)
 {
 {
 	u32 val;
 	u32 val;

+ 6 - 1
arch/arm/mach-kirkwood/board-iomega_ix2_200.c

@@ -20,10 +20,15 @@ static struct mv643xx_eth_platform_data iomega_ix2_200_ge00_data = {
 	.duplex         = DUPLEX_FULL,
 	.duplex         = DUPLEX_FULL,
 };
 };
 
 
+static struct mv643xx_eth_platform_data iomega_ix2_200_ge01_data = {
+        .phy_addr       = MV643XX_ETH_PHY_ADDR(11),
+};
+
 void __init iomega_ix2_200_init(void)
 void __init iomega_ix2_200_init(void)
 {
 {
 	/*
 	/*
 	 * Basic setup. Needs to be called early.
 	 * Basic setup. Needs to be called early.
 	 */
 	 */
-	kirkwood_ge01_init(&iomega_ix2_200_ge00_data);
+	kirkwood_ge00_init(&iomega_ix2_200_ge00_data);
+	kirkwood_ge01_init(&iomega_ix2_200_ge01_data);
 }
 }

+ 2 - 0
arch/arm/mach-kirkwood/guruplug-setup.c

@@ -53,6 +53,8 @@ static struct mv_sata_platform_data guruplug_sata_data = {
 
 
 static struct mvsdio_platform_data guruplug_mvsdio_data = {
 static struct mvsdio_platform_data guruplug_mvsdio_data = {
 	/* unfortunately the CD signal has not been connected */
 	/* unfortunately the CD signal has not been connected */
+	.gpio_card_detect = -1,
+	.gpio_write_protect = -1,
 };
 };
 
 
 static struct gpio_led guruplug_led_pins[] = {
 static struct gpio_led guruplug_led_pins[] = {

+ 1 - 0
arch/arm/mach-kirkwood/openrd-setup.c

@@ -55,6 +55,7 @@ static struct mv_sata_platform_data openrd_sata_data = {
 
 
 static struct mvsdio_platform_data openrd_mvsdio_data = {
 static struct mvsdio_platform_data openrd_mvsdio_data = {
 	.gpio_card_detect = 29,	/* MPP29 used as SD card detect */
 	.gpio_card_detect = 29,	/* MPP29 used as SD card detect */
+	.gpio_write_protect = -1,
 };
 };
 
 
 static unsigned int openrd_mpp_config[] __initdata = {
 static unsigned int openrd_mpp_config[] __initdata = {

+ 1 - 0
arch/arm/mach-kirkwood/rd88f6281-setup.c

@@ -69,6 +69,7 @@ static struct mv_sata_platform_data rd88f6281_sata_data = {
 
 
 static struct mvsdio_platform_data rd88f6281_mvsdio_data = {
 static struct mvsdio_platform_data rd88f6281_mvsdio_data = {
 	.gpio_card_detect = 28,
 	.gpio_card_detect = 28,
+	.gpio_write_protect = -1,
 };
 };
 
 
 static unsigned int rd88f6281_mpp_config[] __initdata = {
 static unsigned int rd88f6281_mpp_config[] __initdata = {

+ 4 - 1
arch/arm/mach-msm/timer.c

@@ -62,7 +62,10 @@ static int msm_timer_set_next_event(unsigned long cycles,
 {
 {
 	u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE);
 	u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE);
 
 
-	writel_relaxed(0, event_base + TIMER_CLEAR);
+	ctrl &= ~TIMER_ENABLE_EN;
+	writel_relaxed(ctrl, event_base + TIMER_ENABLE);
+
+	writel_relaxed(ctrl, event_base + TIMER_CLEAR);
 	writel_relaxed(cycles, event_base + TIMER_MATCH_VAL);
 	writel_relaxed(cycles, event_base + TIMER_MATCH_VAL);
 	writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE);
 	writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE);
 	return 0;
 	return 0;

+ 10 - 14
arch/arm/mach-mvebu/irq-armada-370-xp.c

@@ -44,6 +44,8 @@
 
 
 #define ARMADA_370_XP_MAX_PER_CPU_IRQS		(28)
 #define ARMADA_370_XP_MAX_PER_CPU_IRQS		(28)
 
 
+#define ARMADA_370_XP_TIMER0_PER_CPU_IRQ	(5)
+
 #define ACTIVE_DOORBELLS			(8)
 #define ACTIVE_DOORBELLS			(8)
 
 
 static DEFINE_RAW_SPINLOCK(irq_controller_lock);
 static DEFINE_RAW_SPINLOCK(irq_controller_lock);
@@ -59,36 +61,26 @@ static struct irq_domain *armada_370_xp_mpic_domain;
  */
  */
 static void armada_370_xp_irq_mask(struct irq_data *d)
 static void armada_370_xp_irq_mask(struct irq_data *d)
 {
 {
-#ifdef CONFIG_SMP
 	irq_hw_number_t hwirq = irqd_to_hwirq(d);
 	irq_hw_number_t hwirq = irqd_to_hwirq(d);
 
 
-	if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS)
+	if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ)
 		writel(hwirq, main_int_base +
 		writel(hwirq, main_int_base +
 				ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS);
 				ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS);
 	else
 	else
 		writel(hwirq, per_cpu_int_base +
 		writel(hwirq, per_cpu_int_base +
 				ARMADA_370_XP_INT_SET_MASK_OFFS);
 				ARMADA_370_XP_INT_SET_MASK_OFFS);
-#else
-	writel(irqd_to_hwirq(d),
-	       per_cpu_int_base + ARMADA_370_XP_INT_SET_MASK_OFFS);
-#endif
 }
 }
 
 
 static void armada_370_xp_irq_unmask(struct irq_data *d)
 static void armada_370_xp_irq_unmask(struct irq_data *d)
 {
 {
-#ifdef CONFIG_SMP
 	irq_hw_number_t hwirq = irqd_to_hwirq(d);
 	irq_hw_number_t hwirq = irqd_to_hwirq(d);
 
 
-	if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS)
+	if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ)
 		writel(hwirq, main_int_base +
 		writel(hwirq, main_int_base +
 				ARMADA_370_XP_INT_SET_ENABLE_OFFS);
 				ARMADA_370_XP_INT_SET_ENABLE_OFFS);
 	else
 	else
 		writel(hwirq, per_cpu_int_base +
 		writel(hwirq, per_cpu_int_base +
 				ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
 				ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
-#else
-	writel(irqd_to_hwirq(d),
-	       per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
-#endif
 }
 }
 
 
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP
@@ -144,10 +136,14 @@ static int armada_370_xp_mpic_irq_map(struct irq_domain *h,
 				      unsigned int virq, irq_hw_number_t hw)
 				      unsigned int virq, irq_hw_number_t hw)
 {
 {
 	armada_370_xp_irq_mask(irq_get_irq_data(virq));
 	armada_370_xp_irq_mask(irq_get_irq_data(virq));
-	writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS);
+	if (hw != ARMADA_370_XP_TIMER0_PER_CPU_IRQ)
+		writel(hw, per_cpu_int_base +
+			ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
+	else
+		writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS);
 	irq_set_status_flags(virq, IRQ_LEVEL);
 	irq_set_status_flags(virq, IRQ_LEVEL);
 
 
-	if (hw < ARMADA_370_XP_MAX_PER_CPU_IRQS) {
+	if (hw == ARMADA_370_XP_TIMER0_PER_CPU_IRQ) {
 		irq_set_percpu_devid(virq);
 		irq_set_percpu_devid(virq);
 		irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip,
 		irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip,
 					handle_percpu_devid_irq);
 					handle_percpu_devid_irq);

+ 12 - 12
arch/arm/mach-mxs/mach-mxs.c

@@ -41,8 +41,6 @@ static struct fb_videomode mx23evk_video_modes[] = {
 		.lower_margin	= 4,
 		.lower_margin	= 4,
 		.hsync_len	= 1,
 		.hsync_len	= 1,
 		.vsync_len	= 1,
 		.vsync_len	= 1,
-		.sync		= FB_SYNC_DATA_ENABLE_HIGH_ACT |
-				  FB_SYNC_DOTCLK_FAILING_ACT,
 	},
 	},
 };
 };
 
 
@@ -59,8 +57,6 @@ static struct fb_videomode mx28evk_video_modes[] = {
 		.lower_margin	= 10,
 		.lower_margin	= 10,
 		.hsync_len	= 10,
 		.hsync_len	= 10,
 		.vsync_len	= 10,
 		.vsync_len	= 10,
-		.sync		= FB_SYNC_DATA_ENABLE_HIGH_ACT |
-				  FB_SYNC_DOTCLK_FAILING_ACT,
 	},
 	},
 };
 };
 
 
@@ -77,7 +73,6 @@ static struct fb_videomode m28evk_video_modes[] = {
 		.lower_margin	= 45,
 		.lower_margin	= 45,
 		.hsync_len	= 1,
 		.hsync_len	= 1,
 		.vsync_len	= 1,
 		.vsync_len	= 1,
-		.sync		= FB_SYNC_DATA_ENABLE_HIGH_ACT,
 	},
 	},
 };
 };
 
 
@@ -94,9 +89,7 @@ static struct fb_videomode apx4devkit_video_modes[] = {
 		.lower_margin	= 13,
 		.lower_margin	= 13,
 		.hsync_len	= 48,
 		.hsync_len	= 48,
 		.vsync_len	= 3,
 		.vsync_len	= 3,
-		.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT |
-				  FB_SYNC_DATA_ENABLE_HIGH_ACT |
-				  FB_SYNC_DOTCLK_FAILING_ACT,
+		.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
 	},
 	},
 };
 };
 
 
@@ -113,9 +106,7 @@ static struct fb_videomode apf28dev_video_modes[] = {
 		.lower_margin = 0x15,
 		.lower_margin = 0x15,
 		.hsync_len = 64,
 		.hsync_len = 64,
 		.vsync_len = 4,
 		.vsync_len = 4,
-		.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT |
-				FB_SYNC_DATA_ENABLE_HIGH_ACT |
-				FB_SYNC_DOTCLK_FAILING_ACT,
+		.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
 	},
 	},
 };
 };
 
 
@@ -132,7 +123,6 @@ static struct fb_videomode cfa10049_video_modes[] = {
 		.lower_margin	= 2,
 		.lower_margin	= 2,
 		.hsync_len	= 15,
 		.hsync_len	= 15,
 		.vsync_len	= 15,
 		.vsync_len	= 15,
-		.sync		= FB_SYNC_DATA_ENABLE_HIGH_ACT
 	},
 	},
 };
 };
 
 
@@ -259,6 +249,8 @@ static void __init imx23_evk_init(void)
 	mxsfb_pdata.mode_count = ARRAY_SIZE(mx23evk_video_modes);
 	mxsfb_pdata.mode_count = ARRAY_SIZE(mx23evk_video_modes);
 	mxsfb_pdata.default_bpp = 32;
 	mxsfb_pdata.default_bpp = 32;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
+	mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT |
+				MXSFB_SYNC_DOTCLK_FAILING_ACT;
 }
 }
 
 
 static inline void enable_clk_enet_out(void)
 static inline void enable_clk_enet_out(void)
@@ -278,6 +270,8 @@ static void __init imx28_evk_init(void)
 	mxsfb_pdata.mode_count = ARRAY_SIZE(mx28evk_video_modes);
 	mxsfb_pdata.mode_count = ARRAY_SIZE(mx28evk_video_modes);
 	mxsfb_pdata.default_bpp = 32;
 	mxsfb_pdata.default_bpp = 32;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
+	mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT |
+				MXSFB_SYNC_DOTCLK_FAILING_ACT;
 
 
 	mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
 	mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
 }
 }
@@ -297,6 +291,7 @@ static void __init m28evk_init(void)
 	mxsfb_pdata.mode_count = ARRAY_SIZE(m28evk_video_modes);
 	mxsfb_pdata.mode_count = ARRAY_SIZE(m28evk_video_modes);
 	mxsfb_pdata.default_bpp = 16;
 	mxsfb_pdata.default_bpp = 16;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT;
+	mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT;
 }
 }
 
 
 static void __init sc_sps1_init(void)
 static void __init sc_sps1_init(void)
@@ -322,6 +317,8 @@ static void __init apx4devkit_init(void)
 	mxsfb_pdata.mode_count = ARRAY_SIZE(apx4devkit_video_modes);
 	mxsfb_pdata.mode_count = ARRAY_SIZE(apx4devkit_video_modes);
 	mxsfb_pdata.default_bpp = 32;
 	mxsfb_pdata.default_bpp = 32;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
+	mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT |
+				MXSFB_SYNC_DOTCLK_FAILING_ACT;
 }
 }
 
 
 #define ENET0_MDC__GPIO_4_0	MXS_GPIO_NR(4, 0)
 #define ENET0_MDC__GPIO_4_0	MXS_GPIO_NR(4, 0)
@@ -407,6 +404,7 @@ static void __init cfa10049_init(void)
 	mxsfb_pdata.mode_count = ARRAY_SIZE(cfa10049_video_modes);
 	mxsfb_pdata.mode_count = ARRAY_SIZE(cfa10049_video_modes);
 	mxsfb_pdata.default_bpp = 32;
 	mxsfb_pdata.default_bpp = 32;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT;
+	mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT;
 }
 }
 
 
 static void __init cfa10037_init(void)
 static void __init cfa10037_init(void)
@@ -423,6 +421,8 @@ static void __init apf28_init(void)
 	mxsfb_pdata.mode_count = ARRAY_SIZE(apf28dev_video_modes);
 	mxsfb_pdata.mode_count = ARRAY_SIZE(apf28dev_video_modes);
 	mxsfb_pdata.default_bpp = 16;
 	mxsfb_pdata.default_bpp = 16;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_16BIT;
 	mxsfb_pdata.ld_intf_width = STMLCDIF_16BIT;
+	mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT |
+				MXSFB_SYNC_DOTCLK_FAILING_ACT;
 }
 }
 
 
 static void __init mxs_machine_init(void)
 static void __init mxs_machine_init(void)

+ 1 - 11
arch/arm/mach-omap1/clock_data.c

@@ -538,15 +538,6 @@ static struct clk usb_hhc_ck16xx = {
 };
 };
 
 
 static struct clk usb_dc_ck = {
 static struct clk usb_dc_ck = {
-	.name		= "usb_dc_ck",
-	.ops		= &clkops_generic,
-	/* Direct from ULPD, no parent */
-	.rate		= 48000000,
-	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
-	.enable_bit	= USB_REQ_EN_SHIFT,
-};
-
-static struct clk usb_dc_ck7xx = {
 	.name		= "usb_dc_ck",
 	.name		= "usb_dc_ck",
 	.ops		= &clkops_generic,
 	.ops		= &clkops_generic,
 	/* Direct from ULPD, no parent */
 	/* Direct from ULPD, no parent */
@@ -727,8 +718,7 @@ static struct omap_clk omap_clks[] = {
 	CLK(NULL,	"usb_clko",	&usb_clko,	CK_16XX | CK_1510 | CK_310),
 	CLK(NULL,	"usb_clko",	&usb_clko,	CK_16XX | CK_1510 | CK_310),
 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck1510, CK_1510 | CK_310),
 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck1510, CK_1510 | CK_310),
 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck16xx, CK_16XX),
 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck16xx, CK_16XX),
-	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck,	CK_16XX),
-	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck7xx,	CK_7XX),
+	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck,	CK_16XX | CK_7XX),
 	CLK(NULL,	"mclk",		&mclk_1510,	CK_1510 | CK_310),
 	CLK(NULL,	"mclk",		&mclk_1510,	CK_1510 | CK_310),
 	CLK(NULL,	"mclk",		&mclk_16xx,	CK_16XX),
 	CLK(NULL,	"mclk",		&mclk_16xx,	CK_16XX),
 	CLK(NULL,	"bclk",		&bclk_1510,	CK_1510 | CK_310),
 	CLK(NULL,	"bclk",		&bclk_1510,	CK_1510 | CK_310),

+ 20 - 0
arch/arm/mach-omap2/cclock44xx_data.c

@@ -52,6 +52,13 @@
  */
  */
 #define OMAP4_DPLL_ABE_DEFFREQ				98304000
 #define OMAP4_DPLL_ABE_DEFFREQ				98304000
 
 
+/*
+ * OMAP4 USB DPLL default frequency. In OMAP4430 TRM version V, section
+ * "3.6.3.9.5 DPLL_USB Preferred Settings" shows that the preferred
+ * locked frequency for the USB DPLL is 960MHz.
+ */
+#define OMAP4_DPLL_USB_DEFFREQ				960000000
+
 /* Root clocks */
 /* Root clocks */
 
 
 DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
 DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
@@ -1011,6 +1018,10 @@ DEFINE_CLK_OMAP_MUX(hsmmc2_fclk, "l3_init_clkdm", hsmmc1_fclk_sel,
 		    OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK,
 		    OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK,
 		    hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops);
 		    hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops);
 
 
+DEFINE_CLK_GATE(ocp2scp_usb_phy_phy_48m, "func_48m_fclk", &func_48m_fclk, 0x0,
+		OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL,
+		OMAP4430_OPTFCLKEN_PHY_48M_SHIFT, 0x0, NULL);
+
 DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0,
 DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0,
 		OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
 		OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
 		OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
 		OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
@@ -1538,6 +1549,7 @@ static struct omap_clk omap44xx_clks[] = {
 	CLK(NULL,	"per_mcbsp4_gfclk",			&per_mcbsp4_gfclk,	CK_443X),
 	CLK(NULL,	"per_mcbsp4_gfclk",			&per_mcbsp4_gfclk,	CK_443X),
 	CLK(NULL,	"hsmmc1_fclk",			&hsmmc1_fclk,	CK_443X),
 	CLK(NULL,	"hsmmc1_fclk",			&hsmmc1_fclk,	CK_443X),
 	CLK(NULL,	"hsmmc2_fclk",			&hsmmc2_fclk,	CK_443X),
 	CLK(NULL,	"hsmmc2_fclk",			&hsmmc2_fclk,	CK_443X),
+	CLK(NULL,	"ocp2scp_usb_phy_phy_48m",	&ocp2scp_usb_phy_phy_48m,	CK_443X),
 	CLK(NULL,	"sha2md5_fck",			&sha2md5_fck,	CK_443X),
 	CLK(NULL,	"sha2md5_fck",			&sha2md5_fck,	CK_443X),
 	CLK(NULL,	"slimbus1_fclk_1",		&slimbus1_fclk_1,	CK_443X),
 	CLK(NULL,	"slimbus1_fclk_1",		&slimbus1_fclk_1,	CK_443X),
 	CLK(NULL,	"slimbus1_fclk_0",		&slimbus1_fclk_0,	CK_443X),
 	CLK(NULL,	"slimbus1_fclk_0",		&slimbus1_fclk_0,	CK_443X),
@@ -1705,5 +1717,13 @@ int __init omap4xxx_clk_init(void)
 	if (rc)
 	if (rc)
 		pr_err("%s: failed to configure ABE DPLL!\n", __func__);
 		pr_err("%s: failed to configure ABE DPLL!\n", __func__);
 
 
+	/*
+	 * Lock USB DPLL on OMAP4 devices so that the L3INIT power
+	 * domain can transition to retention state when not in use.
+	 */
+	rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ);
+	if (rc)
+		pr_err("%s: failed to configure USB DPLL!\n", __func__);
+
 	return 0;
 	return 0;
 }
 }

+ 3 - 0
arch/arm/mach-omap2/common.h

@@ -293,5 +293,8 @@ extern void omap_reserve(void);
 struct omap_hwmod;
 struct omap_hwmod;
 extern int omap_dss_reset(struct omap_hwmod *);
 extern int omap_dss_reset(struct omap_hwmod *);
 
 
+/* SoC specific clock initializer */
+extern int (*omap_clk_init)(void);
+
 #endif /* __ASSEMBLER__ */
 #endif /* __ASSEMBLER__ */
 #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */
 #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */

+ 12 - 6
arch/arm/mach-omap2/io.c

@@ -54,6 +54,12 @@
 #include "prm3xxx.h"
 #include "prm3xxx.h"
 #include "prm44xx.h"
 #include "prm44xx.h"
 
 
+/*
+ * omap_clk_init: points to a function that does the SoC-specific
+ * clock initializations
+ */
+int (*omap_clk_init)(void);
+
 /*
 /*
  * The machine specific code may provide the extra mapping besides the
  * The machine specific code may provide the extra mapping besides the
  * default mapping provided here.
  * default mapping provided here.
@@ -397,7 +403,7 @@ void __init omap2420_init_early(void)
 	omap242x_clockdomains_init();
 	omap242x_clockdomains_init();
 	omap2420_hwmod_init();
 	omap2420_hwmod_init();
 	omap_hwmod_init_postsetup();
 	omap_hwmod_init_postsetup();
-	omap2420_clk_init();
+	omap_clk_init = omap2420_clk_init;
 }
 }
 
 
 void __init omap2420_init_late(void)
 void __init omap2420_init_late(void)
@@ -427,7 +433,7 @@ void __init omap2430_init_early(void)
 	omap243x_clockdomains_init();
 	omap243x_clockdomains_init();
 	omap2430_hwmod_init();
 	omap2430_hwmod_init();
 	omap_hwmod_init_postsetup();
 	omap_hwmod_init_postsetup();
-	omap2430_clk_init();
+	omap_clk_init = omap2430_clk_init;
 }
 }
 
 
 void __init omap2430_init_late(void)
 void __init omap2430_init_late(void)
@@ -462,7 +468,7 @@ void __init omap3_init_early(void)
 	omap3xxx_clockdomains_init();
 	omap3xxx_clockdomains_init();
 	omap3xxx_hwmod_init();
 	omap3xxx_hwmod_init();
 	omap_hwmod_init_postsetup();
 	omap_hwmod_init_postsetup();
-	omap3xxx_clk_init();
+	omap_clk_init = omap3xxx_clk_init;
 }
 }
 
 
 void __init omap3430_init_early(void)
 void __init omap3430_init_early(void)
@@ -500,7 +506,7 @@ void __init ti81xx_init_early(void)
 	omap3xxx_clockdomains_init();
 	omap3xxx_clockdomains_init();
 	omap3xxx_hwmod_init();
 	omap3xxx_hwmod_init();
 	omap_hwmod_init_postsetup();
 	omap_hwmod_init_postsetup();
-	omap3xxx_clk_init();
+	omap_clk_init = omap3xxx_clk_init;
 }
 }
 
 
 void __init omap3_init_late(void)
 void __init omap3_init_late(void)
@@ -568,7 +574,7 @@ void __init am33xx_init_early(void)
 	am33xx_clockdomains_init();
 	am33xx_clockdomains_init();
 	am33xx_hwmod_init();
 	am33xx_hwmod_init();
 	omap_hwmod_init_postsetup();
 	omap_hwmod_init_postsetup();
-	am33xx_clk_init();
+	omap_clk_init = am33xx_clk_init;
 }
 }
 #endif
 #endif
 
 
@@ -593,7 +599,7 @@ void __init omap4430_init_early(void)
 	omap44xx_clockdomains_init();
 	omap44xx_clockdomains_init();
 	omap44xx_hwmod_init();
 	omap44xx_hwmod_init();
 	omap_hwmod_init_postsetup();
 	omap_hwmod_init_postsetup();
-	omap4xxx_clk_init();
+	omap_clk_init = omap4xxx_clk_init;
 }
 }
 
 
 void __init omap4430_init_late(void)
 void __init omap4430_init_late(void)

+ 5 - 2
arch/arm/mach-omap2/omap_hwmod.c

@@ -1368,7 +1368,9 @@ static void _enable_sysc(struct omap_hwmod *oh)
 	}
 	}
 
 
 	if (sf & SYSC_HAS_MIDLEMODE) {
 	if (sf & SYSC_HAS_MIDLEMODE) {
-		if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
+		if (oh->flags & HWMOD_FORCE_MSTANDBY) {
+			idlemode = HWMOD_IDLEMODE_FORCE;
+		} else if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
 			idlemode = HWMOD_IDLEMODE_NO;
 			idlemode = HWMOD_IDLEMODE_NO;
 		} else {
 		} else {
 			if (sf & SYSC_HAS_ENAWAKEUP)
 			if (sf & SYSC_HAS_ENAWAKEUP)
@@ -1440,7 +1442,8 @@ static void _idle_sysc(struct omap_hwmod *oh)
 	}
 	}
 
 
 	if (sf & SYSC_HAS_MIDLEMODE) {
 	if (sf & SYSC_HAS_MIDLEMODE) {
-		if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
+		if ((oh->flags & HWMOD_SWSUP_MSTANDBY) ||
+		    (oh->flags & HWMOD_FORCE_MSTANDBY)) {
 			idlemode = HWMOD_IDLEMODE_FORCE;
 			idlemode = HWMOD_IDLEMODE_FORCE;
 		} else {
 		} else {
 			if (sf & SYSC_HAS_ENAWAKEUP)
 			if (sf & SYSC_HAS_ENAWAKEUP)

+ 7 - 2
arch/arm/mach-omap2/omap_hwmod.h

@@ -427,8 +427,8 @@ struct omap_hwmod_omap4_prcm {
  *
  *
  * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out
  * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out
  *     of idle, rather than relying on module smart-idle
  *     of idle, rather than relying on module smart-idle
- * HWMOD_SWSUP_MSTDBY: omap_hwmod code should manually bring module in and out
- *     of standby, rather than relying on module smart-standby
+ * HWMOD_SWSUP_MSTANDBY: omap_hwmod code should manually bring module in and
+ *     out of standby, rather than relying on module smart-standby
  * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for
  * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for
  *     SDRAM controller, etc. XXX probably belongs outside the main hwmod file
  *     SDRAM controller, etc. XXX probably belongs outside the main hwmod file
  *     XXX Should be HWMOD_SETUP_NO_RESET
  *     XXX Should be HWMOD_SETUP_NO_RESET
@@ -459,6 +459,10 @@ struct omap_hwmod_omap4_prcm {
  *     correctly, or this is being abused to deal with some PM latency
  *     correctly, or this is being abused to deal with some PM latency
  *     issues -- but we're currently suffering from a shortage of
  *     issues -- but we're currently suffering from a shortage of
  *     folks who are able to track these issues down properly.
  *     folks who are able to track these issues down properly.
+ * HWMOD_FORCE_MSTANDBY: Always keep MIDLEMODE bits cleared so that device
+ *     is kept in force-standby mode. Failing to do so causes PM problems
+ *     with musb on OMAP3630 at least. Note that musb has a dedicated register
+ *     to control MSTANDBY signal when MIDLEMODE is set to force-standby.
  */
  */
 #define HWMOD_SWSUP_SIDLE			(1 << 0)
 #define HWMOD_SWSUP_SIDLE			(1 << 0)
 #define HWMOD_SWSUP_MSTANDBY			(1 << 1)
 #define HWMOD_SWSUP_MSTANDBY			(1 << 1)
@@ -471,6 +475,7 @@ struct omap_hwmod_omap4_prcm {
 #define HWMOD_16BIT_REG				(1 << 8)
 #define HWMOD_16BIT_REG				(1 << 8)
 #define HWMOD_EXT_OPT_MAIN_CLK			(1 << 9)
 #define HWMOD_EXT_OPT_MAIN_CLK			(1 << 9)
 #define HWMOD_BLOCK_WFI				(1 << 10)
 #define HWMOD_BLOCK_WFI				(1 << 10)
+#define HWMOD_FORCE_MSTANDBY			(1 << 11)
 
 
 /*
 /*
  * omap_hwmod._int_flags definitions
  * omap_hwmod._int_flags definitions

+ 6 - 1
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c

@@ -1707,9 +1707,14 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {
 	 * Erratum ID: i479  idle_req / idle_ack mechanism potentially
 	 * Erratum ID: i479  idle_req / idle_ack mechanism potentially
 	 * broken when autoidle is enabled
 	 * broken when autoidle is enabled
 	 * workaround is to disable the autoidle bit at module level.
 	 * workaround is to disable the autoidle bit at module level.
+	 *
+	 * Enabling the device in any other MIDLEMODE setting but force-idle
+	 * causes core_pwrdm not enter idle states at least on OMAP3630.
+	 * Note that musb has OTG_FORCESTDBY register that controls MSTANDBY
+	 * signal when MIDLEMODE is set to force-idle.
 	 */
 	 */
 	.flags		= HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
 	.flags		= HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
-				| HWMOD_SWSUP_MSTANDBY,
+				| HWMOD_FORCE_MSTANDBY,
 };
 };
 
 
 /* usb_otg_hs */
 /* usb_otg_hs */

+ 11 - 1
arch/arm/mach-omap2/omap_hwmod_44xx_data.c

@@ -2719,7 +2719,17 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = {
 	.name		= "ocp2scp_usb_phy",
 	.name		= "ocp2scp_usb_phy",
 	.class		= &omap44xx_ocp2scp_hwmod_class,
 	.class		= &omap44xx_ocp2scp_hwmod_class,
 	.clkdm_name	= "l3_init_clkdm",
 	.clkdm_name	= "l3_init_clkdm",
-	.main_clk	= "func_48m_fclk",
+	/*
+	 * ocp2scp_usb_phy_phy_48m is provided by the OMAP4 PRCM IP
+	 * block as an "optional clock," and normally should never be
+	 * specified as the main_clk for an OMAP IP block.  However it
+	 * turns out that this clock is actually the main clock for
+	 * the ocp2scp_usb_phy IP block:
+	 * http://lists.infradead.org/pipermail/linux-arm-kernel/2012-September/119943.html
+	 * So listing ocp2scp_usb_phy_phy_48m as a main_clk here seems
+	 * to be the best workaround.
+	 */
+	.main_clk	= "ocp2scp_usb_phy_phy_48m",
 	.prcm = {
 	.prcm = {
 		.omap4 = {
 		.omap4 = {
 			.clkctrl_offs = OMAP4_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL_OFFSET,
 			.clkctrl_offs = OMAP4_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL_OFFSET,

+ 4 - 0
arch/arm/mach-omap2/timer.c

@@ -547,6 +547,8 @@ static inline void __init realtime_counter_init(void)
 			       clksrc_nr, clksrc_src)			\
 			       clksrc_nr, clksrc_src)			\
 void __init omap##name##_gptimer_timer_init(void)			\
 void __init omap##name##_gptimer_timer_init(void)			\
 {									\
 {									\
+	if (omap_clk_init)						\
+		omap_clk_init();					\
 	omap_dmtimer_init();						\
 	omap_dmtimer_init();						\
 	omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);	\
 	omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);	\
 	omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);	\
 	omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);	\
@@ -556,6 +558,8 @@ void __init omap##name##_gptimer_timer_init(void)			\
 				clksrc_nr, clksrc_src)			\
 				clksrc_nr, clksrc_src)			\
 void __init omap##name##_sync32k_timer_init(void)		\
 void __init omap##name##_sync32k_timer_init(void)		\
 {									\
 {									\
+	if (omap_clk_init)						\
+		omap_clk_init();					\
 	omap_dmtimer_init();						\
 	omap_dmtimer_init();						\
 	omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);	\
 	omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);	\
 	/* Enable the use of clocksource="gp_timer" kernel parameter */	\
 	/* Enable the use of clocksource="gp_timer" kernel parameter */	\

+ 1 - 3
arch/arm/mach-s3c24xx/include/mach/irqs.h

@@ -188,10 +188,8 @@
 
 
 #if defined(CONFIG_CPU_S3C2416)
 #if defined(CONFIG_CPU_S3C2416)
 #define NR_IRQS (IRQ_S3C2416_I2S1 + 1)
 #define NR_IRQS (IRQ_S3C2416_I2S1 + 1)
-#elif defined(CONFIG_CPU_S3C2443)
-#define NR_IRQS (IRQ_S3C2443_AC97+1)
 #else
 #else
-#define NR_IRQS (IRQ_S3C2440_AC97+1)
+#define NR_IRQS (IRQ_S3C2443_AC97 + 1)
 #endif
 #endif
 
 
 /* compatibility define. */
 /* compatibility define. */

+ 1 - 1
arch/arm/mach-s3c24xx/irq.c

@@ -500,7 +500,7 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
 		base = (void *)0xfd000000;
 		base = (void *)0xfd000000;
 
 
 		intc->reg_mask = base + 0xa4;
 		intc->reg_mask = base + 0xa4;
-		intc->reg_pending = base + 0x08;
+		intc->reg_pending = base + 0xa8;
 		irq_num = 20;
 		irq_num = 20;
 		irq_start = S3C2410_IRQ(32);
 		irq_start = S3C2410_IRQ(32);
 		irq_offset = 4;
 		irq_offset = 4;

+ 0 - 1
arch/arm/mach-ux500/board-mop500-sdi.c

@@ -81,7 +81,6 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = {
 #endif
 #endif
 
 
 struct mmci_platform_data mop500_sdi0_data = {
 struct mmci_platform_data mop500_sdi0_data = {
-	.ios_handler	= mop500_sdi0_ios_handler,
 	.ocr_mask	= MMC_VDD_29_30,
 	.ocr_mask	= MMC_VDD_29_30,
 	.f_max		= 50000000,
 	.f_max		= 50000000,
 	.capabilities	= MMC_CAP_4_BIT_DATA |
 	.capabilities	= MMC_CAP_4_BIT_DATA |

+ 12 - 0
arch/arm/mach-ux500/board-mop500.c

@@ -12,6 +12,7 @@
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
+#include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/i2c.h>
 #include <linux/i2c.h>
 #include <linux/platform_data/i2c-nomadik.h>
 #include <linux/platform_data/i2c-nomadik.h>
@@ -439,6 +440,15 @@ static void mop500_prox_deactivate(struct device *dev)
 	regulator_put(prox_regulator);
 	regulator_put(prox_regulator);
 }
 }
 
 
+void mop500_snowball_ethernet_clock_enable(void)
+{
+	struct clk *clk;
+
+	clk = clk_get_sys("fsmc", NULL);
+	if (!IS_ERR(clk))
+		clk_prepare_enable(clk);
+}
+
 static struct cryp_platform_data u8500_cryp1_platform_data = {
 static struct cryp_platform_data u8500_cryp1_platform_data = {
 		.mem_to_engine = {
 		.mem_to_engine = {
 				.dir = STEDMA40_MEM_TO_PERIPH,
 				.dir = STEDMA40_MEM_TO_PERIPH,
@@ -683,6 +693,8 @@ static void __init snowball_init_machine(void)
 	mop500_audio_init(parent);
 	mop500_audio_init(parent);
 	mop500_uart_init(parent);
 	mop500_uart_init(parent);
 
 
+	mop500_snowball_ethernet_clock_enable();
+
 	/* This board has full regulator constraints */
 	/* This board has full regulator constraints */
 	regulator_has_full_constraints();
 	regulator_has_full_constraints();
 }
 }

+ 1 - 0
arch/arm/mach-ux500/board-mop500.h

@@ -104,6 +104,7 @@ void __init mop500_pinmaps_init(void);
 void __init snowball_pinmaps_init(void);
 void __init snowball_pinmaps_init(void);
 void __init hrefv60_pinmaps_init(void);
 void __init hrefv60_pinmaps_init(void);
 void mop500_audio_init(struct device *parent);
 void mop500_audio_init(struct device *parent);
+void mop500_snowball_ethernet_clock_enable(void);
 
 
 int __init mop500_uib_init(void);
 int __init mop500_uib_init(void);
 void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,
 void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,

+ 3 - 2
arch/arm/mach-ux500/cpu-db8500.c

@@ -312,9 +312,10 @@ static void __init u8500_init_machine(void)
 	/* Pinmaps must be in place before devices register */
 	/* Pinmaps must be in place before devices register */
 	if (of_machine_is_compatible("st-ericsson,mop500"))
 	if (of_machine_is_compatible("st-ericsson,mop500"))
 		mop500_pinmaps_init();
 		mop500_pinmaps_init();
-	else if (of_machine_is_compatible("calaosystems,snowball-a9500"))
+	else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
 		snowball_pinmaps_init();
 		snowball_pinmaps_init();
-	else if (of_machine_is_compatible("st-ericsson,hrefv60+"))
+		mop500_snowball_ethernet_clock_enable();
+	} else if (of_machine_is_compatible("st-ericsson,hrefv60+"))
 		hrefv60_pinmaps_init();
 		hrefv60_pinmaps_init();
 	else if (of_machine_is_compatible("st-ericsson,ccu9540")) {}
 	else if (of_machine_is_compatible("st-ericsson,ccu9540")) {}
 		/* TODO: Add pinmaps for ccu9540 board. */
 		/* TODO: Add pinmaps for ccu9540 board. */

+ 1 - 4
arch/arm/mm/Kconfig

@@ -43,7 +43,7 @@ config CPU_ARM740T
 	depends on !MMU
 	depends on !MMU
 	select CPU_32v4T
 	select CPU_32v4T
 	select CPU_ABRT_LV4T
 	select CPU_ABRT_LV4T
-	select CPU_CACHE_V3	# although the core is v4t
+	select CPU_CACHE_V4
 	select CPU_CP15_MPU
 	select CPU_CP15_MPU
 	select CPU_PABRT_LEGACY
 	select CPU_PABRT_LEGACY
 	help
 	help
@@ -469,9 +469,6 @@ config CPU_PABRT_V7
 	bool
 	bool
 
 
 # The cache model
 # The cache model
-config CPU_CACHE_V3
-	bool
-
 config CPU_CACHE_V4
 config CPU_CACHE_V4
 	bool
 	bool
 
 

+ 0 - 1
arch/arm/mm/Makefile

@@ -33,7 +33,6 @@ obj-$(CONFIG_CPU_PABRT_LEGACY)	+= pabort-legacy.o
 obj-$(CONFIG_CPU_PABRT_V6)	+= pabort-v6.o
 obj-$(CONFIG_CPU_PABRT_V6)	+= pabort-v6.o
 obj-$(CONFIG_CPU_PABRT_V7)	+= pabort-v7.o
 obj-$(CONFIG_CPU_PABRT_V7)	+= pabort-v7.o
 
 
-obj-$(CONFIG_CPU_CACHE_V3)	+= cache-v3.o
 obj-$(CONFIG_CPU_CACHE_V4)	+= cache-v4.o
 obj-$(CONFIG_CPU_CACHE_V4)	+= cache-v4.o
 obj-$(CONFIG_CPU_CACHE_V4WT)	+= cache-v4wt.o
 obj-$(CONFIG_CPU_CACHE_V4WT)	+= cache-v4wt.o
 obj-$(CONFIG_CPU_CACHE_V4WB)	+= cache-v4wb.o
 obj-$(CONFIG_CPU_CACHE_V4WB)	+= cache-v4wb.o

+ 1 - 0
arch/arm/mm/cache-feroceon-l2.c

@@ -343,6 +343,7 @@ void __init feroceon_l2_init(int __l2_wt_override)
 	outer_cache.inv_range = feroceon_l2_inv_range;
 	outer_cache.inv_range = feroceon_l2_inv_range;
 	outer_cache.clean_range = feroceon_l2_clean_range;
 	outer_cache.clean_range = feroceon_l2_clean_range;
 	outer_cache.flush_range = feroceon_l2_flush_range;
 	outer_cache.flush_range = feroceon_l2_flush_range;
+	outer_cache.inv_all = l2_inv_all;
 
 
 	enable_l2();
 	enable_l2();
 
 

+ 4 - 7
arch/arm/mm/cache-l2x0.c

@@ -299,7 +299,7 @@ static void l2x0_unlock(u32 cache_id)
 	int lockregs;
 	int lockregs;
 	int i;
 	int i;
 
 
-	switch (cache_id) {
+	switch (cache_id & L2X0_CACHE_ID_PART_MASK) {
 	case L2X0_CACHE_ID_PART_L310:
 	case L2X0_CACHE_ID_PART_L310:
 		lockregs = 8;
 		lockregs = 8;
 		break;
 		break;
@@ -333,15 +333,14 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)
 	if (cache_id_part_number_from_dt)
 	if (cache_id_part_number_from_dt)
 		cache_id = cache_id_part_number_from_dt;
 		cache_id = cache_id_part_number_from_dt;
 	else
 	else
-		cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID)
-			& L2X0_CACHE_ID_PART_MASK;
+		cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID);
 	aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);
 	aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);
 
 
 	aux &= aux_mask;
 	aux &= aux_mask;
 	aux |= aux_val;
 	aux |= aux_val;
 
 
 	/* Determine the number of ways */
 	/* Determine the number of ways */
-	switch (cache_id) {
+	switch (cache_id & L2X0_CACHE_ID_PART_MASK) {
 	case L2X0_CACHE_ID_PART_L310:
 	case L2X0_CACHE_ID_PART_L310:
 		if (aux & (1 << 16))
 		if (aux & (1 << 16))
 			ways = 16;
 			ways = 16;
@@ -725,7 +724,6 @@ static const struct l2x0_of_data pl310_data = {
 		.flush_all   = l2x0_flush_all,
 		.flush_all   = l2x0_flush_all,
 		.inv_all     = l2x0_inv_all,
 		.inv_all     = l2x0_inv_all,
 		.disable     = l2x0_disable,
 		.disable     = l2x0_disable,
-		.set_debug   = pl310_set_debug,
 	},
 	},
 };
 };
 
 
@@ -814,9 +812,8 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)
 		data->save();
 		data->save();
 
 
 	of_init = true;
 	of_init = true;
-	l2x0_init(l2x0_base, aux_val, aux_mask);
-
 	memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache));
 	memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache));
+	l2x0_init(l2x0_base, aux_val, aux_mask);
 
 
 	return 0;
 	return 0;
 }
 }

+ 0 - 137
arch/arm/mm/cache-v3.S

@@ -1,137 +0,0 @@
-/*
- *  linux/arch/arm/mm/cache-v3.S
- *
- *  Copyright (C) 1997-2002 Russell king
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/linkage.h>
-#include <linux/init.h>
-#include <asm/page.h>
-#include "proc-macros.S"
-
-/*
- *	flush_icache_all()
- *
- *	Unconditionally clean and invalidate the entire icache.
- */
-ENTRY(v3_flush_icache_all)
-	mov	pc, lr
-ENDPROC(v3_flush_icache_all)
-
-/*
- *	flush_user_cache_all()
- *
- *	Invalidate all cache entries in a particular address
- *	space.
- *
- *	- mm	- mm_struct describing address space
- */
-ENTRY(v3_flush_user_cache_all)
-	/* FALLTHROUGH */
-/*
- *	flush_kern_cache_all()
- *
- *	Clean and invalidate the entire cache.
- */
-ENTRY(v3_flush_kern_cache_all)
-	/* FALLTHROUGH */
-
-/*
- *	flush_user_cache_range(start, end, flags)
- *
- *	Invalidate a range of cache entries in the specified
- *	address space.
- *
- *	- start - start address (may not be aligned)
- *	- end	- end address (exclusive, may not be aligned)
- *	- flags	- vma_area_struct flags describing address space
- */
-ENTRY(v3_flush_user_cache_range)
-	mov	ip, #0
-	mcreq	p15, 0, ip, c7, c0, 0		@ flush ID cache
-	mov	pc, lr
-
-/*
- *	coherent_kern_range(start, end)
- *
- *	Ensure coherency between the Icache and the Dcache in the
- *	region described by start.  If you have non-snooping
- *	Harvard caches, you need to implement this function.
- *
- *	- start  - virtual start address
- *	- end	 - virtual end address
- */
-ENTRY(v3_coherent_kern_range)
-	/* FALLTHROUGH */
-
-/*
- *	coherent_user_range(start, end)
- *
- *	Ensure coherency between the Icache and the Dcache in the
- *	region described by start.  If you have non-snooping
- *	Harvard caches, you need to implement this function.
- *
- *	- start  - virtual start address
- *	- end	 - virtual end address
- */
-ENTRY(v3_coherent_user_range)
-	mov	r0, #0
-	mov	pc, lr
-
-/*
- *	flush_kern_dcache_area(void *page, size_t size)
- *
- *	Ensure no D cache aliasing occurs, either with itself or
- *	the I cache
- *
- *	- addr	- kernel address
- *	- size	- region size
- */
-ENTRY(v3_flush_kern_dcache_area)
-	/* FALLTHROUGH */
-
-/*
- *	dma_flush_range(start, end)
- *
- *	Clean and invalidate the specified virtual address range.
- *
- *	- start  - virtual start address
- *	- end	 - virtual end address
- */
-ENTRY(v3_dma_flush_range)
-	mov	r0, #0
-	mcr	p15, 0, r0, c7, c0, 0		@ flush ID cache
-	mov	pc, lr
-
-/*
- *	dma_unmap_area(start, size, dir)
- *	- start	- kernel virtual start address
- *	- size	- size of region
- *	- dir	- DMA direction
- */
-ENTRY(v3_dma_unmap_area)
-	teq	r2, #DMA_TO_DEVICE
-	bne	v3_dma_flush_range
-	/* FALLTHROUGH */
-
-/*
- *	dma_map_area(start, size, dir)
- *	- start	- kernel virtual start address
- *	- size	- size of region
- *	- dir	- DMA direction
- */
-ENTRY(v3_dma_map_area)
-	mov	pc, lr
-ENDPROC(v3_dma_unmap_area)
-ENDPROC(v3_dma_map_area)
-
-	.globl	v3_flush_kern_cache_louis
-	.equ	v3_flush_kern_cache_louis, v3_flush_kern_cache_all
-
-	__INITDATA
-
-	@ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
-	define_cache_functions v3

+ 1 - 1
arch/arm/mm/cache-v4.S

@@ -58,7 +58,7 @@ ENTRY(v4_flush_kern_cache_all)
 ENTRY(v4_flush_user_cache_range)
 ENTRY(v4_flush_user_cache_range)
 #ifdef CONFIG_CPU_CP15
 #ifdef CONFIG_CPU_CP15
 	mov	ip, #0
 	mov	ip, #0
-	mcreq	p15, 0, ip, c7, c7, 0		@ flush ID cache
+	mcr	p15, 0, ip, c7, c7, 0		@ flush ID cache
 	mov	pc, lr
 	mov	pc, lr
 #else
 #else
 	/* FALLTHROUGH */
 	/* FALLTHROUGH */

+ 2 - 1
arch/arm/mm/context.c

@@ -48,7 +48,7 @@ static DEFINE_RAW_SPINLOCK(cpu_asid_lock);
 static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION);
 static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION);
 static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS);
 static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS);
 
 
-static DEFINE_PER_CPU(atomic64_t, active_asids);
+DEFINE_PER_CPU(atomic64_t, active_asids);
 static DEFINE_PER_CPU(u64, reserved_asids);
 static DEFINE_PER_CPU(u64, reserved_asids);
 static cpumask_t tlb_flush_pending;
 static cpumask_t tlb_flush_pending;
 
 
@@ -215,6 +215,7 @@ void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk)
 	if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) {
 	if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) {
 		local_flush_bp_all();
 		local_flush_bp_all();
 		local_flush_tlb_all();
 		local_flush_tlb_all();
+		dummy_flush_tlb_a15_erratum();
 	}
 	}
 
 
 	atomic64_set(&per_cpu(active_asids, cpu), asid);
 	atomic64_set(&per_cpu(active_asids, cpu), asid);

+ 49 - 26
arch/arm/mm/mmu.c

@@ -34,6 +34,7 @@
 #include <asm/mach/pci.h>
 #include <asm/mach/pci.h>
 
 
 #include "mm.h"
 #include "mm.h"
+#include "tcm.h"
 
 
 /*
 /*
  * empty_zero_page is a special page that is used for
  * empty_zero_page is a special page that is used for
@@ -598,39 +599,60 @@ static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr,
 	} while (pte++, addr += PAGE_SIZE, addr != end);
 	} while (pte++, addr += PAGE_SIZE, addr != end);
 }
 }
 
 
-static void __init alloc_init_section(pud_t *pud, unsigned long addr,
-				      unsigned long end, phys_addr_t phys,
-				      const struct mem_type *type)
+static void __init map_init_section(pmd_t *pmd, unsigned long addr,
+			unsigned long end, phys_addr_t phys,
+			const struct mem_type *type)
 {
 {
-	pmd_t *pmd = pmd_offset(pud, addr);
-
+#ifndef CONFIG_ARM_LPAE
 	/*
 	/*
-	 * Try a section mapping - end, addr and phys must all be aligned
-	 * to a section boundary.  Note that PMDs refer to the individual
-	 * L1 entries, whereas PGDs refer to a group of L1 entries making
-	 * up one logical pointer to an L2 table.
+	 * In classic MMU format, puds and pmds are folded in to
+	 * the pgds. pmd_offset gives the PGD entry. PGDs refer to a
+	 * group of L1 entries making up one logical pointer to
+	 * an L2 table (2MB), where as PMDs refer to the individual
+	 * L1 entries (1MB). Hence increment to get the correct
+	 * offset for odd 1MB sections.
+	 * (See arch/arm/include/asm/pgtable-2level.h)
 	 */
 	 */
-	if (type->prot_sect && ((addr | end | phys) & ~SECTION_MASK) == 0) {
-		pmd_t *p = pmd;
-
-#ifndef CONFIG_ARM_LPAE
-		if (addr & SECTION_SIZE)
-			pmd++;
+	if (addr & SECTION_SIZE)
+		pmd++;
 #endif
 #endif
+	do {
+		*pmd = __pmd(phys | type->prot_sect);
+		phys += SECTION_SIZE;
+	} while (pmd++, addr += SECTION_SIZE, addr != end);
 
 
-		do {
-			*pmd = __pmd(phys | type->prot_sect);
-			phys += SECTION_SIZE;
-		} while (pmd++, addr += SECTION_SIZE, addr != end);
+	flush_pmd_entry(pmd);
+}
 
 
-		flush_pmd_entry(p);
-	} else {
+static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
+				      unsigned long end, phys_addr_t phys,
+				      const struct mem_type *type)
+{
+	pmd_t *pmd = pmd_offset(pud, addr);
+	unsigned long next;
+
+	do {
 		/*
 		/*
-		 * No need to loop; pte's aren't interested in the
-		 * individual L1 entries.
+		 * With LPAE, we must loop over to map
+		 * all the pmds for the given range.
 		 */
 		 */
-		alloc_init_pte(pmd, addr, end, __phys_to_pfn(phys), type);
-	}
+		next = pmd_addr_end(addr, end);
+
+		/*
+		 * Try a section mapping - addr, next and phys must all be
+		 * aligned to a section boundary.
+		 */
+		if (type->prot_sect &&
+				((addr | next | phys) & ~SECTION_MASK) == 0) {
+			map_init_section(pmd, addr, next, phys, type);
+		} else {
+			alloc_init_pte(pmd, addr, next,
+						__phys_to_pfn(phys), type);
+		}
+
+		phys += next - addr;
+
+	} while (pmd++, addr = next, addr != end);
 }
 }
 
 
 static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
 static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
@@ -641,7 +663,7 @@ static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
 
 
 	do {
 	do {
 		next = pud_addr_end(addr, end);
 		next = pud_addr_end(addr, end);
-		alloc_init_section(pud, addr, next, phys, type);
+		alloc_init_pmd(pud, addr, next, phys, type);
 		phys += next - addr;
 		phys += next - addr;
 	} while (pud++, addr = next, addr != end);
 	} while (pud++, addr = next, addr != end);
 }
 }
@@ -1256,6 +1278,7 @@ void __init paging_init(struct machine_desc *mdesc)
 	dma_contiguous_remap();
 	dma_contiguous_remap();
 	devicemaps_init(mdesc);
 	devicemaps_init(mdesc);
 	kmap_init();
 	kmap_init();
+	tcm_init();
 
 
 	top_pmd = pmd_off_k(0xffff0000);
 	top_pmd = pmd_off_k(0xffff0000);
 
 

+ 17 - 13
arch/arm/mm/proc-arm740.S

@@ -77,24 +77,27 @@ __arm740_setup:
 	mcr	p15, 0, r0, c6,	c0		@ set area 0, default
 	mcr	p15, 0, r0, c6,	c0		@ set area 0, default
 
 
 	ldr	r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM
 	ldr	r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM
-	ldr	r1, =(CONFIG_DRAM_SIZE >> 12)	@ size of RAM (must be >= 4KB)
-	mov	r2, #10				@ 11 is the minimum (4KB)
-1:	add	r2, r2, #1			@ area size *= 2
-	mov	r1, r1, lsr #1
+	ldr	r3, =(CONFIG_DRAM_SIZE >> 12)	@ size of RAM (must be >= 4KB)
+	mov	r4, #10				@ 11 is the minimum (4KB)
+1:	add	r4, r4, #1			@ area size *= 2
+	movs	r3, r3, lsr #1
 	bne	1b				@ count not zero r-shift
 	bne	1b				@ count not zero r-shift
-	orr	r0, r0, r2, lsl #1		@ the area register value
+	orr	r0, r0, r4, lsl #1		@ the area register value
 	orr	r0, r0, #1			@ set enable bit
 	orr	r0, r0, #1			@ set enable bit
 	mcr	p15, 0, r0, c6,	c1		@ set area 1, RAM
 	mcr	p15, 0, r0, c6,	c1		@ set area 1, RAM
 
 
 	ldr	r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH
 	ldr	r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH
-	ldr	r1, =(CONFIG_FLASH_SIZE >> 12)	@ size of FLASH (must be >= 4KB)
-	mov	r2, #10				@ 11 is the minimum (4KB)
-1:	add	r2, r2, #1			@ area size *= 2
-	mov	r1, r1, lsr #1
+	ldr	r3, =(CONFIG_FLASH_SIZE >> 12)	@ size of FLASH (must be >= 4KB)
+	cmp	r3, #0
+	moveq	r0, #0
+	beq	2f
+	mov	r4, #10				@ 11 is the minimum (4KB)
+1:	add	r4, r4, #1			@ area size *= 2
+	movs	r3, r3, lsr #1
 	bne	1b				@ count not zero r-shift
 	bne	1b				@ count not zero r-shift
-	orr	r0, r0, r2, lsl #1		@ the area register value
+	orr	r0, r0, r4, lsl #1		@ the area register value
 	orr	r0, r0, #1			@ set enable bit
 	orr	r0, r0, #1			@ set enable bit
-	mcr	p15, 0, r0, c6,	c2		@ set area 2, ROM/FLASH
+2:	mcr	p15, 0, r0, c6,	c2		@ set area 2, ROM/FLASH
 
 
 	mov	r0, #0x06
 	mov	r0, #0x06
 	mcr	p15, 0, r0, c2, c0		@ Region 1&2 cacheable
 	mcr	p15, 0, r0, c2, c0		@ Region 1&2 cacheable
@@ -137,13 +140,14 @@ __arm740_proc_info:
 	.long	0x41807400
 	.long	0x41807400
 	.long	0xfffffff0
 	.long	0xfffffff0
 	.long	0
 	.long	0
+	.long	0
 	b	__arm740_setup
 	b	__arm740_setup
 	.long	cpu_arch_name
 	.long	cpu_arch_name
 	.long	cpu_elf_name
 	.long	cpu_elf_name
-	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT
+	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT
 	.long	cpu_arm740_name
 	.long	cpu_arm740_name
 	.long	arm740_processor_functions
 	.long	arm740_processor_functions
 	.long	0
 	.long	0
 	.long	0
 	.long	0
-	.long	v3_cache_fns			@ cache model
+	.long	v4_cache_fns			@ cache model
 	.size	__arm740_proc_info, . - __arm740_proc_info
 	.size	__arm740_proc_info, . - __arm740_proc_info

+ 1 - 1
arch/arm/mm/proc-arm920.S

@@ -387,7 +387,7 @@ ENTRY(cpu_arm920_set_pte_ext)
 /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
 /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
 .globl	cpu_arm920_suspend_size
 .globl	cpu_arm920_suspend_size
 .equ	cpu_arm920_suspend_size, 4 * 3
 .equ	cpu_arm920_suspend_size, 4 * 3
-#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_ARM_CPU_SUSPEND
 ENTRY(cpu_arm920_do_suspend)
 ENTRY(cpu_arm920_do_suspend)
 	stmfd	sp!, {r4 - r6, lr}
 	stmfd	sp!, {r4 - r6, lr}
 	mrc	p15, 0, r4, c13, c0, 0	@ PID
 	mrc	p15, 0, r4, c13, c0, 0	@ PID

+ 1 - 1
arch/arm/mm/proc-arm926.S

@@ -402,7 +402,7 @@ ENTRY(cpu_arm926_set_pte_ext)
 /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
 /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */
 .globl	cpu_arm926_suspend_size
 .globl	cpu_arm926_suspend_size
 .equ	cpu_arm926_suspend_size, 4 * 3
 .equ	cpu_arm926_suspend_size, 4 * 3
-#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_ARM_CPU_SUSPEND
 ENTRY(cpu_arm926_do_suspend)
 ENTRY(cpu_arm926_do_suspend)
 	stmfd	sp!, {r4 - r6, lr}
 	stmfd	sp!, {r4 - r6, lr}
 	mrc	p15, 0, r4, c13, c0, 0	@ PID
 	mrc	p15, 0, r4, c13, c0, 0	@ PID

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно