Browse Source

Merge branch 'drm-intel-fixes' into drm-intel-next

Chris Wilson 14 years ago
parent
commit
8d5203ca62
100 changed files with 1045 additions and 373 deletions
  1. 15 1
      Documentation/ABI/testing/sysfs-platform-asus-laptop
  2. 10 0
      Documentation/ABI/testing/sysfs-platform-eeepc-wmi
  3. 4 5
      Documentation/filesystems/vfs.txt
  4. 1 1
      Makefile
  5. 1 1
      arch/arm/Kconfig
  6. 0 5
      arch/arm/boot/Makefile
  7. 2 0
      arch/arm/boot/bootp/init.S
  8. 10 3
      arch/arm/boot/compressed/head.S
  9. 24 16
      arch/arm/common/gic.c
  10. 1 1
      arch/arm/kernel/entry-armv.S
  11. 7 0
      arch/arm/kernel/head.S
  12. 2 0
      arch/arm/kernel/relocate_kernel.S
  13. 1 1
      arch/arm/mach-cns3xxx/pcie.c
  14. 1 0
      arch/arm/mach-realview/headsmp.S
  15. 1 1
      arch/arm/mach-s3c2412/Kconfig
  16. 3 0
      arch/arm/mach-s3c2416/Kconfig
  17. 4 0
      arch/arm/mach-s3c2440/Kconfig
  18. 8 3
      arch/arm/mach-s3c2440/s3c2440.c
  19. 14 0
      arch/arm/mach-s3c2440/s3c2442.c
  20. 1 0
      arch/arm/mach-s3c2443/Kconfig
  21. 2 2
      arch/arm/mach-tegra/include/mach/debug-macro.S
  22. 1 0
      arch/arm/mach-vexpress/headsmp.S
  23. 2 2
      arch/arm/mm/proc-v7.S
  24. 2 1
      arch/arm/plat-iop/time.c
  25. 4 4
      arch/arm/plat-s3c24xx/cpu.c
  26. 0 2
      arch/arm/plat-s3c24xx/gpiolib.c
  27. 6 1
      arch/arm/plat-s3c24xx/include/plat/s3c244x.h
  28. 37 10
      arch/arm/plat-samsung/gpio-config.c
  29. 11 0
      arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h
  30. 1 0
      arch/arm/vfp/vfphw.S
  31. 117 0
      arch/mn10300/include/asm/syscall.h
  32. 2 1
      arch/mn10300/kernel/gdb-io-serial.c
  33. 2 1
      arch/mn10300/kernel/gdb-io-ttysm.c
  34. 2 1
      arch/mn10300/kernel/gdb-stub.c
  35. 2 5
      arch/parisc/kernel/irq.c
  36. 1 8
      arch/parisc/kernel/signal.c
  37. 19 0
      arch/s390/kernel/vtime.c
  38. 4 30
      arch/sh/boards/mach-ecovec24/setup.c
  39. 7 40
      arch/sh/boards/mach-se/7724/setup.c
  40. 1 1
      arch/sh/include/asm/cacheflush.h
  41. 3 0
      arch/sh/include/cpu-sh4/cpu/sh7724.h
  42. 39 5
      arch/sh/kernel/cpu/sh4a/clock-sh7724.c
  43. 2 2
      arch/sh/mm/cache-sh4.c
  44. 1 1
      arch/sh/mm/cache-sh7705.c
  45. 7 7
      arch/sh/mm/cache.c
  46. 1 1
      arch/sh/mm/kmap.c
  47. 1 0
      arch/x86/include/asm/pvclock.h
  48. 5 0
      arch/x86/kernel/pvclock.c
  49. 20 7
      arch/x86/pci/xen.c
  50. 0 4
      arch/x86/xen/enlighten.c
  51. 0 2
      arch/x86/xen/mmu.c
  52. 1 1
      arch/x86/xen/platform-pci-unplug.c
  53. 14 27
      arch/x86/xen/setup.c
  54. 1 0
      arch/x86/xen/suspend.c
  55. 2 0
      arch/x86/xen/time.c
  56. 1 1
      arch/x86/xen/xen-ops.h
  57. 1 0
      drivers/dma/shdma.c
  58. 14 2
      drivers/gpio/cs5535-gpio.c
  59. 1 1
      drivers/gpu/drm/drm_crtc_helper.c
  60. 14 5
      drivers/gpu/drm/drm_irq.c
  61. 0 34
      drivers/gpu/drm/i915/intel_acpi.c
  62. 30 7
      drivers/gpu/drm/i915/intel_dp.c
  63. 8 11
      drivers/gpu/drm/i915/intel_ringbuffer.c
  64. 3 2
      drivers/gpu/drm/i915/intel_ringbuffer.h
  65. 6 3
      drivers/gpu/drm/i915/intel_sdvo.c
  66. 4 2
      drivers/gpu/drm/radeon/r600.c
  67. 2 2
      drivers/gpu/drm/radeon/radeon_device.c
  68. 11 2
      drivers/gpu/drm/radeon/radeon_object.c
  69. 1 0
      drivers/hid/hid-core.c
  70. 1 1
      drivers/hid/hid-egalax.c
  71. 12 9
      drivers/hid/hid-input.c
  72. 2 0
      drivers/hid/hid-tmff.c
  73. 1 2
      drivers/i2c/Kconfig
  74. 1 13
      drivers/i2c/algos/Kconfig
  75. 1 0
      drivers/input/joystick/turbografx.c
  76. 16 0
      drivers/input/keyboard/Kconfig
  77. 1 0
      drivers/input/keyboard/Makefile
  78. 261 0
      drivers/input/keyboard/gpio_keys_polled.c
  79. 2 1
      drivers/input/mouse/synaptics.h
  80. 1 1
      drivers/input/serio/gscps2.c
  81. 9 0
      drivers/input/tablet/wacom_wac.c
  82. 1 0
      drivers/input/touchscreen/usbtouchscreen.c
  83. 41 9
      drivers/leds/Kconfig
  84. 1 0
      drivers/macintosh/Kconfig
  85. 4 4
      drivers/media/common/tuners/Kconfig
  86. 1 4
      drivers/media/dvb/frontends/Kconfig
  87. 1 1
      drivers/media/video/Kconfig
  88. 25 12
      drivers/mtd/ubi/io.c
  89. 4 0
      drivers/mtd/ubi/scan.c
  90. 0 1
      drivers/parisc/dino.c
  91. 1 2
      drivers/parisc/eisa.c
  92. 1 2
      drivers/parisc/gsc.c
  93. 8 0
      drivers/parisc/iosapic.c
  94. 13 4
      drivers/parisc/led.c
  95. 1 2
      drivers/parisc/superio.c
  96. 1 0
      drivers/pcmcia/soc_common.c
  97. 96 1
      drivers/platform/x86/asus-laptop.c
  98. 2 2
      drivers/platform/x86/eeepc-wmi.c
  99. 2 0
      drivers/platform/x86/hp-wmi.c
  100. 8 26
      drivers/platform/x86/ibm_rtl.c

+ 15 - 1
Documentation/ABI/testing/sysfs-platform-asus-laptop

@@ -47,6 +47,20 @@ Date:		January 2007
 KernelVersion:	2.6.20
 KernelVersion:	2.6.20
 Contact:	"Corentin Chary" <corentincj@iksaif.net>
 Contact:	"Corentin Chary" <corentincj@iksaif.net>
 Description:
 Description:
-		Control the bluetooth device. 1 means on, 0 means off.
+		Control the wlan device. 1 means on, 0 means off.
 		This may control the led, the device or both.
 		This may control the led, the device or both.
 Users:		Lapsus
 Users:		Lapsus
+
+What:		/sys/devices/platform/asus_laptop/wimax
+Date:		October 2010
+KernelVersion:	2.6.37
+Contact:	"Corentin Chary" <corentincj@iksaif.net>
+Description:
+		Control the wimax device. 1 means on, 0 means off.
+
+What:		/sys/devices/platform/asus_laptop/wwan
+Date:		October 2010
+KernelVersion:	2.6.37
+Contact:	"Corentin Chary" <corentincj@iksaif.net>
+Description:
+		Control the wwan (3G) device. 1 means on, 0 means off.

+ 10 - 0
Documentation/ABI/testing/sysfs-platform-eeepc-wmi

@@ -0,0 +1,10 @@
+What:		/sys/devices/platform/eeepc-wmi/cpufv
+Date:		Oct 2010
+KernelVersion:	2.6.37
+Contact:	"Corentin Chary" <corentincj@iksaif.net>
+Description:
+		Change CPU clock configuration (write-only).
+		There are three available clock configuration:
+		    * 0 -> Super Performance Mode
+		    * 1 -> High Performance Mode
+		    * 2 -> Power Saving Mode

+ 4 - 5
Documentation/filesystems/vfs.txt

@@ -660,11 +660,10 @@ struct address_space_operations {
   releasepage: releasepage is called on PagePrivate pages to indicate
   releasepage: releasepage is called on PagePrivate pages to indicate
         that the page should be freed if possible.  ->releasepage
         that the page should be freed if possible.  ->releasepage
         should remove any private data from the page and clear the
         should remove any private data from the page and clear the
-        PagePrivate flag.  It may also remove the page from the
-        address_space.  If this fails for some reason, it may indicate
-        failure with a 0 return value.
-	This is used in two distinct though related cases.  The first
-        is when the VM finds a clean page with no active users and
+        PagePrivate flag. If releasepage() fails for some reason, it must
+	indicate failure with a 0 return value.
+	releasepage() is used in two distinct though related cases.  The
+	first is when the VM finds a clean page with no active users and
         wants to make it a free page.  If ->releasepage succeeds, the
         wants to make it a free page.  If ->releasepage succeeds, the
         page will be removed from the address_space and become free.
         page will be removed from the address_space and become free.
 
 

+ 1 - 1
Makefile

@@ -1,7 +1,7 @@
 VERSION = 2
 VERSION = 2
 PATCHLEVEL = 6
 PATCHLEVEL = 6
 SUBLEVEL = 37
 SUBLEVEL = 37
-EXTRAVERSION = -rc4
+EXTRAVERSION = -rc5
 NAME = Flesh-Eating Bats with Fangs
 NAME = Flesh-Eating Bats with Fangs
 
 
 # *DOCUMENTATION*
 # *DOCUMENTATION*

+ 1 - 1
arch/arm/Kconfig

@@ -9,7 +9,7 @@ config ARM
 	select GENERIC_ATOMIC64 if (!CPU_32v6K || !AEABI)
 	select GENERIC_ATOMIC64 if (!CPU_32v6K || !AEABI)
 	select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
 	select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
 	select HAVE_ARCH_KGDB
 	select HAVE_ARCH_KGDB
-	select HAVE_KPROBES if (!XIP_KERNEL)
+	select HAVE_KPROBES if (!XIP_KERNEL && !THUMB2_KERNEL)
 	select HAVE_KRETPROBES if (HAVE_KPROBES)
 	select HAVE_KRETPROBES if (HAVE_KPROBES)
 	select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
 	select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
 	select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL)
 	select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL)

+ 0 - 5
arch/arm/boot/Makefile

@@ -70,12 +70,7 @@ else
 $(obj)/uImage: LOADADDR=$(ZRELADDR)
 $(obj)/uImage: LOADADDR=$(ZRELADDR)
 endif
 endif
 
 
-ifeq ($(CONFIG_THUMB2_KERNEL),y)
-# Set bit 0 to 1 so that "mov pc, rx" switches to Thumb-2 mode
-$(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed -e "s/.$$/1/")
-else
 $(obj)/uImage: STARTADDR=$(LOADADDR)
 $(obj)/uImage: STARTADDR=$(LOADADDR)
-endif
 
 
 $(obj)/uImage:	$(obj)/zImage FORCE
 $(obj)/uImage:	$(obj)/zImage FORCE
 	$(call if_changed,uimage)
 	$(call if_changed,uimage)

+ 2 - 0
arch/arm/boot/bootp/init.S

@@ -73,6 +73,8 @@ move:		ldmia	r4!, {r7 - r10}		@ move 32-bytes at a time
 
 
 		.size	_start, . - _start
 		.size	_start, . - _start
 
 
+		.align
+
 		.type	data,#object
 		.type	data,#object
 data:		.word	initrd_start		@ source initrd address
 data:		.word	initrd_start		@ source initrd address
 		.word	initrd_phys		@ destination initrd address
 		.word	initrd_phys		@ destination initrd address

+ 10 - 3
arch/arm/boot/compressed/head.S

@@ -125,9 +125,13 @@ wait:		mrc	p14, 0, pc, c0, c1, 0
  * sort out different calling conventions
  * sort out different calling conventions
  */
  */
 		.align
 		.align
+		.arm				@ Always enter in ARM state
 start:
 start:
 		.type	start,#function
 		.type	start,#function
-		.rept	8
+ THUMB(		adr	r12, BSYM(1f)	)
+ THUMB(		bx	r12		)
+ THUMB(		.rept	6		)
+ ARM(		.rept	8		)
 		mov	r0, r0
 		mov	r0, r0
 		.endr
 		.endr
 
 
@@ -135,6 +139,7 @@ start:
 		.word	0x016f2818		@ Magic numbers to help the loader
 		.word	0x016f2818		@ Magic numbers to help the loader
 		.word	start			@ absolute load/run zImage address
 		.word	start			@ absolute load/run zImage address
 		.word	_edata			@ zImage end address
 		.word	_edata			@ zImage end address
+ THUMB(		.thumb			)
 1:		mov	r7, r1			@ save architecture ID
 1:		mov	r7, r1			@ save architecture ID
 		mov	r8, r2			@ save atags pointer
 		mov	r8, r2			@ save atags pointer
 
 
@@ -174,7 +179,8 @@ not_angel:
 		ldr	sp, [r0, #28]
 		ldr	sp, [r0, #28]
 #ifdef CONFIG_AUTO_ZRELADDR
 #ifdef CONFIG_AUTO_ZRELADDR
 		@ determine final kernel image address
 		@ determine final kernel image address
-		and	r4, pc, #0xf8000000
+		mov	r4, pc
+		and	r4, r4, #0xf8000000
 		add	r4, r4, #TEXT_OFFSET
 		add	r4, r4, #TEXT_OFFSET
 #else
 #else
 		ldr	r4, =zreladdr
 		ldr	r4, =zreladdr
@@ -445,7 +451,8 @@ __setup_mmu:	sub	r3, r4, #16384		@ Page directory size
  */
  */
 		mov	r1, #0x1e
 		mov	r1, #0x1e
 		orr	r1, r1, #3 << 10
 		orr	r1, r1, #3 << 10
-		mov	r2, pc, lsr #20
+		mov	r2, pc
+		mov	r2, r2, lsr #20
 		orr	r1, r1, r2, lsl #20
 		orr	r1, r1, r2, lsl #20
 		add	r0, r3, r2, lsl #2
 		add	r0, r3, r2, lsl #2
 		str	r1, [r0], #4
 		str	r1, [r0], #4

+ 24 - 16
arch/arm/common/gic.c

@@ -146,9 +146,15 @@ static int gic_set_cpu(unsigned int irq, const struct cpumask *mask_val)
 	unsigned int shift = (irq % 4) * 8;
 	unsigned int shift = (irq % 4) * 8;
 	unsigned int cpu = cpumask_first(mask_val);
 	unsigned int cpu = cpumask_first(mask_val);
 	u32 val;
 	u32 val;
+	struct irq_desc *desc;
 
 
 	spin_lock(&irq_controller_lock);
 	spin_lock(&irq_controller_lock);
-	irq_desc[irq].node = cpu;
+	desc = irq_to_desc(irq);
+	if (desc == NULL) {
+		spin_unlock(&irq_controller_lock);
+		return -EINVAL;
+	}
+	desc->node = cpu;
 	val = readl(reg) & ~(0xff << shift);
 	val = readl(reg) & ~(0xff << shift);
 	val |= 1 << (cpu + shift);
 	val |= 1 << (cpu + shift);
 	writel(val, reg);
 	writel(val, reg);
@@ -210,7 +216,7 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
 void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
 void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
 			  unsigned int irq_start)
 			  unsigned int irq_start)
 {
 {
-	unsigned int max_irq, i;
+	unsigned int gic_irqs, irq_limit, i;
 	u32 cpumask = 1 << smp_processor_id();
 	u32 cpumask = 1 << smp_processor_id();
 
 
 	if (gic_nr >= MAX_GIC_NR)
 	if (gic_nr >= MAX_GIC_NR)
@@ -226,47 +232,49 @@ void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
 
 
 	/*
 	/*
 	 * Find out how many interrupts are supported.
 	 * Find out how many interrupts are supported.
-	 */
-	max_irq = readl(base + GIC_DIST_CTR) & 0x1f;
-	max_irq = (max_irq + 1) * 32;
-
-	/*
 	 * The GIC only supports up to 1020 interrupt sources.
 	 * The GIC only supports up to 1020 interrupt sources.
-	 * Limit this to either the architected maximum, or the
-	 * platform maximum.
 	 */
 	 */
-	if (max_irq > max(1020, NR_IRQS))
-		max_irq = max(1020, NR_IRQS);
+	gic_irqs = readl(base + GIC_DIST_CTR) & 0x1f;
+	gic_irqs = (gic_irqs + 1) * 32;
+	if (gic_irqs > 1020)
+		gic_irqs = 1020;
 
 
 	/*
 	/*
 	 * Set all global interrupts to be level triggered, active low.
 	 * Set all global interrupts to be level triggered, active low.
 	 */
 	 */
-	for (i = 32; i < max_irq; i += 16)
+	for (i = 32; i < gic_irqs; i += 16)
 		writel(0, base + GIC_DIST_CONFIG + i * 4 / 16);
 		writel(0, base + GIC_DIST_CONFIG + i * 4 / 16);
 
 
 	/*
 	/*
 	 * Set all global interrupts to this CPU only.
 	 * Set all global interrupts to this CPU only.
 	 */
 	 */
-	for (i = 32; i < max_irq; i += 4)
+	for (i = 32; i < gic_irqs; i += 4)
 		writel(cpumask, base + GIC_DIST_TARGET + i * 4 / 4);
 		writel(cpumask, base + GIC_DIST_TARGET + i * 4 / 4);
 
 
 	/*
 	/*
 	 * Set priority on all global interrupts.
 	 * Set priority on all global interrupts.
 	 */
 	 */
-	for (i = 32; i < max_irq; i += 4)
+	for (i = 32; i < gic_irqs; i += 4)
 		writel(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4);
 		writel(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4);
 
 
 	/*
 	/*
 	 * Disable all interrupts.  Leave the PPI and SGIs alone
 	 * Disable all interrupts.  Leave the PPI and SGIs alone
 	 * as these enables are banked registers.
 	 * as these enables are banked registers.
 	 */
 	 */
-	for (i = 32; i < max_irq; i += 32)
+	for (i = 32; i < gic_irqs; i += 32)
 		writel(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32);
 		writel(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32);
 
 
+	/*
+	 * Limit number of interrupts registered to the platform maximum
+	 */
+	irq_limit = gic_data[gic_nr].irq_offset + gic_irqs;
+	if (WARN_ON(irq_limit > NR_IRQS))
+		irq_limit = NR_IRQS;
+
 	/*
 	/*
 	 * Setup the Linux IRQ subsystem.
 	 * Setup the Linux IRQ subsystem.
 	 */
 	 */
-	for (i = irq_start; i < gic_data[gic_nr].irq_offset + max_irq; i++) {
+	for (i = irq_start; i < irq_limit; i++) {
 		set_irq_chip(i, &gic_chip);
 		set_irq_chip(i, &gic_chip);
 		set_irq_chip_data(i, &gic_data[gic_nr]);
 		set_irq_chip_data(i, &gic_data[gic_nr]);
 		set_irq_handler(i, handle_level_irq);
 		set_irq_handler(i, handle_level_irq);

+ 1 - 1
arch/arm/kernel/entry-armv.S

@@ -911,7 +911,7 @@ __kuser_cmpxchg:				@ 0xffff0fc0
 	 * A special ghost syscall is used for that (see traps.c).
 	 * A special ghost syscall is used for that (see traps.c).
 	 */
 	 */
 	stmfd	sp!, {r7, lr}
 	stmfd	sp!, {r7, lr}
-	ldr	r7, =1f			@ it's 20 bits
+	ldr	r7, 1f			@ it's 20 bits
 	swi	__ARM_NR_cmpxchg
 	swi	__ARM_NR_cmpxchg
 	ldmfd	sp!, {r7, pc}
 	ldmfd	sp!, {r7, pc}
 1:	.word	__ARM_NR_cmpxchg
 1:	.word	__ARM_NR_cmpxchg

+ 7 - 0
arch/arm/kernel/head.S

@@ -85,9 +85,11 @@ ENTRY(stext)
 	mrc	p15, 0, r9, c0, c0		@ get processor id
 	mrc	p15, 0, r9, c0, c0		@ get processor id
 	bl	__lookup_processor_type		@ r5=procinfo r9=cpuid
 	bl	__lookup_processor_type		@ r5=procinfo r9=cpuid
 	movs	r10, r5				@ invalid processor (r5=0)?
 	movs	r10, r5				@ invalid processor (r5=0)?
+ THUMB( it	eq )		@ force fixup-able long branch encoding
 	beq	__error_p			@ yes, error 'p'
 	beq	__error_p			@ yes, error 'p'
 	bl	__lookup_machine_type		@ r5=machinfo
 	bl	__lookup_machine_type		@ r5=machinfo
 	movs	r8, r5				@ invalid machine (r5=0)?
 	movs	r8, r5				@ invalid machine (r5=0)?
+ THUMB( it	eq )		@ force fixup-able long branch encoding
 	beq	__error_a			@ yes, error 'a'
 	beq	__error_a			@ yes, error 'a'
 	bl	__vet_atags
 	bl	__vet_atags
 #ifdef CONFIG_SMP_ON_UP
 #ifdef CONFIG_SMP_ON_UP
@@ -262,6 +264,7 @@ __create_page_tables:
 	mov	pc, lr
 	mov	pc, lr
 ENDPROC(__create_page_tables)
 ENDPROC(__create_page_tables)
 	.ltorg
 	.ltorg
+	.align
 __enable_mmu_loc:
 __enable_mmu_loc:
 	.long	.
 	.long	.
 	.long	__enable_mmu
 	.long	__enable_mmu
@@ -282,6 +285,7 @@ ENTRY(secondary_startup)
 	bl	__lookup_processor_type
 	bl	__lookup_processor_type
 	movs	r10, r5				@ invalid processor?
 	movs	r10, r5				@ invalid processor?
 	moveq	r0, #'p'			@ yes, error 'p'
 	moveq	r0, #'p'			@ yes, error 'p'
+ THUMB( it	eq )		@ force fixup-able long branch encoding
 	beq	__error_p
 	beq	__error_p
 
 
 	/*
 	/*
@@ -308,6 +312,8 @@ ENTRY(__secondary_switched)
 	b	secondary_start_kernel
 	b	secondary_start_kernel
 ENDPROC(__secondary_switched)
 ENDPROC(__secondary_switched)
 
 
+	.align
+
 	.type	__secondary_data, %object
 	.type	__secondary_data, %object
 __secondary_data:
 __secondary_data:
 	.long	.
 	.long	.
@@ -413,6 +419,7 @@ __fixup_smp_on_up:
 	mov	pc, lr
 	mov	pc, lr
 ENDPROC(__fixup_smp)
 ENDPROC(__fixup_smp)
 
 
+	.align
 1:	.word	.
 1:	.word	.
 	.word	__smpalt_begin
 	.word	__smpalt_begin
 	.word	__smpalt_end
 	.word	__smpalt_end

+ 2 - 0
arch/arm/kernel/relocate_kernel.S

@@ -59,6 +59,8 @@ relocate_new_kernel:
 	ldr r2,kexec_boot_atags
 	ldr r2,kexec_boot_atags
 	mov pc,lr
 	mov pc,lr
 
 
+	.align
+
 	.globl kexec_start_address
 	.globl kexec_start_address
 kexec_start_address:
 kexec_start_address:
 	.long	0x0
 	.long	0x0

+ 1 - 1
arch/arm/mach-cns3xxx/pcie.c

@@ -369,7 +369,7 @@ static int __init cns3xxx_pcie_init(void)
 {
 {
 	int i;
 	int i;
 
 
-	hook_fault_code(16 + 6, cns3xxx_pcie_abort_handler, SIGBUS,
+	hook_fault_code(16 + 6, cns3xxx_pcie_abort_handler, SIGBUS, 0,
 			"imprecise external abort");
 			"imprecise external abort");
 
 
 	for (i = 0; i < ARRAY_SIZE(cns3xxx_pcie); i++) {
 	for (i = 0; i < ARRAY_SIZE(cns3xxx_pcie); i++) {

+ 1 - 0
arch/arm/mach-realview/headsmp.S

@@ -35,5 +35,6 @@ pen:	ldr	r7, [r6]
 	 */
 	 */
 	b	secondary_startup
 	b	secondary_startup
 
 
+	.align
 1:	.long	.
 1:	.long	.
 	.long	pen_release
 	.long	pen_release

+ 1 - 1
arch/arm/mach-s3c2412/Kconfig

@@ -16,7 +16,7 @@ config CPU_S3C2412
 config CPU_S3C2412_ONLY
 config CPU_S3C2412_ONLY
 	bool
 	bool
 	depends on ARCH_S3C2410 && !CPU_S3C2400 && !CPU_S3C2410 && \
 	depends on ARCH_S3C2410 && !CPU_S3C2400 && !CPU_S3C2410 && \
-		   !CPU_2416 && !CPU_S3C2440 && !CPU_S3C2442 && \
+		   !CPU_S3C2416 && !CPU_S3C2440 && !CPU_S3C2442 && \
 		   !CPU_S3C2443 && CPU_S3C2412
 		   !CPU_S3C2443 && CPU_S3C2412
 	default y if CPU_S3C2412
 	default y if CPU_S3C2412
 
 

+ 3 - 0
arch/arm/mach-s3c2416/Kconfig

@@ -35,9 +35,12 @@ menu "S3C2416 Machines"
 config MACH_SMDK2416
 config MACH_SMDK2416
 	bool "SMDK2416"
 	bool "SMDK2416"
 	select CPU_S3C2416
 	select CPU_S3C2416
+	select MACH_SMDK
 	select S3C_DEV_FB
 	select S3C_DEV_FB
 	select S3C_DEV_HSMMC
 	select S3C_DEV_HSMMC
 	select S3C_DEV_HSMMC1
 	select S3C_DEV_HSMMC1
+	select S3C_DEV_NAND
+	select S3C_DEV_USB_HOST
 	select S3C2416_PM if PM
 	select S3C2416_PM if PM
 	help
 	help
 	  Say Y here if you are using an SMDK2416
 	  Say Y here if you are using an SMDK2416

+ 4 - 0
arch/arm/mach-s3c2440/Kconfig

@@ -18,6 +18,7 @@ config CPU_S3C2440
 config CPU_S3C2442
 config CPU_S3C2442
 	bool
 	bool
 	select CPU_ARM920T
 	select CPU_ARM920T
+	select S3C_GPIO_PULL_DOWN
 	select S3C2410_CLOCK
 	select S3C2410_CLOCK
 	select S3C2410_GPIO
 	select S3C2410_GPIO
 	select S3C2410_PM if PM
 	select S3C2410_PM if PM
@@ -178,6 +179,9 @@ config MACH_MINI2440
 	bool "MINI2440 development board"
 	bool "MINI2440 development board"
 	select CPU_S3C2440
 	select CPU_S3C2440
 	select EEPROM_AT24
 	select EEPROM_AT24
+	select NEW_LEDS
+	select LEDS_CLASS
+	select LEDS_TRIGGER
 	select LEDS_TRIGGER_BACKLIGHT
 	select LEDS_TRIGGER_BACKLIGHT
 	select S3C_DEV_NAND
 	select S3C_DEV_NAND
 	select S3C_DEV_USB_HOST
 	select S3C_DEV_USB_HOST

+ 8 - 3
arch/arm/mach-s3c2440/s3c2440.c

@@ -46,9 +46,6 @@ int __init s3c2440_init(void)
 {
 {
 	printk("S3C2440: Initialising architecture\n");
 	printk("S3C2440: Initialising architecture\n");
 
 
-	s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1up;
-	s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1up;
-
 	/* change irq for watchdog */
 	/* change irq for watchdog */
 
 
 	s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
 	s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
@@ -58,3 +55,11 @@ int __init s3c2440_init(void)
 
 
 	return sysdev_register(&s3c2440_sysdev);
 	return sysdev_register(&s3c2440_sysdev);
 }
 }
+
+void __init s3c2440_map_io(void)
+{
+	s3c244x_map_io();
+
+	s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1up;
+	s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1up;
+}

+ 14 - 0
arch/arm/mach-s3c2440/s3c2442.c

@@ -32,6 +32,7 @@
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/ioport.h>
 #include <linux/mutex.h>
 #include <linux/mutex.h>
+#include <linux/gpio.h>
 #include <linux/clk.h>
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/io.h>
 
 
@@ -43,6 +44,11 @@
 
 
 #include <plat/clock.h>
 #include <plat/clock.h>
 #include <plat/cpu.h>
 #include <plat/cpu.h>
+#include <plat/s3c244x.h>
+
+#include <plat/gpio-core.h>
+#include <plat/gpio-cfg.h>
+#include <plat/gpio-cfg-helpers.h>
 
 
 /* S3C2442 extended clock support */
 /* S3C2442 extended clock support */
 
 
@@ -163,3 +169,11 @@ int __init s3c2442_init(void)
 
 
 	return sysdev_register(&s3c2442_sysdev);
 	return sysdev_register(&s3c2442_sysdev);
 }
 }
+
+void __init s3c2442_map_io(void)
+{
+	s3c244x_map_io();
+
+	s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1down;
+	s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1down;
+}

+ 1 - 0
arch/arm/mach-s3c2443/Kconfig

@@ -5,6 +5,7 @@
 config CPU_S3C2443
 config CPU_S3C2443
 	bool
 	bool
 	depends on ARCH_S3C2410
 	depends on ARCH_S3C2410
+	select CPU_ARM920T
 	select S3C2443_DMA if S3C2410_DMA
 	select S3C2443_DMA if S3C2410_DMA
 	select CPU_LLSERIAL_S3C2440
 	select CPU_LLSERIAL_S3C2440
 	select SAMSUNG_CLKSRC
 	select SAMSUNG_CLKSRC

+ 2 - 2
arch/arm/mach-tegra/include/mach/debug-macro.S

@@ -21,8 +21,8 @@
 #include <mach/io.h>
 #include <mach/io.h>
 
 
 	.macro  addruart, rp, rv
 	.macro  addruart, rp, rv
-        ldreq   \rp, =IO_APB_PHYS       @ physical
-        ldrne   \rv, =IO_APB_VIRT        @ virtual
+        ldr     \rp, =IO_APB_PHYS       @ physical
+        ldr     \rv, =IO_APB_VIRT        @ virtual
 #if defined(CONFIG_TEGRA_DEBUG_UART_NONE)
 #if defined(CONFIG_TEGRA_DEBUG_UART_NONE)
 #error "A debug UART must be selected in the kernel config to use DEBUG_LL"
 #error "A debug UART must be selected in the kernel config to use DEBUG_LL"
 #elif defined(CONFIG_TEGRA_DEBUG_UARTA)
 #elif defined(CONFIG_TEGRA_DEBUG_UARTA)

+ 1 - 0
arch/arm/mach-vexpress/headsmp.S

@@ -35,5 +35,6 @@ pen:	ldr	r7, [r6]
 	 */
 	 */
 	b	secondary_startup
 	b	secondary_startup
 
 
+	.align
 1:	.long	.
 1:	.long	.
 	.long	pen_release
 	.long	pen_release

+ 2 - 2
arch/arm/mm/proc-v7.S

@@ -381,7 +381,7 @@ __v7_ca9mp_proc_info:
 		PMD_SECT_XN | \
 		PMD_SECT_XN | \
 		PMD_SECT_AP_WRITE | \
 		PMD_SECT_AP_WRITE | \
 		PMD_SECT_AP_READ
 		PMD_SECT_AP_READ
-	b	__v7_ca9mp_setup
+	W(b)	__v7_ca9mp_setup
 	.long	cpu_arch_name
 	.long	cpu_arch_name
 	.long	cpu_elf_name
 	.long	cpu_elf_name
 	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
 	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
@@ -413,7 +413,7 @@ __v7_proc_info:
 		PMD_SECT_XN | \
 		PMD_SECT_XN | \
 		PMD_SECT_AP_WRITE | \
 		PMD_SECT_AP_WRITE | \
 		PMD_SECT_AP_READ
 		PMD_SECT_AP_READ
-	b	__v7_setup
+	W(b)	__v7_setup
 	.long	cpu_arch_name
 	.long	cpu_arch_name
 	.long	cpu_elf_name
 	.long	cpu_elf_name
 	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
 	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS

+ 2 - 1
arch/arm/plat-iop/time.c

@@ -18,6 +18,7 @@
 #include <linux/time.h>
 #include <linux/time.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/timex.h>
 #include <linux/timex.h>
+#include <linux/sched.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/clocksource.h>
 #include <linux/clocksource.h>
 #include <linux/clockchips.h>
 #include <linux/clockchips.h>
@@ -36,7 +37,7 @@
 /*
 /*
  * IOP clocksource (free-running timer 1).
  * IOP clocksource (free-running timer 1).
  */
  */
-static cycle_t iop_clocksource_read(struct clocksource *unused)
+static cycle_t notrace iop_clocksource_read(struct clocksource *unused)
 {
 {
 	return 0xffffffffu - read_tcr1();
 	return 0xffffffffu - read_tcr1();
 }
 }

+ 4 - 4
arch/arm/plat-s3c24xx/cpu.c

@@ -88,7 +88,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 	{
 	{
 		.idcode		= 0x32440000,
 		.idcode		= 0x32440000,
 		.idmask		= 0xffffffff,
 		.idmask		= 0xffffffff,
-		.map_io		= s3c244x_map_io,
+		.map_io		= s3c2440_map_io,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_uarts	= s3c244x_init_uarts,
 		.init_uarts	= s3c244x_init_uarts,
 		.init		= s3c2440_init,
 		.init		= s3c2440_init,
@@ -97,7 +97,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 	{
 	{
 		.idcode		= 0x32440001,
 		.idcode		= 0x32440001,
 		.idmask		= 0xffffffff,
 		.idmask		= 0xffffffff,
-		.map_io		= s3c244x_map_io,
+		.map_io		= s3c2440_map_io,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_uarts	= s3c244x_init_uarts,
 		.init_uarts	= s3c244x_init_uarts,
 		.init		= s3c2440_init,
 		.init		= s3c2440_init,
@@ -106,7 +106,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 	{
 	{
 		.idcode		= 0x32440aaa,
 		.idcode		= 0x32440aaa,
 		.idmask		= 0xffffffff,
 		.idmask		= 0xffffffff,
-		.map_io		= s3c244x_map_io,
+		.map_io		= s3c2442_map_io,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_uarts	= s3c244x_init_uarts,
 		.init_uarts	= s3c244x_init_uarts,
 		.init		= s3c2442_init,
 		.init		= s3c2442_init,
@@ -115,7 +115,7 @@ static struct cpu_table cpu_ids[] __initdata = {
 	{
 	{
 		.idcode		= 0x32440aab,
 		.idcode		= 0x32440aab,
 		.idmask		= 0xffffffff,
 		.idmask		= 0xffffffff,
-		.map_io		= s3c244x_map_io,
+		.map_io		= s3c2442_map_io,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_clocks	= s3c244x_init_clocks,
 		.init_uarts	= s3c244x_init_uarts,
 		.init_uarts	= s3c244x_init_uarts,
 		.init		= s3c2442_init,
 		.init		= s3c2442_init,

+ 0 - 2
arch/arm/plat-s3c24xx/gpiolib.c

@@ -82,8 +82,6 @@ static struct s3c_gpio_cfg s3c24xx_gpiocfg_banka = {
 struct s3c_gpio_cfg s3c24xx_gpiocfg_default = {
 struct s3c_gpio_cfg s3c24xx_gpiocfg_default = {
 	.set_config	= s3c_gpio_setcfg_s3c24xx,
 	.set_config	= s3c_gpio_setcfg_s3c24xx,
 	.get_config	= s3c_gpio_getcfg_s3c24xx,
 	.get_config	= s3c_gpio_getcfg_s3c24xx,
-	.set_pull	= s3c_gpio_setpull_1up,
-	.get_pull	= s3c_gpio_getpull_1up,
 };
 };
 
 
 struct s3c_gpio_chip s3c24xx_gpios[] = {
 struct s3c_gpio_chip s3c24xx_gpios[] = {

+ 6 - 1
arch/arm/plat-s3c24xx/include/plat/s3c244x.h

@@ -21,17 +21,22 @@ extern void s3c244x_init_clocks(int xtal);
 #else
 #else
 #define s3c244x_init_clocks NULL
 #define s3c244x_init_clocks NULL
 #define s3c244x_init_uarts NULL
 #define s3c244x_init_uarts NULL
-#define s3c244x_map_io NULL
 #endif
 #endif
 
 
 #ifdef CONFIG_CPU_S3C2440
 #ifdef CONFIG_CPU_S3C2440
 extern  int s3c2440_init(void);
 extern  int s3c2440_init(void);
+
+extern void s3c2440_map_io(void);
 #else
 #else
 #define s3c2440_init NULL
 #define s3c2440_init NULL
+#define s3c2440_map_io NULL
 #endif
 #endif
 
 
 #ifdef CONFIG_CPU_S3C2442
 #ifdef CONFIG_CPU_S3C2442
 extern  int s3c2442_init(void);
 extern  int s3c2442_init(void);
+
+extern void s3c2442_map_io(void);
 #else
 #else
 #define s3c2442_init NULL
 #define s3c2442_init NULL
+#define s3c2442_map_io NULL
 #endif
 #endif

+ 37 - 10
arch/arm/plat-samsung/gpio-config.c

@@ -280,18 +280,17 @@ s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip,
 }
 }
 #endif
 #endif
 
 
-#ifdef CONFIG_S3C_GPIO_PULL_UP
-int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
-			 unsigned int off, s3c_gpio_pull_t pull)
+#if defined(CONFIG_S3C_GPIO_PULL_UP) || defined(CONFIG_S3C_GPIO_PULL_DOWN)
+static int s3c_gpio_setpull_1(struct s3c_gpio_chip *chip,
+			 unsigned int off, s3c_gpio_pull_t pull,
+			 s3c_gpio_pull_t updown)
 {
 {
 	void __iomem *reg = chip->base + 0x08;
 	void __iomem *reg = chip->base + 0x08;
 	u32 pup = __raw_readl(reg);
 	u32 pup = __raw_readl(reg);
 
 
-	pup = __raw_readl(reg);
-
-	if (pup == S3C_GPIO_PULL_UP)
+	if (pull == updown)
 		pup &= ~(1 << off);
 		pup &= ~(1 << off);
-	else if (pup == S3C_GPIO_PULL_NONE)
+	else if (pull == S3C_GPIO_PULL_NONE)
 		pup |= (1 << off);
 		pup |= (1 << off);
 	else
 	else
 		return -EINVAL;
 		return -EINVAL;
@@ -300,17 +299,45 @@ int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
 	return 0;
 	return 0;
 }
 }
 
 
-s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
-				     unsigned int off)
+static s3c_gpio_pull_t s3c_gpio_getpull_1(struct s3c_gpio_chip *chip,
+				     unsigned int off, s3c_gpio_pull_t updown)
 {
 {
 	void __iomem *reg = chip->base + 0x08;
 	void __iomem *reg = chip->base + 0x08;
 	u32 pup = __raw_readl(reg);
 	u32 pup = __raw_readl(reg);
 
 
 	pup &= (1 << off);
 	pup &= (1 << off);
-	return pup ? S3C_GPIO_PULL_NONE : S3C_GPIO_PULL_UP;
+	return pup ? S3C_GPIO_PULL_NONE : updown;
+}
+#endif /* CONFIG_S3C_GPIO_PULL_UP || CONFIG_S3C_GPIO_PULL_DOWN */
+
+#ifdef CONFIG_S3C_GPIO_PULL_UP
+s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
+				     unsigned int off)
+{
+	return s3c_gpio_getpull_1(chip, off, S3C_GPIO_PULL_UP);
+}
+
+int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
+			 unsigned int off, s3c_gpio_pull_t pull)
+{
+	return s3c_gpio_setpull_1(chip, off, pull, S3C_GPIO_PULL_UP);
 }
 }
 #endif /* CONFIG_S3C_GPIO_PULL_UP */
 #endif /* CONFIG_S3C_GPIO_PULL_UP */
 
 
+#ifdef CONFIG_S3C_GPIO_PULL_DOWN
+s3c_gpio_pull_t s3c_gpio_getpull_1down(struct s3c_gpio_chip *chip,
+				     unsigned int off)
+{
+	return s3c_gpio_getpull_1(chip, off, S3C_GPIO_PULL_DOWN);
+}
+
+int s3c_gpio_setpull_1down(struct s3c_gpio_chip *chip,
+			 unsigned int off, s3c_gpio_pull_t pull)
+{
+	return s3c_gpio_setpull_1(chip, off, pull, S3C_GPIO_PULL_DOWN);
+}
+#endif /* CONFIG_S3C_GPIO_PULL_DOWN */
+
 #ifdef CONFIG_S5P_GPIO_DRVSTR
 #ifdef CONFIG_S5P_GPIO_DRVSTR
 s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin)
 s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin)
 {
 {

+ 11 - 0
arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h

@@ -209,6 +209,17 @@ extern s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip,
 extern s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
 extern s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
 					    unsigned int off);
 					    unsigned int off);
 
 
+/**
+ * s3c_gpio_getpull_1down() - Get configuration for choice of down or none
+ * @chip: The gpio chip that the GPIO pin belongs to
+ * @off: The offset to the pin to get the configuration of.
+ *
+ * This helper function reads the state of the pull-down resistor for the
+ * given GPIO in the same case as s3c_gpio_setpull_1down.
+*/
+extern s3c_gpio_pull_t s3c_gpio_getpull_1down(struct s3c_gpio_chip *chip,
+					    unsigned int off);
+
 /**
 /**
  * s3c_gpio_setpull_s3c2443() - Pull configuration for s3c2443.
  * s3c_gpio_setpull_s3c2443() - Pull configuration for s3c2443.
  * @chip: The gpio chip that is being configured.
  * @chip: The gpio chip that is being configured.

+ 1 - 0
arch/arm/vfp/vfphw.S

@@ -206,6 +206,7 @@ ENTRY(vfp_save_state)
 	mov	pc, lr
 	mov	pc, lr
 ENDPROC(vfp_save_state)
 ENDPROC(vfp_save_state)
 
 
+	.align
 last_VFP_context_address:
 last_VFP_context_address:
 	.word	last_VFP_context
 	.word	last_VFP_context
 
 

+ 117 - 0
arch/mn10300/include/asm/syscall.h

@@ -0,0 +1,117 @@
+/* Access to user system call parameters and results
+ *
+ * See asm-generic/syscall.h for function descriptions.
+ *
+ * Copyright (C) 2010 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+
+#ifndef _ASM_SYSCALL_H
+#define _ASM_SYSCALL_H
+
+#include <linux/sched.h>
+#include <linux/err.h>
+
+extern const unsigned long sys_call_table[];
+
+static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
+{
+	return regs->orig_d0;
+}
+
+static inline void syscall_rollback(struct task_struct *task,
+				    struct pt_regs *regs)
+{
+	regs->d0 = regs->orig_d0;
+}
+
+static inline long syscall_get_error(struct task_struct *task,
+				     struct pt_regs *regs)
+{
+	unsigned long error = regs->d0;
+	return IS_ERR_VALUE(error) ? error : 0;
+}
+
+static inline long syscall_get_return_value(struct task_struct *task,
+					    struct pt_regs *regs)
+{
+	return regs->d0;
+}
+
+static inline void syscall_set_return_value(struct task_struct *task,
+					    struct pt_regs *regs,
+					    int error, long val)
+{
+	regs->d0 = (long) error ?: val;
+}
+
+static inline void syscall_get_arguments(struct task_struct *task,
+					 struct pt_regs *regs,
+					 unsigned int i, unsigned int n,
+					 unsigned long *args)
+{
+	switch (i) {
+	case 0:
+		if (!n--) break;
+		*args++ = regs->a0;
+	case 1:
+		if (!n--) break;
+		*args++ = regs->d1;
+	case 2:
+		if (!n--) break;
+		*args++ = regs->a3;
+	case 3:
+		if (!n--) break;
+		*args++ = regs->a2;
+	case 4:
+		if (!n--) break;
+		*args++ = regs->d3;
+	case 5:
+		if (!n--) break;
+		*args++ = regs->d2;
+	case 6:
+		if (!n--) break;
+	default:
+		BUG();
+		break;
+	}
+}
+
+static inline void syscall_set_arguments(struct task_struct *task,
+					 struct pt_regs *regs,
+					 unsigned int i, unsigned int n,
+					 const unsigned long *args)
+{
+	switch (i) {
+	case 0:
+		if (!n--) break;
+		regs->a0 = *args++;
+	case 1:
+		if (!n--) break;
+		regs->d1 = *args++;
+	case 2:
+		if (!n--) break;
+		regs->a3 = *args++;
+	case 3:
+		if (!n--) break;
+		regs->a2 = *args++;
+	case 4:
+		if (!n--) break;
+		regs->d3 = *args++;
+	case 5:
+		if (!n--) break;
+		regs->d2 = *args++;
+	case 6:
+		if (!n--) break;
+	default:
+		BUG();
+		break;
+	}
+}
+
+#endif /* _ASM_SYSCALL_H */

+ 2 - 1
arch/mn10300/kernel/gdb-io-serial.c

@@ -73,7 +73,8 @@ void gdbstub_io_init(void)
 	GDBPORT_SERIAL_IER = UART_IER_RDI | UART_IER_RLSI;
 	GDBPORT_SERIAL_IER = UART_IER_RDI | UART_IER_RLSI;
 
 
 	/* permit level 0 IRQs to take place */
 	/* permit level 0 IRQs to take place */
-	local_change_intr_mask_level(NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
+	arch_local_change_intr_mask_level(
+		NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
 }
 }
 
 
 /*
 /*

+ 2 - 1
arch/mn10300/kernel/gdb-io-ttysm.c

@@ -87,7 +87,8 @@ void __init gdbstub_io_init(void)
 	tmp = *gdbstub_port->_control;
 	tmp = *gdbstub_port->_control;
 
 
 	/* permit level 0 IRQs only */
 	/* permit level 0 IRQs only */
-	local_change_intr_mask_level(NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
+	arch_local_change_intr_mask_level(
+		NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
 }
 }
 
 
 /*
 /*

+ 2 - 1
arch/mn10300/kernel/gdb-stub.c

@@ -1194,7 +1194,8 @@ static int gdbstub(struct pt_regs *regs, enum exception_code excep)
 
 
 	asm volatile("mov mdr,%0" : "=d"(mdr));
 	asm volatile("mov mdr,%0" : "=d"(mdr));
 	local_save_flags(epsw);
 	local_save_flags(epsw);
-	local_change_intr_mask_level(NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
+	arch_local_change_intr_mask_level(
+		NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
 
 
 	gdbstub_store_fpu();
 	gdbstub_store_fpu();
 
 

+ 2 - 5
arch/parisc/kernel/irq.c

@@ -75,9 +75,6 @@ static void cpu_unmask_irq(unsigned int irq)
 	smp_send_all_nop();
 	smp_send_all_nop();
 }
 }
 
 
-void no_ack_irq(unsigned int irq) { }
-void no_end_irq(unsigned int irq) { }
-
 void cpu_ack_irq(unsigned int irq)
 void cpu_ack_irq(unsigned int irq)
 {
 {
 	unsigned long mask = EIEM_MASK(irq);
 	unsigned long mask = EIEM_MASK(irq);
@@ -241,7 +238,7 @@ int cpu_claim_irq(unsigned int irq, struct irq_chip *type, void *data)
 
 
 	/* for iosapic interrupts */
 	/* for iosapic interrupts */
 	if (type) {
 	if (type) {
-		set_irq_chip_and_handler(irq, type, handle_level_irq);
+		set_irq_chip_and_handler(irq, type, handle_percpu_irq);
 		set_irq_chip_data(irq, data);
 		set_irq_chip_data(irq, data);
 		cpu_unmask_irq(irq);
 		cpu_unmask_irq(irq);
 	}
 	}
@@ -392,7 +389,7 @@ static void claim_cpu_irqs(void)
 	int i;
 	int i;
 	for (i = CPU_IRQ_BASE; i <= CPU_IRQ_MAX; i++) {
 	for (i = CPU_IRQ_BASE; i <= CPU_IRQ_MAX; i++) {
 		set_irq_chip_and_handler(i, &cpu_interrupt_type,
 		set_irq_chip_and_handler(i, &cpu_interrupt_type,
-			handle_level_irq);
+					 handle_percpu_irq);
 	}
 	}
 
 
 	set_irq_handler(TIMER_IRQ, handle_percpu_irq);
 	set_irq_handler(TIMER_IRQ, handle_percpu_irq);

+ 1 - 8
arch/parisc/kernel/signal.c

@@ -98,7 +98,6 @@ void
 sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
 sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
 {
 {
 	struct rt_sigframe __user *frame;
 	struct rt_sigframe __user *frame;
-	struct siginfo si;
 	sigset_t set;
 	sigset_t set;
 	unsigned long usp = (regs->gr[30] & ~(0x01UL));
 	unsigned long usp = (regs->gr[30] & ~(0x01UL));
 	unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
 	unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
@@ -178,13 +177,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
 
 
 give_sigsegv:
 give_sigsegv:
 	DBG(1,"sys_rt_sigreturn: Sending SIGSEGV\n");
 	DBG(1,"sys_rt_sigreturn: Sending SIGSEGV\n");
-	si.si_signo = SIGSEGV;
-	si.si_errno = 0;
-	si.si_code = SI_KERNEL;
-	si.si_pid = task_pid_vnr(current);
-	si.si_uid = current_uid();
-	si.si_addr = &frame->uc;
-	force_sig_info(SIGSEGV, &si, current);
+	force_sig(SIGSEGV, current);
 	return;
 	return;
 }
 }
 
 

+ 19 - 0
arch/s390/kernel/vtime.c

@@ -19,6 +19,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/kernel_stat.h>
 #include <linux/rcupdate.h>
 #include <linux/rcupdate.h>
 #include <linux/posix-timers.h>
 #include <linux/posix-timers.h>
+#include <linux/cpu.h>
 
 
 #include <asm/s390_ext.h>
 #include <asm/s390_ext.h>
 #include <asm/timer.h>
 #include <asm/timer.h>
@@ -566,6 +567,23 @@ void init_cpu_vtimer(void)
 	__ctl_set_bit(0,10);
 	__ctl_set_bit(0,10);
 }
 }
 
 
+static int __cpuinit s390_nohz_notify(struct notifier_block *self,
+				      unsigned long action, void *hcpu)
+{
+	struct s390_idle_data *idle;
+	long cpu = (long) hcpu;
+
+	idle = &per_cpu(s390_idle, cpu);
+	switch (action) {
+	case CPU_DYING:
+	case CPU_DYING_FROZEN:
+		idle->nohz_delay = 0;
+	default:
+		break;
+	}
+	return NOTIFY_OK;
+}
+
 void __init vtime_init(void)
 void __init vtime_init(void)
 {
 {
 	/* request the cpu timer external interrupt */
 	/* request the cpu timer external interrupt */
@@ -574,5 +592,6 @@ void __init vtime_init(void)
 
 
 	/* Enable cpu timer interrupts on the boot cpu. */
 	/* Enable cpu timer interrupts on the boot cpu. */
 	init_cpu_vtimer();
 	init_cpu_vtimer();
+	cpu_notifier(s390_nohz_notify, 0);
 }
 }
 
 

+ 4 - 30
arch/sh/boards/mach-ecovec24/setup.c

@@ -720,32 +720,6 @@ static struct platform_device camera_devices[] = {
 };
 };
 
 
 /* FSI */
 /* FSI */
-/*
- * FSI-B use external clock which came from da7210.
- * So, we should change parent of fsi
- */
-#define FCLKBCR		0xa415000c
-static void fsimck_init(struct clk *clk)
-{
-	u32 status = __raw_readl(clk->enable_reg);
-
-	/* use external clock */
-	status &= ~0x000000ff;
-	status |= 0x00000080;
-
-	__raw_writel(status, clk->enable_reg);
-}
-
-static struct clk_ops fsimck_clk_ops = {
-	.init = fsimck_init,
-};
-
-static struct clk fsimckb_clk = {
-	.ops		= &fsimck_clk_ops,
-	.enable_reg	= (void __iomem *)FCLKBCR,
-	.rate		= 0, /* unknown */
-};
-
 static struct sh_fsi_platform_info fsi_info = {
 static struct sh_fsi_platform_info fsi_info = {
 	.portb_flags = SH_FSI_BRS_INV |
 	.portb_flags = SH_FSI_BRS_INV |
 		       SH_FSI_OUT_SLAVE_MODE |
 		       SH_FSI_OUT_SLAVE_MODE |
@@ -1264,10 +1238,10 @@ static int __init arch_setup(void)
 	/* change parent of FSI B */
 	/* change parent of FSI B */
 	clk = clk_get(NULL, "fsib_clk");
 	clk = clk_get(NULL, "fsib_clk");
 	if (!IS_ERR(clk)) {
 	if (!IS_ERR(clk)) {
-		clk_register(&fsimckb_clk);
-		clk_set_parent(clk, &fsimckb_clk);
-		clk_set_rate(clk, 11000);
-		clk_set_rate(&fsimckb_clk, 11000);
+		/* 48kHz dummy clock was used to make sure 1/1 divide */
+		clk_set_rate(&sh7724_fsimckb_clk, 48000);
+		clk_set_parent(clk, &sh7724_fsimckb_clk);
+		clk_set_rate(clk, 48000);
 		clk_put(clk);
 		clk_put(clk);
 	}
 	}
 
 

+ 7 - 40
arch/sh/boards/mach-se/7724/setup.c

@@ -283,31 +283,6 @@ static struct platform_device ceu1_device = {
 };
 };
 
 
 /* FSI */
 /* FSI */
-/*
- * FSI-A use external clock which came from ak464x.
- * So, we should change parent of fsi
- */
-#define FCLKACR		0xa4150008
-static void fsimck_init(struct clk *clk)
-{
-	u32 status = __raw_readl(clk->enable_reg);
-
-	/* use external clock */
-	status &= ~0x000000ff;
-	status |= 0x00000080;
-	__raw_writel(status, clk->enable_reg);
-}
-
-static struct clk_ops fsimck_clk_ops = {
-	.init = fsimck_init,
-};
-
-static struct clk fsimcka_clk = {
-	.ops		= &fsimck_clk_ops,
-	.enable_reg	= (void __iomem *)FCLKACR,
-	.rate		= 0, /* unknown */
-};
-
 /* change J20, J21, J22 pin to 1-2 connection to use slave mode */
 /* change J20, J21, J22 pin to 1-2 connection to use slave mode */
 static struct sh_fsi_platform_info fsi_info = {
 static struct sh_fsi_platform_info fsi_info = {
 	.porta_flags = SH_FSI_BRS_INV |
 	.porta_flags = SH_FSI_BRS_INV |
@@ -852,37 +827,29 @@ static int __init devices_setup(void)
 	gpio_request(GPIO_FN_KEYOUT0,     NULL);
 	gpio_request(GPIO_FN_KEYOUT0,     NULL);
 
 
 	/* enable FSI */
 	/* enable FSI */
-	gpio_request(GPIO_FN_FSIMCKB,    NULL);
 	gpio_request(GPIO_FN_FSIMCKA,    NULL);
 	gpio_request(GPIO_FN_FSIMCKA,    NULL);
+	gpio_request(GPIO_FN_FSIIASD,    NULL);
 	gpio_request(GPIO_FN_FSIOASD,    NULL);
 	gpio_request(GPIO_FN_FSIOASD,    NULL);
 	gpio_request(GPIO_FN_FSIIABCK,   NULL);
 	gpio_request(GPIO_FN_FSIIABCK,   NULL);
 	gpio_request(GPIO_FN_FSIIALRCK,  NULL);
 	gpio_request(GPIO_FN_FSIIALRCK,  NULL);
 	gpio_request(GPIO_FN_FSIOABCK,   NULL);
 	gpio_request(GPIO_FN_FSIOABCK,   NULL);
 	gpio_request(GPIO_FN_FSIOALRCK,  NULL);
 	gpio_request(GPIO_FN_FSIOALRCK,  NULL);
 	gpio_request(GPIO_FN_CLKAUDIOAO, NULL);
 	gpio_request(GPIO_FN_CLKAUDIOAO, NULL);
-	gpio_request(GPIO_FN_FSIIBSD,    NULL);
-	gpio_request(GPIO_FN_FSIOBSD,    NULL);
-	gpio_request(GPIO_FN_FSIIBBCK,   NULL);
-	gpio_request(GPIO_FN_FSIIBLRCK,  NULL);
-	gpio_request(GPIO_FN_FSIOBBCK,   NULL);
-	gpio_request(GPIO_FN_FSIOBLRCK,  NULL);
-	gpio_request(GPIO_FN_CLKAUDIOBO, NULL);
-	gpio_request(GPIO_FN_FSIIASD,    NULL);
 
 
 	/* set SPU2 clock to 83.4 MHz */
 	/* set SPU2 clock to 83.4 MHz */
 	clk = clk_get(NULL, "spu_clk");
 	clk = clk_get(NULL, "spu_clk");
-	if (clk) {
+	if (!IS_ERR(clk)) {
 		clk_set_rate(clk, clk_round_rate(clk, 83333333));
 		clk_set_rate(clk, clk_round_rate(clk, 83333333));
 		clk_put(clk);
 		clk_put(clk);
 	}
 	}
 
 
 	/* change parent of FSI A */
 	/* change parent of FSI A */
 	clk = clk_get(NULL, "fsia_clk");
 	clk = clk_get(NULL, "fsia_clk");
-	if (clk) {
-		clk_register(&fsimcka_clk);
-		clk_set_parent(clk, &fsimcka_clk);
-		clk_set_rate(clk, 11000);
-		clk_set_rate(&fsimcka_clk, 11000);
+	if (!IS_ERR(clk)) {
+		/* 48kHz dummy clock was used to make sure 1/1 divide */
+		clk_set_rate(&sh7724_fsimcka_clk, 48000);
+		clk_set_parent(clk, &sh7724_fsimcka_clk);
+		clk_set_rate(clk, 48000);
 		clk_put(clk);
 		clk_put(clk);
 	}
 	}
 
 

+ 1 - 1
arch/sh/include/asm/cacheflush.h

@@ -96,7 +96,7 @@ void kmap_coherent_init(void);
 void *kmap_coherent(struct page *page, unsigned long addr);
 void *kmap_coherent(struct page *page, unsigned long addr);
 void kunmap_coherent(void *kvaddr);
 void kunmap_coherent(void *kvaddr);
 
 
-#define PG_dcache_dirty	PG_arch_1
+#define PG_dcache_clean	PG_arch_1
 
 
 void cpu_cache_init(void);
 void cpu_cache_init(void);
 
 

+ 3 - 0
arch/sh/include/cpu-sh4/cpu/sh7724.h

@@ -303,4 +303,7 @@ enum {
 	SHDMA_SLAVE_SDHI1_RX,
 	SHDMA_SLAVE_SDHI1_RX,
 };
 };
 
 
+extern struct clk sh7724_fsimcka_clk;
+extern struct clk sh7724_fsimckb_clk;
+
 #endif /* __ASM_SH7724_H__ */
 #endif /* __ASM_SH7724_H__ */

+ 39 - 5
arch/sh/kernel/cpu/sh4a/clock-sh7724.c

@@ -111,12 +111,21 @@ static struct clk div3_clk = {
 	.parent		= &pll_clk,
 	.parent		= &pll_clk,
 };
 };
 
 
+/* External input clock (pin name: FSIMCKA/FSIMCKB ) */
+struct clk sh7724_fsimcka_clk = {
+};
+
+struct clk sh7724_fsimckb_clk = {
+};
+
 static struct clk *main_clks[] = {
 static struct clk *main_clks[] = {
 	&r_clk,
 	&r_clk,
 	&extal_clk,
 	&extal_clk,
 	&fll_clk,
 	&fll_clk,
 	&pll_clk,
 	&pll_clk,
 	&div3_clk,
 	&div3_clk,
+	&sh7724_fsimcka_clk,
+	&sh7724_fsimckb_clk,
 };
 };
 
 
 static void div4_kick(struct clk *clk)
 static void div4_kick(struct clk *clk)
@@ -154,16 +163,38 @@ struct clk div4_clks[DIV4_NR] = {
 	[DIV4_M1] = DIV4(FRQCRB, 4, 0x2f7c, CLK_ENABLE_ON_INIT),
 	[DIV4_M1] = DIV4(FRQCRB, 4, 0x2f7c, CLK_ENABLE_ON_INIT),
 };
 };
 
 
-enum { DIV6_V, DIV6_FA, DIV6_FB, DIV6_I, DIV6_S, DIV6_NR };
+enum { DIV6_V, DIV6_I, DIV6_S, DIV6_NR };
 
 
 static struct clk div6_clks[DIV6_NR] = {
 static struct clk div6_clks[DIV6_NR] = {
 	[DIV6_V] = SH_CLK_DIV6(&div3_clk, VCLKCR, 0),
 	[DIV6_V] = SH_CLK_DIV6(&div3_clk, VCLKCR, 0),
-	[DIV6_FA] = SH_CLK_DIV6(&div3_clk, FCLKACR, 0),
-	[DIV6_FB] = SH_CLK_DIV6(&div3_clk, FCLKBCR, 0),
 	[DIV6_I] = SH_CLK_DIV6(&div3_clk, IRDACLKCR, 0),
 	[DIV6_I] = SH_CLK_DIV6(&div3_clk, IRDACLKCR, 0),
 	[DIV6_S] = SH_CLK_DIV6(&div3_clk, SPUCLKCR, CLK_ENABLE_ON_INIT),
 	[DIV6_S] = SH_CLK_DIV6(&div3_clk, SPUCLKCR, CLK_ENABLE_ON_INIT),
 };
 };
 
 
+enum { DIV6_FA, DIV6_FB, DIV6_REPARENT_NR };
+
+/* Indices are important - they are the actual src selecting values */
+static struct clk *fclkacr_parent[] = {
+	[0] = &div3_clk,
+	[1] = NULL,
+	[2] = &sh7724_fsimcka_clk,
+	[3] = NULL,
+};
+
+static struct clk *fclkbcr_parent[] = {
+	[0] = &div3_clk,
+	[1] = NULL,
+	[2] = &sh7724_fsimckb_clk,
+	[3] = NULL,
+};
+
+static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
+	[DIV6_FA] = SH_CLK_DIV6_EXT(&div3_clk, FCLKACR, 0,
+				      fclkacr_parent, ARRAY_SIZE(fclkacr_parent), 6, 2),
+	[DIV6_FB] = SH_CLK_DIV6_EXT(&div3_clk, FCLKBCR, 0,
+				      fclkbcr_parent, ARRAY_SIZE(fclkbcr_parent), 6, 2),
+};
+
 static struct clk mstp_clks[HWBLK_NR] = {
 static struct clk mstp_clks[HWBLK_NR] = {
 	SH_HWBLK_CLK(HWBLK_TLB, &div4_clks[DIV4_I], CLK_ENABLE_ON_INIT),
 	SH_HWBLK_CLK(HWBLK_TLB, &div4_clks[DIV4_I], CLK_ENABLE_ON_INIT),
 	SH_HWBLK_CLK(HWBLK_IC, &div4_clks[DIV4_I], CLK_ENABLE_ON_INIT),
 	SH_HWBLK_CLK(HWBLK_IC, &div4_clks[DIV4_I], CLK_ENABLE_ON_INIT),
@@ -240,8 +271,8 @@ static struct clk_lookup lookups[] = {
 
 
 	/* DIV6 clocks */
 	/* DIV6 clocks */
 	CLKDEV_CON_ID("video_clk", &div6_clks[DIV6_V]),
 	CLKDEV_CON_ID("video_clk", &div6_clks[DIV6_V]),
-	CLKDEV_CON_ID("fsia_clk", &div6_clks[DIV6_FA]),
-	CLKDEV_CON_ID("fsib_clk", &div6_clks[DIV6_FB]),
+	CLKDEV_CON_ID("fsia_clk", &div6_reparent_clks[DIV6_FA]),
+	CLKDEV_CON_ID("fsib_clk", &div6_reparent_clks[DIV6_FB]),
 	CLKDEV_CON_ID("irda_clk", &div6_clks[DIV6_I]),
 	CLKDEV_CON_ID("irda_clk", &div6_clks[DIV6_I]),
 	CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_S]),
 	CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_S]),
 
 
@@ -375,6 +406,9 @@ int __init arch_clk_init(void)
 	if (!ret)
 	if (!ret)
 		ret = sh_clk_div6_register(div6_clks, DIV6_NR);
 		ret = sh_clk_div6_register(div6_clks, DIV6_NR);
 
 
+	if (!ret)
+		ret = sh_clk_div6_reparent_register(div6_reparent_clks, DIV6_REPARENT_NR);
+
 	if (!ret)
 	if (!ret)
 		ret = sh_hwblk_clk_register(mstp_clks, HWBLK_NR);
 		ret = sh_hwblk_clk_register(mstp_clks, HWBLK_NR);
 
 

+ 2 - 2
arch/sh/mm/cache-sh4.c

@@ -114,7 +114,7 @@ static void sh4_flush_dcache_page(void *arg)
 	struct address_space *mapping = page_mapping(page);
 	struct address_space *mapping = page_mapping(page);
 
 
 	if (mapping && !mapping_mapped(mapping))
 	if (mapping && !mapping_mapped(mapping))
-		set_bit(PG_dcache_dirty, &page->flags);
+		clear_bit(PG_dcache_clean, &page->flags);
 	else
 	else
 #endif
 #endif
 		flush_cache_one(CACHE_OC_ADDRESS_ARRAY |
 		flush_cache_one(CACHE_OC_ADDRESS_ARRAY |
@@ -239,7 +239,7 @@ static void sh4_flush_cache_page(void *args)
 		 * another ASID than the current one.
 		 * another ASID than the current one.
 		 */
 		 */
 		map_coherent = (current_cpu_data.dcache.n_aliases &&
 		map_coherent = (current_cpu_data.dcache.n_aliases &&
-			!test_bit(PG_dcache_dirty, &page->flags) &&
+			test_bit(PG_dcache_clean, &page->flags) &&
 			page_mapped(page));
 			page_mapped(page));
 		if (map_coherent)
 		if (map_coherent)
 			vaddr = kmap_coherent(page, address);
 			vaddr = kmap_coherent(page, address);

+ 1 - 1
arch/sh/mm/cache-sh7705.c

@@ -139,7 +139,7 @@ static void sh7705_flush_dcache_page(void *arg)
 	struct address_space *mapping = page_mapping(page);
 	struct address_space *mapping = page_mapping(page);
 
 
 	if (mapping && !mapping_mapped(mapping))
 	if (mapping && !mapping_mapped(mapping))
-		set_bit(PG_dcache_dirty, &page->flags);
+		clear_bit(PG_dcache_clean, &page->flags);
 	else
 	else
 		__flush_dcache_page(__pa(page_address(page)));
 		__flush_dcache_page(__pa(page_address(page)));
 }
 }

+ 7 - 7
arch/sh/mm/cache.c

@@ -60,14 +60,14 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
 		       unsigned long len)
 		       unsigned long len)
 {
 {
 	if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
 	if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
-	    !test_bit(PG_dcache_dirty, &page->flags)) {
+	    test_bit(PG_dcache_clean, &page->flags)) {
 		void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
 		void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
 		memcpy(vto, src, len);
 		memcpy(vto, src, len);
 		kunmap_coherent(vto);
 		kunmap_coherent(vto);
 	} else {
 	} else {
 		memcpy(dst, src, len);
 		memcpy(dst, src, len);
 		if (boot_cpu_data.dcache.n_aliases)
 		if (boot_cpu_data.dcache.n_aliases)
-			set_bit(PG_dcache_dirty, &page->flags);
+			clear_bit(PG_dcache_clean, &page->flags);
 	}
 	}
 
 
 	if (vma->vm_flags & VM_EXEC)
 	if (vma->vm_flags & VM_EXEC)
@@ -79,14 +79,14 @@ void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
 			 unsigned long len)
 			 unsigned long len)
 {
 {
 	if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
 	if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
-	    !test_bit(PG_dcache_dirty, &page->flags)) {
+	    test_bit(PG_dcache_clean, &page->flags)) {
 		void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
 		void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
 		memcpy(dst, vfrom, len);
 		memcpy(dst, vfrom, len);
 		kunmap_coherent(vfrom);
 		kunmap_coherent(vfrom);
 	} else {
 	} else {
 		memcpy(dst, src, len);
 		memcpy(dst, src, len);
 		if (boot_cpu_data.dcache.n_aliases)
 		if (boot_cpu_data.dcache.n_aliases)
-			set_bit(PG_dcache_dirty, &page->flags);
+			clear_bit(PG_dcache_clean, &page->flags);
 	}
 	}
 }
 }
 
 
@@ -98,7 +98,7 @@ void copy_user_highpage(struct page *to, struct page *from,
 	vto = kmap_atomic(to, KM_USER1);
 	vto = kmap_atomic(to, KM_USER1);
 
 
 	if (boot_cpu_data.dcache.n_aliases && page_mapped(from) &&
 	if (boot_cpu_data.dcache.n_aliases && page_mapped(from) &&
-	    !test_bit(PG_dcache_dirty, &from->flags)) {
+	    test_bit(PG_dcache_clean, &from->flags)) {
 		vfrom = kmap_coherent(from, vaddr);
 		vfrom = kmap_coherent(from, vaddr);
 		copy_page(vto, vfrom);
 		copy_page(vto, vfrom);
 		kunmap_coherent(vfrom);
 		kunmap_coherent(vfrom);
@@ -141,7 +141,7 @@ void __update_cache(struct vm_area_struct *vma,
 
 
 	page = pfn_to_page(pfn);
 	page = pfn_to_page(pfn);
 	if (pfn_valid(pfn)) {
 	if (pfn_valid(pfn)) {
-		int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
+		int dirty = !test_and_set_bit(PG_dcache_clean, &page->flags);
 		if (dirty)
 		if (dirty)
 			__flush_purge_region(page_address(page), PAGE_SIZE);
 			__flush_purge_region(page_address(page), PAGE_SIZE);
 	}
 	}
@@ -153,7 +153,7 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr)
 
 
 	if (pages_do_alias(addr, vmaddr)) {
 	if (pages_do_alias(addr, vmaddr)) {
 		if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
 		if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
-		    !test_bit(PG_dcache_dirty, &page->flags)) {
+		    test_bit(PG_dcache_clean, &page->flags)) {
 			void *kaddr;
 			void *kaddr;
 
 
 			kaddr = kmap_coherent(page, vmaddr);
 			kaddr = kmap_coherent(page, vmaddr);

+ 1 - 1
arch/sh/mm/kmap.c

@@ -34,7 +34,7 @@ void *kmap_coherent(struct page *page, unsigned long addr)
 	enum fixed_addresses idx;
 	enum fixed_addresses idx;
 	unsigned long vaddr;
 	unsigned long vaddr;
 
 
-	BUG_ON(test_bit(PG_dcache_dirty, &page->flags));
+	BUG_ON(!test_bit(PG_dcache_clean, &page->flags));
 
 
 	pagefault_disable();
 	pagefault_disable();
 
 

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

@@ -11,6 +11,7 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
 void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
 void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
 			    struct pvclock_vcpu_time_info *vcpu,
 			    struct pvclock_vcpu_time_info *vcpu,
 			    struct timespec *ts);
 			    struct timespec *ts);
+void pvclock_resume(void);
 
 
 /*
 /*
  * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
  * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,

+ 5 - 0
arch/x86/kernel/pvclock.c

@@ -83,6 +83,11 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src)
 
 
 static atomic64_t last_value = ATOMIC64_INIT(0);
 static atomic64_t last_value = ATOMIC64_INIT(0);
 
 
+void pvclock_resume(void)
+{
+	atomic64_set(&last_value, 0);
+}
+
 cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
 cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
 {
 {
 	struct pvclock_shadow_time shadow;
 	struct pvclock_shadow_time shadow;

+ 20 - 7
arch/x86/pci/xen.c

@@ -70,6 +70,9 @@ static int acpi_register_gsi_xen_hvm(struct device *dev, u32 gsi,
 struct xen_pci_frontend_ops *xen_pci_frontend;
 struct xen_pci_frontend_ops *xen_pci_frontend;
 EXPORT_SYMBOL_GPL(xen_pci_frontend);
 EXPORT_SYMBOL_GPL(xen_pci_frontend);
 
 
+#define XEN_PIRQ_MSI_DATA  (MSI_DATA_TRIGGER_EDGE | \
+		MSI_DATA_LEVEL_ASSERT | (3 << 8) | MSI_DATA_VECTOR(0))
+
 static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq,
 static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq,
 		struct msi_msg *msg)
 		struct msi_msg *msg)
 {
 {
@@ -83,12 +86,7 @@ static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq,
 		MSI_ADDR_REDIRECTION_CPU |
 		MSI_ADDR_REDIRECTION_CPU |
 		MSI_ADDR_DEST_ID(pirq);
 		MSI_ADDR_DEST_ID(pirq);
 
 
-	msg->data =
-		MSI_DATA_TRIGGER_EDGE |
-		MSI_DATA_LEVEL_ASSERT |
-		/* delivery mode reserved */
-		(3 << 8) |
-		MSI_DATA_VECTOR(0);
+	msg->data = XEN_PIRQ_MSI_DATA;
 }
 }
 
 
 static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
 static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
@@ -98,8 +96,23 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
 	struct msi_msg msg;
 	struct msi_msg msg;
 
 
 	list_for_each_entry(msidesc, &dev->msi_list, list) {
 	list_for_each_entry(msidesc, &dev->msi_list, list) {
+		__read_msi_msg(msidesc, &msg);
+		pirq = MSI_ADDR_EXT_DEST_ID(msg.address_hi) |
+			((msg.address_lo >> MSI_ADDR_DEST_ID_SHIFT) & 0xff);
+		if (xen_irq_from_pirq(pirq) >= 0 && msg.data == XEN_PIRQ_MSI_DATA) {
+			xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ?
+					"msi-x" : "msi", &irq, &pirq, XEN_ALLOC_IRQ);
+			if (irq < 0)
+				goto error;
+			ret = set_irq_msi(irq, msidesc);
+			if (ret < 0)
+				goto error_while;
+			printk(KERN_DEBUG "xen: msi already setup: msi --> irq=%d"
+					" pirq=%d\n", irq, pirq);
+			return 0;
+		}
 		xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ?
 		xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ?
-				"msi-x" : "msi", &irq, &pirq);
+				"msi-x" : "msi", &irq, &pirq, (XEN_ALLOC_IRQ | XEN_ALLOC_PIRQ));
 		if (irq < 0 || pirq < 0)
 		if (irq < 0 || pirq < 0)
 			goto error;
 			goto error;
 		printk(KERN_DEBUG "xen: msi --> irq=%d, pirq=%d\n", irq, pirq);
 		printk(KERN_DEBUG "xen: msi --> irq=%d, pirq=%d\n", irq, pirq);

+ 0 - 4
arch/x86/xen/enlighten.c

@@ -1021,10 +1021,6 @@ static void xen_reboot(int reason)
 {
 {
 	struct sched_shutdown r = { .reason = reason };
 	struct sched_shutdown r = { .reason = reason };
 
 
-#ifdef CONFIG_SMP
-	stop_other_cpus();
-#endif
-
 	if (HYPERVISOR_sched_op(SCHEDOP_shutdown, &r))
 	if (HYPERVISOR_sched_op(SCHEDOP_shutdown, &r))
 		BUG();
 		BUG();
 }
 }

+ 0 - 2
arch/x86/xen/mmu.c

@@ -2415,8 +2415,6 @@ void __init xen_init_mmu_ops(void)
 	x86_init.paging.pagetable_setup_done = xen_pagetable_setup_done;
 	x86_init.paging.pagetable_setup_done = xen_pagetable_setup_done;
 	pv_mmu_ops = xen_mmu_ops;
 	pv_mmu_ops = xen_mmu_ops;
 
 
-	vmap_lazy_unmap = false;
-
 	memset(dummy_mapping, 0xff, PAGE_SIZE);
 	memset(dummy_mapping, 0xff, PAGE_SIZE);
 }
 }
 
 

+ 1 - 1
arch/x86/xen/platform-pci-unplug.c

@@ -68,7 +68,7 @@ static int __init check_platform_magic(void)
 	return 0;
 	return 0;
 }
 }
 
 
-void __init xen_unplug_emulated_devices(void)
+void xen_unplug_emulated_devices(void)
 {
 {
 	int r;
 	int r;
 
 

+ 14 - 27
arch/x86/xen/setup.c

@@ -181,24 +181,21 @@ char * __init xen_memory_setup(void)
 	for (i = 0; i < memmap.nr_entries; i++) {
 	for (i = 0; i < memmap.nr_entries; i++) {
 		unsigned long long end = map[i].addr + map[i].size;
 		unsigned long long end = map[i].addr + map[i].size;
 
 
-		if (map[i].type == E820_RAM) {
-			if (map[i].addr < mem_end && end > mem_end) {
-				/* Truncate region to max_mem. */
-				u64 delta = end - mem_end;
+		if (map[i].type == E820_RAM && end > mem_end) {
+			/* RAM off the end - may be partially included */
+			u64 delta = min(map[i].size, end - mem_end);
 
 
-				map[i].size -= delta;
-				extra_pages += PFN_DOWN(delta);
+			map[i].size -= delta;
+			end -= delta;
 
 
-				end = mem_end;
-			}
+			extra_pages += PFN_DOWN(delta);
 		}
 		}
 
 
-		if (end > xen_extra_mem_start)
+		if (map[i].size > 0 && end > xen_extra_mem_start)
 			xen_extra_mem_start = end;
 			xen_extra_mem_start = end;
 
 
-		/* If region is non-RAM or below mem_end, add what remains */
-		if ((map[i].type != E820_RAM || map[i].addr < mem_end) &&
-		    map[i].size > 0)
+		/* Add region if any remains */
+		if (map[i].size > 0)
 			e820_add_region(map[i].addr, map[i].size, map[i].type);
 			e820_add_region(map[i].addr, map[i].size, map[i].type);
 	}
 	}
 
 
@@ -252,20 +249,6 @@ char * __init xen_memory_setup(void)
 	return "Xen";
 	return "Xen";
 }
 }
 
 
-static void xen_idle(void)
-{
-	local_irq_disable();
-
-	if (need_resched())
-		local_irq_enable();
-	else {
-		current_thread_info()->status &= ~TS_POLLING;
-		smp_mb__after_clear_bit();
-		safe_halt();
-		current_thread_info()->status |= TS_POLLING;
-	}
-}
-
 /*
 /*
  * Set the bit indicating "nosegneg" library variants should be used.
  * Set the bit indicating "nosegneg" library variants should be used.
  * We only need to bother in pure 32-bit mode; compat 32-bit processes
  * We only need to bother in pure 32-bit mode; compat 32-bit processes
@@ -362,7 +345,11 @@ void __init xen_arch_setup(void)
 	       MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ?
 	       MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ?
 	       COMMAND_LINE_SIZE : MAX_GUEST_CMDLINE);
 	       COMMAND_LINE_SIZE : MAX_GUEST_CMDLINE);
 
 
-	pm_idle = xen_idle;
+	/* Set up idle, making sure it calls safe_halt() pvop */
+#ifdef CONFIG_X86_32
+	boot_cpu_data.hlt_works_ok = 1;
+#endif
+	pm_idle = default_idle;
 
 
 	fiddle_vdso();
 	fiddle_vdso();
 }
 }

+ 1 - 0
arch/x86/xen/suspend.c

@@ -31,6 +31,7 @@ void xen_hvm_post_suspend(int suspend_cancelled)
 	int cpu;
 	int cpu;
 	xen_hvm_init_shared_info();
 	xen_hvm_init_shared_info();
 	xen_callback_vector();
 	xen_callback_vector();
+	xen_unplug_emulated_devices();
 	if (xen_feature(XENFEAT_hvm_safe_pvclock)) {
 	if (xen_feature(XENFEAT_hvm_safe_pvclock)) {
 		for_each_online_cpu(cpu) {
 		for_each_online_cpu(cpu) {
 			xen_setup_runstate_info(cpu);
 			xen_setup_runstate_info(cpu);

+ 2 - 0
arch/x86/xen/time.c

@@ -426,6 +426,8 @@ void xen_timer_resume(void)
 {
 {
 	int cpu;
 	int cpu;
 
 
+	pvclock_resume();
+
 	if (xen_clockevent != &xen_vcpuop_clockevent)
 	if (xen_clockevent != &xen_vcpuop_clockevent)
 		return;
 		return;
 
 

+ 1 - 1
arch/x86/xen/xen-ops.h

@@ -43,7 +43,7 @@ void xen_vcpu_restore(void);
 
 
 void xen_callback_vector(void);
 void xen_callback_vector(void);
 void xen_hvm_init_shared_info(void);
 void xen_hvm_init_shared_info(void);
-void __init xen_unplug_emulated_devices(void);
+void xen_unplug_emulated_devices(void);
 
 
 void __init xen_build_dynamic_phys_to_machine(void);
 void __init xen_build_dynamic_phys_to_machine(void);
 
 

+ 1 - 0
drivers/dma/shdma.c

@@ -1213,3 +1213,4 @@ module_exit(sh_dmae_exit);
 MODULE_AUTHOR("Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>");
 MODULE_AUTHOR("Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>");
 MODULE_DESCRIPTION("Renesas SH DMA Engine driver");
 MODULE_DESCRIPTION("Renesas SH DMA Engine driver");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:sh-dma-engine");

+ 14 - 2
drivers/gpio/cs5535-gpio.c

@@ -56,6 +56,18 @@ static struct cs5535_gpio_chip {
  * registers, see include/linux/cs5535.h.
  * registers, see include/linux/cs5535.h.
  */
  */
 
 
+static void errata_outl(u32 val, unsigned long addr)
+{
+	/*
+	 * According to the CS5536 errata (#36), after suspend
+	 * a write to the high bank GPIO register will clear all
+	 * non-selected bits; the recommended workaround is a
+	 * read-modify-write operation.
+	 */
+	val |= inl(addr);
+	outl(val, addr);
+}
+
 static void __cs5535_gpio_set(struct cs5535_gpio_chip *chip, unsigned offset,
 static void __cs5535_gpio_set(struct cs5535_gpio_chip *chip, unsigned offset,
 		unsigned int reg)
 		unsigned int reg)
 {
 {
@@ -64,7 +76,7 @@ static void __cs5535_gpio_set(struct cs5535_gpio_chip *chip, unsigned offset,
 		outl(1 << offset, chip->base + reg);
 		outl(1 << offset, chip->base + reg);
 	else
 	else
 		/* high bank register */
 		/* high bank register */
-		outl(1 << (offset - 16), chip->base + 0x80 + reg);
+		errata_outl(1 << (offset - 16), chip->base + 0x80 + reg);
 }
 }
 
 
 void cs5535_gpio_set(unsigned offset, unsigned int reg)
 void cs5535_gpio_set(unsigned offset, unsigned int reg)
@@ -86,7 +98,7 @@ static void __cs5535_gpio_clear(struct cs5535_gpio_chip *chip, unsigned offset,
 		outl(1 << (offset + 16), chip->base + reg);
 		outl(1 << (offset + 16), chip->base + reg);
 	else
 	else
 		/* high bank register */
 		/* high bank register */
-		outl(1 << offset, chip->base + 0x80 + reg);
+		errata_outl(1 << offset, chip->base + 0x80 + reg);
 }
 }
 
 
 void cs5535_gpio_clear(unsigned offset, unsigned int reg)
 void cs5535_gpio_clear(unsigned offset, unsigned int reg)

+ 1 - 1
drivers/gpu/drm/drm_crtc_helper.c

@@ -241,7 +241,7 @@ void drm_helper_disable_unused_functions(struct drm_device *dev)
 	}
 	}
 
 
 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
-		if (!drm_helper_encoder_in_use(encoder)) {
+		if (encoder->crtc && !drm_helper_encoder_in_use(encoder)) {
 			drm_encoder_disable(encoder);
 			drm_encoder_disable(encoder);
 			/* disconnector encoder from any connector */
 			/* disconnector encoder from any connector */
 			encoder->crtc = NULL;
 			encoder->crtc = NULL;

+ 14 - 5
drivers/gpu/drm/drm_irq.c

@@ -585,10 +585,13 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
 	struct timeval now;
 	struct timeval now;
 	unsigned long flags;
 	unsigned long flags;
 	unsigned int seq;
 	unsigned int seq;
+	int ret;
 
 
 	e = kzalloc(sizeof *e, GFP_KERNEL);
 	e = kzalloc(sizeof *e, GFP_KERNEL);
-	if (e == NULL)
-		return -ENOMEM;
+	if (e == NULL) {
+		ret = -ENOMEM;
+		goto err_put;
+	}
 
 
 	e->pipe = pipe;
 	e->pipe = pipe;
 	e->base.pid = current->pid;
 	e->base.pid = current->pid;
@@ -603,9 +606,8 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
 	spin_lock_irqsave(&dev->event_lock, flags);
 	spin_lock_irqsave(&dev->event_lock, flags);
 
 
 	if (file_priv->event_space < sizeof e->event) {
 	if (file_priv->event_space < sizeof e->event) {
-		spin_unlock_irqrestore(&dev->event_lock, flags);
-		kfree(e);
-		return -ENOMEM;
+		ret = -EBUSY;
+		goto err_unlock;
 	}
 	}
 
 
 	file_priv->event_space -= sizeof e->event;
 	file_priv->event_space -= sizeof e->event;
@@ -638,6 +640,13 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
 	spin_unlock_irqrestore(&dev->event_lock, flags);
 	spin_unlock_irqrestore(&dev->event_lock, flags);
 
 
 	return 0;
 	return 0;
+
+err_unlock:
+	spin_unlock_irqrestore(&dev->event_lock, flags);
+	kfree(e);
+err_put:
+	drm_vblank_put(dev, e->pipe);
+	return ret;
 }
 }
 
 
 /**
 /**

+ 0 - 34
drivers/gpu/drm/i915/intel_acpi.c

@@ -190,37 +190,6 @@ out:
 	kfree(output.pointer);
 	kfree(output.pointer);
 }
 }
 
 
-static int intel_dsm_switchto(enum vga_switcheroo_client_id id)
-{
-	return 0;
-}
-
-static int intel_dsm_power_state(enum vga_switcheroo_client_id id,
-				 enum vga_switcheroo_state state)
-{
-	return 0;
-}
-
-static int intel_dsm_init(void)
-{
-	return 0;
-}
-
-static int intel_dsm_get_client_id(struct pci_dev *pdev)
-{
-	if (intel_dsm_priv.dhandle == DEVICE_ACPI_HANDLE(&pdev->dev))
-		return VGA_SWITCHEROO_IGD;
-	else
-		return VGA_SWITCHEROO_DIS;
-}
-
-static struct vga_switcheroo_handler intel_dsm_handler = {
-	.switchto = intel_dsm_switchto,
-	.power_state = intel_dsm_power_state,
-	.init = intel_dsm_init,
-	.get_client_id = intel_dsm_get_client_id,
-};
-
 static bool intel_dsm_pci_probe(struct pci_dev *pdev)
 static bool intel_dsm_pci_probe(struct pci_dev *pdev)
 {
 {
 	acpi_handle dhandle, intel_handle;
 	acpi_handle dhandle, intel_handle;
@@ -276,11 +245,8 @@ void intel_register_dsm_handler(void)
 {
 {
 	if (!intel_dsm_detect())
 	if (!intel_dsm_detect())
 		return;
 		return;
-
-	vga_switcheroo_register_handler(&intel_dsm_handler);
 }
 }
 
 
 void intel_unregister_dsm_handler(void)
 void intel_unregister_dsm_handler(void)
 {
 {
-	vga_switcheroo_unregister_handler();
 }
 }

+ 30 - 7
drivers/gpu/drm/i915/intel_dp.c

@@ -479,6 +479,7 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
 	uint16_t address = algo_data->address;
 	uint16_t address = algo_data->address;
 	uint8_t msg[5];
 	uint8_t msg[5];
 	uint8_t reply[2];
 	uint8_t reply[2];
+	unsigned retry;
 	int msg_bytes;
 	int msg_bytes;
 	int reply_bytes;
 	int reply_bytes;
 	int ret;
 	int ret;
@@ -513,14 +514,33 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
 		break;
 		break;
 	}
 	}
 
 
-	for (;;) {
-	  ret = intel_dp_aux_ch(intel_dp,
-				msg, msg_bytes,
-				reply, reply_bytes);
+	for (retry = 0; retry < 5; retry++) {
+		ret = intel_dp_aux_ch(intel_dp,
+				      msg, msg_bytes,
+				      reply, reply_bytes);
 		if (ret < 0) {
 		if (ret < 0) {
 			DRM_DEBUG_KMS("aux_ch failed %d\n", ret);
 			DRM_DEBUG_KMS("aux_ch failed %d\n", ret);
 			return ret;
 			return ret;
 		}
 		}
+
+		switch (reply[0] & AUX_NATIVE_REPLY_MASK) {
+		case AUX_NATIVE_REPLY_ACK:
+			/* I2C-over-AUX Reply field is only valid
+			 * when paired with AUX ACK.
+			 */
+			break;
+		case AUX_NATIVE_REPLY_NACK:
+			DRM_DEBUG_KMS("aux_ch native nack\n");
+			return -EREMOTEIO;
+		case AUX_NATIVE_REPLY_DEFER:
+			udelay(100);
+			continue;
+		default:
+			DRM_ERROR("aux_ch invalid native reply 0x%02x\n",
+				  reply[0]);
+			return -EREMOTEIO;
+		}
+
 		switch (reply[0] & AUX_I2C_REPLY_MASK) {
 		switch (reply[0] & AUX_I2C_REPLY_MASK) {
 		case AUX_I2C_REPLY_ACK:
 		case AUX_I2C_REPLY_ACK:
 			if (mode == MODE_I2C_READ) {
 			if (mode == MODE_I2C_READ) {
@@ -528,17 +548,20 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
 			}
 			}
 			return reply_bytes - 1;
 			return reply_bytes - 1;
 		case AUX_I2C_REPLY_NACK:
 		case AUX_I2C_REPLY_NACK:
-			DRM_DEBUG_KMS("aux_ch nack\n");
+			DRM_DEBUG_KMS("aux_i2c nack\n");
 			return -EREMOTEIO;
 			return -EREMOTEIO;
 		case AUX_I2C_REPLY_DEFER:
 		case AUX_I2C_REPLY_DEFER:
-			DRM_DEBUG_KMS("aux_ch defer\n");
+			DRM_DEBUG_KMS("aux_i2c defer\n");
 			udelay(100);
 			udelay(100);
 			break;
 			break;
 		default:
 		default:
-			DRM_ERROR("aux_ch invalid reply 0x%02x\n", reply[0]);
+			DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]);
 			return -EREMOTEIO;
 			return -EREMOTEIO;
 		}
 		}
 	}
 	}
+
+	DRM_ERROR("too many retries, giving up\n");
+	return -EREMOTEIO;
 }
 }
 
 
 static int
 static int

+ 8 - 11
drivers/gpu/drm/i915/intel_ringbuffer.c

@@ -696,20 +696,17 @@ int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
 	unsigned long end;
 	unsigned long end;
 	u32 head;
 	u32 head;
 
 
-	head = intel_read_status_page(ring, 4);
-	if (head) {
-		ring->head = head & HEAD_ADDR;
-		ring->space = ring->head - (ring->tail + 8);
-		if (ring->space < 0)
-			ring->space += ring->size;
-		if (ring->space >= n)
-			return 0;
-	}
-
 	trace_i915_ring_wait_begin (dev);
 	trace_i915_ring_wait_begin (dev);
 	end = jiffies + 3 * HZ;
 	end = jiffies + 3 * HZ;
 	do {
 	do {
-		ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
+		/* If the reported head position has wrapped or hasn't advanced,
+		 * fallback to the slow and accurate path.
+		 */
+		head = intel_read_status_page(ring, 4);
+		if (head < ring->actual_head)
+			head = I915_READ_HEAD(ring);
+		ring->actual_head = head;
+		ring->head = head & HEAD_ADDR;
 		ring->space = ring->head - (ring->tail + 8);
 		ring->space = ring->head - (ring->tail + 8);
 		if (ring->space < 0)
 		if (ring->space < 0)
 			ring->space += ring->size;
 			ring->space += ring->size;

+ 3 - 2
drivers/gpu/drm/i915/intel_ringbuffer.h

@@ -44,8 +44,9 @@ struct  intel_ring_buffer {
 	struct		drm_device *dev;
 	struct		drm_device *dev;
 	struct		drm_i915_gem_object *obj;
 	struct		drm_i915_gem_object *obj;
 
 
-	unsigned int	head;
-	unsigned int	tail;
+	u32		actual_head;
+	u32		head;
+	u32		tail;
 	int		space;
 	int		space;
 	int		size;
 	int		size;
 	struct intel_hw_status_page status_page;
 	struct intel_hw_status_page status_page;

+ 6 - 3
drivers/gpu/drm/i915/intel_sdvo.c

@@ -1908,9 +1908,12 @@ intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv,
 		speed = mapping->i2c_speed;
 		speed = mapping->i2c_speed;
 	}
 	}
 
 
-	sdvo->i2c = &dev_priv->gmbus[pin].adapter;
-	intel_gmbus_set_speed(sdvo->i2c, speed);
-	intel_gmbus_force_bit(sdvo->i2c, true);
+	if (pin < GMBUS_NUM_PORTS) {
+		sdvo->i2c = &dev_priv->gmbus[pin].adapter;
+		intel_gmbus_set_speed(sdvo->i2c, speed);
+		intel_gmbus_force_bit(sdvo->i2c, true);
+	} else
+		sdvo->i2c = &dev_priv->gmbus[GMBUS_PORT_DPB].adapter;
 }
 }
 
 
 static bool
 static bool

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

@@ -1195,8 +1195,10 @@ void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
 				mc->vram_end, mc->real_vram_size >> 20);
 				mc->vram_end, mc->real_vram_size >> 20);
 	} else {
 	} else {
 		u64 base = 0;
 		u64 base = 0;
-		if (rdev->flags & RADEON_IS_IGP)
-			base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24;
+		if (rdev->flags & RADEON_IS_IGP) {
+			base = RREG32(MC_VM_FB_LOCATION) & 0xFFFF;
+			base <<= 24;
+		}
 		radeon_vram_location(rdev, &rdev->mc, base);
 		radeon_vram_location(rdev, &rdev->mc, base);
 		rdev->mc.gtt_base_align = 0;
 		rdev->mc.gtt_base_align = 0;
 		radeon_gtt_location(rdev, mc);
 		radeon_gtt_location(rdev, mc);

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

@@ -286,7 +286,7 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64
 		mc->mc_vram_size = mc->aper_size;
 		mc->mc_vram_size = mc->aper_size;
 	}
 	}
 	mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
 	mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
-	dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
+	dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
 			mc->mc_vram_size >> 20, mc->vram_start,
 			mc->mc_vram_size >> 20, mc->vram_start,
 			mc->vram_end, mc->real_vram_size >> 20);
 			mc->vram_end, mc->real_vram_size >> 20);
 }
 }
@@ -323,7 +323,7 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
 		mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
 		mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
 	}
 	}
 	mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
 	mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
-	dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n",
+	dev_info(rdev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
 			mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
 			mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
 }
 }
 
 

+ 11 - 2
drivers/gpu/drm/radeon/radeon_object.c

@@ -69,7 +69,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
 	u32 c = 0;
 	u32 c = 0;
 
 
 	rbo->placement.fpfn = 0;
 	rbo->placement.fpfn = 0;
-	rbo->placement.lpfn = rbo->rdev->mc.active_vram_size >> PAGE_SHIFT;
+	rbo->placement.lpfn = 0;
 	rbo->placement.placement = rbo->placements;
 	rbo->placement.placement = rbo->placements;
 	rbo->placement.busy_placement = rbo->placements;
 	rbo->placement.busy_placement = rbo->placements;
 	if (domain & RADEON_GEM_DOMAIN_VRAM)
 	if (domain & RADEON_GEM_DOMAIN_VRAM)
@@ -91,7 +91,8 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
 {
 {
 	struct radeon_bo *bo;
 	struct radeon_bo *bo;
 	enum ttm_bo_type type;
 	enum ttm_bo_type type;
-	int page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
+	unsigned long page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
+	unsigned long max_size = 0;
 	int r;
 	int r;
 
 
 	if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
 	if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
@@ -104,6 +105,14 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
 	}
 	}
 	*bo_ptr = NULL;
 	*bo_ptr = NULL;
 
 
+	/* maximun bo size is the minimun btw visible vram and gtt size */
+	max_size = min(rdev->mc.visible_vram_size, rdev->mc.gtt_size);
+	if ((page_align << PAGE_SHIFT) >= max_size) {
+		printk(KERN_WARNING "%s:%d alloc size %ldM bigger than %ldMb limit\n",
+			__func__, __LINE__, page_align  >> (20 - PAGE_SHIFT), max_size >> 20);
+		return -ENOMEM;
+	}
+
 retry:
 retry:
 	bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
 	bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
 	if (bo == NULL)
 	if (bo == NULL)

+ 1 - 0
drivers/hid/hid-core.c

@@ -1386,6 +1386,7 @@ static const struct hid_device_id hid_blacklist[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },

+ 1 - 1
drivers/hid/hid-egalax.c

@@ -221,7 +221,7 @@ static int egalax_probe(struct hid_device *hdev, const struct hid_device_id *id)
 	struct egalax_data *td;
 	struct egalax_data *td;
 	struct hid_report *report;
 	struct hid_report *report;
 
 
-	td = kmalloc(sizeof(struct egalax_data), GFP_KERNEL);
+	td = kzalloc(sizeof(struct egalax_data), GFP_KERNEL);
 	if (!td) {
 	if (!td) {
 		dev_err(&hdev->dev, "cannot allocate eGalax data\n");
 		dev_err(&hdev->dev, "cannot allocate eGalax data\n");
 		return -ENOMEM;
 		return -ENOMEM;

+ 12 - 9
drivers/hid/hid-input.c

@@ -174,7 +174,7 @@ static int hidinput_setkeycode(struct input_dev *dev,
 
 
 		clear_bit(*old_keycode, dev->keybit);
 		clear_bit(*old_keycode, dev->keybit);
 		set_bit(usage->code, dev->keybit);
 		set_bit(usage->code, dev->keybit);
-		dbg_hid(KERN_DEBUG "Assigned keycode %d to HID usage code %x\n",
+		dbg_hid("Assigned keycode %d to HID usage code %x\n",
 			usage->code, usage->hid);
 			usage->code, usage->hid);
 
 
 		/*
 		/*
@@ -203,8 +203,8 @@ static int hidinput_setkeycode(struct input_dev *dev,
  *
  *
  * as seen in the HID specification v1.11 6.2.2.7 Global Items.
  * as seen in the HID specification v1.11 6.2.2.7 Global Items.
  *
  *
- * Only exponent 1 length units are processed. Centimeters are converted to
- * inches. Degrees are converted to radians.
+ * Only exponent 1 length units are processed. Centimeters and inches are
+ * converted to millimeters. Degrees are converted to radians.
  */
  */
 static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
 static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
 {
 {
@@ -225,13 +225,16 @@ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
 	 */
 	 */
 	if (code == ABS_X || code == ABS_Y || code == ABS_Z) {
 	if (code == ABS_X || code == ABS_Y || code == ABS_Z) {
 		if (field->unit == 0x11) {		/* If centimeters */
 		if (field->unit == 0x11) {		/* If centimeters */
-			/* Convert to inches */
-			prev = logical_extents;
-			logical_extents *= 254;
-			if (logical_extents < prev)
+			/* Convert to millimeters */
+			unit_exponent += 1;
+		} else if (field->unit == 0x13) {	/* If inches */
+			/* Convert to millimeters */
+			prev = physical_extents;
+			physical_extents *= 254;
+			if (physical_extents < prev)
 				return 0;
 				return 0;
-			unit_exponent += 2;
-		} else if (field->unit != 0x13) {	/* If not inches */
+			unit_exponent -= 1;
+		} else {
 			return 0;
 			return 0;
 		}
 		}
 	} else if (code == ABS_RX || code == ABS_RY || code == ABS_RZ) {
 	} else if (code == ABS_RX || code == ABS_RY || code == ABS_RZ) {

+ 2 - 0
drivers/hid/hid-tmff.c

@@ -256,6 +256,8 @@ static const struct hid_device_id tm_devices[] = {
 		.driver_data = (unsigned long)ff_joystick },
 		.driver_data = (unsigned long)ff_joystick },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654),	/* FGT Force Feedback Wheel */
 	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654),	/* FGT Force Feedback Wheel */
 		.driver_data = (unsigned long)ff_joystick },
 		.driver_data = (unsigned long)ff_joystick },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a),	/* F430 Force Feedback Wheel */
+		.driver_data = (unsigned long)ff_joystick },
 	{ }
 	{ }
 };
 };
 MODULE_DEVICE_TABLE(hid, tm_devices);
 MODULE_DEVICE_TABLE(hid, tm_devices);

+ 1 - 2
drivers/i2c/Kconfig

@@ -75,8 +75,7 @@ config I2C_HELPER_AUTO
 	  In doubt, say Y.
 	  In doubt, say Y.
 
 
 config I2C_SMBUS
 config I2C_SMBUS
-	tristate
-	prompt "SMBus-specific protocols" if !I2C_HELPER_AUTO
+	tristate "SMBus-specific protocols" if !I2C_HELPER_AUTO
 	help
 	help
 	  Say Y here if you want support for SMBus extensions to the I2C
 	  Say Y here if you want support for SMBus extensions to the I2C
 	  specification. At the moment, the only supported extension is
 	  specification. At the moment, the only supported extension is

+ 1 - 13
drivers/i2c/algos/Kconfig

@@ -3,7 +3,7 @@
 #
 #
 
 
 menu "I2C Algorithms"
 menu "I2C Algorithms"
-	depends on !I2C_HELPER_AUTO
+	visible if !I2C_HELPER_AUTO
 
 
 config I2C_ALGOBIT
 config I2C_ALGOBIT
 	tristate "I2C bit-banging interfaces"
 	tristate "I2C bit-banging interfaces"
@@ -15,15 +15,3 @@ config I2C_ALGOPCA
 	tristate "I2C PCA 9564 interfaces"
 	tristate "I2C PCA 9564 interfaces"
 
 
 endmenu
 endmenu
-
-# In automatic configuration mode, we still have to define the
-# symbols to avoid unmet dependencies.
-
-if I2C_HELPER_AUTO
-config I2C_ALGOBIT
-	tristate
-config I2C_ALGOPCF
-	tristate
-config I2C_ALGOPCA
-	tristate
-endif

+ 1 - 0
drivers/input/joystick/turbografx.c

@@ -245,6 +245,7 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs)
 		goto err_free_tgfx;
 		goto err_free_tgfx;
         }
         }
 
 
+	parport_put_port(pp);
 	return tgfx;
 	return tgfx;
 
 
  err_free_dev:
  err_free_dev:

+ 16 - 0
drivers/input/keyboard/Kconfig

@@ -179,6 +179,22 @@ config KEYBOARD_GPIO
 	  To compile this driver as a module, choose M here: the
 	  To compile this driver as a module, choose M here: the
 	  module will be called gpio_keys.
 	  module will be called gpio_keys.
 
 
+config KEYBOARD_GPIO_POLLED
+	tristate "Polled GPIO buttons"
+	depends on GENERIC_GPIO
+	select INPUT_POLLDEV
+	help
+	  This driver implements support for buttons connected
+	  to GPIO pins that are not capable of generating interrupts.
+
+	  Say Y here if your device has buttons connected
+	  directly to such GPIO pins.  Your board-specific
+	  setup logic must also provide a platform device,
+	  with configuration data saying which GPIOs are used.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called gpio_keys_polled.
+
 config KEYBOARD_TCA6416
 config KEYBOARD_TCA6416
 	tristate "TCA6416 Keypad Support"
 	tristate "TCA6416 Keypad Support"
 	depends on I2C
 	depends on I2C

+ 1 - 0
drivers/input/keyboard/Makefile

@@ -14,6 +14,7 @@ obj-$(CONFIG_KEYBOARD_BFIN)		+= bf54x-keys.o
 obj-$(CONFIG_KEYBOARD_DAVINCI)		+= davinci_keyscan.o
 obj-$(CONFIG_KEYBOARD_DAVINCI)		+= davinci_keyscan.o
 obj-$(CONFIG_KEYBOARD_EP93XX)		+= ep93xx_keypad.o
 obj-$(CONFIG_KEYBOARD_EP93XX)		+= ep93xx_keypad.o
 obj-$(CONFIG_KEYBOARD_GPIO)		+= gpio_keys.o
 obj-$(CONFIG_KEYBOARD_GPIO)		+= gpio_keys.o
+obj-$(CONFIG_KEYBOARD_GPIO_POLLED)	+= gpio_keys_polled.o
 obj-$(CONFIG_KEYBOARD_TCA6416)		+= tca6416-keypad.o
 obj-$(CONFIG_KEYBOARD_TCA6416)		+= tca6416-keypad.o
 obj-$(CONFIG_KEYBOARD_HIL)		+= hil_kbd.o
 obj-$(CONFIG_KEYBOARD_HIL)		+= hil_kbd.o
 obj-$(CONFIG_KEYBOARD_HIL_OLD)		+= hilkbd.o
 obj-$(CONFIG_KEYBOARD_HIL_OLD)		+= hilkbd.o

+ 261 - 0
drivers/input/keyboard/gpio_keys_polled.c

@@ -0,0 +1,261 @@
+/*
+ *  Driver for buttons on GPIO lines not capable of generating interrupts
+ *
+ *  Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2010 Nuno Goncalves <nunojpg@gmail.com>
+ *
+ *  This file was based on: /drivers/input/misc/cobalt_btns.c
+ *	Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
+ *
+ *  also was based on: /drivers/input/keyboard/gpio_keys.c
+ *	Copyright 2005 Phil Blundell
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/input.h>
+#include <linux/input-polldev.h>
+#include <linux/ioport.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/gpio_keys.h>
+
+#define DRV_NAME	"gpio-keys-polled"
+
+struct gpio_keys_button_data {
+	int last_state;
+	int count;
+	int threshold;
+	int can_sleep;
+};
+
+struct gpio_keys_polled_dev {
+	struct input_polled_dev *poll_dev;
+	struct device *dev;
+	struct gpio_keys_platform_data *pdata;
+	struct gpio_keys_button_data data[0];
+};
+
+static void gpio_keys_polled_check_state(struct input_dev *input,
+					 struct gpio_keys_button *button,
+					 struct gpio_keys_button_data *bdata)
+{
+	int state;
+
+	if (bdata->can_sleep)
+		state = !!gpio_get_value_cansleep(button->gpio);
+	else
+		state = !!gpio_get_value(button->gpio);
+
+	if (state != bdata->last_state) {
+		unsigned int type = button->type ?: EV_KEY;
+
+		input_event(input, type, button->code,
+			    !!(state ^ button->active_low));
+		input_sync(input);
+		bdata->count = 0;
+		bdata->last_state = state;
+	}
+}
+
+static void gpio_keys_polled_poll(struct input_polled_dev *dev)
+{
+	struct gpio_keys_polled_dev *bdev = dev->private;
+	struct gpio_keys_platform_data *pdata = bdev->pdata;
+	struct input_dev *input = dev->input;
+	int i;
+
+	for (i = 0; i < bdev->pdata->nbuttons; i++) {
+		struct gpio_keys_button_data *bdata = &bdev->data[i];
+
+		if (bdata->count < bdata->threshold)
+			bdata->count++;
+		else
+			gpio_keys_polled_check_state(input, &pdata->buttons[i],
+						     bdata);
+	}
+}
+
+static void gpio_keys_polled_open(struct input_polled_dev *dev)
+{
+	struct gpio_keys_polled_dev *bdev = dev->private;
+	struct gpio_keys_platform_data *pdata = bdev->pdata;
+
+	if (pdata->enable)
+		pdata->enable(bdev->dev);
+}
+
+static void gpio_keys_polled_close(struct input_polled_dev *dev)
+{
+	struct gpio_keys_polled_dev *bdev = dev->private;
+	struct gpio_keys_platform_data *pdata = bdev->pdata;
+
+	if (pdata->disable)
+		pdata->disable(bdev->dev);
+}
+
+static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
+{
+	struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
+	struct device *dev = &pdev->dev;
+	struct gpio_keys_polled_dev *bdev;
+	struct input_polled_dev *poll_dev;
+	struct input_dev *input;
+	int error;
+	int i;
+
+	if (!pdata || !pdata->poll_interval)
+		return -EINVAL;
+
+	bdev = kzalloc(sizeof(struct gpio_keys_polled_dev) +
+		       pdata->nbuttons * sizeof(struct gpio_keys_button_data),
+		       GFP_KERNEL);
+	if (!bdev) {
+		dev_err(dev, "no memory for private data\n");
+		return -ENOMEM;
+	}
+
+	poll_dev = input_allocate_polled_device();
+	if (!poll_dev) {
+		dev_err(dev, "no memory for polled device\n");
+		error = -ENOMEM;
+		goto err_free_bdev;
+	}
+
+	poll_dev->private = bdev;
+	poll_dev->poll = gpio_keys_polled_poll;
+	poll_dev->poll_interval = pdata->poll_interval;
+	poll_dev->open = gpio_keys_polled_open;
+	poll_dev->close = gpio_keys_polled_close;
+
+	input = poll_dev->input;
+
+	input->evbit[0] = BIT(EV_KEY);
+	input->name = pdev->name;
+	input->phys = DRV_NAME"/input0";
+	input->dev.parent = &pdev->dev;
+
+	input->id.bustype = BUS_HOST;
+	input->id.vendor = 0x0001;
+	input->id.product = 0x0001;
+	input->id.version = 0x0100;
+
+	for (i = 0; i < pdata->nbuttons; i++) {
+		struct gpio_keys_button *button = &pdata->buttons[i];
+		struct gpio_keys_button_data *bdata = &bdev->data[i];
+		unsigned int gpio = button->gpio;
+		unsigned int type = button->type ?: EV_KEY;
+
+		if (button->wakeup) {
+			dev_err(dev, DRV_NAME " does not support wakeup\n");
+			error = -EINVAL;
+			goto err_free_gpio;
+		}
+
+		error = gpio_request(gpio,
+				     button->desc ? button->desc : DRV_NAME);
+		if (error) {
+			dev_err(dev, "unable to claim gpio %u, err=%d\n",
+				gpio, error);
+			goto err_free_gpio;
+		}
+
+		error = gpio_direction_input(gpio);
+		if (error) {
+			dev_err(dev,
+				"unable to set direction on gpio %u, err=%d\n",
+				gpio, error);
+			goto err_free_gpio;
+		}
+
+		bdata->can_sleep = gpio_cansleep(gpio);
+		bdata->last_state = -1;
+		bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
+						pdata->poll_interval);
+
+		input_set_capability(input, type, button->code);
+	}
+
+	bdev->poll_dev = poll_dev;
+	bdev->dev = dev;
+	bdev->pdata = pdata;
+	platform_set_drvdata(pdev, bdev);
+
+	error = input_register_polled_device(poll_dev);
+	if (error) {
+		dev_err(dev, "unable to register polled device, err=%d\n",
+			error);
+		goto err_free_gpio;
+	}
+
+	/* report initial state of the buttons */
+	for (i = 0; i < pdata->nbuttons; i++)
+		gpio_keys_polled_check_state(input, &pdata->buttons[i],
+					 &bdev->data[i]);
+
+	return 0;
+
+err_free_gpio:
+	while (--i >= 0)
+		gpio_free(pdata->buttons[i].gpio);
+
+	input_free_polled_device(poll_dev);
+
+err_free_bdev:
+	kfree(bdev);
+
+	platform_set_drvdata(pdev, NULL);
+	return error;
+}
+
+static int __devexit gpio_keys_polled_remove(struct platform_device *pdev)
+{
+	struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev);
+	struct gpio_keys_platform_data *pdata = bdev->pdata;
+	int i;
+
+	input_unregister_polled_device(bdev->poll_dev);
+
+	for (i = 0; i < pdata->nbuttons; i++)
+		gpio_free(pdata->buttons[i].gpio);
+
+	input_free_polled_device(bdev->poll_dev);
+
+	kfree(bdev);
+	platform_set_drvdata(pdev, NULL);
+
+	return 0;
+}
+
+static struct platform_driver gpio_keys_polled_driver = {
+	.probe	= gpio_keys_polled_probe,
+	.remove	= __devexit_p(gpio_keys_polled_remove),
+	.driver	= {
+		.name	= DRV_NAME,
+		.owner	= THIS_MODULE,
+	},
+};
+
+static int __init gpio_keys_polled_init(void)
+{
+	return platform_driver_register(&gpio_keys_polled_driver);
+}
+
+static void __exit gpio_keys_polled_exit(void)
+{
+	platform_driver_unregister(&gpio_keys_polled_driver);
+}
+
+module_init(gpio_keys_polled_init);
+module_exit(gpio_keys_polled_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
+MODULE_DESCRIPTION("Polled GPIO Buttons driver");
+MODULE_ALIAS("platform:" DRV_NAME);

+ 2 - 1
drivers/input/mouse/synaptics.h

@@ -51,7 +51,8 @@
 #define SYN_EXT_CAP_REQUESTS(c)		(((c) & 0x700000) >> 20)
 #define SYN_EXT_CAP_REQUESTS(c)		(((c) & 0x700000) >> 20)
 #define SYN_CAP_MULTI_BUTTON_NO(ec)	(((ec) & 0x00f000) >> 12)
 #define SYN_CAP_MULTI_BUTTON_NO(ec)	(((ec) & 0x00f000) >> 12)
 #define SYN_CAP_PRODUCT_ID(ec)		(((ec) & 0xff0000) >> 16)
 #define SYN_CAP_PRODUCT_ID(ec)		(((ec) & 0xff0000) >> 16)
-#define SYN_CAP_CLICKPAD(ex0c)		((ex0c) & 0x100100)
+#define SYN_CAP_CLICKPAD(ex0c)		((ex0c) & 0x100000) /* 1-button ClickPad */
+#define SYN_CAP_CLICKPAD2BTN(ex0c)	((ex0c) & 0x000100) /* 2-button ClickPad */
 #define SYN_CAP_MAX_DIMENSIONS(ex0c)	((ex0c) & 0x020000)
 #define SYN_CAP_MAX_DIMENSIONS(ex0c)	((ex0c) & 0x020000)
 
 
 /* synaptics modes query bits */
 /* synaptics modes query bits */

+ 1 - 1
drivers/input/serio/gscps2.c

@@ -358,7 +358,7 @@ static int __devinit gscps2_probe(struct parisc_device *dev)
 	gscps2_reset(ps2port);
 	gscps2_reset(ps2port);
 	ps2port->id = readb(ps2port->addr + GSC_ID) & 0x0f;
 	ps2port->id = readb(ps2port->addr + GSC_ID) & 0x0f;
 
 
-	snprintf(serio->name, sizeof(serio->name), "GSC PS/2 %s",
+	snprintf(serio->name, sizeof(serio->name), "gsc-ps2-%s",
 		 (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse");
 		 (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse");
 	strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys));
 	strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys));
 	serio->id.type		= SERIO_8042;
 	serio->id.type		= SERIO_8042;

+ 9 - 0
drivers/input/tablet/wacom_wac.c

@@ -1436,6 +1436,12 @@ static struct wacom_features wacom_features_0xD2 =
 	{ "Wacom Bamboo Craft",   WACOM_PKGLEN_BBFUN,     14720,  9200, 1023, 63, BAMBOO_PT };
 	{ "Wacom Bamboo Craft",   WACOM_PKGLEN_BBFUN,     14720,  9200, 1023, 63, BAMBOO_PT };
 static struct wacom_features wacom_features_0xD3 =
 static struct wacom_features wacom_features_0xD3 =
 	{ "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN,     21648, 13530, 1023, 63, BAMBOO_PT };
 	{ "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN,     21648, 13530, 1023, 63, BAMBOO_PT };
+static struct wacom_features wacom_features_0xD8 =
+	{ "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN,   21648, 13530, 1023, 63, BAMBOO_PT };
+static struct wacom_features wacom_features_0xDA =
+	{ "Wacom Bamboo 2FG 4x5 SE", WACOM_PKGLEN_BBFUN,  14720,  9200, 1023, 63, BAMBOO_PT };
+static struct wacom_features wacom_features_0xDB =
+	{ "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN,  21648, 13530, 1023, 63, BAMBOO_PT };
 
 
 #define USB_DEVICE_WACOM(prod)					\
 #define USB_DEVICE_WACOM(prod)					\
 	USB_DEVICE(USB_VENDOR_ID_WACOM, prod),			\
 	USB_DEVICE(USB_VENDOR_ID_WACOM, prod),			\
@@ -1504,6 +1510,9 @@ const struct usb_device_id wacom_ids[] = {
 	{ USB_DEVICE_WACOM(0xD1) },
 	{ USB_DEVICE_WACOM(0xD1) },
 	{ USB_DEVICE_WACOM(0xD2) },
 	{ USB_DEVICE_WACOM(0xD2) },
 	{ USB_DEVICE_WACOM(0xD3) },
 	{ USB_DEVICE_WACOM(0xD3) },
+	{ USB_DEVICE_WACOM(0xD8) },
+	{ USB_DEVICE_WACOM(0xDA) },
+	{ USB_DEVICE_WACOM(0xDB) },
 	{ USB_DEVICE_WACOM(0xF0) },
 	{ USB_DEVICE_WACOM(0xF0) },
 	{ USB_DEVICE_WACOM(0xCC) },
 	{ USB_DEVICE_WACOM(0xCC) },
 	{ USB_DEVICE_WACOM(0x90) },
 	{ USB_DEVICE_WACOM(0x90) },

+ 1 - 0
drivers/input/touchscreen/usbtouchscreen.c

@@ -178,6 +178,7 @@ static const struct usb_device_id usbtouch_devices[] = {
 
 
 #ifdef CONFIG_TOUCHSCREEN_USB_ITM
 #ifdef CONFIG_TOUCHSCREEN_USB_ITM
 	{USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM},
 	{USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM},
+	{USB_DEVICE(0x16e3, 0xf9e9), .driver_info = DEVTYPE_ITM},
 #endif
 #endif
 
 
 #ifdef CONFIG_TOUCHSCREEN_USB_ETURBO
 #ifdef CONFIG_TOUCHSCREEN_USB_ETURBO

+ 41 - 9
drivers/leds/Kconfig

@@ -7,20 +7,20 @@ menuconfig NEW_LEDS
 	  This is not related to standard keyboard LEDs which are controlled
 	  This is not related to standard keyboard LEDs which are controlled
 	  via the input system.
 	  via the input system.
 
 
-if NEW_LEDS
-
 config LEDS_CLASS
 config LEDS_CLASS
 	bool "LED Class Support"
 	bool "LED Class Support"
+	depends on NEW_LEDS
 	help
 	help
 	  This option enables the led sysfs class in /sys/class/leds.  You'll
 	  This option enables the led sysfs class in /sys/class/leds.  You'll
 	  need this to do anything useful with LEDs.  If unsure, say N.
 	  need this to do anything useful with LEDs.  If unsure, say N.
 
 
-if LEDS_CLASS
+if NEW_LEDS
 
 
 comment "LED drivers"
 comment "LED drivers"
 
 
 config LEDS_88PM860X
 config LEDS_88PM860X
 	tristate "LED Support for Marvell 88PM860x PMIC"
 	tristate "LED Support for Marvell 88PM860x PMIC"
+	depends on LEDS_CLASS
 	depends on MFD_88PM860X
 	depends on MFD_88PM860X
 	help
 	help
 	  This option enables support for on-chip LED drivers found on Marvell
 	  This option enables support for on-chip LED drivers found on Marvell
@@ -28,6 +28,7 @@ config LEDS_88PM860X
 
 
 config LEDS_ATMEL_PWM
 config LEDS_ATMEL_PWM
 	tristate "LED Support using Atmel PWM outputs"
 	tristate "LED Support using Atmel PWM outputs"
+	depends on LEDS_CLASS
 	depends on ATMEL_PWM
 	depends on ATMEL_PWM
 	help
 	help
 	  This option enables support for LEDs driven using outputs
 	  This option enables support for LEDs driven using outputs
@@ -35,6 +36,7 @@ config LEDS_ATMEL_PWM
 
 
 config LEDS_LOCOMO
 config LEDS_LOCOMO
 	tristate "LED Support for Locomo device"
 	tristate "LED Support for Locomo device"
+	depends on LEDS_CLASS
 	depends on SHARP_LOCOMO
 	depends on SHARP_LOCOMO
 	help
 	help
 	  This option enables support for the LEDs on Sharp Locomo.
 	  This option enables support for the LEDs on Sharp Locomo.
@@ -42,6 +44,7 @@ config LEDS_LOCOMO
 
 
 config LEDS_MIKROTIK_RB532
 config LEDS_MIKROTIK_RB532
 	tristate "LED Support for Mikrotik Routerboard 532"
 	tristate "LED Support for Mikrotik Routerboard 532"
+	depends on LEDS_CLASS
 	depends on MIKROTIK_RB532
 	depends on MIKROTIK_RB532
 	help
 	help
 	  This option enables support for the so called "User LED" of
 	  This option enables support for the so called "User LED" of
@@ -49,6 +52,7 @@ config LEDS_MIKROTIK_RB532
 
 
 config LEDS_S3C24XX
 config LEDS_S3C24XX
 	tristate "LED Support for Samsung S3C24XX GPIO LEDs"
 	tristate "LED Support for Samsung S3C24XX GPIO LEDs"
+	depends on LEDS_CLASS
 	depends on ARCH_S3C2410
 	depends on ARCH_S3C2410
 	help
 	help
 	  This option enables support for LEDs connected to GPIO lines
 	  This option enables support for LEDs connected to GPIO lines
@@ -56,12 +60,14 @@ config LEDS_S3C24XX
 
 
 config LEDS_AMS_DELTA
 config LEDS_AMS_DELTA
 	tristate "LED Support for the Amstrad Delta (E3)"
 	tristate "LED Support for the Amstrad Delta (E3)"
+	depends on LEDS_CLASS
 	depends on MACH_AMS_DELTA
 	depends on MACH_AMS_DELTA
 	help
 	help
 	  This option enables support for the LEDs on Amstrad Delta (E3).
 	  This option enables support for the LEDs on Amstrad Delta (E3).
 
 
 config LEDS_NET48XX
 config LEDS_NET48XX
 	tristate "LED Support for Soekris net48xx series Error LED"
 	tristate "LED Support for Soekris net48xx series Error LED"
+	depends on LEDS_CLASS
 	depends on SCx200_GPIO
 	depends on SCx200_GPIO
 	help
 	help
 	  This option enables support for the Soekris net4801 and net4826 error
 	  This option enables support for the Soekris net4801 and net4826 error
@@ -79,18 +85,21 @@ config LEDS_NET5501
 
 
 config LEDS_FSG
 config LEDS_FSG
 	tristate "LED Support for the Freecom FSG-3"
 	tristate "LED Support for the Freecom FSG-3"
+	depends on LEDS_CLASS
 	depends on MACH_FSG
 	depends on MACH_FSG
 	help
 	help
 	  This option enables support for the LEDs on the Freecom FSG-3.
 	  This option enables support for the LEDs on the Freecom FSG-3.
 
 
 config LEDS_WRAP
 config LEDS_WRAP
 	tristate "LED Support for the WRAP series LEDs"
 	tristate "LED Support for the WRAP series LEDs"
+	depends on LEDS_CLASS
 	depends on SCx200_GPIO
 	depends on SCx200_GPIO
 	help
 	help
 	  This option enables support for the PCEngines WRAP programmable LEDs.
 	  This option enables support for the PCEngines WRAP programmable LEDs.
 
 
 config LEDS_ALIX2
 config LEDS_ALIX2
 	tristate "LED Support for ALIX.2 and ALIX.3 series"
 	tristate "LED Support for ALIX.2 and ALIX.3 series"
+	depends on LEDS_CLASS
 	depends on X86 && !GPIO_CS5535 && !CS5535_GPIO
 	depends on X86 && !GPIO_CS5535 && !CS5535_GPIO
 	help
 	help
 	  This option enables support for the PCEngines ALIX.2 and ALIX.3 LEDs.
 	  This option enables support for the PCEngines ALIX.2 and ALIX.3 LEDs.
@@ -98,12 +107,14 @@ config LEDS_ALIX2
 
 
 config LEDS_H1940
 config LEDS_H1940
 	tristate "LED Support for iPAQ H1940 device"
 	tristate "LED Support for iPAQ H1940 device"
+	depends on LEDS_CLASS
 	depends on ARCH_H1940
 	depends on ARCH_H1940
 	help
 	help
 	  This option enables support for the LEDs on the h1940.
 	  This option enables support for the LEDs on the h1940.
 
 
 config LEDS_COBALT_QUBE
 config LEDS_COBALT_QUBE
 	tristate "LED Support for the Cobalt Qube series front LED"
 	tristate "LED Support for the Cobalt Qube series front LED"
+	depends on LEDS_CLASS
 	depends on MIPS_COBALT
 	depends on MIPS_COBALT
 	help
 	help
 	  This option enables support for the front LED on Cobalt Qube series
 	  This option enables support for the front LED on Cobalt Qube series
@@ -117,6 +128,7 @@ config LEDS_COBALT_RAQ
 
 
 config LEDS_SUNFIRE
 config LEDS_SUNFIRE
 	tristate "LED support for SunFire servers."
 	tristate "LED support for SunFire servers."
+	depends on LEDS_CLASS
 	depends on SPARC64
 	depends on SPARC64
 	select LEDS_TRIGGERS
 	select LEDS_TRIGGERS
 	help
 	help
@@ -125,6 +137,7 @@ config LEDS_SUNFIRE
 
 
 config LEDS_HP6XX
 config LEDS_HP6XX
 	tristate "LED Support for the HP Jornada 6xx"
 	tristate "LED Support for the HP Jornada 6xx"
+	depends on LEDS_CLASS
 	depends on SH_HP6XX
 	depends on SH_HP6XX
 	help
 	help
 	  This option enables LED support for the handheld
 	  This option enables LED support for the handheld
@@ -132,6 +145,7 @@ config LEDS_HP6XX
 
 
 config LEDS_PCA9532
 config LEDS_PCA9532
 	tristate "LED driver for PCA9532 dimmer"
 	tristate "LED driver for PCA9532 dimmer"
+	depends on LEDS_CLASS
 	depends on I2C && INPUT && EXPERIMENTAL
 	depends on I2C && INPUT && EXPERIMENTAL
 	help
 	help
 	  This option enables support for NXP pca9532
 	  This option enables support for NXP pca9532
@@ -140,6 +154,7 @@ config LEDS_PCA9532
 
 
 config LEDS_GPIO
 config LEDS_GPIO
 	tristate "LED Support for GPIO connected LEDs"
 	tristate "LED Support for GPIO connected LEDs"
+	depends on LEDS_CLASS
 	depends on GENERIC_GPIO
 	depends on GENERIC_GPIO
 	help
 	help
 	  This option enables support for the LEDs connected to GPIO
 	  This option enables support for the LEDs connected to GPIO
@@ -167,6 +182,7 @@ config LEDS_GPIO_OF
 
 
 config LEDS_LP3944
 config LEDS_LP3944
 	tristate "LED Support for N.S. LP3944 (Fun Light) I2C chip"
 	tristate "LED Support for N.S. LP3944 (Fun Light) I2C chip"
+	depends on LEDS_CLASS
 	depends on I2C
 	depends on I2C
 	help
 	help
 	  This option enables support for LEDs connected to the National
 	  This option enables support for LEDs connected to the National
@@ -196,6 +212,7 @@ config LEDS_LP5523
 
 
 config LEDS_CLEVO_MAIL
 config LEDS_CLEVO_MAIL
 	tristate "Mail LED on Clevo notebook"
 	tristate "Mail LED on Clevo notebook"
+	depends on LEDS_CLASS
 	depends on X86 && SERIO_I8042 && DMI
 	depends on X86 && SERIO_I8042 && DMI
 	help
 	help
 	  This driver makes the mail LED accessible from userspace
 	  This driver makes the mail LED accessible from userspace
@@ -226,6 +243,7 @@ config LEDS_CLEVO_MAIL
 
 
 config LEDS_PCA955X
 config LEDS_PCA955X
 	tristate "LED Support for PCA955x I2C chips"
 	tristate "LED Support for PCA955x I2C chips"
+	depends on LEDS_CLASS
 	depends on I2C
 	depends on I2C
 	help
 	help
 	  This option enables support for LEDs connected to PCA955x
 	  This option enables support for LEDs connected to PCA955x
@@ -234,6 +252,7 @@ config LEDS_PCA955X
 
 
 config LEDS_WM831X_STATUS
 config LEDS_WM831X_STATUS
 	tristate "LED support for status LEDs on WM831x PMICs"
 	tristate "LED support for status LEDs on WM831x PMICs"
+	depends on LEDS_CLASS
 	depends on MFD_WM831X
 	depends on MFD_WM831X
 	help
 	help
 	  This option enables support for the status LEDs of the WM831x
 	  This option enables support for the status LEDs of the WM831x
@@ -241,6 +260,7 @@ config LEDS_WM831X_STATUS
 
 
 config LEDS_WM8350
 config LEDS_WM8350
 	tristate "LED Support for WM8350 AudioPlus PMIC"
 	tristate "LED Support for WM8350 AudioPlus PMIC"
+	depends on LEDS_CLASS
 	depends on MFD_WM8350
 	depends on MFD_WM8350
 	help
 	help
 	  This option enables support for LEDs driven by the Wolfson
 	  This option enables support for LEDs driven by the Wolfson
@@ -248,6 +268,7 @@ config LEDS_WM8350
 
 
 config LEDS_DA903X
 config LEDS_DA903X
 	tristate "LED Support for DA9030/DA9034 PMIC"
 	tristate "LED Support for DA9030/DA9034 PMIC"
+	depends on LEDS_CLASS
 	depends on PMIC_DA903X
 	depends on PMIC_DA903X
 	help
 	help
 	  This option enables support for on-chip LED drivers found
 	  This option enables support for on-chip LED drivers found
@@ -255,6 +276,7 @@ config LEDS_DA903X
 
 
 config LEDS_DAC124S085
 config LEDS_DAC124S085
 	tristate "LED Support for DAC124S085 SPI DAC"
 	tristate "LED Support for DAC124S085 SPI DAC"
+	depends on LEDS_CLASS
 	depends on SPI
 	depends on SPI
 	help
 	help
 	  This option enables support for DAC124S085 SPI DAC from NatSemi,
 	  This option enables support for DAC124S085 SPI DAC from NatSemi,
@@ -262,18 +284,21 @@ config LEDS_DAC124S085
 
 
 config LEDS_PWM
 config LEDS_PWM
 	tristate "PWM driven LED Support"
 	tristate "PWM driven LED Support"
+	depends on LEDS_CLASS
 	depends on HAVE_PWM
 	depends on HAVE_PWM
 	help
 	help
 	  This option enables support for pwm driven LEDs
 	  This option enables support for pwm driven LEDs
 
 
 config LEDS_REGULATOR
 config LEDS_REGULATOR
 	tristate "REGULATOR driven LED support"
 	tristate "REGULATOR driven LED support"
+	depends on LEDS_CLASS
 	depends on REGULATOR
 	depends on REGULATOR
 	help
 	help
 	  This option enables support for regulator driven LEDs.
 	  This option enables support for regulator driven LEDs.
 
 
 config LEDS_BD2802
 config LEDS_BD2802
 	tristate "LED driver for BD2802 RGB LED"
 	tristate "LED driver for BD2802 RGB LED"
+	depends on LEDS_CLASS
 	depends on I2C
 	depends on I2C
 	help
 	help
 	  This option enables support for BD2802GU RGB LED driver chips
 	  This option enables support for BD2802GU RGB LED driver chips
@@ -281,6 +306,7 @@ config LEDS_BD2802
 
 
 config LEDS_INTEL_SS4200
 config LEDS_INTEL_SS4200
 	tristate "LED driver for Intel NAS SS4200 series"
 	tristate "LED driver for Intel NAS SS4200 series"
+	depends on LEDS_CLASS
 	depends on PCI && DMI
 	depends on PCI && DMI
 	help
 	help
 	  This option enables support for the Intel SS4200 series of
 	  This option enables support for the Intel SS4200 series of
@@ -290,6 +316,7 @@ config LEDS_INTEL_SS4200
 
 
 config LEDS_LT3593
 config LEDS_LT3593
 	tristate "LED driver for LT3593 controllers"
 	tristate "LED driver for LT3593 controllers"
+	depends on LEDS_CLASS
 	depends on GENERIC_GPIO
 	depends on GENERIC_GPIO
 	help
 	help
 	  This option enables support for LEDs driven by a Linear Technology
 	  This option enables support for LEDs driven by a Linear Technology
@@ -298,6 +325,7 @@ config LEDS_LT3593
 
 
 config LEDS_ADP5520
 config LEDS_ADP5520
 	tristate "LED Support for ADP5520/ADP5501 PMIC"
 	tristate "LED Support for ADP5520/ADP5501 PMIC"
+	depends on LEDS_CLASS
 	depends on PMIC_ADP5520
 	depends on PMIC_ADP5520
 	help
 	help
 	  This option enables support for on-chip LED drivers found
 	  This option enables support for on-chip LED drivers found
@@ -308,6 +336,7 @@ config LEDS_ADP5520
 
 
 config LEDS_DELL_NETBOOKS
 config LEDS_DELL_NETBOOKS
 	tristate "External LED on Dell Business Netbooks"
 	tristate "External LED on Dell Business Netbooks"
+	depends on LEDS_CLASS
 	depends on X86 && ACPI_WMI
 	depends on X86 && ACPI_WMI
 	help
 	help
 	  This adds support for the Latitude 2100 and similar
 	  This adds support for the Latitude 2100 and similar
@@ -315,6 +344,7 @@ config LEDS_DELL_NETBOOKS
 
 
 config LEDS_MC13783
 config LEDS_MC13783
 	tristate "LED Support for MC13783 PMIC"
 	tristate "LED Support for MC13783 PMIC"
+	depends on LEDS_CLASS
 	depends on MFD_MC13783
 	depends on MFD_MC13783
 	help
 	help
 	  This option enable support for on-chip LED drivers found
 	  This option enable support for on-chip LED drivers found
@@ -322,6 +352,7 @@ config LEDS_MC13783
 
 
 config LEDS_NS2
 config LEDS_NS2
 	tristate "LED support for Network Space v2 GPIO LEDs"
 	tristate "LED support for Network Space v2 GPIO LEDs"
+	depends on LEDS_CLASS
 	depends on MACH_NETSPACE_V2 || MACH_INETSPACE_V2 || MACH_NETSPACE_MAX_V2 || D2NET_V2
 	depends on MACH_NETSPACE_V2 || MACH_INETSPACE_V2 || MACH_NETSPACE_MAX_V2 || D2NET_V2
 	default y
 	default y
 	help
 	help
@@ -340,17 +371,17 @@ config LEDS_NETXBIG
 
 
 config LEDS_TRIGGERS
 config LEDS_TRIGGERS
 	bool "LED Trigger support"
 	bool "LED Trigger support"
+	depends on LEDS_CLASS
 	help
 	help
 	  This option enables trigger support for the leds class.
 	  This option enables trigger support for the leds class.
 	  These triggers allow kernel events to drive the LEDs and can
 	  These triggers allow kernel events to drive the LEDs and can
 	  be configured via sysfs. If unsure, say Y.
 	  be configured via sysfs. If unsure, say Y.
 
 
-if LEDS_TRIGGERS
-
 comment "LED Triggers"
 comment "LED Triggers"
 
 
 config LEDS_TRIGGER_TIMER
 config LEDS_TRIGGER_TIMER
 	tristate "LED Timer Trigger"
 	tristate "LED Timer Trigger"
+	depends on LEDS_TRIGGERS
 	help
 	help
 	  This allows LEDs to be controlled by a programmable timer
 	  This allows LEDs to be controlled by a programmable timer
 	  via sysfs. Some LED hardware can be programmed to start
 	  via sysfs. Some LED hardware can be programmed to start
@@ -362,12 +393,14 @@ config LEDS_TRIGGER_TIMER
 config LEDS_TRIGGER_IDE_DISK
 config LEDS_TRIGGER_IDE_DISK
 	bool "LED IDE Disk Trigger"
 	bool "LED IDE Disk Trigger"
 	depends on IDE_GD_ATA
 	depends on IDE_GD_ATA
+	depends on LEDS_TRIGGERS
 	help
 	help
 	  This allows LEDs to be controlled by IDE disk activity.
 	  This allows LEDs to be controlled by IDE disk activity.
 	  If unsure, say Y.
 	  If unsure, say Y.
 
 
 config LEDS_TRIGGER_HEARTBEAT
 config LEDS_TRIGGER_HEARTBEAT
 	tristate "LED Heartbeat Trigger"
 	tristate "LED Heartbeat Trigger"
+	depends on LEDS_TRIGGERS
 	help
 	help
 	  This allows LEDs to be controlled by a CPU load average.
 	  This allows LEDs to be controlled by a CPU load average.
 	  The flash frequency is a hyperbolic function of the 1-minute
 	  The flash frequency is a hyperbolic function of the 1-minute
@@ -376,6 +409,7 @@ config LEDS_TRIGGER_HEARTBEAT
 
 
 config LEDS_TRIGGER_BACKLIGHT
 config LEDS_TRIGGER_BACKLIGHT
 	tristate "LED backlight Trigger"
 	tristate "LED backlight Trigger"
+	depends on LEDS_TRIGGERS
 	help
 	help
 	  This allows LEDs to be controlled as a backlight device: they
 	  This allows LEDs to be controlled as a backlight device: they
 	  turn off and on when the display is blanked and unblanked.
 	  turn off and on when the display is blanked and unblanked.
@@ -384,6 +418,7 @@ config LEDS_TRIGGER_BACKLIGHT
 
 
 config LEDS_TRIGGER_GPIO
 config LEDS_TRIGGER_GPIO
 	tristate "LED GPIO Trigger"
 	tristate "LED GPIO Trigger"
+	depends on LEDS_TRIGGERS
 	depends on GPIOLIB
 	depends on GPIOLIB
 	help
 	help
 	  This allows LEDs to be controlled by gpio events. It's good
 	  This allows LEDs to be controlled by gpio events. It's good
@@ -396,6 +431,7 @@ config LEDS_TRIGGER_GPIO
 
 
 config LEDS_TRIGGER_DEFAULT_ON
 config LEDS_TRIGGER_DEFAULT_ON
 	tristate "LED Default ON Trigger"
 	tristate "LED Default ON Trigger"
+	depends on LEDS_TRIGGERS
 	help
 	help
 	  This allows LEDs to be initialised in the ON state.
 	  This allows LEDs to be initialised in the ON state.
 	  If unsure, say Y.
 	  If unsure, say Y.
@@ -403,8 +439,4 @@ config LEDS_TRIGGER_DEFAULT_ON
 comment "iptables trigger is under Netfilter config (LED target)"
 comment "iptables trigger is under Netfilter config (LED target)"
 	depends on LEDS_TRIGGERS
 	depends on LEDS_TRIGGERS
 
 
-endif # LEDS_TRIGGERS
-
-endif # LEDS_CLASS
-
 endif # NEW_LEDS
 endif # NEW_LEDS

+ 1 - 0
drivers/macintosh/Kconfig

@@ -102,6 +102,7 @@ config ADB_PMU_LED
 config ADB_PMU_LED_IDE
 config ADB_PMU_LED_IDE
 	bool "Use front LED as IDE LED by default"
 	bool "Use front LED as IDE LED by default"
 	depends on ADB_PMU_LED
 	depends on ADB_PMU_LED
+	depends on LEDS_CLASS
 	select LEDS_TRIGGERS
 	select LEDS_TRIGGERS
 	select LEDS_TRIGGER_IDE_DISK
 	select LEDS_TRIGGER_IDE_DISK
 	help
 	help

+ 4 - 4
drivers/media/common/tuners/Kconfig

@@ -31,7 +31,7 @@ config MEDIA_TUNER
 	select MEDIA_TUNER_TDA9887 if !MEDIA_TUNER_CUSTOMISE
 	select MEDIA_TUNER_TDA9887 if !MEDIA_TUNER_CUSTOMISE
 	select MEDIA_TUNER_MC44S803 if !MEDIA_TUNER_CUSTOMISE
 	select MEDIA_TUNER_MC44S803 if !MEDIA_TUNER_CUSTOMISE
 
 
-menuconfig MEDIA_TUNER_CUSTOMISE
+config MEDIA_TUNER_CUSTOMISE
 	bool "Customize analog and hybrid tuner modules to build"
 	bool "Customize analog and hybrid tuner modules to build"
 	depends on MEDIA_TUNER
 	depends on MEDIA_TUNER
 	default y if EMBEDDED
 	default y if EMBEDDED
@@ -44,7 +44,8 @@ menuconfig MEDIA_TUNER_CUSTOMISE
 
 
 	  If unsure say N.
 	  If unsure say N.
 
 
-if MEDIA_TUNER_CUSTOMISE
+menu "Customize TV tuners"
+	visible if MEDIA_TUNER_CUSTOMISE
 
 
 config MEDIA_TUNER_SIMPLE
 config MEDIA_TUNER_SIMPLE
 	tristate "Simple tuner support"
 	tristate "Simple tuner support"
@@ -185,5 +186,4 @@ config MEDIA_TUNER_TDA18218
 	default m if MEDIA_TUNER_CUSTOMISE
 	default m if MEDIA_TUNER_CUSTOMISE
 	help
 	help
 	  NXP TDA18218 silicon tuner driver.
 	  NXP TDA18218 silicon tuner driver.
-
-endif # MEDIA_TUNER_CUSTOMISE
+endmenu

+ 1 - 4
drivers/media/dvb/frontends/Kconfig

@@ -12,9 +12,8 @@ config DVB_FE_CUSTOMISE
 
 
 	  If unsure say N.
 	  If unsure say N.
 
 
-if DVB_FE_CUSTOMISE
-
 menu "Customise DVB Frontends"
 menu "Customise DVB Frontends"
+	visible if DVB_FE_CUSTOMISE
 
 
 comment "Multistandard (satellite) frontends"
 comment "Multistandard (satellite) frontends"
 	depends on DVB_CORE
 	depends on DVB_CORE
@@ -619,5 +618,3 @@ config DVB_DUMMY_FE
 	tristate "Dummy frontend driver"
 	tristate "Dummy frontend driver"
 	default n
 	default n
 endmenu
 endmenu
-
-endif

+ 1 - 1
drivers/media/video/Kconfig

@@ -112,7 +112,7 @@ config VIDEO_IR_I2C
 #
 #
 
 
 menu "Encoders/decoders and other helper chips"
 menu "Encoders/decoders and other helper chips"
-	depends on !VIDEO_HELPER_CHIPS_AUTO
+	visible if !VIDEO_HELPER_CHIPS_AUTO
 
 
 comment "Audio decoders"
 comment "Audio decoders"
 
 

+ 25 - 12
drivers/mtd/ubi/io.c

@@ -482,10 +482,17 @@ static int nor_erase_prepare(struct ubi_device *ubi, int pnum)
 	uint32_t data = 0;
 	uint32_t data = 0;
 	struct ubi_vid_hdr vid_hdr;
 	struct ubi_vid_hdr vid_hdr;
 
 
-	addr = (loff_t)pnum * ubi->peb_size + ubi->vid_hdr_aloffset;
+	/*
+	 * It is important to first invalidate the EC header, and then the VID
+	 * header. Otherwise a power cut may lead to valid EC header and
+	 * invalid VID header, in which case UBI will treat this PEB as
+	 * corrupted and will try to preserve it, and print scary warnings (see
+	 * the header comment in scan.c for more information).
+	 */
+	addr = (loff_t)pnum * ubi->peb_size;
 	err = ubi->mtd->write(ubi->mtd, addr, 4, &written, (void *)&data);
 	err = ubi->mtd->write(ubi->mtd, addr, 4, &written, (void *)&data);
 	if (!err) {
 	if (!err) {
-		addr -= ubi->vid_hdr_aloffset;
+		addr += ubi->vid_hdr_aloffset;
 		err = ubi->mtd->write(ubi->mtd, addr, 4, &written,
 		err = ubi->mtd->write(ubi->mtd, addr, 4, &written,
 				      (void *)&data);
 				      (void *)&data);
 		if (!err)
 		if (!err)
@@ -494,18 +501,24 @@ static int nor_erase_prepare(struct ubi_device *ubi, int pnum)
 
 
 	/*
 	/*
 	 * We failed to write to the media. This was observed with Spansion
 	 * We failed to write to the media. This was observed with Spansion
-	 * S29GL512N NOR flash. Most probably the eraseblock erasure was
-	 * interrupted at a very inappropriate moment, so it became unwritable.
-	 * In this case we probably anyway have garbage in this PEB.
+	 * S29GL512N NOR flash. Most probably the previously eraseblock erasure
+	 * was interrupted at a very inappropriate moment, so it became
+	 * unwritable. In this case we probably anyway have garbage in this
+	 * PEB.
 	 */
 	 */
 	err1 = ubi_io_read_vid_hdr(ubi, pnum, &vid_hdr, 0);
 	err1 = ubi_io_read_vid_hdr(ubi, pnum, &vid_hdr, 0);
-	if (err1 == UBI_IO_BAD_HDR_EBADMSG || err1 == UBI_IO_BAD_HDR)
-		/*
-		 * The VID header is corrupted, so we can safely erase this
-		 * PEB and not afraid that it will be treated as a valid PEB in
-		 * case of an unclean reboot.
-		 */
-		return 0;
+	if (err1 == UBI_IO_BAD_HDR_EBADMSG || err1 == UBI_IO_BAD_HDR) {
+		struct ubi_ec_hdr ec_hdr;
+
+		err1 = ubi_io_read_ec_hdr(ubi, pnum, &ec_hdr, 0);
+		if (err1 == UBI_IO_BAD_HDR_EBADMSG || err1 == UBI_IO_BAD_HDR)
+			/*
+			 * Both VID and EC headers are corrupted, so we can
+			 * safely erase this PEB and not afraid that it will be
+			 * treated as a valid PEB in case of an unclean reboot.
+			 */
+			return 0;
+	}
 
 
 	/*
 	/*
 	 * The PEB contains a valid VID header, but we cannot invalidate it.
 	 * The PEB contains a valid VID header, but we cannot invalidate it.

+ 4 - 0
drivers/mtd/ubi/scan.c

@@ -953,6 +953,10 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si,
 			 * impossible to distinguish it from a PEB which just
 			 * impossible to distinguish it from a PEB which just
 			 * contains garbage because of a power cut during erase
 			 * contains garbage because of a power cut during erase
 			 * operation. So we just schedule this PEB for erasure.
 			 * operation. So we just schedule this PEB for erasure.
+			 *
+			 * Besides, in case of NOR flash, we deliberatly
+			 * corrupt both headers because NOR flash erasure is
+			 * slow and can start from the end.
 			 */
 			 */
 			err = 0;
 			err = 0;
 		else
 		else

+ 0 - 1
drivers/parisc/dino.c

@@ -349,7 +349,6 @@ static struct irq_chip dino_interrupt_type = {
 	.name	= "GSC-PCI",
 	.name	= "GSC-PCI",
 	.unmask	= dino_unmask_irq,
 	.unmask	= dino_unmask_irq,
 	.mask	= dino_mask_irq,
 	.mask	= dino_mask_irq,
-	.ack	= no_ack_irq,
 };
 };
 
 
 
 

+ 1 - 2
drivers/parisc/eisa.c

@@ -186,7 +186,6 @@ static struct irq_chip eisa_interrupt_type = {
 	.name	=	"EISA",
 	.name	=	"EISA",
 	.unmask	=	eisa_unmask_irq,
 	.unmask	=	eisa_unmask_irq,
 	.mask	=	eisa_mask_irq,
 	.mask	=	eisa_mask_irq,
-	.ack	=	no_ack_irq,
 };
 };
 
 
 static irqreturn_t eisa_irq(int wax_irq, void *intr_dev)
 static irqreturn_t eisa_irq(int wax_irq, void *intr_dev)
@@ -340,7 +339,7 @@ static int __init eisa_probe(struct parisc_device *dev)
 	setup_irq(2, &irq2_action);
 	setup_irq(2, &irq2_action);
 	for (i = 0; i < 16; i++) {
 	for (i = 0; i < 16; i++) {
 		set_irq_chip_and_handler(i, &eisa_interrupt_type,
 		set_irq_chip_and_handler(i, &eisa_interrupt_type,
-			handle_level_irq);
+					 handle_simple_irq);
 	}
 	}
 	
 	
 	EISA_bus = 1;
 	EISA_bus = 1;

+ 1 - 2
drivers/parisc/gsc.c

@@ -143,7 +143,6 @@ static struct irq_chip gsc_asic_interrupt_type = {
 	.name	=	"GSC-ASIC",
 	.name	=	"GSC-ASIC",
 	.unmask	=	gsc_asic_unmask_irq,
 	.unmask	=	gsc_asic_unmask_irq,
 	.mask	=	gsc_asic_mask_irq,
 	.mask	=	gsc_asic_mask_irq,
-	.ack	=	no_ack_irq,
 };
 };
 
 
 int gsc_assign_irq(struct irq_chip *type, void *data)
 int gsc_assign_irq(struct irq_chip *type, void *data)
@@ -153,7 +152,7 @@ int gsc_assign_irq(struct irq_chip *type, void *data)
 	if (irq > GSC_IRQ_MAX)
 	if (irq > GSC_IRQ_MAX)
 		return NO_IRQ;
 		return NO_IRQ;
 
 
-	set_irq_chip_and_handler(irq, type, handle_level_irq);
+	set_irq_chip_and_handler(irq, type, handle_simple_irq);
 	set_irq_chip_data(irq, data);
 	set_irq_chip_data(irq, data);
 
 
 	return irq++;
 	return irq++;

+ 8 - 0
drivers/parisc/iosapic.c

@@ -669,6 +669,13 @@ printk("\n");
 	DBG(KERN_DEBUG "enable_irq(%d): eoi(%p, 0x%x)\n", irq,
 	DBG(KERN_DEBUG "enable_irq(%d): eoi(%p, 0x%x)\n", irq,
 			vi->eoi_addr, vi->eoi_data);
 			vi->eoi_addr, vi->eoi_data);
 	iosapic_eoi(vi->eoi_addr, vi->eoi_data);
 	iosapic_eoi(vi->eoi_addr, vi->eoi_data);
+}
+
+static void iosapic_eoi_irq(unsigned int irq)
+{
+	struct vector_info *vi = get_irq_chip_data(irq);
+
+	iosapic_eoi(vi->eoi_addr, vi->eoi_data);
 	cpu_eoi_irq(irq);
 	cpu_eoi_irq(irq);
 }
 }
 
 
@@ -705,6 +712,7 @@ static struct irq_chip iosapic_interrupt_type = {
 	.unmask	=	iosapic_unmask_irq,
 	.unmask	=	iosapic_unmask_irq,
 	.mask	=	iosapic_mask_irq,
 	.mask	=	iosapic_mask_irq,
 	.ack	=	cpu_ack_irq,
 	.ack	=	cpu_ack_irq,
+	.eoi	=	iosapic_eoi_irq,
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP
 	.set_affinity =	iosapic_set_affinity_irq,
 	.set_affinity =	iosapic_set_affinity_irq,
 #endif
 #endif

+ 13 - 4
drivers/parisc/led.c

@@ -64,6 +64,7 @@ static unsigned int led_diskio    __read_mostly = 1;
 static unsigned int led_lanrxtx   __read_mostly = 1;
 static unsigned int led_lanrxtx   __read_mostly = 1;
 static char lcd_text[32]          __read_mostly;
 static char lcd_text[32]          __read_mostly;
 static char lcd_text_default[32]  __read_mostly;
 static char lcd_text_default[32]  __read_mostly;
+static int  lcd_no_led_support    __read_mostly = 0; /* KittyHawk doesn't support LED on its LCD */
 
 
 
 
 static struct workqueue_struct *led_wq;
 static struct workqueue_struct *led_wq;
@@ -115,7 +116,7 @@ lcd_info __attribute__((aligned(8))) __read_mostly =
 	.lcd_width =		16,
 	.lcd_width =		16,
 	.lcd_cmd_reg_addr =	KITTYHAWK_LCD_CMD,
 	.lcd_cmd_reg_addr =	KITTYHAWK_LCD_CMD,
 	.lcd_data_reg_addr =	KITTYHAWK_LCD_DATA,
 	.lcd_data_reg_addr =	KITTYHAWK_LCD_DATA,
-	.min_cmd_delay =	40,
+	.min_cmd_delay =	80,
 	.reset_cmd1 =		0x80,
 	.reset_cmd1 =		0x80,
 	.reset_cmd2 =		0xc0,
 	.reset_cmd2 =		0xc0,
 };
 };
@@ -135,6 +136,9 @@ static int start_task(void)
 	/* Display the default text now */
 	/* Display the default text now */
 	if (led_type == LED_HASLCD) lcd_print( lcd_text_default );
 	if (led_type == LED_HASLCD) lcd_print( lcd_text_default );
 
 
+	/* KittyHawk has no LED support on its LCD */
+	if (lcd_no_led_support) return 0;
+
 	/* Create the work queue and queue the LED task */
 	/* Create the work queue and queue the LED task */
 	led_wq = create_singlethread_workqueue("led_wq");	
 	led_wq = create_singlethread_workqueue("led_wq");	
 	queue_delayed_work(led_wq, &led_task, 0);
 	queue_delayed_work(led_wq, &led_task, 0);
@@ -248,9 +252,13 @@ static int __init led_create_procfs(void)
 
 
 	proc_pdc_root = proc_mkdir("pdc", 0);
 	proc_pdc_root = proc_mkdir("pdc", 0);
 	if (!proc_pdc_root) return -1;
 	if (!proc_pdc_root) return -1;
-	ent = proc_create_data("led", S_IRUGO|S_IWUSR, proc_pdc_root,
-				&led_proc_fops, (void *)LED_NOLCD); /* LED */
-	if (!ent) return -1;
+
+	if (!lcd_no_led_support)
+	{
+		ent = proc_create_data("led", S_IRUGO|S_IWUSR, proc_pdc_root,
+					&led_proc_fops, (void *)LED_NOLCD); /* LED */
+		if (!ent) return -1;
+	}
 
 
 	if (led_type == LED_HASLCD)
 	if (led_type == LED_HASLCD)
 	{
 	{
@@ -692,6 +700,7 @@ int __init led_init(void)
 	case 0x58B:		/* KittyHawk DC2 100 (K200) */
 	case 0x58B:		/* KittyHawk DC2 100 (K200) */
 		printk(KERN_INFO "%s: KittyHawk-Machine (hversion 0x%x) found, "
 		printk(KERN_INFO "%s: KittyHawk-Machine (hversion 0x%x) found, "
 				"LED detection skipped.\n", __FILE__, CPU_HVERSION);
 				"LED detection skipped.\n", __FILE__, CPU_HVERSION);
+		lcd_no_led_support = 1;
 		goto found;	/* use the preinitialized values of lcd_info */
 		goto found;	/* use the preinitialized values of lcd_info */
 	}
 	}
 
 

+ 1 - 2
drivers/parisc/superio.c

@@ -323,7 +323,6 @@ static struct irq_chip superio_interrupt_type = {
 	.name	=	SUPERIO,
 	.name	=	SUPERIO,
 	.unmask	=	superio_unmask_irq,
 	.unmask	=	superio_unmask_irq,
 	.mask	=	superio_mask_irq,
 	.mask	=	superio_mask_irq,
-	.ack =		no_ack_irq,
 };
 };
 
 
 #ifdef DEBUG_SUPERIO_INIT
 #ifdef DEBUG_SUPERIO_INIT
@@ -354,7 +353,7 @@ int superio_fixup_irq(struct pci_dev *pcidev)
 #endif
 #endif
 
 
 	for (i = 0; i < 16; i++) {
 	for (i = 0; i < 16; i++) {
-		set_irq_chip_and_handler(i, &superio_interrupt_type, handle_level_irq);
+		set_irq_chip_and_handler(i, &superio_interrupt_type, handle_simple_irq);
 	}
 	}
 
 
 	/*
 	/*

+ 1 - 0
drivers/pcmcia/soc_common.c

@@ -70,6 +70,7 @@ void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func,
 		va_end(args);
 		va_end(args);
 	}
 	}
 }
 }
+EXPORT_SYMBOL(soc_pcmcia_debug);
 
 
 #endif
 #endif
 
 

+ 96 - 1
drivers/platform/x86/asus-laptop.c

@@ -81,6 +81,8 @@ MODULE_PARM_DESC(wapf, "WAPF value");
 
 
 static int wlan_status = 1;
 static int wlan_status = 1;
 static int bluetooth_status = 1;
 static int bluetooth_status = 1;
+static int wimax_status = -1;
+static int wwan_status = -1;
 
 
 module_param(wlan_status, int, 0444);
 module_param(wlan_status, int, 0444);
 MODULE_PARM_DESC(wlan_status, "Set the wireless status on boot "
 MODULE_PARM_DESC(wlan_status, "Set the wireless status on boot "
@@ -92,6 +94,16 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
 		 "(0 = disabled, 1 = enabled, -1 = don't do anything). "
 		 "(0 = disabled, 1 = enabled, -1 = don't do anything). "
 		 "default is 1");
 		 "default is 1");
 
 
+module_param(wimax_status, int, 0444);
+MODULE_PARM_DESC(wimax_status, "Set the wireless status on boot "
+		 "(0 = disabled, 1 = enabled, -1 = don't do anything). "
+		 "default is 1");
+
+module_param(wwan_status, int, 0444);
+MODULE_PARM_DESC(wwan_status, "Set the wireless status on boot "
+		 "(0 = disabled, 1 = enabled, -1 = don't do anything). "
+		 "default is 1");
+
 /*
 /*
  * Some events we use, same for all Asus
  * Some events we use, same for all Asus
  */
  */
@@ -114,6 +126,8 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
  */
  */
 #define WL_RSTS		0x01	/* internal Wifi */
 #define WL_RSTS		0x01	/* internal Wifi */
 #define BT_RSTS		0x02	/* internal Bluetooth */
 #define BT_RSTS		0x02	/* internal Bluetooth */
+#define WM_RSTS		0x08    /* internal wimax */
+#define WW_RSTS		0x20    /* internal wwan */
 
 
 /* LED */
 /* LED */
 #define METHOD_MLED		"MLED"
 #define METHOD_MLED		"MLED"
@@ -132,6 +146,11 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
  */
  */
 #define METHOD_WLAN		"WLED"
 #define METHOD_WLAN		"WLED"
 #define METHOD_BLUETOOTH	"BLED"
 #define METHOD_BLUETOOTH	"BLED"
+
+/* WWAN and WIMAX */
+#define METHOD_WWAN		"GSMC"
+#define METHOD_WIMAX		"WMXC"
+
 #define METHOD_WL_STATUS	"RSTS"
 #define METHOD_WL_STATUS	"RSTS"
 
 
 /* Brightness */
 /* Brightness */
@@ -882,6 +901,64 @@ static ssize_t store_bluetooth(struct device *dev,
 	return sysfs_acpi_set(asus, buf, count, METHOD_BLUETOOTH);
 	return sysfs_acpi_set(asus, buf, count, METHOD_BLUETOOTH);
 }
 }
 
 
+/*
+ * Wimax
+ */
+static int asus_wimax_set(struct asus_laptop *asus, int status)
+{
+	if (write_acpi_int(asus->handle, METHOD_WIMAX, !!status)) {
+		pr_warning("Error setting wimax status to %d", status);
+		return -EIO;
+	}
+	return 0;
+}
+
+static ssize_t show_wimax(struct device *dev,
+			      struct device_attribute *attr, char *buf)
+{
+	struct asus_laptop *asus = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%d\n", asus_wireless_status(asus, WM_RSTS));
+}
+
+static ssize_t store_wimax(struct device *dev,
+			       struct device_attribute *attr, const char *buf,
+			       size_t count)
+{
+	struct asus_laptop *asus = dev_get_drvdata(dev);
+
+	return sysfs_acpi_set(asus, buf, count, METHOD_WIMAX);
+}
+
+/*
+ * Wwan
+ */
+static int asus_wwan_set(struct asus_laptop *asus, int status)
+{
+	if (write_acpi_int(asus->handle, METHOD_WWAN, !!status)) {
+		pr_warning("Error setting wwan status to %d", status);
+		return -EIO;
+	}
+	return 0;
+}
+
+static ssize_t show_wwan(struct device *dev,
+			      struct device_attribute *attr, char *buf)
+{
+	struct asus_laptop *asus = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%d\n", asus_wireless_status(asus, WW_RSTS));
+}
+
+static ssize_t store_wwan(struct device *dev,
+			       struct device_attribute *attr, const char *buf,
+			       size_t count)
+{
+	struct asus_laptop *asus = dev_get_drvdata(dev);
+
+	return sysfs_acpi_set(asus, buf, count, METHOD_WWAN);
+}
+
 /*
 /*
  * Display
  * Display
  */
  */
@@ -1202,6 +1279,8 @@ static DEVICE_ATTR(infos, S_IRUGO, show_infos, NULL);
 static DEVICE_ATTR(wlan, S_IRUGO | S_IWUSR, show_wlan, store_wlan);
 static DEVICE_ATTR(wlan, S_IRUGO | S_IWUSR, show_wlan, store_wlan);
 static DEVICE_ATTR(bluetooth, S_IRUGO | S_IWUSR,
 static DEVICE_ATTR(bluetooth, S_IRUGO | S_IWUSR,
 		   show_bluetooth, store_bluetooth);
 		   show_bluetooth, store_bluetooth);
+static DEVICE_ATTR(wimax, S_IRUGO | S_IWUSR, show_wimax, store_wimax);
+static DEVICE_ATTR(wwan, S_IRUGO | S_IWUSR, show_wwan, store_wwan);
 static DEVICE_ATTR(display, S_IRUGO | S_IWUSR, show_disp, store_disp);
 static DEVICE_ATTR(display, S_IRUGO | S_IWUSR, show_disp, store_disp);
 static DEVICE_ATTR(ledd, S_IRUGO | S_IWUSR, show_ledd, store_ledd);
 static DEVICE_ATTR(ledd, S_IRUGO | S_IWUSR, show_ledd, store_ledd);
 static DEVICE_ATTR(ls_level, S_IRUGO | S_IWUSR, show_lslvl, store_lslvl);
 static DEVICE_ATTR(ls_level, S_IRUGO | S_IWUSR, show_lslvl, store_lslvl);
@@ -1212,6 +1291,8 @@ static struct attribute *asus_attributes[] = {
 	&dev_attr_infos.attr,
 	&dev_attr_infos.attr,
 	&dev_attr_wlan.attr,
 	&dev_attr_wlan.attr,
 	&dev_attr_bluetooth.attr,
 	&dev_attr_bluetooth.attr,
+	&dev_attr_wimax.attr,
+	&dev_attr_wwan.attr,
 	&dev_attr_display.attr,
 	&dev_attr_display.attr,
 	&dev_attr_ledd.attr,
 	&dev_attr_ledd.attr,
 	&dev_attr_ls_level.attr,
 	&dev_attr_ls_level.attr,
@@ -1239,6 +1320,13 @@ static mode_t asus_sysfs_is_visible(struct kobject *kobj,
 	} else if (attr == &dev_attr_display.attr) {
 	} else if (attr == &dev_attr_display.attr) {
 		supported = !acpi_check_handle(handle, METHOD_SWITCH_DISPLAY, NULL);
 		supported = !acpi_check_handle(handle, METHOD_SWITCH_DISPLAY, NULL);
 
 
+	} else if (attr == &dev_attr_wimax.attr) {
+		supported =
+			!acpi_check_handle(asus->handle, METHOD_WIMAX, NULL);
+
+	} else if (attr == &dev_attr_wwan.attr) {
+		supported = !acpi_check_handle(asus->handle, METHOD_WWAN, NULL);
+
 	} else if (attr == &dev_attr_ledd.attr) {
 	} else if (attr == &dev_attr_ledd.attr) {
 		supported = !acpi_check_handle(handle, METHOD_LEDD, NULL);
 		supported = !acpi_check_handle(handle, METHOD_LEDD, NULL);
 
 
@@ -1397,7 +1485,8 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
 
 
 	/*
 	/*
 	 * The HWRS method return informations about the hardware.
 	 * The HWRS method return informations about the hardware.
-	 * 0x80 bit is for WLAN, 0x100 for Bluetooth.
+	 * 0x80 bit is for WLAN, 0x100 for Bluetooth,
+	 * 0x40 for WWAN, 0x10 for WIMAX.
 	 * The significance of others is yet to be found.
 	 * The significance of others is yet to be found.
 	 */
 	 */
 	status =
 	status =
@@ -1440,6 +1529,12 @@ static int __devinit asus_acpi_init(struct asus_laptop *asus)
 	if (wlan_status >= 0)
 	if (wlan_status >= 0)
 		asus_wlan_set(asus, !!wlan_status);
 		asus_wlan_set(asus, !!wlan_status);
 
 
+	if (wimax_status >= 0)
+		asus_wimax_set(asus, !!wimax_status);
+
+	if (wwan_status >= 0)
+		asus_wwan_set(asus, !!wwan_status);
+
 	/* Keyboard Backlight is on by default */
 	/* Keyboard Backlight is on by default */
 	if (!acpi_check_handle(asus->handle, METHOD_KBD_LIGHT_SET, NULL))
 	if (!acpi_check_handle(asus->handle, METHOD_KBD_LIGHT_SET, NULL))
 		asus_kled_set(asus, 1);
 		asus_kled_set(asus, 1);

+ 2 - 2
drivers/platform/x86/eeepc-wmi.c

@@ -298,8 +298,8 @@ static void eeepc_wmi_notify(u32 value, void *context)
 	kfree(obj);
 	kfree(obj);
 }
 }
 
 
-static int store_cpufv(struct device *dev, struct device_attribute *attr,
-		       const char *buf, size_t count)
+static ssize_t store_cpufv(struct device *dev, struct device_attribute *attr,
+			   const char *buf, size_t count)
 {
 {
 	int value;
 	int value;
 	struct acpi_buffer input = { (acpi_size)sizeof(value), &value };
 	struct acpi_buffer input = { (acpi_size)sizeof(value), &value };

+ 2 - 0
drivers/platform/x86/hp-wmi.c

@@ -172,6 +172,8 @@ static int hp_wmi_perform_query(int query, int write, u32 *buffer,
 	bios_return = *((struct bios_return *)obj->buffer.pointer);
 	bios_return = *((struct bios_return *)obj->buffer.pointer);
 
 
 	memcpy(buffer, &bios_return.value, sizeof(bios_return.value));
 	memcpy(buffer, &bios_return.value, sizeof(bios_return.value));
+
+	kfree(obj);
 	return 0;
 	return 0;
 }
 }
 
 

+ 8 - 26
drivers/platform/x86/ibm_rtl.c

@@ -28,6 +28,7 @@
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/sysdev.h>
 #include <linux/sysdev.h>
 #include <linux/dmi.h>
 #include <linux/dmi.h>
+#include <linux/efi.h>
 #include <linux/mutex.h>
 #include <linux/mutex.h>
 #include <asm/bios_ebda.h>
 #include <asm/bios_ebda.h>
 
 
@@ -220,32 +221,13 @@ static void rtl_teardown_sysfs(void) {
 	sysdev_class_unregister(&class_rtl);
 	sysdev_class_unregister(&class_rtl);
 }
 }
 
 
-static int dmi_check_cb(const struct dmi_system_id *id)
-{
-	RTL_DEBUG("found IBM server '%s'\n", id->ident);
-	return 0;
-}
-
-#define ibm_dmi_entry(NAME, TYPE)                  \
-{                                                  \
-	.ident = NAME,                             \
-	.matches = {                               \
-		DMI_MATCH(DMI_SYS_VENDOR, "IBM"),  \
-		DMI_MATCH(DMI_PRODUCT_NAME, TYPE), \
-	},                                         \
-	.callback = dmi_check_cb                   \
-}
 
 
 static struct dmi_system_id __initdata ibm_rtl_dmi_table[] = {
 static struct dmi_system_id __initdata ibm_rtl_dmi_table[] = {
-	ibm_dmi_entry("BladeCenter LS21", "7971"),
-	ibm_dmi_entry("BladeCenter LS22", "7901"),
-	ibm_dmi_entry("BladeCenter HS21 XM", "7995"),
-	ibm_dmi_entry("BladeCenter HS22", "7870"),
-	ibm_dmi_entry("BladeCenter HS22V", "7871"),
-	ibm_dmi_entry("System x3550 M2", "7946"),
-	ibm_dmi_entry("System x3650 M2", "7947"),
-	ibm_dmi_entry("System x3550 M3", "7944"),
-	ibm_dmi_entry("System x3650 M3", "7945"),
+	{                                                  \
+		.matches = {                               \
+			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),  \
+		},                                         \
+	},
 	{ }
 	{ }
 };
 };
 
 
@@ -257,7 +239,7 @@ static int __init ibm_rtl_init(void) {
 	if (force)
 	if (force)
 		pr_warning("ibm-rtl: module loaded by force\n");
 		pr_warning("ibm-rtl: module loaded by force\n");
 	/* first ensure that we are running on IBM HW */
 	/* first ensure that we are running on IBM HW */
-	else if (!dmi_check_system(ibm_rtl_dmi_table))
+	else if (efi_enabled || !dmi_check_system(ibm_rtl_dmi_table))
 		return -ENODEV;
 		return -ENODEV;
 
 
 	/* Get the address for the Extended BIOS Data Area */
 	/* Get the address for the Extended BIOS Data Area */
@@ -302,7 +284,7 @@ static int __init ibm_rtl_init(void) {
 			RTL_DEBUG("rtl_cmd_width = %u, rtl_cmd_type = %u\n",
 			RTL_DEBUG("rtl_cmd_width = %u, rtl_cmd_type = %u\n",
 			      rtl_cmd_width, rtl_cmd_type);
 			      rtl_cmd_width, rtl_cmd_type);
 			addr = ioread32(&rtl_table->cmd_port_address);
 			addr = ioread32(&rtl_table->cmd_port_address);
-			RTL_DEBUG("addr = %#llx\n", addr);
+			RTL_DEBUG("addr = %#llx\n", (unsigned long long)addr);
 			plen = rtl_cmd_width/sizeof(char);
 			plen = rtl_cmd_width/sizeof(char);
 			rtl_cmd_addr = rtl_port_map(addr, plen);
 			rtl_cmd_addr = rtl_port_map(addr, plen);
 			RTL_DEBUG("rtl_cmd_addr = %#llx\n", (u64)rtl_cmd_addr);
 			RTL_DEBUG("rtl_cmd_addr = %#llx\n", (u64)rtl_cmd_addr);

Some files were not shown because too many files changed in this diff