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

Merge 'mmc/upstream' into late/mvebu2

These patches from the mmc tree were merged into v3.9 already
and the later mvebu patches depend on them.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Arnd Bergmann 12 жил өмнө
parent
commit
168268a225
100 өөрчлөгдсөн 842 нэмэгдсэн , 454 устгасан
  1. 1 0
      Documentation/device-mapper/dm-raid.txt
  2. 26 1
      Documentation/hid/hid-sensor.txt
  3. 4 0
      Documentation/x86/zero-page.txt
  4. 4 4
      MAINTAINERS
  5. 2 2
      Makefile
  6. 3 0
      arch/mips/bcm47xx/Kconfig
  7. 5 4
      arch/mips/cavium-octeon/executive/cvmx-l2c.c
  8. 1 1
      arch/mips/include/asm/dsp.h
  9. 1 0
      arch/mips/include/asm/inst.h
  10. 1 1
      arch/mips/include/asm/mach-pnx833x/war.h
  11. 1 0
      arch/mips/include/asm/pgtable-64.h
  12. 1 0
      arch/mips/include/uapi/asm/Kbuild
  13. 0 0
      arch/mips/include/uapi/asm/break.h
  14. 35 1
      arch/mips/kernel/ftrace.c
  15. 4 3
      arch/mips/kernel/mcount.S
  16. 1 1
      arch/mips/kernel/vpe.c
  17. 1 1
      arch/mips/lantiq/irq.c
  18. 1 1
      arch/mips/lib/delay.c
  19. 0 6
      arch/mips/mm/ioremap.c
  20. 6 0
      arch/mips/mm/mmap.c
  21. 4 1
      arch/mips/netlogic/xlr/setup.c
  22. 1 1
      arch/mips/pci/pci-ar71xx.c
  23. 1 1
      arch/mips/pci/pci-ar724x.c
  24. 2 0
      arch/powerpc/kernel/entry_32.S
  25. 13 0
      arch/powerpc/kernel/entry_64.S
  26. 3 2
      arch/powerpc/kernel/kgdb.c
  27. 7 2
      arch/powerpc/kernel/time.c
  28. 1 1
      arch/powerpc/oprofile/op_model_power4.c
  29. 7 0
      arch/powerpc/platforms/pasemi/cpufreq.c
  30. 12 0
      arch/s390/include/asm/pgtable.h
  31. 1 0
      arch/x86/Kconfig
  32. 2 2
      arch/x86/boot/Makefile
  33. 11 10
      arch/x86/boot/compressed/eboot.c
  34. 5 3
      arch/x86/boot/compressed/head_32.S
  35. 4 4
      arch/x86/boot/compressed/head_64.S
  36. 29 10
      arch/x86/boot/header.S
  37. 1 1
      arch/x86/boot/setup.ld
  38. 63 18
      arch/x86/boot/tools/build.c
  39. 1 0
      arch/x86/include/asm/efi.h
  40. 1 1
      arch/x86/include/asm/uv/uv.h
  41. 46 17
      arch/x86/include/uapi/asm/bootparam.h
  42. 3 4
      arch/x86/kernel/entry_64.S
  43. 7 2
      arch/x86/kernel/head_32.S
  44. 3 0
      arch/x86/kernel/msr.c
  45. 1 1
      arch/x86/kernel/pci-dma.c
  46. 1 1
      arch/x86/kernel/reboot.c
  47. 14 14
      arch/x86/kernel/setup.c
  48. 35 24
      arch/x86/platform/efi/efi.c
  49. 17 5
      arch/x86/platform/efi/efi_64.c
  50. 7 3
      arch/x86/platform/uv/tlb_uv.c
  51. 4 2
      arch/x86/tools/relocs.c
  52. 1 1
      drivers/acpi/osl.c
  53. 10 0
      drivers/bluetooth/ath3k.c
  54. 5 0
      drivers/bluetooth/btusb.c
  55. 3 3
      drivers/edac/edac_mc.c
  56. 1 1
      drivers/edac/edac_pci_sysfs.c
  57. 1 1
      drivers/firmware/dmi_scan.c
  58. 5 4
      drivers/firmware/efivars.c
  59. 1 1
      drivers/firmware/iscsi_ibft_find.c
  60. 2 2
      drivers/gpu/drm/exynos/Kconfig
  61. 15 18
      drivers/gpu/drm/exynos/exynos_drm_connector.c
  62. 11 13
      drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
  63. 2 2
      drivers/gpu/drm/exynos/exynos_drm_drv.h
  64. 1 1
      drivers/gpu/drm/exynos/exynos_drm_g2d.c
  65. 4 5
      drivers/gpu/drm/exynos/exynos_drm_hdmi.c
  66. 2 2
      drivers/gpu/drm/exynos/exynos_drm_hdmi.h
  67. 1 1
      drivers/gpu/drm/exynos/exynos_drm_ipp.c
  68. 2 2
      drivers/gpu/drm/exynos/exynos_drm_rotator.c
  69. 16 10
      drivers/gpu/drm/exynos/exynos_drm_vidi.c
  70. 38 83
      drivers/gpu/drm/exynos/exynos_hdmi.c
  71. 8 1
      drivers/gpu/drm/exynos/exynos_mixer.c
  72. 2 0
      drivers/gpu/drm/i915/i915_debugfs.c
  73. 1 0
      drivers/gpu/drm/i915/i915_reg.h
  74. 18 6
      drivers/gpu/drm/i915/intel_ringbuffer.c
  75. 6 2
      drivers/gpu/drm/radeon/ni.c
  76. 6 2
      drivers/gpu/drm/radeon/r600.c
  77. 2 0
      drivers/gpu/drm/radeon/radeon_cs.c
  78. 2 1
      drivers/gpu/drm/radeon/radeon_cursor.c
  79. 2 1
      drivers/gpu/drm/radeon/radeon_device.c
  80. 1 1
      drivers/gpu/drm/radeon/radeon_display.c
  81. 3 0
      drivers/hid/hid-ids.h
  82. 12 1
      drivers/hid/i2c-hid/i2c-hid.c
  83. 1 0
      drivers/hid/usbhid/hid-quirks.c
  84. 34 0
      drivers/iommu/amd_iommu_init.c
  85. 15 6
      drivers/iommu/intel-iommu.c
  86. 2 0
      drivers/isdn/gigaset/capi.c
  87. 37 64
      drivers/md/dm-raid.c
  88. 1 12
      drivers/md/dm-thin.c
  89. 4 2
      drivers/md/dm.c
  90. 1 0
      drivers/mfd/Kconfig
  91. 1 0
      drivers/mfd/ab8500-core.c
  92. 6 1
      drivers/mfd/arizona-core.c
  93. 2 16
      drivers/mfd/arizona-irq.c
  94. 61 0
      drivers/mfd/da9052-i2c.c
  95. 9 4
      drivers/mfd/db8500-prcmu.c
  96. 9 9
      drivers/mfd/max77686.c
  97. 18 16
      drivers/mfd/max77693.c
  98. 2 3
      drivers/mfd/pcf50633-core.c
  99. 29 0
      drivers/mfd/rtl8411.c
  100. 21 0
      drivers/mfd/rts5209.c

+ 1 - 0
Documentation/device-mapper/dm-raid.txt

@@ -141,3 +141,4 @@ Version History
 1.2.0	Handle creation of arrays that contain failed devices.
 1.2.0	Handle creation of arrays that contain failed devices.
 1.3.0	Added support for RAID 10
 1.3.0	Added support for RAID 10
 1.3.1	Allow device replacement/rebuild for RAID 10
 1.3.1	Allow device replacement/rebuild for RAID 10
+1.3.2   Fix/improve redundancy checking for RAID10

+ 26 - 1
Documentation/hid/hid-sensor.txt

@@ -57,6 +57,10 @@ Protocol 2.10:	(Kernel 2.6.31) Added a protocol for relaxed alignment
 Protocol 2.11:	(Kernel 3.6) Added a field for offset of EFI handover
 Protocol 2.11:	(Kernel 3.6) Added a field for offset of EFI handover
 		protocol entry point.
 		protocol entry point.
 
 
+Protocol 2.12:	(Kernel 3.9) Added the xloadflags field and extension fields
+	 	to struct boot_params for for loading bzImage and ramdisk
+		above 4G in 64bit.
+
 **** MEMORY LAYOUT
 **** MEMORY LAYOUT
 
 
 The traditional memory map for the kernel loader, used for Image or
 The traditional memory map for the kernel loader, used for Image or
@@ -182,7 +186,7 @@ Offset	Proto	Name		Meaning
 0230/4	2.05+	kernel_alignment Physical addr alignment required for kernel
 0230/4	2.05+	kernel_alignment Physical addr alignment required for kernel
 0234/1	2.05+	relocatable_kernel Whether kernel is relocatable or not
 0234/1	2.05+	relocatable_kernel Whether kernel is relocatable or not
 0235/1	2.10+	min_alignment	Minimum alignment, as a power of two
 0235/1	2.10+	min_alignment	Minimum alignment, as a power of two
-0236/2	N/A	pad3		Unused
+0236/2	2.12+	xloadflags	Boot protocol option flags
 0238/4	2.06+	cmdline_size	Maximum size of the kernel command line
 0238/4	2.06+	cmdline_size	Maximum size of the kernel command line
 023C/4	2.07+	hardware_subarch Hardware subarchitecture
 023C/4	2.07+	hardware_subarch Hardware subarchitecture
 0240/8	2.07+	hardware_subarch_data Subarchitecture-specific data
 0240/8	2.07+	hardware_subarch_data Subarchitecture-specific data
@@ -582,6 +586,27 @@ Protocol:	2.10+
   misaligned kernel.  Therefore, a loader should typically try each
   misaligned kernel.  Therefore, a loader should typically try each
   power-of-two alignment from kernel_alignment down to this alignment.
   power-of-two alignment from kernel_alignment down to this alignment.
 
 
+Field name:     xloadflags
+Type:           read
+Offset/size:    0x236/2
+Protocol:       2.12+
+
+  This field is a bitmask.
+
+  Bit 0 (read):	XLF_KERNEL_64
+	- If 1, this kernel has the legacy 64-bit entry point at 0x200.
+
+  Bit 1 (read): XLF_CAN_BE_LOADED_ABOVE_4G
+        - If 1, kernel/boot_params/cmdline/ramdisk can be above 4G.
+
+  Bit 2 (read):	XLF_EFI_HANDOVER_32
+	- If 1, the kernel supports the 32-bit EFI handoff entry point
+          given at handover_offset.
+
+  Bit 3 (read): XLF_EFI_HANDOVER_64
+	- If 1, the kernel supports the 64-bit EFI handoff entry point
+          given at handover_offset + 0x200.
+
 Field name:	cmdline_size
 Field name:	cmdline_size
 Type:		read
 Type:		read
 Offset/size:	0x238/4
 Offset/size:	0x238/4

+ 4 - 0
Documentation/x86/zero-page.txt

@@ -19,6 +19,9 @@ Offset	Proto	Name		Meaning
 090/010	ALL	hd1_info	hd1 disk parameter, OBSOLETE!!
 090/010	ALL	hd1_info	hd1 disk parameter, OBSOLETE!!
 0A0/010	ALL	sys_desc_table	System description table (struct sys_desc_table)
 0A0/010	ALL	sys_desc_table	System description table (struct sys_desc_table)
 0B0/010	ALL	olpc_ofw_header	OLPC's OpenFirmware CIF and friends
 0B0/010	ALL	olpc_ofw_header	OLPC's OpenFirmware CIF and friends
+0C0/004	ALL	ext_ramdisk_image ramdisk_image high 32bits
+0C4/004	ALL	ext_ramdisk_size  ramdisk_size high 32bits
+0C8/004	ALL	ext_cmd_line_ptr  cmd_line_ptr high 32bits
 140/080	ALL	edid_info	Video mode setup (struct edid_info)
 140/080	ALL	edid_info	Video mode setup (struct edid_info)
 1C0/020	ALL	efi_info	EFI 32 information (struct efi_info)
 1C0/020	ALL	efi_info	EFI 32 information (struct efi_info)
 1E0/004	ALL	alk_mem_k	Alternative mem check, in KB
 1E0/004	ALL	alk_mem_k	Alternative mem check, in KB
@@ -27,6 +30,7 @@ Offset	Proto	Name		Meaning
 1E9/001	ALL	eddbuf_entries	Number of entries in eddbuf (below)
 1E9/001	ALL	eddbuf_entries	Number of entries in eddbuf (below)
 1EA/001	ALL	edd_mbr_sig_buf_entries	Number of entries in edd_mbr_sig_buffer
 1EA/001	ALL	edd_mbr_sig_buf_entries	Number of entries in edd_mbr_sig_buffer
 				(below)
 				(below)
+1EF/001	ALL	sentinel	Used to detect broken bootloaders
 290/040	ALL	edd_mbr_sig_buffer EDD MBR signatures
 290/040	ALL	edd_mbr_sig_buffer EDD MBR signatures
 2D0/A00	ALL	e820_map	E820 memory map table
 2D0/A00	ALL	e820_map	E820 memory map table
 				(array of struct e820entry)
 				(array of struct e820entry)

+ 4 - 4
MAINTAINERS

@@ -2966,7 +2966,7 @@ S:	Maintained
 F:	drivers/net/ethernet/i825xx/eexpress.*
 F:	drivers/net/ethernet/i825xx/eexpress.*
 
 
 ETHERNET BRIDGE
 ETHERNET BRIDGE
-M:	Stephen Hemminger <shemminger@vyatta.com>
+M:	Stephen Hemminger <stephen@networkplumber.org>
 L:	bridge@lists.linux-foundation.org
 L:	bridge@lists.linux-foundation.org
 L:	netdev@vger.kernel.org
 L:	netdev@vger.kernel.org
 W:	http://www.linuxfoundation.org/en/Net:Bridge
 W:	http://www.linuxfoundation.org/en/Net:Bridge
@@ -4905,7 +4905,7 @@ S:	Maintained
 
 
 MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2)
 MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2)
 M:	Mirko Lindner <mlindner@marvell.com>
 M:	Mirko Lindner <mlindner@marvell.com>
-M:	Stephen Hemminger <shemminger@vyatta.com>
+M:	Stephen Hemminger <stephen@networkplumber.org>
 L:	netdev@vger.kernel.org
 L:	netdev@vger.kernel.org
 S:	Maintained
 S:	Maintained
 F:	drivers/net/ethernet/marvell/sk*
 F:	drivers/net/ethernet/marvell/sk*
@@ -5180,7 +5180,7 @@ S:	Supported
 F:	drivers/infiniband/hw/nes/
 F:	drivers/infiniband/hw/nes/
 
 
 NETEM NETWORK EMULATOR
 NETEM NETWORK EMULATOR
-M:	Stephen Hemminger <shemminger@vyatta.com>
+M:	Stephen Hemminger <stephen@networkplumber.org>
 L:	netem@lists.linux-foundation.org
 L:	netem@lists.linux-foundation.org
 S:	Maintained
 S:	Maintained
 F:	net/sched/sch_netem.c
 F:	net/sched/sch_netem.c
@@ -7088,7 +7088,7 @@ F:	include/uapi/sound/
 F:	sound/
 F:	sound/
 
 
 SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
 SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
-M:	Liam Girdwood <lrg@ti.com>
+M:	Liam Girdwood <lgirdwood@gmail.com>
 M:	Mark Brown <broonie@opensource.wolfsonmicro.com>
 M:	Mark Brown <broonie@opensource.wolfsonmicro.com>
 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)

+ 2 - 2
Makefile

@@ -1,8 +1,8 @@
 VERSION = 3
 VERSION = 3
 PATCHLEVEL = 8
 PATCHLEVEL = 8
 SUBLEVEL = 0
 SUBLEVEL = 0
-EXTRAVERSION = -rc5
-NAME = Terrified Chipmunk
+EXTRAVERSION = -rc6
+NAME = Unicycling Gorilla
 
 
 # *DOCUMENTATION*
 # *DOCUMENTATION*
 # To see a list of typical targets execute "make help"
 # To see a list of typical targets execute "make help"

+ 3 - 0
arch/mips/bcm47xx/Kconfig

@@ -8,8 +8,10 @@ config BCM47XX_SSB
 	select SSB_DRIVER_EXTIF
 	select SSB_DRIVER_EXTIF
 	select SSB_EMBEDDED
 	select SSB_EMBEDDED
 	select SSB_B43_PCI_BRIDGE if PCI
 	select SSB_B43_PCI_BRIDGE if PCI
+	select SSB_DRIVER_PCICORE if PCI
 	select SSB_PCICORE_HOSTMODE if PCI
 	select SSB_PCICORE_HOSTMODE if PCI
 	select SSB_DRIVER_GPIO
 	select SSB_DRIVER_GPIO
+	select GPIOLIB
 	default y
 	default y
 	help
 	help
 	 Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support.
 	 Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support.
@@ -25,6 +27,7 @@ config BCM47XX_BCMA
 	select BCMA_HOST_PCI if PCI
 	select BCMA_HOST_PCI if PCI
 	select BCMA_DRIVER_PCI_HOSTMODE if PCI
 	select BCMA_DRIVER_PCI_HOSTMODE if PCI
 	select BCMA_DRIVER_GPIO
 	select BCMA_DRIVER_GPIO
+	select GPIOLIB
 	default y
 	default y
 	help
 	help
 	 Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus.
 	 Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus.

+ 5 - 4
arch/mips/cavium-octeon/executive/cvmx-l2c.c

@@ -30,6 +30,7 @@
  * measurement, and debugging facilities.
  * measurement, and debugging facilities.
  */
  */
 
 
+#include <linux/compiler.h>
 #include <linux/irqflags.h>
 #include <linux/irqflags.h>
 #include <asm/octeon/cvmx.h>
 #include <asm/octeon/cvmx.h>
 #include <asm/octeon/cvmx-l2c.h>
 #include <asm/octeon/cvmx-l2c.h>
@@ -285,22 +286,22 @@ uint64_t cvmx_l2c_read_perf(uint32_t counter)
  */
  */
 static void fault_in(uint64_t addr, int len)
 static void fault_in(uint64_t addr, int len)
 {
 {
-	volatile char *ptr;
-	volatile char dummy;
+	char *ptr;
+
 	/*
 	/*
 	 * Adjust addr and length so we get all cache lines even for
 	 * Adjust addr and length so we get all cache lines even for
 	 * small ranges spanning two cache lines.
 	 * small ranges spanning two cache lines.
 	 */
 	 */
 	len += addr & CVMX_CACHE_LINE_MASK;
 	len += addr & CVMX_CACHE_LINE_MASK;
 	addr &= ~CVMX_CACHE_LINE_MASK;
 	addr &= ~CVMX_CACHE_LINE_MASK;
-	ptr = (volatile char *)cvmx_phys_to_ptr(addr);
+	ptr = cvmx_phys_to_ptr(addr);
 	/*
 	/*
 	 * Invalidate L1 cache to make sure all loads result in data
 	 * Invalidate L1 cache to make sure all loads result in data
 	 * being in L2.
 	 * being in L2.
 	 */
 	 */
 	CVMX_DCACHE_INVALIDATE;
 	CVMX_DCACHE_INVALIDATE;
 	while (len > 0) {
 	while (len > 0) {
-		dummy += *ptr;
+		ACCESS_ONCE(*ptr);
 		len -= CVMX_CACHE_LINE_SIZE;
 		len -= CVMX_CACHE_LINE_SIZE;
 		ptr += CVMX_CACHE_LINE_SIZE;
 		ptr += CVMX_CACHE_LINE_SIZE;
 	}
 	}

+ 1 - 1
arch/mips/include/asm/dsp.h

@@ -16,7 +16,7 @@
 #include <asm/mipsregs.h>
 #include <asm/mipsregs.h>
 
 
 #define DSP_DEFAULT	0x00000000
 #define DSP_DEFAULT	0x00000000
-#define DSP_MASK	0x3ff
+#define DSP_MASK	0x3f
 
 
 #define __enable_dsp_hazard()						\
 #define __enable_dsp_hazard()						\
 do {									\
 do {									\

+ 1 - 0
arch/mips/include/asm/inst.h

@@ -353,6 +353,7 @@ union mips_instruction {
 	struct u_format u_format;
 	struct u_format u_format;
 	struct c_format c_format;
 	struct c_format c_format;
 	struct r_format r_format;
 	struct r_format r_format;
+	struct p_format p_format;
 	struct f_format f_format;
 	struct f_format f_format;
 	struct ma_format ma_format;
 	struct ma_format ma_format;
 	struct b_format b_format;
 	struct b_format b_format;

+ 1 - 1
arch/mips/include/asm/mach-pnx833x/war.h

@@ -21,4 +21,4 @@
 #define R10000_LLSC_WAR			0
 #define R10000_LLSC_WAR			0
 #define MIPS34K_MISSED_ITLB_WAR		0
 #define MIPS34K_MISSED_ITLB_WAR		0
 
 
-#endif /* __ASM_MIPS_MACH_PNX8550_WAR_H */
+#endif /* __ASM_MIPS_MACH_PNX833X_WAR_H */

+ 1 - 0
arch/mips/include/asm/pgtable-64.h

@@ -230,6 +230,7 @@ static inline void pud_clear(pud_t *pudp)
 #else
 #else
 #define pte_pfn(x)		((unsigned long)((x).pte >> _PFN_SHIFT))
 #define pte_pfn(x)		((unsigned long)((x).pte >> _PFN_SHIFT))
 #define pfn_pte(pfn, prot)	__pte(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
 #define pfn_pte(pfn, prot)	__pte(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
+#define pfn_pmd(pfn, prot)	__pmd(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
 #endif
 #endif
 
 
 #define __pgd_offset(address)	pgd_index(address)
 #define __pgd_offset(address)	pgd_index(address)

+ 1 - 0
arch/mips/include/uapi/asm/Kbuild

@@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm
 
 
 header-y += auxvec.h
 header-y += auxvec.h
 header-y += bitsperlong.h
 header-y += bitsperlong.h
+header-y += break.h
 header-y += byteorder.h
 header-y += byteorder.h
 header-y += cachectl.h
 header-y += cachectl.h
 header-y += errno.h
 header-y += errno.h

+ 0 - 0
arch/mips/include/asm/break.h → arch/mips/include/uapi/asm/break.h


+ 35 - 1
arch/mips/kernel/ftrace.c

@@ -25,6 +25,12 @@
 #define MCOUNT_OFFSET_INSNS 4
 #define MCOUNT_OFFSET_INSNS 4
 #endif
 #endif
 
 
+/* Arch override because MIPS doesn't need to run this from stop_machine() */
+void arch_ftrace_update_code(int command)
+{
+	ftrace_modify_all_code(command);
+}
+
 /*
 /*
  * Check if the address is in kernel space
  * Check if the address is in kernel space
  *
  *
@@ -89,6 +95,24 @@ static int ftrace_modify_code(unsigned long ip, unsigned int new_code)
 	return 0;
 	return 0;
 }
 }
 
 
+#ifndef CONFIG_64BIT
+static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1,
+				unsigned int new_code2)
+{
+	int faulted;
+
+	safe_store_code(new_code1, ip, faulted);
+	if (unlikely(faulted))
+		return -EFAULT;
+	ip += 4;
+	safe_store_code(new_code2, ip, faulted);
+	if (unlikely(faulted))
+		return -EFAULT;
+	flush_icache_range(ip, ip + 8); /* original ip + 12 */
+	return 0;
+}
+#endif
+
 /*
 /*
  * The details about the calling site of mcount on MIPS
  * The details about the calling site of mcount on MIPS
  *
  *
@@ -131,8 +155,18 @@ int ftrace_make_nop(struct module *mod,
 	 * needed.
 	 * needed.
 	 */
 	 */
 	new = in_kernel_space(ip) ? INSN_NOP : INSN_B_1F;
 	new = in_kernel_space(ip) ? INSN_NOP : INSN_B_1F;
-
+#ifdef CONFIG_64BIT
 	return ftrace_modify_code(ip, new);
 	return ftrace_modify_code(ip, new);
+#else
+	/*
+	 * On 32 bit MIPS platforms, gcc adds a stack adjust
+	 * instruction in the delay slot after the branch to
+	 * mcount and expects mcount to restore the sp on return.
+	 * This is based on a legacy API and does nothing but
+	 * waste instructions so it's being removed at runtime.
+	 */
+	return ftrace_modify_code_2(ip, new, INSN_NOP);
+#endif
 }
 }
 
 
 int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)

+ 4 - 3
arch/mips/kernel/mcount.S

@@ -46,9 +46,8 @@
 	PTR_L	a5, PT_R9(sp)
 	PTR_L	a5, PT_R9(sp)
 	PTR_L	a6, PT_R10(sp)
 	PTR_L	a6, PT_R10(sp)
 	PTR_L	a7, PT_R11(sp)
 	PTR_L	a7, PT_R11(sp)
-	PTR_ADDIU	sp, PT_SIZE
 #else
 #else
-	PTR_ADDIU	sp, (PT_SIZE + 8)
+	PTR_ADDIU	sp, PT_SIZE
 #endif
 #endif
 .endm
 .endm
 
 
@@ -69,7 +68,9 @@ NESTED(ftrace_caller, PT_SIZE, ra)
 	.globl _mcount
 	.globl _mcount
 _mcount:
 _mcount:
 	b	ftrace_stub
 	b	ftrace_stub
-	 nop
+	addiu sp,sp,8
+
+	/* When tracing is activated, it calls ftrace_caller+8 (aka here) */
 	lw	t1, function_trace_stop
 	lw	t1, function_trace_stop
 	bnez	t1, ftrace_stub
 	bnez	t1, ftrace_stub
 	 nop
 	 nop

+ 1 - 1
arch/mips/kernel/vpe.c

@@ -705,7 +705,7 @@ static int vpe_run(struct vpe * v)
 
 
 			printk(KERN_WARNING
 			printk(KERN_WARNING
 			       "VPE loader: TC %d is already in use.\n",
 			       "VPE loader: TC %d is already in use.\n",
-                               t->index);
+			       v->tc->index);
 			return -ENOEXEC;
 			return -ENOEXEC;
 		}
 		}
 	} else {
 	} else {

+ 1 - 1
arch/mips/lantiq/irq.c

@@ -408,7 +408,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)
 #endif
 #endif
 
 
 	/* tell oprofile which irq to use */
 	/* tell oprofile which irq to use */
-	cp0_perfcount_irq = LTQ_PERF_IRQ;
+	cp0_perfcount_irq = irq_create_mapping(ltq_domain, LTQ_PERF_IRQ);
 
 
 	/*
 	/*
 	 * if the timer irq is not one of the mips irqs we need to
 	 * if the timer irq is not one of the mips irqs we need to

+ 1 - 1
arch/mips/lib/delay.c

@@ -21,7 +21,7 @@ void __delay(unsigned long loops)
 	"	.set	noreorder				\n"
 	"	.set	noreorder				\n"
 	"	.align	3					\n"
 	"	.align	3					\n"
 	"1:	bnez	%0, 1b					\n"
 	"1:	bnez	%0, 1b					\n"
-#if __SIZEOF_LONG__ == 4
+#if BITS_PER_LONG == 32
 	"	subu	%0, 1					\n"
 	"	subu	%0, 1					\n"
 #else
 #else
 	"	dsubu	%0, 1					\n"
 	"	dsubu	%0, 1					\n"

+ 0 - 6
arch/mips/mm/ioremap.c

@@ -190,9 +190,3 @@ void __iounmap(const volatile void __iomem *addr)
 
 
 EXPORT_SYMBOL(__ioremap);
 EXPORT_SYMBOL(__ioremap);
 EXPORT_SYMBOL(__iounmap);
 EXPORT_SYMBOL(__iounmap);
-
-int __virt_addr_valid(const volatile void *kaddr)
-{
-	return pfn_valid(PFN_DOWN(virt_to_phys(kaddr)));
-}
-EXPORT_SYMBOL_GPL(__virt_addr_valid);

+ 6 - 0
arch/mips/mm/mmap.c

@@ -192,3 +192,9 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)
 
 
 	return ret;
 	return ret;
 }
 }
+
+int __virt_addr_valid(const volatile void *kaddr)
+{
+	return pfn_valid(PFN_DOWN(virt_to_phys(kaddr)));
+}
+EXPORT_SYMBOL_GPL(__virt_addr_valid);

+ 4 - 1
arch/mips/netlogic/xlr/setup.c

@@ -193,8 +193,11 @@ static void nlm_init_node(void)
 
 
 void __init prom_init(void)
 void __init prom_init(void)
 {
 {
-	int i, *argv, *envp;		/* passed as 32 bit ptrs */
+	int *argv, *envp;		/* passed as 32 bit ptrs */
 	struct psb_info *prom_infop;
 	struct psb_info *prom_infop;
+#ifdef CONFIG_SMP
+	int i;
+#endif
 
 
 	/* truncate to 32 bit and sign extend all args */
 	/* truncate to 32 bit and sign extend all args */
 	argv = (int *)(long)(int)fw_arg1;
 	argv = (int *)(long)(int)fw_arg1;

+ 1 - 1
arch/mips/pci/pci-ar71xx.c

@@ -24,7 +24,7 @@
 #include <asm/mach-ath79/pci.h>
 #include <asm/mach-ath79/pci.h>
 
 
 #define AR71XX_PCI_MEM_BASE	0x10000000
 #define AR71XX_PCI_MEM_BASE	0x10000000
-#define AR71XX_PCI_MEM_SIZE	0x08000000
+#define AR71XX_PCI_MEM_SIZE	0x07000000
 
 
 #define AR71XX_PCI_WIN0_OFFS		0x10000000
 #define AR71XX_PCI_WIN0_OFFS		0x10000000
 #define AR71XX_PCI_WIN1_OFFS		0x11000000
 #define AR71XX_PCI_WIN1_OFFS		0x11000000

+ 1 - 1
arch/mips/pci/pci-ar724x.c

@@ -21,7 +21,7 @@
 #define AR724X_PCI_CTRL_SIZE	0x100
 #define AR724X_PCI_CTRL_SIZE	0x100
 
 
 #define AR724X_PCI_MEM_BASE	0x10000000
 #define AR724X_PCI_MEM_BASE	0x10000000
-#define AR724X_PCI_MEM_SIZE	0x08000000
+#define AR724X_PCI_MEM_SIZE	0x04000000
 
 
 #define AR724X_PCI_REG_RESET		0x18
 #define AR724X_PCI_REG_RESET		0x18
 #define AR724X_PCI_REG_INT_STATUS	0x4c
 #define AR724X_PCI_REG_INT_STATUS	0x4c

+ 2 - 0
arch/powerpc/kernel/entry_32.S

@@ -439,6 +439,8 @@ ret_from_fork:
 ret_from_kernel_thread:
 ret_from_kernel_thread:
 	REST_NVGPRS(r1)
 	REST_NVGPRS(r1)
 	bl	schedule_tail
 	bl	schedule_tail
+	li	r3,0
+	stw	r3,0(r1)
 	mtlr	r14
 	mtlr	r14
 	mr	r3,r15
 	mr	r3,r15
 	PPC440EP_ERR42
 	PPC440EP_ERR42

+ 13 - 0
arch/powerpc/kernel/entry_64.S

@@ -664,6 +664,19 @@ resume_kernel:
 	ld	r4,TI_FLAGS(r9)
 	ld	r4,TI_FLAGS(r9)
 	andi.	r0,r4,_TIF_NEED_RESCHED
 	andi.	r0,r4,_TIF_NEED_RESCHED
 	bne	1b
 	bne	1b
+
+	/*
+	 * arch_local_irq_restore() from preempt_schedule_irq above may
+	 * enable hard interrupt but we really should disable interrupts
+	 * when we return from the interrupt, and so that we don't get
+	 * interrupted after loading SRR0/1.
+	 */
+#ifdef CONFIG_PPC_BOOK3E
+	wrteei	0
+#else
+	ld	r10,PACAKMSR(r13) /* Get kernel MSR without EE */
+	mtmsrd	r10,1		  /* Update machine state */
+#endif /* CONFIG_PPC_BOOK3E */
 #endif /* CONFIG_PREEMPT */
 #endif /* CONFIG_PREEMPT */
 
 
 	.globl	fast_exc_return_irq
 	.globl	fast_exc_return_irq

+ 3 - 2
arch/powerpc/kernel/kgdb.c

@@ -154,12 +154,12 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs)
 static int kgdb_singlestep(struct pt_regs *regs)
 static int kgdb_singlestep(struct pt_regs *regs)
 {
 {
 	struct thread_info *thread_info, *exception_thread_info;
 	struct thread_info *thread_info, *exception_thread_info;
-	struct thread_info *backup_current_thread_info = \
-		(struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL);
+	struct thread_info *backup_current_thread_info;
 
 
 	if (user_mode(regs))
 	if (user_mode(regs))
 		return 0;
 		return 0;
 
 
+	backup_current_thread_info = (struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL);
 	/*
 	/*
 	 * On Book E and perhaps other processors, singlestep is handled on
 	 * On Book E and perhaps other processors, singlestep is handled on
 	 * the critical exception stack.  This causes current_thread_info()
 	 * the critical exception stack.  This causes current_thread_info()
@@ -185,6 +185,7 @@ static int kgdb_singlestep(struct pt_regs *regs)
 		/* Restore current_thread_info lastly. */
 		/* Restore current_thread_info lastly. */
 		memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info);
 		memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info);
 
 
+	kfree(backup_current_thread_info);
 	return 1;
 	return 1;
 }
 }
 
 

+ 7 - 2
arch/powerpc/kernel/time.c

@@ -494,10 +494,15 @@ void timer_interrupt(struct pt_regs * regs)
 	set_dec(DECREMENTER_MAX);
 	set_dec(DECREMENTER_MAX);
 
 
 	/* Some implementations of hotplug will get timer interrupts while
 	/* Some implementations of hotplug will get timer interrupts while
-	 * offline, just ignore these
+	 * offline, just ignore these and we also need to set
+	 * decrementers_next_tb as MAX to make sure __check_irq_replay
+	 * don't replay timer interrupt when return, otherwise we'll trap
+	 * here infinitely :(
 	 */
 	 */
-	if (!cpu_online(smp_processor_id()))
+	if (!cpu_online(smp_processor_id())) {
+		*next_tb = ~(u64)0;
 		return;
 		return;
+	}
 
 
 	/* Conditionally hard-enable interrupts now that the DEC has been
 	/* Conditionally hard-enable interrupts now that the DEC has been
 	 * bumped to its maximum value
 	 * bumped to its maximum value

+ 1 - 1
arch/powerpc/oprofile/op_model_power4.c

@@ -52,7 +52,7 @@ static int power7_marked_instr_event(u64 mmcr1)
 	for (pmc = 0; pmc < 4; pmc++) {
 	for (pmc = 0; pmc < 4; pmc++) {
 		psel = mmcr1 & (OPROFILE_PM_PMCSEL_MSK
 		psel = mmcr1 & (OPROFILE_PM_PMCSEL_MSK
 				<< (OPROFILE_MAX_PMC_NUM - pmc)
 				<< (OPROFILE_MAX_PMC_NUM - pmc)
-				* OPROFILE_MAX_PMC_NUM);
+				* OPROFILE_PMSEL_FIELD_WIDTH);
 		psel = (psel >> ((OPROFILE_MAX_PMC_NUM - pmc)
 		psel = (psel >> ((OPROFILE_MAX_PMC_NUM - pmc)
 				 * OPROFILE_PMSEL_FIELD_WIDTH)) & ~1ULL;
 				 * OPROFILE_PMSEL_FIELD_WIDTH)) & ~1ULL;
 		unit = mmcr1 & (OPROFILE_PM_UNIT_MSK
 		unit = mmcr1 & (OPROFILE_PM_UNIT_MSK

+ 7 - 0
arch/powerpc/platforms/pasemi/cpufreq.c

@@ -236,6 +236,13 @@ out:
 
 
 static int pas_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 static int pas_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 {
 {
+	/*
+	 * We don't support CPU hotplug. Don't unmap after the system
+	 * has already made it to a running state.
+	 */
+	if (system_state != SYSTEM_BOOTING)
+		return 0;
+
 	if (sdcasr_mapbase)
 	if (sdcasr_mapbase)
 		iounmap(sdcasr_mapbase);
 		iounmap(sdcasr_mapbase);
 	if (sdcpwr_mapbase)
 	if (sdcpwr_mapbase)

+ 12 - 0
arch/s390/include/asm/pgtable.h

@@ -1365,6 +1365,18 @@ static inline void pmdp_invalidate(struct vm_area_struct *vma,
 	__pmd_idte(address, pmdp);
 	__pmd_idte(address, pmdp);
 }
 }
 
 
+#define __HAVE_ARCH_PMDP_SET_WRPROTECT
+static inline void pmdp_set_wrprotect(struct mm_struct *mm,
+				      unsigned long address, pmd_t *pmdp)
+{
+	pmd_t pmd = *pmdp;
+
+	if (pmd_write(pmd)) {
+		__pmd_idte(address, pmdp);
+		set_pmd_at(mm, address, pmdp, pmd_wrprotect(pmd));
+	}
+}
+
 static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)
 static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)
 {
 {
 	pmd_t __pmd;
 	pmd_t __pmd;

+ 1 - 0
arch/x86/Kconfig

@@ -2138,6 +2138,7 @@ config OLPC_XO1_RTC
 config OLPC_XO1_SCI
 config OLPC_XO1_SCI
 	bool "OLPC XO-1 SCI extras"
 	bool "OLPC XO-1 SCI extras"
 	depends on OLPC && OLPC_XO1_PM
 	depends on OLPC && OLPC_XO1_PM
+	depends on INPUT=y
 	select POWER_SUPPLY
 	select POWER_SUPPLY
 	select GPIO_CS5535
 	select GPIO_CS5535
 	select MFD_CORE
 	select MFD_CORE

+ 2 - 2
arch/x86/boot/Makefile

@@ -71,7 +71,7 @@ GCOV_PROFILE := n
 $(obj)/bzImage: asflags-y  := $(SVGA_MODE)
 $(obj)/bzImage: asflags-y  := $(SVGA_MODE)
 
 
 quiet_cmd_image = BUILD   $@
 quiet_cmd_image = BUILD   $@
-cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin > $@
+cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/zoffset.h > $@
 
 
 $(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE
 $(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE
 	$(call if_changed,image)
 	$(call if_changed,image)
@@ -92,7 +92,7 @@ targets += voffset.h
 $(obj)/voffset.h: vmlinux FORCE
 $(obj)/voffset.h: vmlinux FORCE
 	$(call if_changed,voffset)
 	$(call if_changed,voffset)
 
 
-sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'
+sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|startup_64\|efi_pe_entry\|efi_stub_entry\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'
 
 
 quiet_cmd_zoffset = ZOFFSET $@
 quiet_cmd_zoffset = ZOFFSET $@
       cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
       cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@

+ 11 - 10
arch/x86/boot/compressed/eboot.c

@@ -256,10 +256,10 @@ static efi_status_t setup_efi_pci(struct boot_params *params)
 	int i;
 	int i;
 	struct setup_data *data;
 	struct setup_data *data;
 
 
-	data = (struct setup_data *)params->hdr.setup_data;
+	data = (struct setup_data *)(unsigned long)params->hdr.setup_data;
 
 
 	while (data && data->next)
 	while (data && data->next)
-		data = (struct setup_data *)data->next;
+		data = (struct setup_data *)(unsigned long)data->next;
 
 
 	status = efi_call_phys5(sys_table->boottime->locate_handle,
 	status = efi_call_phys5(sys_table->boottime->locate_handle,
 				EFI_LOCATE_BY_PROTOCOL, &pci_proto,
 				EFI_LOCATE_BY_PROTOCOL, &pci_proto,
@@ -295,16 +295,18 @@ static efi_status_t setup_efi_pci(struct boot_params *params)
 		if (!pci)
 		if (!pci)
 			continue;
 			continue;
 
 
+#ifdef CONFIG_X86_64
 		status = efi_call_phys4(pci->attributes, pci,
 		status = efi_call_phys4(pci->attributes, pci,
 					EfiPciIoAttributeOperationGet, 0,
 					EfiPciIoAttributeOperationGet, 0,
 					&attributes);
 					&attributes);
-
+#else
+		status = efi_call_phys5(pci->attributes, pci,
+					EfiPciIoAttributeOperationGet, 0, 0,
+					&attributes);
+#endif
 		if (status != EFI_SUCCESS)
 		if (status != EFI_SUCCESS)
 			continue;
 			continue;
 
 
-		if (!(attributes & EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM))
-			continue;
-
 		if (!pci->romimage || !pci->romsize)
 		if (!pci->romimage || !pci->romsize)
 			continue;
 			continue;
 
 
@@ -345,9 +347,9 @@ static efi_status_t setup_efi_pci(struct boot_params *params)
 		memcpy(rom->romdata, pci->romimage, pci->romsize);
 		memcpy(rom->romdata, pci->romimage, pci->romsize);
 
 
 		if (data)
 		if (data)
-			data->next = (uint64_t)rom;
+			data->next = (unsigned long)rom;
 		else
 		else
-			params->hdr.setup_data = (uint64_t)rom;
+			params->hdr.setup_data = (unsigned long)rom;
 
 
 		data = (struct setup_data *)rom;
 		data = (struct setup_data *)rom;
 
 
@@ -432,10 +434,9 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,
 			 * Once we've found a GOP supporting ConOut,
 			 * Once we've found a GOP supporting ConOut,
 			 * don't bother looking any further.
 			 * don't bother looking any further.
 			 */
 			 */
+			first_gop = gop;
 			if (conout_found)
 			if (conout_found)
 				break;
 				break;
-
-			first_gop = gop;
 		}
 		}
 	}
 	}
 
 

+ 5 - 3
arch/x86/boot/compressed/head_32.S

@@ -35,11 +35,11 @@ ENTRY(startup_32)
 #ifdef CONFIG_EFI_STUB
 #ifdef CONFIG_EFI_STUB
 	jmp	preferred_addr
 	jmp	preferred_addr
 
 
-	.balign	0x10
 	/*
 	/*
 	 * We don't need the return address, so set up the stack so
 	 * We don't need the return address, so set up the stack so
-	 * efi_main() can find its arugments.
+	 * efi_main() can find its arguments.
 	 */
 	 */
+ENTRY(efi_pe_entry)
 	add	$0x4, %esp
 	add	$0x4, %esp
 
 
 	call	make_boot_params
 	call	make_boot_params
@@ -50,8 +50,10 @@ ENTRY(startup_32)
 	pushl	%eax
 	pushl	%eax
 	pushl	%esi
 	pushl	%esi
 	pushl	%ecx
 	pushl	%ecx
+	sub	$0x4, %esp
 
 
-	.org 0x30,0x90
+ENTRY(efi_stub_entry)
+	add	$0x4, %esp
 	call	efi_main
 	call	efi_main
 	cmpl	$0, %eax
 	cmpl	$0, %eax
 	movl	%eax, %esi
 	movl	%eax, %esi

+ 4 - 4
arch/x86/boot/compressed/head_64.S

@@ -201,12 +201,12 @@ ENTRY(startup_64)
 	 */
 	 */
 #ifdef CONFIG_EFI_STUB
 #ifdef CONFIG_EFI_STUB
 	/*
 	/*
-	 * The entry point for the PE/COFF executable is 0x210, so only
-	 * legacy boot loaders will execute this jmp.
+	 * The entry point for the PE/COFF executable is efi_pe_entry, so
+	 * only legacy boot loaders will execute this jmp.
 	 */
 	 */
 	jmp	preferred_addr
 	jmp	preferred_addr
 
 
-	.org 0x210
+ENTRY(efi_pe_entry)
 	mov	%rcx, %rdi
 	mov	%rcx, %rdi
 	mov	%rdx, %rsi
 	mov	%rdx, %rsi
 	pushq	%rdi
 	pushq	%rdi
@@ -218,7 +218,7 @@ ENTRY(startup_64)
 	popq	%rsi
 	popq	%rsi
 	popq	%rdi
 	popq	%rdi
 
 
-	.org 0x230,0x90
+ENTRY(efi_stub_entry)
 	call	efi_main
 	call	efi_main
 	movq	%rax,%rsi
 	movq	%rax,%rsi
 	cmpq	$0,%rax
 	cmpq	$0,%rax

+ 29 - 10
arch/x86/boot/header.S

@@ -21,6 +21,7 @@
 #include <asm/e820.h>
 #include <asm/e820.h>
 #include <asm/page_types.h>
 #include <asm/page_types.h>
 #include <asm/setup.h>
 #include <asm/setup.h>
+#include <asm/bootparam.h>
 #include "boot.h"
 #include "boot.h"
 #include "voffset.h"
 #include "voffset.h"
 #include "zoffset.h"
 #include "zoffset.h"
@@ -255,6 +256,9 @@ section_table:
 	# header, from the old boot sector.
 	# header, from the old boot sector.
 
 
 	.section ".header", "a"
 	.section ".header", "a"
+	.globl	sentinel
+sentinel:	.byte 0xff, 0xff        /* Used to detect broken loaders */
+
 	.globl	hdr
 	.globl	hdr
 hdr:
 hdr:
 setup_sects:	.byte 0			/* Filled in by build.c */
 setup_sects:	.byte 0			/* Filled in by build.c */
@@ -279,7 +283,7 @@ _start:
 	# Part 2 of the header, from the old setup.S
 	# Part 2 of the header, from the old setup.S
 
 
 		.ascii	"HdrS"		# header signature
 		.ascii	"HdrS"		# header signature
-		.word	0x020b		# header version number (>= 0x0105)
+		.word	0x020c		# header version number (>= 0x0105)
 					# or else old loadlin-1.5 will fail)
 					# or else old loadlin-1.5 will fail)
 		.globl realmode_swtch
 		.globl realmode_swtch
 realmode_swtch:	.word	0, 0		# default_switch, SETUPSEG
 realmode_swtch:	.word	0, 0		# default_switch, SETUPSEG
@@ -297,13 +301,7 @@ type_of_loader:	.byte	0		# 0 means ancient bootloader, newer
 
 
 # flags, unused bits must be zero (RFU) bit within loadflags
 # flags, unused bits must be zero (RFU) bit within loadflags
 loadflags:
 loadflags:
-LOADED_HIGH	= 1			# If set, the kernel is loaded high
-CAN_USE_HEAP	= 0x80			# If set, the loader also has set
-					# heap_end_ptr to tell how much
-					# space behind setup.S can be used for
-					# heap purposes.
-					# Only the loader knows what is free
-		.byte	LOADED_HIGH
+		.byte	LOADED_HIGH	# The kernel is to be loaded high
 
 
 setup_move_size: .word  0x8000		# size to move, when setup is not
 setup_move_size: .word  0x8000		# size to move, when setup is not
 					# loaded at 0x90000. We will move setup
 					# loaded at 0x90000. We will move setup
@@ -369,7 +367,23 @@ relocatable_kernel:    .byte 1
 relocatable_kernel:    .byte 0
 relocatable_kernel:    .byte 0
 #endif
 #endif
 min_alignment:		.byte MIN_KERNEL_ALIGN_LG2	# minimum alignment
 min_alignment:		.byte MIN_KERNEL_ALIGN_LG2	# minimum alignment
-pad3:			.word 0
+
+xloadflags:
+#ifdef CONFIG_X86_64
+# define XLF0 XLF_KERNEL_64			/* 64-bit kernel */
+#else
+# define XLF0 0
+#endif
+#ifdef CONFIG_EFI_STUB
+# ifdef CONFIG_X86_64
+#  define XLF23 XLF_EFI_HANDOVER_64		/* 64-bit EFI handover ok */
+# else
+#  define XLF23 XLF_EFI_HANDOVER_32		/* 32-bit EFI handover ok */
+# endif
+#else
+# define XLF23 0
+#endif
+			.word XLF0 | XLF23
 
 
 cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,
 cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,
                                                 #added with boot protocol
                                                 #added with boot protocol
@@ -397,8 +411,13 @@ pref_address:		.quad LOAD_PHYSICAL_ADDR	# preferred load addr
 #define INIT_SIZE VO_INIT_SIZE
 #define INIT_SIZE VO_INIT_SIZE
 #endif
 #endif
 init_size:		.long INIT_SIZE		# kernel initialization size
 init_size:		.long INIT_SIZE		# kernel initialization size
-handover_offset:	.long 0x30		# offset to the handover
+handover_offset:
+#ifdef CONFIG_EFI_STUB
+  			.long 0x30		# offset to the handover
 						# protocol entry point
 						# protocol entry point
+#else
+			.long 0
+#endif
 
 
 # End of setup header #####################################################
 # End of setup header #####################################################
 
 

+ 1 - 1
arch/x86/boot/setup.ld

@@ -13,7 +13,7 @@ SECTIONS
 	.bstext		: { *(.bstext) }
 	.bstext		: { *(.bstext) }
 	.bsdata		: { *(.bsdata) }
 	.bsdata		: { *(.bsdata) }
 
 
-	. = 497;
+	. = 495;
 	.header		: { *(.header) }
 	.header		: { *(.header) }
 	.entrytext	: { *(.entrytext) }
 	.entrytext	: { *(.entrytext) }
 	.inittext	: { *(.inittext) }
 	.inittext	: { *(.inittext) }

+ 63 - 18
arch/x86/boot/tools/build.c

@@ -52,6 +52,10 @@ int is_big_kernel;
 
 
 #define PECOFF_RELOC_RESERVE 0x20
 #define PECOFF_RELOC_RESERVE 0x20
 
 
+unsigned long efi_stub_entry;
+unsigned long efi_pe_entry;
+unsigned long startup_64;
+
 /*----------------------------------------------------------------------*/
 /*----------------------------------------------------------------------*/
 
 
 static const u32 crctab32[] = {
 static const u32 crctab32[] = {
@@ -132,7 +136,7 @@ static void die(const char * str, ...)
 
 
 static void usage(void)
 static void usage(void)
 {
 {
-	die("Usage: build setup system [> image]");
+	die("Usage: build setup system [zoffset.h] [> image]");
 }
 }
 
 
 #ifdef CONFIG_EFI_STUB
 #ifdef CONFIG_EFI_STUB
@@ -206,30 +210,54 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)
 	 */
 	 */
 	put_unaligned_le32(file_sz - 512, &buf[pe_header + 0x1c]);
 	put_unaligned_le32(file_sz - 512, &buf[pe_header + 0x1c]);
 
 
-#ifdef CONFIG_X86_32
 	/*
 	/*
-	 * Address of entry point.
-	 *
-	 * The EFI stub entry point is +16 bytes from the start of
-	 * the .text section.
+	 * Address of entry point for PE/COFF executable
 	 */
 	 */
-	put_unaligned_le32(text_start + 16, &buf[pe_header + 0x28]);
-#else
-	/*
-	 * Address of entry point. startup_32 is at the beginning and
-	 * the 64-bit entry point (startup_64) is always 512 bytes
-	 * after. The EFI stub entry point is 16 bytes after that, as
-	 * the first instruction allows legacy loaders to jump over
-	 * the EFI stub initialisation
-	 */
-	put_unaligned_le32(text_start + 528, &buf[pe_header + 0x28]);
-#endif /* CONFIG_X86_32 */
+	put_unaligned_le32(text_start + efi_pe_entry, &buf[pe_header + 0x28]);
 
 
 	update_pecoff_section_header(".text", text_start, text_sz);
 	update_pecoff_section_header(".text", text_start, text_sz);
 }
 }
 
 
 #endif /* CONFIG_EFI_STUB */
 #endif /* CONFIG_EFI_STUB */
 
 
+
+/*
+ * Parse zoffset.h and find the entry points. We could just #include zoffset.h
+ * but that would mean tools/build would have to be rebuilt every time. It's
+ * not as if parsing it is hard...
+ */
+#define PARSE_ZOFS(p, sym) do { \
+	if (!strncmp(p, "#define ZO_" #sym " ", 11+sizeof(#sym)))	\
+		sym = strtoul(p + 11 + sizeof(#sym), NULL, 16);		\
+} while (0)
+
+static void parse_zoffset(char *fname)
+{
+	FILE *file;
+	char *p;
+	int c;
+
+	file = fopen(fname, "r");
+	if (!file)
+		die("Unable to open `%s': %m", fname);
+	c = fread(buf, 1, sizeof(buf) - 1, file);
+	if (ferror(file))
+		die("read-error on `zoffset.h'");
+	buf[c] = 0;
+
+	p = (char *)buf;
+
+	while (p && *p) {
+		PARSE_ZOFS(p, efi_stub_entry);
+		PARSE_ZOFS(p, efi_pe_entry);
+		PARSE_ZOFS(p, startup_64);
+
+		p = strchr(p, '\n');
+		while (p && (*p == '\r' || *p == '\n'))
+			p++;
+	}
+}
+
 int main(int argc, char ** argv)
 int main(int argc, char ** argv)
 {
 {
 	unsigned int i, sz, setup_sectors;
 	unsigned int i, sz, setup_sectors;
@@ -241,7 +269,19 @@ int main(int argc, char ** argv)
 	void *kernel;
 	void *kernel;
 	u32 crc = 0xffffffffUL;
 	u32 crc = 0xffffffffUL;
 
 
-	if (argc != 3)
+	/* Defaults for old kernel */
+#ifdef CONFIG_X86_32
+	efi_pe_entry = 0x10;
+	efi_stub_entry = 0x30;
+#else
+	efi_pe_entry = 0x210;
+	efi_stub_entry = 0x230;
+	startup_64 = 0x200;
+#endif
+
+	if (argc == 4)
+		parse_zoffset(argv[3]);
+	else if (argc != 3)
 		usage();
 		usage();
 
 
 	/* Copy the setup code */
 	/* Copy the setup code */
@@ -299,6 +339,11 @@ int main(int argc, char ** argv)
 
 
 #ifdef CONFIG_EFI_STUB
 #ifdef CONFIG_EFI_STUB
 	update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz));
 	update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz));
+
+#ifdef CONFIG_X86_64 /* Yes, this is really how we defined it :( */
+	efi_stub_entry -= 0x200;
+#endif
+	put_unaligned_le32(efi_stub_entry, &buf[0x264]);
 #endif
 #endif
 
 
 	crc = partial_crc32(buf, i, crc);
 	crc = partial_crc32(buf, i, crc);

+ 1 - 0
arch/x86/include/asm/efi.h

@@ -94,6 +94,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size,
 #endif /* CONFIG_X86_32 */
 #endif /* CONFIG_X86_32 */
 
 
 extern int add_efi_memmap;
 extern int add_efi_memmap;
+extern unsigned long x86_efi_facility;
 extern void efi_set_executable(efi_memory_desc_t *md, bool executable);
 extern void efi_set_executable(efi_memory_desc_t *md, bool executable);
 extern int efi_memblock_x86_reserve_range(void);
 extern int efi_memblock_x86_reserve_range(void);
 extern void efi_call_phys_prelog(void);
 extern void efi_call_phys_prelog(void);

+ 1 - 1
arch/x86/include/asm/uv/uv.h

@@ -16,7 +16,7 @@ extern void uv_system_init(void);
 extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
 extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
 						 struct mm_struct *mm,
 						 struct mm_struct *mm,
 						 unsigned long start,
 						 unsigned long start,
-						 unsigned end,
+						 unsigned long end,
 						 unsigned int cpu);
 						 unsigned int cpu);
 
 
 #else	/* X86_UV */
 #else	/* X86_UV */

+ 46 - 17
arch/x86/include/uapi/asm/bootparam.h

@@ -1,6 +1,31 @@
 #ifndef _ASM_X86_BOOTPARAM_H
 #ifndef _ASM_X86_BOOTPARAM_H
 #define _ASM_X86_BOOTPARAM_H
 #define _ASM_X86_BOOTPARAM_H
 
 
+/* setup_data types */
+#define SETUP_NONE			0
+#define SETUP_E820_EXT			1
+#define SETUP_DTB			2
+#define SETUP_PCI			3
+
+/* ram_size flags */
+#define RAMDISK_IMAGE_START_MASK	0x07FF
+#define RAMDISK_PROMPT_FLAG		0x8000
+#define RAMDISK_LOAD_FLAG		0x4000
+
+/* loadflags */
+#define LOADED_HIGH	(1<<0)
+#define QUIET_FLAG	(1<<5)
+#define KEEP_SEGMENTS	(1<<6)
+#define CAN_USE_HEAP	(1<<7)
+
+/* xloadflags */
+#define XLF_KERNEL_64			(1<<0)
+#define XLF_CAN_BE_LOADED_ABOVE_4G	(1<<1)
+#define XLF_EFI_HANDOVER_32		(1<<2)
+#define XLF_EFI_HANDOVER_64		(1<<3)
+
+#ifndef __ASSEMBLY__
+
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/screen_info.h>
 #include <linux/screen_info.h>
 #include <linux/apm_bios.h>
 #include <linux/apm_bios.h>
@@ -9,12 +34,6 @@
 #include <asm/ist.h>
 #include <asm/ist.h>
 #include <video/edid.h>
 #include <video/edid.h>
 
 
-/* setup data types */
-#define SETUP_NONE			0
-#define SETUP_E820_EXT			1
-#define SETUP_DTB			2
-#define SETUP_PCI			3
-
 /* extensible setup data list node */
 /* extensible setup data list node */
 struct setup_data {
 struct setup_data {
 	__u64 next;
 	__u64 next;
@@ -28,9 +47,6 @@ struct setup_header {
 	__u16	root_flags;
 	__u16	root_flags;
 	__u32	syssize;
 	__u32	syssize;
 	__u16	ram_size;
 	__u16	ram_size;
-#define RAMDISK_IMAGE_START_MASK	0x07FF
-#define RAMDISK_PROMPT_FLAG		0x8000
-#define RAMDISK_LOAD_FLAG		0x4000
 	__u16	vid_mode;
 	__u16	vid_mode;
 	__u16	root_dev;
 	__u16	root_dev;
 	__u16	boot_flag;
 	__u16	boot_flag;
@@ -42,10 +58,6 @@ struct setup_header {
 	__u16	kernel_version;
 	__u16	kernel_version;
 	__u8	type_of_loader;
 	__u8	type_of_loader;
 	__u8	loadflags;
 	__u8	loadflags;
-#define LOADED_HIGH	(1<<0)
-#define QUIET_FLAG	(1<<5)
-#define KEEP_SEGMENTS	(1<<6)
-#define CAN_USE_HEAP	(1<<7)
 	__u16	setup_move_size;
 	__u16	setup_move_size;
 	__u32	code32_start;
 	__u32	code32_start;
 	__u32	ramdisk_image;
 	__u32	ramdisk_image;
@@ -58,7 +70,8 @@ struct setup_header {
 	__u32	initrd_addr_max;
 	__u32	initrd_addr_max;
 	__u32	kernel_alignment;
 	__u32	kernel_alignment;
 	__u8	relocatable_kernel;
 	__u8	relocatable_kernel;
-	__u8	_pad2[3];
+	__u8	min_alignment;
+	__u16	xloadflags;
 	__u32	cmdline_size;
 	__u32	cmdline_size;
 	__u32	hardware_subarch;
 	__u32	hardware_subarch;
 	__u64	hardware_subarch_data;
 	__u64	hardware_subarch_data;
@@ -106,7 +119,10 @@ struct boot_params {
 	__u8  hd1_info[16];	/* obsolete! */		/* 0x090 */
 	__u8  hd1_info[16];	/* obsolete! */		/* 0x090 */
 	struct sys_desc_table sys_desc_table;		/* 0x0a0 */
 	struct sys_desc_table sys_desc_table;		/* 0x0a0 */
 	struct olpc_ofw_header olpc_ofw_header;		/* 0x0b0 */
 	struct olpc_ofw_header olpc_ofw_header;		/* 0x0b0 */
-	__u8  _pad4[128];				/* 0x0c0 */
+	__u32 ext_ramdisk_image;			/* 0x0c0 */
+	__u32 ext_ramdisk_size;				/* 0x0c4 */
+	__u32 ext_cmd_line_ptr;				/* 0x0c8 */
+	__u8  _pad4[116];				/* 0x0cc */
 	struct edid_info edid_info;			/* 0x140 */
 	struct edid_info edid_info;			/* 0x140 */
 	struct efi_info efi_info;			/* 0x1c0 */
 	struct efi_info efi_info;			/* 0x1c0 */
 	__u32 alt_mem_k;				/* 0x1e0 */
 	__u32 alt_mem_k;				/* 0x1e0 */
@@ -115,7 +131,20 @@ struct boot_params {
 	__u8  eddbuf_entries;				/* 0x1e9 */
 	__u8  eddbuf_entries;				/* 0x1e9 */
 	__u8  edd_mbr_sig_buf_entries;			/* 0x1ea */
 	__u8  edd_mbr_sig_buf_entries;			/* 0x1ea */
 	__u8  kbd_status;				/* 0x1eb */
 	__u8  kbd_status;				/* 0x1eb */
-	__u8  _pad6[5];					/* 0x1ec */
+	__u8  _pad5[3];					/* 0x1ec */
+	/*
+	 * The sentinel is set to a nonzero value (0xff) in header.S.
+	 *
+	 * A bootloader is supposed to only take setup_header and put
+	 * it into a clean boot_params buffer. If it turns out that
+	 * it is clumsy or too generous with the buffer, it most
+	 * probably will pick up the sentinel variable too. The fact
+	 * that this variable then is still 0xff will let kernel
+	 * know that some variables in boot_params are invalid and
+	 * kernel should zero out certain portions of boot_params.
+	 */
+	__u8  sentinel;					/* 0x1ef */
+	__u8  _pad6[1];					/* 0x1f0 */
 	struct setup_header hdr;    /* setup header */	/* 0x1f1 */
 	struct setup_header hdr;    /* setup header */	/* 0x1f1 */
 	__u8  _pad7[0x290-0x1f1-sizeof(struct setup_header)];
 	__u8  _pad7[0x290-0x1f1-sizeof(struct setup_header)];
 	__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];	/* 0x290 */
 	__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];	/* 0x290 */
@@ -134,6 +163,6 @@ enum {
 	X86_NR_SUBARCHS,
 	X86_NR_SUBARCHS,
 };
 };
 
 
-
+#endif /* __ASSEMBLY__ */
 
 
 #endif /* _ASM_X86_BOOTPARAM_H */
 #endif /* _ASM_X86_BOOTPARAM_H */

+ 3 - 4
arch/x86/kernel/entry_64.S

@@ -1781,6 +1781,7 @@ first_nmi:
 	 * Leave room for the "copied" frame
 	 * Leave room for the "copied" frame
 	 */
 	 */
 	subq $(5*8), %rsp
 	subq $(5*8), %rsp
+	CFI_ADJUST_CFA_OFFSET 5*8
 
 
 	/* Copy the stack frame to the Saved frame */
 	/* Copy the stack frame to the Saved frame */
 	.rept 5
 	.rept 5
@@ -1863,10 +1864,8 @@ end_repeat_nmi:
 nmi_swapgs:
 nmi_swapgs:
 	SWAPGS_UNSAFE_STACK
 	SWAPGS_UNSAFE_STACK
 nmi_restore:
 nmi_restore:
-	RESTORE_ALL 8
-
-	/* Pop the extra iret frame */
-	addq $(5*8), %rsp
+	/* Pop the extra iret frame at once */
+	RESTORE_ALL 6*8
 
 
 	/* Clear the NMI executing stack variable */
 	/* Clear the NMI executing stack variable */
 	movq $0, 5*8(%rsp)
 	movq $0, 5*8(%rsp)

+ 7 - 2
arch/x86/kernel/head_32.S

@@ -300,6 +300,12 @@ ENTRY(startup_32_smp)
 	leal -__PAGE_OFFSET(%ecx),%esp
 	leal -__PAGE_OFFSET(%ecx),%esp
 
 
 default_entry:
 default_entry:
+#define CR0_STATE	(X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | \
+			 X86_CR0_NE | X86_CR0_WP | X86_CR0_AM | \
+			 X86_CR0_PG)
+	movl $(CR0_STATE & ~X86_CR0_PG),%eax
+	movl %eax,%cr0
+
 /*
 /*
  *	New page tables may be in 4Mbyte page mode and may
  *	New page tables may be in 4Mbyte page mode and may
  *	be using the global pages. 
  *	be using the global pages. 
@@ -364,8 +370,7 @@ default_entry:
  */
  */
 	movl $pa(initial_page_table), %eax
 	movl $pa(initial_page_table), %eax
 	movl %eax,%cr3		/* set the page table pointer.. */
 	movl %eax,%cr3		/* set the page table pointer.. */
-	movl %cr0,%eax
-	orl  $X86_CR0_PG,%eax
+	movl $CR0_STATE,%eax
 	movl %eax,%cr0		/* ..and set paging (PG) bit */
 	movl %eax,%cr0		/* ..and set paging (PG) bit */
 	ljmp $__BOOT_CS,$1f	/* Clear prefetch and normalize %eip */
 	ljmp $__BOOT_CS,$1f	/* Clear prefetch and normalize %eip */
 1:
 1:

+ 3 - 0
arch/x86/kernel/msr.c

@@ -174,6 +174,9 @@ static int msr_open(struct inode *inode, struct file *file)
 	unsigned int cpu;
 	unsigned int cpu;
 	struct cpuinfo_x86 *c;
 	struct cpuinfo_x86 *c;
 
 
+	if (!capable(CAP_SYS_RAWIO))
+		return -EPERM;
+
 	cpu = iminor(file->f_path.dentry->d_inode);
 	cpu = iminor(file->f_path.dentry->d_inode);
 	if (cpu >= nr_cpu_ids || !cpu_online(cpu))
 	if (cpu >= nr_cpu_ids || !cpu_online(cpu))
 		return -ENXIO;	/* No such CPU */
 		return -ENXIO;	/* No such CPU */

+ 1 - 1
arch/x86/kernel/pci-dma.c

@@ -56,7 +56,7 @@ struct device x86_dma_fallback_dev = {
 EXPORT_SYMBOL(x86_dma_fallback_dev);
 EXPORT_SYMBOL(x86_dma_fallback_dev);
 
 
 /* Number of entries preallocated for DMA-API debugging */
 /* Number of entries preallocated for DMA-API debugging */
-#define PREALLOC_DMA_DEBUG_ENTRIES       32768
+#define PREALLOC_DMA_DEBUG_ENTRIES       65536
 
 
 int dma_set_mask(struct device *dev, u64 mask)
 int dma_set_mask(struct device *dev, u64 mask)
 {
 {

+ 1 - 1
arch/x86/kernel/reboot.c

@@ -584,7 +584,7 @@ static void native_machine_emergency_restart(void)
 			break;
 			break;
 
 
 		case BOOT_EFI:
 		case BOOT_EFI:
-			if (efi_enabled)
+			if (efi_enabled(EFI_RUNTIME_SERVICES))
 				efi.reset_system(reboot_mode ?
 				efi.reset_system(reboot_mode ?
 						 EFI_RESET_WARM :
 						 EFI_RESET_WARM :
 						 EFI_RESET_COLD,
 						 EFI_RESET_COLD,

+ 14 - 14
arch/x86/kernel/setup.c

@@ -807,15 +807,15 @@ void __init setup_arch(char **cmdline_p)
 #ifdef CONFIG_EFI
 #ifdef CONFIG_EFI
 	if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
 	if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
 		     "EL32", 4)) {
 		     "EL32", 4)) {
-		efi_enabled = 1;
-		efi_64bit = false;
+		set_bit(EFI_BOOT, &x86_efi_facility);
 	} else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
 	} else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
 		     "EL64", 4)) {
 		     "EL64", 4)) {
-		efi_enabled = 1;
-		efi_64bit = true;
+		set_bit(EFI_BOOT, &x86_efi_facility);
+		set_bit(EFI_64BIT, &x86_efi_facility);
 	}
 	}
-	if (efi_enabled && efi_memblock_x86_reserve_range())
-		efi_enabled = 0;
+
+	if (efi_enabled(EFI_BOOT))
+		efi_memblock_x86_reserve_range();
 #endif
 #endif
 
 
 	x86_init.oem.arch_setup();
 	x86_init.oem.arch_setup();
@@ -888,7 +888,7 @@ void __init setup_arch(char **cmdline_p)
 
 
 	finish_e820_parsing();
 	finish_e820_parsing();
 
 
-	if (efi_enabled)
+	if (efi_enabled(EFI_BOOT))
 		efi_init();
 		efi_init();
 
 
 	dmi_scan_machine();
 	dmi_scan_machine();
@@ -971,7 +971,7 @@ void __init setup_arch(char **cmdline_p)
 	 * The EFI specification says that boot service code won't be called
 	 * The EFI specification says that boot service code won't be called
 	 * after ExitBootServices(). This is, in fact, a lie.
 	 * after ExitBootServices(). This is, in fact, a lie.
 	 */
 	 */
-	if (efi_enabled)
+	if (efi_enabled(EFI_MEMMAP))
 		efi_reserve_boot_services();
 		efi_reserve_boot_services();
 
 
 	/* preallocate 4k for mptable mpc */
 	/* preallocate 4k for mptable mpc */
@@ -1114,7 +1114,7 @@ void __init setup_arch(char **cmdline_p)
 
 
 #ifdef CONFIG_VT
 #ifdef CONFIG_VT
 #if defined(CONFIG_VGA_CONSOLE)
 #if defined(CONFIG_VGA_CONSOLE)
-	if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
+	if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
 		conswitchp = &vga_con;
 		conswitchp = &vga_con;
 #elif defined(CONFIG_DUMMY_CONSOLE)
 #elif defined(CONFIG_DUMMY_CONSOLE)
 	conswitchp = &dummy_con;
 	conswitchp = &dummy_con;
@@ -1131,14 +1131,14 @@ void __init setup_arch(char **cmdline_p)
 	register_refined_jiffies(CLOCK_TICK_RATE);
 	register_refined_jiffies(CLOCK_TICK_RATE);
 
 
 #ifdef CONFIG_EFI
 #ifdef CONFIG_EFI
-	/* Once setup is done above, disable efi_enabled on mismatched
-	 * firmware/kernel archtectures since there is no support for
-	 * runtime services.
+	/* Once setup is done above, unmap the EFI memory map on
+	 * mismatched firmware/kernel archtectures since there is no
+	 * support for runtime services.
 	 */
 	 */
-	if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) {
+	if (efi_enabled(EFI_BOOT) &&
+	    IS_ENABLED(CONFIG_X86_64) != efi_enabled(EFI_64BIT)) {
 		pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
 		pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
 		efi_unmap_memmap();
 		efi_unmap_memmap();
-		efi_enabled = 0;
 	}
 	}
 #endif
 #endif
 }
 }

+ 35 - 24
arch/x86/platform/efi/efi.c

@@ -51,9 +51,6 @@
 
 
 #define EFI_DEBUG	1
 #define EFI_DEBUG	1
 
 
-int efi_enabled;
-EXPORT_SYMBOL(efi_enabled);
-
 struct efi __read_mostly efi = {
 struct efi __read_mostly efi = {
 	.mps        = EFI_INVALID_TABLE_ADDR,
 	.mps        = EFI_INVALID_TABLE_ADDR,
 	.acpi       = EFI_INVALID_TABLE_ADDR,
 	.acpi       = EFI_INVALID_TABLE_ADDR,
@@ -69,19 +66,28 @@ EXPORT_SYMBOL(efi);
 
 
 struct efi_memory_map memmap;
 struct efi_memory_map memmap;
 
 
-bool efi_64bit;
-
 static struct efi efi_phys __initdata;
 static struct efi efi_phys __initdata;
 static efi_system_table_t efi_systab __initdata;
 static efi_system_table_t efi_systab __initdata;
 
 
 static inline bool efi_is_native(void)
 static inline bool efi_is_native(void)
 {
 {
-	return IS_ENABLED(CONFIG_X86_64) == efi_64bit;
+	return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT);
+}
+
+unsigned long x86_efi_facility;
+
+/*
+ * Returns 1 if 'facility' is enabled, 0 otherwise.
+ */
+int efi_enabled(int facility)
+{
+	return test_bit(facility, &x86_efi_facility) != 0;
 }
 }
+EXPORT_SYMBOL(efi_enabled);
 
 
 static int __init setup_noefi(char *arg)
 static int __init setup_noefi(char *arg)
 {
 {
-	efi_enabled = 0;
+	clear_bit(EFI_BOOT, &x86_efi_facility);
 	return 0;
 	return 0;
 }
 }
 early_param("noefi", setup_noefi);
 early_param("noefi", setup_noefi);
@@ -426,6 +432,7 @@ void __init efi_reserve_boot_services(void)
 
 
 void __init efi_unmap_memmap(void)
 void __init efi_unmap_memmap(void)
 {
 {
+	clear_bit(EFI_MEMMAP, &x86_efi_facility);
 	if (memmap.map) {
 	if (memmap.map) {
 		early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
 		early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
 		memmap.map = NULL;
 		memmap.map = NULL;
@@ -460,7 +467,7 @@ void __init efi_free_boot_services(void)
 
 
 static int __init efi_systab_init(void *phys)
 static int __init efi_systab_init(void *phys)
 {
 {
-	if (efi_64bit) {
+	if (efi_enabled(EFI_64BIT)) {
 		efi_system_table_64_t *systab64;
 		efi_system_table_64_t *systab64;
 		u64 tmp = 0;
 		u64 tmp = 0;
 
 
@@ -552,7 +559,7 @@ static int __init efi_config_init(u64 tables, int nr_tables)
 	void *config_tables, *tablep;
 	void *config_tables, *tablep;
 	int i, sz;
 	int i, sz;
 
 
-	if (efi_64bit)
+	if (efi_enabled(EFI_64BIT))
 		sz = sizeof(efi_config_table_64_t);
 		sz = sizeof(efi_config_table_64_t);
 	else
 	else
 		sz = sizeof(efi_config_table_32_t);
 		sz = sizeof(efi_config_table_32_t);
@@ -572,7 +579,7 @@ static int __init efi_config_init(u64 tables, int nr_tables)
 		efi_guid_t guid;
 		efi_guid_t guid;
 		unsigned long table;
 		unsigned long table;
 
 
-		if (efi_64bit) {
+		if (efi_enabled(EFI_64BIT)) {
 			u64 table64;
 			u64 table64;
 			guid = ((efi_config_table_64_t *)tablep)->guid;
 			guid = ((efi_config_table_64_t *)tablep)->guid;
 			table64 = ((efi_config_table_64_t *)tablep)->table;
 			table64 = ((efi_config_table_64_t *)tablep)->table;
@@ -684,7 +691,6 @@ void __init efi_init(void)
 	if (boot_params.efi_info.efi_systab_hi ||
 	if (boot_params.efi_info.efi_systab_hi ||
 	    boot_params.efi_info.efi_memmap_hi) {
 	    boot_params.efi_info.efi_memmap_hi) {
 		pr_info("Table located above 4GB, disabling EFI.\n");
 		pr_info("Table located above 4GB, disabling EFI.\n");
-		efi_enabled = 0;
 		return;
 		return;
 	}
 	}
 	efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab;
 	efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab;
@@ -694,10 +700,10 @@ void __init efi_init(void)
 			  ((__u64)boot_params.efi_info.efi_systab_hi<<32));
 			  ((__u64)boot_params.efi_info.efi_systab_hi<<32));
 #endif
 #endif
 
 
-	if (efi_systab_init(efi_phys.systab)) {
-		efi_enabled = 0;
+	if (efi_systab_init(efi_phys.systab))
 		return;
 		return;
-	}
+
+	set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility);
 
 
 	/*
 	/*
 	 * Show what we know for posterity
 	 * Show what we know for posterity
@@ -715,10 +721,10 @@ void __init efi_init(void)
 		efi.systab->hdr.revision >> 16,
 		efi.systab->hdr.revision >> 16,
 		efi.systab->hdr.revision & 0xffff, vendor);
 		efi.systab->hdr.revision & 0xffff, vendor);
 
 
-	if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) {
-		efi_enabled = 0;
+	if (efi_config_init(efi.systab->tables, efi.systab->nr_tables))
 		return;
 		return;
-	}
+
+	set_bit(EFI_CONFIG_TABLES, &x86_efi_facility);
 
 
 	/*
 	/*
 	 * Note: We currently don't support runtime services on an EFI
 	 * Note: We currently don't support runtime services on an EFI
@@ -727,15 +733,17 @@ void __init efi_init(void)
 
 
 	if (!efi_is_native())
 	if (!efi_is_native())
 		pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
 		pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
-	else if (efi_runtime_init()) {
-		efi_enabled = 0;
-		return;
+	else {
+		if (efi_runtime_init())
+			return;
+		set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
 	}
 	}
 
 
-	if (efi_memmap_init()) {
-		efi_enabled = 0;
+	if (efi_memmap_init())
 		return;
 		return;
-	}
+
+	set_bit(EFI_MEMMAP, &x86_efi_facility);
+
 #ifdef CONFIG_X86_32
 #ifdef CONFIG_X86_32
 	if (efi_is_native()) {
 	if (efi_is_native()) {
 		x86_platform.get_wallclock = efi_get_time;
 		x86_platform.get_wallclock = efi_get_time;
@@ -941,7 +949,7 @@ void __init efi_enter_virtual_mode(void)
 	 *
 	 *
 	 * Call EFI services through wrapper functions.
 	 * Call EFI services through wrapper functions.
 	 */
 	 */
-	efi.runtime_version = efi_systab.fw_revision;
+	efi.runtime_version = efi_systab.hdr.revision;
 	efi.get_time = virt_efi_get_time;
 	efi.get_time = virt_efi_get_time;
 	efi.set_time = virt_efi_set_time;
 	efi.set_time = virt_efi_set_time;
 	efi.get_wakeup_time = virt_efi_get_wakeup_time;
 	efi.get_wakeup_time = virt_efi_get_wakeup_time;
@@ -969,6 +977,9 @@ u32 efi_mem_type(unsigned long phys_addr)
 	efi_memory_desc_t *md;
 	efi_memory_desc_t *md;
 	void *p;
 	void *p;
 
 
+	if (!efi_enabled(EFI_MEMMAP))
+		return 0;
+
 	for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
 	for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
 		md = p;
 		md = p;
 		if ((md->phys_addr <= phys_addr) &&
 		if ((md->phys_addr <= phys_addr) &&

+ 17 - 5
arch/x86/platform/efi/efi_64.c

@@ -38,7 +38,7 @@
 #include <asm/cacheflush.h>
 #include <asm/cacheflush.h>
 #include <asm/fixmap.h>
 #include <asm/fixmap.h>
 
 
-static pgd_t save_pgd __initdata;
+static pgd_t *save_pgd __initdata;
 static unsigned long efi_flags __initdata;
 static unsigned long efi_flags __initdata;
 
 
 static void __init early_code_mapping_set_exec(int executable)
 static void __init early_code_mapping_set_exec(int executable)
@@ -61,12 +61,20 @@ static void __init early_code_mapping_set_exec(int executable)
 void __init efi_call_phys_prelog(void)
 void __init efi_call_phys_prelog(void)
 {
 {
 	unsigned long vaddress;
 	unsigned long vaddress;
+	int pgd;
+	int n_pgds;
 
 
 	early_code_mapping_set_exec(1);
 	early_code_mapping_set_exec(1);
 	local_irq_save(efi_flags);
 	local_irq_save(efi_flags);
-	vaddress = (unsigned long)__va(0x0UL);
-	save_pgd = *pgd_offset_k(0x0UL);
-	set_pgd(pgd_offset_k(0x0UL), *pgd_offset_k(vaddress));
+
+	n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE);
+	save_pgd = kmalloc(n_pgds * sizeof(pgd_t), GFP_KERNEL);
+
+	for (pgd = 0; pgd < n_pgds; pgd++) {
+		save_pgd[pgd] = *pgd_offset_k(pgd * PGDIR_SIZE);
+		vaddress = (unsigned long)__va(pgd * PGDIR_SIZE);
+		set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), *pgd_offset_k(vaddress));
+	}
 	__flush_tlb_all();
 	__flush_tlb_all();
 }
 }
 
 
@@ -75,7 +83,11 @@ void __init efi_call_phys_epilog(void)
 	/*
 	/*
 	 * After the lock is released, the original page table is restored.
 	 * After the lock is released, the original page table is restored.
 	 */
 	 */
-	set_pgd(pgd_offset_k(0x0UL), save_pgd);
+	int pgd;
+	int n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE);
+	for (pgd = 0; pgd < n_pgds; pgd++)
+		set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]);
+	kfree(save_pgd);
 	__flush_tlb_all();
 	__flush_tlb_all();
 	local_irq_restore(efi_flags);
 	local_irq_restore(efi_flags);
 	early_code_mapping_set_exec(0);
 	early_code_mapping_set_exec(0);

+ 7 - 3
arch/x86/platform/uv/tlb_uv.c

@@ -1034,7 +1034,8 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,
  * globally purge translation cache of a virtual address or all TLB's
  * globally purge translation cache of a virtual address or all TLB's
  * @cpumask: mask of all cpu's in which the address is to be removed
  * @cpumask: mask of all cpu's in which the address is to be removed
  * @mm: mm_struct containing virtual address range
  * @mm: mm_struct containing virtual address range
- * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu)
+ * @start: start virtual address to be removed from TLB
+ * @end: end virtual address to be remove from TLB
  * @cpu: the current cpu
  * @cpu: the current cpu
  *
  *
  * This is the entry point for initiating any UV global TLB shootdown.
  * This is the entry point for initiating any UV global TLB shootdown.
@@ -1056,7 +1057,7 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,
  */
  */
 const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
 const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
 				struct mm_struct *mm, unsigned long start,
 				struct mm_struct *mm, unsigned long start,
-				unsigned end, unsigned int cpu)
+				unsigned long end, unsigned int cpu)
 {
 {
 	int locals = 0;
 	int locals = 0;
 	int remotes = 0;
 	int remotes = 0;
@@ -1113,7 +1114,10 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
 
 
 	record_send_statistics(stat, locals, hubs, remotes, bau_desc);
 	record_send_statistics(stat, locals, hubs, remotes, bau_desc);
 
 
-	bau_desc->payload.address = start;
+	if (!end || (end - start) <= PAGE_SIZE)
+		bau_desc->payload.address = start;
+	else
+		bau_desc->payload.address = TLB_FLUSH_ALL;
 	bau_desc->payload.sending_cpu = cpu;
 	bau_desc->payload.sending_cpu = cpu;
 	/*
 	/*
 	 * uv_flush_send_and_wait returns 0 if all cpu's were messaged,
 	 * uv_flush_send_and_wait returns 0 if all cpu's were messaged,

+ 4 - 2
arch/x86/tools/relocs.c

@@ -814,12 +814,14 @@ int main(int argc, char **argv)
 	read_relocs(fp);
 	read_relocs(fp);
 	if (show_absolute_syms) {
 	if (show_absolute_syms) {
 		print_absolute_symbols();
 		print_absolute_symbols();
-		return 0;
+		goto out;
 	}
 	}
 	if (show_absolute_relocs) {
 	if (show_absolute_relocs) {
 		print_absolute_relocs();
 		print_absolute_relocs();
-		return 0;
+		goto out;
 	}
 	}
 	emit_relocs(as_text, use_real_mode);
 	emit_relocs(as_text, use_real_mode);
+out:
+	fclose(fp);
 	return 0;
 	return 0;
 }
 }

+ 1 - 1
drivers/acpi/osl.c

@@ -250,7 +250,7 @@ acpi_physical_address __init acpi_os_get_root_pointer(void)
 		return acpi_rsdp;
 		return acpi_rsdp;
 #endif
 #endif
 
 
-	if (efi_enabled) {
+	if (efi_enabled(EFI_CONFIG_TABLES)) {
 		if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
 		if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
 			return efi.acpi20;
 			return efi.acpi20;
 		else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
 		else if (efi.acpi != EFI_INVALID_TABLE_ADDR)

+ 10 - 0
drivers/bluetooth/ath3k.c

@@ -77,10 +77,15 @@ static struct usb_device_id ath3k_table[] = {
 	{ USB_DEVICE(0x0CF3, 0x311D) },
 	{ USB_DEVICE(0x0CF3, 0x311D) },
 	{ USB_DEVICE(0x13d3, 0x3375) },
 	{ USB_DEVICE(0x13d3, 0x3375) },
 	{ USB_DEVICE(0x04CA, 0x3005) },
 	{ USB_DEVICE(0x04CA, 0x3005) },
+	{ USB_DEVICE(0x04CA, 0x3006) },
+	{ USB_DEVICE(0x04CA, 0x3008) },
 	{ USB_DEVICE(0x13d3, 0x3362) },
 	{ USB_DEVICE(0x13d3, 0x3362) },
 	{ USB_DEVICE(0x0CF3, 0xE004) },
 	{ USB_DEVICE(0x0CF3, 0xE004) },
 	{ USB_DEVICE(0x0930, 0x0219) },
 	{ USB_DEVICE(0x0930, 0x0219) },
 	{ USB_DEVICE(0x0489, 0xe057) },
 	{ USB_DEVICE(0x0489, 0xe057) },
+	{ USB_DEVICE(0x13d3, 0x3393) },
+	{ USB_DEVICE(0x0489, 0xe04e) },
+	{ USB_DEVICE(0x0489, 0xe056) },
 
 
 	/* Atheros AR5BBU12 with sflash firmware */
 	/* Atheros AR5BBU12 with sflash firmware */
 	{ USB_DEVICE(0x0489, 0xE02C) },
 	{ USB_DEVICE(0x0489, 0xE02C) },
@@ -104,10 +109,15 @@ static struct usb_device_id ath3k_blist_tbl[] = {
 	{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
 
 
 	/* Atheros AR5BBU22 with sflash firmware */
 	/* Atheros AR5BBU22 with sflash firmware */
 	{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },

+ 5 - 0
drivers/bluetooth/btusb.c

@@ -135,10 +135,15 @@ static struct usb_device_id blacklist_table[] = {
 	{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
 
 
 	/* Atheros AR5BBU12 with sflash firmware */
 	/* Atheros AR5BBU12 with sflash firmware */
 	{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
 	{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },

+ 3 - 3
drivers/edac/edac_mc.c

@@ -340,7 +340,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
 	/*
 	/*
 	 * Alocate and fill the csrow/channels structs
 	 * Alocate and fill the csrow/channels structs
 	 */
 	 */
-	mci->csrows = kcalloc(sizeof(*mci->csrows), tot_csrows, GFP_KERNEL);
+	mci->csrows = kcalloc(tot_csrows, sizeof(*mci->csrows), GFP_KERNEL);
 	if (!mci->csrows)
 	if (!mci->csrows)
 		goto error;
 		goto error;
 	for (row = 0; row < tot_csrows; row++) {
 	for (row = 0; row < tot_csrows; row++) {
@@ -351,7 +351,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
 		csr->csrow_idx = row;
 		csr->csrow_idx = row;
 		csr->mci = mci;
 		csr->mci = mci;
 		csr->nr_channels = tot_channels;
 		csr->nr_channels = tot_channels;
-		csr->channels = kcalloc(sizeof(*csr->channels), tot_channels,
+		csr->channels = kcalloc(tot_channels, sizeof(*csr->channels),
 					GFP_KERNEL);
 					GFP_KERNEL);
 		if (!csr->channels)
 		if (!csr->channels)
 			goto error;
 			goto error;
@@ -369,7 +369,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
 	/*
 	/*
 	 * Allocate and fill the dimm structs
 	 * Allocate and fill the dimm structs
 	 */
 	 */
-	mci->dimms  = kcalloc(sizeof(*mci->dimms), tot_dimms, GFP_KERNEL);
+	mci->dimms  = kcalloc(tot_dimms, sizeof(*mci->dimms), GFP_KERNEL);
 	if (!mci->dimms)
 	if (!mci->dimms)
 		goto error;
 		goto error;
 
 

+ 1 - 1
drivers/edac/edac_pci_sysfs.c

@@ -256,7 +256,7 @@ static ssize_t edac_pci_dev_store(struct kobject *kobj,
 	struct edac_pci_dev_attribute *edac_pci_dev;
 	struct edac_pci_dev_attribute *edac_pci_dev;
 	edac_pci_dev = (struct edac_pci_dev_attribute *)attr;
 	edac_pci_dev = (struct edac_pci_dev_attribute *)attr;
 
 
-	if (edac_pci_dev->show)
+	if (edac_pci_dev->store)
 		return edac_pci_dev->store(edac_pci_dev->value, buffer, count);
 		return edac_pci_dev->store(edac_pci_dev->value, buffer, count);
 	return -EIO;
 	return -EIO;
 }
 }

+ 1 - 1
drivers/firmware/dmi_scan.c

@@ -471,7 +471,7 @@ void __init dmi_scan_machine(void)
 	char __iomem *p, *q;
 	char __iomem *p, *q;
 	int rc;
 	int rc;
 
 
-	if (efi_enabled) {
+	if (efi_enabled(EFI_CONFIG_TABLES)) {
 		if (efi.smbios == EFI_INVALID_TABLE_ADDR)
 		if (efi.smbios == EFI_INVALID_TABLE_ADDR)
 			goto error;
 			goto error;
 
 

+ 5 - 4
drivers/firmware/efivars.c

@@ -674,7 +674,7 @@ static int efi_status_to_err(efi_status_t status)
 		err = -EACCES;
 		err = -EACCES;
 		break;
 		break;
 	case EFI_NOT_FOUND:
 	case EFI_NOT_FOUND:
-		err = -ENOENT;
+		err = -EIO;
 		break;
 		break;
 	default:
 	default:
 		err = -EINVAL;
 		err = -EINVAL;
@@ -793,6 +793,7 @@ static ssize_t efivarfs_file_write(struct file *file,
 		spin_unlock(&efivars->lock);
 		spin_unlock(&efivars->lock);
 		efivar_unregister(var);
 		efivar_unregister(var);
 		drop_nlink(inode);
 		drop_nlink(inode);
+		d_delete(file->f_dentry);
 		dput(file->f_dentry);
 		dput(file->f_dentry);
 
 
 	} else {
 	} else {
@@ -994,7 +995,7 @@ static int efivarfs_unlink(struct inode *dir, struct dentry *dentry)
 		list_del(&var->list);
 		list_del(&var->list);
 		spin_unlock(&efivars->lock);
 		spin_unlock(&efivars->lock);
 		efivar_unregister(var);
 		efivar_unregister(var);
-		drop_nlink(dir);
+		drop_nlink(dentry->d_inode);
 		dput(dentry);
 		dput(dentry);
 		return 0;
 		return 0;
 	}
 	}
@@ -1782,7 +1783,7 @@ efivars_init(void)
 	printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION,
 	printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION,
 	       EFIVARS_DATE);
 	       EFIVARS_DATE);
 
 
-	if (!efi_enabled)
+	if (!efi_enabled(EFI_RUNTIME_SERVICES))
 		return 0;
 		return 0;
 
 
 	/* For now we'll register the efi directory at /sys/firmware/efi */
 	/* For now we'll register the efi directory at /sys/firmware/efi */
@@ -1822,7 +1823,7 @@ err_put:
 static void __exit
 static void __exit
 efivars_exit(void)
 efivars_exit(void)
 {
 {
-	if (efi_enabled) {
+	if (efi_enabled(EFI_RUNTIME_SERVICES)) {
 		unregister_efivars(&__efivars);
 		unregister_efivars(&__efivars);
 		kobject_put(efi_kobj);
 		kobject_put(efi_kobj);
 	}
 	}

+ 1 - 1
drivers/firmware/iscsi_ibft_find.c

@@ -99,7 +99,7 @@ unsigned long __init find_ibft_region(unsigned long *sizep)
 	/* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
 	/* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
 	 * only use ACPI for this */
 	 * only use ACPI for this */
 
 
-	if (!efi_enabled)
+	if (!efi_enabled(EFI_BOOT))
 		find_ibft_in_mem();
 		find_ibft_in_mem();
 
 
 	if (ibft_addr) {
 	if (ibft_addr) {

+ 2 - 2
drivers/gpu/drm/exynos/Kconfig

@@ -24,7 +24,7 @@ config DRM_EXYNOS_DMABUF
 
 
 config DRM_EXYNOS_FIMD
 config DRM_EXYNOS_FIMD
 	bool "Exynos DRM FIMD"
 	bool "Exynos DRM FIMD"
-	depends on DRM_EXYNOS && !FB_S3C
+	depends on DRM_EXYNOS && !FB_S3C && !ARCH_MULTIPLATFORM
 	help
 	help
 	  Choose this option if you want to use Exynos FIMD for DRM.
 	  Choose this option if you want to use Exynos FIMD for DRM.
 
 
@@ -48,7 +48,7 @@ config DRM_EXYNOS_G2D
 
 
 config DRM_EXYNOS_IPP
 config DRM_EXYNOS_IPP
 	bool "Exynos DRM IPP"
 	bool "Exynos DRM IPP"
-	depends on DRM_EXYNOS
+	depends on DRM_EXYNOS && !ARCH_MULTIPLATFORM
 	help
 	help
 	  Choose this option if you want to use IPP feature for DRM.
 	  Choose this option if you want to use IPP feature for DRM.
 
 

+ 15 - 18
drivers/gpu/drm/exynos/exynos_drm_connector.c

@@ -18,7 +18,6 @@
 #include "exynos_drm_drv.h"
 #include "exynos_drm_drv.h"
 #include "exynos_drm_encoder.h"
 #include "exynos_drm_encoder.h"
 
 
-#define MAX_EDID 256
 #define to_exynos_connector(x)	container_of(x, struct exynos_drm_connector,\
 #define to_exynos_connector(x)	container_of(x, struct exynos_drm_connector,\
 				drm_connector)
 				drm_connector)
 
 
@@ -96,7 +95,9 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 					to_exynos_connector(connector);
 					to_exynos_connector(connector);
 	struct exynos_drm_manager *manager = exynos_connector->manager;
 	struct exynos_drm_manager *manager = exynos_connector->manager;
 	struct exynos_drm_display_ops *display_ops = manager->display_ops;
 	struct exynos_drm_display_ops *display_ops = manager->display_ops;
-	unsigned int count;
+	struct edid *edid = NULL;
+	unsigned int count = 0;
+	int ret;
 
 
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
 
@@ -114,27 +115,21 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 	 * because lcd panel has only one mode.
 	 * because lcd panel has only one mode.
 	 */
 	 */
 	if (display_ops->get_edid) {
 	if (display_ops->get_edid) {
-		int ret;
-		void *edid;
-
-		edid = kzalloc(MAX_EDID, GFP_KERNEL);
-		if (!edid) {
-			DRM_ERROR("failed to allocate edid\n");
-			return 0;
+		edid = display_ops->get_edid(manager->dev, connector);
+		if (IS_ERR_OR_NULL(edid)) {
+			ret = PTR_ERR(edid);
+			edid = NULL;
+			DRM_ERROR("Panel operation get_edid failed %d\n", ret);
+			goto out;
 		}
 		}
 
 
-		ret = display_ops->get_edid(manager->dev, connector,
-						edid, MAX_EDID);
-		if (ret < 0) {
-			DRM_ERROR("failed to get edid data.\n");
-			kfree(edid);
-			edid = NULL;
-			return 0;
+		count = drm_add_edid_modes(connector, edid);
+		if (count < 0) {
+			DRM_ERROR("Add edid modes failed %d\n", count);
+			goto out;
 		}
 		}
 
 
 		drm_mode_connector_update_edid_property(connector, edid);
 		drm_mode_connector_update_edid_property(connector, edid);
-		count = drm_add_edid_modes(connector, edid);
-		kfree(edid);
 	} else {
 	} else {
 		struct exynos_drm_panel_info *panel;
 		struct exynos_drm_panel_info *panel;
 		struct drm_display_mode *mode = drm_mode_create(connector->dev);
 		struct drm_display_mode *mode = drm_mode_create(connector->dev);
@@ -161,6 +156,8 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 		count = 1;
 		count = 1;
 	}
 	}
 
 
+out:
+	kfree(edid);
 	return count;
 	return count;
 }
 }
 
 

+ 11 - 13
drivers/gpu/drm/exynos/exynos_drm_dmabuf.c

@@ -19,6 +19,7 @@
 struct exynos_drm_dmabuf_attachment {
 struct exynos_drm_dmabuf_attachment {
 	struct sg_table sgt;
 	struct sg_table sgt;
 	enum dma_data_direction dir;
 	enum dma_data_direction dir;
+	bool is_mapped;
 };
 };
 
 
 static int exynos_gem_attach_dma_buf(struct dma_buf *dmabuf,
 static int exynos_gem_attach_dma_buf(struct dma_buf *dmabuf,
@@ -72,17 +73,10 @@ static struct sg_table *
 
 
 	DRM_DEBUG_PRIME("%s\n", __FILE__);
 	DRM_DEBUG_PRIME("%s\n", __FILE__);
 
 
-	if (WARN_ON(dir == DMA_NONE))
-		return ERR_PTR(-EINVAL);
-
 	/* just return current sgt if already requested. */
 	/* just return current sgt if already requested. */
-	if (exynos_attach->dir == dir)
+	if (exynos_attach->dir == dir && exynos_attach->is_mapped)
 		return &exynos_attach->sgt;
 		return &exynos_attach->sgt;
 
 
-	/* reattaching is not allowed. */
-	if (WARN_ON(exynos_attach->dir != DMA_NONE))
-		return ERR_PTR(-EBUSY);
-
 	buf = gem_obj->buffer;
 	buf = gem_obj->buffer;
 	if (!buf) {
 	if (!buf) {
 		DRM_ERROR("buffer is null.\n");
 		DRM_ERROR("buffer is null.\n");
@@ -107,13 +101,17 @@ static struct sg_table *
 		wr = sg_next(wr);
 		wr = sg_next(wr);
 	}
 	}
 
 
-	nents = dma_map_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir);
-	if (!nents) {
-		DRM_ERROR("failed to map sgl with iommu.\n");
-		sgt = ERR_PTR(-EIO);
-		goto err_unlock;
+	if (dir != DMA_NONE) {
+		nents = dma_map_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir);
+		if (!nents) {
+			DRM_ERROR("failed to map sgl with iommu.\n");
+			sg_free_table(sgt);
+			sgt = ERR_PTR(-EIO);
+			goto err_unlock;
+		}
 	}
 	}
 
 
+	exynos_attach->is_mapped = true;
 	exynos_attach->dir = dir;
 	exynos_attach->dir = dir;
 	attach->priv = exynos_attach;
 	attach->priv = exynos_attach;
 
 

+ 2 - 2
drivers/gpu/drm/exynos/exynos_drm_drv.h

@@ -148,8 +148,8 @@ struct exynos_drm_overlay {
 struct exynos_drm_display_ops {
 struct exynos_drm_display_ops {
 	enum exynos_drm_output_type type;
 	enum exynos_drm_output_type type;
 	bool (*is_connected)(struct device *dev);
 	bool (*is_connected)(struct device *dev);
-	int (*get_edid)(struct device *dev, struct drm_connector *connector,
-				u8 *edid, int len);
+	struct edid *(*get_edid)(struct device *dev,
+			struct drm_connector *connector);
 	void *(*get_panel)(struct device *dev);
 	void *(*get_panel)(struct device *dev);
 	int (*check_timing)(struct device *dev, void *timing);
 	int (*check_timing)(struct device *dev, void *timing);
 	int (*power_on)(struct device *dev, int mode);
 	int (*power_on)(struct device *dev, int mode);

+ 1 - 1
drivers/gpu/drm/exynos/exynos_drm_g2d.c

@@ -324,7 +324,7 @@ out:
 	g2d_userptr = NULL;
 	g2d_userptr = NULL;
 }
 }
 
 
-dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,
+static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,
 					unsigned long userptr,
 					unsigned long userptr,
 					unsigned long size,
 					unsigned long size,
 					struct drm_file *filp,
 					struct drm_file *filp,

+ 4 - 5
drivers/gpu/drm/exynos/exynos_drm_hdmi.c

@@ -108,18 +108,17 @@ static bool drm_hdmi_is_connected(struct device *dev)
 	return false;
 	return false;
 }
 }
 
 
-static int drm_hdmi_get_edid(struct device *dev,
-		struct drm_connector *connector, u8 *edid, int len)
+static struct edid *drm_hdmi_get_edid(struct device *dev,
+			struct drm_connector *connector)
 {
 {
 	struct drm_hdmi_context *ctx = to_context(dev);
 	struct drm_hdmi_context *ctx = to_context(dev);
 
 
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
 
 	if (hdmi_ops && hdmi_ops->get_edid)
 	if (hdmi_ops && hdmi_ops->get_edid)
-		return hdmi_ops->get_edid(ctx->hdmi_ctx->ctx, connector, edid,
-					  len);
+		return hdmi_ops->get_edid(ctx->hdmi_ctx->ctx, connector);
 
 
-	return 0;
+	return NULL;
 }
 }
 
 
 static int drm_hdmi_check_timing(struct device *dev, void *timing)
 static int drm_hdmi_check_timing(struct device *dev, void *timing)

+ 2 - 2
drivers/gpu/drm/exynos/exynos_drm_hdmi.h

@@ -30,8 +30,8 @@ struct exynos_drm_hdmi_context {
 struct exynos_hdmi_ops {
 struct exynos_hdmi_ops {
 	/* display */
 	/* display */
 	bool (*is_connected)(void *ctx);
 	bool (*is_connected)(void *ctx);
-	int (*get_edid)(void *ctx, struct drm_connector *connector,
-			u8 *edid, int len);
+	struct edid *(*get_edid)(void *ctx,
+			struct drm_connector *connector);
 	int (*check_timing)(void *ctx, void *timing);
 	int (*check_timing)(void *ctx, void *timing);
 	int (*power_on)(void *ctx, int mode);
 	int (*power_on)(void *ctx, int mode);
 
 

+ 1 - 1
drivers/gpu/drm/exynos/exynos_drm_ipp.c

@@ -869,7 +869,7 @@ static void ipp_put_event(struct drm_exynos_ipp_cmd_node *c_node,
 	}
 	}
 }
 }
 
 
-void ipp_handle_cmd_work(struct device *dev,
+static void ipp_handle_cmd_work(struct device *dev,
 		struct exynos_drm_ippdrv *ippdrv,
 		struct exynos_drm_ippdrv *ippdrv,
 		struct drm_exynos_ipp_cmd_work *cmd_work,
 		struct drm_exynos_ipp_cmd_work *cmd_work,
 		struct drm_exynos_ipp_cmd_node *c_node)
 		struct drm_exynos_ipp_cmd_node *c_node)

+ 2 - 2
drivers/gpu/drm/exynos/exynos_drm_rotator.c

@@ -734,7 +734,7 @@ static int rotator_remove(struct platform_device *pdev)
 	return 0;
 	return 0;
 }
 }
 
 
-struct rot_limit_table rot_limit_tbl = {
+static struct rot_limit_table rot_limit_tbl = {
 	.ycbcr420_2p = {
 	.ycbcr420_2p = {
 		.min_w = 32,
 		.min_w = 32,
 		.min_h = 32,
 		.min_h = 32,
@@ -751,7 +751,7 @@ struct rot_limit_table rot_limit_tbl = {
 	},
 	},
 };
 };
 
 
-struct platform_device_id rotator_driver_ids[] = {
+static struct platform_device_id rotator_driver_ids[] = {
 	{
 	{
 		.name		= "exynos-rot",
 		.name		= "exynos-rot",
 		.driver_data	= (unsigned long)&rot_limit_tbl,
 		.driver_data	= (unsigned long)&rot_limit_tbl,

+ 16 - 10
drivers/gpu/drm/exynos/exynos_drm_vidi.c

@@ -98,10 +98,12 @@ static bool vidi_display_is_connected(struct device *dev)
 	return ctx->connected ? true : false;
 	return ctx->connected ? true : false;
 }
 }
 
 
-static int vidi_get_edid(struct device *dev, struct drm_connector *connector,
-				u8 *edid, int len)
+static struct edid *vidi_get_edid(struct device *dev,
+			struct drm_connector *connector)
 {
 {
 	struct vidi_context *ctx = get_vidi_context(dev);
 	struct vidi_context *ctx = get_vidi_context(dev);
+	struct edid *edid;
+	int edid_len;
 
 
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
 
@@ -111,13 +113,18 @@ static int vidi_get_edid(struct device *dev, struct drm_connector *connector,
 	 */
 	 */
 	if (!ctx->raw_edid) {
 	if (!ctx->raw_edid) {
 		DRM_DEBUG_KMS("raw_edid is null.\n");
 		DRM_DEBUG_KMS("raw_edid is null.\n");
-		return -EFAULT;
+		return ERR_PTR(-EFAULT);
 	}
 	}
 
 
-	memcpy(edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions)
-					* EDID_LENGTH, len));
+	edid_len = (1 + ctx->raw_edid->extensions) * EDID_LENGTH;
+	edid = kzalloc(edid_len, GFP_KERNEL);
+	if (!edid) {
+		DRM_DEBUG_KMS("failed to allocate edid\n");
+		return ERR_PTR(-ENOMEM);
+	}
 
 
-	return 0;
+	memcpy(edid, ctx->raw_edid, edid_len);
+	return edid;
 }
 }
 
 
 static void *vidi_get_panel(struct device *dev)
 static void *vidi_get_panel(struct device *dev)
@@ -514,7 +521,6 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
 	struct exynos_drm_manager *manager;
 	struct exynos_drm_manager *manager;
 	struct exynos_drm_display_ops *display_ops;
 	struct exynos_drm_display_ops *display_ops;
 	struct drm_exynos_vidi_connection *vidi = data;
 	struct drm_exynos_vidi_connection *vidi = data;
-	struct edid *raw_edid;
 	int edid_len;
 	int edid_len;
 
 
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 	DRM_DEBUG_KMS("%s\n", __FILE__);
@@ -551,11 +557,11 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
 	}
 	}
 
 
 	if (vidi->connection) {
 	if (vidi->connection) {
-		if (!vidi->edid) {
-			DRM_DEBUG_KMS("edid data is null.\n");
+		struct edid *raw_edid  = (struct edid *)(uint32_t)vidi->edid;
+		if (!drm_edid_is_valid(raw_edid)) {
+			DRM_DEBUG_KMS("edid data is invalid.\n");
 			return -EINVAL;
 			return -EINVAL;
 		}
 		}
-		raw_edid = (struct edid *)(uint32_t)vidi->edid;
 		edid_len = (1 + raw_edid->extensions) * EDID_LENGTH;
 		edid_len = (1 + raw_edid->extensions) * EDID_LENGTH;
 		ctx->raw_edid = kzalloc(edid_len, GFP_KERNEL);
 		ctx->raw_edid = kzalloc(edid_len, GFP_KERNEL);
 		if (!ctx->raw_edid) {
 		if (!ctx->raw_edid) {

+ 38 - 83
drivers/gpu/drm/exynos/exynos_hdmi.c

@@ -34,7 +34,6 @@
 #include <linux/regulator/consumer.h>
 #include <linux/regulator/consumer.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/of_gpio.h>
 #include <linux/of_gpio.h>
-#include <plat/gpio-cfg.h>
 
 
 #include <drm/exynos_drm.h>
 #include <drm/exynos_drm.h>
 
 
@@ -98,8 +97,7 @@ struct hdmi_context {
 
 
 	void __iomem			*regs;
 	void __iomem			*regs;
 	void				*parent_ctx;
 	void				*parent_ctx;
-	int				external_irq;
-	int				internal_irq;
+	int				irq;
 
 
 	struct i2c_client		*ddc_port;
 	struct i2c_client		*ddc_port;
 	struct i2c_client		*hdmiphy_port;
 	struct i2c_client		*hdmiphy_port;
@@ -1391,8 +1389,7 @@ static bool hdmi_is_connected(void *ctx)
 	return hdata->hpd;
 	return hdata->hpd;
 }
 }
 
 
-static int hdmi_get_edid(void *ctx, struct drm_connector *connector,
-				u8 *edid, int len)
+static struct edid *hdmi_get_edid(void *ctx, struct drm_connector *connector)
 {
 {
 	struct edid *raw_edid;
 	struct edid *raw_edid;
 	struct hdmi_context *hdata = ctx;
 	struct hdmi_context *hdata = ctx;
@@ -1400,22 +1397,18 @@ static int hdmi_get_edid(void *ctx, struct drm_connector *connector,
 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 
 
 	if (!hdata->ddc_port)
 	if (!hdata->ddc_port)
-		return -ENODEV;
+		return ERR_PTR(-ENODEV);
 
 
 	raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
 	raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
-	if (raw_edid) {
-		hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
-		memcpy(edid, raw_edid, min((1 + raw_edid->extensions)
-					* EDID_LENGTH, len));
-		DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
-			(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
-			raw_edid->width_cm, raw_edid->height_cm);
-		kfree(raw_edid);
-	} else {
-		return -ENODEV;
-	}
+	if (!raw_edid)
+		return ERR_PTR(-ENODEV);
 
 
-	return 0;
+	hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
+	DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
+		(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
+		raw_edid->width_cm, raw_edid->height_cm);
+
+	return raw_edid;
 }
 }
 
 
 static int hdmi_v13_check_timing(struct fb_videomode *check_timing)
 static int hdmi_v13_check_timing(struct fb_videomode *check_timing)
@@ -1652,16 +1645,16 @@ static void hdmi_conf_reset(struct hdmi_context *hdata)
 
 
 	/* resetting HDMI core */
 	/* resetting HDMI core */
 	hdmi_reg_writemask(hdata, reg,  0, HDMI_CORE_SW_RSTOUT);
 	hdmi_reg_writemask(hdata, reg,  0, HDMI_CORE_SW_RSTOUT);
-	mdelay(10);
+	usleep_range(10000, 12000);
 	hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
 	hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
-	mdelay(10);
+	usleep_range(10000, 12000);
 }
 }
 
 
 static void hdmi_conf_init(struct hdmi_context *hdata)
 static void hdmi_conf_init(struct hdmi_context *hdata)
 {
 {
 	struct hdmi_infoframe infoframe;
 	struct hdmi_infoframe infoframe;
 
 
-	/* disable HPD interrupts */
+	/* disable HPD interrupts from HDMI IP block, use GPIO instead */
 	hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
 	hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
 		HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
 		HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
 
 
@@ -1779,7 +1772,7 @@ static void hdmi_v13_timing_apply(struct hdmi_context *hdata)
 		u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
 		u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
 		if (val & HDMI_PHY_STATUS_READY)
 		if (val & HDMI_PHY_STATUS_READY)
 			break;
 			break;
-		mdelay(1);
+		usleep_range(1000, 2000);
 	}
 	}
 	/* steady state not achieved */
 	/* steady state not achieved */
 	if (tries == 0) {
 	if (tries == 0) {
@@ -1946,7 +1939,7 @@ static void hdmi_v14_timing_apply(struct hdmi_context *hdata)
 		u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
 		u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
 		if (val & HDMI_PHY_STATUS_READY)
 		if (val & HDMI_PHY_STATUS_READY)
 			break;
 			break;
-		mdelay(1);
+		usleep_range(1000, 2000);
 	}
 	}
 	/* steady state not achieved */
 	/* steady state not achieved */
 	if (tries == 0) {
 	if (tries == 0) {
@@ -1998,9 +1991,9 @@ static void hdmiphy_conf_reset(struct hdmi_context *hdata)
 
 
 	/* reset hdmiphy */
 	/* reset hdmiphy */
 	hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
 	hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
-	mdelay(10);
+	usleep_range(10000, 12000);
 	hdmi_reg_writemask(hdata, reg,  0, HDMI_PHY_SW_RSTOUT);
 	hdmi_reg_writemask(hdata, reg,  0, HDMI_PHY_SW_RSTOUT);
-	mdelay(10);
+	usleep_range(10000, 12000);
 }
 }
 
 
 static void hdmiphy_poweron(struct hdmi_context *hdata)
 static void hdmiphy_poweron(struct hdmi_context *hdata)
@@ -2048,7 +2041,7 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata)
 		return;
 		return;
 	}
 	}
 
 
-	mdelay(10);
+	usleep_range(10000, 12000);
 
 
 	/* operation mode */
 	/* operation mode */
 	operation[0] = 0x1f;
 	operation[0] = 0x1f;
@@ -2170,6 +2163,13 @@ static void hdmi_commit(void *ctx)
 
 
 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 
 
+	mutex_lock(&hdata->hdmi_mutex);
+	if (!hdata->powered) {
+		mutex_unlock(&hdata->hdmi_mutex);
+		return;
+	}
+	mutex_unlock(&hdata->hdmi_mutex);
+
 	hdmi_conf_apply(hdata);
 	hdmi_conf_apply(hdata);
 }
 }
 
 
@@ -2265,7 +2265,7 @@ static struct exynos_hdmi_ops hdmi_ops = {
 	.dpms		= hdmi_dpms,
 	.dpms		= hdmi_dpms,
 };
 };
 
 
-static irqreturn_t hdmi_external_irq_thread(int irq, void *arg)
+static irqreturn_t hdmi_irq_thread(int irq, void *arg)
 {
 {
 	struct exynos_drm_hdmi_context *ctx = arg;
 	struct exynos_drm_hdmi_context *ctx = arg;
 	struct hdmi_context *hdata = ctx->ctx;
 	struct hdmi_context *hdata = ctx->ctx;
@@ -2280,31 +2280,6 @@ static irqreturn_t hdmi_external_irq_thread(int irq, void *arg)
 	return IRQ_HANDLED;
 	return IRQ_HANDLED;
 }
 }
 
 
-static irqreturn_t hdmi_internal_irq_thread(int irq, void *arg)
-{
-	struct exynos_drm_hdmi_context *ctx = arg;
-	struct hdmi_context *hdata = ctx->ctx;
-	u32 intc_flag;
-
-	intc_flag = hdmi_reg_read(hdata, HDMI_INTC_FLAG);
-	/* clearing flags for HPD plug/unplug */
-	if (intc_flag & HDMI_INTC_FLAG_HPD_UNPLUG) {
-		DRM_DEBUG_KMS("unplugged\n");
-		hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0,
-			HDMI_INTC_FLAG_HPD_UNPLUG);
-	}
-	if (intc_flag & HDMI_INTC_FLAG_HPD_PLUG) {
-		DRM_DEBUG_KMS("plugged\n");
-		hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0,
-			HDMI_INTC_FLAG_HPD_PLUG);
-	}
-
-	if (ctx->drm_dev)
-		drm_helper_hpd_irq_event(ctx->drm_dev);
-
-	return IRQ_HANDLED;
-}
-
 static int hdmi_resources_init(struct hdmi_context *hdata)
 static int hdmi_resources_init(struct hdmi_context *hdata)
 {
 {
 	struct device *dev = hdata->dev;
 	struct device *dev = hdata->dev;
@@ -2555,39 +2530,24 @@ static int hdmi_probe(struct platform_device *pdev)
 
 
 	hdata->hdmiphy_port = hdmi_hdmiphy;
 	hdata->hdmiphy_port = hdmi_hdmiphy;
 
 
-	hdata->external_irq = gpio_to_irq(hdata->hpd_gpio);
-	if (hdata->external_irq < 0) {
-		DRM_ERROR("failed to get GPIO external irq\n");
-		ret = hdata->external_irq;
-		goto err_hdmiphy;
-	}
-
-	hdata->internal_irq = platform_get_irq(pdev, 0);
-	if (hdata->internal_irq < 0) {
-		DRM_ERROR("failed to get platform internal irq\n");
-		ret = hdata->internal_irq;
+	hdata->irq = gpio_to_irq(hdata->hpd_gpio);
+	if (hdata->irq < 0) {
+		DRM_ERROR("failed to get GPIO irq\n");
+		ret = hdata->irq;
 		goto err_hdmiphy;
 		goto err_hdmiphy;
 	}
 	}
 
 
 	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
 	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
 
 
-	ret = request_threaded_irq(hdata->external_irq, NULL,
-			hdmi_external_irq_thread, IRQF_TRIGGER_RISING |
+	ret = request_threaded_irq(hdata->irq, NULL,
+			hdmi_irq_thread, IRQF_TRIGGER_RISING |
 			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
 			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-			"hdmi_external", drm_hdmi_ctx);
+			"hdmi", drm_hdmi_ctx);
 	if (ret) {
 	if (ret) {
-		DRM_ERROR("failed to register hdmi external interrupt\n");
+		DRM_ERROR("failed to register hdmi interrupt\n");
 		goto err_hdmiphy;
 		goto err_hdmiphy;
 	}
 	}
 
 
-	ret = request_threaded_irq(hdata->internal_irq, NULL,
-			hdmi_internal_irq_thread, IRQF_ONESHOT,
-			"hdmi_internal", drm_hdmi_ctx);
-	if (ret) {
-		DRM_ERROR("failed to register hdmi internal interrupt\n");
-		goto err_free_irq;
-	}
-
 	/* Attach HDMI Driver to common hdmi. */
 	/* Attach HDMI Driver to common hdmi. */
 	exynos_hdmi_drv_attach(drm_hdmi_ctx);
 	exynos_hdmi_drv_attach(drm_hdmi_ctx);
 
 
@@ -2598,8 +2558,6 @@ static int hdmi_probe(struct platform_device *pdev)
 
 
 	return 0;
 	return 0;
 
 
-err_free_irq:
-	free_irq(hdata->external_irq, drm_hdmi_ctx);
 err_hdmiphy:
 err_hdmiphy:
 	i2c_del_driver(&hdmiphy_driver);
 	i2c_del_driver(&hdmiphy_driver);
 err_ddc:
 err_ddc:
@@ -2617,8 +2575,7 @@ static int hdmi_remove(struct platform_device *pdev)
 
 
 	pm_runtime_disable(dev);
 	pm_runtime_disable(dev);
 
 
-	free_irq(hdata->internal_irq, hdata);
-	free_irq(hdata->external_irq, hdata);
+	free_irq(hdata->irq, hdata);
 
 
 
 
 	/* hdmiphy i2c driver */
 	/* hdmiphy i2c driver */
@@ -2637,8 +2594,7 @@ static int hdmi_suspend(struct device *dev)
 
 
 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 
 
-	disable_irq(hdata->internal_irq);
-	disable_irq(hdata->external_irq);
+	disable_irq(hdata->irq);
 
 
 	hdata->hpd = false;
 	hdata->hpd = false;
 	if (ctx->drm_dev)
 	if (ctx->drm_dev)
@@ -2663,8 +2619,7 @@ static int hdmi_resume(struct device *dev)
 
 
 	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
 	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
 
 
-	enable_irq(hdata->external_irq);
-	enable_irq(hdata->internal_irq);
+	enable_irq(hdata->irq);
 
 
 	if (!pm_runtime_suspended(dev)) {
 	if (!pm_runtime_suspended(dev)) {
 		DRM_DEBUG_KMS("%s : Already resumed\n", __func__);
 		DRM_DEBUG_KMS("%s : Already resumed\n", __func__);

+ 8 - 1
drivers/gpu/drm/exynos/exynos_mixer.c

@@ -600,7 +600,7 @@ static void vp_win_reset(struct mixer_context *ctx)
 		/* waiting until VP_SRESET_PROCESSING is 0 */
 		/* waiting until VP_SRESET_PROCESSING is 0 */
 		if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING)
 		if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING)
 			break;
 			break;
-		mdelay(10);
+		usleep_range(10000, 12000);
 	}
 	}
 	WARN(tries == 0, "failed to reset Video Processor\n");
 	WARN(tries == 0, "failed to reset Video Processor\n");
 }
 }
@@ -776,6 +776,13 @@ static void mixer_win_commit(void *ctx, int win)
 
 
 	DRM_DEBUG_KMS("[%d] %s, win: %d\n", __LINE__, __func__, win);
 	DRM_DEBUG_KMS("[%d] %s, win: %d\n", __LINE__, __func__, win);
 
 
+	mutex_lock(&mixer_ctx->mixer_mutex);
+	if (!mixer_ctx->powered) {
+		mutex_unlock(&mixer_ctx->mixer_mutex);
+		return;
+	}
+	mutex_unlock(&mixer_ctx->mixer_mutex);
+
 	if (win > 1 && mixer_ctx->vp_enabled)
 	if (win > 1 && mixer_ctx->vp_enabled)
 		vp_video_buffer(mixer_ctx, win);
 		vp_video_buffer(mixer_ctx, win);
 	else
 	else

+ 2 - 0
drivers/gpu/drm/i915/i915_debugfs.c

@@ -30,6 +30,7 @@
 #include <linux/debugfs.h>
 #include <linux/debugfs.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/export.h>
 #include <linux/export.h>
+#include <generated/utsrelease.h>
 #include <drm/drmP.h>
 #include <drm/drmP.h>
 #include "intel_drv.h"
 #include "intel_drv.h"
 #include "intel_ringbuffer.h"
 #include "intel_ringbuffer.h"
@@ -690,6 +691,7 @@ static int i915_error_state(struct seq_file *m, void *unused)
 
 
 	seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
 	seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
 		   error->time.tv_usec);
 		   error->time.tv_usec);
+	seq_printf(m, "Kernel: " UTS_RELEASE);
 	seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device);
 	seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device);
 	seq_printf(m, "EIR: 0x%08x\n", error->eir);
 	seq_printf(m, "EIR: 0x%08x\n", error->eir);
 	seq_printf(m, "IER: 0x%08x\n", error->ier);
 	seq_printf(m, "IER: 0x%08x\n", error->ier);

+ 1 - 0
drivers/gpu/drm/i915/i915_reg.h

@@ -533,6 +533,7 @@
 #define MI_MODE		0x0209c
 #define MI_MODE		0x0209c
 # define VS_TIMER_DISPATCH				(1 << 6)
 # define VS_TIMER_DISPATCH				(1 << 6)
 # define MI_FLUSH_ENABLE				(1 << 12)
 # define MI_FLUSH_ENABLE				(1 << 12)
+# define ASYNC_FLIP_PERF_DISABLE			(1 << 14)
 
 
 #define GEN6_GT_MODE	0x20d0
 #define GEN6_GT_MODE	0x20d0
 #define   GEN6_GT_MODE_HI				(1 << 9)
 #define   GEN6_GT_MODE_HI				(1 << 9)

+ 18 - 6
drivers/gpu/drm/i915/intel_ringbuffer.c

@@ -505,13 +505,25 @@ static int init_render_ring(struct intel_ring_buffer *ring)
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	int ret = init_ring_common(ring);
 	int ret = init_ring_common(ring);
 
 
-	if (INTEL_INFO(dev)->gen > 3) {
+	if (INTEL_INFO(dev)->gen > 3)
 		I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(VS_TIMER_DISPATCH));
 		I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(VS_TIMER_DISPATCH));
-		if (IS_GEN7(dev))
-			I915_WRITE(GFX_MODE_GEN7,
-				   _MASKED_BIT_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
-				   _MASKED_BIT_ENABLE(GFX_REPLAY_MODE));
-	}
+
+	/* We need to disable the AsyncFlip performance optimisations in order
+	 * to use MI_WAIT_FOR_EVENT within the CS. It should already be
+	 * programmed to '1' on all products.
+	 */
+	if (INTEL_INFO(dev)->gen >= 6)
+		I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(ASYNC_FLIP_PERF_DISABLE));
+
+	/* Required for the hardware to program scanline values for waiting */
+	if (INTEL_INFO(dev)->gen == 6)
+		I915_WRITE(GFX_MODE,
+			   _MASKED_BIT_ENABLE(GFX_TLB_INVALIDATE_ALWAYS));
+
+	if (IS_GEN7(dev))
+		I915_WRITE(GFX_MODE_GEN7,
+			   _MASKED_BIT_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
+			   _MASKED_BIT_ENABLE(GFX_REPLAY_MODE));
 
 
 	if (INTEL_INFO(dev)->gen >= 5) {
 	if (INTEL_INFO(dev)->gen >= 5) {
 		ret = init_pipe_control(ring);
 		ret = init_pipe_control(ring);

+ 6 - 2
drivers/gpu/drm/radeon/ni.c

@@ -1216,7 +1216,7 @@ void cayman_dma_stop(struct radeon_device *rdev)
 int cayman_dma_resume(struct radeon_device *rdev)
 int cayman_dma_resume(struct radeon_device *rdev)
 {
 {
 	struct radeon_ring *ring;
 	struct radeon_ring *ring;
-	u32 rb_cntl, dma_cntl;
+	u32 rb_cntl, dma_cntl, ib_cntl;
 	u32 rb_bufsz;
 	u32 rb_bufsz;
 	u32 reg_offset, wb_offset;
 	u32 reg_offset, wb_offset;
 	int i, r;
 	int i, r;
@@ -1265,7 +1265,11 @@ int cayman_dma_resume(struct radeon_device *rdev)
 		WREG32(DMA_RB_BASE + reg_offset, ring->gpu_addr >> 8);
 		WREG32(DMA_RB_BASE + reg_offset, ring->gpu_addr >> 8);
 
 
 		/* enable DMA IBs */
 		/* enable DMA IBs */
-		WREG32(DMA_IB_CNTL + reg_offset, DMA_IB_ENABLE | CMD_VMID_FORCE);
+		ib_cntl = DMA_IB_ENABLE | CMD_VMID_FORCE;
+#ifdef __BIG_ENDIAN
+		ib_cntl |= DMA_IB_SWAP_ENABLE;
+#endif
+		WREG32(DMA_IB_CNTL + reg_offset, ib_cntl);
 
 
 		dma_cntl = RREG32(DMA_CNTL + reg_offset);
 		dma_cntl = RREG32(DMA_CNTL + reg_offset);
 		dma_cntl &= ~CTXEMPTY_INT_ENABLE;
 		dma_cntl &= ~CTXEMPTY_INT_ENABLE;

+ 6 - 2
drivers/gpu/drm/radeon/r600.c

@@ -2313,7 +2313,7 @@ void r600_dma_stop(struct radeon_device *rdev)
 int r600_dma_resume(struct radeon_device *rdev)
 int r600_dma_resume(struct radeon_device *rdev)
 {
 {
 	struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
 	struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
-	u32 rb_cntl, dma_cntl;
+	u32 rb_cntl, dma_cntl, ib_cntl;
 	u32 rb_bufsz;
 	u32 rb_bufsz;
 	int r;
 	int r;
 
 
@@ -2353,7 +2353,11 @@ int r600_dma_resume(struct radeon_device *rdev)
 	WREG32(DMA_RB_BASE, ring->gpu_addr >> 8);
 	WREG32(DMA_RB_BASE, ring->gpu_addr >> 8);
 
 
 	/* enable DMA IBs */
 	/* enable DMA IBs */
-	WREG32(DMA_IB_CNTL, DMA_IB_ENABLE);
+	ib_cntl = DMA_IB_ENABLE;
+#ifdef __BIG_ENDIAN
+	ib_cntl |= DMA_IB_SWAP_ENABLE;
+#endif
+	WREG32(DMA_IB_CNTL, ib_cntl);
 
 
 	dma_cntl = RREG32(DMA_CNTL);
 	dma_cntl = RREG32(DMA_CNTL);
 	dma_cntl &= ~CTXEMPTY_INT_ENABLE;
 	dma_cntl &= ~CTXEMPTY_INT_ENABLE;

+ 2 - 0
drivers/gpu/drm/radeon/radeon_cs.c

@@ -286,6 +286,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
 			    p->chunks[p->chunk_ib_idx].kpage[1] == NULL) {
 			    p->chunks[p->chunk_ib_idx].kpage[1] == NULL) {
 				kfree(p->chunks[p->chunk_ib_idx].kpage[0]);
 				kfree(p->chunks[p->chunk_ib_idx].kpage[0]);
 				kfree(p->chunks[p->chunk_ib_idx].kpage[1]);
 				kfree(p->chunks[p->chunk_ib_idx].kpage[1]);
+				p->chunks[p->chunk_ib_idx].kpage[0] = NULL;
+				p->chunks[p->chunk_ib_idx].kpage[1] = NULL;
 				return -ENOMEM;
 				return -ENOMEM;
 			}
 			}
 		}
 		}

+ 2 - 1
drivers/gpu/drm/radeon/radeon_cursor.c

@@ -241,7 +241,8 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc,
 		y = 0;
 		y = 0;
 	}
 	}
 
 
-	if (ASIC_IS_AVIVO(rdev)) {
+	/* fixed on DCE6 and newer */
+	if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE6(rdev)) {
 		int i = 0;
 		int i = 0;
 		struct drm_crtc *crtc_p;
 		struct drm_crtc *crtc_p;
 
 

+ 2 - 1
drivers/gpu/drm/radeon/radeon_device.c

@@ -429,7 +429,8 @@ bool radeon_card_posted(struct radeon_device *rdev)
 {
 {
 	uint32_t reg;
 	uint32_t reg;
 
 
-	if (efi_enabled && rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE)
+	if (efi_enabled(EFI_BOOT) &&
+	    rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE)
 		return false;
 		return false;
 
 
 	/* first check CRTCs */
 	/* first check CRTCs */

+ 1 - 1
drivers/gpu/drm/radeon/radeon_display.c

@@ -1122,7 +1122,7 @@ radeon_user_framebuffer_create(struct drm_device *dev,
 	if (ret) {
 	if (ret) {
 		kfree(radeon_fb);
 		kfree(radeon_fb);
 		drm_gem_object_unreference_unlocked(obj);
 		drm_gem_object_unreference_unlocked(obj);
-		return NULL;
+		return ERR_PTR(ret);
 	}
 	}
 
 
 	return &radeon_fb->base;
 	return &radeon_fb->base;

+ 3 - 0
drivers/hid/hid-ids.h

@@ -306,6 +306,9 @@
 #define USB_VENDOR_ID_EZKEY		0x0518
 #define USB_VENDOR_ID_EZKEY		0x0518
 #define USB_DEVICE_ID_BTC_8193		0x0002
 #define USB_DEVICE_ID_BTC_8193		0x0002
 
 
+#define USB_VENDOR_ID_FORMOSA          0x147a
+#define USB_DEVICE_ID_FORMOSA_IR_RECEIVER      0xe03e
+
 #define USB_VENDOR_ID_FREESCALE		0x15A2
 #define USB_VENDOR_ID_FREESCALE		0x15A2
 #define USB_DEVICE_ID_FREESCALE_MX28	0x004F
 #define USB_DEVICE_ID_FREESCALE_MX28	0x004F
 
 

+ 12 - 1
drivers/hid/i2c-hid/i2c-hid.c

@@ -540,13 +540,24 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
 {
 {
 	struct i2c_client *client = hid->driver_data;
 	struct i2c_client *client = hid->driver_data;
 	int report_id = buf[0];
 	int report_id = buf[0];
+	int ret;
 
 
 	if (report_type == HID_INPUT_REPORT)
 	if (report_type == HID_INPUT_REPORT)
 		return -EINVAL;
 		return -EINVAL;
 
 
-	return i2c_hid_set_report(client,
+	if (report_id) {
+		buf++;
+		count--;
+	}
+
+	ret = i2c_hid_set_report(client,
 				report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
 				report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
 				report_id, buf, count);
 				report_id, buf, count);
+
+	if (report_id && ret >= 0)
+		ret++; /* add report_id to the number of transfered bytes */
+
+	return ret;
 }
 }
 
 
 static int i2c_hid_parse(struct hid_device *hid)
 static int i2c_hid_parse(struct hid_device *hid)

+ 1 - 0
drivers/hid/usbhid/hid-quirks.c

@@ -70,6 +70,7 @@ static const struct hid_blacklist {
 	{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
+	{ USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS },
 	{ USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
 	{ USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },
 	{ USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },

+ 34 - 0
drivers/iommu/amd_iommu_init.c

@@ -974,6 +974,38 @@ static void __init free_iommu_all(void)
 	}
 	}
 }
 }
 
 
+/*
+ * Family15h Model 10h-1fh erratum 746 (IOMMU Logging May Stall Translations)
+ * Workaround:
+ *     BIOS should disable L2B micellaneous clock gating by setting
+ *     L2_L2B_CK_GATE_CONTROL[CKGateL2BMiscDisable](D0F2xF4_x90[2]) = 1b
+ */
+static void __init amd_iommu_erratum_746_workaround(struct amd_iommu *iommu)
+{
+	u32 value;
+
+	if ((boot_cpu_data.x86 != 0x15) ||
+	    (boot_cpu_data.x86_model < 0x10) ||
+	    (boot_cpu_data.x86_model > 0x1f))
+		return;
+
+	pci_write_config_dword(iommu->dev, 0xf0, 0x90);
+	pci_read_config_dword(iommu->dev, 0xf4, &value);
+
+	if (value & BIT(2))
+		return;
+
+	/* Select NB indirect register 0x90 and enable writing */
+	pci_write_config_dword(iommu->dev, 0xf0, 0x90 | (1 << 8));
+
+	pci_write_config_dword(iommu->dev, 0xf4, value | 0x4);
+	pr_info("AMD-Vi: Applying erratum 746 workaround for IOMMU at %s\n",
+		dev_name(&iommu->dev->dev));
+
+	/* Clear the enable writing bit */
+	pci_write_config_dword(iommu->dev, 0xf0, 0x90);
+}
+
 /*
 /*
  * This function clues the initialization function for one IOMMU
  * This function clues the initialization function for one IOMMU
  * together and also allocates the command buffer and programs the
  * together and also allocates the command buffer and programs the
@@ -1172,6 +1204,8 @@ static int iommu_init_pci(struct amd_iommu *iommu)
 			iommu->stored_l2[i] = iommu_read_l2(iommu, i);
 			iommu->stored_l2[i] = iommu_read_l2(iommu, i);
 	}
 	}
 
 
+	amd_iommu_erratum_746_workaround(iommu);
+
 	return pci_enable_device(iommu->dev);
 	return pci_enable_device(iommu->dev);
 }
 }
 
 

+ 15 - 6
drivers/iommu/intel-iommu.c

@@ -4234,6 +4234,21 @@ static struct iommu_ops intel_iommu_ops = {
 	.pgsize_bitmap	= INTEL_IOMMU_PGSIZES,
 	.pgsize_bitmap	= INTEL_IOMMU_PGSIZES,
 };
 };
 
 
+static void quirk_iommu_g4x_gfx(struct pci_dev *dev)
+{
+	/* G4x/GM45 integrated gfx dmar support is totally busted. */
+	printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n");
+	dmar_map_gfx = 0;
+}
+
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_g4x_gfx);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e00, quirk_iommu_g4x_gfx);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e10, quirk_iommu_g4x_gfx);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e20, quirk_iommu_g4x_gfx);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e30, quirk_iommu_g4x_gfx);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e40, quirk_iommu_g4x_gfx);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e90, quirk_iommu_g4x_gfx);
+
 static void quirk_iommu_rwbf(struct pci_dev *dev)
 static void quirk_iommu_rwbf(struct pci_dev *dev)
 {
 {
 	/*
 	/*
@@ -4242,12 +4257,6 @@ static void quirk_iommu_rwbf(struct pci_dev *dev)
 	 */
 	 */
 	printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
 	printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
 	rwbf_quirk = 1;
 	rwbf_quirk = 1;
-
-	/* https://bugzilla.redhat.com/show_bug.cgi?id=538163 */
-	if (dev->revision == 0x07) {
-		printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n");
-		dmar_map_gfx = 0;
-	}
 }
 }
 
 
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);

+ 2 - 0
drivers/isdn/gigaset/capi.c

@@ -248,6 +248,8 @@ static inline void dump_rawmsg(enum debuglevel level, const char *tag,
 		CAPIMSG_APPID(data), CAPIMSG_MSGID(data), l,
 		CAPIMSG_APPID(data), CAPIMSG_MSGID(data), l,
 		CAPIMSG_CONTROL(data));
 		CAPIMSG_CONTROL(data));
 	l -= 12;
 	l -= 12;
+	if (l <= 0)
+		return;
 	dbgline = kmalloc(3 * l, GFP_ATOMIC);
 	dbgline = kmalloc(3 * l, GFP_ATOMIC);
 	if (!dbgline)
 	if (!dbgline)
 		return;
 		return;

+ 37 - 64
drivers/md/dm-raid.c

@@ -340,24 +340,22 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size)
 }
 }
 
 
 /*
 /*
- * validate_rebuild_devices
+ * validate_raid_redundancy
  * @rs
  * @rs
  *
  *
- * Determine if the devices specified for rebuild can result in a valid
- * usable array that is capable of rebuilding the given devices.
+ * Determine if there are enough devices in the array that haven't
+ * failed (or are being rebuilt) to form a usable array.
  *
  *
  * Returns: 0 on success, -EINVAL on failure.
  * Returns: 0 on success, -EINVAL on failure.
  */
  */
-static int validate_rebuild_devices(struct raid_set *rs)
+static int validate_raid_redundancy(struct raid_set *rs)
 {
 {
 	unsigned i, rebuild_cnt = 0;
 	unsigned i, rebuild_cnt = 0;
 	unsigned rebuilds_per_group, copies, d;
 	unsigned rebuilds_per_group, copies, d;
 
 
-	if (!(rs->print_flags & DMPF_REBUILD))
-		return 0;
-
 	for (i = 0; i < rs->md.raid_disks; i++)
 	for (i = 0; i < rs->md.raid_disks; i++)
-		if (!test_bit(In_sync, &rs->dev[i].rdev.flags))
+		if (!test_bit(In_sync, &rs->dev[i].rdev.flags) ||
+		    !rs->dev[i].rdev.sb_page)
 			rebuild_cnt++;
 			rebuild_cnt++;
 
 
 	switch (rs->raid_type->level) {
 	switch (rs->raid_type->level) {
@@ -393,27 +391,24 @@ static int validate_rebuild_devices(struct raid_set *rs)
 		 *          A    A    B    B    C
 		 *          A    A    B    B    C
 		 *          C    D    D    E    E
 		 *          C    D    D    E    E
 		 */
 		 */
-		rebuilds_per_group = 0;
 		for (i = 0; i < rs->md.raid_disks * copies; i++) {
 		for (i = 0; i < rs->md.raid_disks * copies; i++) {
+			if (!(i % copies))
+				rebuilds_per_group = 0;
 			d = i % rs->md.raid_disks;
 			d = i % rs->md.raid_disks;
-			if (!test_bit(In_sync, &rs->dev[d].rdev.flags) &&
+			if ((!rs->dev[d].rdev.sb_page ||
+			     !test_bit(In_sync, &rs->dev[d].rdev.flags)) &&
 			    (++rebuilds_per_group >= copies))
 			    (++rebuilds_per_group >= copies))
 				goto too_many;
 				goto too_many;
-			if (!((i + 1) % copies))
-				rebuilds_per_group = 0;
 		}
 		}
 		break;
 		break;
 	default:
 	default:
-		DMERR("The rebuild parameter is not supported for %s",
-		      rs->raid_type->name);
-		rs->ti->error = "Rebuild not supported for this RAID type";
-		return -EINVAL;
+		if (rebuild_cnt)
+			return -EINVAL;
 	}
 	}
 
 
 	return 0;
 	return 0;
 
 
 too_many:
 too_many:
-	rs->ti->error = "Too many rebuild devices specified";
 	return -EINVAL;
 	return -EINVAL;
 }
 }
 
 
@@ -664,9 +659,6 @@ static int parse_raid_params(struct raid_set *rs, char **argv,
 	}
 	}
 	rs->md.dev_sectors = sectors_per_dev;
 	rs->md.dev_sectors = sectors_per_dev;
 
 
-	if (validate_rebuild_devices(rs))
-		return -EINVAL;
-
 	/* Assume there are no metadata devices until the drives are parsed */
 	/* Assume there are no metadata devices until the drives are parsed */
 	rs->md.persistent = 0;
 	rs->md.persistent = 0;
 	rs->md.external = 1;
 	rs->md.external = 1;
@@ -995,28 +987,10 @@ static int super_validate(struct mddev *mddev, struct md_rdev *rdev)
 static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
 static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
 {
 {
 	int ret;
 	int ret;
-	unsigned redundancy = 0;
 	struct raid_dev *dev;
 	struct raid_dev *dev;
 	struct md_rdev *rdev, *tmp, *freshest;
 	struct md_rdev *rdev, *tmp, *freshest;
 	struct mddev *mddev = &rs->md;
 	struct mddev *mddev = &rs->md;
 
 
-	switch (rs->raid_type->level) {
-	case 1:
-		redundancy = rs->md.raid_disks - 1;
-		break;
-	case 4:
-	case 5:
-	case 6:
-		redundancy = rs->raid_type->parity_devs;
-		break;
-	case 10:
-		redundancy = raid10_md_layout_to_copies(mddev->layout) - 1;
-		break;
-	default:
-		ti->error = "Unknown RAID type";
-		return -EINVAL;
-	}
-
 	freshest = NULL;
 	freshest = NULL;
 	rdev_for_each_safe(rdev, tmp, mddev) {
 	rdev_for_each_safe(rdev, tmp, mddev) {
 		/*
 		/*
@@ -1045,44 +1019,43 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
 			break;
 			break;
 		default:
 		default:
 			dev = container_of(rdev, struct raid_dev, rdev);
 			dev = container_of(rdev, struct raid_dev, rdev);
-			if (redundancy--) {
-				if (dev->meta_dev)
-					dm_put_device(ti, dev->meta_dev);
-
-				dev->meta_dev = NULL;
-				rdev->meta_bdev = NULL;
+			if (dev->meta_dev)
+				dm_put_device(ti, dev->meta_dev);
 
 
-				if (rdev->sb_page)
-					put_page(rdev->sb_page);
+			dev->meta_dev = NULL;
+			rdev->meta_bdev = NULL;
 
 
-				rdev->sb_page = NULL;
+			if (rdev->sb_page)
+				put_page(rdev->sb_page);
 
 
-				rdev->sb_loaded = 0;
+			rdev->sb_page = NULL;
 
 
-				/*
-				 * We might be able to salvage the data device
-				 * even though the meta device has failed.  For
-				 * now, we behave as though '- -' had been
-				 * set for this device in the table.
-				 */
-				if (dev->data_dev)
-					dm_put_device(ti, dev->data_dev);
+			rdev->sb_loaded = 0;
 
 
-				dev->data_dev = NULL;
-				rdev->bdev = NULL;
+			/*
+			 * We might be able to salvage the data device
+			 * even though the meta device has failed.  For
+			 * now, we behave as though '- -' had been
+			 * set for this device in the table.
+			 */
+			if (dev->data_dev)
+				dm_put_device(ti, dev->data_dev);
 
 
-				list_del(&rdev->same_set);
+			dev->data_dev = NULL;
+			rdev->bdev = NULL;
 
 
-				continue;
-			}
-			ti->error = "Failed to load superblock";
-			return ret;
+			list_del(&rdev->same_set);
 		}
 		}
 	}
 	}
 
 
 	if (!freshest)
 	if (!freshest)
 		return 0;
 		return 0;
 
 
+	if (validate_raid_redundancy(rs)) {
+		rs->ti->error = "Insufficient redundancy to activate array";
+		return -EINVAL;
+	}
+
 	/*
 	/*
 	 * Validation of the freshest device provides the source of
 	 * Validation of the freshest device provides the source of
 	 * validation for the remaining devices.
 	 * validation for the remaining devices.
@@ -1432,7 +1405,7 @@ static void raid_resume(struct dm_target *ti)
 
 
 static struct target_type raid_target = {
 static struct target_type raid_target = {
 	.name = "raid",
 	.name = "raid",
-	.version = {1, 4, 0},
+	.version = {1, 4, 1},
 	.module = THIS_MODULE,
 	.module = THIS_MODULE,
 	.ctr = raid_ctr,
 	.ctr = raid_ctr,
 	.dtr = raid_dtr,
 	.dtr = raid_dtr,

+ 1 - 12
drivers/md/dm-thin.c

@@ -2746,19 +2746,9 @@ static int thin_iterate_devices(struct dm_target *ti,
 	return 0;
 	return 0;
 }
 }
 
 
-/*
- * A thin device always inherits its queue limits from its pool.
- */
-static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits)
-{
-	struct thin_c *tc = ti->private;
-
-	*limits = bdev_get_queue(tc->pool_dev->bdev)->limits;
-}
-
 static struct target_type thin_target = {
 static struct target_type thin_target = {
 	.name = "thin",
 	.name = "thin",
-	.version = {1, 6, 0},
+	.version = {1, 7, 0},
 	.module	= THIS_MODULE,
 	.module	= THIS_MODULE,
 	.ctr = thin_ctr,
 	.ctr = thin_ctr,
 	.dtr = thin_dtr,
 	.dtr = thin_dtr,
@@ -2767,7 +2757,6 @@ static struct target_type thin_target = {
 	.postsuspend = thin_postsuspend,
 	.postsuspend = thin_postsuspend,
 	.status = thin_status,
 	.status = thin_status,
 	.iterate_devices = thin_iterate_devices,
 	.iterate_devices = thin_iterate_devices,
-	.io_hints = thin_io_hints,
 };
 };
 
 
 /*----------------------------------------------------------------*/
 /*----------------------------------------------------------------*/

+ 4 - 2
drivers/md/dm.c

@@ -1188,6 +1188,7 @@ static int __clone_and_map_changing_extent_only(struct clone_info *ci,
 {
 {
 	struct dm_target *ti;
 	struct dm_target *ti;
 	sector_t len;
 	sector_t len;
+	unsigned num_requests;
 
 
 	do {
 	do {
 		ti = dm_table_find_target(ci->map, ci->sector);
 		ti = dm_table_find_target(ci->map, ci->sector);
@@ -1200,7 +1201,8 @@ static int __clone_and_map_changing_extent_only(struct clone_info *ci,
 		 * reconfiguration might also have changed that since the
 		 * reconfiguration might also have changed that since the
 		 * check was performed.
 		 * check was performed.
 		 */
 		 */
-		if (!get_num_requests || !get_num_requests(ti))
+		num_requests = get_num_requests ? get_num_requests(ti) : 0;
+		if (!num_requests)
 			return -EOPNOTSUPP;
 			return -EOPNOTSUPP;
 
 
 		if (is_split_required && !is_split_required(ti))
 		if (is_split_required && !is_split_required(ti))
@@ -1208,7 +1210,7 @@ static int __clone_and_map_changing_extent_only(struct clone_info *ci,
 		else
 		else
 			len = min(ci->sector_count, max_io_len(ci->sector, ti));
 			len = min(ci->sector_count, max_io_len(ci->sector, ti));
 
 
-		__issue_target_requests(ci, ti, ti->num_discard_requests, len);
+		__issue_target_requests(ci, ti, num_requests, len);
 
 
 		ci->sector += len;
 		ci->sector += len;
 	} while (ci->sector_count -= len);
 	} while (ci->sector_count -= len);

+ 1 - 0
drivers/mfd/Kconfig

@@ -237,6 +237,7 @@ config MFD_TPS65910
 	depends on I2C=y && GPIOLIB
 	depends on I2C=y && GPIOLIB
 	select MFD_CORE
 	select MFD_CORE
 	select REGMAP_I2C
 	select REGMAP_I2C
+	select REGMAP_IRQ
 	select IRQ_DOMAIN
 	select IRQ_DOMAIN
 	help
 	help
 	  if you say yes here you get support for the TPS65910 series of
 	  if you say yes here you get support for the TPS65910 series of

+ 1 - 0
drivers/mfd/ab8500-core.c

@@ -19,6 +19,7 @@
 #include <linux/mfd/core.h>
 #include <linux/mfd/core.h>
 #include <linux/mfd/abx500.h>
 #include <linux/mfd/abx500.h>
 #include <linux/mfd/abx500/ab8500.h>
 #include <linux/mfd/abx500/ab8500.h>
+#include <linux/mfd/abx500/ab8500-bm.h>
 #include <linux/mfd/dbx500-prcmu.h>
 #include <linux/mfd/dbx500-prcmu.h>
 #include <linux/regulator/ab8500.h>
 #include <linux/regulator/ab8500.h>
 #include <linux/of.h>
 #include <linux/of.h>

+ 6 - 1
drivers/mfd/arizona-core.c

@@ -239,7 +239,12 @@ static int arizona_runtime_resume(struct device *dev)
 		return ret;
 		return ret;
 	}
 	}
 
 
-	regcache_sync(arizona->regmap);
+	ret = regcache_sync(arizona->regmap);
+	if (ret != 0) {
+		dev_err(arizona->dev, "Failed to restore register cache\n");
+		regulator_disable(arizona->dcvdd);
+		return ret;
+	}
 
 
 	return 0;
 	return 0;
 }
 }

+ 2 - 16
drivers/mfd/arizona-irq.c

@@ -176,14 +176,7 @@ int arizona_irq_init(struct arizona *arizona)
 		aod = &wm5102_aod;
 		aod = &wm5102_aod;
 		irq = &wm5102_irq;
 		irq = &wm5102_irq;
 
 
-		switch (arizona->rev) {
-		case 0:
-		case 1:
-			ctrlif_error = false;
-			break;
-		default:
-			break;
-		}
+		ctrlif_error = false;
 		break;
 		break;
 #endif
 #endif
 #ifdef CONFIG_MFD_WM5110
 #ifdef CONFIG_MFD_WM5110
@@ -191,14 +184,7 @@ int arizona_irq_init(struct arizona *arizona)
 		aod = &wm5110_aod;
 		aod = &wm5110_aod;
 		irq = &wm5110_irq;
 		irq = &wm5110_irq;
 
 
-		switch (arizona->rev) {
-		case 0:
-		case 1:
-			ctrlif_error = false;
-			break;
-		default:
-			break;
-		}
+		ctrlif_error = false;
 		break;
 		break;
 #endif
 #endif
 	default:
 	default:

+ 61 - 0
drivers/mfd/da9052-i2c.c

@@ -27,6 +27,66 @@
 #include <linux/of_device.h>
 #include <linux/of_device.h>
 #endif
 #endif
 
 
+/* I2C safe register check */
+static inline bool i2c_safe_reg(unsigned char reg)
+{
+	switch (reg) {
+	case DA9052_STATUS_A_REG:
+	case DA9052_STATUS_B_REG:
+	case DA9052_STATUS_C_REG:
+	case DA9052_STATUS_D_REG:
+	case DA9052_ADC_RES_L_REG:
+	case DA9052_ADC_RES_H_REG:
+	case DA9052_VDD_RES_REG:
+	case DA9052_ICHG_AV_REG:
+	case DA9052_TBAT_RES_REG:
+	case DA9052_ADCIN4_RES_REG:
+	case DA9052_ADCIN5_RES_REG:
+	case DA9052_ADCIN6_RES_REG:
+	case DA9052_TJUNC_RES_REG:
+	case DA9052_TSI_X_MSB_REG:
+	case DA9052_TSI_Y_MSB_REG:
+	case DA9052_TSI_LSB_REG:
+	case DA9052_TSI_Z_MSB_REG:
+		return true;
+	default:
+		return false;
+	}
+}
+
+/*
+ * There is an issue with DA9052 and DA9053_AA/BA/BB PMIC where the PMIC
+ * gets lockup up or fails to respond following a system reset.
+ * This fix is to follow any read or write with a dummy read to a safe
+ * register.
+ */
+int da9052_i2c_fix(struct da9052 *da9052, unsigned char reg)
+{
+	int val;
+
+	switch (da9052->chip_id) {
+	case DA9052:
+	case DA9053_AA:
+	case DA9053_BA:
+	case DA9053_BB:
+		/* A dummy read to a safe register address. */
+	if (!i2c_safe_reg(reg))
+			return regmap_read(da9052->regmap,
+					   DA9052_PARK_REGISTER,
+					   &val);
+		break;
+	default:
+		/*
+		 * For other chips parking of I2C register
+		 * to a safe place is not required.
+		 */
+		break;
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL(da9052_i2c_fix);
+
 static int da9052_i2c_enable_multiwrite(struct da9052 *da9052)
 static int da9052_i2c_enable_multiwrite(struct da9052 *da9052)
 {
 {
 	int reg_val, ret;
 	int reg_val, ret;
@@ -83,6 +143,7 @@ static int da9052_i2c_probe(struct i2c_client *client,
 
 
 	da9052->dev = &client->dev;
 	da9052->dev = &client->dev;
 	da9052->chip_irq = client->irq;
 	da9052->chip_irq = client->irq;
+	da9052->fix_io = da9052_i2c_fix;
 
 
 	i2c_set_clientdata(client, da9052);
 	i2c_set_clientdata(client, da9052);
 
 

+ 9 - 4
drivers/mfd/db8500-prcmu.c

@@ -2524,7 +2524,7 @@ static bool read_mailbox_0(void)
 
 
 		for (n = 0; n < NUM_PRCMU_WAKEUPS; n++) {
 		for (n = 0; n < NUM_PRCMU_WAKEUPS; n++) {
 			if (ev & prcmu_irq_bit[n])
 			if (ev & prcmu_irq_bit[n])
-				generic_handle_irq(IRQ_PRCMU_BASE + n);
+				generic_handle_irq(irq_find_mapping(db8500_irq_domain, n));
 		}
 		}
 		r = true;
 		r = true;
 		break;
 		break;
@@ -2737,13 +2737,14 @@ static int db8500_irq_map(struct irq_domain *d, unsigned int virq,
 }
 }
 
 
 static struct irq_domain_ops db8500_irq_ops = {
 static struct irq_domain_ops db8500_irq_ops = {
-        .map    = db8500_irq_map,
-        .xlate  = irq_domain_xlate_twocell,
+	.map    = db8500_irq_map,
+	.xlate  = irq_domain_xlate_twocell,
 };
 };
 
 
 static int db8500_irq_init(struct device_node *np)
 static int db8500_irq_init(struct device_node *np)
 {
 {
-	int irq_base = -1;
+	int irq_base = 0;
+	int i;
 
 
 	/* In the device tree case, just take some IRQs */
 	/* In the device tree case, just take some IRQs */
 	if (!np)
 	if (!np)
@@ -2758,6 +2759,10 @@ static int db8500_irq_init(struct device_node *np)
 		return -ENOSYS;
 		return -ENOSYS;
 	}
 	}
 
 
+	/* All wakeups will be used, so create mappings for all */
+	for (i = 0; i < NUM_PRCMU_WAKEUPS; i++)
+		irq_create_mapping(db8500_irq_domain, i);
+
 	return 0;
 	return 0;
 }
 }
 
 

+ 9 - 9
drivers/mfd/max77686.c

@@ -93,15 +93,6 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
 	if (max77686 == NULL)
 	if (max77686 == NULL)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	max77686->regmap = regmap_init_i2c(i2c, &max77686_regmap_config);
-	if (IS_ERR(max77686->regmap)) {
-		ret = PTR_ERR(max77686->regmap);
-		dev_err(max77686->dev, "Failed to allocate register map: %d\n",
-				ret);
-		kfree(max77686);
-		return ret;
-	}
-
 	i2c_set_clientdata(i2c, max77686);
 	i2c_set_clientdata(i2c, max77686);
 	max77686->dev = &i2c->dev;
 	max77686->dev = &i2c->dev;
 	max77686->i2c = i2c;
 	max77686->i2c = i2c;
@@ -111,6 +102,15 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
 	max77686->irq_gpio = pdata->irq_gpio;
 	max77686->irq_gpio = pdata->irq_gpio;
 	max77686->irq = i2c->irq;
 	max77686->irq = i2c->irq;
 
 
+	max77686->regmap = regmap_init_i2c(i2c, &max77686_regmap_config);
+	if (IS_ERR(max77686->regmap)) {
+		ret = PTR_ERR(max77686->regmap);
+		dev_err(max77686->dev, "Failed to allocate register map: %d\n",
+				ret);
+		kfree(max77686);
+		return ret;
+	}
+
 	if (regmap_read(max77686->regmap,
 	if (regmap_read(max77686->regmap,
 			 MAX77686_REG_DEVICE_ID, &data) < 0) {
 			 MAX77686_REG_DEVICE_ID, &data) < 0) {
 		dev_err(max77686->dev,
 		dev_err(max77686->dev,

+ 18 - 16
drivers/mfd/max77693.c

@@ -114,35 +114,37 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
 	u8 reg_data;
 	u8 reg_data;
 	int ret = 0;
 	int ret = 0;
 
 
+	if (!pdata) {
+		dev_err(&i2c->dev, "No platform data found.\n");
+		return -EINVAL;
+	}
+
 	max77693 = devm_kzalloc(&i2c->dev,
 	max77693 = devm_kzalloc(&i2c->dev,
 			sizeof(struct max77693_dev), GFP_KERNEL);
 			sizeof(struct max77693_dev), GFP_KERNEL);
 	if (max77693 == NULL)
 	if (max77693 == NULL)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	max77693->regmap = devm_regmap_init_i2c(i2c, &max77693_regmap_config);
-	if (IS_ERR(max77693->regmap)) {
-		ret = PTR_ERR(max77693->regmap);
-		dev_err(max77693->dev,"failed to allocate register map: %d\n",
-				ret);
-		goto err_regmap;
-	}
-
 	i2c_set_clientdata(i2c, max77693);
 	i2c_set_clientdata(i2c, max77693);
 	max77693->dev = &i2c->dev;
 	max77693->dev = &i2c->dev;
 	max77693->i2c = i2c;
 	max77693->i2c = i2c;
 	max77693->irq = i2c->irq;
 	max77693->irq = i2c->irq;
 	max77693->type = id->driver_data;
 	max77693->type = id->driver_data;
 
 
-	if (!pdata)
-		goto err_regmap;
+	max77693->regmap = devm_regmap_init_i2c(i2c, &max77693_regmap_config);
+	if (IS_ERR(max77693->regmap)) {
+		ret = PTR_ERR(max77693->regmap);
+		dev_err(max77693->dev, "failed to allocate register map: %d\n",
+				ret);
+		return ret;
+	}
 
 
 	max77693->wakeup = pdata->wakeup;
 	max77693->wakeup = pdata->wakeup;
 
 
-	if (max77693_read_reg(max77693->regmap,
-				MAX77693_PMIC_REG_PMIC_ID2, &reg_data) < 0) {
+	ret = max77693_read_reg(max77693->regmap, MAX77693_PMIC_REG_PMIC_ID2,
+				&reg_data);
+	if (ret < 0) {
 		dev_err(max77693->dev, "device not found on this channel\n");
 		dev_err(max77693->dev, "device not found on this channel\n");
-		ret = -ENODEV;
-		goto err_regmap;
+		return ret;
 	} else
 	} else
 		dev_info(max77693->dev, "device ID: 0x%x\n", reg_data);
 		dev_info(max77693->dev, "device ID: 0x%x\n", reg_data);
 
 
@@ -163,7 +165,7 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
 		ret = PTR_ERR(max77693->regmap_muic);
 		ret = PTR_ERR(max77693->regmap_muic);
 		dev_err(max77693->dev,
 		dev_err(max77693->dev,
 			"failed to allocate register map: %d\n", ret);
 			"failed to allocate register map: %d\n", ret);
-		goto err_regmap;
+		goto err_regmap_muic;
 	}
 	}
 
 
 	ret = max77693_irq_init(max77693);
 	ret = max77693_irq_init(max77693);
@@ -184,9 +186,9 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
 err_mfd:
 err_mfd:
 	max77693_irq_exit(max77693);
 	max77693_irq_exit(max77693);
 err_irq:
 err_irq:
+err_regmap_muic:
 	i2c_unregister_device(max77693->muic);
 	i2c_unregister_device(max77693->muic);
 	i2c_unregister_device(max77693->haptic);
 	i2c_unregister_device(max77693->haptic);
-err_regmap:
 	return ret;
 	return ret;
 }
 }
 
 

+ 2 - 3
drivers/mfd/pcf50633-core.c

@@ -208,6 +208,8 @@ static int pcf50633_probe(struct i2c_client *client,
 	if (!pcf)
 	if (!pcf)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
+	i2c_set_clientdata(client, pcf);
+	pcf->dev = &client->dev;
 	pcf->pdata = pdata;
 	pcf->pdata = pdata;
 
 
 	mutex_init(&pcf->lock);
 	mutex_init(&pcf->lock);
@@ -219,9 +221,6 @@ static int pcf50633_probe(struct i2c_client *client,
 		return ret;
 		return ret;
 	}
 	}
 
 
-	i2c_set_clientdata(client, pcf);
-	pcf->dev = &client->dev;
-
 	version = pcf50633_reg_read(pcf, 0);
 	version = pcf50633_reg_read(pcf, 0);
 	variant = pcf50633_reg_read(pcf, 1);
 	variant = pcf50633_reg_read(pcf, 1);
 	if (version < 0 || variant < 0) {
 	if (version < 0 || variant < 0) {

+ 29 - 0
drivers/mfd/rtl8411.c

@@ -112,6 +112,21 @@ static int rtl8411_card_power_off(struct rtsx_pcr *pcr, int card)
 			BPP_LDO_POWB, BPP_LDO_SUSPEND);
 			BPP_LDO_POWB, BPP_LDO_SUSPEND);
 }
 }
 
 
+static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage)
+{
+	u8 mask, val;
+
+	mask = (BPP_REG_TUNED18 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_MASK;
+	if (voltage == OUTPUT_3V3)
+		val = (BPP_ASIC_3V3 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_3V3;
+	else if (voltage == OUTPUT_1V8)
+		val = (BPP_ASIC_1V8 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_1V8;
+	else
+		return -EINVAL;
+
+	return rtsx_pci_write_register(pcr, LDO_CTL, mask, val);
+}
+
 static unsigned int rtl8411_cd_deglitch(struct rtsx_pcr *pcr)
 static unsigned int rtl8411_cd_deglitch(struct rtsx_pcr *pcr)
 {
 {
 	unsigned int card_exist;
 	unsigned int card_exist;
@@ -163,6 +178,18 @@ static unsigned int rtl8411_cd_deglitch(struct rtsx_pcr *pcr)
 	return card_exist;
 	return card_exist;
 }
 }
 
 
+static int rtl8411_conv_clk_and_div_n(int input, int dir)
+{
+	int output;
+
+	if (dir == CLK_TO_DIV_N)
+		output = input * 4 / 5 - 2;
+	else
+		output = (input + 2) * 5 / 4;
+
+	return output;
+}
+
 static const struct pcr_ops rtl8411_pcr_ops = {
 static const struct pcr_ops rtl8411_pcr_ops = {
 	.extra_init_hw = rtl8411_extra_init_hw,
 	.extra_init_hw = rtl8411_extra_init_hw,
 	.optimize_phy = NULL,
 	.optimize_phy = NULL,
@@ -172,7 +199,9 @@ static const struct pcr_ops rtl8411_pcr_ops = {
 	.disable_auto_blink = rtl8411_disable_auto_blink,
 	.disable_auto_blink = rtl8411_disable_auto_blink,
 	.card_power_on = rtl8411_card_power_on,
 	.card_power_on = rtl8411_card_power_on,
 	.card_power_off = rtl8411_card_power_off,
 	.card_power_off = rtl8411_card_power_off,
+	.switch_output_voltage = rtl8411_switch_output_voltage,
 	.cd_deglitch = rtl8411_cd_deglitch,
 	.cd_deglitch = rtl8411_cd_deglitch,
+	.conv_clk_and_div_n = rtl8411_conv_clk_and_div_n,
 };
 };
 
 
 /* SD Pull Control Enable:
 /* SD Pull Control Enable:

+ 21 - 0
drivers/mfd/rts5209.c

@@ -144,6 +144,25 @@ static int rts5209_card_power_off(struct rtsx_pcr *pcr, int card)
 	return rtsx_pci_send_cmd(pcr, 100);
 	return rtsx_pci_send_cmd(pcr, 100);
 }
 }
 
 
+static int rts5209_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage)
+{
+	int err;
+
+	if (voltage == OUTPUT_3V3) {
+		err = rtsx_pci_write_phy_register(pcr, 0x08, 0x4FC0 | 0x24);
+		if (err < 0)
+			return err;
+	} else if (voltage == OUTPUT_1V8) {
+		err = rtsx_pci_write_phy_register(pcr, 0x08, 0x4C40 | 0x24);
+		if (err < 0)
+			return err;
+	} else {
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 static const struct pcr_ops rts5209_pcr_ops = {
 static const struct pcr_ops rts5209_pcr_ops = {
 	.extra_init_hw = rts5209_extra_init_hw,
 	.extra_init_hw = rts5209_extra_init_hw,
 	.optimize_phy = rts5209_optimize_phy,
 	.optimize_phy = rts5209_optimize_phy,
@@ -153,7 +172,9 @@ static const struct pcr_ops rts5209_pcr_ops = {
 	.disable_auto_blink = rts5209_disable_auto_blink,
 	.disable_auto_blink = rts5209_disable_auto_blink,
 	.card_power_on = rts5209_card_power_on,
 	.card_power_on = rts5209_card_power_on,
 	.card_power_off = rts5209_card_power_off,
 	.card_power_off = rts5209_card_power_off,
+	.switch_output_voltage = rts5209_switch_output_voltage,
 	.cd_deglitch = NULL,
 	.cd_deglitch = NULL,
+	.conv_clk_and_div_n = NULL,
 };
 };
 
 
 /* SD Pull Control Enable:
 /* SD Pull Control Enable:

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