diff options
145 files changed, 1409 insertions, 1210 deletions
diff --git a/Documentation/cpu-freq/user-guide.txt b/Documentation/cpu-freq/user-guide.txt index 6c442d8426b5..4f3f3840320e 100644 --- a/Documentation/cpu-freq/user-guide.txt +++ b/Documentation/cpu-freq/user-guide.txt | |||
| @@ -23,6 +23,7 @@ Contents: | |||
| 23 | 1.3 sparc64 | 23 | 1.3 sparc64 |
| 24 | 1.4 ppc | 24 | 1.4 ppc |
| 25 | 1.5 SuperH | 25 | 1.5 SuperH |
| 26 | 1.6 Blackfin | ||
| 26 | 27 | ||
| 27 | 2. "Policy" / "Governor"? | 28 | 2. "Policy" / "Governor"? |
| 28 | 2.1 Policy | 29 | 2.1 Policy |
| @@ -97,6 +98,17 @@ The following SuperH processors are supported by cpufreq: | |||
| 97 | SH-3 | 98 | SH-3 |
| 98 | SH-4 | 99 | SH-4 |
| 99 | 100 | ||
| 101 | 1.6 Blackfin | ||
| 102 | ------------ | ||
| 103 | |||
| 104 | The following Blackfin processors are supported by cpufreq: | ||
| 105 | |||
| 106 | BF522, BF523, BF524, BF525, BF526, BF527, Rev 0.1 or higher | ||
| 107 | BF531, BF532, BF533, Rev 0.3 or higher | ||
| 108 | BF534, BF536, BF537, Rev 0.2 or higher | ||
| 109 | BF561, Rev 0.3 or higher | ||
| 110 | BF542, BF544, BF547, BF548, BF549, Rev 0.1 or higher | ||
| 111 | |||
| 100 | 112 | ||
| 101 | 2. "Policy" / "Governor" ? | 113 | 2. "Policy" / "Governor" ? |
| 102 | ========================== | 114 | ========================== |
diff --git a/Documentation/filesystems/ramfs-rootfs-initramfs.txt b/Documentation/filesystems/ramfs-rootfs-initramfs.txt index 62fe9b1e0890..a8273d5fad20 100644 --- a/Documentation/filesystems/ramfs-rootfs-initramfs.txt +++ b/Documentation/filesystems/ramfs-rootfs-initramfs.txt | |||
| @@ -130,12 +130,12 @@ The 2.6 kernel build process always creates a gzipped cpio format initramfs | |||
| 130 | archive and links it into the resulting kernel binary. By default, this | 130 | archive and links it into the resulting kernel binary. By default, this |
| 131 | archive is empty (consuming 134 bytes on x86). | 131 | archive is empty (consuming 134 bytes on x86). |
| 132 | 132 | ||
| 133 | The config option CONFIG_INITRAMFS_SOURCE (for some reason buried under | 133 | The config option CONFIG_INITRAMFS_SOURCE (in General Setup in menuconfig, |
| 134 | devices->block devices in menuconfig, and living in usr/Kconfig) can be used | 134 | and living in usr/Kconfig) can be used to specify a source for the |
| 135 | to specify a source for the initramfs archive, which will automatically be | 135 | initramfs archive, which will automatically be incorporated into the |
| 136 | incorporated into the resulting binary. This option can point to an existing | 136 | resulting binary. This option can point to an existing gzipped cpio |
| 137 | gzipped cpio archive, a directory containing files to be archived, or a text | 137 | archive, a directory containing files to be archived, or a text file |
| 138 | file specification such as the following example: | 138 | specification such as the following example: |
| 139 | 139 | ||
| 140 | dir /dev 755 0 0 | 140 | dir /dev 755 0 0 |
| 141 | nod /dev/console 644 0 0 c 5 1 | 141 | nod /dev/console 644 0 0 c 5 1 |
diff --git a/Documentation/input/input-programming.txt b/Documentation/input/input-programming.txt index 81905e81585e..7f8b9d97bc47 100644 --- a/Documentation/input/input-programming.txt +++ b/Documentation/input/input-programming.txt | |||
| @@ -20,10 +20,11 @@ pressed or released a BUTTON_IRQ happens. The driver could look like: | |||
| 20 | 20 | ||
| 21 | static struct input_dev *button_dev; | 21 | static struct input_dev *button_dev; |
| 22 | 22 | ||
| 23 | static void button_interrupt(int irq, void *dummy, struct pt_regs *fp) | 23 | static irqreturn_t button_interrupt(int irq, void *dummy) |
| 24 | { | 24 | { |
| 25 | input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1); | 25 | input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1); |
| 26 | input_sync(button_dev); | 26 | input_sync(button_dev); |
| 27 | return IRQ_HANDLED; | ||
| 27 | } | 28 | } |
| 28 | 29 | ||
| 29 | static int __init button_init(void) | 30 | static int __init button_init(void) |
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index e0e54a27fc10..3cd2ad958176 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
| @@ -1072,10 +1072,13 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
| 1072 | ref Reference board | 1072 | ref Reference board |
| 1073 | dell-m4-1 Dell desktops | 1073 | dell-m4-1 Dell desktops |
| 1074 | dell-m4-2 Dell desktops | 1074 | dell-m4-2 Dell desktops |
| 1075 | dell-m4-3 Dell desktops | ||
| 1075 | 1076 | ||
| 1076 | STAC92HD73* | 1077 | STAC92HD73* |
| 1077 | ref Reference board | 1078 | ref Reference board |
| 1078 | dell-m6 Dell desktops | 1079 | dell-m6-amic Dell desktops/laptops with analog mics |
| 1080 | dell-m6-dmic Dell desktops/laptops with digital mics | ||
| 1081 | dell-m6 Dell desktops/laptops with both type of mics | ||
| 1079 | 1082 | ||
| 1080 | STAC9872 | 1083 | STAC9872 |
| 1081 | vaio Setup for VAIO FE550G/SZ110 | 1084 | vaio Setup for VAIO FE550G/SZ110 |
diff --git a/arch/Kconfig b/arch/Kconfig index 8977d99987cb..471e72dbaf8b 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
| @@ -79,8 +79,6 @@ config HAVE_KRETPROBES | |||
| 79 | # task_pt_regs() in asm/processor.h or asm/ptrace.h | 79 | # task_pt_regs() in asm/processor.h or asm/ptrace.h |
| 80 | # arch_has_single_step() if there is hardware single-step support | 80 | # arch_has_single_step() if there is hardware single-step support |
| 81 | # arch_has_block_step() if there is hardware block-step support | 81 | # arch_has_block_step() if there is hardware block-step support |
| 82 | # arch_ptrace() and not #define __ARCH_SYS_PTRACE | ||
| 83 | # compat_arch_ptrace() and #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 84 | # asm/syscall.h supplying asm-generic/syscall.h interface | 82 | # asm/syscall.h supplying asm-generic/syscall.h interface |
| 85 | # linux/regset.h user_regset interfaces | 83 | # linux/regset.h user_regset interfaces |
| 86 | # CORE_DUMP_USE_REGSET #define'd in linux/elf.h | 84 | # CORE_DUMP_USE_REGSET #define'd in linux/elf.h |
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 5cf45fc51343..ff8cb638472e 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
| @@ -338,7 +338,7 @@ common_swizzle(struct pci_dev *dev, u8 *pinp) | |||
| 338 | return PCI_SLOT(dev->devfn); | 338 | return PCI_SLOT(dev->devfn); |
| 339 | } | 339 | } |
| 340 | 340 | ||
| 341 | void __devinit | 341 | void |
| 342 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | 342 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, |
| 343 | struct resource *res) | 343 | struct resource *res) |
| 344 | { | 344 | { |
diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c index e657c45d91d2..cf7da10097bb 100644 --- a/arch/alpha/kernel/smp.c +++ b/arch/alpha/kernel/smp.c | |||
| @@ -121,7 +121,7 @@ wait_boot_cpu_to_stop(int cpuid) | |||
| 121 | /* | 121 | /* |
| 122 | * Where secondaries begin a life of C. | 122 | * Where secondaries begin a life of C. |
| 123 | */ | 123 | */ |
| 124 | void __init | 124 | void __cpuinit |
| 125 | smp_callin(void) | 125 | smp_callin(void) |
| 126 | { | 126 | { |
| 127 | int cpuid = hard_smp_processor_id(); | 127 | int cpuid = hard_smp_processor_id(); |
| @@ -198,7 +198,7 @@ wait_for_txrdy (unsigned long cpumask) | |||
| 198 | * Send a message to a secondary's console. "START" is one such | 198 | * Send a message to a secondary's console. "START" is one such |
| 199 | * interesting message. ;-) | 199 | * interesting message. ;-) |
| 200 | */ | 200 | */ |
| 201 | static void __init | 201 | static void __cpuinit |
| 202 | send_secondary_console_msg(char *str, int cpuid) | 202 | send_secondary_console_msg(char *str, int cpuid) |
| 203 | { | 203 | { |
| 204 | struct percpu_struct *cpu; | 204 | struct percpu_struct *cpu; |
| @@ -289,7 +289,7 @@ recv_secondary_console_msg(void) | |||
| 289 | /* | 289 | /* |
| 290 | * Convince the console to have a secondary cpu begin execution. | 290 | * Convince the console to have a secondary cpu begin execution. |
| 291 | */ | 291 | */ |
| 292 | static int __init | 292 | static int __cpuinit |
| 293 | secondary_cpu_start(int cpuid, struct task_struct *idle) | 293 | secondary_cpu_start(int cpuid, struct task_struct *idle) |
| 294 | { | 294 | { |
| 295 | struct percpu_struct *cpu; | 295 | struct percpu_struct *cpu; |
diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index c778779007fc..cefc5a355ef9 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | 31 | ||
| 32 | static int opDEC_fix; | 32 | static int opDEC_fix; |
| 33 | 33 | ||
| 34 | static void __init | 34 | static void __cpuinit |
| 35 | opDEC_check(void) | 35 | opDEC_check(void) |
| 36 | { | 36 | { |
| 37 | __asm__ __volatile__ ( | 37 | __asm__ __volatile__ ( |
| @@ -1072,7 +1072,7 @@ give_sigbus: | |||
| 1072 | return; | 1072 | return; |
| 1073 | } | 1073 | } |
| 1074 | 1074 | ||
| 1075 | void __init | 1075 | void __cpuinit |
| 1076 | trap_init(void) | 1076 | trap_init(void) |
| 1077 | { | 1077 | { |
| 1078 | /* Tell PAL-code what global pointer we want in the kernel. */ | 1078 | /* Tell PAL-code what global pointer we want in the kernel. */ |
diff --git a/arch/ia64/include/asm/ptrace.h b/arch/ia64/include/asm/ptrace.h index 6417c1ecb44e..14055c636adf 100644 --- a/arch/ia64/include/asm/ptrace.h +++ b/arch/ia64/include/asm/ptrace.h | |||
| @@ -325,8 +325,6 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs) | |||
| 325 | #define arch_has_block_step() (1) | 325 | #define arch_has_block_step() (1) |
| 326 | extern void user_enable_block_step(struct task_struct *); | 326 | extern void user_enable_block_step(struct task_struct *); |
| 327 | 327 | ||
| 328 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 329 | |||
| 330 | #endif /* !__KERNEL__ */ | 328 | #endif /* !__KERNEL__ */ |
| 331 | 329 | ||
| 332 | /* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ | 330 | /* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ |
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index c3aa851d1ca6..4e1801bad83a 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c | |||
| @@ -292,7 +292,7 @@ EXPORT_SYMBOL(sn_io_slot_fixup); | |||
| 292 | * sn_pci_controller_fixup() - This routine sets up a bus's resources | 292 | * sn_pci_controller_fixup() - This routine sets up a bus's resources |
| 293 | * consistent with the Linux PCI abstraction layer. | 293 | * consistent with the Linux PCI abstraction layer. |
| 294 | */ | 294 | */ |
| 295 | static void | 295 | static void __init |
| 296 | sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus) | 296 | sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus) |
| 297 | { | 297 | { |
| 298 | s64 status = 0; | 298 | s64 status = 0; |
diff --git a/arch/m32r/kernel/head.S b/arch/m32r/kernel/head.S index 40180778a5c7..90916067b9c1 100644 --- a/arch/m32r/kernel/head.S +++ b/arch/m32r/kernel/head.S | |||
| @@ -23,7 +23,7 @@ __INITDATA | |||
| 23 | /* | 23 | /* |
| 24 | * References to members of the boot_cpu_data structure. | 24 | * References to members of the boot_cpu_data structure. |
| 25 | */ | 25 | */ |
| 26 | .text | 26 | .section .text.head, "ax" |
| 27 | .global start_kernel | 27 | .global start_kernel |
| 28 | .global __bss_start | 28 | .global __bss_start |
| 29 | .global _end | 29 | .global _end |
| @@ -133,7 +133,6 @@ loop1: | |||
| 133 | /* | 133 | /* |
| 134 | * AP startup routine | 134 | * AP startup routine |
| 135 | */ | 135 | */ |
| 136 | .text | ||
| 137 | .global eit_vector | 136 | .global eit_vector |
| 138 | ENTRY(startup_AP) | 137 | ENTRY(startup_AP) |
| 139 | ;; setup EVB | 138 | ;; setup EVB |
| @@ -230,6 +229,7 @@ ENTRY(startup_AP) | |||
| 230 | nop | 229 | nop |
| 231 | #endif /* CONFIG_SMP */ | 230 | #endif /* CONFIG_SMP */ |
| 232 | 231 | ||
| 232 | .text | ||
| 233 | ENTRY(stack_start) | 233 | ENTRY(stack_start) |
| 234 | .long init_thread_union+8192 | 234 | .long init_thread_union+8192 |
| 235 | .long __KERNEL_DS | 235 | .long __KERNEL_DS |
diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index 15a6f36c06db..9db05df20c0e 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S | |||
| @@ -27,6 +27,7 @@ SECTIONS | |||
| 27 | _text = .; /* Text and read-only data */ | 27 | _text = .; /* Text and read-only data */ |
| 28 | .boot : { *(.boot) } = 0 | 28 | .boot : { *(.boot) } = 0 |
| 29 | .text : { | 29 | .text : { |
| 30 | *(.text.head) | ||
| 30 | TEXT_TEXT | 31 | TEXT_TEXT |
| 31 | SCHED_TEXT | 32 | SCHED_TEXT |
| 32 | LOCK_TEXT | 33 | LOCK_TEXT |
diff --git a/arch/mips/include/asm/bug.h b/arch/mips/include/asm/bug.h index 7eb63de808bc..08ea46863fe5 100644 --- a/arch/mips/include/asm/bug.h +++ b/arch/mips/include/asm/bug.h | |||
| @@ -7,20 +7,31 @@ | |||
| 7 | 7 | ||
| 8 | #include <asm/break.h> | 8 | #include <asm/break.h> |
| 9 | 9 | ||
| 10 | #define BUG() \ | 10 | static inline void __noreturn BUG(void) |
| 11 | do { \ | 11 | { |
| 12 | __asm__ __volatile__("break %0" : : "i" (BRK_BUG)); \ | 12 | __asm__ __volatile__("break %0" : : "i" (BRK_BUG)); |
| 13 | } while (0) | 13 | /* Fool GCC into thinking the function doesn't return. */ |
| 14 | while (1) | ||
| 15 | ; | ||
| 16 | } | ||
| 14 | 17 | ||
| 15 | #define HAVE_ARCH_BUG | 18 | #define HAVE_ARCH_BUG |
| 16 | 19 | ||
| 17 | #if (_MIPS_ISA > _MIPS_ISA_MIPS1) | 20 | #if (_MIPS_ISA > _MIPS_ISA_MIPS1) |
| 18 | 21 | ||
| 19 | #define BUG_ON(condition) \ | 22 | static inline void __BUG_ON(unsigned long condition) |
| 20 | do { \ | 23 | { |
| 21 | __asm__ __volatile__("tne $0, %0, %1" \ | 24 | if (__builtin_constant_p(condition)) { |
| 22 | : : "r" (condition), "i" (BRK_BUG)); \ | 25 | if (condition) |
| 23 | } while (0) | 26 | BUG(); |
| 27 | else | ||
| 28 | return; | ||
| 29 | } | ||
| 30 | __asm__ __volatile__("tne $0, %0, %1" | ||
| 31 | : : "r" (condition), "i" (BRK_BUG)); | ||
| 32 | } | ||
| 33 | |||
| 34 | #define BUG_ON(C) __BUG_ON((unsigned long)(C)) | ||
| 24 | 35 | ||
| 25 | #define HAVE_ARCH_BUG_ON | 36 | #define HAVE_ARCH_BUG_ON |
| 26 | 37 | ||
diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h index 813abd16255d..c2c8bac43307 100644 --- a/arch/mips/include/asm/ptrace.h +++ b/arch/mips/include/asm/ptrace.h | |||
| @@ -9,10 +9,6 @@ | |||
| 9 | #ifndef _ASM_PTRACE_H | 9 | #ifndef _ASM_PTRACE_H |
| 10 | #define _ASM_PTRACE_H | 10 | #define _ASM_PTRACE_H |
| 11 | 11 | ||
| 12 | #ifdef CONFIG_64BIT | ||
| 13 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 14 | #endif | ||
| 15 | |||
| 16 | /* 0 - 31 are integer registers, 32 - 63 are fp registers. */ | 12 | /* 0 - 31 are integer registers, 32 - 63 are fp registers. */ |
| 17 | #define FPR_BASE 32 | 13 | #define FPR_BASE 32 |
| 18 | #define PC 64 | 14 | #define PC 64 |
diff --git a/arch/mn10300/kernel/gdb-stub.c b/arch/mn10300/kernel/gdb-stub.c index 54be6afb5555..0ea7482c1522 100644 --- a/arch/mn10300/kernel/gdb-stub.c +++ b/arch/mn10300/kernel/gdb-stub.c | |||
| @@ -522,17 +522,7 @@ static int gdbstub_single_step(struct pt_regs *regs) | |||
| 522 | } else { | 522 | } else { |
| 523 | switch (cur) { | 523 | switch (cur) { |
| 524 | /* Bxx (d8,PC) */ | 524 | /* Bxx (d8,PC) */ |
| 525 | case 0xc0: | 525 | case 0xc0 ... 0xca: |
| 526 | case 0xc1: | ||
| 527 | case 0xc2: | ||
| 528 | case 0xc3: | ||
| 529 | case 0xc4: | ||
| 530 | case 0xc5: | ||
| 531 | case 0xc6: | ||
| 532 | case 0xc7: | ||
| 533 | case 0xc8: | ||
| 534 | case 0xc9: | ||
| 535 | case 0xca: | ||
| 536 | if (gdbstub_read_byte(pc + 1, (u8 *) &x) < 0) | 526 | if (gdbstub_read_byte(pc + 1, (u8 *) &x) < 0) |
| 537 | goto fault; | 527 | goto fault; |
| 538 | if (!__gdbstub_mark_bp(pc + 2, 0)) | 528 | if (!__gdbstub_mark_bp(pc + 2, 0)) |
| @@ -543,17 +533,7 @@ static int gdbstub_single_step(struct pt_regs *regs) | |||
| 543 | break; | 533 | break; |
| 544 | 534 | ||
| 545 | /* LXX (d8,PC) */ | 535 | /* LXX (d8,PC) */ |
| 546 | case 0xd0: | 536 | case 0xd0 ... 0xda: |
| 547 | case 0xd1: | ||
| 548 | case 0xd2: | ||
| 549 | case 0xd3: | ||
| 550 | case 0xd4: | ||
| 551 | case 0xd5: | ||
| 552 | case 0xd6: | ||
| 553 | case 0xd7: | ||
| 554 | case 0xd8: | ||
| 555 | case 0xd9: | ||
| 556 | case 0xda: | ||
| 557 | if (!__gdbstub_mark_bp(pc + 1, 0)) | 537 | if (!__gdbstub_mark_bp(pc + 1, 0)) |
| 558 | goto fault; | 538 | goto fault; |
| 559 | if (regs->pc != regs->lar && | 539 | if (regs->pc != regs->lar && |
diff --git a/arch/parisc/include/asm/ptrace.h b/arch/parisc/include/asm/ptrace.h index afa5333187b4..302f68dc889c 100644 --- a/arch/parisc/include/asm/ptrace.h +++ b/arch/parisc/include/asm/ptrace.h | |||
| @@ -47,8 +47,6 @@ struct pt_regs { | |||
| 47 | 47 | ||
| 48 | #define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS)) | 48 | #define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS)) |
| 49 | 49 | ||
| 50 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 51 | |||
| 52 | struct task_struct; | 50 | struct task_struct; |
| 53 | #define arch_has_single_step() 1 | 51 | #define arch_has_single_step() 1 |
| 54 | void user_disable_single_step(struct task_struct *task); | 52 | void user_disable_single_step(struct task_struct *task); |
diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 5a441742ffba..68b752626808 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h | |||
| @@ -280,7 +280,6 @@ extern int hash_huge_page(struct mm_struct *mm, unsigned long access, | |||
| 280 | extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend, | 280 | extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend, |
| 281 | unsigned long pstart, unsigned long prot, | 281 | unsigned long pstart, unsigned long prot, |
| 282 | int psize, int ssize); | 282 | int psize, int ssize); |
| 283 | extern void set_huge_psize(int psize); | ||
| 284 | extern void add_gpage(unsigned long addr, unsigned long page_size, | 283 | extern void add_gpage(unsigned long addr, unsigned long page_size, |
| 285 | unsigned long number_of_pages); | 284 | unsigned long number_of_pages); |
| 286 | extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr); | 285 | extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr); |
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index 280a90cc9894..c9c678fb2538 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h | |||
| @@ -55,8 +55,6 @@ struct pt_regs { | |||
| 55 | 55 | ||
| 56 | #ifdef __powerpc64__ | 56 | #ifdef __powerpc64__ |
| 57 | 57 | ||
| 58 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 59 | |||
| 60 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ | 58 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ |
| 61 | #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ | 59 | #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ |
| 62 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) | 60 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) |
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index a117024ab8cd..7bbf4e4ed430 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
| @@ -677,7 +677,7 @@ repeat: | |||
| 677 | return err; | 677 | return err; |
| 678 | } | 678 | } |
| 679 | 679 | ||
| 680 | void set_huge_psize(int psize) | 680 | static void __init set_huge_psize(int psize) |
| 681 | { | 681 | { |
| 682 | /* Check that it is a page size supported by the hardware and | 682 | /* Check that it is a page size supported by the hardware and |
| 683 | * that it fits within pagetable limits. */ | 683 | * that it fits within pagetable limits. */ |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index 9b0bc2c9fba0..a0e748da9909 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.27-rc4 | 3 | # Linux kernel version: 2.6.28-rc6 |
| 4 | # Thu Aug 21 19:43:29 2008 | 4 | # Thu Nov 27 11:00:49 2008 |
| 5 | # | 5 | # |
| 6 | CONFIG_SCHED_MC=y | 6 | CONFIG_SCHED_MC=y |
| 7 | CONFIG_MMU=y | 7 | CONFIG_MMU=y |
| @@ -45,6 +45,7 @@ CONFIG_LOG_BUF_SHIFT=17 | |||
| 45 | CONFIG_CGROUPS=y | 45 | CONFIG_CGROUPS=y |
| 46 | # CONFIG_CGROUP_DEBUG is not set | 46 | # CONFIG_CGROUP_DEBUG is not set |
| 47 | CONFIG_CGROUP_NS=y | 47 | CONFIG_CGROUP_NS=y |
| 48 | # CONFIG_CGROUP_FREEZER is not set | ||
| 48 | # CONFIG_CGROUP_DEVICE is not set | 49 | # CONFIG_CGROUP_DEVICE is not set |
| 49 | # CONFIG_CPUSETS is not set | 50 | # CONFIG_CPUSETS is not set |
| 50 | CONFIG_GROUP_SCHED=y | 51 | CONFIG_GROUP_SCHED=y |
| @@ -84,6 +85,7 @@ CONFIG_SIGNALFD=y | |||
| 84 | CONFIG_TIMERFD=y | 85 | CONFIG_TIMERFD=y |
| 85 | CONFIG_EVENTFD=y | 86 | CONFIG_EVENTFD=y |
| 86 | CONFIG_SHMEM=y | 87 | CONFIG_SHMEM=y |
| 88 | CONFIG_AIO=y | ||
| 87 | CONFIG_VM_EVENT_COUNTERS=y | 89 | CONFIG_VM_EVENT_COUNTERS=y |
| 88 | CONFIG_SLAB=y | 90 | CONFIG_SLAB=y |
| 89 | # CONFIG_SLUB is not set | 91 | # CONFIG_SLUB is not set |
| @@ -92,16 +94,10 @@ CONFIG_SLAB=y | |||
| 92 | # CONFIG_MARKERS is not set | 94 | # CONFIG_MARKERS is not set |
| 93 | CONFIG_HAVE_OPROFILE=y | 95 | CONFIG_HAVE_OPROFILE=y |
| 94 | CONFIG_KPROBES=y | 96 | CONFIG_KPROBES=y |
| 95 | # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set | ||
| 96 | CONFIG_KRETPROBES=y | 97 | CONFIG_KRETPROBES=y |
| 97 | # CONFIG_HAVE_IOREMAP_PROT is not set | ||
| 98 | CONFIG_HAVE_KPROBES=y | 98 | CONFIG_HAVE_KPROBES=y |
| 99 | CONFIG_HAVE_KRETPROBES=y | 99 | CONFIG_HAVE_KRETPROBES=y |
| 100 | # CONFIG_HAVE_ARCH_TRACEHOOK is not set | 100 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
| 101 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 102 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||
| 103 | # CONFIG_HAVE_CLK is not set | ||
| 104 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 105 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 101 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
| 106 | CONFIG_SLABINFO=y | 102 | CONFIG_SLABINFO=y |
| 107 | CONFIG_RT_MUTEXES=y | 103 | CONFIG_RT_MUTEXES=y |
| @@ -135,6 +131,7 @@ CONFIG_DEFAULT_DEADLINE=y | |||
| 135 | CONFIG_DEFAULT_IOSCHED="deadline" | 131 | CONFIG_DEFAULT_IOSCHED="deadline" |
| 136 | CONFIG_PREEMPT_NOTIFIERS=y | 132 | CONFIG_PREEMPT_NOTIFIERS=y |
| 137 | CONFIG_CLASSIC_RCU=y | 133 | CONFIG_CLASSIC_RCU=y |
| 134 | # CONFIG_FREEZER is not set | ||
| 138 | 135 | ||
| 139 | # | 136 | # |
| 140 | # Base setup | 137 | # Base setup |
| @@ -189,7 +186,6 @@ CONFIG_SELECT_MEMORY_MODEL=y | |||
| 189 | CONFIG_SPARSEMEM_MANUAL=y | 186 | CONFIG_SPARSEMEM_MANUAL=y |
| 190 | CONFIG_SPARSEMEM=y | 187 | CONFIG_SPARSEMEM=y |
| 191 | CONFIG_HAVE_MEMORY_PRESENT=y | 188 | CONFIG_HAVE_MEMORY_PRESENT=y |
| 192 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 193 | CONFIG_SPARSEMEM_EXTREME=y | 189 | CONFIG_SPARSEMEM_EXTREME=y |
| 194 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | 190 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y |
| 195 | CONFIG_SPARSEMEM_VMEMMAP=y | 191 | CONFIG_SPARSEMEM_VMEMMAP=y |
| @@ -200,9 +196,11 @@ CONFIG_PAGEFLAGS_EXTENDED=y | |||
| 200 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 196 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
| 201 | CONFIG_MIGRATION=y | 197 | CONFIG_MIGRATION=y |
| 202 | CONFIG_RESOURCES_64BIT=y | 198 | CONFIG_RESOURCES_64BIT=y |
| 199 | CONFIG_PHYS_ADDR_T_64BIT=y | ||
| 203 | CONFIG_ZONE_DMA_FLAG=1 | 200 | CONFIG_ZONE_DMA_FLAG=1 |
| 204 | CONFIG_BOUNCE=y | 201 | CONFIG_BOUNCE=y |
| 205 | CONFIG_VIRT_TO_BUS=y | 202 | CONFIG_VIRT_TO_BUS=y |
| 203 | CONFIG_UNEVICTABLE_LRU=y | ||
| 206 | 204 | ||
| 207 | # | 205 | # |
| 208 | # I/O subsystem configuration | 206 | # I/O subsystem configuration |
| @@ -220,6 +218,8 @@ CONFIG_IPL=y | |||
| 220 | CONFIG_IPL_VM=y | 218 | CONFIG_IPL_VM=y |
| 221 | CONFIG_BINFMT_ELF=y | 219 | CONFIG_BINFMT_ELF=y |
| 222 | CONFIG_COMPAT_BINFMT_ELF=y | 220 | CONFIG_COMPAT_BINFMT_ELF=y |
| 221 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
| 222 | # CONFIG_HAVE_AOUT is not set | ||
| 223 | CONFIG_BINFMT_MISC=m | 223 | CONFIG_BINFMT_MISC=m |
| 224 | CONFIG_FORCE_MAX_ZONEORDER=9 | 224 | CONFIG_FORCE_MAX_ZONEORDER=9 |
| 225 | # CONFIG_PROCESS_DEBUG is not set | 225 | # CONFIG_PROCESS_DEBUG is not set |
| @@ -255,7 +255,7 @@ CONFIG_XFRM=y | |||
| 255 | # CONFIG_XFRM_STATISTICS is not set | 255 | # CONFIG_XFRM_STATISTICS is not set |
| 256 | CONFIG_NET_KEY=y | 256 | CONFIG_NET_KEY=y |
| 257 | # CONFIG_NET_KEY_MIGRATE is not set | 257 | # CONFIG_NET_KEY_MIGRATE is not set |
| 258 | CONFIG_IUCV=m | 258 | CONFIG_IUCV=y |
| 259 | CONFIG_AFIUCV=m | 259 | CONFIG_AFIUCV=m |
| 260 | CONFIG_INET=y | 260 | CONFIG_INET=y |
| 261 | CONFIG_IP_MULTICAST=y | 261 | CONFIG_IP_MULTICAST=y |
| @@ -282,7 +282,6 @@ CONFIG_INET_TCP_DIAG=y | |||
| 282 | CONFIG_TCP_CONG_CUBIC=y | 282 | CONFIG_TCP_CONG_CUBIC=y |
| 283 | CONFIG_DEFAULT_TCP_CONG="cubic" | 283 | CONFIG_DEFAULT_TCP_CONG="cubic" |
| 284 | # CONFIG_TCP_MD5SIG is not set | 284 | # CONFIG_TCP_MD5SIG is not set |
| 285 | # CONFIG_IP_VS is not set | ||
| 286 | CONFIG_IPV6=y | 285 | CONFIG_IPV6=y |
| 287 | # CONFIG_IPV6_PRIVACY is not set | 286 | # CONFIG_IPV6_PRIVACY is not set |
| 288 | # CONFIG_IPV6_ROUTER_PREF is not set | 287 | # CONFIG_IPV6_ROUTER_PREF is not set |
| @@ -331,10 +330,12 @@ CONFIG_NF_CONNTRACK=m | |||
| 331 | # CONFIG_NF_CONNTRACK_TFTP is not set | 330 | # CONFIG_NF_CONNTRACK_TFTP is not set |
| 332 | # CONFIG_NF_CT_NETLINK is not set | 331 | # CONFIG_NF_CT_NETLINK is not set |
| 333 | # CONFIG_NETFILTER_XTABLES is not set | 332 | # CONFIG_NETFILTER_XTABLES is not set |
| 333 | # CONFIG_IP_VS is not set | ||
| 334 | 334 | ||
| 335 | # | 335 | # |
| 336 | # IP: Netfilter Configuration | 336 | # IP: Netfilter Configuration |
| 337 | # | 337 | # |
| 338 | # CONFIG_NF_DEFRAG_IPV4 is not set | ||
| 338 | # CONFIG_NF_CONNTRACK_IPV4 is not set | 339 | # CONFIG_NF_CONNTRACK_IPV4 is not set |
| 339 | # CONFIG_IP_NF_QUEUE is not set | 340 | # CONFIG_IP_NF_QUEUE is not set |
| 340 | # CONFIG_IP_NF_IPTABLES is not set | 341 | # CONFIG_IP_NF_IPTABLES is not set |
| @@ -374,6 +375,7 @@ CONFIG_NET_SCH_CBQ=m | |||
| 374 | # CONFIG_NET_SCH_HTB is not set | 375 | # CONFIG_NET_SCH_HTB is not set |
| 375 | # CONFIG_NET_SCH_HFSC is not set | 376 | # CONFIG_NET_SCH_HFSC is not set |
| 376 | CONFIG_NET_SCH_PRIO=m | 377 | CONFIG_NET_SCH_PRIO=m |
| 378 | CONFIG_NET_SCH_MULTIQ=y | ||
| 377 | CONFIG_NET_SCH_RED=m | 379 | CONFIG_NET_SCH_RED=m |
| 378 | CONFIG_NET_SCH_SFQ=m | 380 | CONFIG_NET_SCH_SFQ=m |
| 379 | CONFIG_NET_SCH_TEQL=m | 381 | CONFIG_NET_SCH_TEQL=m |
| @@ -406,6 +408,7 @@ CONFIG_NET_ACT_POLICE=y | |||
| 406 | CONFIG_NET_ACT_NAT=m | 408 | CONFIG_NET_ACT_NAT=m |
| 407 | # CONFIG_NET_ACT_PEDIT is not set | 409 | # CONFIG_NET_ACT_PEDIT is not set |
| 408 | # CONFIG_NET_ACT_SIMP is not set | 410 | # CONFIG_NET_ACT_SIMP is not set |
| 411 | # CONFIG_NET_ACT_SKBEDIT is not set | ||
| 409 | # CONFIG_NET_CLS_IND is not set | 412 | # CONFIG_NET_CLS_IND is not set |
| 410 | CONFIG_NET_SCH_FIFO=y | 413 | CONFIG_NET_SCH_FIFO=y |
| 411 | 414 | ||
| @@ -424,6 +427,7 @@ CONFIG_CAN_BCM=m | |||
| 424 | CONFIG_CAN_VCAN=m | 427 | CONFIG_CAN_VCAN=m |
| 425 | # CONFIG_CAN_DEBUG_DEVICES is not set | 428 | # CONFIG_CAN_DEBUG_DEVICES is not set |
| 426 | # CONFIG_AF_RXRPC is not set | 429 | # CONFIG_AF_RXRPC is not set |
| 430 | # CONFIG_PHONET is not set | ||
| 427 | # CONFIG_RFKILL is not set | 431 | # CONFIG_RFKILL is not set |
| 428 | # CONFIG_NET_9P is not set | 432 | # CONFIG_NET_9P is not set |
| 429 | # CONFIG_PCMCIA is not set | 433 | # CONFIG_PCMCIA is not set |
| @@ -473,7 +477,7 @@ CONFIG_VIRTIO_BLK=m | |||
| 473 | CONFIG_MISC_DEVICES=y | 477 | CONFIG_MISC_DEVICES=y |
| 474 | # CONFIG_EEPROM_93CX6 is not set | 478 | # CONFIG_EEPROM_93CX6 is not set |
| 475 | # CONFIG_ENCLOSURE_SERVICES is not set | 479 | # CONFIG_ENCLOSURE_SERVICES is not set |
| 476 | # CONFIG_HAVE_IDE is not set | 480 | # CONFIG_C2PORT is not set |
| 477 | 481 | ||
| 478 | # | 482 | # |
| 479 | # SCSI device support | 483 | # SCSI device support |
| @@ -525,6 +529,7 @@ CONFIG_SCSI_DH_EMC=m | |||
| 525 | CONFIG_SCSI_DH_ALUA=m | 529 | CONFIG_SCSI_DH_ALUA=m |
| 526 | CONFIG_MD=y | 530 | CONFIG_MD=y |
| 527 | CONFIG_BLK_DEV_MD=y | 531 | CONFIG_BLK_DEV_MD=y |
| 532 | CONFIG_MD_AUTODETECT=y | ||
| 528 | CONFIG_MD_LINEAR=m | 533 | CONFIG_MD_LINEAR=m |
| 529 | CONFIG_MD_RAID0=m | 534 | CONFIG_MD_RAID0=m |
| 530 | CONFIG_MD_RAID1=m | 535 | CONFIG_MD_RAID1=m |
| @@ -555,6 +560,9 @@ CONFIG_NET_ETHERNET=y | |||
| 555 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 560 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
| 556 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 561 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
| 557 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 562 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
| 563 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
| 564 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
| 565 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
| 558 | CONFIG_NETDEV_1000=y | 566 | CONFIG_NETDEV_1000=y |
| 559 | CONFIG_NETDEV_10000=y | 567 | CONFIG_NETDEV_10000=y |
| 560 | # CONFIG_TR is not set | 568 | # CONFIG_TR is not set |
| @@ -632,13 +640,12 @@ CONFIG_S390_VMUR=m | |||
| 632 | # CONFIG_THERMAL is not set | 640 | # CONFIG_THERMAL is not set |
| 633 | # CONFIG_THERMAL_HWMON is not set | 641 | # CONFIG_THERMAL_HWMON is not set |
| 634 | # CONFIG_WATCHDOG is not set | 642 | # CONFIG_WATCHDOG is not set |
| 635 | 643 | # CONFIG_REGULATOR is not set | |
| 636 | # | ||
| 637 | # Sonics Silicon Backplane | ||
| 638 | # | ||
| 639 | # CONFIG_MEMSTICK is not set | 644 | # CONFIG_MEMSTICK is not set |
| 640 | # CONFIG_NEW_LEDS is not set | 645 | # CONFIG_NEW_LEDS is not set |
| 641 | CONFIG_ACCESSIBILITY=y | 646 | CONFIG_ACCESSIBILITY=y |
| 647 | # CONFIG_STAGING is not set | ||
| 648 | CONFIG_STAGING_EXCLUDE_BUILD=y | ||
| 642 | 649 | ||
| 643 | # | 650 | # |
| 644 | # File systems | 651 | # File systems |
| @@ -650,13 +657,14 @@ CONFIG_EXT3_FS=y | |||
| 650 | CONFIG_EXT3_FS_XATTR=y | 657 | CONFIG_EXT3_FS_XATTR=y |
| 651 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 658 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
| 652 | # CONFIG_EXT3_FS_SECURITY is not set | 659 | # CONFIG_EXT3_FS_SECURITY is not set |
| 653 | # CONFIG_EXT4DEV_FS is not set | 660 | # CONFIG_EXT4_FS is not set |
| 654 | CONFIG_JBD=y | 661 | CONFIG_JBD=y |
| 655 | # CONFIG_JBD_DEBUG is not set | 662 | # CONFIG_JBD_DEBUG is not set |
| 656 | CONFIG_FS_MBCACHE=y | 663 | CONFIG_FS_MBCACHE=y |
| 657 | # CONFIG_REISERFS_FS is not set | 664 | # CONFIG_REISERFS_FS is not set |
| 658 | # CONFIG_JFS_FS is not set | 665 | # CONFIG_JFS_FS is not set |
| 659 | CONFIG_FS_POSIX_ACL=y | 666 | CONFIG_FS_POSIX_ACL=y |
| 667 | CONFIG_FILE_LOCKING=y | ||
| 660 | # CONFIG_XFS_FS is not set | 668 | # CONFIG_XFS_FS is not set |
| 661 | # CONFIG_GFS2_FS is not set | 669 | # CONFIG_GFS2_FS is not set |
| 662 | # CONFIG_OCFS2_FS is not set | 670 | # CONFIG_OCFS2_FS is not set |
| @@ -688,6 +696,7 @@ CONFIG_GENERIC_ACL=y | |||
| 688 | CONFIG_PROC_FS=y | 696 | CONFIG_PROC_FS=y |
| 689 | CONFIG_PROC_KCORE=y | 697 | CONFIG_PROC_KCORE=y |
| 690 | CONFIG_PROC_SYSCTL=y | 698 | CONFIG_PROC_SYSCTL=y |
| 699 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 691 | CONFIG_SYSFS=y | 700 | CONFIG_SYSFS=y |
| 692 | CONFIG_TMPFS=y | 701 | CONFIG_TMPFS=y |
| 693 | CONFIG_TMPFS_POSIX_ACL=y | 702 | CONFIG_TMPFS_POSIX_ACL=y |
| @@ -728,6 +737,7 @@ CONFIG_LOCKD_V4=y | |||
| 728 | CONFIG_EXPORTFS=y | 737 | CONFIG_EXPORTFS=y |
| 729 | CONFIG_NFS_COMMON=y | 738 | CONFIG_NFS_COMMON=y |
| 730 | CONFIG_SUNRPC=y | 739 | CONFIG_SUNRPC=y |
| 740 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
| 731 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 741 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
| 732 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 742 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
| 733 | # CONFIG_SMB_FS is not set | 743 | # CONFIG_SMB_FS is not set |
| @@ -800,12 +810,24 @@ CONFIG_DEBUG_MEMORY_INIT=y | |||
| 800 | # CONFIG_DEBUG_SG is not set | 810 | # CONFIG_DEBUG_SG is not set |
| 801 | # CONFIG_FRAME_POINTER is not set | 811 | # CONFIG_FRAME_POINTER is not set |
| 802 | # CONFIG_RCU_TORTURE_TEST is not set | 812 | # CONFIG_RCU_TORTURE_TEST is not set |
| 813 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 803 | # CONFIG_KPROBES_SANITY_TEST is not set | 814 | # CONFIG_KPROBES_SANITY_TEST is not set |
| 804 | # CONFIG_BACKTRACE_SELF_TEST is not set | 815 | # CONFIG_BACKTRACE_SELF_TEST is not set |
| 816 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
| 805 | # CONFIG_LKDTM is not set | 817 | # CONFIG_LKDTM is not set |
| 806 | # CONFIG_FAULT_INJECTION is not set | 818 | # CONFIG_FAULT_INJECTION is not set |
| 807 | # CONFIG_LATENCYTOP is not set | 819 | # CONFIG_LATENCYTOP is not set |
| 808 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 820 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
| 821 | |||
| 822 | # | ||
| 823 | # Tracers | ||
| 824 | # | ||
| 825 | # CONFIG_IRQSOFF_TRACER is not set | ||
| 826 | # CONFIG_PREEMPT_TRACER is not set | ||
| 827 | # CONFIG_SCHED_TRACER is not set | ||
| 828 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
| 829 | # CONFIG_BOOT_TRACER is not set | ||
| 830 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
| 809 | CONFIG_SAMPLES=y | 831 | CONFIG_SAMPLES=y |
| 810 | # CONFIG_SAMPLE_KOBJECT is not set | 832 | # CONFIG_SAMPLE_KOBJECT is not set |
| 811 | # CONFIG_SAMPLE_KPROBES is not set | 833 | # CONFIG_SAMPLE_KPROBES is not set |
| @@ -816,16 +838,19 @@ CONFIG_SAMPLES=y | |||
| 816 | # | 838 | # |
| 817 | # CONFIG_KEYS is not set | 839 | # CONFIG_KEYS is not set |
| 818 | # CONFIG_SECURITY is not set | 840 | # CONFIG_SECURITY is not set |
| 841 | # CONFIG_SECURITYFS is not set | ||
| 819 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 842 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
| 820 | CONFIG_CRYPTO=y | 843 | CONFIG_CRYPTO=y |
| 821 | 844 | ||
| 822 | # | 845 | # |
| 823 | # Crypto core or helper | 846 | # Crypto core or helper |
| 824 | # | 847 | # |
| 848 | CONFIG_CRYPTO_FIPS=y | ||
| 825 | CONFIG_CRYPTO_ALGAPI=y | 849 | CONFIG_CRYPTO_ALGAPI=y |
| 826 | CONFIG_CRYPTO_AEAD=m | 850 | CONFIG_CRYPTO_AEAD=y |
| 827 | CONFIG_CRYPTO_BLKCIPHER=y | 851 | CONFIG_CRYPTO_BLKCIPHER=y |
| 828 | CONFIG_CRYPTO_HASH=m | 852 | CONFIG_CRYPTO_HASH=y |
| 853 | CONFIG_CRYPTO_RNG=y | ||
| 829 | CONFIG_CRYPTO_MANAGER=y | 854 | CONFIG_CRYPTO_MANAGER=y |
| 830 | CONFIG_CRYPTO_GF128MUL=m | 855 | CONFIG_CRYPTO_GF128MUL=m |
| 831 | # CONFIG_CRYPTO_NULL is not set | 856 | # CONFIG_CRYPTO_NULL is not set |
| @@ -877,7 +902,7 @@ CONFIG_CRYPTO_SHA1=m | |||
| 877 | # | 902 | # |
| 878 | # Ciphers | 903 | # Ciphers |
| 879 | # | 904 | # |
| 880 | # CONFIG_CRYPTO_AES is not set | 905 | CONFIG_CRYPTO_AES=m |
| 881 | # CONFIG_CRYPTO_ANUBIS is not set | 906 | # CONFIG_CRYPTO_ANUBIS is not set |
| 882 | # CONFIG_CRYPTO_ARC4 is not set | 907 | # CONFIG_CRYPTO_ARC4 is not set |
| 883 | # CONFIG_CRYPTO_BLOWFISH is not set | 908 | # CONFIG_CRYPTO_BLOWFISH is not set |
| @@ -898,6 +923,11 @@ CONFIG_CRYPTO_SEED=m | |||
| 898 | # | 923 | # |
| 899 | # CONFIG_CRYPTO_DEFLATE is not set | 924 | # CONFIG_CRYPTO_DEFLATE is not set |
| 900 | CONFIG_CRYPTO_LZO=m | 925 | CONFIG_CRYPTO_LZO=m |
| 926 | |||
| 927 | # | ||
| 928 | # Random Number Generation | ||
| 929 | # | ||
| 930 | CONFIG_CRYPTO_ANSI_CPRNG=m | ||
| 901 | CONFIG_CRYPTO_HW=y | 931 | CONFIG_CRYPTO_HW=y |
| 902 | CONFIG_ZCRYPT=m | 932 | CONFIG_ZCRYPT=m |
| 903 | # CONFIG_ZCRYPT_MONOLITHIC is not set | 933 | # CONFIG_ZCRYPT_MONOLITHIC is not set |
| @@ -912,8 +942,6 @@ CONFIG_S390_PRNG=m | |||
| 912 | # Library routines | 942 | # Library routines |
| 913 | # | 943 | # |
| 914 | CONFIG_BITREVERSE=m | 944 | CONFIG_BITREVERSE=m |
| 915 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
| 916 | # CONFIG_GENERIC_FIND_NEXT_BIT is not set | ||
| 917 | # CONFIG_CRC_CCITT is not set | 945 | # CONFIG_CRC_CCITT is not set |
| 918 | # CONFIG_CRC16 is not set | 946 | # CONFIG_CRC16 is not set |
| 919 | CONFIG_CRC_T10DIF=y | 947 | CONFIG_CRC_T10DIF=y |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 7fc76133b3e4..5caddd4f7bed 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
| @@ -679,8 +679,6 @@ static inline void pmd_clear(pmd_t *pmd) | |||
| 679 | 679 | ||
| 680 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 680 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
| 681 | { | 681 | { |
| 682 | if (mm->context.has_pgste) | ||
| 683 | ptep_rcp_copy(ptep); | ||
| 684 | pte_val(*ptep) = _PAGE_TYPE_EMPTY; | 682 | pte_val(*ptep) = _PAGE_TYPE_EMPTY; |
| 685 | if (mm->context.noexec) | 683 | if (mm->context.noexec) |
| 686 | pte_val(ptep[PTRS_PER_PTE]) = _PAGE_TYPE_EMPTY; | 684 | pte_val(ptep[PTRS_PER_PTE]) = _PAGE_TYPE_EMPTY; |
diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h index a7226f8143fb..5396f9f12263 100644 --- a/arch/s390/include/asm/ptrace.h +++ b/arch/s390/include/asm/ptrace.h | |||
| @@ -321,8 +321,8 @@ struct pt_regs | |||
| 321 | psw_t psw; | 321 | psw_t psw; |
| 322 | unsigned long gprs[NUM_GPRS]; | 322 | unsigned long gprs[NUM_GPRS]; |
| 323 | unsigned long orig_gpr2; | 323 | unsigned long orig_gpr2; |
| 324 | unsigned short svcnr; | ||
| 324 | unsigned short ilc; | 325 | unsigned short ilc; |
| 325 | unsigned short trap; | ||
| 326 | }; | 326 | }; |
| 327 | #endif | 327 | #endif |
| 328 | 328 | ||
| @@ -486,8 +486,6 @@ struct task_struct; | |||
| 486 | extern void user_enable_single_step(struct task_struct *); | 486 | extern void user_enable_single_step(struct task_struct *); |
| 487 | extern void user_disable_single_step(struct task_struct *); | 487 | extern void user_disable_single_step(struct task_struct *); |
| 488 | 488 | ||
| 489 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 490 | |||
| 491 | #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) | 489 | #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) |
| 492 | #define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) | 490 | #define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) |
| 493 | #define user_stack_pointer(regs)((regs)->gprs[15]) | 491 | #define user_stack_pointer(regs)((regs)->gprs[15]) |
diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h index 6e623971fbb9..2429b87eb28d 100644 --- a/arch/s390/include/asm/syscall.h +++ b/arch/s390/include/asm/syscall.h | |||
| @@ -17,9 +17,7 @@ | |||
| 17 | static inline long syscall_get_nr(struct task_struct *task, | 17 | static inline long syscall_get_nr(struct task_struct *task, |
| 18 | struct pt_regs *regs) | 18 | struct pt_regs *regs) |
| 19 | { | 19 | { |
| 20 | if (regs->trap != __LC_SVC_OLD_PSW) | 20 | return regs->svcnr ? regs->svcnr : -1; |
| 21 | return -1; | ||
| 22 | return regs->gprs[2]; | ||
| 23 | } | 21 | } |
| 24 | 22 | ||
| 25 | static inline void syscall_rollback(struct task_struct *task, | 23 | static inline void syscall_rollback(struct task_struct *task, |
| @@ -52,18 +50,20 @@ static inline void syscall_get_arguments(struct task_struct *task, | |||
| 52 | unsigned int i, unsigned int n, | 50 | unsigned int i, unsigned int n, |
| 53 | unsigned long *args) | 51 | unsigned long *args) |
| 54 | { | 52 | { |
| 53 | unsigned long mask = -1UL; | ||
| 54 | |||
| 55 | BUG_ON(i + n > 6); | 55 | BUG_ON(i + n > 6); |
| 56 | #ifdef CONFIG_COMPAT | 56 | #ifdef CONFIG_COMPAT |
| 57 | if (test_tsk_thread_flag(task, TIF_31BIT)) { | 57 | if (test_tsk_thread_flag(task, TIF_31BIT)) |
| 58 | if (i + n == 6) | 58 | mask = 0xffffffff; |
| 59 | args[--n] = (u32) regs->args[0]; | ||
| 60 | while (n-- > 0) | ||
| 61 | args[n] = (u32) regs->gprs[2 + i + n]; | ||
| 62 | } | ||
| 63 | #endif | 59 | #endif |
| 64 | if (i + n == 6) | 60 | if (i + n == 6) |
| 65 | args[--n] = regs->args[0]; | 61 | args[--n] = regs->args[0] & mask; |
| 66 | memcpy(args, ®s->gprs[2 + i], n * sizeof(args[0])); | 62 | while (n-- > 0) |
| 63 | if (i + n > 0) | ||
| 64 | args[n] = regs->gprs[2 + i + n] & mask; | ||
| 65 | if (i == 0) | ||
| 66 | args[0] = regs->orig_gpr2 & mask; | ||
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static inline void syscall_set_arguments(struct task_struct *task, | 69 | static inline void syscall_set_arguments(struct task_struct *task, |
| @@ -74,7 +74,11 @@ static inline void syscall_set_arguments(struct task_struct *task, | |||
| 74 | BUG_ON(i + n > 6); | 74 | BUG_ON(i + n > 6); |
| 75 | if (i + n == 6) | 75 | if (i + n == 6) |
| 76 | regs->args[0] = args[--n]; | 76 | regs->args[0] = args[--n]; |
| 77 | memcpy(®s->gprs[2 + i], args, n * sizeof(args[0])); | 77 | while (n-- > 0) |
| 78 | if (i + n > 0) | ||
| 79 | regs->gprs[2 + i + n] = args[n]; | ||
| 80 | if (i == 0) | ||
| 81 | regs->orig_gpr2 = args[0]; | ||
| 78 | } | 82 | } |
| 79 | 83 | ||
| 80 | #endif /* _ASM_SYSCALL_H */ | 84 | #endif /* _ASM_SYSCALL_H */ |
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index fa28ecae636b..3d144e6020c6 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
| @@ -32,7 +32,7 @@ int main(void) | |||
| 32 | DEFINE(__PT_GPRS, offsetof(struct pt_regs, gprs)); | 32 | DEFINE(__PT_GPRS, offsetof(struct pt_regs, gprs)); |
| 33 | DEFINE(__PT_ORIG_GPR2, offsetof(struct pt_regs, orig_gpr2)); | 33 | DEFINE(__PT_ORIG_GPR2, offsetof(struct pt_regs, orig_gpr2)); |
| 34 | DEFINE(__PT_ILC, offsetof(struct pt_regs, ilc)); | 34 | DEFINE(__PT_ILC, offsetof(struct pt_regs, ilc)); |
| 35 | DEFINE(__PT_TRAP, offsetof(struct pt_regs, trap)); | 35 | DEFINE(__PT_SVCNR, offsetof(struct pt_regs, svcnr)); |
| 36 | DEFINE(__PT_SIZE, sizeof(struct pt_regs)); | 36 | DEFINE(__PT_SIZE, sizeof(struct pt_regs)); |
| 37 | BLANK(); | 37 | BLANK(); |
| 38 | DEFINE(__SF_BACKCHAIN, offsetof(struct stack_frame, back_chain)); | 38 | DEFINE(__SF_BACKCHAIN, offsetof(struct stack_frame, back_chain)); |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index c7f02e777af2..b537cb0e9b55 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
| @@ -340,7 +340,7 @@ static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs) | |||
| 340 | return err; | 340 | return err; |
| 341 | 341 | ||
| 342 | restore_fp_regs(¤t->thread.fp_regs); | 342 | restore_fp_regs(¤t->thread.fp_regs); |
| 343 | regs->trap = -1; /* disable syscall checks */ | 343 | regs->svcnr = 0; /* disable syscall checks */ |
| 344 | return 0; | 344 | return 0; |
| 345 | } | 345 | } |
| 346 | 346 | ||
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 08844fc24a2e..198ea18a534d 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
| @@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 56 | |||
| 46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60 | 46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60 |
| 47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 | 47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 |
| 48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC | 48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC |
| 49 | SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP | 49 | SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR |
| 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE | 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE |
| 51 | 51 | ||
| 52 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | 52 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ |
| @@ -183,11 +183,10 @@ STACK_SIZE = 1 << STACK_SHIFT | |||
| 183 | .macro CREATE_STACK_FRAME psworg,savearea | 183 | .macro CREATE_STACK_FRAME psworg,savearea |
| 184 | s %r15,BASED(.Lc_spsize) # make room for registers & psw | 184 | s %r15,BASED(.Lc_spsize) # make room for registers & psw |
| 185 | mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack | 185 | mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack |
| 186 | la %r12,\psworg | ||
| 187 | st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 | 186 | st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 |
| 188 | icm %r12,12,__LC_SVC_ILC | 187 | icm %r12,3,__LC_SVC_ILC |
| 189 | stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack | 188 | stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack |
| 190 | st %r12,SP_ILC(%r15) | 189 | st %r12,SP_SVCNR(%r15) |
| 191 | mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack | 190 | mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack |
| 192 | la %r12,0 | 191 | la %r12,0 |
| 193 | st %r12,__SF_BACKCHAIN(%r15) # clear back chain | 192 | st %r12,__SF_BACKCHAIN(%r15) # clear back chain |
| @@ -264,16 +263,17 @@ sysc_update: | |||
| 264 | #endif | 263 | #endif |
| 265 | sysc_do_svc: | 264 | sysc_do_svc: |
| 266 | l %r9,__LC_THREAD_INFO # load pointer to thread_info struct | 265 | l %r9,__LC_THREAD_INFO # load pointer to thread_info struct |
| 267 | sla %r7,2 # *4 and test for svc 0 | 266 | ltr %r7,%r7 # test for svc 0 |
| 268 | bnz BASED(sysc_nr_ok) # svc number > 0 | 267 | bnz BASED(sysc_nr_ok) # svc number > 0 |
| 269 | # svc 0: system call number in %r1 | 268 | # svc 0: system call number in %r1 |
| 270 | cl %r1,BASED(.Lnr_syscalls) | 269 | cl %r1,BASED(.Lnr_syscalls) |
| 271 | bnl BASED(sysc_nr_ok) | 270 | bnl BASED(sysc_nr_ok) |
| 272 | lr %r7,%r1 # copy svc number to %r7 | 271 | lr %r7,%r1 # copy svc number to %r7 |
| 273 | sla %r7,2 # *4 | ||
| 274 | sysc_nr_ok: | 272 | sysc_nr_ok: |
| 275 | mvc SP_ARGS(4,%r15),SP_R7(%r15) | 273 | mvc SP_ARGS(4,%r15),SP_R7(%r15) |
| 276 | sysc_do_restart: | 274 | sysc_do_restart: |
| 275 | sth %r7,SP_SVCNR(%r15) | ||
| 276 | sll %r7,2 # svc number *4 | ||
| 277 | l %r8,BASED(.Lsysc_table) | 277 | l %r8,BASED(.Lsysc_table) |
| 278 | tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) | 278 | tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) |
| 279 | l %r8,0(%r7,%r8) # get system call addr. | 279 | l %r8,0(%r7,%r8) # get system call addr. |
| @@ -376,7 +376,6 @@ sysc_notify_resume: | |||
| 376 | sysc_restart: | 376 | sysc_restart: |
| 377 | ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC | 377 | ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC |
| 378 | l %r7,SP_R2(%r15) # load new svc number | 378 | l %r7,SP_R2(%r15) # load new svc number |
| 379 | sla %r7,2 | ||
| 380 | mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument | 379 | mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument |
| 381 | lm %r2,%r6,SP_R2(%r15) # load svc arguments | 380 | lm %r2,%r6,SP_R2(%r15) # load svc arguments |
| 382 | b BASED(sysc_do_restart) # restart svc | 381 | b BASED(sysc_do_restart) # restart svc |
| @@ -386,7 +385,8 @@ sysc_restart: | |||
| 386 | # | 385 | # |
| 387 | sysc_singlestep: | 386 | sysc_singlestep: |
| 388 | ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP | 387 | ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP |
| 389 | mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check | 388 | mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check |
| 389 | mvi SP_SVCNR+1(%r15),0xff | ||
| 390 | la %r2,SP_PTREGS(%r15) # address of register-save area | 390 | la %r2,SP_PTREGS(%r15) # address of register-save area |
| 391 | l %r1,BASED(.Lhandle_per) # load adr. of per handler | 391 | l %r1,BASED(.Lhandle_per) # load adr. of per handler |
| 392 | la %r14,BASED(sysc_return) # load adr. of system return | 392 | la %r14,BASED(sysc_return) # load adr. of system return |
| @@ -407,7 +407,7 @@ sysc_tracesys: | |||
| 407 | bnl BASED(sysc_tracenogo) | 407 | bnl BASED(sysc_tracenogo) |
| 408 | l %r8,BASED(.Lsysc_table) | 408 | l %r8,BASED(.Lsysc_table) |
| 409 | lr %r7,%r2 | 409 | lr %r7,%r2 |
| 410 | sll %r7,2 # *4 | 410 | sll %r7,2 # svc number *4 |
| 411 | l %r8,0(%r7,%r8) | 411 | l %r8,0(%r7,%r8) |
| 412 | sysc_tracego: | 412 | sysc_tracego: |
| 413 | lm %r3,%r6,SP_R3(%r15) | 413 | lm %r3,%r6,SP_R3(%r15) |
| @@ -586,7 +586,8 @@ pgm_svcper: | |||
| 586 | # per was called from kernel, must be kprobes | 586 | # per was called from kernel, must be kprobes |
| 587 | # | 587 | # |
| 588 | kernel_per: | 588 | kernel_per: |
| 589 | mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check | 589 | mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check |
| 590 | mvi SP_SVCNR+1(%r15),0xff | ||
| 590 | la %r2,SP_PTREGS(%r15) # address of register-save area | 591 | la %r2,SP_PTREGS(%r15) # address of register-save area |
| 591 | l %r1,BASED(.Lhandle_per) # load adr. of per handler | 592 | l %r1,BASED(.Lhandle_per) # load adr. of per handler |
| 592 | la %r14,BASED(sysc_restore)# load adr. of system return | 593 | la %r14,BASED(sysc_restore)# load adr. of system return |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 41aca06682aa..89c121ae6339 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
| @@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 112 | |||
| 46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 120 | 46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 120 |
| 47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 | 47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 |
| 48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC | 48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC |
| 49 | SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP | 49 | SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR |
| 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE | 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE |
| 51 | 51 | ||
| 52 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER | 52 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER |
| @@ -171,11 +171,10 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | |||
| 171 | .macro CREATE_STACK_FRAME psworg,savearea | 171 | .macro CREATE_STACK_FRAME psworg,savearea |
| 172 | aghi %r15,-SP_SIZE # make room for registers & psw | 172 | aghi %r15,-SP_SIZE # make room for registers & psw |
| 173 | mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack | 173 | mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack |
| 174 | la %r12,\psworg | ||
| 175 | stg %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 | 174 | stg %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 |
| 176 | icm %r12,12,__LC_SVC_ILC | 175 | icm %r12,3,__LC_SVC_ILC |
| 177 | stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack | 176 | stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack |
| 178 | st %r12,SP_ILC(%r15) | 177 | st %r12,SP_SVCNR(%r15) |
| 179 | mvc SP_R12(32,%r15),\savearea # move %r12-%r15 to stack | 178 | mvc SP_R12(32,%r15),\savearea # move %r12-%r15 to stack |
| 180 | la %r12,0 | 179 | la %r12,0 |
| 181 | stg %r12,__SF_BACKCHAIN(%r15) | 180 | stg %r12,__SF_BACKCHAIN(%r15) |
| @@ -250,16 +249,17 @@ sysc_update: | |||
| 250 | #endif | 249 | #endif |
| 251 | sysc_do_svc: | 250 | sysc_do_svc: |
| 252 | lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct | 251 | lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct |
| 253 | slag %r7,%r7,2 # *4 and test for svc 0 | 252 | ltgr %r7,%r7 # test for svc 0 |
| 254 | jnz sysc_nr_ok | 253 | jnz sysc_nr_ok |
| 255 | # svc 0: system call number in %r1 | 254 | # svc 0: system call number in %r1 |
| 256 | cl %r1,BASED(.Lnr_syscalls) | 255 | cl %r1,BASED(.Lnr_syscalls) |
| 257 | jnl sysc_nr_ok | 256 | jnl sysc_nr_ok |
| 258 | lgfr %r7,%r1 # clear high word in r1 | 257 | lgfr %r7,%r1 # clear high word in r1 |
| 259 | slag %r7,%r7,2 # svc 0: system call number in %r1 | ||
| 260 | sysc_nr_ok: | 258 | sysc_nr_ok: |
| 261 | mvc SP_ARGS(8,%r15),SP_R7(%r15) | 259 | mvc SP_ARGS(8,%r15),SP_R7(%r15) |
| 262 | sysc_do_restart: | 260 | sysc_do_restart: |
| 261 | sth %r7,SP_SVCNR(%r15) | ||
| 262 | sllg %r7,%r7,2 # svc number * 4 | ||
| 263 | larl %r10,sys_call_table | 263 | larl %r10,sys_call_table |
| 264 | #ifdef CONFIG_COMPAT | 264 | #ifdef CONFIG_COMPAT |
| 265 | tm __TI_flags+5(%r9),(_TIF_31BIT>>16) # running in 31 bit mode ? | 265 | tm __TI_flags+5(%r9),(_TIF_31BIT>>16) # running in 31 bit mode ? |
| @@ -363,7 +363,6 @@ sysc_notify_resume: | |||
| 363 | sysc_restart: | 363 | sysc_restart: |
| 364 | ni __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC | 364 | ni __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC |
| 365 | lg %r7,SP_R2(%r15) # load new svc number | 365 | lg %r7,SP_R2(%r15) # load new svc number |
| 366 | slag %r7,%r7,2 # *4 | ||
| 367 | mvc SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument | 366 | mvc SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument |
| 368 | lmg %r2,%r6,SP_R2(%r15) # load svc arguments | 367 | lmg %r2,%r6,SP_R2(%r15) # load svc arguments |
| 369 | j sysc_do_restart # restart svc | 368 | j sysc_do_restart # restart svc |
| @@ -372,9 +371,8 @@ sysc_restart: | |||
| 372 | # _TIF_SINGLE_STEP is set, call do_single_step | 371 | # _TIF_SINGLE_STEP is set, call do_single_step |
| 373 | # | 372 | # |
| 374 | sysc_singlestep: | 373 | sysc_singlestep: |
| 375 | ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP | 374 | ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP |
| 376 | lhi %r0,__LC_PGM_OLD_PSW | 375 | xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number |
| 377 | sth %r0,SP_TRAP(%r15) # set trap indication to pgm check | ||
| 378 | la %r2,SP_PTREGS(%r15) # address of register-save area | 376 | la %r2,SP_PTREGS(%r15) # address of register-save area |
| 379 | larl %r14,sysc_return # load adr. of system return | 377 | larl %r14,sysc_return # load adr. of system return |
| 380 | jg do_single_step # branch to do_sigtrap | 378 | jg do_single_step # branch to do_sigtrap |
| @@ -392,7 +390,7 @@ sysc_tracesys: | |||
| 392 | lghi %r0,NR_syscalls | 390 | lghi %r0,NR_syscalls |
| 393 | clgr %r0,%r2 | 391 | clgr %r0,%r2 |
| 394 | jnh sysc_tracenogo | 392 | jnh sysc_tracenogo |
| 395 | slag %r7,%r2,2 # *4 | 393 | sllg %r7,%r2,2 # svc number *4 |
| 396 | lgf %r8,0(%r7,%r10) | 394 | lgf %r8,0(%r7,%r10) |
| 397 | sysc_tracego: | 395 | sysc_tracego: |
| 398 | lmg %r3,%r6,SP_R3(%r15) | 396 | lmg %r3,%r6,SP_R3(%r15) |
| @@ -567,8 +565,7 @@ pgm_svcper: | |||
| 567 | # per was called from kernel, must be kprobes | 565 | # per was called from kernel, must be kprobes |
| 568 | # | 566 | # |
| 569 | kernel_per: | 567 | kernel_per: |
| 570 | lhi %r0,__LC_PGM_OLD_PSW | 568 | xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number |
| 571 | sth %r0,SP_TRAP(%r15) # set trap indication to pgm check | ||
| 572 | la %r2,SP_PTREGS(%r15) # address of register-save area | 569 | la %r2,SP_PTREGS(%r15) # address of register-save area |
| 573 | larl %r14,sysc_restore # load adr. of system ret, no work | 570 | larl %r14,sysc_restore # load adr. of system ret, no work |
| 574 | jg do_single_step # branch to do_single_step | 571 | jg do_single_step # branch to do_single_step |
diff --git a/arch/s390/kernel/init_task.c b/arch/s390/kernel/init_task.c index 7ad003969251..e80716843619 100644 --- a/arch/s390/kernel/init_task.c +++ b/arch/s390/kernel/init_task.c | |||
| @@ -26,7 +26,7 @@ EXPORT_SYMBOL(init_mm); | |||
| 26 | /* | 26 | /* |
| 27 | * Initial thread structure. | 27 | * Initial thread structure. |
| 28 | * | 28 | * |
| 29 | * We need to make sure that this is 8192-byte aligned due to the | 29 | * We need to make sure that this is THREAD_SIZE aligned due to the |
| 30 | * way process stacks are handled. This is done by having a special | 30 | * way process stacks are handled. This is done by having a special |
| 31 | * "init_task" linker map entry.. | 31 | * "init_task" linker map entry.. |
| 32 | */ | 32 | */ |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 1f31be1ecc4b..38ff2bce1203 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
| @@ -657,7 +657,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | |||
| 657 | * debugger stored an invalid system call number. Skip | 657 | * debugger stored an invalid system call number. Skip |
| 658 | * the system call and the system call restart handling. | 658 | * the system call and the system call restart handling. |
| 659 | */ | 659 | */ |
| 660 | regs->trap = -1; | 660 | regs->svcnr = 0; |
| 661 | ret = -1; | 661 | ret = -1; |
| 662 | } | 662 | } |
| 663 | 663 | ||
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 4f7fc3059a8e..8e6812a22670 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
| @@ -160,7 +160,7 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | |||
| 160 | current->thread.fp_regs.fpc &= FPC_VALID_MASK; | 160 | current->thread.fp_regs.fpc &= FPC_VALID_MASK; |
| 161 | 161 | ||
| 162 | restore_fp_regs(¤t->thread.fp_regs); | 162 | restore_fp_regs(¤t->thread.fp_regs); |
| 163 | regs->trap = -1; /* disable syscall checks */ | 163 | regs->svcnr = 0; /* disable syscall checks */ |
| 164 | return 0; | 164 | return 0; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| @@ -445,7 +445,7 @@ void do_signal(struct pt_regs *regs) | |||
| 445 | oldset = ¤t->blocked; | 445 | oldset = ¤t->blocked; |
| 446 | 446 | ||
| 447 | /* Are we from a system call? */ | 447 | /* Are we from a system call? */ |
| 448 | if (regs->trap == __LC_SVC_OLD_PSW) { | 448 | if (regs->svcnr) { |
| 449 | continue_addr = regs->psw.addr; | 449 | continue_addr = regs->psw.addr; |
| 450 | restart_addr = continue_addr - regs->ilc; | 450 | restart_addr = continue_addr - regs->ilc; |
| 451 | retval = regs->gprs[2]; | 451 | retval = regs->gprs[2]; |
| @@ -462,7 +462,7 @@ void do_signal(struct pt_regs *regs) | |||
| 462 | case -ERESTART_RESTARTBLOCK: | 462 | case -ERESTART_RESTARTBLOCK: |
| 463 | regs->gprs[2] = -EINTR; | 463 | regs->gprs[2] = -EINTR; |
| 464 | } | 464 | } |
| 465 | regs->trap = -1; /* Don't deal with this again. */ | 465 | regs->svcnr = 0; /* Don't deal with this again. */ |
| 466 | } | 466 | } |
| 467 | 467 | ||
| 468 | /* Get signal to deliver. When running under ptrace, at this point | 468 | /* Get signal to deliver. When running under ptrace, at this point |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index b94e9e3b694a..eccefbbff887 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
| @@ -59,7 +59,7 @@ | |||
| 59 | 59 | ||
| 60 | static ext_int_info_t ext_int_info_cc; | 60 | static ext_int_info_t ext_int_info_cc; |
| 61 | static ext_int_info_t ext_int_etr_cc; | 61 | static ext_int_info_t ext_int_etr_cc; |
| 62 | static u64 jiffies_timer_cc; | 62 | static u64 sched_clock_base_cc; |
| 63 | 63 | ||
| 64 | static DEFINE_PER_CPU(struct clock_event_device, comparators); | 64 | static DEFINE_PER_CPU(struct clock_event_device, comparators); |
| 65 | 65 | ||
| @@ -68,7 +68,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators); | |||
| 68 | */ | 68 | */ |
| 69 | unsigned long long sched_clock(void) | 69 | unsigned long long sched_clock(void) |
| 70 | { | 70 | { |
| 71 | return ((get_clock_xt() - jiffies_timer_cc) * 125) >> 9; | 71 | return ((get_clock_xt() - sched_clock_base_cc) * 125) >> 9; |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | /* | 74 | /* |
| @@ -229,13 +229,10 @@ static struct clocksource clocksource_tod = { | |||
| 229 | */ | 229 | */ |
| 230 | void __init time_init(void) | 230 | void __init time_init(void) |
| 231 | { | 231 | { |
| 232 | u64 init_timer_cc; | 232 | sched_clock_base_cc = reset_tod_clock(); |
| 233 | |||
| 234 | init_timer_cc = reset_tod_clock(); | ||
| 235 | jiffies_timer_cc = init_timer_cc - jiffies_64 * CLK_TICKS_PER_JIFFY; | ||
| 236 | 233 | ||
| 237 | /* set xtime */ | 234 | /* set xtime */ |
| 238 | tod_to_timeval(init_timer_cc - TOD_UNIX_EPOCH, &xtime); | 235 | tod_to_timeval(sched_clock_base_cc - TOD_UNIX_EPOCH, &xtime); |
| 239 | set_normalized_timespec(&wall_to_monotonic, | 236 | set_normalized_timespec(&wall_to_monotonic, |
| 240 | -xtime.tv_sec, -xtime.tv_nsec); | 237 | -xtime.tv_sec, -xtime.tv_nsec); |
| 241 | 238 | ||
| @@ -289,7 +286,7 @@ static unsigned long long adjust_time(unsigned long long old, | |||
| 289 | delta = -delta; | 286 | delta = -delta; |
| 290 | adjust.offset = -ticks * (1000000 / HZ); | 287 | adjust.offset = -ticks * (1000000 / HZ); |
| 291 | } | 288 | } |
| 292 | jiffies_timer_cc += delta; | 289 | sched_clock_base_cc += delta; |
| 293 | if (adjust.offset != 0) { | 290 | if (adjust.offset != 0) { |
| 294 | printk(KERN_NOTICE "etr: time adjusted by %li micro-seconds\n", | 291 | printk(KERN_NOTICE "etr: time adjusted by %li micro-seconds\n", |
| 295 | adjust.offset); | 292 | adjust.offset); |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index 607bd67a18ce..d796d05c9c01 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * Written by Martin Schwidefsky (schwidefsky@de.ibm.com) | 2 | * Written by Martin Schwidefsky (schwidefsky@de.ibm.com) |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | #include <asm/thread_info.h> | ||
| 5 | #include <asm/page.h> | 6 | #include <asm/page.h> |
| 6 | #include <asm-generic/vmlinux.lds.h> | 7 | #include <asm-generic/vmlinux.lds.h> |
| 7 | 8 | ||
| @@ -86,7 +87,7 @@ SECTIONS | |||
| 86 | } | 87 | } |
| 87 | _edata = .; /* End of data section */ | 88 | _edata = .; /* End of data section */ |
| 88 | 89 | ||
| 89 | . = ALIGN(2 * PAGE_SIZE); /* init_task */ | 90 | . = ALIGN(THREAD_SIZE); /* init_task */ |
| 90 | .data.init_task : { | 91 | .data.init_task : { |
| 91 | *(.data.init_task) | 92 | *(.data.init_task) |
| 92 | } | 93 | } |
diff --git a/arch/sparc/include/asm/ptrace_64.h b/arch/sparc/include/asm/ptrace_64.h index 3d3e9c161d8b..84e969f06afe 100644 --- a/arch/sparc/include/asm/ptrace_64.h +++ b/arch/sparc/include/asm/ptrace_64.h | |||
| @@ -142,8 +142,6 @@ struct global_reg_snapshot { | |||
| 142 | }; | 142 | }; |
| 143 | extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS]; | 143 | extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS]; |
| 144 | 144 | ||
| 145 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 146 | |||
| 147 | #define force_successful_syscall_return() \ | 145 | #define force_successful_syscall_return() \ |
| 148 | do { current_thread_info()->syscall_noerror = 1; \ | 146 | do { current_thread_info()->syscall_noerror = 1; \ |
| 149 | } while (0) | 147 | } while (0) |
diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c index e7a0edfc1a32..1fc17f59c6bf 100644 --- a/arch/sparc/kernel/cpu.c +++ b/arch/sparc/kernel/cpu.c | |||
| @@ -126,7 +126,7 @@ char *sparc_fpu_type; | |||
| 126 | 126 | ||
| 127 | unsigned int fsr_storage; | 127 | unsigned int fsr_storage; |
| 128 | 128 | ||
| 129 | void __init cpu_probe(void) | 129 | void __cpuinit cpu_probe(void) |
| 130 | { | 130 | { |
| 131 | int psr_impl, psr_vers, fpu_vers; | 131 | int psr_impl, psr_vers, fpu_vers; |
| 132 | int i, psr; | 132 | int i, psr; |
diff --git a/arch/sparc/kernel/head.S b/arch/sparc/kernel/head.S index 2d325fd84579..51b40426f9c6 100644 --- a/arch/sparc/kernel/head.S +++ b/arch/sparc/kernel/head.S | |||
| @@ -72,7 +72,7 @@ sun4e_notsup: | |||
| 72 | .align 4 | 72 | .align 4 |
| 73 | 73 | ||
| 74 | /* The Sparc trap table, bootloader gives us control at _start. */ | 74 | /* The Sparc trap table, bootloader gives us control at _start. */ |
| 75 | .text | 75 | .section .text.head,"ax" |
| 76 | .globl start, _stext, _start, __stext | 76 | .globl start, _stext, _start, __stext |
| 77 | .globl trapbase | 77 | .globl trapbase |
| 78 | _start: /* danger danger */ | 78 | _start: /* danger danger */ |
diff --git a/arch/sparc/kernel/smp.c b/arch/sparc/kernel/smp.c index 1619ec15c099..e396c1f17a92 100644 --- a/arch/sparc/kernel/smp.c +++ b/arch/sparc/kernel/smp.c | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | 35 | ||
| 36 | #include "irq.h" | 36 | #include "irq.h" |
| 37 | 37 | ||
| 38 | volatile unsigned long cpu_callin_map[NR_CPUS] __initdata = {0,}; | 38 | volatile unsigned long cpu_callin_map[NR_CPUS] __cpuinitdata = {0,}; |
| 39 | unsigned char boot_cpu_id = 0; | 39 | unsigned char boot_cpu_id = 0; |
| 40 | unsigned char boot_cpu_id4 = 0; /* boot_cpu_id << 2 */ | 40 | unsigned char boot_cpu_id4 = 0; /* boot_cpu_id << 2 */ |
| 41 | 41 | ||
| @@ -120,7 +120,7 @@ void cpu_panic(void) | |||
| 120 | panic("SMP bolixed\n"); | 120 | panic("SMP bolixed\n"); |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | struct linux_prom_registers smp_penguin_ctable __initdata = { 0 }; | 123 | struct linux_prom_registers smp_penguin_ctable __cpuinitdata = { 0 }; |
| 124 | 124 | ||
| 125 | void smp_send_reschedule(int cpu) | 125 | void smp_send_reschedule(int cpu) |
| 126 | { | 126 | { |
diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index 7a6a5e795928..16ab0cb731c5 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c | |||
| @@ -83,7 +83,7 @@ static inline void show_leds(int cpuid) | |||
| 83 | "i" (ASI_M_CTL)); | 83 | "i" (ASI_M_CTL)); |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | void __init smp4d_callin(void) | 86 | void __cpuinit smp4d_callin(void) |
| 87 | { | 87 | { |
| 88 | int cpuid = hard_smp4d_processor_id(); | 88 | int cpuid = hard_smp4d_processor_id(); |
| 89 | extern spinlock_t sun4d_imsk_lock; | 89 | extern spinlock_t sun4d_imsk_lock; |
| @@ -386,7 +386,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs) | |||
| 386 | 386 | ||
| 387 | extern unsigned int lvl14_resolution; | 387 | extern unsigned int lvl14_resolution; |
| 388 | 388 | ||
| 389 | static void __init smp_setup_percpu_timer(void) | 389 | static void __cpuinit smp_setup_percpu_timer(void) |
| 390 | { | 390 | { |
| 391 | int cpu = hard_smp4d_processor_id(); | 391 | int cpu = hard_smp4d_processor_id(); |
| 392 | 392 | ||
diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index 5fc386d08c47..4f8d60586b07 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c | |||
| @@ -343,7 +343,7 @@ void smp4m_percpu_timer_interrupt(struct pt_regs *regs) | |||
| 343 | 343 | ||
| 344 | extern unsigned int lvl14_resolution; | 344 | extern unsigned int lvl14_resolution; |
| 345 | 345 | ||
| 346 | static void __init smp_setup_percpu_timer(void) | 346 | static void __cpuinit smp_setup_percpu_timer(void) |
| 347 | { | 347 | { |
| 348 | int cpu = smp_processor_id(); | 348 | int cpu = smp_processor_id(); |
| 349 | 349 | ||
diff --git a/arch/sparc/kernel/trampoline.S b/arch/sparc/kernel/trampoline.S index 356c56aebc62..5e235c52d667 100644 --- a/arch/sparc/kernel/trampoline.S +++ b/arch/sparc/kernel/trampoline.S | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | .globl sun4m_cpu_startup, __smp4m_processor_id | 18 | .globl sun4m_cpu_startup, __smp4m_processor_id |
| 19 | .globl sun4d_cpu_startup, __smp4d_processor_id | 19 | .globl sun4d_cpu_startup, __smp4d_processor_id |
| 20 | 20 | ||
| 21 | __INIT | 21 | __CPUINIT |
| 22 | .align 4 | 22 | .align 4 |
| 23 | 23 | ||
| 24 | /* When we start up a cpu for the first time it enters this routine. | 24 | /* When we start up a cpu for the first time it enters this routine. |
| @@ -109,7 +109,7 @@ __smp4d_processor_id: | |||
| 109 | /* CPUID in bootbus can be found at PA 0xff0140000 */ | 109 | /* CPUID in bootbus can be found at PA 0xff0140000 */ |
| 110 | #define SUN4D_BOOTBUS_CPUID 0xf0140000 | 110 | #define SUN4D_BOOTBUS_CPUID 0xf0140000 |
| 111 | 111 | ||
| 112 | __INIT | 112 | __CPUINIT |
| 113 | .align 4 | 113 | .align 4 |
| 114 | 114 | ||
| 115 | sun4d_cpu_startup: | 115 | sun4d_cpu_startup: |
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index b1002c607196..5b7e69a8c32f 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S | |||
| @@ -13,6 +13,7 @@ SECTIONS | |||
| 13 | .text 0xf0004000 : | 13 | .text 0xf0004000 : |
| 14 | { | 14 | { |
| 15 | _text = .; | 15 | _text = .; |
| 16 | *(.text.head) | ||
| 16 | TEXT_TEXT | 17 | TEXT_TEXT |
| 17 | SCHED_TEXT | 18 | SCHED_TEXT |
| 18 | LOCK_TEXT | 19 | LOCK_TEXT |
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 6a5d7cabc044..dd8aa36f366c 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
| @@ -1251,7 +1251,7 @@ static inline void map_kernel(void) | |||
| 1251 | /* Paging initialization on the Sparc Reference MMU. */ | 1251 | /* Paging initialization on the Sparc Reference MMU. */ |
| 1252 | extern void sparc_context_init(int); | 1252 | extern void sparc_context_init(int); |
| 1253 | 1253 | ||
| 1254 | void (*poke_srmmu)(void) __initdata = NULL; | 1254 | void (*poke_srmmu)(void) __cpuinitdata = NULL; |
| 1255 | 1255 | ||
| 1256 | extern unsigned long bootmem_init(unsigned long *pages_avail); | 1256 | extern unsigned long bootmem_init(unsigned long *pages_avail); |
| 1257 | 1257 | ||
| @@ -1446,7 +1446,7 @@ static void __init init_vac_layout(void) | |||
| 1446 | (int)vac_cache_size, (int)vac_line_size); | 1446 | (int)vac_cache_size, (int)vac_line_size); |
| 1447 | } | 1447 | } |
| 1448 | 1448 | ||
| 1449 | static void __init poke_hypersparc(void) | 1449 | static void __cpuinit poke_hypersparc(void) |
| 1450 | { | 1450 | { |
| 1451 | volatile unsigned long clear; | 1451 | volatile unsigned long clear; |
| 1452 | unsigned long mreg = srmmu_get_mmureg(); | 1452 | unsigned long mreg = srmmu_get_mmureg(); |
| @@ -1501,7 +1501,7 @@ static void __init init_hypersparc(void) | |||
| 1501 | hypersparc_setup_blockops(); | 1501 | hypersparc_setup_blockops(); |
| 1502 | } | 1502 | } |
| 1503 | 1503 | ||
| 1504 | static void __init poke_cypress(void) | 1504 | static void __cpuinit poke_cypress(void) |
| 1505 | { | 1505 | { |
| 1506 | unsigned long mreg = srmmu_get_mmureg(); | 1506 | unsigned long mreg = srmmu_get_mmureg(); |
| 1507 | unsigned long faddr, tagval; | 1507 | unsigned long faddr, tagval; |
| @@ -1589,7 +1589,7 @@ static void __init init_cypress_605(unsigned long mrev) | |||
| 1589 | init_cypress_common(); | 1589 | init_cypress_common(); |
| 1590 | } | 1590 | } |
| 1591 | 1591 | ||
| 1592 | static void __init poke_swift(void) | 1592 | static void __cpuinit poke_swift(void) |
| 1593 | { | 1593 | { |
| 1594 | unsigned long mreg; | 1594 | unsigned long mreg; |
| 1595 | 1595 | ||
| @@ -1771,7 +1771,7 @@ static void turbosparc_flush_tlb_page(struct vm_area_struct *vma, unsigned long | |||
| 1771 | } | 1771 | } |
| 1772 | 1772 | ||
| 1773 | 1773 | ||
| 1774 | static void __init poke_turbosparc(void) | 1774 | static void __cpuinit poke_turbosparc(void) |
| 1775 | { | 1775 | { |
| 1776 | unsigned long mreg = srmmu_get_mmureg(); | 1776 | unsigned long mreg = srmmu_get_mmureg(); |
| 1777 | unsigned long ccreg; | 1777 | unsigned long ccreg; |
| @@ -1834,7 +1834,7 @@ static void __init init_turbosparc(void) | |||
| 1834 | poke_srmmu = poke_turbosparc; | 1834 | poke_srmmu = poke_turbosparc; |
| 1835 | } | 1835 | } |
| 1836 | 1836 | ||
| 1837 | static void __init poke_tsunami(void) | 1837 | static void __cpuinit poke_tsunami(void) |
| 1838 | { | 1838 | { |
| 1839 | unsigned long mreg = srmmu_get_mmureg(); | 1839 | unsigned long mreg = srmmu_get_mmureg(); |
| 1840 | 1840 | ||
| @@ -1876,7 +1876,7 @@ static void __init init_tsunami(void) | |||
| 1876 | tsunami_setup_blockops(); | 1876 | tsunami_setup_blockops(); |
| 1877 | } | 1877 | } |
| 1878 | 1878 | ||
| 1879 | static void __init poke_viking(void) | 1879 | static void __cpuinit poke_viking(void) |
| 1880 | { | 1880 | { |
| 1881 | unsigned long mreg = srmmu_get_mmureg(); | 1881 | unsigned long mreg = srmmu_get_mmureg(); |
| 1882 | static int smp_catch; | 1882 | static int smp_catch; |
diff --git a/arch/sparc64/kernel/pci_fire.c b/arch/sparc64/kernel/pci_fire.c index 9462b68f4894..fcbbac66e141 100644 --- a/arch/sparc64/kernel/pci_fire.c +++ b/arch/sparc64/kernel/pci_fire.c | |||
| @@ -455,7 +455,7 @@ static int __init pci_fire_pbm_init(struct pci_pbm_info *pbm, | |||
| 455 | return 0; | 455 | return 0; |
| 456 | } | 456 | } |
| 457 | 457 | ||
| 458 | static int __devinit fire_probe(struct of_device *op, | 458 | static int __init fire_probe(struct of_device *op, |
| 459 | const struct of_device_id *match) | 459 | const struct of_device_id *match) |
| 460 | { | 460 | { |
| 461 | struct device_node *dp = op->node; | 461 | struct device_node *dp = op->node; |
diff --git a/arch/sparc64/kernel/pci_psycho.c b/arch/sparc64/kernel/pci_psycho.c index dfb3ec892987..56605adbb5b3 100644 --- a/arch/sparc64/kernel/pci_psycho.c +++ b/arch/sparc64/kernel/pci_psycho.c | |||
| @@ -493,7 +493,7 @@ static void __init psycho_pbm_init(struct pci_pbm_info *pbm, | |||
| 493 | psycho_scan_bus(pbm, &op->dev); | 493 | psycho_scan_bus(pbm, &op->dev); |
| 494 | } | 494 | } |
| 495 | 495 | ||
| 496 | static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid) | 496 | static struct pci_pbm_info * __init psycho_find_sibling(u32 upa_portid) |
| 497 | { | 497 | { |
| 498 | struct pci_pbm_info *pbm; | 498 | struct pci_pbm_info *pbm; |
| 499 | 499 | ||
| @@ -506,7 +506,7 @@ static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid) | |||
| 506 | 506 | ||
| 507 | #define PSYCHO_CONFIGSPACE 0x001000000UL | 507 | #define PSYCHO_CONFIGSPACE 0x001000000UL |
| 508 | 508 | ||
| 509 | static int __devinit psycho_probe(struct of_device *op, | 509 | static int __init psycho_probe(struct of_device *op, |
| 510 | const struct of_device_id *match) | 510 | const struct of_device_id *match) |
| 511 | { | 511 | { |
| 512 | const struct linux_prom64_registers *pr_regs; | 512 | const struct linux_prom64_registers *pr_regs; |
diff --git a/arch/sparc64/kernel/pci_sun4v.c b/arch/sparc64/kernel/pci_sun4v.c index 34a1fded3941..4b27b0e10ce7 100644 --- a/arch/sparc64/kernel/pci_sun4v.c +++ b/arch/sparc64/kernel/pci_sun4v.c | |||
| @@ -929,7 +929,7 @@ static int __init pci_sun4v_pbm_init(struct pci_pbm_info *pbm, | |||
| 929 | return 0; | 929 | return 0; |
| 930 | } | 930 | } |
| 931 | 931 | ||
| 932 | static int __devinit pci_sun4v_probe(struct of_device *op, | 932 | static int __init pci_sun4v_probe(struct of_device *op, |
| 933 | const struct of_device_id *match) | 933 | const struct of_device_id *match) |
| 934 | { | 934 | { |
| 935 | const struct linux_prom64_registers *regs; | 935 | const struct linux_prom64_registers *regs; |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index e5627118e613..f500b0618bb0 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
| @@ -282,7 +282,7 @@ static unsigned long kimage_addr_to_ra(void *p) | |||
| 282 | return kern_base + (val - KERNBASE); | 282 | return kern_base + (val - KERNBASE); |
| 283 | } | 283 | } |
| 284 | 284 | ||
| 285 | static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | 285 | static void __cpuinit ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) |
| 286 | { | 286 | { |
| 287 | extern unsigned long sparc64_ttable_tl0; | 287 | extern unsigned long sparc64_ttable_tl0; |
| 288 | extern unsigned long kern_locked_tte_data; | 288 | extern unsigned long kern_locked_tte_data; |
| @@ -343,7 +343,7 @@ extern unsigned long sparc64_cpu_startup; | |||
| 343 | */ | 343 | */ |
| 344 | static struct thread_info *cpu_new_thread = NULL; | 344 | static struct thread_info *cpu_new_thread = NULL; |
| 345 | 345 | ||
| 346 | static int __devinit smp_boot_one_cpu(unsigned int cpu) | 346 | static int __cpuinit smp_boot_one_cpu(unsigned int cpu) |
| 347 | { | 347 | { |
| 348 | struct trap_per_cpu *tb = &trap_block[cpu]; | 348 | struct trap_per_cpu *tb = &trap_block[cpu]; |
| 349 | unsigned long entry = | 349 | unsigned long entry = |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 3c10daf8fc01..185f34679110 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
| @@ -956,7 +956,7 @@ int of_node_to_nid(struct device_node *dp) | |||
| 956 | return nid; | 956 | return nid; |
| 957 | } | 957 | } |
| 958 | 958 | ||
| 959 | static void add_node_ranges(void) | 959 | static void __init add_node_ranges(void) |
| 960 | { | 960 | { |
| 961 | int i; | 961 | int i; |
| 962 | 962 | ||
diff --git a/arch/x86/boot/tty.c b/arch/x86/boot/tty.c index 0be77b39328a..7e8e8b25f5f6 100644 --- a/arch/x86/boot/tty.c +++ b/arch/x86/boot/tty.c | |||
| @@ -74,7 +74,7 @@ static int kbd_pending(void) | |||
| 74 | { | 74 | { |
| 75 | u8 pending; | 75 | u8 pending; |
| 76 | asm volatile("int $0x16; setnz %0" | 76 | asm volatile("int $0x16; setnz %0" |
| 77 | : "=rm" (pending) | 77 | : "=qm" (pending) |
| 78 | : "a" (0x0100)); | 78 | : "a" (0x0100)); |
| 79 | return pending; | 79 | return pending; |
| 80 | } | 80 | } |
diff --git a/arch/x86/include/asm/ds.h b/arch/x86/include/asm/ds.h index 72c5a190bf48..a95008457ea4 100644 --- a/arch/x86/include/asm/ds.h +++ b/arch/x86/include/asm/ds.h | |||
| @@ -23,12 +23,13 @@ | |||
| 23 | #ifndef _ASM_X86_DS_H | 23 | #ifndef _ASM_X86_DS_H |
| 24 | #define _ASM_X86_DS_H | 24 | #define _ASM_X86_DS_H |
| 25 | 25 | ||
| 26 | #ifdef CONFIG_X86_DS | ||
| 27 | 26 | ||
| 28 | #include <linux/types.h> | 27 | #include <linux/types.h> |
| 29 | #include <linux/init.h> | 28 | #include <linux/init.h> |
| 30 | 29 | ||
| 31 | 30 | ||
| 31 | #ifdef CONFIG_X86_DS | ||
| 32 | |||
| 32 | struct task_struct; | 33 | struct task_struct; |
| 33 | 34 | ||
| 34 | /* | 35 | /* |
| @@ -232,7 +233,8 @@ extern void ds_free(struct ds_context *context); | |||
| 232 | 233 | ||
| 233 | #else /* CONFIG_X86_DS */ | 234 | #else /* CONFIG_X86_DS */ |
| 234 | 235 | ||
| 235 | #define ds_init_intel(config) do {} while (0) | 236 | struct cpuinfo_x86; |
| 237 | static inline void __cpuinit ds_init_intel(struct cpuinfo_x86 *ignored) {} | ||
| 236 | 238 | ||
| 237 | #endif /* CONFIG_X86_DS */ | 239 | #endif /* CONFIG_X86_DS */ |
| 238 | #endif /* _ASM_X86_DS_H */ | 240 | #endif /* _ASM_X86_DS_H */ |
diff --git a/arch/x86/include/asm/pci_64.h b/arch/x86/include/asm/pci_64.h index 5b28995d664e..d02d936840a3 100644 --- a/arch/x86/include/asm/pci_64.h +++ b/arch/x86/include/asm/pci_64.h | |||
| @@ -34,8 +34,6 @@ extern void pci_iommu_alloc(void); | |||
| 34 | */ | 34 | */ |
| 35 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) | 35 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) |
| 36 | 36 | ||
| 37 | #if defined(CONFIG_GART_IOMMU) || defined(CONFIG_CALGARY_IOMMU) | ||
| 38 | |||
| 39 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ | 37 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ |
| 40 | dma_addr_t ADDR_NAME; | 38 | dma_addr_t ADDR_NAME; |
| 41 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ | 39 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ |
| @@ -49,18 +47,6 @@ extern void pci_iommu_alloc(void); | |||
| 49 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ | 47 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ |
| 50 | (((PTR)->LEN_NAME) = (VAL)) | 48 | (((PTR)->LEN_NAME) = (VAL)) |
| 51 | 49 | ||
| 52 | #else | ||
| 53 | /* No IOMMU */ | ||
| 54 | |||
| 55 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) | ||
| 56 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) | ||
| 57 | #define pci_unmap_addr(PTR, ADDR_NAME) (0) | ||
| 58 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) | ||
| 59 | #define pci_unmap_len(PTR, LEN_NAME) (0) | ||
| 60 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) | ||
| 61 | |||
| 62 | #endif | ||
| 63 | |||
| 64 | #endif /* __KERNEL__ */ | 50 | #endif /* __KERNEL__ */ |
| 65 | 51 | ||
| 66 | #endif /* _ASM_X86_PCI_64_H */ | 52 | #endif /* _ASM_X86_PCI_64_H */ |
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index d1531c8480b7..eefb0594b058 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
| @@ -271,8 +271,6 @@ extern int do_get_thread_area(struct task_struct *p, int idx, | |||
| 271 | extern int do_set_thread_area(struct task_struct *p, int idx, | 271 | extern int do_set_thread_area(struct task_struct *p, int idx, |
| 272 | struct user_desc __user *info, int can_allocate); | 272 | struct user_desc __user *info, int can_allocate); |
| 273 | 273 | ||
| 274 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 275 | |||
| 276 | #endif /* __KERNEL__ */ | 274 | #endif /* __KERNEL__ */ |
| 277 | 275 | ||
| 278 | #endif /* !__ASSEMBLY__ */ | 276 | #endif /* !__ASSEMBLY__ */ |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index e489ff9cb3e2..b62a7667828e 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
| @@ -41,7 +41,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o | |||
| 41 | obj-y += process.o | 41 | obj-y += process.o |
| 42 | obj-y += i387.o xsave.o | 42 | obj-y += i387.o xsave.o |
| 43 | obj-y += ptrace.o | 43 | obj-y += ptrace.o |
| 44 | obj-y += ds.o | 44 | obj-$(CONFIG_X86_DS) += ds.o |
| 45 | obj-$(CONFIG_X86_32) += tls.o | 45 | obj-$(CONFIG_X86_32) += tls.o |
| 46 | obj-$(CONFIG_IA32_EMULATION) += tls.o | 46 | obj-$(CONFIG_IA32_EMULATION) += tls.o |
| 47 | obj-y += step.o | 47 | obj-y += step.o |
diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c index 04a7f960bbc0..16f94879b525 100644 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic.c | |||
| @@ -1315,7 +1315,7 @@ void enable_x2apic(void) | |||
| 1315 | } | 1315 | } |
| 1316 | } | 1316 | } |
| 1317 | 1317 | ||
| 1318 | void enable_IR_x2apic(void) | 1318 | void __init enable_IR_x2apic(void) |
| 1319 | { | 1319 | { |
| 1320 | #ifdef CONFIG_INTR_REMAP | 1320 | #ifdef CONFIG_INTR_REMAP |
| 1321 | int ret; | 1321 | int ret; |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index d3dcd58b87cd..7f05f44b97e9 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
| @@ -115,9 +115,20 @@ static int query_current_values_with_pending_wait(struct powernow_k8_data *data) | |||
| 115 | u32 i = 0; | 115 | u32 i = 0; |
| 116 | 116 | ||
| 117 | if (cpu_family == CPU_HW_PSTATE) { | 117 | if (cpu_family == CPU_HW_PSTATE) { |
| 118 | rdmsr(MSR_PSTATE_STATUS, lo, hi); | 118 | if (data->currpstate == HW_PSTATE_INVALID) { |
| 119 | i = lo & HW_PSTATE_MASK; | 119 | /* read (initial) hw pstate if not yet set */ |
| 120 | data->currpstate = i; | 120 | rdmsr(MSR_PSTATE_STATUS, lo, hi); |
| 121 | i = lo & HW_PSTATE_MASK; | ||
| 122 | |||
| 123 | /* | ||
| 124 | * a workaround for family 11h erratum 311 might cause | ||
| 125 | * an "out-of-range Pstate if the core is in Pstate-0 | ||
| 126 | */ | ||
| 127 | if (i >= data->numps) | ||
| 128 | data->currpstate = HW_PSTATE_0; | ||
| 129 | else | ||
| 130 | data->currpstate = i; | ||
| 131 | } | ||
| 121 | return 0; | 132 | return 0; |
| 122 | } | 133 | } |
| 123 | do { | 134 | do { |
| @@ -1121,6 +1132,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
| 1121 | } | 1132 | } |
| 1122 | 1133 | ||
| 1123 | data->cpu = pol->cpu; | 1134 | data->cpu = pol->cpu; |
| 1135 | data->currpstate = HW_PSTATE_INVALID; | ||
| 1124 | 1136 | ||
| 1125 | if (powernow_k8_cpu_init_acpi(data)) { | 1137 | if (powernow_k8_cpu_init_acpi(data)) { |
| 1126 | /* | 1138 | /* |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h index ab48cfed4d96..65cfb5d7f77f 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h | |||
| @@ -5,6 +5,19 @@ | |||
| 5 | * http://www.gnu.org/licenses/gpl.html | 5 | * http://www.gnu.org/licenses/gpl.html |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | |||
| 9 | enum pstate { | ||
| 10 | HW_PSTATE_INVALID = 0xff, | ||
| 11 | HW_PSTATE_0 = 0, | ||
| 12 | HW_PSTATE_1 = 1, | ||
| 13 | HW_PSTATE_2 = 2, | ||
| 14 | HW_PSTATE_3 = 3, | ||
| 15 | HW_PSTATE_4 = 4, | ||
| 16 | HW_PSTATE_5 = 5, | ||
| 17 | HW_PSTATE_6 = 6, | ||
| 18 | HW_PSTATE_7 = 7, | ||
| 19 | }; | ||
| 20 | |||
| 8 | struct powernow_k8_data { | 21 | struct powernow_k8_data { |
| 9 | unsigned int cpu; | 22 | unsigned int cpu; |
| 10 | 23 | ||
| @@ -23,7 +36,9 @@ struct powernow_k8_data { | |||
| 23 | u32 exttype; /* extended interface = 1 */ | 36 | u32 exttype; /* extended interface = 1 */ |
| 24 | 37 | ||
| 25 | /* keep track of the current fid / vid or pstate */ | 38 | /* keep track of the current fid / vid or pstate */ |
| 26 | u32 currvid, currfid, currpstate; | 39 | u32 currvid; |
| 40 | u32 currfid; | ||
| 41 | enum pstate currpstate; | ||
| 27 | 42 | ||
| 28 | /* the powernow_table includes all frequency and vid/fid pairings: | 43 | /* the powernow_table includes all frequency and vid/fid pairings: |
| 29 | * fid are the lower 8 bits of the index, vid are the upper 8 bits. | 44 | * fid are the lower 8 bits of the index, vid are the upper 8 bits. |
diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index d1a121443bde..a2d1176c38ee 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c | |||
| @@ -21,8 +21,6 @@ | |||
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | #ifdef CONFIG_X86_DS | ||
| 25 | |||
| 26 | #include <asm/ds.h> | 24 | #include <asm/ds.h> |
| 27 | 25 | ||
| 28 | #include <linux/errno.h> | 26 | #include <linux/errno.h> |
| @@ -211,14 +209,15 @@ static DEFINE_PER_CPU(struct ds_context *, system_context); | |||
| 211 | static inline struct ds_context *ds_get_context(struct task_struct *task) | 209 | static inline struct ds_context *ds_get_context(struct task_struct *task) |
| 212 | { | 210 | { |
| 213 | struct ds_context *context; | 211 | struct ds_context *context; |
| 212 | unsigned long irq; | ||
| 214 | 213 | ||
| 215 | spin_lock(&ds_lock); | 214 | spin_lock_irqsave(&ds_lock, irq); |
| 216 | 215 | ||
| 217 | context = (task ? task->thread.ds_ctx : this_system_context); | 216 | context = (task ? task->thread.ds_ctx : this_system_context); |
| 218 | if (context) | 217 | if (context) |
| 219 | context->count++; | 218 | context->count++; |
| 220 | 219 | ||
| 221 | spin_unlock(&ds_lock); | 220 | spin_unlock_irqrestore(&ds_lock, irq); |
| 222 | 221 | ||
| 223 | return context; | 222 | return context; |
| 224 | } | 223 | } |
| @@ -226,55 +225,46 @@ static inline struct ds_context *ds_get_context(struct task_struct *task) | |||
| 226 | /* | 225 | /* |
| 227 | * Same as ds_get_context, but allocates the context and it's DS | 226 | * Same as ds_get_context, but allocates the context and it's DS |
| 228 | * structure, if necessary; returns NULL; if out of memory. | 227 | * structure, if necessary; returns NULL; if out of memory. |
| 229 | * | ||
| 230 | * pre: requires ds_lock to be held | ||
| 231 | */ | 228 | */ |
| 232 | static inline struct ds_context *ds_alloc_context(struct task_struct *task) | 229 | static inline struct ds_context *ds_alloc_context(struct task_struct *task) |
| 233 | { | 230 | { |
| 234 | struct ds_context **p_context = | 231 | struct ds_context **p_context = |
| 235 | (task ? &task->thread.ds_ctx : &this_system_context); | 232 | (task ? &task->thread.ds_ctx : &this_system_context); |
| 236 | struct ds_context *context = *p_context; | 233 | struct ds_context *context = *p_context; |
| 234 | unsigned long irq; | ||
| 237 | 235 | ||
| 238 | if (!context) { | 236 | if (!context) { |
| 239 | spin_unlock(&ds_lock); | ||
| 240 | |||
| 241 | context = kzalloc(sizeof(*context), GFP_KERNEL); | 237 | context = kzalloc(sizeof(*context), GFP_KERNEL); |
| 242 | 238 | if (!context) | |
| 243 | if (!context) { | ||
| 244 | spin_lock(&ds_lock); | ||
| 245 | return NULL; | 239 | return NULL; |
| 246 | } | ||
| 247 | 240 | ||
| 248 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); | 241 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); |
| 249 | if (!context->ds) { | 242 | if (!context->ds) { |
| 250 | kfree(context); | 243 | kfree(context); |
| 251 | spin_lock(&ds_lock); | ||
| 252 | return NULL; | 244 | return NULL; |
| 253 | } | 245 | } |
| 254 | 246 | ||
| 255 | spin_lock(&ds_lock); | 247 | spin_lock_irqsave(&ds_lock, irq); |
| 256 | /* | 248 | |
| 257 | * Check for race - another CPU could have allocated | ||
| 258 | * it meanwhile: | ||
| 259 | */ | ||
| 260 | if (*p_context) { | 249 | if (*p_context) { |
| 261 | kfree(context->ds); | 250 | kfree(context->ds); |
| 262 | kfree(context); | 251 | kfree(context); |
| 263 | return *p_context; | ||
| 264 | } | ||
| 265 | 252 | ||
| 266 | *p_context = context; | 253 | context = *p_context; |
| 254 | } else { | ||
| 255 | *p_context = context; | ||
| 267 | 256 | ||
| 268 | context->this = p_context; | 257 | context->this = p_context; |
| 269 | context->task = task; | 258 | context->task = task; |
| 270 | 259 | ||
| 271 | if (task) | 260 | if (task) |
| 272 | set_tsk_thread_flag(task, TIF_DS_AREA_MSR); | 261 | set_tsk_thread_flag(task, TIF_DS_AREA_MSR); |
| 273 | 262 | ||
| 274 | if (!task || (task == current)) | 263 | if (!task || (task == current)) |
| 275 | wrmsr(MSR_IA32_DS_AREA, (unsigned long)context->ds, 0); | 264 | wrmsrl(MSR_IA32_DS_AREA, |
| 276 | 265 | (unsigned long)context->ds); | |
| 277 | get_tracer(task); | 266 | } |
| 267 | spin_unlock_irqrestore(&ds_lock, irq); | ||
| 278 | } | 268 | } |
| 279 | 269 | ||
| 280 | context->count++; | 270 | context->count++; |
| @@ -288,10 +278,12 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) | |||
| 288 | */ | 278 | */ |
| 289 | static inline void ds_put_context(struct ds_context *context) | 279 | static inline void ds_put_context(struct ds_context *context) |
| 290 | { | 280 | { |
| 281 | unsigned long irq; | ||
| 282 | |||
| 291 | if (!context) | 283 | if (!context) |
| 292 | return; | 284 | return; |
| 293 | 285 | ||
| 294 | spin_lock(&ds_lock); | 286 | spin_lock_irqsave(&ds_lock, irq); |
| 295 | 287 | ||
| 296 | if (--context->count) | 288 | if (--context->count) |
| 297 | goto out; | 289 | goto out; |
| @@ -313,7 +305,7 @@ static inline void ds_put_context(struct ds_context *context) | |||
| 313 | kfree(context->ds); | 305 | kfree(context->ds); |
| 314 | kfree(context); | 306 | kfree(context); |
| 315 | out: | 307 | out: |
| 316 | spin_unlock(&ds_lock); | 308 | spin_unlock_irqrestore(&ds_lock, irq); |
| 317 | } | 309 | } |
| 318 | 310 | ||
| 319 | 311 | ||
| @@ -384,6 +376,7 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
| 384 | struct ds_context *context; | 376 | struct ds_context *context; |
| 385 | unsigned long buffer, adj; | 377 | unsigned long buffer, adj; |
| 386 | const unsigned long alignment = (1 << 3); | 378 | const unsigned long alignment = (1 << 3); |
| 379 | unsigned long irq; | ||
| 387 | int error = 0; | 380 | int error = 0; |
| 388 | 381 | ||
| 389 | if (!ds_cfg.sizeof_ds) | 382 | if (!ds_cfg.sizeof_ds) |
| @@ -398,26 +391,27 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
| 398 | return -EOPNOTSUPP; | 391 | return -EOPNOTSUPP; |
| 399 | 392 | ||
| 400 | 393 | ||
| 401 | spin_lock(&ds_lock); | ||
| 402 | |||
| 403 | error = -ENOMEM; | ||
| 404 | context = ds_alloc_context(task); | 394 | context = ds_alloc_context(task); |
| 405 | if (!context) | 395 | if (!context) |
| 406 | goto out_unlock; | 396 | return -ENOMEM; |
| 397 | |||
| 398 | spin_lock_irqsave(&ds_lock, irq); | ||
| 407 | 399 | ||
| 408 | error = -EPERM; | 400 | error = -EPERM; |
| 409 | if (!check_tracer(task)) | 401 | if (!check_tracer(task)) |
| 410 | goto out_unlock; | 402 | goto out_unlock; |
| 411 | 403 | ||
| 404 | get_tracer(task); | ||
| 405 | |||
| 412 | error = -EALREADY; | 406 | error = -EALREADY; |
| 413 | if (context->owner[qual] == current) | 407 | if (context->owner[qual] == current) |
| 414 | goto out_unlock; | 408 | goto out_put_tracer; |
| 415 | error = -EPERM; | 409 | error = -EPERM; |
| 416 | if (context->owner[qual] != NULL) | 410 | if (context->owner[qual] != NULL) |
| 417 | goto out_unlock; | 411 | goto out_put_tracer; |
| 418 | context->owner[qual] = current; | 412 | context->owner[qual] = current; |
| 419 | 413 | ||
| 420 | spin_unlock(&ds_lock); | 414 | spin_unlock_irqrestore(&ds_lock, irq); |
| 421 | 415 | ||
| 422 | 416 | ||
| 423 | error = -ENOMEM; | 417 | error = -ENOMEM; |
| @@ -465,10 +459,17 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
| 465 | out_release: | 459 | out_release: |
| 466 | context->owner[qual] = NULL; | 460 | context->owner[qual] = NULL; |
| 467 | ds_put_context(context); | 461 | ds_put_context(context); |
| 462 | put_tracer(task); | ||
| 463 | return error; | ||
| 464 | |||
| 465 | out_put_tracer: | ||
| 466 | spin_unlock_irqrestore(&ds_lock, irq); | ||
| 467 | ds_put_context(context); | ||
| 468 | put_tracer(task); | ||
| 468 | return error; | 469 | return error; |
| 469 | 470 | ||
| 470 | out_unlock: | 471 | out_unlock: |
| 471 | spin_unlock(&ds_lock); | 472 | spin_unlock_irqrestore(&ds_lock, irq); |
| 472 | ds_put_context(context); | 473 | ds_put_context(context); |
| 473 | return error; | 474 | return error; |
| 474 | } | 475 | } |
| @@ -818,13 +819,21 @@ static const struct ds_configuration ds_cfg_var = { | |||
| 818 | .sizeof_ds = sizeof(long) * 12, | 819 | .sizeof_ds = sizeof(long) * 12, |
| 819 | .sizeof_field = sizeof(long), | 820 | .sizeof_field = sizeof(long), |
| 820 | .sizeof_rec[ds_bts] = sizeof(long) * 3, | 821 | .sizeof_rec[ds_bts] = sizeof(long) * 3, |
| 822 | #ifdef __i386__ | ||
| 821 | .sizeof_rec[ds_pebs] = sizeof(long) * 10 | 823 | .sizeof_rec[ds_pebs] = sizeof(long) * 10 |
| 824 | #else | ||
| 825 | .sizeof_rec[ds_pebs] = sizeof(long) * 18 | ||
| 826 | #endif | ||
| 822 | }; | 827 | }; |
| 823 | static const struct ds_configuration ds_cfg_64 = { | 828 | static const struct ds_configuration ds_cfg_64 = { |
| 824 | .sizeof_ds = 8 * 12, | 829 | .sizeof_ds = 8 * 12, |
| 825 | .sizeof_field = 8, | 830 | .sizeof_field = 8, |
| 826 | .sizeof_rec[ds_bts] = 8 * 3, | 831 | .sizeof_rec[ds_bts] = 8 * 3, |
| 832 | #ifdef __i386__ | ||
| 827 | .sizeof_rec[ds_pebs] = 8 * 10 | 833 | .sizeof_rec[ds_pebs] = 8 * 10 |
| 834 | #else | ||
| 835 | .sizeof_rec[ds_pebs] = 8 * 18 | ||
| 836 | #endif | ||
| 828 | }; | 837 | }; |
| 829 | 838 | ||
| 830 | static inline void | 839 | static inline void |
| @@ -878,4 +887,3 @@ void ds_free(struct ds_context *context) | |||
| 878 | while (leftovers--) | 887 | while (leftovers--) |
| 879 | ds_put_context(context); | 888 | ds_put_context(context); |
| 880 | } | 889 | } |
| 881 | #endif /* CONFIG_X86_DS */ | ||
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index 1f20608d4ca8..b0f61f0dcd0a 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
| @@ -58,7 +58,7 @@ void __cpuinit mxcsr_feature_mask_init(void) | |||
| 58 | stts(); | 58 | stts(); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | void __init init_thread_xstate(void) | 61 | void __cpuinit init_thread_xstate(void) |
| 62 | { | 62 | { |
| 63 | if (!HAVE_HWFP) { | 63 | if (!HAVE_HWFP) { |
| 64 | xstate_size = sizeof(struct i387_soft_struct); | 64 | xstate_size = sizeof(struct i387_soft_struct); |
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index c9513e1ff28d..1fec0f9b1508 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c | |||
| @@ -3608,27 +3608,7 @@ int __init io_apic_get_redir_entries (int ioapic) | |||
| 3608 | 3608 | ||
| 3609 | int __init probe_nr_irqs(void) | 3609 | int __init probe_nr_irqs(void) |
| 3610 | { | 3610 | { |
| 3611 | int idx; | 3611 | return NR_IRQS; |
| 3612 | int nr = 0; | ||
| 3613 | #ifndef CONFIG_XEN | ||
| 3614 | int nr_min = 32; | ||
| 3615 | #else | ||
| 3616 | int nr_min = NR_IRQS; | ||
| 3617 | #endif | ||
| 3618 | |||
| 3619 | for (idx = 0; idx < nr_ioapics; idx++) | ||
| 3620 | nr += io_apic_get_redir_entries(idx) + 1; | ||
| 3621 | |||
| 3622 | /* double it for hotplug and msi and nmi */ | ||
| 3623 | nr <<= 1; | ||
| 3624 | |||
| 3625 | /* something wrong ? */ | ||
| 3626 | if (nr < nr_min) | ||
| 3627 | nr = nr_min; | ||
| 3628 | if (WARN_ON(nr > NR_IRQS)) | ||
| 3629 | nr = NR_IRQS; | ||
| 3630 | |||
| 3631 | return nr; | ||
| 3632 | } | 3612 | } |
| 3633 | 3613 | ||
| 3634 | /* -------------------------------------------------------------------------- | 3614 | /* -------------------------------------------------------------------------- |
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 1c9cc431ea4f..e169ae9b6a62 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c | |||
| @@ -128,7 +128,7 @@ static int kvm_register_clock(char *txt) | |||
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | #ifdef CONFIG_X86_LOCAL_APIC | 130 | #ifdef CONFIG_X86_LOCAL_APIC |
| 131 | static void __devinit kvm_setup_secondary_clock(void) | 131 | static void __cpuinit kvm_setup_secondary_clock(void) |
| 132 | { | 132 | { |
| 133 | /* | 133 | /* |
| 134 | * Now that the first cpu already had this clocksource initialized, | 134 | * Now that the first cpu already had this clocksource initialized, |
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index e1e731d78f38..d28bbdc35e4e 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c | |||
| @@ -1567,7 +1567,7 @@ static int __init calgary_parse_options(char *p) | |||
| 1567 | ++p; | 1567 | ++p; |
| 1568 | if (*p == '\0') | 1568 | if (*p == '\0') |
| 1569 | break; | 1569 | break; |
| 1570 | bridge = simple_strtol(p, &endp, 0); | 1570 | bridge = simple_strtoul(p, &endp, 0); |
| 1571 | if (p == endp) | 1571 | if (p == endp) |
| 1572 | break; | 1572 | break; |
| 1573 | 1573 | ||
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index b13acb75e822..15c3e6999182 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c | |||
| @@ -310,7 +310,7 @@ static void __init setup_xstate_init(void) | |||
| 310 | /* | 310 | /* |
| 311 | * Enable and initialize the xsave feature. | 311 | * Enable and initialize the xsave feature. |
| 312 | */ | 312 | */ |
| 313 | void __init xsave_cntxt_init(void) | 313 | void __ref xsave_cntxt_init(void) |
| 314 | { | 314 | { |
| 315 | unsigned int eax, ebx, ecx, edx; | 315 | unsigned int eax, ebx, ecx, edx; |
| 316 | 316 | ||
diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c index 3f1b81a83e2e..716d26f0e5d4 100644 --- a/arch/x86/oprofile/op_model_ppro.c +++ b/arch/x86/oprofile/op_model_ppro.c | |||
| @@ -69,7 +69,7 @@ static void ppro_setup_ctrs(struct op_msrs const * const msrs) | |||
| 69 | int i; | 69 | int i; |
| 70 | 70 | ||
| 71 | if (!reset_value) { | 71 | if (!reset_value) { |
| 72 | reset_value = kmalloc(sizeof(unsigned) * num_counters, | 72 | reset_value = kmalloc(sizeof(reset_value[0]) * num_counters, |
| 73 | GFP_ATOMIC); | 73 | GFP_ATOMIC); |
| 74 | if (!reset_value) | 74 | if (!reset_value) |
| 75 | return; | 75 | return; |
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c index 3c27a809393b..2051dc96b8e9 100644 --- a/arch/x86/pci/fixup.c +++ b/arch/x86/pci/fixup.c | |||
| @@ -496,21 +496,24 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015, | |||
| 496 | pci_siemens_interrupt_controller); | 496 | pci_siemens_interrupt_controller); |
| 497 | 497 | ||
| 498 | /* | 498 | /* |
| 499 | * Regular PCI devices have 256 bytes, but AMD Family 10h Opteron ext config | 499 | * Regular PCI devices have 256 bytes, but AMD Family 10h/11h CPUs have |
| 500 | * have 4096 bytes. Even if the device is capable, that doesn't mean we can | 500 | * 4096 bytes configuration space for each function of their processor |
| 501 | * access it. Maybe we don't have a way to generate extended config space | 501 | * configuration space. |
| 502 | * accesses. So check it | ||
| 503 | */ | 502 | */ |
| 504 | static void fam10h_pci_cfg_space_size(struct pci_dev *dev) | 503 | static void amd_cpu_pci_cfg_space_size(struct pci_dev *dev) |
| 505 | { | 504 | { |
| 506 | dev->cfg_size = pci_cfg_space_size_ext(dev); | 505 | dev->cfg_size = pci_cfg_space_size_ext(dev); |
| 507 | } | 506 | } |
| 508 | 507 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, amd_cpu_pci_cfg_space_size); | |
| 509 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, fam10h_pci_cfg_space_size); | 508 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, amd_cpu_pci_cfg_space_size); |
| 510 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, fam10h_pci_cfg_space_size); | 509 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, amd_cpu_pci_cfg_space_size); |
| 511 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, fam10h_pci_cfg_space_size); | 510 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, amd_cpu_pci_cfg_space_size); |
| 512 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, fam10h_pci_cfg_space_size); | 511 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, amd_cpu_pci_cfg_space_size); |
| 513 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, fam10h_pci_cfg_space_size); | 512 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1300, amd_cpu_pci_cfg_space_size); |
| 513 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1301, amd_cpu_pci_cfg_space_size); | ||
| 514 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1302, amd_cpu_pci_cfg_space_size); | ||
| 515 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1303, amd_cpu_pci_cfg_space_size); | ||
| 516 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1304, amd_cpu_pci_cfg_space_size); | ||
| 514 | 517 | ||
| 515 | /* | 518 | /* |
| 516 | * SB600: Disable BAR1 on device 14.0 to avoid HPET resources from | 519 | * SB600: Disable BAR1 on device 14.0 to avoid HPET resources from |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 688936044dc9..636ef4caa52d 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -661,12 +661,11 @@ void xen_set_pgd(pgd_t *ptr, pgd_t val) | |||
| 661 | * For 64-bit, we must skip the Xen hole in the middle of the address | 661 | * For 64-bit, we must skip the Xen hole in the middle of the address |
| 662 | * space, just after the big x86-64 virtual hole. | 662 | * space, just after the big x86-64 virtual hole. |
| 663 | */ | 663 | */ |
| 664 | static int xen_pgd_walk(struct mm_struct *mm, | 664 | static int __xen_pgd_walk(struct mm_struct *mm, pgd_t *pgd, |
| 665 | int (*func)(struct mm_struct *mm, struct page *, | 665 | int (*func)(struct mm_struct *mm, struct page *, |
| 666 | enum pt_level), | 666 | enum pt_level), |
| 667 | unsigned long limit) | 667 | unsigned long limit) |
| 668 | { | 668 | { |
| 669 | pgd_t *pgd = mm->pgd; | ||
| 670 | int flush = 0; | 669 | int flush = 0; |
| 671 | unsigned hole_low, hole_high; | 670 | unsigned hole_low, hole_high; |
| 672 | unsigned pgdidx_limit, pudidx_limit, pmdidx_limit; | 671 | unsigned pgdidx_limit, pudidx_limit, pmdidx_limit; |
| @@ -753,6 +752,14 @@ out: | |||
| 753 | return flush; | 752 | return flush; |
| 754 | } | 753 | } |
| 755 | 754 | ||
| 755 | static int xen_pgd_walk(struct mm_struct *mm, | ||
| 756 | int (*func)(struct mm_struct *mm, struct page *, | ||
| 757 | enum pt_level), | ||
| 758 | unsigned long limit) | ||
| 759 | { | ||
| 760 | return __xen_pgd_walk(mm, mm->pgd, func, limit); | ||
| 761 | } | ||
| 762 | |||
| 756 | /* If we're using split pte locks, then take the page's lock and | 763 | /* If we're using split pte locks, then take the page's lock and |
| 757 | return a pointer to it. Otherwise return NULL. */ | 764 | return a pointer to it. Otherwise return NULL. */ |
| 758 | static spinlock_t *xen_pte_lock(struct page *page, struct mm_struct *mm) | 765 | static spinlock_t *xen_pte_lock(struct page *page, struct mm_struct *mm) |
| @@ -854,7 +861,7 @@ static void __xen_pgd_pin(struct mm_struct *mm, pgd_t *pgd) | |||
| 854 | 861 | ||
| 855 | xen_mc_batch(); | 862 | xen_mc_batch(); |
| 856 | 863 | ||
| 857 | if (xen_pgd_walk(mm, xen_pin_page, USER_LIMIT)) { | 864 | if (__xen_pgd_walk(mm, pgd, xen_pin_page, USER_LIMIT)) { |
| 858 | /* re-enable interrupts for flushing */ | 865 | /* re-enable interrupts for flushing */ |
| 859 | xen_mc_issue(0); | 866 | xen_mc_issue(0); |
| 860 | 867 | ||
| @@ -998,7 +1005,7 @@ static void __xen_pgd_unpin(struct mm_struct *mm, pgd_t *pgd) | |||
| 998 | PT_PMD); | 1005 | PT_PMD); |
| 999 | #endif | 1006 | #endif |
| 1000 | 1007 | ||
| 1001 | xen_pgd_walk(mm, xen_unpin_page, USER_LIMIT); | 1008 | __xen_pgd_walk(mm, pgd, xen_unpin_page, USER_LIMIT); |
| 1002 | 1009 | ||
| 1003 | xen_mc_issue(0); | 1010 | xen_mc_issue(0); |
| 1004 | } | 1011 | } |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index d77da613b1d2..acd9b6705e02 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
| @@ -362,7 +362,7 @@ static void xen_cpu_die(unsigned int cpu) | |||
| 362 | alternatives_smp_switch(0); | 362 | alternatives_smp_switch(0); |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | static void xen_play_dead(void) | 365 | static void __cpuinit xen_play_dead(void) /* used only with CPU_HOTPLUG */ |
| 366 | { | 366 | { |
| 367 | play_dead_common(); | 367 | play_dead_common(); |
| 368 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); | 368 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); |
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index d7422dc2a55c..9e1afae8461f 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h | |||
| @@ -49,7 +49,7 @@ bool xen_vcpu_stolen(int vcpu); | |||
| 49 | 49 | ||
| 50 | void xen_mark_init_mm_pinned(void); | 50 | void xen_mark_init_mm_pinned(void); |
| 51 | 51 | ||
| 52 | void __init xen_setup_vcpu_info_placement(void); | 52 | void xen_setup_vcpu_info_placement(void); |
| 53 | 53 | ||
| 54 | #ifdef CONFIG_SMP | 54 | #ifdef CONFIG_SMP |
| 55 | void xen_smp_init(void); | 55 | void xen_smp_init(void); |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 1423b0c0cd2e..a0a178dd189c 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
| @@ -174,6 +174,15 @@ static int acpi_battery_get_property(struct power_supply *psy, | |||
| 174 | break; | 174 | break; |
| 175 | case POWER_SUPPLY_PROP_CURRENT_NOW: | 175 | case POWER_SUPPLY_PROP_CURRENT_NOW: |
| 176 | val->intval = battery->current_now * 1000; | 176 | val->intval = battery->current_now * 1000; |
| 177 | /* if power units are mW, convert to mA by | ||
| 178 | dividing by current voltage (mV/1000) */ | ||
| 179 | if (!battery->power_unit) { | ||
| 180 | if (battery->voltage_now) { | ||
| 181 | val->intval /= battery->voltage_now; | ||
| 182 | val->intval *= 1000; | ||
| 183 | } else | ||
| 184 | val->intval = -1; | ||
| 185 | } | ||
| 177 | break; | 186 | break; |
| 178 | case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: | 187 | case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: |
| 179 | case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: | 188 | case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: |
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index ea92bac42c53..09c69806c1fc 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c | |||
| @@ -176,16 +176,6 @@ static int __init dmi_enable_osi_linux(const struct dmi_system_id *d) | |||
| 176 | acpi_dmi_osi_linux(1, d); /* enable */ | 176 | acpi_dmi_osi_linux(1, d); /* enable */ |
| 177 | return 0; | 177 | return 0; |
| 178 | } | 178 | } |
| 179 | static int __init dmi_disable_osi_linux(const struct dmi_system_id *d) | ||
| 180 | { | ||
| 181 | acpi_dmi_osi_linux(0, d); /* disable */ | ||
| 182 | return 0; | ||
| 183 | } | ||
| 184 | static int __init dmi_unknown_osi_linux(const struct dmi_system_id *d) | ||
| 185 | { | ||
| 186 | acpi_dmi_osi_linux(-1, d); /* unknown */ | ||
| 187 | return 0; | ||
| 188 | } | ||
| 189 | static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) | 179 | static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) |
| 190 | { | 180 | { |
| 191 | printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident); | 181 | printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident); |
| @@ -193,295 +183,21 @@ static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) | |||
| 193 | return 0; | 183 | return 0; |
| 194 | } | 184 | } |
| 195 | 185 | ||
| 196 | /* | ||
| 197 | * Most BIOS that invoke OSI(Linux) do nothing with it. | ||
| 198 | * But some cause Linux to break. | ||
| 199 | * Only a couple use it to make Linux run better. | ||
| 200 | * | ||
| 201 | * Thus, Linux should continue to disable OSI(Linux) by default, | ||
| 202 | * should continue to discourage BIOS writers from using it, and | ||
| 203 | * should whitelist the few existing systems that require it. | ||
| 204 | * | ||
| 205 | * If it appears clear a vendor isn't using OSI(Linux) | ||
| 206 | * for anything constructive, blacklist them by name to disable | ||
| 207 | * unnecessary dmesg warnings on all of their products. | ||
| 208 | */ | ||
| 209 | |||
| 210 | static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | 186 | static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { |
| 211 | /* | ||
| 212 | * Disable OSI(Linux) warnings on all "Acer, inc." | ||
| 213 | * | ||
| 214 | * _OSI(Linux) disables the latest Windows BIOS code: | ||
| 215 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"), | ||
| 216 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"), | ||
| 217 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), | ||
| 218 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"), | ||
| 219 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"), | ||
| 220 | * _OSI(Linux) effect unknown: | ||
| 221 | * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"), | ||
| 222 | */ | ||
| 223 | /* | ||
| 224 | * note that dmi_check_system() uses strstr() | ||
| 225 | * to match sub-strings rather than !strcmp(), | ||
| 226 | * so "Acer" below matches "Acer, inc." above. | ||
| 227 | */ | ||
| 228 | /* | ||
| 229 | * Disable OSI(Linux) warnings on all "Acer" | ||
| 230 | * | ||
| 231 | * _OSI(Linux) effect unknown: | ||
| 232 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), | ||
| 233 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"), | ||
| 234 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"), | ||
| 235 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"), | ||
| 236 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"), | ||
| 237 | * | ||
| 238 | * _OSI(Linux) is a NOP: | ||
| 239 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"), | ||
| 240 | * DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"), | ||
| 241 | */ | ||
| 242 | { | ||
| 243 | .callback = dmi_disable_osi_linux, | ||
| 244 | .ident = "Acer", | ||
| 245 | .matches = { | ||
| 246 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 247 | }, | ||
| 248 | }, | ||
| 249 | /* | ||
| 250 | * Disable OSI(Linux) warnings on all "Apple Computer, Inc." | ||
| 251 | * Disable OSI(Linux) warnings on all "Apple Inc." | ||
| 252 | * | ||
| 253 | * _OSI(Linux) confirmed to be a NOP: | ||
| 254 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), | ||
| 255 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"), | ||
| 256 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"), | ||
| 257 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"), | ||
| 258 | * _OSI(Linux) effect unknown: | ||
| 259 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"), | ||
| 260 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"), | ||
| 261 | */ | ||
| 262 | { | ||
| 263 | .callback = dmi_disable_osi_linux, | ||
| 264 | .ident = "Apple", | ||
| 265 | .matches = { | ||
| 266 | DMI_MATCH(DMI_SYS_VENDOR, "Apple"), | ||
| 267 | }, | ||
| 268 | }, | ||
| 269 | /* | ||
| 270 | * Disable OSI(Linux) warnings on all "BenQ" | ||
| 271 | * | ||
| 272 | * _OSI(Linux) confirmed to be a NOP: | ||
| 273 | * DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"), | ||
| 274 | */ | ||
| 275 | { | ||
| 276 | .callback = dmi_disable_osi_linux, | ||
| 277 | .ident = "BenQ", | ||
| 278 | .matches = { | ||
| 279 | DMI_MATCH(DMI_SYS_VENDOR, "BenQ"), | ||
| 280 | }, | ||
| 281 | }, | ||
| 282 | /* | ||
| 283 | * Disable OSI(Linux) warnings on all "Clevo Co." | ||
| 284 | * | ||
| 285 | * _OSI(Linux) confirmed to be a NOP: | ||
| 286 | * DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"), | ||
| 287 | */ | ||
| 288 | { | ||
| 289 | .callback = dmi_disable_osi_linux, | ||
| 290 | .ident = "Clevo", | ||
| 291 | .matches = { | ||
| 292 | DMI_MATCH(DMI_SYS_VENDOR, "Clevo Co."), | ||
| 293 | }, | ||
| 294 | }, | ||
| 295 | /* | ||
| 296 | * Disable OSI(Linux) warnings on all "COMPAL" | ||
| 297 | * | ||
| 298 | * _OSI(Linux) confirmed to be a NOP: | ||
| 299 | * DMI_MATCH(DMI_BOARD_NAME, "HEL8X"), | ||
| 300 | * _OSI(Linux) unknown effect: | ||
| 301 | * DMI_MATCH(DMI_BOARD_NAME, "IFL91"), | ||
| 302 | */ | ||
| 303 | { | ||
| 304 | .callback = dmi_disable_osi_linux, | ||
| 305 | .ident = "Compal", | ||
| 306 | .matches = { | ||
| 307 | DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"), | ||
| 308 | }, | ||
| 309 | }, | ||
| 310 | { /* OSI(Linux) touches USB, unknown side-effect */ | ||
| 311 | .callback = dmi_disable_osi_linux, | ||
| 312 | .ident = "Dell Dimension 5150", | ||
| 313 | .matches = { | ||
| 314 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 315 | DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM051"), | ||
| 316 | }, | ||
| 317 | }, | ||
| 318 | { /* OSI(Linux) is a NOP */ | ||
| 319 | .callback = dmi_disable_osi_linux, | ||
| 320 | .ident = "Dell i1501", | ||
| 321 | .matches = { | ||
| 322 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 323 | DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1501"), | ||
| 324 | }, | ||
| 325 | }, | ||
| 326 | { /* OSI(Linux) effect unknown */ | ||
| 327 | .callback = dmi_unknown_osi_linux, | ||
| 328 | .ident = "Dell Latitude D830", | ||
| 329 | .matches = { | ||
| 330 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 331 | DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D830"), | ||
| 332 | }, | ||
| 333 | }, | ||
| 334 | { /* OSI(Linux) effect unknown */ | ||
| 335 | .callback = dmi_unknown_osi_linux, | ||
| 336 | .ident = "Dell OptiPlex GX620", | ||
| 337 | .matches = { | ||
| 338 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 339 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX620"), | ||
| 340 | }, | ||
| 341 | }, | ||
| 342 | { /* OSI(Linux) causes some USB initialization to not run */ | ||
| 343 | .callback = dmi_unknown_osi_linux, | ||
| 344 | .ident = "Dell OptiPlex 755", | ||
| 345 | .matches = { | ||
| 346 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 347 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 755"), | ||
| 348 | }, | ||
| 349 | }, | ||
| 350 | { /* OSI(Linux) effect unknown */ | ||
| 351 | .callback = dmi_unknown_osi_linux, | ||
| 352 | .ident = "Dell PE 1900", | ||
| 353 | .matches = { | ||
| 354 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 355 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1900"), | ||
| 356 | }, | ||
| 357 | }, | ||
| 358 | { /* OSI(Linux) is a NOP */ | ||
| 359 | .callback = dmi_unknown_osi_linux, | ||
| 360 | .ident = "Dell PE 1950", | ||
| 361 | .matches = { | ||
| 362 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 363 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1950"), | ||
| 364 | }, | ||
| 365 | }, | ||
| 366 | { /* OSI(Linux) is a NOP */ | ||
| 367 | .callback = dmi_disable_osi_linux, | ||
| 368 | .ident = "Dell PE R200", | ||
| 369 | .matches = { | ||
| 370 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 371 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R200"), | ||
| 372 | }, | ||
| 373 | }, | ||
| 374 | { /* OSI(Linux) touches USB */ | ||
| 375 | .callback = dmi_disable_osi_linux, | ||
| 376 | .ident = "Dell PR 390", | ||
| 377 | .matches = { | ||
| 378 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 379 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 390"), | ||
| 380 | }, | ||
| 381 | }, | ||
| 382 | { /* OSI(Linux) touches USB */ | ||
| 383 | .callback = dmi_unknown_osi_linux, | ||
| 384 | .ident = "Dell PR 390", | ||
| 385 | .matches = { | ||
| 386 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 387 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 690"), | ||
| 388 | }, | ||
| 389 | }, | ||
| 390 | { /* OSI(Linux) unknown - ASL looks benign, but may effect dock/SMM */ | ||
| 391 | .callback = dmi_unknown_osi_linux, | ||
| 392 | .ident = "Dell PR M4300", | ||
| 393 | .matches = { | ||
| 394 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 395 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision M4300"), | ||
| 396 | }, | ||
| 397 | }, | ||
| 398 | { /* OSI(Linux) is a NOP */ | ||
| 399 | .callback = dmi_disable_osi_linux, | ||
| 400 | .ident = "Dell Vostro 1000", | ||
| 401 | .matches = { | ||
| 402 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 403 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1000"), | ||
| 404 | }, | ||
| 405 | }, | ||
| 406 | { /* OSI(Linux) effect unknown */ | ||
| 407 | .callback = dmi_unknown_osi_linux, | ||
| 408 | .ident = "Dell PE SC440", | ||
| 409 | .matches = { | ||
| 410 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 411 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge SC440"), | ||
| 412 | }, | ||
| 413 | }, | ||
| 414 | { /* OSI(Linux) effect unknown */ | ||
| 415 | .callback = dmi_unknown_osi_linux, | ||
| 416 | .ident = "Dialogue Flybook V5", | ||
| 417 | .matches = { | ||
| 418 | DMI_MATCH(DMI_SYS_VENDOR, "Dialogue Technology Corporation"), | ||
| 419 | DMI_MATCH(DMI_PRODUCT_NAME, "Flybook V5"), | ||
| 420 | }, | ||
| 421 | }, | ||
| 422 | /* | ||
| 423 | * Disable OSI(Linux) warnings on all "FUJITSU SIEMENS" | ||
| 424 | * | ||
| 425 | * _OSI(Linux) disables latest Windows BIOS code: | ||
| 426 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"), | ||
| 427 | * _OSI(Linux) confirmed to be a NOP: | ||
| 428 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"), | ||
| 429 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"), | ||
| 430 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"), | ||
| 431 | * DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), | ||
| 432 | * _OSI(Linux) unknown effect: | ||
| 433 | * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"), | ||
| 434 | * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"), | ||
| 435 | */ | ||
| 436 | { | ||
| 437 | .callback = dmi_disable_osi_linux, | ||
| 438 | .ident = "Fujitsu Siemens", | ||
| 439 | .matches = { | ||
| 440 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
| 441 | }, | ||
| 442 | }, | ||
| 443 | { | 187 | { |
| 444 | .callback = dmi_disable_osi_vista, | 188 | .callback = dmi_disable_osi_vista, |
| 445 | .ident = "Fujitsu Siemens", | 189 | .ident = "Fujitsu Siemens", |
| 446 | .matches = { | 190 | .matches = { |
| 447 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 191 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
| 448 | DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), | 192 | DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), |
| 449 | }, | 193 | }, |
| 450 | }, | 194 | }, |
| 195 | |||
| 451 | /* | 196 | /* |
| 452 | * Disable OSI(Linux) warnings on all "Hewlett-Packard" | 197 | * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. |
| 453 | * | 198 | * Linux ignores it, except for the machines enumerated below. |
| 454 | * _OSI(Linux) confirmed to be a NOP: | ||
| 455 | * .ident = "HP Pavilion tx 1000" | ||
| 456 | * DMI_MATCH(DMI_BOARD_NAME, "30BF"), | ||
| 457 | * .ident = "HP Pavilion dv2000" | ||
| 458 | * DMI_MATCH(DMI_BOARD_NAME, "30B5"), | ||
| 459 | * .ident = "HP Pavilion dv5000", | ||
| 460 | * DMI_MATCH(DMI_BOARD_NAME, "30A7"), | ||
| 461 | * .ident = "HP Pavilion dv6300 30BC", | ||
| 462 | * DMI_MATCH(DMI_BOARD_NAME, "30BC"), | ||
| 463 | * .ident = "HP Pavilion dv6000", | ||
| 464 | * DMI_MATCH(DMI_BOARD_NAME, "30B7"), | ||
| 465 | * DMI_MATCH(DMI_BOARD_NAME, "30B8"), | ||
| 466 | * .ident = "HP Pavilion dv9000", | ||
| 467 | * DMI_MATCH(DMI_BOARD_NAME, "30B9"), | ||
| 468 | * .ident = "HP Pavilion dv9500", | ||
| 469 | * DMI_MATCH(DMI_BOARD_NAME, "30CB"), | ||
| 470 | * .ident = "HP/Compaq Presario C500", | ||
| 471 | * DMI_MATCH(DMI_BOARD_NAME, "30C6"), | ||
| 472 | * .ident = "HP/Compaq Presario F500", | ||
| 473 | * DMI_MATCH(DMI_BOARD_NAME, "30D3"), | ||
| 474 | * _OSI(Linux) unknown effect: | ||
| 475 | * .ident = "HP Pavilion dv6500", | ||
| 476 | * DMI_MATCH(DMI_BOARD_NAME, "30D0"), | ||
| 477 | */ | 199 | */ |
| 478 | { | 200 | |
| 479 | .callback = dmi_disable_osi_linux, | ||
| 480 | .ident = "Hewlett-Packard", | ||
| 481 | .matches = { | ||
| 482 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 483 | }, | ||
| 484 | }, | ||
| 485 | /* | 201 | /* |
| 486 | * Lenovo has a mix of systems OSI(Linux) situations | 202 | * Lenovo has a mix of systems OSI(Linux) situations |
| 487 | * and thus we can not wildcard the vendor. | 203 | * and thus we can not wildcard the vendor. |
| @@ -519,113 +235,6 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | |||
| 519 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"), | 235 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"), |
| 520 | }, | 236 | }, |
| 521 | }, | 237 | }, |
| 522 | { | ||
| 523 | .callback = dmi_disable_osi_linux, | ||
| 524 | .ident = "Lenovo 3000 V100", | ||
| 525 | .matches = { | ||
| 526 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 527 | DMI_MATCH(DMI_PRODUCT_VERSION, "LENOVO3000 V100"), | ||
| 528 | }, | ||
| 529 | }, | ||
| 530 | { | ||
| 531 | .callback = dmi_disable_osi_linux, | ||
| 532 | .ident = "Lenovo 3000 N100", | ||
| 533 | .matches = { | ||
| 534 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 535 | DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"), | ||
| 536 | }, | ||
| 537 | }, | ||
| 538 | /* | ||
| 539 | * Disable OSI(Linux) warnings on all "LG Electronics" | ||
| 540 | * | ||
| 541 | * _OSI(Linux) confirmed to be a NOP: | ||
| 542 | * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"), | ||
| 543 | * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"), | ||
| 544 | * | ||
| 545 | * unknown: | ||
| 546 | * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"), | ||
| 547 | * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"), | ||
| 548 | */ | ||
| 549 | { | ||
| 550 | .callback = dmi_disable_osi_linux, | ||
| 551 | .ident = "LG", | ||
| 552 | .matches = { | ||
| 553 | DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), | ||
| 554 | }, | ||
| 555 | }, | ||
| 556 | /* NEC - OSI(Linux) effect unknown */ | ||
| 557 | { | ||
| 558 | .callback = dmi_unknown_osi_linux, | ||
| 559 | .ident = "NEC VERSA M360", | ||
| 560 | .matches = { | ||
| 561 | DMI_MATCH(DMI_SYS_VENDOR, "NEC Computers SAS"), | ||
| 562 | DMI_MATCH(DMI_PRODUCT_NAME, "NEC VERSA M360"), | ||
| 563 | }, | ||
| 564 | }, | ||
| 565 | /* Panasonic */ | ||
| 566 | { | ||
| 567 | .callback = dmi_unknown_osi_linux, | ||
| 568 | .ident = "Panasonic", | ||
| 569 | .matches = { | ||
| 570 | DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), | ||
| 571 | /* Toughbook CF-52 */ | ||
| 572 | DMI_MATCH(DMI_PRODUCT_NAME, "CF-52CCABVBG"), | ||
| 573 | }, | ||
| 574 | }, | ||
| 575 | /* | ||
| 576 | * Disable OSI(Linux) warnings on all "Samsung Electronics" | ||
| 577 | * | ||
| 578 | * OSI(Linux) disables PNP0C32 and other BIOS code for Windows: | ||
| 579 | * DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"), | ||
| 580 | * DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"), | ||
| 581 | */ | ||
| 582 | { | ||
| 583 | .callback = dmi_disable_osi_linux, | ||
| 584 | .ident = "Samsung", | ||
| 585 | .matches = { | ||
| 586 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
| 587 | }, | ||
| 588 | }, | ||
| 589 | /* | ||
| 590 | * Disable OSI(Linux) warnings on all "Sony Corporation" | ||
| 591 | * | ||
| 592 | * _OSI(Linux) is a NOP: | ||
| 593 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NR11S_S"), | ||
| 594 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"), | ||
| 595 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"), | ||
| 596 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"), | ||
| 597 | * _OSI(Linux) unknown effect: | ||
| 598 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"), | ||
| 599 | */ | ||
| 600 | { | ||
| 601 | .callback = dmi_disable_osi_linux, | ||
| 602 | .ident = "Sony", | ||
| 603 | .matches = { | ||
| 604 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
| 605 | }, | ||
| 606 | }, | ||
| 607 | /* | ||
| 608 | * Disable OSI(Linux) warnings on all "TOSHIBA" | ||
| 609 | * | ||
| 610 | * _OSI(Linux) breaks sound (bugzilla 7787): | ||
| 611 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"), | ||
| 612 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"), | ||
| 613 | * _OSI(Linux) is a NOP: | ||
| 614 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"), | ||
| 615 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"), | ||
| 616 | * _OSI(Linux) unknown effect: | ||
| 617 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"), | ||
| 618 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"), | ||
| 619 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"), | ||
| 620 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"), | ||
| 621 | */ | ||
| 622 | { | ||
| 623 | .callback = dmi_disable_osi_linux, | ||
| 624 | .ident = "Toshiba", | ||
| 625 | .matches = { | ||
| 626 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
| 627 | }, | ||
| 628 | }, | ||
| 629 | {} | 238 | {} |
| 630 | }; | 239 | }; |
| 631 | 240 | ||
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index cf41f9fc24a7..30f3ef236ecb 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -219,7 +219,8 @@ static void gpe_transaction(struct acpi_ec *ec, u8 status) | |||
| 219 | goto unlock; | 219 | goto unlock; |
| 220 | err: | 220 | err: |
| 221 | /* false interrupt, state didn't change */ | 221 | /* false interrupt, state didn't change */ |
| 222 | ++ec->curr->irq_count; | 222 | if (in_interrupt()) |
| 223 | ++ec->curr->irq_count; | ||
| 223 | unlock: | 224 | unlock: |
| 224 | spin_unlock_irqrestore(&ec->curr_lock, flags); | 225 | spin_unlock_irqrestore(&ec->curr_lock, flags); |
| 225 | } | 226 | } |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 4be252145cb4..c8111424dcb8 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include <linux/interrupt.h> | 35 | #include <linux/interrupt.h> |
| 36 | #include <linux/kmod.h> | 36 | #include <linux/kmod.h> |
| 37 | #include <linux/delay.h> | 37 | #include <linux/delay.h> |
| 38 | #include <linux/dmi.h> | ||
| 39 | #include <linux/workqueue.h> | 38 | #include <linux/workqueue.h> |
| 40 | #include <linux/nmi.h> | 39 | #include <linux/nmi.h> |
| 41 | #include <linux/acpi.h> | 40 | #include <linux/acpi.h> |
| @@ -97,54 +96,44 @@ static DEFINE_SPINLOCK(acpi_res_lock); | |||
| 97 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; | 96 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; |
| 98 | 97 | ||
| 99 | /* | 98 | /* |
| 100 | * "Ode to _OSI(Linux)" | 99 | * The story of _OSI(Linux) |
| 101 | * | 100 | * |
| 102 | * osi_linux -- Control response to BIOS _OSI(Linux) query. | 101 | * From pre-history through Linux-2.6.22, |
| 102 | * Linux responded TRUE upon a BIOS OSI(Linux) query. | ||
| 103 | * | 103 | * |
| 104 | * As Linux evolves, the features that it supports change. | 104 | * Unfortunately, reference BIOS writers got wind of this |
| 105 | * So an OSI string such as "Linux" is not specific enough | 105 | * and put OSI(Linux) in their example code, quickly exposing |
| 106 | * to be useful across multiple versions of Linux. It | 106 | * this string as ill-conceived and opening the door to |
| 107 | * doesn't identify any particular feature, interface, | 107 | * an un-bounded number of BIOS incompatibilities. |
| 108 | * or even any particular version of Linux... | ||
| 109 | * | 108 | * |
| 110 | * Unfortunately, Linux-2.6.22 and earlier responded "yes" | 109 | * For example, OSI(Linux) was used on resume to re-POST a |
| 111 | * to a BIOS _OSI(Linux) query. When | 110 | * video card on one system, because Linux at that time |
| 112 | * a reference mobile BIOS started using it, its use | 111 | * could not do a speedy restore in its native driver. |
| 113 | * started to spread to many vendor platforms. | 112 | * But then upon gaining quick native restore capability, |
| 114 | * As it is not supportable, we need to halt that spread. | 113 | * Linux has no way to tell the BIOS to skip the time-consuming |
| 114 | * POST -- putting Linux at a permanent performance disadvantage. | ||
| 115 | * On another system, the BIOS writer used OSI(Linux) | ||
| 116 | * to infer native OS support for IPMI! On other systems, | ||
| 117 | * OSI(Linux) simply got in the way of Linux claiming to | ||
| 118 | * be compatible with other operating systems, exposing | ||
| 119 | * BIOS issues such as skipped device initialization. | ||
| 115 | * | 120 | * |
| 116 | * Today, most BIOS references to _OSI(Linux) are noise -- | 121 | * So "Linux" turned out to be a really poor chose of |
| 117 | * they have no functional effect and are just dead code | 122 | * OSI string, and from Linux-2.6.23 onward we respond FALSE. |
| 118 | * carried over from the reference BIOS. | ||
| 119 | * | ||
| 120 | * The next most common case is that _OSI(Linux) harms Linux, | ||
| 121 | * usually by causing the BIOS to follow paths that are | ||
| 122 | * not tested during Windows validation. | ||
| 123 | * | ||
| 124 | * Finally, there is a short list of platforms | ||
| 125 | * where OSI(Linux) benefits Linux. | ||
| 126 | * | ||
| 127 | * In Linux-2.6.23, OSI(Linux) is first disabled by default. | ||
| 128 | * DMI is used to disable the dmesg warning about OSI(Linux) | ||
| 129 | * on platforms where it is known to have no effect. | ||
| 130 | * But a dmesg warning remains for systems where | ||
| 131 | * we do not know if OSI(Linux) is good or bad for the system. | ||
| 132 | * DMI is also used to enable OSI(Linux) for the machines | ||
| 133 | * that are known to need it. | ||
| 134 | * | 123 | * |
| 135 | * BIOS writers should NOT query _OSI(Linux) on future systems. | 124 | * BIOS writers should NOT query _OSI(Linux) on future systems. |
| 136 | * It will be ignored by default, and to get Linux to | 125 | * Linux will complain on the console when it sees it, and return FALSE. |
| 137 | * not ignore it will require a kernel source update to | 126 | * To get Linux to return TRUE for your system will require |
| 138 | * add a DMI entry, or a boot-time "acpi_osi=Linux" invocation. | 127 | * a kernel source update to add a DMI entry, |
| 128 | * or boot with "acpi_osi=Linux" | ||
| 139 | */ | 129 | */ |
| 140 | #define OSI_LINUX_ENABLE 0 | ||
| 141 | 130 | ||
| 142 | static struct osi_linux { | 131 | static struct osi_linux { |
| 143 | unsigned int enable:1; | 132 | unsigned int enable:1; |
| 144 | unsigned int dmi:1; | 133 | unsigned int dmi:1; |
| 145 | unsigned int cmdline:1; | 134 | unsigned int cmdline:1; |
| 146 | unsigned int known:1; | 135 | unsigned int known:1; |
| 147 | } osi_linux = { OSI_LINUX_ENABLE, 0, 0, 0}; | 136 | } osi_linux = { 0, 0, 0, 0}; |
| 148 | 137 | ||
| 149 | static void __init acpi_request_region (struct acpi_generic_address *addr, | 138 | static void __init acpi_request_region (struct acpi_generic_address *addr, |
| 150 | unsigned int length, char *desc) | 139 | unsigned int length, char *desc) |
| @@ -1296,34 +1285,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object) | |||
| 1296 | return (AE_OK); | 1285 | return (AE_OK); |
| 1297 | } | 1286 | } |
| 1298 | 1287 | ||
| 1299 | /** | ||
| 1300 | * acpi_dmi_dump - dump DMI slots needed for blacklist entry | ||
| 1301 | * | ||
| 1302 | * Returns 0 on success | ||
| 1303 | */ | ||
| 1304 | static int acpi_dmi_dump(void) | ||
| 1305 | { | ||
| 1306 | |||
| 1307 | if (!dmi_available) | ||
| 1308 | return -1; | ||
| 1309 | |||
| 1310 | printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n", | ||
| 1311 | dmi_get_system_info(DMI_SYS_VENDOR)); | ||
| 1312 | printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n", | ||
| 1313 | dmi_get_system_info(DMI_PRODUCT_NAME)); | ||
| 1314 | printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n", | ||
| 1315 | dmi_get_system_info(DMI_PRODUCT_VERSION)); | ||
| 1316 | printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n", | ||
| 1317 | dmi_get_system_info(DMI_BOARD_NAME)); | ||
| 1318 | printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n", | ||
| 1319 | dmi_get_system_info(DMI_BIOS_VENDOR)); | ||
| 1320 | printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n", | ||
| 1321 | dmi_get_system_info(DMI_BIOS_DATE)); | ||
| 1322 | |||
| 1323 | return 0; | ||
| 1324 | } | ||
| 1325 | |||
| 1326 | |||
| 1327 | /****************************************************************************** | 1288 | /****************************************************************************** |
| 1328 | * | 1289 | * |
| 1329 | * FUNCTION: acpi_os_validate_interface | 1290 | * FUNCTION: acpi_os_validate_interface |
| @@ -1350,21 +1311,6 @@ acpi_os_validate_interface (char *interface) | |||
| 1350 | osi_linux.cmdline ? " via cmdline" : | 1311 | osi_linux.cmdline ? " via cmdline" : |
| 1351 | osi_linux.dmi ? " via DMI" : ""); | 1312 | osi_linux.dmi ? " via DMI" : ""); |
| 1352 | 1313 | ||
| 1353 | if (!osi_linux.dmi) { | ||
| 1354 | if (acpi_dmi_dump()) | ||
| 1355 | printk(KERN_NOTICE PREFIX | ||
| 1356 | "[please extract dmidecode output]\n"); | ||
| 1357 | printk(KERN_NOTICE PREFIX | ||
| 1358 | "Please send DMI info above to " | ||
| 1359 | "linux-acpi@vger.kernel.org\n"); | ||
| 1360 | } | ||
| 1361 | if (!osi_linux.known && !osi_linux.cmdline) { | ||
| 1362 | printk(KERN_NOTICE PREFIX | ||
| 1363 | "If \"acpi_osi=%sLinux\" works better, " | ||
| 1364 | "please notify linux-acpi@vger.kernel.org\n", | ||
| 1365 | osi_linux.enable ? "!" : ""); | ||
| 1366 | } | ||
| 1367 | |||
| 1368 | if (osi_linux.enable) | 1314 | if (osi_linux.enable) |
| 1369 | return AE_OK; | 1315 | return AE_OK; |
| 1370 | } | 1316 | } |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index bd5253ee5c85..39b7233c3485 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -751,16 +751,6 @@ static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device) | |||
| 751 | if (!acpi_match_device_ids(device, button_device_ids)) | 751 | if (!acpi_match_device_ids(device, button_device_ids)) |
| 752 | device->wakeup.flags.run_wake = 1; | 752 | device->wakeup.flags.run_wake = 1; |
| 753 | 753 | ||
| 754 | /* | ||
| 755 | * Don't set Power button GPE as run_wake | ||
| 756 | * if Fixed Power button is used | ||
| 757 | */ | ||
| 758 | if (!strcmp(device->pnp.hardware_id, "PNP0C0C") && | ||
| 759 | !(acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON)) { | ||
| 760 | device->wakeup.flags.run_wake = 0; | ||
| 761 | device->wakeup.flags.valid = 0; | ||
| 762 | } | ||
| 763 | |||
| 764 | end: | 754 | end: |
| 765 | if (ACPI_FAILURE(status)) | 755 | if (ACPI_FAILURE(status)) |
| 766 | device->flags.wake_capable = 0; | 756 | device->flags.wake_capable = 0; |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index 80c0868d0480..28a691cc625e 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
| @@ -90,6 +90,18 @@ void __init acpi_old_suspend_ordering(void) | |||
| 90 | old_suspend_ordering = true; | 90 | old_suspend_ordering = true; |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | /* | ||
| 94 | * According to the ACPI specification the BIOS should make sure that ACPI is | ||
| 95 | * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still, | ||
| 96 | * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI | ||
| 97 | * on such systems during resume. Unfortunately that doesn't help in | ||
| 98 | * particularly pathological cases in which SCI_EN has to be set directly on | ||
| 99 | * resume, although the specification states very clearly that this flag is | ||
| 100 | * owned by the hardware. The set_sci_en_on_resume variable will be set in such | ||
| 101 | * cases. | ||
| 102 | */ | ||
| 103 | static bool set_sci_en_on_resume; | ||
| 104 | |||
| 93 | /** | 105 | /** |
| 94 | * acpi_pm_disable_gpes - Disable the GPEs. | 106 | * acpi_pm_disable_gpes - Disable the GPEs. |
| 95 | */ | 107 | */ |
| @@ -235,7 +247,11 @@ static int acpi_suspend_enter(suspend_state_t pm_state) | |||
| 235 | } | 247 | } |
| 236 | 248 | ||
| 237 | /* If ACPI is not enabled by the BIOS, we need to enable it here. */ | 249 | /* If ACPI is not enabled by the BIOS, we need to enable it here. */ |
| 238 | acpi_enable(); | 250 | if (set_sci_en_on_resume) |
| 251 | acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1); | ||
| 252 | else | ||
| 253 | acpi_enable(); | ||
| 254 | |||
| 239 | /* Reprogram control registers and execute _BFS */ | 255 | /* Reprogram control registers and execute _BFS */ |
| 240 | acpi_leave_sleep_state_prep(acpi_state); | 256 | acpi_leave_sleep_state_prep(acpi_state); |
| 241 | 257 | ||
| @@ -323,6 +339,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d) | |||
| 323 | return 0; | 339 | return 0; |
| 324 | } | 340 | } |
| 325 | 341 | ||
| 342 | static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d) | ||
| 343 | { | ||
| 344 | set_sci_en_on_resume = true; | ||
| 345 | return 0; | ||
| 346 | } | ||
| 347 | |||
| 326 | static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | 348 | static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
| 327 | { | 349 | { |
| 328 | .callback = init_old_suspend_ordering, | 350 | .callback = init_old_suspend_ordering, |
| @@ -340,6 +362,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
| 340 | DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), | 362 | DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), |
| 341 | }, | 363 | }, |
| 342 | }, | 364 | }, |
| 365 | { | ||
| 366 | .callback = init_set_sci_en_on_resume, | ||
| 367 | .ident = "Apple MacBook 1,1", | ||
| 368 | .matches = { | ||
| 369 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
| 370 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), | ||
| 371 | }, | ||
| 372 | }, | ||
| 373 | { | ||
| 374 | .callback = init_set_sci_en_on_resume, | ||
| 375 | .ident = "Apple MacMini 1,1", | ||
| 376 | .matches = { | ||
| 377 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
| 378 | DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"), | ||
| 379 | }, | ||
| 380 | }, | ||
| 343 | {}, | 381 | {}, |
| 344 | }; | 382 | }; |
| 345 | #endif /* CONFIG_SUSPEND */ | 383 | #endif /* CONFIG_SUSPEND */ |
diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c index 66aac06f2ac5..25f531d892de 100644 --- a/drivers/acpi/toshiba_acpi.c +++ b/drivers/acpi/toshiba_acpi.c | |||
| @@ -848,8 +848,6 @@ static int __init toshiba_acpi_init(void) | |||
| 848 | ret = input_register_polled_device(toshiba_acpi.poll_dev); | 848 | ret = input_register_polled_device(toshiba_acpi.poll_dev); |
| 849 | if (ret) { | 849 | if (ret) { |
| 850 | printk(MY_ERR "unable to register kill-switch input device\n"); | 850 | printk(MY_ERR "unable to register kill-switch input device\n"); |
| 851 | rfkill_free(toshiba_acpi.rfk_dev); | ||
| 852 | toshiba_acpi.rfk_dev = NULL; | ||
| 853 | toshiba_acpi_exit(); | 851 | toshiba_acpi_exit(); |
| 854 | return ret; | 852 | return ret; |
| 855 | } | 853 | } |
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index e827be36ee8d..f844941089bb 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c | |||
| @@ -259,34 +259,26 @@ acpi_evaluate_integer(acpi_handle handle, | |||
| 259 | struct acpi_object_list *arguments, unsigned long long *data) | 259 | struct acpi_object_list *arguments, unsigned long long *data) |
| 260 | { | 260 | { |
| 261 | acpi_status status = AE_OK; | 261 | acpi_status status = AE_OK; |
| 262 | union acpi_object *element; | 262 | union acpi_object element; |
| 263 | struct acpi_buffer buffer = { 0, NULL }; | 263 | struct acpi_buffer buffer = { 0, NULL }; |
| 264 | 264 | ||
| 265 | |||
| 266 | if (!data) | 265 | if (!data) |
| 267 | return AE_BAD_PARAMETER; | 266 | return AE_BAD_PARAMETER; |
| 268 | 267 | ||
| 269 | element = kzalloc(sizeof(union acpi_object), irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL); | ||
| 270 | if (!element) | ||
| 271 | return AE_NO_MEMORY; | ||
| 272 | |||
| 273 | buffer.length = sizeof(union acpi_object); | 268 | buffer.length = sizeof(union acpi_object); |
| 274 | buffer.pointer = element; | 269 | buffer.pointer = &element; |
| 275 | status = acpi_evaluate_object(handle, pathname, arguments, &buffer); | 270 | status = acpi_evaluate_object(handle, pathname, arguments, &buffer); |
| 276 | if (ACPI_FAILURE(status)) { | 271 | if (ACPI_FAILURE(status)) { |
| 277 | acpi_util_eval_error(handle, pathname, status); | 272 | acpi_util_eval_error(handle, pathname, status); |
| 278 | kfree(element); | ||
| 279 | return status; | 273 | return status; |
| 280 | } | 274 | } |
| 281 | 275 | ||
| 282 | if (element->type != ACPI_TYPE_INTEGER) { | 276 | if (element.type != ACPI_TYPE_INTEGER) { |
| 283 | acpi_util_eval_error(handle, pathname, AE_BAD_DATA); | 277 | acpi_util_eval_error(handle, pathname, AE_BAD_DATA); |
| 284 | kfree(element); | ||
| 285 | return AE_BAD_DATA; | 278 | return AE_BAD_DATA; |
| 286 | } | 279 | } |
| 287 | 280 | ||
| 288 | *data = element->integer.value; | 281 | *data = element.integer.value; |
| 289 | kfree(element); | ||
| 290 | 282 | ||
| 291 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data)); | 283 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data)); |
| 292 | 284 | ||
diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c index 0f004b65ec03..03f95ec08f59 100644 --- a/drivers/char/agp/uninorth-agp.c +++ b/drivers/char/agp/uninorth-agp.c | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | static int uninorth_rev; | 27 | static int uninorth_rev; |
| 28 | static int is_u3; | 28 | static int is_u3; |
| 29 | 29 | ||
| 30 | static char __devinitdata *aperture = NULL; | 30 | static char *aperture = NULL; |
| 31 | 31 | ||
| 32 | static int uninorth_fetch_size(void) | 32 | static int uninorth_fetch_size(void) |
| 33 | { | 33 | { |
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index 44e5d60f517e..4b10770fa937 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c | |||
| @@ -3739,7 +3739,7 @@ static int stli_getbrdnr(void) | |||
| 3739 | * do is go probing around in the usual places hoping we can find it. | 3739 | * do is go probing around in the usual places hoping we can find it. |
| 3740 | */ | 3740 | */ |
| 3741 | 3741 | ||
| 3742 | static int stli_findeisabrds(void) | 3742 | static int __init stli_findeisabrds(void) |
| 3743 | { | 3743 | { |
| 3744 | struct stlibrd *brdp; | 3744 | struct stlibrd *brdp; |
| 3745 | unsigned int iobase, eid, i; | 3745 | unsigned int iobase, eid, i; |
| @@ -3935,7 +3935,7 @@ static struct stlibrd *stli_allocbrd(void) | |||
| 3935 | * can find. | 3935 | * can find. |
| 3936 | */ | 3936 | */ |
| 3937 | 3937 | ||
| 3938 | static int stli_initbrds(void) | 3938 | static int __init stli_initbrds(void) |
| 3939 | { | 3939 | { |
| 3940 | struct stlibrd *brdp, *nxtbrdp; | 3940 | struct stlibrd *brdp, *nxtbrdp; |
| 3941 | struct stlconf conf; | 3941 | struct stlconf conf; |
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index b6ad3ac5916e..24607669a52b 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c | |||
| @@ -1357,7 +1357,7 @@ static int hw_supports(struct device *dev, __be32 desc_hdr_template) | |||
| 1357 | return ret; | 1357 | return ret; |
| 1358 | } | 1358 | } |
| 1359 | 1359 | ||
| 1360 | static int __devexit talitos_remove(struct of_device *ofdev) | 1360 | static int talitos_remove(struct of_device *ofdev) |
| 1361 | { | 1361 | { |
| 1362 | struct device *dev = &ofdev->dev; | 1362 | struct device *dev = &ofdev->dev; |
| 1363 | struct talitos_private *priv = dev_get_drvdata(dev); | 1363 | struct talitos_private *priv = dev_get_drvdata(dev); |
| @@ -1622,7 +1622,7 @@ static struct of_platform_driver talitos_driver = { | |||
| 1622 | .name = "talitos", | 1622 | .name = "talitos", |
| 1623 | .match_table = talitos_match, | 1623 | .match_table = talitos_match, |
| 1624 | .probe = talitos_probe, | 1624 | .probe = talitos_probe, |
| 1625 | .remove = __devexit_p(talitos_remove), | 1625 | .remove = talitos_remove, |
| 1626 | }; | 1626 | }; |
| 1627 | 1627 | ||
| 1628 | static int __init talitos_init(void) | 1628 | static int __init talitos_init(void) |
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 3ab1e9cc4692..996097acb5e7 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
| @@ -305,6 +305,8 @@ static void drm_cleanup(struct drm_device * dev) | |||
| 305 | return; | 305 | return; |
| 306 | } | 306 | } |
| 307 | 307 | ||
| 308 | drm_vblank_cleanup(dev); | ||
| 309 | |||
| 308 | drm_lastclose(dev); | 310 | drm_lastclose(dev); |
| 309 | 311 | ||
| 310 | if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && | 312 | if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 15c8dabc3e97..1e787f894b3c 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -94,7 +94,7 @@ static void vblank_disable_fn(unsigned long arg) | |||
| 94 | } | 94 | } |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | static void drm_vblank_cleanup(struct drm_device *dev) | 97 | void drm_vblank_cleanup(struct drm_device *dev) |
| 98 | { | 98 | { |
| 99 | /* Bail if the driver didn't call drm_vblank_init() */ | 99 | /* Bail if the driver didn't call drm_vblank_init() */ |
| 100 | if (dev->num_crtcs == 0) | 100 | if (dev->num_crtcs == 0) |
| @@ -278,8 +278,6 @@ int drm_irq_uninstall(struct drm_device * dev) | |||
| 278 | 278 | ||
| 279 | free_irq(dev->pdev->irq, dev); | 279 | free_irq(dev->pdev->irq, dev); |
| 280 | 280 | ||
| 281 | drm_vblank_cleanup(dev); | ||
| 282 | |||
| 283 | return 0; | 281 | return 0; |
| 284 | } | 282 | } |
| 285 | EXPORT_SYMBOL(drm_irq_uninstall); | 283 | EXPORT_SYMBOL(drm_irq_uninstall); |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 0d215e38606a..ba89b42f790a 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -856,6 +856,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 856 | 856 | ||
| 857 | spin_lock_init(&dev_priv->user_irq_lock); | 857 | spin_lock_init(&dev_priv->user_irq_lock); |
| 858 | 858 | ||
| 859 | ret = drm_vblank_init(dev, I915_NUM_PIPE); | ||
| 860 | |||
| 861 | if (ret) { | ||
| 862 | (void) i915_driver_unload(dev); | ||
| 863 | return ret; | ||
| 864 | } | ||
| 865 | |||
| 859 | return ret; | 866 | return ret; |
| 860 | } | 867 | } |
| 861 | 868 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index ef1c0b8f8d07..0a4f39b9a0ec 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -47,6 +47,8 @@ enum pipe { | |||
| 47 | PIPE_B, | 47 | PIPE_B, |
| 48 | }; | 48 | }; |
| 49 | 49 | ||
| 50 | #define I915_NUM_PIPE 2 | ||
| 51 | |||
| 50 | /* Interface history: | 52 | /* Interface history: |
| 51 | * | 53 | * |
| 52 | * 1.1: Original. | 54 | * 1.1: Original. |
| @@ -132,6 +134,7 @@ typedef struct drm_i915_private { | |||
| 132 | int user_irq_refcount; | 134 | int user_irq_refcount; |
| 133 | /** Cached value of IMR to avoid reads in updating the bitfield */ | 135 | /** Cached value of IMR to avoid reads in updating the bitfield */ |
| 134 | u32 irq_mask_reg; | 136 | u32 irq_mask_reg; |
| 137 | u32 pipestat[2]; | ||
| 135 | 138 | ||
| 136 | int tex_lru_log_granularity; | 139 | int tex_lru_log_granularity; |
| 137 | int allow_batchbuffer; | 140 | int allow_batchbuffer; |
| @@ -147,6 +150,7 @@ typedef struct drm_i915_private { | |||
| 147 | u32 saveDSPBCNTR; | 150 | u32 saveDSPBCNTR; |
| 148 | u32 saveDSPARB; | 151 | u32 saveDSPARB; |
| 149 | u32 saveRENDERSTANDBY; | 152 | u32 saveRENDERSTANDBY; |
| 153 | u32 saveHWS; | ||
| 150 | u32 savePIPEACONF; | 154 | u32 savePIPEACONF; |
| 151 | u32 savePIPEBCONF; | 155 | u32 savePIPEBCONF; |
| 152 | u32 savePIPEASRC; | 156 | u32 savePIPEASRC; |
| @@ -446,6 +450,13 @@ extern int i915_vblank_swap(struct drm_device *dev, void *data, | |||
| 446 | struct drm_file *file_priv); | 450 | struct drm_file *file_priv); |
| 447 | extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); | 451 | extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); |
| 448 | 452 | ||
| 453 | void | ||
| 454 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | ||
| 455 | |||
| 456 | void | ||
| 457 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | ||
| 458 | |||
| 459 | |||
| 449 | /* i915_mem.c */ | 460 | /* i915_mem.c */ |
| 450 | extern int i915_mem_alloc(struct drm_device *dev, void *data, | 461 | extern int i915_mem_alloc(struct drm_device *dev, void *data, |
| 451 | struct drm_file *file_priv); | 462 | struct drm_file *file_priv); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 6b4a2bd20640..54bb0d0e49b8 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -31,6 +31,8 @@ | |||
| 31 | #include "i915_drv.h" | 31 | #include "i915_drv.h" |
| 32 | #include <linux/swap.h> | 32 | #include <linux/swap.h> |
| 33 | 33 | ||
| 34 | #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) | ||
| 35 | |||
| 34 | static int | 36 | static int |
| 35 | i915_gem_object_set_domain(struct drm_gem_object *obj, | 37 | i915_gem_object_set_domain(struct drm_gem_object *obj, |
| 36 | uint32_t read_domains, | 38 | uint32_t read_domains, |
| @@ -83,20 +85,14 @@ int | |||
| 83 | i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, | 85 | i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, |
| 84 | struct drm_file *file_priv) | 86 | struct drm_file *file_priv) |
| 85 | { | 87 | { |
| 86 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
| 87 | struct drm_i915_gem_get_aperture *args = data; | 88 | struct drm_i915_gem_get_aperture *args = data; |
| 88 | struct drm_i915_gem_object *obj_priv; | ||
| 89 | 89 | ||
| 90 | if (!(dev->driver->driver_features & DRIVER_GEM)) | 90 | if (!(dev->driver->driver_features & DRIVER_GEM)) |
| 91 | return -ENODEV; | 91 | return -ENODEV; |
| 92 | 92 | ||
| 93 | args->aper_size = dev->gtt_total; | 93 | args->aper_size = dev->gtt_total; |
| 94 | args->aper_available_size = args->aper_size; | 94 | args->aper_available_size = (args->aper_size - |
| 95 | 95 | atomic_read(&dev->pin_memory)); | |
| 96 | list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) { | ||
| 97 | if (obj_priv->pin_count > 0) | ||
| 98 | args->aper_available_size -= obj_priv->obj->size; | ||
| 99 | } | ||
| 100 | 96 | ||
| 101 | return 0; | 97 | return 0; |
| 102 | } | 98 | } |
| @@ -1870,17 +1866,6 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, | |||
| 1870 | 1866 | ||
| 1871 | for (i = 0; i < args->buffer_count; i++) { | 1867 | for (i = 0; i < args->buffer_count; i++) { |
| 1872 | struct drm_gem_object *obj = object_list[i]; | 1868 | struct drm_gem_object *obj = object_list[i]; |
| 1873 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
| 1874 | |||
| 1875 | if (obj_priv->gtt_space == NULL) { | ||
| 1876 | /* We evicted the buffer in the process of validating | ||
| 1877 | * our set of buffers in. We could try to recover by | ||
| 1878 | * kicking them everything out and trying again from | ||
| 1879 | * the start. | ||
| 1880 | */ | ||
| 1881 | ret = -ENOMEM; | ||
| 1882 | goto err; | ||
| 1883 | } | ||
| 1884 | 1869 | ||
| 1885 | /* make sure all previous memory operations have passed */ | 1870 | /* make sure all previous memory operations have passed */ |
| 1886 | ret = i915_gem_object_set_domain(obj, | 1871 | ret = i915_gem_object_set_domain(obj, |
| @@ -2299,29 +2284,52 @@ i915_gem_idle(struct drm_device *dev) | |||
| 2299 | 2284 | ||
| 2300 | i915_gem_retire_requests(dev); | 2285 | i915_gem_retire_requests(dev); |
| 2301 | 2286 | ||
| 2302 | /* Active and flushing should now be empty as we've | 2287 | if (!dev_priv->mm.wedged) { |
| 2303 | * waited for a sequence higher than any pending execbuffer | 2288 | /* Active and flushing should now be empty as we've |
| 2304 | */ | 2289 | * waited for a sequence higher than any pending execbuffer |
| 2305 | BUG_ON(!list_empty(&dev_priv->mm.active_list)); | 2290 | */ |
| 2306 | BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); | 2291 | WARN_ON(!list_empty(&dev_priv->mm.active_list)); |
| 2292 | WARN_ON(!list_empty(&dev_priv->mm.flushing_list)); | ||
| 2293 | /* Request should now be empty as we've also waited | ||
| 2294 | * for the last request in the list | ||
| 2295 | */ | ||
| 2296 | WARN_ON(!list_empty(&dev_priv->mm.request_list)); | ||
| 2297 | } | ||
| 2307 | 2298 | ||
| 2308 | /* Request should now be empty as we've also waited | 2299 | /* Empty the active and flushing lists to inactive. If there's |
| 2309 | * for the last request in the list | 2300 | * anything left at this point, it means that we're wedged and |
| 2301 | * nothing good's going to happen by leaving them there. So strip | ||
| 2302 | * the GPU domains and just stuff them onto inactive. | ||
| 2310 | */ | 2303 | */ |
| 2311 | BUG_ON(!list_empty(&dev_priv->mm.request_list)); | 2304 | while (!list_empty(&dev_priv->mm.active_list)) { |
| 2305 | struct drm_i915_gem_object *obj_priv; | ||
| 2312 | 2306 | ||
| 2313 | /* Move all buffers out of the GTT. */ | 2307 | obj_priv = list_first_entry(&dev_priv->mm.active_list, |
| 2308 | struct drm_i915_gem_object, | ||
| 2309 | list); | ||
| 2310 | obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; | ||
| 2311 | i915_gem_object_move_to_inactive(obj_priv->obj); | ||
| 2312 | } | ||
| 2313 | |||
| 2314 | while (!list_empty(&dev_priv->mm.flushing_list)) { | ||
| 2315 | struct drm_i915_gem_object *obj_priv; | ||
| 2316 | |||
| 2317 | obj_priv = list_first_entry(&dev_priv->mm.active_list, | ||
| 2318 | struct drm_i915_gem_object, | ||
| 2319 | list); | ||
| 2320 | obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; | ||
| 2321 | i915_gem_object_move_to_inactive(obj_priv->obj); | ||
| 2322 | } | ||
| 2323 | |||
| 2324 | |||
| 2325 | /* Move all inactive buffers out of the GTT. */ | ||
| 2314 | ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); | 2326 | ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); |
| 2327 | WARN_ON(!list_empty(&dev_priv->mm.inactive_list)); | ||
| 2315 | if (ret) { | 2328 | if (ret) { |
| 2316 | mutex_unlock(&dev->struct_mutex); | 2329 | mutex_unlock(&dev->struct_mutex); |
| 2317 | return ret; | 2330 | return ret; |
| 2318 | } | 2331 | } |
| 2319 | 2332 | ||
| 2320 | BUG_ON(!list_empty(&dev_priv->mm.active_list)); | ||
| 2321 | BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); | ||
| 2322 | BUG_ON(!list_empty(&dev_priv->mm.inactive_list)); | ||
| 2323 | BUG_ON(!list_empty(&dev_priv->mm.request_list)); | ||
| 2324 | |||
| 2325 | i915_gem_cleanup_ringbuffer(dev); | 2333 | i915_gem_cleanup_ringbuffer(dev); |
| 2326 | mutex_unlock(&dev->struct_mutex); | 2334 | mutex_unlock(&dev->struct_mutex); |
| 2327 | 2335 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 82752d6177a4..fe3d9cc72bf5 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -33,11 +33,23 @@ | |||
| 33 | 33 | ||
| 34 | #define MAX_NOPID ((u32)~0) | 34 | #define MAX_NOPID ((u32)~0) |
| 35 | 35 | ||
| 36 | /** These are the interrupts used by the driver */ | 36 | /** |
| 37 | #define I915_INTERRUPT_ENABLE_MASK (I915_USER_INTERRUPT | \ | 37 | * Interrupts that are always left unmasked. |
| 38 | I915_ASLE_INTERRUPT | \ | 38 | * |
| 39 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ | 39 | * Since pipe events are edge-triggered from the PIPESTAT register to IIR, |
| 40 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) | 40 | * we leave them always unmasked in IMR and then control enabling them through |
| 41 | * PIPESTAT alone. | ||
| 42 | */ | ||
| 43 | #define I915_INTERRUPT_ENABLE_FIX (I915_ASLE_INTERRUPT | \ | ||
| 44 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ | ||
| 45 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) | ||
| 46 | |||
| 47 | /** Interrupts that we mask and unmask at runtime. */ | ||
| 48 | #define I915_INTERRUPT_ENABLE_VAR (I915_USER_INTERRUPT) | ||
| 49 | |||
| 50 | /** These are all of the interrupts used by the driver */ | ||
| 51 | #define I915_INTERRUPT_ENABLE_MASK (I915_INTERRUPT_ENABLE_FIX | \ | ||
| 52 | I915_INTERRUPT_ENABLE_VAR) | ||
| 41 | 53 | ||
| 42 | void | 54 | void |
| 43 | i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) | 55 | i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) |
| @@ -59,6 +71,41 @@ i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask) | |||
| 59 | } | 71 | } |
| 60 | } | 72 | } |
| 61 | 73 | ||
| 74 | static inline u32 | ||
| 75 | i915_pipestat(int pipe) | ||
| 76 | { | ||
| 77 | if (pipe == 0) | ||
| 78 | return PIPEASTAT; | ||
| 79 | if (pipe == 1) | ||
| 80 | return PIPEBSTAT; | ||
| 81 | BUG_ON(1); | ||
| 82 | } | ||
| 83 | |||
| 84 | void | ||
| 85 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) | ||
| 86 | { | ||
| 87 | if ((dev_priv->pipestat[pipe] & mask) != mask) { | ||
| 88 | u32 reg = i915_pipestat(pipe); | ||
| 89 | |||
| 90 | dev_priv->pipestat[pipe] |= mask; | ||
| 91 | /* Enable the interrupt, clear any pending status */ | ||
| 92 | I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16)); | ||
| 93 | (void) I915_READ(reg); | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | void | ||
| 98 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) | ||
| 99 | { | ||
| 100 | if ((dev_priv->pipestat[pipe] & mask) != 0) { | ||
| 101 | u32 reg = i915_pipestat(pipe); | ||
| 102 | |||
| 103 | dev_priv->pipestat[pipe] &= ~mask; | ||
| 104 | I915_WRITE(reg, dev_priv->pipestat[pipe]); | ||
| 105 | (void) I915_READ(reg); | ||
| 106 | } | ||
| 107 | } | ||
| 108 | |||
| 62 | /** | 109 | /** |
| 63 | * i915_pipe_enabled - check if a pipe is enabled | 110 | * i915_pipe_enabled - check if a pipe is enabled |
| 64 | * @dev: DRM device | 111 | * @dev: DRM device |
| @@ -121,80 +168,102 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
| 121 | { | 168 | { |
| 122 | struct drm_device *dev = (struct drm_device *) arg; | 169 | struct drm_device *dev = (struct drm_device *) arg; |
| 123 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 170 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 124 | u32 iir; | 171 | u32 iir, new_iir; |
| 125 | u32 pipea_stats, pipeb_stats; | 172 | u32 pipea_stats, pipeb_stats; |
| 173 | u32 vblank_status; | ||
| 174 | u32 vblank_enable; | ||
| 126 | int vblank = 0; | 175 | int vblank = 0; |
| 176 | unsigned long irqflags; | ||
| 177 | int irq_received; | ||
| 178 | int ret = IRQ_NONE; | ||
| 127 | 179 | ||
| 128 | atomic_inc(&dev_priv->irq_received); | 180 | atomic_inc(&dev_priv->irq_received); |
| 129 | 181 | ||
| 130 | if (dev->pdev->msi_enabled) | ||
| 131 | I915_WRITE(IMR, ~0); | ||
| 132 | iir = I915_READ(IIR); | 182 | iir = I915_READ(IIR); |
| 133 | 183 | ||
| 134 | if (iir == 0) { | 184 | if (IS_I965G(dev)) { |
| 135 | if (dev->pdev->msi_enabled) { | 185 | vblank_status = I915_START_VBLANK_INTERRUPT_STATUS; |
| 136 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | 186 | vblank_enable = PIPE_START_VBLANK_INTERRUPT_ENABLE; |
| 137 | (void) I915_READ(IMR); | 187 | } else { |
| 138 | } | 188 | vblank_status = I915_VBLANK_INTERRUPT_STATUS; |
| 139 | return IRQ_NONE; | 189 | vblank_enable = I915_VBLANK_INTERRUPT_ENABLE; |
| 140 | } | 190 | } |
| 141 | 191 | ||
| 142 | /* | 192 | for (;;) { |
| 143 | * Clear the PIPE(A|B)STAT regs before the IIR otherwise | 193 | irq_received = iir != 0; |
| 144 | * we may get extra interrupts. | 194 | |
| 145 | */ | 195 | /* Can't rely on pipestat interrupt bit in iir as it might |
| 146 | if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) { | 196 | * have been cleared after the pipestat interrupt was received. |
| 197 | * It doesn't set the bit in iir again, but it still produces | ||
| 198 | * interrupts (for non-MSI). | ||
| 199 | */ | ||
| 200 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | ||
| 147 | pipea_stats = I915_READ(PIPEASTAT); | 201 | pipea_stats = I915_READ(PIPEASTAT); |
| 148 | if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)) | 202 | pipeb_stats = I915_READ(PIPEBSTAT); |
| 149 | pipea_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | 203 | /* |
| 150 | PIPE_VBLANK_INTERRUPT_ENABLE); | 204 | * Clear the PIPE(A|B)STAT regs before the IIR |
| 151 | else if (pipea_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| | 205 | */ |
| 152 | PIPE_VBLANK_INTERRUPT_STATUS)) { | 206 | if (pipea_stats & 0x8000ffff) { |
| 207 | I915_WRITE(PIPEASTAT, pipea_stats); | ||
| 208 | irq_received = 1; | ||
| 209 | } | ||
| 210 | |||
| 211 | if (pipeb_stats & 0x8000ffff) { | ||
| 212 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
| 213 | irq_received = 1; | ||
| 214 | } | ||
| 215 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | ||
| 216 | |||
| 217 | if (!irq_received) | ||
| 218 | break; | ||
| 219 | |||
| 220 | ret = IRQ_HANDLED; | ||
| 221 | |||
| 222 | I915_WRITE(IIR, iir); | ||
| 223 | new_iir = I915_READ(IIR); /* Flush posted writes */ | ||
| 224 | |||
| 225 | if (dev_priv->sarea_priv) | ||
| 226 | dev_priv->sarea_priv->last_dispatch = | ||
| 227 | READ_BREADCRUMB(dev_priv); | ||
| 228 | |||
| 229 | if (iir & I915_USER_INTERRUPT) { | ||
| 230 | dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); | ||
| 231 | DRM_WAKEUP(&dev_priv->irq_queue); | ||
| 232 | } | ||
| 233 | |||
| 234 | if (pipea_stats & vblank_status) { | ||
| 153 | vblank++; | 235 | vblank++; |
| 154 | drm_handle_vblank(dev, 0); | 236 | drm_handle_vblank(dev, 0); |
| 155 | } | 237 | } |
| 156 | 238 | ||
| 157 | I915_WRITE(PIPEASTAT, pipea_stats); | 239 | if (pipeb_stats & vblank_status) { |
| 158 | } | ||
| 159 | if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) { | ||
| 160 | pipeb_stats = I915_READ(PIPEBSTAT); | ||
| 161 | /* Ack the event */ | ||
| 162 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
| 163 | |||
| 164 | /* The vblank interrupt gets enabled even if we didn't ask for | ||
| 165 | it, so make sure it's shut down again */ | ||
| 166 | if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)) | ||
| 167 | pipeb_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | ||
| 168 | PIPE_VBLANK_INTERRUPT_ENABLE); | ||
| 169 | else if (pipeb_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| | ||
| 170 | PIPE_VBLANK_INTERRUPT_STATUS)) { | ||
| 171 | vblank++; | 240 | vblank++; |
| 172 | drm_handle_vblank(dev, 1); | 241 | drm_handle_vblank(dev, 1); |
| 173 | } | 242 | } |
| 174 | 243 | ||
| 175 | if (pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) | 244 | if ((pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) || |
| 245 | (iir & I915_ASLE_INTERRUPT)) | ||
| 176 | opregion_asle_intr(dev); | 246 | opregion_asle_intr(dev); |
| 177 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
| 178 | } | ||
| 179 | |||
| 180 | I915_WRITE(IIR, iir); | ||
| 181 | if (dev->pdev->msi_enabled) | ||
| 182 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
| 183 | (void) I915_READ(IIR); /* Flush posted writes */ | ||
| 184 | |||
| 185 | if (dev_priv->sarea_priv) | ||
| 186 | dev_priv->sarea_priv->last_dispatch = | ||
| 187 | READ_BREADCRUMB(dev_priv); | ||
| 188 | 247 | ||
| 189 | if (iir & I915_USER_INTERRUPT) { | 248 | /* With MSI, interrupts are only generated when iir |
| 190 | dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); | 249 | * transitions from zero to nonzero. If another bit got |
| 191 | DRM_WAKEUP(&dev_priv->irq_queue); | 250 | * set while we were handling the existing iir bits, then |
| 251 | * we would never get another interrupt. | ||
| 252 | * | ||
| 253 | * This is fine on non-MSI as well, as if we hit this path | ||
| 254 | * we avoid exiting the interrupt handler only to generate | ||
| 255 | * another one. | ||
| 256 | * | ||
| 257 | * Note that for MSI this could cause a stray interrupt report | ||
| 258 | * if an interrupt landed in the time between writing IIR and | ||
| 259 | * the posting read. This should be rare enough to never | ||
| 260 | * trigger the 99% of 100,000 interrupts test for disabling | ||
| 261 | * stray interrupts. | ||
| 262 | */ | ||
| 263 | iir = new_iir; | ||
| 192 | } | 264 | } |
| 193 | 265 | ||
| 194 | if (iir & I915_ASLE_INTERRUPT) | 266 | return ret; |
| 195 | opregion_asle_intr(dev); | ||
| 196 | |||
| 197 | return IRQ_HANDLED; | ||
| 198 | } | 267 | } |
| 199 | 268 | ||
| 200 | static int i915_emit_irq(struct drm_device * dev) | 269 | static int i915_emit_irq(struct drm_device * dev) |
| @@ -330,48 +399,16 @@ int i915_irq_wait(struct drm_device *dev, void *data, | |||
| 330 | int i915_enable_vblank(struct drm_device *dev, int pipe) | 399 | int i915_enable_vblank(struct drm_device *dev, int pipe) |
| 331 | { | 400 | { |
| 332 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 401 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 333 | u32 pipestat_reg = 0; | ||
| 334 | u32 pipestat; | ||
| 335 | u32 interrupt = 0; | ||
| 336 | unsigned long irqflags; | 402 | unsigned long irqflags; |
| 337 | 403 | ||
| 338 | switch (pipe) { | ||
| 339 | case 0: | ||
| 340 | pipestat_reg = PIPEASTAT; | ||
| 341 | interrupt = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT; | ||
| 342 | break; | ||
| 343 | case 1: | ||
| 344 | pipestat_reg = PIPEBSTAT; | ||
| 345 | interrupt = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT; | ||
| 346 | break; | ||
| 347 | default: | ||
| 348 | DRM_ERROR("tried to enable vblank on non-existent pipe %d\n", | ||
| 349 | pipe); | ||
| 350 | return 0; | ||
| 351 | } | ||
| 352 | |||
| 353 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 404 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 354 | /* Enabling vblank events in IMR comes before PIPESTAT write, or | ||
| 355 | * there's a race where the PIPESTAT vblank bit gets set to 1, so | ||
| 356 | * the OR of enabled PIPESTAT bits goes to 1, so the PIPExEVENT in | ||
| 357 | * ISR flashes to 1, but the IIR bit doesn't get set to 1 because | ||
| 358 | * IMR masks it. It doesn't ever get set after we clear the masking | ||
| 359 | * in IMR because the ISR bit is edge, not level-triggered, on the | ||
| 360 | * OR of PIPESTAT bits. | ||
| 361 | */ | ||
| 362 | i915_enable_irq(dev_priv, interrupt); | ||
| 363 | pipestat = I915_READ(pipestat_reg); | ||
| 364 | if (IS_I965G(dev)) | 405 | if (IS_I965G(dev)) |
| 365 | pipestat |= PIPE_START_VBLANK_INTERRUPT_ENABLE; | 406 | i915_enable_pipestat(dev_priv, pipe, |
| 407 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | ||
| 366 | else | 408 | else |
| 367 | pipestat |= PIPE_VBLANK_INTERRUPT_ENABLE; | 409 | i915_enable_pipestat(dev_priv, pipe, |
| 368 | /* Clear any stale interrupt status */ | 410 | PIPE_VBLANK_INTERRUPT_ENABLE); |
| 369 | pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | | ||
| 370 | PIPE_VBLANK_INTERRUPT_STATUS); | ||
| 371 | I915_WRITE(pipestat_reg, pipestat); | ||
| 372 | (void) I915_READ(pipestat_reg); /* Posting read */ | ||
| 373 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 411 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
| 374 | |||
| 375 | return 0; | 412 | return 0; |
| 376 | } | 413 | } |
| 377 | 414 | ||
| @@ -381,37 +418,12 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) | |||
| 381 | void i915_disable_vblank(struct drm_device *dev, int pipe) | 418 | void i915_disable_vblank(struct drm_device *dev, int pipe) |
| 382 | { | 419 | { |
| 383 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 420 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 384 | u32 pipestat_reg = 0; | ||
| 385 | u32 pipestat; | ||
| 386 | u32 interrupt = 0; | ||
| 387 | unsigned long irqflags; | 421 | unsigned long irqflags; |
| 388 | 422 | ||
| 389 | switch (pipe) { | ||
| 390 | case 0: | ||
| 391 | pipestat_reg = PIPEASTAT; | ||
| 392 | interrupt = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT; | ||
| 393 | break; | ||
| 394 | case 1: | ||
| 395 | pipestat_reg = PIPEBSTAT; | ||
| 396 | interrupt = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT; | ||
| 397 | break; | ||
| 398 | default: | ||
| 399 | DRM_ERROR("tried to disable vblank on non-existent pipe %d\n", | ||
| 400 | pipe); | ||
| 401 | return; | ||
| 402 | break; | ||
| 403 | } | ||
| 404 | |||
| 405 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 423 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 406 | i915_disable_irq(dev_priv, interrupt); | 424 | i915_disable_pipestat(dev_priv, pipe, |
| 407 | pipestat = I915_READ(pipestat_reg); | 425 | PIPE_VBLANK_INTERRUPT_ENABLE | |
| 408 | pipestat &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | 426 | PIPE_START_VBLANK_INTERRUPT_ENABLE); |
| 409 | PIPE_VBLANK_INTERRUPT_ENABLE); | ||
| 410 | /* Clear any stale interrupt status */ | ||
| 411 | pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | | ||
| 412 | PIPE_VBLANK_INTERRUPT_STATUS); | ||
| 413 | I915_WRITE(pipestat_reg, pipestat); | ||
| 414 | (void) I915_READ(pipestat_reg); /* Posting read */ | ||
| 415 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 427 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
| 416 | } | 428 | } |
| 417 | 429 | ||
| @@ -476,32 +488,35 @@ void i915_driver_irq_preinstall(struct drm_device * dev) | |||
| 476 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 488 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 477 | 489 | ||
| 478 | I915_WRITE(HWSTAM, 0xeffe); | 490 | I915_WRITE(HWSTAM, 0xeffe); |
| 491 | I915_WRITE(PIPEASTAT, 0); | ||
| 492 | I915_WRITE(PIPEBSTAT, 0); | ||
| 479 | I915_WRITE(IMR, 0xffffffff); | 493 | I915_WRITE(IMR, 0xffffffff); |
| 480 | I915_WRITE(IER, 0x0); | 494 | I915_WRITE(IER, 0x0); |
| 495 | (void) I915_READ(IER); | ||
| 481 | } | 496 | } |
| 482 | 497 | ||
| 483 | int i915_driver_irq_postinstall(struct drm_device *dev) | 498 | int i915_driver_irq_postinstall(struct drm_device *dev) |
| 484 | { | 499 | { |
| 485 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 500 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 486 | int ret, num_pipes = 2; | ||
| 487 | |||
| 488 | /* Set initial unmasked IRQs to just the selected vblank pipes. */ | ||
| 489 | dev_priv->irq_mask_reg = ~0; | ||
| 490 | |||
| 491 | ret = drm_vblank_init(dev, num_pipes); | ||
| 492 | if (ret) | ||
| 493 | return ret; | ||
| 494 | 501 | ||
| 495 | dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; | 502 | dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; |
| 496 | dev_priv->irq_mask_reg &= ~I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT; | ||
| 497 | dev_priv->irq_mask_reg &= ~I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT; | ||
| 498 | 503 | ||
| 499 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ | 504 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ |
| 500 | 505 | ||
| 501 | dev_priv->irq_mask_reg &= I915_INTERRUPT_ENABLE_MASK; | 506 | /* Unmask the interrupts that we always want on. */ |
| 507 | dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX; | ||
| 508 | |||
| 509 | dev_priv->pipestat[0] = 0; | ||
| 510 | dev_priv->pipestat[1] = 0; | ||
| 511 | |||
| 512 | /* Disable pipe interrupt enables, clear pending pipe status */ | ||
| 513 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); | ||
| 514 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); | ||
| 515 | /* Clear pending interrupt status */ | ||
| 516 | I915_WRITE(IIR, I915_READ(IIR)); | ||
| 502 | 517 | ||
| 503 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
| 504 | I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); | 518 | I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); |
| 519 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
| 505 | (void) I915_READ(IER); | 520 | (void) I915_READ(IER); |
| 506 | 521 | ||
| 507 | opregion_enable_asle(dev); | 522 | opregion_enable_asle(dev); |
| @@ -513,7 +528,6 @@ int i915_driver_irq_postinstall(struct drm_device *dev) | |||
| 513 | void i915_driver_irq_uninstall(struct drm_device * dev) | 528 | void i915_driver_irq_uninstall(struct drm_device * dev) |
| 514 | { | 529 | { |
| 515 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 530 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 516 | u32 temp; | ||
| 517 | 531 | ||
| 518 | if (!dev_priv) | 532 | if (!dev_priv) |
| 519 | return; | 533 | return; |
| @@ -521,13 +535,12 @@ void i915_driver_irq_uninstall(struct drm_device * dev) | |||
| 521 | dev_priv->vblank_pipe = 0; | 535 | dev_priv->vblank_pipe = 0; |
| 522 | 536 | ||
| 523 | I915_WRITE(HWSTAM, 0xffffffff); | 537 | I915_WRITE(HWSTAM, 0xffffffff); |
| 538 | I915_WRITE(PIPEASTAT, 0); | ||
| 539 | I915_WRITE(PIPEBSTAT, 0); | ||
| 524 | I915_WRITE(IMR, 0xffffffff); | 540 | I915_WRITE(IMR, 0xffffffff); |
| 525 | I915_WRITE(IER, 0x0); | 541 | I915_WRITE(IER, 0x0); |
| 526 | 542 | ||
| 527 | temp = I915_READ(PIPEASTAT); | 543 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); |
| 528 | I915_WRITE(PIPEASTAT, temp); | 544 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); |
| 529 | temp = I915_READ(PIPEBSTAT); | 545 | I915_WRITE(IIR, I915_READ(IIR)); |
| 530 | I915_WRITE(PIPEBSTAT, temp); | ||
| 531 | temp = I915_READ(IIR); | ||
| 532 | I915_WRITE(IIR, temp); | ||
| 533 | } | 546 | } |
diff --git a/drivers/gpu/drm/i915/i915_opregion.c b/drivers/gpu/drm/i915/i915_opregion.c index 1787a0c7e3ab..13ae731a33db 100644 --- a/drivers/gpu/drm/i915/i915_opregion.c +++ b/drivers/gpu/drm/i915/i915_opregion.c | |||
| @@ -235,17 +235,15 @@ void opregion_enable_asle(struct drm_device *dev) | |||
| 235 | struct opregion_asle *asle = dev_priv->opregion.asle; | 235 | struct opregion_asle *asle = dev_priv->opregion.asle; |
| 236 | 236 | ||
| 237 | if (asle) { | 237 | if (asle) { |
| 238 | u32 pipeb_stats = I915_READ(PIPEBSTAT); | ||
| 239 | if (IS_MOBILE(dev)) { | 238 | if (IS_MOBILE(dev)) { |
| 240 | /* Many devices trigger events with a write to the | 239 | unsigned long irqflags; |
| 241 | legacy backlight controller, so we need to ensure | 240 | |
| 242 | that it's able to generate interrupts */ | 241 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 243 | I915_WRITE(PIPEBSTAT, pipeb_stats |= | 242 | i915_enable_pipestat(dev_priv, 1, |
| 244 | I915_LEGACY_BLC_EVENT_ENABLE); | 243 | I915_LEGACY_BLC_EVENT_ENABLE); |
| 245 | i915_enable_irq(dev_priv, I915_ASLE_INTERRUPT | | 244 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, |
| 246 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT); | 245 | irqflags); |
| 247 | } else | 246 | } |
| 248 | i915_enable_irq(dev_priv, I915_ASLE_INTERRUPT); | ||
| 249 | 247 | ||
| 250 | asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | | 248 | asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | |
| 251 | ASLE_PFMB_EN; | 249 | ASLE_PFMB_EN; |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 5ddc6e595c0c..5d84027ee8f3 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -244,6 +244,9 @@ int i915_save_state(struct drm_device *dev) | |||
| 244 | if (IS_I965G(dev) && IS_MOBILE(dev)) | 244 | if (IS_I965G(dev) && IS_MOBILE(dev)) |
| 245 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); | 245 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); |
| 246 | 246 | ||
| 247 | /* Hardware status page */ | ||
| 248 | dev_priv->saveHWS = I915_READ(HWS_PGA); | ||
| 249 | |||
| 247 | /* Display arbitration control */ | 250 | /* Display arbitration control */ |
| 248 | dev_priv->saveDSPARB = I915_READ(DSPARB); | 251 | dev_priv->saveDSPARB = I915_READ(DSPARB); |
| 249 | 252 | ||
| @@ -373,6 +376,9 @@ int i915_restore_state(struct drm_device *dev) | |||
| 373 | if (IS_I965G(dev) && IS_MOBILE(dev)) | 376 | if (IS_I965G(dev) && IS_MOBILE(dev)) |
| 374 | I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); | 377 | I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); |
| 375 | 378 | ||
| 379 | /* Hardware status page */ | ||
| 380 | I915_WRITE(HWS_PGA, dev_priv->saveHWS); | ||
| 381 | |||
| 376 | /* Display arbitration */ | 382 | /* Display arbitration */ |
| 377 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); | 383 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); |
| 378 | 384 | ||
diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c index c1d12dbfa8d8..b49c5ff29585 100644 --- a/drivers/gpu/drm/mga/mga_dma.c +++ b/drivers/gpu/drm/mga/mga_dma.c | |||
| @@ -396,6 +396,7 @@ int mga_freelist_put(struct drm_device * dev, struct drm_buf * buf) | |||
| 396 | int mga_driver_load(struct drm_device * dev, unsigned long flags) | 396 | int mga_driver_load(struct drm_device * dev, unsigned long flags) |
| 397 | { | 397 | { |
| 398 | drm_mga_private_t *dev_priv; | 398 | drm_mga_private_t *dev_priv; |
| 399 | int ret; | ||
| 399 | 400 | ||
| 400 | dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); | 401 | dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); |
| 401 | if (!dev_priv) | 402 | if (!dev_priv) |
| @@ -415,6 +416,13 @@ int mga_driver_load(struct drm_device * dev, unsigned long flags) | |||
| 415 | dev->types[7] = _DRM_STAT_PRIMARY; | 416 | dev->types[7] = _DRM_STAT_PRIMARY; |
| 416 | dev->types[8] = _DRM_STAT_SECONDARY; | 417 | dev->types[8] = _DRM_STAT_SECONDARY; |
| 417 | 418 | ||
| 419 | ret = drm_vblank_init(dev, 1); | ||
| 420 | |||
| 421 | if (ret) { | ||
| 422 | (void) mga_driver_unload(dev); | ||
| 423 | return ret; | ||
| 424 | } | ||
| 425 | |||
| 418 | return 0; | 426 | return 0; |
| 419 | } | 427 | } |
| 420 | 428 | ||
diff --git a/drivers/gpu/drm/mga/mga_irq.c b/drivers/gpu/drm/mga/mga_irq.c index bab42f41188b..daa6041a483a 100644 --- a/drivers/gpu/drm/mga/mga_irq.c +++ b/drivers/gpu/drm/mga/mga_irq.c | |||
| @@ -152,11 +152,6 @@ void mga_driver_irq_preinstall(struct drm_device * dev) | |||
| 152 | int mga_driver_irq_postinstall(struct drm_device *dev) | 152 | int mga_driver_irq_postinstall(struct drm_device *dev) |
| 153 | { | 153 | { |
| 154 | drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; | 154 | drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; |
| 155 | int ret; | ||
| 156 | |||
| 157 | ret = drm_vblank_init(dev, 1); | ||
| 158 | if (ret) | ||
| 159 | return ret; | ||
| 160 | 155 | ||
| 161 | DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); | 156 | DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); |
| 162 | 157 | ||
diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c index 3265d53ba91f..601f4c0e5da5 100644 --- a/drivers/gpu/drm/r128/r128_drv.c +++ b/drivers/gpu/drm/r128/r128_drv.c | |||
| @@ -45,6 +45,7 @@ static struct drm_driver driver = { | |||
| 45 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | | 45 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | |
| 46 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, | 46 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, |
| 47 | .dev_priv_size = sizeof(drm_r128_buf_priv_t), | 47 | .dev_priv_size = sizeof(drm_r128_buf_priv_t), |
| 48 | .load = r128_driver_load, | ||
| 48 | .preclose = r128_driver_preclose, | 49 | .preclose = r128_driver_preclose, |
| 49 | .lastclose = r128_driver_lastclose, | 50 | .lastclose = r128_driver_lastclose, |
| 50 | .get_vblank_counter = r128_get_vblank_counter, | 51 | .get_vblank_counter = r128_get_vblank_counter, |
| @@ -84,6 +85,11 @@ static struct drm_driver driver = { | |||
| 84 | .patchlevel = DRIVER_PATCHLEVEL, | 85 | .patchlevel = DRIVER_PATCHLEVEL, |
| 85 | }; | 86 | }; |
| 86 | 87 | ||
| 88 | int r128_driver_load(struct drm_device * dev, unsigned long flags) | ||
| 89 | { | ||
| 90 | return drm_vblank_init(dev, 1); | ||
| 91 | } | ||
| 92 | |||
| 87 | static int __init r128_init(void) | 93 | static int __init r128_init(void) |
| 88 | { | 94 | { |
| 89 | driver.num_ioctls = r128_max_ioctl; | 95 | driver.num_ioctls = r128_max_ioctl; |
diff --git a/drivers/gpu/drm/r128/r128_drv.h b/drivers/gpu/drm/r128/r128_drv.h index 5898b274279d..797a26c42dab 100644 --- a/drivers/gpu/drm/r128/r128_drv.h +++ b/drivers/gpu/drm/r128/r128_drv.h | |||
| @@ -159,6 +159,7 @@ extern void r128_driver_irq_preinstall(struct drm_device * dev); | |||
| 159 | extern int r128_driver_irq_postinstall(struct drm_device *dev); | 159 | extern int r128_driver_irq_postinstall(struct drm_device *dev); |
| 160 | extern void r128_driver_irq_uninstall(struct drm_device * dev); | 160 | extern void r128_driver_irq_uninstall(struct drm_device * dev); |
| 161 | extern void r128_driver_lastclose(struct drm_device * dev); | 161 | extern void r128_driver_lastclose(struct drm_device * dev); |
| 162 | extern int r128_driver_load(struct drm_device * dev, unsigned long flags); | ||
| 162 | extern void r128_driver_preclose(struct drm_device * dev, | 163 | extern void r128_driver_preclose(struct drm_device * dev, |
| 163 | struct drm_file *file_priv); | 164 | struct drm_file *file_priv); |
| 164 | 165 | ||
diff --git a/drivers/gpu/drm/r128/r128_irq.c b/drivers/gpu/drm/r128/r128_irq.c index d7349012a680..69810fb8ac49 100644 --- a/drivers/gpu/drm/r128/r128_irq.c +++ b/drivers/gpu/drm/r128/r128_irq.c | |||
| @@ -102,7 +102,7 @@ void r128_driver_irq_preinstall(struct drm_device * dev) | |||
| 102 | 102 | ||
| 103 | int r128_driver_irq_postinstall(struct drm_device *dev) | 103 | int r128_driver_irq_postinstall(struct drm_device *dev) |
| 104 | { | 104 | { |
| 105 | return drm_vblank_init(dev, 1); | 105 | return 0; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | void r128_driver_irq_uninstall(struct drm_device * dev) | 108 | void r128_driver_irq_uninstall(struct drm_device * dev) |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index abdc1ae38467..dcebb4bee7aa 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
| @@ -1757,6 +1757,12 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1757 | if (ret != 0) | 1757 | if (ret != 0) |
| 1758 | return ret; | 1758 | return ret; |
| 1759 | 1759 | ||
| 1760 | ret = drm_vblank_init(dev, 2); | ||
| 1761 | if (ret) { | ||
| 1762 | radeon_driver_unload(dev); | ||
| 1763 | return ret; | ||
| 1764 | } | ||
| 1765 | |||
| 1760 | DRM_DEBUG("%s card detected\n", | 1766 | DRM_DEBUG("%s card detected\n", |
| 1761 | ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); | 1767 | ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); |
| 1762 | return ret; | 1768 | return ret; |
diff --git a/drivers/gpu/drm/radeon/radeon_irq.c b/drivers/gpu/drm/radeon/radeon_irq.c index 5079f7054a2f..97c0599fdb1e 100644 --- a/drivers/gpu/drm/radeon/radeon_irq.c +++ b/drivers/gpu/drm/radeon/radeon_irq.c | |||
| @@ -337,15 +337,10 @@ int radeon_driver_irq_postinstall(struct drm_device *dev) | |||
| 337 | { | 337 | { |
| 338 | drm_radeon_private_t *dev_priv = | 338 | drm_radeon_private_t *dev_priv = |
| 339 | (drm_radeon_private_t *) dev->dev_private; | 339 | (drm_radeon_private_t *) dev->dev_private; |
| 340 | int ret; | ||
| 341 | 340 | ||
| 342 | atomic_set(&dev_priv->swi_emitted, 0); | 341 | atomic_set(&dev_priv->swi_emitted, 0); |
| 343 | DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); | 342 | DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); |
| 344 | 343 | ||
| 345 | ret = drm_vblank_init(dev, 2); | ||
| 346 | if (ret) | ||
| 347 | return ret; | ||
| 348 | |||
| 349 | dev->max_vblank_count = 0x001fffff; | 344 | dev->max_vblank_count = 0x001fffff; |
| 350 | 345 | ||
| 351 | radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); | 346 | radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); |
diff --git a/drivers/gpu/drm/via/via_irq.c b/drivers/gpu/drm/via/via_irq.c index 665d319b927b..c248c1d37268 100644 --- a/drivers/gpu/drm/via/via_irq.c +++ b/drivers/gpu/drm/via/via_irq.c | |||
| @@ -314,7 +314,6 @@ int via_driver_irq_postinstall(struct drm_device *dev) | |||
| 314 | if (!dev_priv) | 314 | if (!dev_priv) |
| 315 | return -EINVAL; | 315 | return -EINVAL; |
| 316 | 316 | ||
| 317 | drm_vblank_init(dev, 1); | ||
| 318 | status = VIA_READ(VIA_REG_INTERRUPT); | 317 | status = VIA_READ(VIA_REG_INTERRUPT); |
| 319 | VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL | 318 | VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL |
| 320 | | dev_priv->irq_enable_mask); | 319 | | dev_priv->irq_enable_mask); |
diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c index a967556be014..2c4f0b485792 100644 --- a/drivers/gpu/drm/via/via_map.c +++ b/drivers/gpu/drm/via/via_map.c | |||
| @@ -107,8 +107,17 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 107 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); | 107 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); |
| 108 | if (ret) { | 108 | if (ret) { |
| 109 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); | 109 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); |
| 110 | return ret; | ||
| 110 | } | 111 | } |
| 111 | return ret; | 112 | |
| 113 | ret = drm_vblank_init(dev, 1); | ||
| 114 | if (ret) { | ||
| 115 | drm_sman_takedown(&dev_priv->sman); | ||
| 116 | drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); | ||
| 117 | return ret; | ||
| 118 | } | ||
| 119 | |||
| 120 | return 0; | ||
| 112 | } | 121 | } |
| 113 | 122 | ||
| 114 | int via_driver_unload(struct drm_device *dev) | 123 | int via_driver_unload(struct drm_device *dev) |
diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c index 59ba2086d2f9..a257cd5cd134 100644 --- a/drivers/i2c/busses/i2c-parport.c +++ b/drivers/i2c/busses/i2c-parport.c | |||
| @@ -189,8 +189,6 @@ static void i2c_parport_attach (struct parport *port) | |||
| 189 | if (adapter_parm[type].init.val) | 189 | if (adapter_parm[type].init.val) |
| 190 | line_set(port, 1, &adapter_parm[type].init); | 190 | line_set(port, 1, &adapter_parm[type].init); |
| 191 | 191 | ||
| 192 | parport_release(adapter->pdev); | ||
| 193 | |||
| 194 | if (i2c_bit_add_bus(&adapter->adapter) < 0) { | 192 | if (i2c_bit_add_bus(&adapter->adapter) < 0) { |
| 195 | printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); | 193 | printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); |
| 196 | goto ERROR1; | 194 | goto ERROR1; |
| @@ -202,6 +200,7 @@ static void i2c_parport_attach (struct parport *port) | |||
| 202 | return; | 200 | return; |
| 203 | 201 | ||
| 204 | ERROR1: | 202 | ERROR1: |
| 203 | parport_release(adapter->pdev); | ||
| 205 | parport_unregister_device(adapter->pdev); | 204 | parport_unregister_device(adapter->pdev); |
| 206 | ERROR0: | 205 | ERROR0: |
| 207 | kfree(adapter); | 206 | kfree(adapter); |
| @@ -221,6 +220,7 @@ static void i2c_parport_detach (struct parport *port) | |||
| 221 | if (adapter_parm[type].init.val) | 220 | if (adapter_parm[type].init.val) |
| 222 | line_set(port, 0, &adapter_parm[type].init); | 221 | line_set(port, 0, &adapter_parm[type].init); |
| 223 | 222 | ||
| 223 | parport_release(adapter->pdev); | ||
| 224 | parport_unregister_device(adapter->pdev); | 224 | parport_unregister_device(adapter->pdev); |
| 225 | if (prev) | 225 | if (prev) |
| 226 | prev->next = adapter->next; | 226 | prev->next = adapter->next; |
diff --git a/drivers/i2c/chips/isp1301_omap.c b/drivers/i2c/chips/isp1301_omap.c index 28902ebd5539..e0d56ef2bcb0 100644 --- a/drivers/i2c/chips/isp1301_omap.c +++ b/drivers/i2c/chips/isp1301_omap.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
| 26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
| 27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
| 28 | #include <linux/gpio.h> | ||
| 28 | #include <linux/usb/ch9.h> | 29 | #include <linux/usb/ch9.h> |
| 29 | #include <linux/usb/gadget.h> | 30 | #include <linux/usb/gadget.h> |
| 30 | #include <linux/usb.h> | 31 | #include <linux/usb.h> |
| @@ -33,7 +34,10 @@ | |||
| 33 | #include <linux/workqueue.h> | 34 | #include <linux/workqueue.h> |
| 34 | 35 | ||
| 35 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
| 37 | #include <asm/mach-types.h> | ||
| 38 | |||
| 36 | #include <mach/usb.h> | 39 | #include <mach/usb.h> |
| 40 | #include <mach/mux.h> | ||
| 37 | 41 | ||
| 38 | 42 | ||
| 39 | #ifndef DEBUG | 43 | #ifndef DEBUG |
| @@ -88,14 +92,9 @@ struct isp1301 { | |||
| 88 | 92 | ||
| 89 | /*-------------------------------------------------------------------------*/ | 93 | /*-------------------------------------------------------------------------*/ |
| 90 | 94 | ||
| 91 | #ifdef CONFIG_MACH_OMAP_H2 | ||
| 92 | |||
| 93 | /* board-specific PM hooks */ | 95 | /* board-specific PM hooks */ |
| 94 | 96 | ||
| 95 | #include <asm/gpio.h> | 97 | #if defined(CONFIG_MACH_OMAP_H2) || defined(CONFIG_MACH_OMAP_H3) |
| 96 | #include <mach/mux.h> | ||
| 97 | #include <asm/mach-types.h> | ||
| 98 | |||
| 99 | 98 | ||
| 100 | #if defined(CONFIG_TPS65010) || defined(CONFIG_TPS65010_MODULE) | 99 | #if defined(CONFIG_TPS65010) || defined(CONFIG_TPS65010_MODULE) |
| 101 | 100 | ||
| @@ -135,6 +134,33 @@ static inline void notresponding(struct isp1301 *isp) | |||
| 135 | 134 | ||
| 136 | #endif | 135 | #endif |
| 137 | 136 | ||
| 137 | #if defined(CONFIG_MACH_OMAP_H4) | ||
| 138 | |||
| 139 | static void enable_vbus_draw(struct isp1301 *isp, unsigned mA) | ||
| 140 | { | ||
| 141 | /* H4 controls this by DIP switch S2.4; no soft control. | ||
| 142 | * ON means the charger is always enabled. Leave it OFF | ||
| 143 | * unless the OTG port is used only in B-peripheral mode. | ||
| 144 | */ | ||
| 145 | } | ||
| 146 | |||
| 147 | static void enable_vbus_source(struct isp1301 *isp) | ||
| 148 | { | ||
| 149 | /* this board won't supply more than 8mA vbus power. | ||
| 150 | * some boards can switch a 100ma "unit load" (or more). | ||
| 151 | */ | ||
| 152 | } | ||
| 153 | |||
| 154 | |||
| 155 | /* products will deliver OTG messages with LEDs, GUI, etc */ | ||
| 156 | static inline void notresponding(struct isp1301 *isp) | ||
| 157 | { | ||
| 158 | printk(KERN_NOTICE "OTG device not responding.\n"); | ||
| 159 | } | ||
| 160 | |||
| 161 | |||
| 162 | #endif | ||
| 163 | |||
| 138 | /*-------------------------------------------------------------------------*/ | 164 | /*-------------------------------------------------------------------------*/ |
| 139 | 165 | ||
| 140 | static struct i2c_driver isp1301_driver; | 166 | static struct i2c_driver isp1301_driver; |
| @@ -334,8 +360,7 @@ static int gadget_suspend(struct isp1301 *isp) | |||
| 334 | * NOTE: guaranteeing certain response times might mean we shouldn't | 360 | * NOTE: guaranteeing certain response times might mean we shouldn't |
| 335 | * share keventd's work queue; a realtime task might be safest. | 361 | * share keventd's work queue; a realtime task might be safest. |
| 336 | */ | 362 | */ |
| 337 | void | 363 | static void isp1301_defer_work(struct isp1301 *isp, int work) |
| 338 | isp1301_defer_work(struct isp1301 *isp, int work) | ||
| 339 | { | 364 | { |
| 340 | int status; | 365 | int status; |
| 341 | 366 | ||
| @@ -512,7 +537,6 @@ static void update_otg1(struct isp1301 *isp, u8 int_src) | |||
| 512 | otg_ctrl &= ~OTG_XCEIV_INPUTS; | 537 | otg_ctrl &= ~OTG_XCEIV_INPUTS; |
| 513 | otg_ctrl &= ~(OTG_ID|OTG_ASESSVLD|OTG_VBUSVLD); | 538 | otg_ctrl &= ~(OTG_ID|OTG_ASESSVLD|OTG_VBUSVLD); |
| 514 | 539 | ||
| 515 | |||
| 516 | if (int_src & INTR_SESS_VLD) | 540 | if (int_src & INTR_SESS_VLD) |
| 517 | otg_ctrl |= OTG_ASESSVLD; | 541 | otg_ctrl |= OTG_ASESSVLD; |
| 518 | else if (isp->otg.state == OTG_STATE_A_WAIT_VFALL) { | 542 | else if (isp->otg.state == OTG_STATE_A_WAIT_VFALL) { |
| @@ -886,11 +910,11 @@ static int otg_probe(struct platform_device *dev) | |||
| 886 | 910 | ||
| 887 | static int otg_remove(struct platform_device *dev) | 911 | static int otg_remove(struct platform_device *dev) |
| 888 | { | 912 | { |
| 889 | otg_dev = 0; | 913 | otg_dev = NULL; |
| 890 | return 0; | 914 | return 0; |
| 891 | } | 915 | } |
| 892 | 916 | ||
| 893 | struct platform_driver omap_otg_driver = { | 917 | static struct platform_driver omap_otg_driver = { |
| 894 | .probe = otg_probe, | 918 | .probe = otg_probe, |
| 895 | .remove = otg_remove, | 919 | .remove = otg_remove, |
| 896 | .driver = { | 920 | .driver = { |
| @@ -1212,6 +1236,8 @@ static void isp1301_release(struct device *dev) | |||
| 1212 | 1236 | ||
| 1213 | isp = dev_get_drvdata(dev); | 1237 | isp = dev_get_drvdata(dev); |
| 1214 | 1238 | ||
| 1239 | /* FIXME -- not with a "new style" driver, it doesn't!! */ | ||
| 1240 | |||
| 1215 | /* ugly -- i2c hijacks our memory hook to wait_for_completion() */ | 1241 | /* ugly -- i2c hijacks our memory hook to wait_for_completion() */ |
| 1216 | if (isp->i2c_release) | 1242 | if (isp->i2c_release) |
| 1217 | isp->i2c_release(dev); | 1243 | isp->i2c_release(dev); |
| @@ -1233,7 +1259,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c) | |||
| 1233 | otg_unbind(isp); | 1259 | otg_unbind(isp); |
| 1234 | #endif | 1260 | #endif |
| 1235 | if (machine_is_omap_h2()) | 1261 | if (machine_is_omap_h2()) |
| 1236 | omap_free_gpio(2); | 1262 | gpio_free(2); |
| 1237 | 1263 | ||
| 1238 | isp->timer.data = 0; | 1264 | isp->timer.data = 0; |
| 1239 | set_bit(WORK_STOP, &isp->todo); | 1265 | set_bit(WORK_STOP, &isp->todo); |
| @@ -1241,7 +1267,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c) | |||
| 1241 | flush_scheduled_work(); | 1267 | flush_scheduled_work(); |
| 1242 | 1268 | ||
| 1243 | put_device(&i2c->dev); | 1269 | put_device(&i2c->dev); |
| 1244 | the_transceiver = 0; | 1270 | the_transceiver = NULL; |
| 1245 | 1271 | ||
| 1246 | return 0; | 1272 | return 0; |
| 1247 | } | 1273 | } |
| @@ -1295,7 +1321,7 @@ isp1301_set_host(struct otg_transceiver *otg, struct usb_bus *host) | |||
| 1295 | if (!host) { | 1321 | if (!host) { |
| 1296 | omap_writew(0, OTG_IRQ_EN); | 1322 | omap_writew(0, OTG_IRQ_EN); |
| 1297 | power_down(isp); | 1323 | power_down(isp); |
| 1298 | isp->otg.host = 0; | 1324 | isp->otg.host = NULL; |
| 1299 | return 0; | 1325 | return 0; |
| 1300 | } | 1326 | } |
| 1301 | 1327 | ||
| @@ -1344,7 +1370,9 @@ static int | |||
| 1344 | isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | 1370 | isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) |
| 1345 | { | 1371 | { |
| 1346 | struct isp1301 *isp = container_of(otg, struct isp1301, otg); | 1372 | struct isp1301 *isp = container_of(otg, struct isp1301, otg); |
| 1373 | #ifndef CONFIG_USB_OTG | ||
| 1347 | u32 l; | 1374 | u32 l; |
| 1375 | #endif | ||
| 1348 | 1376 | ||
| 1349 | if (!otg || isp != the_transceiver) | 1377 | if (!otg || isp != the_transceiver) |
| 1350 | return -ENODEV; | 1378 | return -ENODEV; |
| @@ -1354,7 +1382,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
| 1354 | if (!isp->otg.default_a) | 1382 | if (!isp->otg.default_a) |
| 1355 | enable_vbus_draw(isp, 0); | 1383 | enable_vbus_draw(isp, 0); |
| 1356 | usb_gadget_vbus_disconnect(isp->otg.gadget); | 1384 | usb_gadget_vbus_disconnect(isp->otg.gadget); |
| 1357 | isp->otg.gadget = 0; | 1385 | isp->otg.gadget = NULL; |
| 1358 | power_down(isp); | 1386 | power_down(isp); |
| 1359 | return 0; | 1387 | return 0; |
| 1360 | } | 1388 | } |
| @@ -1379,7 +1407,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
| 1379 | power_up(isp); | 1407 | power_up(isp); |
| 1380 | isp->otg.state = OTG_STATE_B_IDLE; | 1408 | isp->otg.state = OTG_STATE_B_IDLE; |
| 1381 | 1409 | ||
| 1382 | if (machine_is_omap_h2()) | 1410 | if (machine_is_omap_h2() || machine_is_omap_h3()) |
| 1383 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0); | 1411 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0); |
| 1384 | 1412 | ||
| 1385 | isp1301_set_bits(isp, ISP1301_INTERRUPT_RISING, | 1413 | isp1301_set_bits(isp, ISP1301_INTERRUPT_RISING, |
| @@ -1499,7 +1527,8 @@ isp1301_start_hnp(struct otg_transceiver *dev) | |||
| 1499 | 1527 | ||
| 1500 | /*-------------------------------------------------------------------------*/ | 1528 | /*-------------------------------------------------------------------------*/ |
| 1501 | 1529 | ||
| 1502 | static int __init isp1301_probe(struct i2c_client *i2c) | 1530 | static int __init |
| 1531 | isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) | ||
| 1503 | { | 1532 | { |
| 1504 | int status; | 1533 | int status; |
| 1505 | struct isp1301 *isp; | 1534 | struct isp1301 *isp; |
| @@ -1647,7 +1676,7 @@ module_init(isp_init); | |||
| 1647 | static void __exit isp_exit(void) | 1676 | static void __exit isp_exit(void) |
| 1648 | { | 1677 | { |
| 1649 | if (the_transceiver) | 1678 | if (the_transceiver) |
| 1650 | otg_set_transceiver(0); | 1679 | otg_set_transceiver(NULL); |
| 1651 | i2c_del_driver(&isp1301_driver); | 1680 | i2c_del_driver(&isp1301_driver); |
| 1652 | } | 1681 | } |
| 1653 | module_exit(isp_exit); | 1682 | module_exit(isp_exit); |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 5a485c22660a..c6a63f46bc15 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -631,7 +631,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
| 631 | 631 | ||
| 632 | /* detach any active clients. This must be done first, because | 632 | /* detach any active clients. This must be done first, because |
| 633 | * it can fail; in which case we give up. */ | 633 | * it can fail; in which case we give up. */ |
| 634 | list_for_each_entry_safe(client, _n, &adap->clients, list) { | 634 | list_for_each_entry_safe_reverse(client, _n, &adap->clients, list) { |
| 635 | struct i2c_driver *driver; | 635 | struct i2c_driver *driver; |
| 636 | 636 | ||
| 637 | driver = client->driver; | 637 | driver = client->driver; |
diff --git a/drivers/ide/icside.c b/drivers/ide/icside.c index 2d848010499d..81f70caeb40f 100644 --- a/drivers/ide/icside.c +++ b/drivers/ide/icside.c | |||
| @@ -419,7 +419,7 @@ static void icside_setup_ports(hw_regs_t *hw, void __iomem *base, | |||
| 419 | hw->chipset = ide_acorn; | 419 | hw->chipset = ide_acorn; |
| 420 | } | 420 | } |
| 421 | 421 | ||
| 422 | static int __init | 422 | static int __devinit |
| 423 | icside_register_v5(struct icside_state *state, struct expansion_card *ec) | 423 | icside_register_v5(struct icside_state *state, struct expansion_card *ec) |
| 424 | { | 424 | { |
| 425 | void __iomem *base; | 425 | void __iomem *base; |
| @@ -473,7 +473,7 @@ static const struct ide_port_info icside_v6_port_info __initdata = { | |||
| 473 | .swdma_mask = ATA_SWDMA2, | 473 | .swdma_mask = ATA_SWDMA2, |
| 474 | }; | 474 | }; |
| 475 | 475 | ||
| 476 | static int __init | 476 | static int __devinit |
| 477 | icside_register_v6(struct icside_state *state, struct expansion_card *ec) | 477 | icside_register_v6(struct icside_state *state, struct expansion_card *ec) |
| 478 | { | 478 | { |
| 479 | void __iomem *ioc_base, *easi_base; | 479 | void __iomem *ioc_base, *easi_base; |
diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c index 6790e975a98c..bc4e40f3ede7 100644 --- a/drivers/input/ff-memless.c +++ b/drivers/input/ff-memless.c | |||
| @@ -397,8 +397,9 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) | |||
| 397 | { | 397 | { |
| 398 | struct ml_device *ml = dev->ff->private; | 398 | struct ml_device *ml = dev->ff->private; |
| 399 | struct ml_effect_state *state = &ml->states[effect_id]; | 399 | struct ml_effect_state *state = &ml->states[effect_id]; |
| 400 | unsigned long flags; | ||
| 400 | 401 | ||
| 401 | spin_lock_bh(&ml->timer_lock); | 402 | spin_lock_irqsave(&ml->timer_lock, flags); |
| 402 | 403 | ||
| 403 | if (value > 0) { | 404 | if (value > 0) { |
| 404 | debug("initiated play"); | 405 | debug("initiated play"); |
| @@ -424,7 +425,7 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) | |||
| 424 | ml_play_effects(ml); | 425 | ml_play_effects(ml); |
| 425 | } | 426 | } |
| 426 | 427 | ||
| 427 | spin_unlock_bh(&ml->timer_lock); | 428 | spin_unlock_irqrestore(&ml->timer_lock, flags); |
| 428 | 429 | ||
| 429 | return 0; | 430 | return 0; |
| 430 | } | 431 | } |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 22016ca15351..379b7ff354ec 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
| @@ -824,7 +824,7 @@ static void atkbd_disconnect(struct serio *serio) | |||
| 824 | atkbd_disable(atkbd); | 824 | atkbd_disable(atkbd); |
| 825 | 825 | ||
| 826 | /* make sure we don't have a command in flight */ | 826 | /* make sure we don't have a command in flight */ |
| 827 | flush_scheduled_work(); | 827 | cancel_delayed_work_sync(&atkbd->event_work); |
| 828 | 828 | ||
| 829 | sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); | 829 | sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); |
| 830 | input_unregister_device(atkbd->dev); | 830 | input_unregister_device(atkbd->dev); |
| @@ -868,6 +868,22 @@ static void atkbd_hp_keymap_fixup(struct atkbd *atkbd) | |||
| 868 | } | 868 | } |
| 869 | 869 | ||
| 870 | /* | 870 | /* |
| 871 | * Inventec system with broken key release on volume keys | ||
| 872 | */ | ||
| 873 | static void atkbd_inventec_keymap_fixup(struct atkbd *atkbd) | ||
| 874 | { | ||
| 875 | const unsigned int forced_release_keys[] = { | ||
| 876 | 0xae, 0xb0, | ||
| 877 | }; | ||
| 878 | int i; | ||
| 879 | |||
| 880 | if (atkbd->set == 2) | ||
| 881 | for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) | ||
| 882 | __set_bit(forced_release_keys[i], | ||
| 883 | atkbd->force_release_mask); | ||
| 884 | } | ||
| 885 | |||
| 886 | /* | ||
| 871 | * atkbd_set_keycode_table() initializes keyboard's keycode table | 887 | * atkbd_set_keycode_table() initializes keyboard's keycode table |
| 872 | * according to the selected scancode set | 888 | * according to the selected scancode set |
| 873 | */ | 889 | */ |
| @@ -1468,6 +1484,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
| 1468 | .callback = atkbd_setup_fixup, | 1484 | .callback = atkbd_setup_fixup, |
| 1469 | .driver_data = atkbd_hp_keymap_fixup, | 1485 | .driver_data = atkbd_hp_keymap_fixup, |
| 1470 | }, | 1486 | }, |
| 1487 | { | ||
| 1488 | .ident = "Inventec Symphony", | ||
| 1489 | .matches = { | ||
| 1490 | DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), | ||
| 1491 | DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), | ||
| 1492 | }, | ||
| 1493 | .callback = atkbd_setup_fixup, | ||
| 1494 | .driver_data = atkbd_inventec_keymap_fixup, | ||
| 1495 | }, | ||
| 1471 | { } | 1496 | { } |
| 1472 | }; | 1497 | }; |
| 1473 | 1498 | ||
diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c index bce160f4349b..86457feccfc4 100644 --- a/drivers/input/misc/cm109.c +++ b/drivers/input/misc/cm109.c | |||
| @@ -42,7 +42,7 @@ | |||
| 42 | 42 | ||
| 43 | static char *phone = "kip1000"; | 43 | static char *phone = "kip1000"; |
| 44 | module_param(phone, charp, S_IRUSR); | 44 | module_param(phone, charp, S_IRUSR); |
| 45 | MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01}"); | 45 | MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01, atcom}"); |
| 46 | 46 | ||
| 47 | enum { | 47 | enum { |
| 48 | /* HID Registers */ | 48 | /* HID Registers */ |
| @@ -258,6 +258,37 @@ static unsigned short keymap_usbph01(int scancode) | |||
| 258 | } | 258 | } |
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | /* | ||
| 262 | * Keymap for ATCom AU-100 | ||
| 263 | * http://www.atcom.cn/En_products_AU100.html | ||
| 264 | * http://www.packetizer.com/products/au100/ | ||
| 265 | * http://www.voip-info.org/wiki/view/AU-100 | ||
| 266 | * | ||
| 267 | * Contributed by daniel@gimpelevich.san-francisco.ca.us | ||
| 268 | */ | ||
| 269 | static unsigned short keymap_atcom(int scancode) | ||
| 270 | { | ||
| 271 | switch (scancode) { /* phone key: */ | ||
| 272 | case 0x82: return KEY_NUMERIC_0; /* 0 */ | ||
| 273 | case 0x11: return KEY_NUMERIC_1; /* 1 */ | ||
| 274 | case 0x12: return KEY_NUMERIC_2; /* 2 */ | ||
| 275 | case 0x14: return KEY_NUMERIC_3; /* 3 */ | ||
| 276 | case 0x21: return KEY_NUMERIC_4; /* 4 */ | ||
| 277 | case 0x22: return KEY_NUMERIC_5; /* 5 */ | ||
| 278 | case 0x24: return KEY_NUMERIC_6; /* 6 */ | ||
| 279 | case 0x41: return KEY_NUMERIC_7; /* 7 */ | ||
| 280 | case 0x42: return KEY_NUMERIC_8; /* 8 */ | ||
| 281 | case 0x44: return KEY_NUMERIC_9; /* 9 */ | ||
| 282 | case 0x84: return KEY_NUMERIC_POUND; /* # */ | ||
| 283 | case 0x81: return KEY_NUMERIC_STAR; /* * */ | ||
| 284 | case 0x18: return KEY_ENTER; /* pickup */ | ||
| 285 | case 0x28: return KEY_ESC; /* hangup */ | ||
| 286 | case 0x48: return KEY_LEFT; /* left arrow */ | ||
| 287 | case 0x88: return KEY_RIGHT; /* right arrow */ | ||
| 288 | default: return special_keymap(scancode); | ||
| 289 | } | ||
| 290 | } | ||
| 291 | |||
| 261 | static unsigned short (*keymap)(int) = keymap_kip1000; | 292 | static unsigned short (*keymap)(int) = keymap_kip1000; |
| 262 | 293 | ||
| 263 | /* | 294 | /* |
| @@ -840,6 +871,10 @@ static int __init cm109_select_keymap(void) | |||
| 840 | keymap = keymap_usbph01; | 871 | keymap = keymap_usbph01; |
| 841 | printk(KERN_INFO KBUILD_MODNAME ": " | 872 | printk(KERN_INFO KBUILD_MODNAME ": " |
| 842 | "Keymap for Allied-Telesis Corega USBPH01 phone loaded\n"); | 873 | "Keymap for Allied-Telesis Corega USBPH01 phone loaded\n"); |
| 874 | } else if (!strcasecmp(phone, "atcom")) { | ||
| 875 | keymap = keymap_atcom; | ||
| 876 | printk(KERN_INFO KBUILD_MODNAME ": " | ||
| 877 | "Keymap for ATCom AU-100 phone loaded\n"); | ||
| 843 | } else { | 878 | } else { |
| 844 | printk(KERN_ERR KBUILD_MODNAME ": " | 879 | printk(KERN_ERR KBUILD_MODNAME ": " |
| 845 | "Unsupported phone: %s\n", phone); | 880 | "Unsupported phone: %s\n", phone); |
diff --git a/drivers/input/mouse/hgpk.c b/drivers/input/mouse/hgpk.c index e82d34201e97..88f04bf2ad6c 100644 --- a/drivers/input/mouse/hgpk.c +++ b/drivers/input/mouse/hgpk.c | |||
| @@ -125,7 +125,7 @@ static void hgpk_spewing_hack(struct psmouse *psmouse, | |||
| 125 | */ | 125 | */ |
| 126 | static int hgpk_validate_byte(unsigned char *packet) | 126 | static int hgpk_validate_byte(unsigned char *packet) |
| 127 | { | 127 | { |
| 128 | return (packet[0] & 0x0C) == 0x08; | 128 | return (packet[0] & 0x0C) != 0x08; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | static void hgpk_process_packet(struct psmouse *psmouse) | 131 | static void hgpk_process_packet(struct psmouse *psmouse) |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index eec375cd10e6..29e686388a2c 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -337,6 +337,20 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
| 337 | DMI_MATCH(DMI_PRODUCT_NAME, "2656"), | 337 | DMI_MATCH(DMI_PRODUCT_NAME, "2656"), |
| 338 | }, | 338 | }, |
| 339 | }, | 339 | }, |
| 340 | { | ||
| 341 | .ident = "Dell XPS M1530", | ||
| 342 | .matches = { | ||
| 343 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 344 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), | ||
| 345 | }, | ||
| 346 | }, | ||
| 347 | { | ||
| 348 | .ident = "Compal HEL80I", | ||
| 349 | .matches = { | ||
| 350 | DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), | ||
| 351 | DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), | ||
| 352 | }, | ||
| 353 | }, | ||
| 340 | { } | 354 | { } |
| 341 | }; | 355 | }; |
| 342 | 356 | ||
diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h index ca62ec639f8f..677680e9f54f 100644 --- a/drivers/input/tablet/wacom.h +++ b/drivers/input/tablet/wacom.h | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | * - Support Intuos3 4x6 | 66 | * - Support Intuos3 4x6 |
| 67 | * v1.47 (pc) - Added support for Bamboo | 67 | * v1.47 (pc) - Added support for Bamboo |
| 68 | * v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX | 68 | * v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX |
| 69 | * v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A) | ||
| 69 | */ | 70 | */ |
| 70 | 71 | ||
| 71 | /* | 72 | /* |
| @@ -86,7 +87,7 @@ | |||
| 86 | /* | 87 | /* |
| 87 | * Version Information | 88 | * Version Information |
| 88 | */ | 89 | */ |
| 89 | #define DRIVER_VERSION "v1.48" | 90 | #define DRIVER_VERSION "v1.49" |
| 90 | #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" | 91 | #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" |
| 91 | #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" | 92 | #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" |
| 92 | #define DRIVER_LICENSE "GPL" | 93 | #define DRIVER_LICENSE "GPL" |
| @@ -103,15 +104,15 @@ struct wacom { | |||
| 103 | struct usb_device *usbdev; | 104 | struct usb_device *usbdev; |
| 104 | struct usb_interface *intf; | 105 | struct usb_interface *intf; |
| 105 | struct urb *irq; | 106 | struct urb *irq; |
| 106 | struct wacom_wac * wacom_wac; | 107 | struct wacom_wac *wacom_wac; |
| 107 | struct mutex lock; | 108 | struct mutex lock; |
| 108 | unsigned int open:1; | 109 | unsigned int open:1; |
| 109 | char phys[32]; | 110 | char phys[32]; |
| 110 | }; | 111 | }; |
| 111 | 112 | ||
| 112 | struct wacom_combo { | 113 | struct wacom_combo { |
| 113 | struct wacom * wacom; | 114 | struct wacom *wacom; |
| 114 | struct urb * urb; | 115 | struct urb *urb; |
| 115 | }; | 116 | }; |
| 116 | 117 | ||
| 117 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); | 118 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); |
| @@ -132,7 +133,7 @@ extern void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wa | |||
| 132 | extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac); | 133 | extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac); |
| 133 | extern __u16 wacom_le16_to_cpu(unsigned char *data); | 134 | extern __u16 wacom_le16_to_cpu(unsigned char *data); |
| 134 | extern __u16 wacom_be16_to_cpu(unsigned char *data); | 135 | extern __u16 wacom_be16_to_cpu(unsigned char *data); |
| 135 | extern struct wacom_features * get_wacom_feature(const struct usb_device_id *id); | 136 | extern struct wacom_features *get_wacom_feature(const struct usb_device_id *id); |
| 136 | extern const struct usb_device_id * get_device_table(void); | 137 | extern const struct usb_device_id *get_device_table(void); |
| 137 | 138 | ||
| 138 | #endif | 139 | #endif |
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 09e227aa0d49..484496daa0f3 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
| @@ -14,8 +14,41 @@ | |||
| 14 | #include "wacom.h" | 14 | #include "wacom.h" |
| 15 | #include "wacom_wac.h" | 15 | #include "wacom_wac.h" |
| 16 | 16 | ||
| 17 | /* defines to get HID report descriptor */ | ||
| 18 | #define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01) | ||
| 19 | #define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02) | ||
| 20 | #define HID_USAGE_UNDEFINED 0x00 | ||
| 21 | #define HID_USAGE_PAGE 0x05 | ||
| 22 | #define HID_USAGE_PAGE_DIGITIZER 0x0d | ||
| 23 | #define HID_USAGE_PAGE_DESKTOP 0x01 | ||
| 24 | #define HID_USAGE 0x09 | ||
| 25 | #define HID_USAGE_X 0x30 | ||
| 26 | #define HID_USAGE_Y 0x31 | ||
| 27 | #define HID_USAGE_X_TILT 0x3d | ||
| 28 | #define HID_USAGE_Y_TILT 0x3e | ||
| 29 | #define HID_USAGE_FINGER 0x22 | ||
| 30 | #define HID_USAGE_STYLUS 0x20 | ||
| 31 | #define HID_COLLECTION 0xc0 | ||
| 32 | |||
| 33 | enum { | ||
| 34 | WCM_UNDEFINED = 0, | ||
| 35 | WCM_DESKTOP, | ||
| 36 | WCM_DIGITIZER, | ||
| 37 | }; | ||
| 38 | |||
| 39 | struct hid_descriptor { | ||
| 40 | struct usb_descriptor_header header; | ||
| 41 | __le16 bcdHID; | ||
| 42 | u8 bCountryCode; | ||
| 43 | u8 bNumDescriptors; | ||
| 44 | u8 bDescriptorType; | ||
| 45 | __le16 wDescriptorLength; | ||
| 46 | } __attribute__ ((packed)); | ||
| 47 | |||
| 48 | /* defines to get/set USB message */ | ||
| 17 | #define USB_REQ_GET_REPORT 0x01 | 49 | #define USB_REQ_GET_REPORT 0x01 |
| 18 | #define USB_REQ_SET_REPORT 0x09 | 50 | #define USB_REQ_SET_REPORT 0x09 |
| 51 | #define WAC_HID_FEATURE_REPORT 0x03 | ||
| 19 | 52 | ||
| 20 | static int usb_get_report(struct usb_interface *intf, unsigned char type, | 53 | static int usb_get_report(struct usb_interface *intf, unsigned char type, |
| 21 | unsigned char id, void *buf, int size) | 54 | unsigned char id, void *buf, int size) |
| @@ -80,25 +113,21 @@ static void wacom_sys_irq(struct urb *urb) | |||
| 80 | void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) | 113 | void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) |
| 81 | { | 114 | { |
| 82 | input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data); | 115 | input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data); |
| 83 | return; | ||
| 84 | } | 116 | } |
| 85 | 117 | ||
| 86 | void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data) | 118 | void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data) |
| 87 | { | 119 | { |
| 88 | input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data); | 120 | input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data); |
| 89 | return; | ||
| 90 | } | 121 | } |
| 91 | 122 | ||
| 92 | void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data) | 123 | void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data) |
| 93 | { | 124 | { |
| 94 | input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data); | 125 | input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data); |
| 95 | return; | ||
| 96 | } | 126 | } |
| 97 | 127 | ||
| 98 | void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value) | 128 | void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value) |
| 99 | { | 129 | { |
| 100 | input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value); | 130 | input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value); |
| 101 | return; | ||
| 102 | } | 131 | } |
| 103 | 132 | ||
| 104 | __u16 wacom_be16_to_cpu(unsigned char *data) | 133 | __u16 wacom_be16_to_cpu(unsigned char *data) |
| @@ -118,7 +147,6 @@ __u16 wacom_le16_to_cpu(unsigned char *data) | |||
| 118 | void wacom_input_sync(void *wcombo) | 147 | void wacom_input_sync(void *wcombo) |
| 119 | { | 148 | { |
| 120 | input_sync(get_input_dev((struct wacom_combo *)wcombo)); | 149 | input_sync(get_input_dev((struct wacom_combo *)wcombo)); |
| 121 | return; | ||
| 122 | } | 150 | } |
| 123 | 151 | ||
| 124 | static int wacom_open(struct input_dev *dev) | 152 | static int wacom_open(struct input_dev *dev) |
| @@ -160,7 +188,7 @@ static void wacom_close(struct input_dev *dev) | |||
| 160 | 188 | ||
| 161 | void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 189 | void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 162 | { | 190 | { |
| 163 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_1) | | 191 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_1) | |
| 164 | BIT_MASK(BTN_5); | 192 | BIT_MASK(BTN_5); |
| 165 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); | 193 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); |
| 166 | } | 194 | } |
| @@ -170,7 +198,7 @@ void input_dev_g4(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 170 | input_dev->evbit[0] |= BIT_MASK(EV_MSC); | 198 | input_dev->evbit[0] |= BIT_MASK(EV_MSC); |
| 171 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); | 199 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); |
| 172 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); | 200 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); |
| 173 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) | | 201 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | |
| 174 | BIT_MASK(BTN_4); | 202 | BIT_MASK(BTN_4); |
| 175 | } | 203 | } |
| 176 | 204 | ||
| @@ -178,7 +206,7 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 178 | { | 206 | { |
| 179 | input_dev->evbit[0] |= BIT_MASK(EV_REL); | 207 | input_dev->evbit[0] |= BIT_MASK(EV_REL); |
| 180 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); | 208 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); |
| 181 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) | | 209 | input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | |
| 182 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); | 210 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); |
| 183 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | | 211 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | |
| 184 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); | 212 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); |
| @@ -188,7 +216,7 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 188 | void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 216 | void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 189 | { | 217 | { |
| 190 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); | 218 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); |
| 191 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) | | 219 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | |
| 192 | BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); | 220 | BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); |
| 193 | input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); | 221 | input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); |
| 194 | input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); | 222 | input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); |
| @@ -196,14 +224,14 @@ void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 196 | 224 | ||
| 197 | void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 225 | void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 198 | { | 226 | { |
| 199 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_4) | | 227 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_4) | |
| 200 | BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7); | 228 | BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7); |
| 201 | input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); | 229 | input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); |
| 202 | } | 230 | } |
| 203 | 231 | ||
| 204 | void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 232 | void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 205 | { | 233 | { |
| 206 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); | 234 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); |
| 207 | } | 235 | } |
| 208 | 236 | ||
| 209 | void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 237 | void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| @@ -211,7 +239,7 @@ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 211 | input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL); | 239 | input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL); |
| 212 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); | 240 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); |
| 213 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); | 241 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); |
| 214 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) | | 242 | input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | |
| 215 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) | | 243 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) | |
| 216 | BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); | 244 | BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); |
| 217 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | | 245 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | |
| @@ -228,8 +256,7 @@ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 228 | 256 | ||
| 229 | void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 257 | void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 230 | { | 258 | { |
| 231 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2) | | 259 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2); |
| 232 | BIT_MASK(BTN_TOOL_RUBBER); | ||
| 233 | } | 260 | } |
| 234 | 261 | ||
| 235 | void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 262 | void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| @@ -237,15 +264,129 @@ void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 237 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); | 264 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); |
| 238 | } | 265 | } |
| 239 | 266 | ||
| 267 | static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc, | ||
| 268 | struct wacom_wac *wacom_wac) | ||
| 269 | { | ||
| 270 | struct usb_device *dev = interface_to_usbdev(intf); | ||
| 271 | struct wacom_features *features = wacom_wac->features; | ||
| 272 | char limit = 0, result = 0; | ||
| 273 | int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; | ||
| 274 | unsigned char *report; | ||
| 275 | |||
| 276 | report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); | ||
| 277 | if (!report) | ||
| 278 | return -ENOMEM; | ||
| 279 | |||
| 280 | /* retrive report descriptors */ | ||
| 281 | do { | ||
| 282 | result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), | ||
| 283 | USB_REQ_GET_DESCRIPTOR, | ||
| 284 | USB_RECIP_INTERFACE | USB_DIR_IN, | ||
| 285 | HID_DEVICET_REPORT << 8, | ||
| 286 | intf->altsetting[0].desc.bInterfaceNumber, /* interface */ | ||
| 287 | report, | ||
| 288 | hid_desc->wDescriptorLength, | ||
| 289 | 5000); /* 5 secs */ | ||
| 290 | } while (result < 0 && limit++ < 5); | ||
| 291 | |||
| 292 | if (result < 0) | ||
| 293 | goto out; | ||
| 294 | |||
| 295 | for (i = 0; i < hid_desc->wDescriptorLength; i++) { | ||
| 296 | |||
| 297 | switch (report[i]) { | ||
| 298 | case HID_USAGE_PAGE: | ||
| 299 | switch (report[i + 1]) { | ||
| 300 | case HID_USAGE_PAGE_DIGITIZER: | ||
| 301 | usage = WCM_DIGITIZER; | ||
| 302 | i++; | ||
| 303 | break; | ||
| 304 | |||
| 305 | case HID_USAGE_PAGE_DESKTOP: | ||
| 306 | usage = WCM_DESKTOP; | ||
| 307 | i++; | ||
| 308 | break; | ||
| 309 | } | ||
| 310 | break; | ||
| 311 | |||
| 312 | case HID_USAGE: | ||
| 313 | switch (report[i + 1]) { | ||
| 314 | case HID_USAGE_X: | ||
| 315 | if (usage == WCM_DESKTOP) { | ||
| 316 | if (finger) { | ||
| 317 | features->touch_x_max = | ||
| 318 | features->touch_y_max = | ||
| 319 | wacom_le16_to_cpu(&report[i + 3]); | ||
| 320 | features->x_max = | ||
| 321 | wacom_le16_to_cpu(&report[i + 6]); | ||
| 322 | i += 7; | ||
| 323 | } else if (pen) { | ||
| 324 | features->x_max = | ||
| 325 | wacom_le16_to_cpu(&report[i + 3]); | ||
| 326 | i += 4; | ||
| 327 | } | ||
| 328 | } else if (usage == WCM_DIGITIZER) { | ||
| 329 | /* max pressure isn't reported | ||
| 330 | features->pressure_max = (unsigned short) | ||
| 331 | (report[i+4] << 8 | report[i + 3]); | ||
| 332 | */ | ||
| 333 | features->pressure_max = 255; | ||
| 334 | i += 4; | ||
| 335 | } | ||
| 336 | break; | ||
| 337 | |||
| 338 | case HID_USAGE_Y: | ||
| 339 | if (usage == WCM_DESKTOP) | ||
| 340 | features->y_max = | ||
| 341 | wacom_le16_to_cpu(&report[i + 3]); | ||
| 342 | i += 4; | ||
| 343 | break; | ||
| 344 | |||
| 345 | case HID_USAGE_FINGER: | ||
| 346 | finger = 1; | ||
| 347 | i++; | ||
| 348 | break; | ||
| 349 | |||
| 350 | case HID_USAGE_STYLUS: | ||
| 351 | pen = 1; | ||
| 352 | i++; | ||
| 353 | break; | ||
| 354 | |||
| 355 | case HID_USAGE_UNDEFINED: | ||
| 356 | if (usage == WCM_DESKTOP && finger) /* capacity */ | ||
| 357 | features->pressure_max = | ||
| 358 | wacom_le16_to_cpu(&report[i + 3]); | ||
| 359 | i += 4; | ||
| 360 | break; | ||
| 361 | } | ||
| 362 | break; | ||
| 363 | |||
| 364 | case HID_COLLECTION: | ||
| 365 | /* reset UsagePage ans Finger */ | ||
| 366 | finger = usage = 0; | ||
| 367 | break; | ||
| 368 | } | ||
| 369 | } | ||
| 370 | |||
| 371 | result = 0; | ||
| 372 | |||
| 373 | out: | ||
| 374 | kfree(report); | ||
| 375 | return result; | ||
| 376 | } | ||
| 377 | |||
| 240 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) | 378 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) |
| 241 | { | 379 | { |
| 242 | struct usb_device *dev = interface_to_usbdev(intf); | 380 | struct usb_device *dev = interface_to_usbdev(intf); |
| 381 | struct usb_host_interface *interface = intf->cur_altsetting; | ||
| 243 | struct usb_endpoint_descriptor *endpoint; | 382 | struct usb_endpoint_descriptor *endpoint; |
| 244 | struct wacom *wacom; | 383 | struct wacom *wacom; |
| 245 | struct wacom_wac *wacom_wac; | 384 | struct wacom_wac *wacom_wac; |
| 385 | struct wacom_features *features; | ||
| 246 | struct input_dev *input_dev; | 386 | struct input_dev *input_dev; |
| 247 | int error = -ENOMEM; | 387 | int error = -ENOMEM; |
| 248 | char rep_data[2], limit = 0; | 388 | char rep_data[2], limit = 0; |
| 389 | struct hid_descriptor *hid_desc; | ||
| 249 | 390 | ||
| 250 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); | 391 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); |
| 251 | wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); | 392 | wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); |
| @@ -268,8 +409,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 268 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); | 409 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); |
| 269 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); | 410 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); |
| 270 | 411 | ||
| 271 | wacom_wac->features = get_wacom_feature(id); | 412 | wacom_wac->features = features = get_wacom_feature(id); |
| 272 | BUG_ON(wacom_wac->features->pktlen > 10); | 413 | BUG_ON(features->pktlen > 10); |
| 273 | 414 | ||
| 274 | input_dev->name = wacom_wac->features->name; | 415 | input_dev->name = wacom_wac->features->name; |
| 275 | wacom->wacom_wac = wacom_wac; | 416 | wacom->wacom_wac = wacom_wac; |
| @@ -282,18 +423,37 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 282 | input_dev->open = wacom_open; | 423 | input_dev->open = wacom_open; |
| 283 | input_dev->close = wacom_close; | 424 | input_dev->close = wacom_close; |
| 284 | 425 | ||
| 426 | endpoint = &intf->cur_altsetting->endpoint[0].desc; | ||
| 427 | |||
| 428 | /* TabletPC need to retrieve the physical and logical maximum from report descriptor */ | ||
| 429 | if (wacom_wac->features->type == TABLETPC) { | ||
| 430 | if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) { | ||
| 431 | if (usb_get_extra_descriptor(&interface->endpoint[0], | ||
| 432 | HID_DEVICET_REPORT, &hid_desc)) { | ||
| 433 | printk("wacom: can not retrive extra class descriptor\n"); | ||
| 434 | goto fail2; | ||
| 435 | } | ||
| 436 | } | ||
| 437 | error = wacom_parse_hid(intf, hid_desc, wacom_wac); | ||
| 438 | if (error) | ||
| 439 | goto fail2; | ||
| 440 | } | ||
| 441 | |||
| 285 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | 442 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); |
| 286 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | | 443 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | |
| 287 | BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS); | 444 | BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS); |
| 288 | input_set_abs_params(input_dev, ABS_X, 0, wacom_wac->features->x_max, 4, 0); | 445 | input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0); |
| 289 | input_set_abs_params(input_dev, ABS_Y, 0, wacom_wac->features->y_max, 4, 0); | 446 | input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0); |
| 290 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom_wac->features->pressure_max, 0, 0); | 447 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0); |
| 448 | if (features->type == TABLETPC) { | ||
| 449 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_DOUBLETAP); | ||
| 450 | input_set_abs_params(input_dev, ABS_RX, 0, features->touch_x_max, 4, 0); | ||
| 451 | input_set_abs_params(input_dev, ABS_RY, 0, features->touch_y_max, 4, 0); | ||
| 452 | } | ||
| 291 | input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC); | 453 | input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC); |
| 292 | 454 | ||
| 293 | wacom_init_input_dev(input_dev, wacom_wac); | 455 | wacom_init_input_dev(input_dev, wacom_wac); |
| 294 | 456 | ||
| 295 | endpoint = &intf->cur_altsetting->endpoint[0].desc; | ||
| 296 | |||
| 297 | usb_fill_int_urb(wacom->irq, dev, | 457 | usb_fill_int_urb(wacom->irq, dev, |
| 298 | usb_rcvintpipe(dev, endpoint->bEndpointAddress), | 458 | usb_rcvintpipe(dev, endpoint->bEndpointAddress), |
| 299 | wacom_wac->data, wacom_wac->features->pktlen, | 459 | wacom_wac->data, wacom_wac->features->pktlen, |
| @@ -305,13 +465,22 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 305 | if (error) | 465 | if (error) |
| 306 | goto fail3; | 466 | goto fail3; |
| 307 | 467 | ||
| 308 | /* Ask the tablet to report tablet data. Repeat until it succeeds */ | 468 | /* |
| 309 | do { | 469 | * Ask the tablet to report tablet data if it is not a Tablet PC. |
| 310 | rep_data[0] = 2; | 470 | * Repeat until it succeeds |
| 311 | rep_data[1] = 2; | 471 | */ |
| 312 | usb_set_report(intf, 3, 2, rep_data, 2); | 472 | if (wacom_wac->features->type != TABLETPC) { |
| 313 | usb_get_report(intf, 3, 2, rep_data, 2); | 473 | do { |
| 314 | } while (rep_data[1] != 2 && limit++ < 5); | 474 | rep_data[0] = 2; |
| 475 | rep_data[1] = 2; | ||
| 476 | error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, | ||
| 477 | 2, rep_data, 2); | ||
| 478 | if (error >= 0) | ||
| 479 | error = usb_get_report(intf, | ||
| 480 | WAC_HID_FEATURE_REPORT, 2, | ||
| 481 | rep_data, 2); | ||
| 482 | } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); | ||
| 483 | } | ||
| 315 | 484 | ||
| 316 | usb_set_intfdata(intf, wacom); | 485 | usb_set_intfdata(intf, wacom); |
| 317 | return 0; | 486 | return 0; |
| @@ -333,7 +502,8 @@ static void wacom_disconnect(struct usb_interface *intf) | |||
| 333 | usb_kill_urb(wacom->irq); | 502 | usb_kill_urb(wacom->irq); |
| 334 | input_unregister_device(wacom->dev); | 503 | input_unregister_device(wacom->dev); |
| 335 | usb_free_urb(wacom->irq); | 504 | usb_free_urb(wacom->irq); |
| 336 | usb_buffer_free(interface_to_usbdev(intf), 10, wacom->wacom_wac->data, wacom->data_dma); | 505 | usb_buffer_free(interface_to_usbdev(intf), 10, |
| 506 | wacom->wacom_wac->data, wacom->data_dma); | ||
| 337 | kfree(wacom->wacom_wac); | 507 | kfree(wacom->wacom_wac); |
| 338 | kfree(wacom); | 508 | kfree(wacom); |
| 339 | } | 509 | } |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index bf3d9a8b2c1b..8dc8d1e59bea 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -535,31 +535,147 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 535 | return 1; | 535 | return 1; |
| 536 | } | 536 | } |
| 537 | 537 | ||
| 538 | int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) | ||
| 539 | { | ||
| 540 | char *data = wacom->data; | ||
| 541 | int prox = 0, pressure; | ||
| 542 | static int stylusInProx, touchInProx = 1, touchOut; | ||
| 543 | struct urb *urb = ((struct wacom_combo *)wcombo)->urb; | ||
| 544 | |||
| 545 | dbg("wacom_tpc_irq: received report #%d", data[0]); | ||
| 546 | |||
| 547 | if (urb->actual_length == 5 || data[0] == 6) { /* Touch data */ | ||
| 548 | if (urb->actual_length == 5) { /* with touch */ | ||
| 549 | prox = data[0] & 0x03; | ||
| 550 | } else { /* with capacity */ | ||
| 551 | prox = data[1] & 0x03; | ||
| 552 | } | ||
| 553 | |||
| 554 | if (!stylusInProx) { /* stylus not in prox */ | ||
| 555 | if (prox) { | ||
| 556 | if (touchInProx) { | ||
| 557 | wacom->tool[1] = BTN_TOOL_DOUBLETAP; | ||
| 558 | wacom->id[0] = TOUCH_DEVICE_ID; | ||
| 559 | if (urb->actual_length != 5) { | ||
| 560 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); | ||
| 561 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | ||
| 562 | wacom_report_abs(wcombo, ABS_PRESSURE, wacom_le16_to_cpu(&data[6])); | ||
| 563 | wacom_report_key(wcombo, BTN_TOUCH, wacom_le16_to_cpu(&data[6])); | ||
| 564 | } else { | ||
| 565 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[1])); | ||
| 566 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[3])); | ||
| 567 | wacom_report_key(wcombo, BTN_TOUCH, 1); | ||
| 568 | } | ||
| 569 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
| 570 | wacom_report_key(wcombo, wacom->tool[1], prox & 0x01); | ||
| 571 | touchOut = 1; | ||
| 572 | return 1; | ||
| 573 | } | ||
| 574 | } else { | ||
| 575 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
| 576 | wacom_report_key(wcombo, wacom->tool[1], prox & 0x01); | ||
| 577 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
| 578 | touchOut = 0; | ||
| 579 | touchInProx = 1; | ||
| 580 | return 1; | ||
| 581 | } | ||
| 582 | } else if (touchOut || !prox) { /* force touch out-prox */ | ||
| 583 | wacom_report_abs(wcombo, ABS_MISC, TOUCH_DEVICE_ID); | ||
| 584 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
| 585 | touchOut = 0; | ||
| 586 | touchInProx = 1; | ||
| 587 | return 1; | ||
| 588 | } | ||
| 589 | } else if (data[0] == 2) { /* Penabled */ | ||
| 590 | prox = data[1] & 0x20; | ||
| 591 | |||
| 592 | touchInProx = 0; | ||
| 593 | |||
| 594 | wacom->id[0] = ERASER_DEVICE_ID; | ||
| 595 | |||
| 596 | /* | ||
| 597 | * if going from out of proximity into proximity select between the eraser | ||
| 598 | * and the pen based on the state of the stylus2 button, choose eraser if | ||
| 599 | * pressed else choose pen. if not a proximity change from out to in, send | ||
| 600 | * an out of proximity for previous tool then a in for new tool. | ||
| 601 | */ | ||
| 602 | if (prox) { /* in prox */ | ||
| 603 | if (!wacom->tool[0]) { | ||
| 604 | /* Going into proximity select tool */ | ||
| 605 | wacom->tool[1] = (data[1] & 0x08) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; | ||
| 606 | if (wacom->tool[1] == BTN_TOOL_PEN) | ||
| 607 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
| 608 | } else if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[1] & 0x08)) { | ||
| 609 | /* | ||
| 610 | * was entered with stylus2 pressed | ||
| 611 | * report out proximity for previous tool | ||
| 612 | */ | ||
| 613 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
| 614 | wacom_report_key(wcombo, wacom->tool[1], 0); | ||
| 615 | wacom_input_sync(wcombo); | ||
| 616 | |||
| 617 | /* set new tool */ | ||
| 618 | wacom->tool[1] = BTN_TOOL_PEN; | ||
| 619 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
| 620 | return 0; | ||
| 621 | } | ||
| 622 | if (wacom->tool[1] != BTN_TOOL_RUBBER) { | ||
| 623 | /* Unknown tool selected default to pen tool */ | ||
| 624 | wacom->tool[1] = BTN_TOOL_PEN; | ||
| 625 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
| 626 | } | ||
| 627 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); | ||
| 628 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10); | ||
| 629 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); | ||
| 630 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | ||
| 631 | pressure = ((data[7] & 0x01) << 8) | data[6]; | ||
| 632 | if (pressure < 0) | ||
| 633 | pressure = wacom->features->pressure_max + pressure + 1; | ||
| 634 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); | ||
| 635 | wacom_report_key(wcombo, BTN_TOUCH, pressure); | ||
| 636 | } else { | ||
| 637 | wacom_report_abs(wcombo, ABS_PRESSURE, 0); | ||
| 638 | wacom_report_key(wcombo, BTN_STYLUS, 0); | ||
| 639 | wacom_report_key(wcombo, BTN_STYLUS2, 0); | ||
| 640 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
| 641 | } | ||
| 642 | wacom_report_key(wcombo, wacom->tool[1], prox); | ||
| 643 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
| 644 | stylusInProx = prox; | ||
| 645 | wacom->tool[0] = prox; | ||
| 646 | return 1; | ||
| 647 | } | ||
| 648 | return 0; | ||
| 649 | } | ||
| 650 | |||
| 538 | int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) | 651 | int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) |
| 539 | { | 652 | { |
| 540 | switch (wacom_wac->features->type) { | 653 | switch (wacom_wac->features->type) { |
| 541 | case PENPARTNER: | 654 | case PENPARTNER: |
| 542 | return (wacom_penpartner_irq(wacom_wac, wcombo)); | 655 | return wacom_penpartner_irq(wacom_wac, wcombo); |
| 543 | break; | 656 | |
| 544 | case PL: | 657 | case PL: |
| 545 | return (wacom_pl_irq(wacom_wac, wcombo)); | 658 | return wacom_pl_irq(wacom_wac, wcombo); |
| 546 | break; | 659 | |
| 547 | case WACOM_G4: | 660 | case WACOM_G4: |
| 548 | case GRAPHIRE: | 661 | case GRAPHIRE: |
| 549 | case WACOM_MO: | 662 | case WACOM_MO: |
| 550 | return (wacom_graphire_irq(wacom_wac, wcombo)); | 663 | return wacom_graphire_irq(wacom_wac, wcombo); |
| 551 | break; | 664 | |
| 552 | case PTU: | 665 | case PTU: |
| 553 | return (wacom_ptu_irq(wacom_wac, wcombo)); | 666 | return wacom_ptu_irq(wacom_wac, wcombo); |
| 554 | break; | 667 | |
| 555 | case INTUOS: | 668 | case INTUOS: |
| 556 | case INTUOS3S: | 669 | case INTUOS3S: |
| 557 | case INTUOS3: | 670 | case INTUOS3: |
| 558 | case INTUOS3L: | 671 | case INTUOS3L: |
| 559 | case CINTIQ: | 672 | case CINTIQ: |
| 560 | case WACOM_BEE: | 673 | case WACOM_BEE: |
| 561 | return (wacom_intuos_irq(wacom_wac, wcombo)); | 674 | return wacom_intuos_irq(wacom_wac, wcombo); |
| 562 | break; | 675 | |
| 676 | case TABLETPC: | ||
| 677 | return wacom_tpc_irq(wacom_wac, wcombo); | ||
| 678 | |||
| 563 | default: | 679 | default: |
| 564 | return 0; | 680 | return 0; |
| 565 | } | 681 | } |
| @@ -586,13 +702,15 @@ void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_w | |||
| 586 | /* fall through */ | 702 | /* fall through */ |
| 587 | case INTUOS3S: | 703 | case INTUOS3S: |
| 588 | input_dev_i3s(input_dev, wacom_wac); | 704 | input_dev_i3s(input_dev, wacom_wac); |
| 705 | /* fall through */ | ||
| 589 | case INTUOS: | 706 | case INTUOS: |
| 590 | input_dev_i(input_dev, wacom_wac); | 707 | input_dev_i(input_dev, wacom_wac); |
| 591 | break; | 708 | break; |
| 592 | case PL: | 709 | case PL: |
| 593 | case PTU: | 710 | case PTU: |
| 711 | case TABLETPC: | ||
| 594 | input_dev_pl(input_dev, wacom_wac); | 712 | input_dev_pl(input_dev, wacom_wac); |
| 595 | break; | 713 | /* fall through */ |
| 596 | case PENPARTNER: | 714 | case PENPARTNER: |
| 597 | input_dev_pt(input_dev, wacom_wac); | 715 | input_dev_pt(input_dev, wacom_wac); |
| 598 | break; | 716 | break; |
| @@ -611,6 +729,7 @@ static struct wacom_features wacom_features[] = { | |||
| 611 | { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 63, WACOM_G4 }, | 729 | { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 63, WACOM_G4 }, |
| 612 | { "Wacom BambooFun 4x5", 9, 14760, 9225, 511, 63, WACOM_MO }, | 730 | { "Wacom BambooFun 4x5", 9, 14760, 9225, 511, 63, WACOM_MO }, |
| 613 | { "Wacom BambooFun 6x8", 9, 21648, 13530, 511, 63, WACOM_MO }, | 731 | { "Wacom BambooFun 6x8", 9, 21648, 13530, 511, 63, WACOM_MO }, |
| 732 | { "Wacom Bamboo1 Medium",8, 16704, 12064, 511, 63, GRAPHIRE }, | ||
| 614 | { "Wacom Volito", 8, 5104, 3712, 511, 63, GRAPHIRE }, | 733 | { "Wacom Volito", 8, 5104, 3712, 511, 63, GRAPHIRE }, |
| 615 | { "Wacom PenStation2", 8, 3250, 2320, 255, 63, GRAPHIRE }, | 734 | { "Wacom PenStation2", 8, 3250, 2320, 255, 63, GRAPHIRE }, |
| 616 | { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 63, GRAPHIRE }, | 735 | { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 63, GRAPHIRE }, |
| @@ -650,6 +769,10 @@ static struct wacom_features wacom_features[] = { | |||
| 650 | { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 63, CINTIQ }, | 769 | { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 63, CINTIQ }, |
| 651 | { "Wacom Cintiq 20WSX", 10, 86680, 54180, 1023, 63, WACOM_BEE }, | 770 | { "Wacom Cintiq 20WSX", 10, 86680, 54180, 1023, 63, WACOM_BEE }, |
| 652 | { "Wacom Cintiq 12WX", 10, 53020, 33440, 1023, 63, WACOM_BEE }, | 771 | { "Wacom Cintiq 12WX", 10, 53020, 33440, 1023, 63, WACOM_BEE }, |
| 772 | { "Wacom DTU1931", 8, 37832, 30305, 511, 0, PL }, | ||
| 773 | { "Wacom ISDv4 90", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
| 774 | { "Wacom ISDv4 93", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
| 775 | { "Wacom ISDv4 9A", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
| 653 | { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 31, INTUOS }, | 776 | { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 31, INTUOS }, |
| 654 | { } | 777 | { } |
| 655 | }; | 778 | }; |
| @@ -665,6 +788,7 @@ static struct usb_device_id wacom_ids[] = { | |||
| 665 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) }, | 788 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) }, |
| 666 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) }, | 789 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) }, |
| 667 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) }, | 790 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) }, |
| 791 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x19) }, | ||
| 668 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) }, | 792 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) }, |
| 669 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) }, | 793 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) }, |
| 670 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) }, | 794 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) }, |
| @@ -704,18 +828,26 @@ static struct usb_device_id wacom_ids[] = { | |||
| 704 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, | 828 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, |
| 705 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) }, | 829 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) }, |
| 706 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) }, | 830 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) }, |
| 831 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC7) }, | ||
| 832 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x90) }, | ||
| 833 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x93) }, | ||
| 834 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x9A) }, | ||
| 707 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, | 835 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, |
| 708 | { } | 836 | { } |
| 709 | }; | 837 | }; |
| 710 | 838 | ||
| 711 | const struct usb_device_id * get_device_table(void) { | 839 | const struct usb_device_id *get_device_table(void) |
| 712 | const struct usb_device_id * id_table = wacom_ids; | 840 | { |
| 841 | const struct usb_device_id *id_table = wacom_ids; | ||
| 842 | |||
| 713 | return id_table; | 843 | return id_table; |
| 714 | } | 844 | } |
| 715 | 845 | ||
| 716 | struct wacom_features * get_wacom_feature(const struct usb_device_id * id) { | 846 | struct wacom_features * get_wacom_feature(const struct usb_device_id *id) |
| 847 | { | ||
| 717 | int index = id - wacom_ids; | 848 | int index = id - wacom_ids; |
| 718 | struct wacom_features *wf = &wacom_features[index]; | 849 | struct wacom_features *wf = &wacom_features[index]; |
| 850 | |||
| 719 | return wf; | 851 | return wf; |
| 720 | } | 852 | } |
| 721 | 853 | ||
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index 3342bc05847d..f9c8b69673b7 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #define WACOM_WAC_H | 10 | #define WACOM_WAC_H |
| 11 | 11 | ||
| 12 | #define STYLUS_DEVICE_ID 0x02 | 12 | #define STYLUS_DEVICE_ID 0x02 |
| 13 | #define TOUCH_DEVICE_ID 0x03 | ||
| 13 | #define CURSOR_DEVICE_ID 0x06 | 14 | #define CURSOR_DEVICE_ID 0x06 |
| 14 | #define ERASER_DEVICE_ID 0x0A | 15 | #define ERASER_DEVICE_ID 0x0A |
| 15 | #define PAD_DEVICE_ID 0x0F | 16 | #define PAD_DEVICE_ID 0x0F |
| @@ -27,6 +28,7 @@ enum { | |||
| 27 | CINTIQ, | 28 | CINTIQ, |
| 28 | WACOM_BEE, | 29 | WACOM_BEE, |
| 29 | WACOM_MO, | 30 | WACOM_MO, |
| 31 | TABLETPC, | ||
| 30 | MAX_TYPE | 32 | MAX_TYPE |
| 31 | }; | 33 | }; |
| 32 | 34 | ||
| @@ -38,6 +40,8 @@ struct wacom_features { | |||
| 38 | int pressure_max; | 40 | int pressure_max; |
| 39 | int distance_max; | 41 | int distance_max; |
| 40 | int type; | 42 | int type; |
| 43 | int touch_x_max; | ||
| 44 | int touch_y_max; | ||
| 41 | }; | 45 | }; |
| 42 | 46 | ||
| 43 | struct wacom_wac { | 47 | struct wacom_wac { |
diff --git a/drivers/input/touchscreen/elo.c b/drivers/input/touchscreen/elo.c index d20689cdbd5d..8f38c5e55ce6 100644 --- a/drivers/input/touchscreen/elo.c +++ b/drivers/input/touchscreen/elo.c | |||
| @@ -262,7 +262,7 @@ static int elo_setup_10(struct elo *elo) | |||
| 262 | input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); | 262 | input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); |
| 263 | 263 | ||
| 264 | printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, " | 264 | printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, " |
| 265 | "features: %x02x, controller: 0x%02x\n", | 265 | "features: 0x%02x, controller: 0x%02x\n", |
| 266 | elo_types[(packet[1] -'0') & 0x03], | 266 | elo_types[(packet[1] -'0') & 0x03], |
| 267 | packet[5], packet[4], packet[3], packet[7]); | 267 | packet[5], packet[4], packet[3], packet[7]); |
| 268 | 268 | ||
diff --git a/drivers/input/xen-kbdfront.c b/drivers/input/xen-kbdfront.c index 3ab6362f043c..928d2ed8865f 100644 --- a/drivers/input/xen-kbdfront.c +++ b/drivers/input/xen-kbdfront.c | |||
| @@ -323,7 +323,7 @@ static struct xenbus_device_id xenkbd_ids[] = { | |||
| 323 | { "" } | 323 | { "" } |
| 324 | }; | 324 | }; |
| 325 | 325 | ||
| 326 | static struct xenbus_driver xenkbd = { | 326 | static struct xenbus_driver xenkbd_driver = { |
| 327 | .name = "vkbd", | 327 | .name = "vkbd", |
| 328 | .owner = THIS_MODULE, | 328 | .owner = THIS_MODULE, |
| 329 | .ids = xenkbd_ids, | 329 | .ids = xenkbd_ids, |
| @@ -342,12 +342,12 @@ static int __init xenkbd_init(void) | |||
| 342 | if (xen_initial_domain()) | 342 | if (xen_initial_domain()) |
| 343 | return -ENODEV; | 343 | return -ENODEV; |
| 344 | 344 | ||
| 345 | return xenbus_register_frontend(&xenkbd); | 345 | return xenbus_register_frontend(&xenkbd_driver); |
| 346 | } | 346 | } |
| 347 | 347 | ||
| 348 | static void __exit xenkbd_cleanup(void) | 348 | static void __exit xenkbd_cleanup(void) |
| 349 | { | 349 | { |
| 350 | xenbus_unregister_driver(&xenkbd); | 350 | xenbus_unregister_driver(&xenkbd_driver); |
| 351 | } | 351 | } |
| 352 | 352 | ||
| 353 | module_init(xenkbd_init); | 353 | module_init(xenkbd_init); |
diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c index 84d75a3f5d17..ded9d0baf607 100644 --- a/drivers/isdn/hisax/config.c +++ b/drivers/isdn/hisax/config.c | |||
| @@ -1213,7 +1213,7 @@ static void HiSax_shiftcards(int idx) | |||
| 1213 | memcpy(&cards[i], &cards[i + 1], sizeof(cards[i])); | 1213 | memcpy(&cards[i], &cards[i + 1], sizeof(cards[i])); |
| 1214 | } | 1214 | } |
| 1215 | 1215 | ||
| 1216 | static int HiSax_inithardware(int *busy_flag) | 1216 | static int __init HiSax_inithardware(int *busy_flag) |
| 1217 | { | 1217 | { |
| 1218 | int foundcards = 0; | 1218 | int foundcards = 0; |
| 1219 | int i = 0; | 1219 | int i = 0; |
| @@ -1542,7 +1542,9 @@ static void __exit HiSax_exit(void) | |||
| 1542 | printk(KERN_INFO "HiSax module removed\n"); | 1542 | printk(KERN_INFO "HiSax module removed\n"); |
| 1543 | } | 1543 | } |
| 1544 | 1544 | ||
| 1545 | int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card) | 1545 | #ifdef CONFIG_HOTPLUG |
| 1546 | |||
| 1547 | int __devinit hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card) | ||
| 1546 | { | 1548 | { |
| 1547 | u_char ids[16]; | 1549 | u_char ids[16]; |
| 1548 | int ret = -1; | 1550 | int ret = -1; |
| @@ -1563,6 +1565,8 @@ error: | |||
| 1563 | } | 1565 | } |
| 1564 | 1566 | ||
| 1565 | EXPORT_SYMBOL(hisax_init_pcmcia); | 1567 | EXPORT_SYMBOL(hisax_init_pcmcia); |
| 1568 | #endif | ||
| 1569 | |||
| 1566 | EXPORT_SYMBOL(HiSax_closecard); | 1570 | EXPORT_SYMBOL(HiSax_closecard); |
| 1567 | 1571 | ||
| 1568 | #include "hisax_if.h" | 1572 | #include "hisax_if.h" |
| @@ -1580,6 +1584,11 @@ static void hisax_bc_close(struct BCState *bcs); | |||
| 1580 | static void hisax_bh(struct work_struct *work); | 1584 | static void hisax_bh(struct work_struct *work); |
| 1581 | static void EChannel_proc_rcv(struct hisax_d_if *d_if); | 1585 | static void EChannel_proc_rcv(struct hisax_d_if *d_if); |
| 1582 | 1586 | ||
| 1587 | static int hisax_setup_card_dynamic(struct IsdnCard *card) | ||
| 1588 | { | ||
| 1589 | return 2; | ||
| 1590 | } | ||
| 1591 | |||
| 1583 | int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], | 1592 | int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], |
| 1584 | char *name, int protocol) | 1593 | char *name, int protocol) |
| 1585 | { | 1594 | { |
| @@ -1599,7 +1608,8 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], | |||
| 1599 | cards[i].protocol = protocol; | 1608 | cards[i].protocol = protocol; |
| 1600 | sprintf(id, "%s%d", name, i); | 1609 | sprintf(id, "%s%d", name, i); |
| 1601 | nrcards++; | 1610 | nrcards++; |
| 1602 | retval = checkcard(i, id, NULL, hisax_d_if->owner, hisax_cs_setup_card); | 1611 | retval = checkcard(i, id, NULL, hisax_d_if->owner, |
| 1612 | hisax_setup_card_dynamic); | ||
| 1603 | if (retval == 0) { // yuck | 1613 | if (retval == 0) { // yuck |
| 1604 | cards[i].typ = 0; | 1614 | cards[i].typ = 0; |
| 1605 | nrcards--; | 1615 | nrcards--; |
diff --git a/drivers/macintosh/rack-meter.c b/drivers/macintosh/rack-meter.c index 2c21d4f25cc8..a98ab72adf95 100644 --- a/drivers/macintosh/rack-meter.c +++ b/drivers/macintosh/rack-meter.c | |||
| @@ -288,7 +288,7 @@ static void __devexit rackmeter_stop_cpu_sniffer(struct rackmeter *rm) | |||
| 288 | cancel_rearming_delayed_work(&rm->cpu[1].sniffer); | 288 | cancel_rearming_delayed_work(&rm->cpu[1].sniffer); |
| 289 | } | 289 | } |
| 290 | 290 | ||
| 291 | static int rackmeter_setup(struct rackmeter *rm) | 291 | static int __devinit rackmeter_setup(struct rackmeter *rm) |
| 292 | { | 292 | { |
| 293 | pr_debug("rackmeter: setting up i2s..\n"); | 293 | pr_debug("rackmeter: setting up i2s..\n"); |
| 294 | rackmeter_setup_i2s(rm); | 294 | rackmeter_setup_i2s(rm); |
| @@ -582,12 +582,12 @@ static struct of_device_id rackmeter_match[] = { | |||
| 582 | { } | 582 | { } |
| 583 | }; | 583 | }; |
| 584 | 584 | ||
| 585 | static struct macio_driver rackmeter_drv = { | 585 | static struct macio_driver rackmeter_driver = { |
| 586 | .name = "rackmeter", | 586 | .name = "rackmeter", |
| 587 | .owner = THIS_MODULE, | 587 | .owner = THIS_MODULE, |
| 588 | .match_table = rackmeter_match, | 588 | .match_table = rackmeter_match, |
| 589 | .probe = rackmeter_probe, | 589 | .probe = rackmeter_probe, |
| 590 | .remove = rackmeter_remove, | 590 | .remove = __devexit_p(rackmeter_remove), |
| 591 | .shutdown = rackmeter_shutdown, | 591 | .shutdown = rackmeter_shutdown, |
| 592 | }; | 592 | }; |
| 593 | 593 | ||
| @@ -596,14 +596,14 @@ static int __init rackmeter_init(void) | |||
| 596 | { | 596 | { |
| 597 | pr_debug("rackmeter_init()\n"); | 597 | pr_debug("rackmeter_init()\n"); |
| 598 | 598 | ||
| 599 | return macio_register_driver(&rackmeter_drv); | 599 | return macio_register_driver(&rackmeter_driver); |
| 600 | } | 600 | } |
| 601 | 601 | ||
| 602 | static void __exit rackmeter_exit(void) | 602 | static void __exit rackmeter_exit(void) |
| 603 | { | 603 | { |
| 604 | pr_debug("rackmeter_exit()\n"); | 604 | pr_debug("rackmeter_exit()\n"); |
| 605 | 605 | ||
| 606 | macio_unregister_driver(&rackmeter_drv); | 606 | macio_unregister_driver(&rackmeter_driver); |
| 607 | } | 607 | } |
| 608 | 608 | ||
| 609 | module_init(rackmeter_init); | 609 | module_init(rackmeter_init); |
diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c index 7bcb81002dcf..571b211608d1 100644 --- a/drivers/misc/sony-laptop.c +++ b/drivers/misc/sony-laptop.c | |||
| @@ -1038,8 +1038,8 @@ static int sony_nc_add(struct acpi_device *device) | |||
| 1038 | goto outinput; | 1038 | goto outinput; |
| 1039 | } | 1039 | } |
| 1040 | 1040 | ||
| 1041 | if (!acpi_video_backlight_support()) { | 1041 | if (acpi_video_backlight_support()) { |
| 1042 | printk(KERN_INFO DRV_PFX "Sony: Brightness ignored, must be " | 1042 | printk(KERN_INFO DRV_PFX "brightness ignored, must be " |
| 1043 | "controlled by ACPI video driver\n"); | 1043 | "controlled by ACPI video driver\n"); |
| 1044 | } else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", | 1044 | } else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", |
| 1045 | &handle))) { | 1045 | &handle))) { |
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index 7a4a26b0edd2..899766e16fa8 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
| @@ -5318,6 +5318,7 @@ static enum fan_control_commands fan_control_commands; | |||
| 5318 | 5318 | ||
| 5319 | static u8 fan_control_initial_status; | 5319 | static u8 fan_control_initial_status; |
| 5320 | static u8 fan_control_desired_level; | 5320 | static u8 fan_control_desired_level; |
| 5321 | static u8 fan_control_resume_level; | ||
| 5321 | static int fan_watchdog_maxinterval; | 5322 | static int fan_watchdog_maxinterval; |
| 5322 | 5323 | ||
| 5323 | static struct mutex fan_mutex; | 5324 | static struct mutex fan_mutex; |
| @@ -5440,8 +5441,8 @@ static int fan_set_level(int level) | |||
| 5440 | 5441 | ||
| 5441 | case TPACPI_FAN_WR_ACPI_FANS: | 5442 | case TPACPI_FAN_WR_ACPI_FANS: |
| 5442 | case TPACPI_FAN_WR_TPEC: | 5443 | case TPACPI_FAN_WR_TPEC: |
| 5443 | if ((level != TP_EC_FAN_AUTO) && | 5444 | if (!(level & TP_EC_FAN_AUTO) && |
| 5444 | (level != TP_EC_FAN_FULLSPEED) && | 5445 | !(level & TP_EC_FAN_FULLSPEED) && |
| 5445 | ((level < 0) || (level > 7))) | 5446 | ((level < 0) || (level > 7))) |
| 5446 | return -EINVAL; | 5447 | return -EINVAL; |
| 5447 | 5448 | ||
| @@ -6005,38 +6006,67 @@ static void fan_exit(void) | |||
| 6005 | 6006 | ||
| 6006 | static void fan_suspend(pm_message_t state) | 6007 | static void fan_suspend(pm_message_t state) |
| 6007 | { | 6008 | { |
| 6009 | int rc; | ||
| 6010 | |||
| 6008 | if (!fan_control_allowed) | 6011 | if (!fan_control_allowed) |
| 6009 | return; | 6012 | return; |
| 6010 | 6013 | ||
| 6011 | /* Store fan status in cache */ | 6014 | /* Store fan status in cache */ |
| 6012 | fan_get_status_safe(NULL); | 6015 | fan_control_resume_level = 0; |
| 6016 | rc = fan_get_status_safe(&fan_control_resume_level); | ||
| 6017 | if (rc < 0) | ||
| 6018 | printk(TPACPI_NOTICE | ||
| 6019 | "failed to read fan level for later " | ||
| 6020 | "restore during resume: %d\n", rc); | ||
| 6021 | |||
| 6022 | /* if it is undefined, don't attempt to restore it. | ||
| 6023 | * KEEP THIS LAST */ | ||
| 6013 | if (tp_features.fan_ctrl_status_undef) | 6024 | if (tp_features.fan_ctrl_status_undef) |
| 6014 | fan_control_desired_level = TP_EC_FAN_AUTO; | 6025 | fan_control_resume_level = 0; |
| 6015 | } | 6026 | } |
| 6016 | 6027 | ||
| 6017 | static void fan_resume(void) | 6028 | static void fan_resume(void) |
| 6018 | { | 6029 | { |
| 6019 | u8 saved_fan_level; | ||
| 6020 | u8 current_level = 7; | 6030 | u8 current_level = 7; |
| 6021 | bool do_set = false; | 6031 | bool do_set = false; |
| 6032 | int rc; | ||
| 6022 | 6033 | ||
| 6023 | /* DSDT *always* updates status on resume */ | 6034 | /* DSDT *always* updates status on resume */ |
| 6024 | tp_features.fan_ctrl_status_undef = 0; | 6035 | tp_features.fan_ctrl_status_undef = 0; |
| 6025 | 6036 | ||
| 6026 | saved_fan_level = fan_control_desired_level; | ||
| 6027 | if (!fan_control_allowed || | 6037 | if (!fan_control_allowed || |
| 6038 | !fan_control_resume_level || | ||
| 6028 | (fan_get_status_safe(¤t_level) < 0)) | 6039 | (fan_get_status_safe(¤t_level) < 0)) |
| 6029 | return; | 6040 | return; |
| 6030 | 6041 | ||
| 6031 | switch (fan_control_access_mode) { | 6042 | switch (fan_control_access_mode) { |
| 6032 | case TPACPI_FAN_WR_ACPI_SFAN: | 6043 | case TPACPI_FAN_WR_ACPI_SFAN: |
| 6033 | do_set = (saved_fan_level > current_level); | 6044 | /* never decrease fan level */ |
| 6045 | do_set = (fan_control_resume_level > current_level); | ||
| 6034 | break; | 6046 | break; |
| 6035 | case TPACPI_FAN_WR_ACPI_FANS: | 6047 | case TPACPI_FAN_WR_ACPI_FANS: |
| 6036 | case TPACPI_FAN_WR_TPEC: | 6048 | case TPACPI_FAN_WR_TPEC: |
| 6037 | do_set = ((saved_fan_level & TP_EC_FAN_FULLSPEED) || | 6049 | /* never decrease fan level, scale is: |
| 6038 | (saved_fan_level == 7 && | 6050 | * TP_EC_FAN_FULLSPEED > 7 >= TP_EC_FAN_AUTO |
| 6039 | !(current_level & TP_EC_FAN_FULLSPEED))); | 6051 | * |
| 6052 | * We expect the firmware to set either 7 or AUTO, but we | ||
| 6053 | * handle FULLSPEED out of paranoia. | ||
| 6054 | * | ||
| 6055 | * So, we can safely only restore FULLSPEED or 7, anything | ||
| 6056 | * else could slow the fan. Restoring AUTO is useless, at | ||
| 6057 | * best that's exactly what the DSDT already set (it is the | ||
| 6058 | * slower it uses). | ||
| 6059 | * | ||
| 6060 | * Always keep in mind that the DSDT *will* have set the | ||
| 6061 | * fans to what the vendor supposes is the best level. We | ||
| 6062 | * muck with it only to speed the fan up. | ||
| 6063 | */ | ||
| 6064 | if (fan_control_resume_level != 7 && | ||
| 6065 | !(fan_control_resume_level & TP_EC_FAN_FULLSPEED)) | ||
| 6066 | return; | ||
| 6067 | else | ||
| 6068 | do_set = !(current_level & TP_EC_FAN_FULLSPEED) && | ||
| 6069 | (current_level != fan_control_resume_level); | ||
| 6040 | break; | 6070 | break; |
| 6041 | default: | 6071 | default: |
| 6042 | return; | 6072 | return; |
| @@ -6044,8 +6074,11 @@ static void fan_resume(void) | |||
| 6044 | if (do_set) { | 6074 | if (do_set) { |
| 6045 | printk(TPACPI_NOTICE | 6075 | printk(TPACPI_NOTICE |
| 6046 | "restoring fan level to 0x%02x\n", | 6076 | "restoring fan level to 0x%02x\n", |
| 6047 | saved_fan_level); | 6077 | fan_control_resume_level); |
| 6048 | fan_set_level_safe(saved_fan_level); | 6078 | rc = fan_set_level_safe(fan_control_resume_level); |
| 6079 | if (rc < 0) | ||
| 6080 | printk(TPACPI_NOTICE | ||
| 6081 | "failed to restore fan level: %d\n", rc); | ||
| 6049 | } | 6082 | } |
| 6050 | } | 6083 | } |
| 6051 | 6084 | ||
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c index e04bcf1dff87..d8966bae0e0b 100644 --- a/drivers/mtd/ubi/eba.c +++ b/drivers/mtd/ubi/eba.c | |||
| @@ -1022,7 +1022,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, | |||
| 1022 | } | 1022 | } |
| 1023 | 1023 | ||
| 1024 | /* | 1024 | /* |
| 1025 | * OK, now the LEB is locked and we can safely start moving iy. Since | 1025 | * OK, now the LEB is locked and we can safely start moving it. Since |
| 1026 | * this function utilizes thie @ubi->peb1_buf buffer which is shared | 1026 | * this function utilizes thie @ubi->peb1_buf buffer which is shared |
| 1027 | * with some other functions, so lock the buffer by taking the | 1027 | * with some other functions, so lock the buffer by taking the |
| 1028 | * @ubi->buf_mutex. | 1028 | * @ubi->buf_mutex. |
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index 4f2daa5bbecf..41d47e1cf15c 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
| @@ -320,7 +320,7 @@ static int compare_lebs(struct ubi_device *ubi, const struct ubi_scan_leb *seb, | |||
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | err = ubi_io_read_data(ubi, buf, pnum, 0, len); | 322 | err = ubi_io_read_data(ubi, buf, pnum, 0, len); |
| 323 | if (err && err != UBI_IO_BITFLIPS) | 323 | if (err && err != UBI_IO_BITFLIPS && err != -EBADMSG) |
| 324 | goto out_free_buf; | 324 | goto out_free_buf; |
| 325 | 325 | ||
| 326 | data_crc = be32_to_cpu(vid_hdr->data_crc); | 326 | data_crc = be32_to_cpu(vid_hdr->data_crc); |
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c index 05d70937b543..dcb6dac1dc54 100644 --- a/drivers/mtd/ubi/wl.c +++ b/drivers/mtd/ubi/wl.c | |||
| @@ -1396,7 +1396,8 @@ int ubi_thread(void *u) | |||
| 1396 | ubi_msg("%s: %d consecutive failures", | 1396 | ubi_msg("%s: %d consecutive failures", |
| 1397 | ubi->bgt_name, WL_MAX_FAILURES); | 1397 | ubi->bgt_name, WL_MAX_FAILURES); |
| 1398 | ubi_ro_mode(ubi); | 1398 | ubi_ro_mode(ubi); |
| 1399 | break; | 1399 | ubi->thread_enabled = 0; |
| 1400 | continue; | ||
| 1400 | } | 1401 | } |
| 1401 | } else | 1402 | } else |
| 1402 | failures = 0; | 1403 | failures = 0; |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 36f2bb666bf7..8ed823ae639e 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -2330,7 +2330,7 @@ static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, | |||
| 2330 | * Once we know the feature-set enabled for the device, we'll cache | 2330 | * Once we know the feature-set enabled for the device, we'll cache |
| 2331 | * the register offset the descriptor ring is assigned to. | 2331 | * the register offset the descriptor ring is assigned to. |
| 2332 | **/ | 2332 | **/ |
| 2333 | static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) | 2333 | static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) |
| 2334 | { | 2334 | { |
| 2335 | int feature_mask = 0, rss_i; | 2335 | int feature_mask = 0, rss_i; |
| 2336 | int i, txr_idx, rxr_idx; | 2336 | int i, txr_idx, rxr_idx; |
| @@ -2367,7 +2367,7 @@ static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) | |||
| 2367 | * number of queues at compile-time. The polling_netdev array is | 2367 | * number of queues at compile-time. The polling_netdev array is |
| 2368 | * intended for Multiqueue, but should work fine with a single queue. | 2368 | * intended for Multiqueue, but should work fine with a single queue. |
| 2369 | **/ | 2369 | **/ |
| 2370 | static int __devinit ixgbe_alloc_queues(struct ixgbe_adapter *adapter) | 2370 | static int ixgbe_alloc_queues(struct ixgbe_adapter *adapter) |
| 2371 | { | 2371 | { |
| 2372 | int i; | 2372 | int i; |
| 2373 | 2373 | ||
| @@ -2408,8 +2408,7 @@ err_tx_ring_allocation: | |||
| 2408 | * Attempt to configure the interrupts using the best available | 2408 | * Attempt to configure the interrupts using the best available |
| 2409 | * capabilities of the hardware and the kernel. | 2409 | * capabilities of the hardware and the kernel. |
| 2410 | **/ | 2410 | **/ |
| 2411 | static int __devinit ixgbe_set_interrupt_capability(struct ixgbe_adapter | 2411 | static int ixgbe_set_interrupt_capability(struct ixgbe_adapter *adapter) |
| 2412 | *adapter) | ||
| 2413 | { | 2412 | { |
| 2414 | int err = 0; | 2413 | int err = 0; |
| 2415 | int vector, v_budget; | 2414 | int vector, v_budget; |
| @@ -2501,7 +2500,7 @@ static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) | |||
| 2501 | * - Hardware queue count (num_*_queues) | 2500 | * - Hardware queue count (num_*_queues) |
| 2502 | * - defined by miscellaneous hardware support/features (RSS, etc.) | 2501 | * - defined by miscellaneous hardware support/features (RSS, etc.) |
| 2503 | **/ | 2502 | **/ |
| 2504 | static int __devinit ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter) | 2503 | static int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter) |
| 2505 | { | 2504 | { |
| 2506 | int err; | 2505 | int err; |
| 2507 | 2506 | ||
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index cf3cca4642f2..f51944b28cfa 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
| @@ -349,7 +349,7 @@ static int ibmtr_suspend(struct pcmcia_device *link) | |||
| 349 | return 0; | 349 | return 0; |
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | static int ibmtr_resume(struct pcmcia_device *link) | 352 | static int __devinit ibmtr_resume(struct pcmcia_device *link) |
| 353 | { | 353 | { |
| 354 | ibmtr_dev_t *info = link->priv; | 354 | ibmtr_dev_t *info = link->priv; |
| 355 | struct net_device *dev = info->dev; | 355 | struct net_device *dev = info->dev; |
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index b185cd12269c..9a16a79b67d0 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c | |||
| @@ -1735,7 +1735,7 @@ static const struct ethtool_ops smc911x_ethtool_ops = { | |||
| 1735 | * This routine has a simple purpose -- make the SMC chip generate an | 1735 | * This routine has a simple purpose -- make the SMC chip generate an |
| 1736 | * interrupt, so an auto-detect routine can detect it, and find the IRQ, | 1736 | * interrupt, so an auto-detect routine can detect it, and find the IRQ, |
| 1737 | */ | 1737 | */ |
| 1738 | static int __init smc911x_findirq(struct net_device *dev) | 1738 | static int __devinit smc911x_findirq(struct net_device *dev) |
| 1739 | { | 1739 | { |
| 1740 | struct smc911x_local *lp = netdev_priv(dev); | 1740 | struct smc911x_local *lp = netdev_priv(dev); |
| 1741 | int timeout = 20; | 1741 | int timeout = 20; |
| @@ -1799,7 +1799,7 @@ static int __init smc911x_findirq(struct net_device *dev) | |||
| 1799 | * o actually GRAB the irq. | 1799 | * o actually GRAB the irq. |
| 1800 | * o GRAB the region | 1800 | * o GRAB the region |
| 1801 | */ | 1801 | */ |
| 1802 | static int __init smc911x_probe(struct net_device *dev) | 1802 | static int __devinit smc911x_probe(struct net_device *dev) |
| 1803 | { | 1803 | { |
| 1804 | struct smc911x_local *lp = netdev_priv(dev); | 1804 | struct smc911x_local *lp = netdev_priv(dev); |
| 1805 | int i, retval; | 1805 | int i, retval; |
| @@ -2048,7 +2048,7 @@ err_out: | |||
| 2048 | * 0 --> there is a device | 2048 | * 0 --> there is a device |
| 2049 | * anything else, error | 2049 | * anything else, error |
| 2050 | */ | 2050 | */ |
| 2051 | static int smc911x_drv_probe(struct platform_device *pdev) | 2051 | static int __devinit smc911x_drv_probe(struct platform_device *pdev) |
| 2052 | { | 2052 | { |
| 2053 | #ifdef SMC_DYNAMIC_BUS_CONFIG | 2053 | #ifdef SMC_DYNAMIC_BUS_CONFIG |
| 2054 | struct smc911x_platdata *pd = pdev->dev.platform_data; | 2054 | struct smc911x_platdata *pd = pdev->dev.platform_data; |
| @@ -2124,7 +2124,7 @@ out: | |||
| 2124 | return ret; | 2124 | return ret; |
| 2125 | } | 2125 | } |
| 2126 | 2126 | ||
| 2127 | static int smc911x_drv_remove(struct platform_device *pdev) | 2127 | static int __devexit smc911x_drv_remove(struct platform_device *pdev) |
| 2128 | { | 2128 | { |
| 2129 | struct net_device *ndev = platform_get_drvdata(pdev); | 2129 | struct net_device *ndev = platform_get_drvdata(pdev); |
| 2130 | struct smc911x_local *lp = netdev_priv(ndev); | 2130 | struct smc911x_local *lp = netdev_priv(ndev); |
| @@ -2195,7 +2195,7 @@ static int smc911x_drv_resume(struct platform_device *dev) | |||
| 2195 | 2195 | ||
| 2196 | static struct platform_driver smc911x_driver = { | 2196 | static struct platform_driver smc911x_driver = { |
| 2197 | .probe = smc911x_drv_probe, | 2197 | .probe = smc911x_drv_probe, |
| 2198 | .remove = smc911x_drv_remove, | 2198 | .remove = __devexit_p(smc911x_drv_remove), |
| 2199 | .suspend = smc911x_drv_suspend, | 2199 | .suspend = smc911x_drv_suspend, |
| 2200 | .resume = smc911x_drv_resume, | 2200 | .resume = smc911x_drv_resume, |
| 2201 | .driver = { | 2201 | .driver = { |
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index fc80f250da31..35c56abf4113 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
| @@ -1696,7 +1696,7 @@ static const struct ethtool_ops smc_ethtool_ops = { | |||
| 1696 | * I just deleted auto_irq.c, since it was never built... | 1696 | * I just deleted auto_irq.c, since it was never built... |
| 1697 | * --jgarzik | 1697 | * --jgarzik |
| 1698 | */ | 1698 | */ |
| 1699 | static int __init smc_findirq(struct smc_local *lp) | 1699 | static int __devinit smc_findirq(struct smc_local *lp) |
| 1700 | { | 1700 | { |
| 1701 | void __iomem *ioaddr = lp->base; | 1701 | void __iomem *ioaddr = lp->base; |
| 1702 | int timeout = 20; | 1702 | int timeout = 20; |
| @@ -1770,7 +1770,7 @@ static int __init smc_findirq(struct smc_local *lp) | |||
| 1770 | * o actually GRAB the irq. | 1770 | * o actually GRAB the irq. |
| 1771 | * o GRAB the region | 1771 | * o GRAB the region |
| 1772 | */ | 1772 | */ |
| 1773 | static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr, | 1773 | static int __devinit smc_probe(struct net_device *dev, void __iomem *ioaddr, |
| 1774 | unsigned long irq_flags) | 1774 | unsigned long irq_flags) |
| 1775 | { | 1775 | { |
| 1776 | struct smc_local *lp = netdev_priv(dev); | 1776 | struct smc_local *lp = netdev_priv(dev); |
| @@ -2126,7 +2126,7 @@ static void smc_release_datacs(struct platform_device *pdev, struct net_device * | |||
| 2126 | * 0 --> there is a device | 2126 | * 0 --> there is a device |
| 2127 | * anything else, error | 2127 | * anything else, error |
| 2128 | */ | 2128 | */ |
| 2129 | static int smc_drv_probe(struct platform_device *pdev) | 2129 | static int __devinit smc_drv_probe(struct platform_device *pdev) |
| 2130 | { | 2130 | { |
| 2131 | struct smc91x_platdata *pd = pdev->dev.platform_data; | 2131 | struct smc91x_platdata *pd = pdev->dev.platform_data; |
| 2132 | struct smc_local *lp; | 2132 | struct smc_local *lp; |
| @@ -2240,7 +2240,7 @@ static int smc_drv_probe(struct platform_device *pdev) | |||
| 2240 | return ret; | 2240 | return ret; |
| 2241 | } | 2241 | } |
| 2242 | 2242 | ||
| 2243 | static int smc_drv_remove(struct platform_device *pdev) | 2243 | static int __devexit smc_drv_remove(struct platform_device *pdev) |
| 2244 | { | 2244 | { |
| 2245 | struct net_device *ndev = platform_get_drvdata(pdev); | 2245 | struct net_device *ndev = platform_get_drvdata(pdev); |
| 2246 | struct smc_local *lp = netdev_priv(ndev); | 2246 | struct smc_local *lp = netdev_priv(ndev); |
| @@ -2305,7 +2305,7 @@ static int smc_drv_resume(struct platform_device *dev) | |||
| 2305 | 2305 | ||
| 2306 | static struct platform_driver smc_driver = { | 2306 | static struct platform_driver smc_driver = { |
| 2307 | .probe = smc_drv_probe, | 2307 | .probe = smc_drv_probe, |
| 2308 | .remove = smc_drv_remove, | 2308 | .remove = __devexit_p(smc_drv_remove), |
| 2309 | .suspend = smc_drv_suspend, | 2309 | .suspend = smc_drv_suspend, |
| 2310 | .resume = smc_drv_resume, | 2310 | .resume = smc_drv_resume, |
| 2311 | .driver = { | 2311 | .driver = { |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index c6948d8f53f6..6d017adc914a 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -1785,7 +1785,7 @@ static int __devexit xennet_remove(struct xenbus_device *dev) | |||
| 1785 | return 0; | 1785 | return 0; |
| 1786 | } | 1786 | } |
| 1787 | 1787 | ||
| 1788 | static struct xenbus_driver netfront = { | 1788 | static struct xenbus_driver netfront_driver = { |
| 1789 | .name = "vif", | 1789 | .name = "vif", |
| 1790 | .owner = THIS_MODULE, | 1790 | .owner = THIS_MODULE, |
| 1791 | .ids = netfront_ids, | 1791 | .ids = netfront_ids, |
| @@ -1805,7 +1805,7 @@ static int __init netif_init(void) | |||
| 1805 | 1805 | ||
| 1806 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); | 1806 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); |
| 1807 | 1807 | ||
| 1808 | return xenbus_register_frontend(&netfront); | 1808 | return xenbus_register_frontend(&netfront_driver); |
| 1809 | } | 1809 | } |
| 1810 | module_init(netif_init); | 1810 | module_init(netif_init); |
| 1811 | 1811 | ||
| @@ -1815,7 +1815,7 @@ static void __exit netif_exit(void) | |||
| 1815 | if (xen_initial_domain()) | 1815 | if (xen_initial_domain()) |
| 1816 | return; | 1816 | return; |
| 1817 | 1817 | ||
| 1818 | xenbus_unregister_driver(&netfront); | 1818 | xenbus_unregister_driver(&netfront_driver); |
| 1819 | } | 1819 | } |
| 1820 | module_exit(netif_exit); | 1820 | module_exit(netif_exit); |
| 1821 | 1821 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 28af496b441e..061d1ee0046a 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -2042,7 +2042,7 @@ static int __devinit pci_init(void) | |||
| 2042 | return 0; | 2042 | return 0; |
| 2043 | } | 2043 | } |
| 2044 | 2044 | ||
| 2045 | static int __devinit pci_setup(char *str) | 2045 | static int __init pci_setup(char *str) |
| 2046 | { | 2046 | { |
| 2047 | while (str) { | 2047 | while (str) { |
| 2048 | char *k = strchr(str, ','); | 2048 | char *k = strchr(str, ','); |
diff --git a/drivers/rapidio/rio-scan.c b/drivers/rapidio/rio-scan.c index a926c896475e..643a6b98462b 100644 --- a/drivers/rapidio/rio-scan.c +++ b/drivers/rapidio/rio-scan.c | |||
| @@ -879,7 +879,7 @@ static void rio_update_route_tables(struct rio_mport *port) | |||
| 879 | * link, then start recursive peer enumeration. Returns %0 if | 879 | * link, then start recursive peer enumeration. Returns %0 if |
| 880 | * enumeration succeeds or %-EBUSY if enumeration fails. | 880 | * enumeration succeeds or %-EBUSY if enumeration fails. |
| 881 | */ | 881 | */ |
| 882 | int rio_enum_mport(struct rio_mport *mport) | 882 | int __devinit rio_enum_mport(struct rio_mport *mport) |
| 883 | { | 883 | { |
| 884 | struct rio_net *net = NULL; | 884 | struct rio_net *net = NULL; |
| 885 | int rc = 0; | 885 | int rc = 0; |
| @@ -972,7 +972,7 @@ static void rio_enum_timeout(unsigned long data) | |||
| 972 | * peer discovery. Returns %0 if discovery succeeds or %-EBUSY | 972 | * peer discovery. Returns %0 if discovery succeeds or %-EBUSY |
| 973 | * on failure. | 973 | * on failure. |
| 974 | */ | 974 | */ |
| 975 | int rio_disc_mport(struct rio_mport *mport) | 975 | int __devinit rio_disc_mport(struct rio_mport *mport) |
| 976 | { | 976 | { |
| 977 | struct rio_net *net = NULL; | 977 | struct rio_net *net = NULL; |
| 978 | int enum_timeout_flag = 0; | 978 | int enum_timeout_flag = 0; |
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index 680661abbc4b..6395c780008b 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c | |||
| @@ -467,7 +467,7 @@ static int __devinit rio_init(void) | |||
| 467 | 467 | ||
| 468 | device_initcall(rio_init); | 468 | device_initcall(rio_init); |
| 469 | 469 | ||
| 470 | int rio_init_mports(void) | 470 | int __devinit rio_init_mports(void) |
| 471 | { | 471 | { |
| 472 | int rc = 0; | 472 | int rc = 0; |
| 473 | struct rio_mport *port; | 473 | struct rio_mport *port; |
diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c index f08e169ba1b5..054f5dd58931 100644 --- a/drivers/sbus/char/bbc_i2c.c +++ b/drivers/sbus/char/bbc_i2c.c | |||
| @@ -361,7 +361,7 @@ fail: | |||
| 361 | extern int bbc_envctrl_init(struct bbc_i2c_bus *bp); | 361 | extern int bbc_envctrl_init(struct bbc_i2c_bus *bp); |
| 362 | extern void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp); | 362 | extern void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp); |
| 363 | 363 | ||
| 364 | static int __devinit bbc_i2c_probe(struct of_device *op, | 364 | static int __init bbc_i2c_probe(struct of_device *op, |
| 365 | const struct of_device_id *match) | 365 | const struct of_device_id *match) |
| 366 | { | 366 | { |
| 367 | struct bbc_i2c_bus *bp; | 367 | struct bbc_i2c_bus *bp; |
| @@ -386,7 +386,7 @@ static int __devinit bbc_i2c_probe(struct of_device *op, | |||
| 386 | return err; | 386 | return err; |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | static int __devexit bbc_i2c_remove(struct of_device *op) | 389 | static int __exit bbc_i2c_remove(struct of_device *op) |
| 390 | { | 390 | { |
| 391 | struct bbc_i2c_bus *bp = dev_get_drvdata(&op->dev); | 391 | struct bbc_i2c_bus *bp = dev_get_drvdata(&op->dev); |
| 392 | 392 | ||
| @@ -417,7 +417,7 @@ static struct of_platform_driver bbc_i2c_driver = { | |||
| 417 | .name = "bbc_i2c", | 417 | .name = "bbc_i2c", |
| 418 | .match_table = bbc_i2c_match, | 418 | .match_table = bbc_i2c_match, |
| 419 | .probe = bbc_i2c_probe, | 419 | .probe = bbc_i2c_probe, |
| 420 | .remove = __devexit_p(bbc_i2c_remove), | 420 | .remove = __exit_p(bbc_i2c_remove), |
| 421 | }; | 421 | }; |
| 422 | 422 | ||
| 423 | static int __init bbc_i2c_init(void) | 423 | static int __init bbc_i2c_init(void) |
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 218777bfc143..399fe559e4de 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c | |||
| @@ -13872,8 +13872,10 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost, | |||
| 13872 | advansys_wide_free_mem(boardp); | 13872 | advansys_wide_free_mem(boardp); |
| 13873 | free_irq(boardp->irq, shost); | 13873 | free_irq(boardp->irq, shost); |
| 13874 | err_free_dma: | 13874 | err_free_dma: |
| 13875 | #ifdef CONFIG_ISA | ||
| 13875 | if (shost->dma_channel != NO_ISA_DMA) | 13876 | if (shost->dma_channel != NO_ISA_DMA) |
| 13876 | free_dma(shost->dma_channel); | 13877 | free_dma(shost->dma_channel); |
| 13878 | #endif | ||
| 13877 | err_free_proc: | 13879 | err_free_proc: |
| 13878 | kfree(boardp->prtbuf); | 13880 | kfree(boardp->prtbuf); |
| 13879 | err_unmap: | 13881 | err_unmap: |
| @@ -13894,10 +13896,12 @@ static int advansys_release(struct Scsi_Host *shost) | |||
| 13894 | ASC_DBG(1, "begin\n"); | 13896 | ASC_DBG(1, "begin\n"); |
| 13895 | scsi_remove_host(shost); | 13897 | scsi_remove_host(shost); |
| 13896 | free_irq(board->irq, shost); | 13898 | free_irq(board->irq, shost); |
| 13899 | #ifdef CONFIG_ISA | ||
| 13897 | if (shost->dma_channel != NO_ISA_DMA) { | 13900 | if (shost->dma_channel != NO_ISA_DMA) { |
| 13898 | ASC_DBG(1, "free_dma()\n"); | 13901 | ASC_DBG(1, "free_dma()\n"); |
| 13899 | free_dma(shost->dma_channel); | 13902 | free_dma(shost->dma_channel); |
| 13900 | } | 13903 | } |
| 13904 | #endif | ||
| 13901 | if (ASC_NARROW_BOARD(board)) { | 13905 | if (ASC_NARROW_BOARD(board)) { |
| 13902 | dma_unmap_single(board->dev, | 13906 | dma_unmap_single(board->dev, |
| 13903 | board->dvc_var.asc_dvc_var.overrun_dma, | 13907 | board->dvc_var.asc_dvc_var.overrun_dma, |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index c387c15a2128..fb247fdfa2bd 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
| @@ -588,7 +588,7 @@ static struct pci_driver gdth_pci_driver = { | |||
| 588 | .remove = gdth_pci_remove_one, | 588 | .remove = gdth_pci_remove_one, |
| 589 | }; | 589 | }; |
| 590 | 590 | ||
| 591 | static void gdth_pci_remove_one(struct pci_dev *pdev) | 591 | static void __devexit gdth_pci_remove_one(struct pci_dev *pdev) |
| 592 | { | 592 | { |
| 593 | gdth_ha_str *ha = pci_get_drvdata(pdev); | 593 | gdth_ha_str *ha = pci_get_drvdata(pdev); |
| 594 | 594 | ||
| @@ -600,7 +600,7 @@ static void gdth_pci_remove_one(struct pci_dev *pdev) | |||
| 600 | pci_disable_device(pdev); | 600 | pci_disable_device(pdev); |
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | static int gdth_pci_init_one(struct pci_dev *pdev, | 603 | static int __devinit gdth_pci_init_one(struct pci_dev *pdev, |
| 604 | const struct pci_device_id *ent) | 604 | const struct pci_device_id *ent) |
| 605 | { | 605 | { |
| 606 | ushort vendor = pdev->vendor; | 606 | ushort vendor = pdev->vendor; |
| @@ -853,7 +853,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) | |||
| 853 | #endif /* CONFIG_ISA */ | 853 | #endif /* CONFIG_ISA */ |
| 854 | 854 | ||
| 855 | #ifdef CONFIG_PCI | 855 | #ifdef CONFIG_PCI |
| 856 | static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, | 856 | static int __devinit gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, |
| 857 | gdth_ha_str *ha) | 857 | gdth_ha_str *ha) |
| 858 | { | 858 | { |
| 859 | register gdt6_dpram_str __iomem *dp6_ptr; | 859 | register gdt6_dpram_str __iomem *dp6_ptr; |
| @@ -1237,7 +1237,7 @@ static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, | |||
| 1237 | 1237 | ||
| 1238 | /* controller protocol functions */ | 1238 | /* controller protocol functions */ |
| 1239 | 1239 | ||
| 1240 | static void __init gdth_enable_int(gdth_ha_str *ha) | 1240 | static void __devinit gdth_enable_int(gdth_ha_str *ha) |
| 1241 | { | 1241 | { |
| 1242 | ulong flags; | 1242 | ulong flags; |
| 1243 | gdt2_dpram_str __iomem *dp2_ptr; | 1243 | gdt2_dpram_str __iomem *dp2_ptr; |
| @@ -1553,7 +1553,7 @@ static int gdth_internal_cmd(gdth_ha_str *ha, unchar service, ushort opcode, | |||
| 1553 | 1553 | ||
| 1554 | /* search for devices */ | 1554 | /* search for devices */ |
| 1555 | 1555 | ||
| 1556 | static int __init gdth_search_drives(gdth_ha_str *ha) | 1556 | static int __devinit gdth_search_drives(gdth_ha_str *ha) |
| 1557 | { | 1557 | { |
| 1558 | ushort cdev_cnt, i; | 1558 | ushort cdev_cnt, i; |
| 1559 | int ok; | 1559 | int ok; |
| @@ -4935,7 +4935,7 @@ static int __init gdth_eisa_probe_one(ushort eisa_slot) | |||
| 4935 | #endif /* CONFIG_EISA */ | 4935 | #endif /* CONFIG_EISA */ |
| 4936 | 4936 | ||
| 4937 | #ifdef CONFIG_PCI | 4937 | #ifdef CONFIG_PCI |
| 4938 | static int gdth_pci_probe_one(gdth_pci_str *pcistr, | 4938 | static int __devinit gdth_pci_probe_one(gdth_pci_str *pcistr, |
| 4939 | gdth_ha_str **ha_out) | 4939 | gdth_ha_str **ha_out) |
| 4940 | { | 4940 | { |
| 4941 | struct Scsi_Host *shp; | 4941 | struct Scsi_Host *shp; |
diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c index a463b3dd837b..2493f05e9f61 100644 --- a/drivers/video/xen-fbfront.c +++ b/drivers/video/xen-fbfront.c | |||
| @@ -668,7 +668,7 @@ static struct xenbus_device_id xenfb_ids[] = { | |||
| 668 | { "" } | 668 | { "" } |
| 669 | }; | 669 | }; |
| 670 | 670 | ||
| 671 | static struct xenbus_driver xenfb = { | 671 | static struct xenbus_driver xenfb_driver = { |
| 672 | .name = "vfb", | 672 | .name = "vfb", |
| 673 | .owner = THIS_MODULE, | 673 | .owner = THIS_MODULE, |
| 674 | .ids = xenfb_ids, | 674 | .ids = xenfb_ids, |
| @@ -687,12 +687,12 @@ static int __init xenfb_init(void) | |||
| 687 | if (xen_initial_domain()) | 687 | if (xen_initial_domain()) |
| 688 | return -ENODEV; | 688 | return -ENODEV; |
| 689 | 689 | ||
| 690 | return xenbus_register_frontend(&xenfb); | 690 | return xenbus_register_frontend(&xenfb_driver); |
| 691 | } | 691 | } |
| 692 | 692 | ||
| 693 | static void __exit xenfb_cleanup(void) | 693 | static void __exit xenfb_cleanup(void) |
| 694 | { | 694 | { |
| 695 | xenbus_unregister_driver(&xenfb); | 695 | xenbus_unregister_driver(&xenfb_driver); |
| 696 | } | 696 | } |
| 697 | 697 | ||
| 698 | module_init(xenfb_init); | 698 | module_init(xenfb_init); |
diff --git a/drivers/w1/masters/Kconfig b/drivers/w1/masters/Kconfig index a14d5b6e4c7c..90616822cd20 100644 --- a/drivers/w1/masters/Kconfig +++ b/drivers/w1/masters/Kconfig | |||
| @@ -36,7 +36,7 @@ config W1_MASTER_DS2482 | |||
| 36 | 36 | ||
| 37 | config W1_MASTER_DS1WM | 37 | config W1_MASTER_DS1WM |
| 38 | tristate "Maxim DS1WM 1-wire busmaster" | 38 | tristate "Maxim DS1WM 1-wire busmaster" |
| 39 | depends on W1 && ARM | 39 | depends on W1 && ARM && HAVE_CLK |
| 40 | help | 40 | help |
| 41 | Say Y here to enable the DS1WM 1-wire driver, such as that | 41 | Say Y here to enable the DS1WM 1-wire driver, such as that |
| 42 | in HP iPAQ devices like h5xxx, h2200, and ASIC3-based like | 42 | in HP iPAQ devices like h5xxx, h2200, and ASIC3-based like |
diff --git a/fs/buffer.c b/fs/buffer.c index 6569fda5cfed..10179cfa1152 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
| @@ -878,6 +878,7 @@ void invalidate_inode_buffers(struct inode *inode) | |||
| 878 | spin_unlock(&buffer_mapping->private_lock); | 878 | spin_unlock(&buffer_mapping->private_lock); |
| 879 | } | 879 | } |
| 880 | } | 880 | } |
| 881 | EXPORT_SYMBOL(invalidate_inode_buffers); | ||
| 881 | 882 | ||
| 882 | /* | 883 | /* |
| 883 | * Remove any clean buffers from the inode's buffer list. This is called | 884 | * Remove any clean buffers from the inode's buffer list. This is called |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 6e74b117aaf0..30ebde490f7f 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -106,6 +106,7 @@ void udf_clear_inode(struct inode *inode) | |||
| 106 | udf_truncate_tail_extent(inode); | 106 | udf_truncate_tail_extent(inode); |
| 107 | unlock_kernel(); | 107 | unlock_kernel(); |
| 108 | write_inode_now(inode, 0); | 108 | write_inode_now(inode, 0); |
| 109 | invalidate_inode_buffers(inode); | ||
| 109 | } | 110 | } |
| 110 | iinfo = UDF_I(inode); | 111 | iinfo = UDF_I(inode); |
| 111 | kfree(iinfo->i_ext.i_data); | 112 | kfree(iinfo->i_ext.i_data); |
diff --git a/include/acpi/acpredef.h b/include/acpi/acpredef.h index 619fb75f8861..16a9ca9a66e4 100644 --- a/include/acpi/acpredef.h +++ b/include/acpi/acpredef.h | |||
| @@ -167,7 +167,7 @@ static const union acpi_predefined_info predefined_names[] = { | |||
| 167 | {.info = {"_BFS", 1, 0}}, | 167 | {.info = {"_BFS", 1, 0}}, |
| 168 | {.info = {"_BIF", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, | 168 | {.info = {"_BIF", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, |
| 169 | 9, | 169 | 9, |
| 170 | ACPI_RTYPE_STRING, 4, 0}}, /* fixed (9 Int),(4 Str) */ | 170 | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER, 4, 0}}, /* fixed (9 Int),(4 Str) */ |
| 171 | {.info = {"_BLT", 3, 0}}, | 171 | {.info = {"_BLT", 3, 0}}, |
| 172 | {.info = {"_BMC", 1, 0}}, | 172 | {.info = {"_BMC", 1, 0}}, |
| 173 | {.info = {"_BMD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 5, 0, 0, 0}}, /* fixed (5 Int) */ | 173 | {.info = {"_BMD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 5, 0, 0, 0}}, /* fixed (5 Int) */ |
| @@ -346,7 +346,7 @@ static const union acpi_predefined_info predefined_names[] = { | |||
| 346 | 346 | ||
| 347 | /* Acpi 1.0 defined _WAK with no return value. Later, it was changed to return a package */ | 347 | /* Acpi 1.0 defined _WAK with no return value. Later, it was changed to return a package */ |
| 348 | 348 | ||
| 349 | {.info = {"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_PACKAGE}}, | 349 | {.info = {"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_INTEGER | ACPI_RTYPE_PACKAGE}}, |
| 350 | {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2, 0, 0, 0}}, /* fixed (2 Int), but is optional */ | 350 | {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2, 0, 0, 0}}, /* fixed (2 Int), but is optional */ |
| 351 | {.ret_info = {0, 0, 0, 0, 0, 0}} /* Table terminator */ | 351 | {.ret_info = {0, 0, 0, 0, 0, 0}} /* Table terminator */ |
| 352 | }; | 352 | }; |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 28c7f1679d49..d5e8e5c89548 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
| @@ -1151,6 +1151,7 @@ extern u32 drm_vblank_count(struct drm_device *dev, int crtc); | |||
| 1151 | extern void drm_handle_vblank(struct drm_device *dev, int crtc); | 1151 | extern void drm_handle_vblank(struct drm_device *dev, int crtc); |
| 1152 | extern int drm_vblank_get(struct drm_device *dev, int crtc); | 1152 | extern int drm_vblank_get(struct drm_device *dev, int crtc); |
| 1153 | extern void drm_vblank_put(struct drm_device *dev, int crtc); | 1153 | extern void drm_vblank_put(struct drm_device *dev, int crtc); |
| 1154 | extern void drm_vblank_cleanup(struct drm_device *dev); | ||
| 1154 | /* Modesetting support */ | 1155 | /* Modesetting support */ |
| 1155 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, | 1156 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, |
| 1156 | struct drm_file *file_priv); | 1157 | struct drm_file *file_priv); |
diff --git a/include/linux/compat.h b/include/linux/compat.h index f061a1ea1b74..e88f3ecf38b4 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
| @@ -252,12 +252,10 @@ extern int compat_ptrace_request(struct task_struct *child, | |||
| 252 | compat_long_t request, | 252 | compat_long_t request, |
| 253 | compat_ulong_t addr, compat_ulong_t data); | 253 | compat_ulong_t addr, compat_ulong_t data); |
| 254 | 254 | ||
| 255 | #ifdef __ARCH_WANT_COMPAT_SYS_PTRACE | ||
| 256 | extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | 255 | extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
| 257 | compat_ulong_t addr, compat_ulong_t data); | 256 | compat_ulong_t addr, compat_ulong_t data); |
| 258 | asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, | 257 | asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, |
| 259 | compat_long_t addr, compat_long_t data); | 258 | compat_long_t addr, compat_long_t data); |
| 260 | #endif /* __ARCH_WANT_COMPAT_SYS_PTRACE */ | ||
| 261 | 259 | ||
| 262 | /* | 260 | /* |
| 263 | * epoll (fs/eventpoll.c) compat bits follow ... | 261 | * epoll (fs/eventpoll.c) compat bits follow ... |
diff --git a/include/linux/memory.h b/include/linux/memory.h index 2f5f8a5ef2a0..36c82c9e6ea7 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
| @@ -91,7 +91,7 @@ extern int memory_notify(unsigned long val, void *v); | |||
| 91 | 91 | ||
| 92 | #ifdef CONFIG_MEMORY_HOTPLUG | 92 | #ifdef CONFIG_MEMORY_HOTPLUG |
| 93 | #define hotplug_memory_notifier(fn, pri) { \ | 93 | #define hotplug_memory_notifier(fn, pri) { \ |
| 94 | static struct notifier_block fn##_mem_nb = \ | 94 | static __meminitdata struct notifier_block fn##_mem_nb =\ |
| 95 | { .notifier_call = fn, .priority = pri }; \ | 95 | { .notifier_call = fn, .priority = pri }; \ |
| 96 | register_memory_notifier(&fn##_mem_nb); \ | 96 | register_memory_notifier(&fn##_mem_nb); \ |
| 97 | } | 97 | } |
diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h index f546ad6fc028..1e6d34bfa094 100644 --- a/include/linux/page_cgroup.h +++ b/include/linux/page_cgroup.h | |||
| @@ -17,7 +17,7 @@ struct page_cgroup { | |||
| 17 | struct list_head lru; /* per cgroup LRU list */ | 17 | struct list_head lru; /* per cgroup LRU list */ |
| 18 | }; | 18 | }; |
| 19 | 19 | ||
| 20 | void __init pgdat_page_cgroup_init(struct pglist_data *pgdat); | 20 | void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat); |
| 21 | void __init page_cgroup_init(void); | 21 | void __init page_cgroup_init(void); |
| 22 | struct page_cgroup *lookup_page_cgroup(struct page *page); | 22 | struct page_cgroup *lookup_page_cgroup(struct page *page); |
| 23 | 23 | ||
| @@ -91,7 +91,7 @@ static inline void unlock_page_cgroup(struct page_cgroup *pc) | |||
| 91 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ | 91 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ |
| 92 | struct page_cgroup; | 92 | struct page_cgroup; |
| 93 | 93 | ||
| 94 | static inline void pgdat_page_cgroup_init(struct pglist_data *pgdat) | 94 | static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) |
| 95 | { | 95 | { |
| 96 | } | 96 | } |
| 97 | 97 | ||
diff --git a/kernel/cpu.c b/kernel/cpu.c index 5a732c5ef08b..8ea32e8d68b0 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
| @@ -462,7 +462,7 @@ out: | |||
| 462 | * It must be called by the arch code on the new cpu, before the new cpu | 462 | * It must be called by the arch code on the new cpu, before the new cpu |
| 463 | * enables interrupts and before the "boot" cpu returns from __cpu_up(). | 463 | * enables interrupts and before the "boot" cpu returns from __cpu_up(). |
| 464 | */ | 464 | */ |
| 465 | void notify_cpu_starting(unsigned int cpu) | 465 | void __cpuinit notify_cpu_starting(unsigned int cpu) |
| 466 | { | 466 | { |
| 467 | unsigned long val = CPU_STARTING; | 467 | unsigned long val = CPU_STARTING; |
| 468 | 468 | ||
diff --git a/kernel/profile.c b/kernel/profile.c index 5b7d1ac7124c..dc41827fbfee 100644 --- a/kernel/profile.c +++ b/kernel/profile.c | |||
| @@ -351,7 +351,7 @@ out: | |||
| 351 | put_cpu(); | 351 | put_cpu(); |
| 352 | } | 352 | } |
| 353 | 353 | ||
| 354 | static int __devinit profile_cpu_callback(struct notifier_block *info, | 354 | static int __cpuinit profile_cpu_callback(struct notifier_block *info, |
| 355 | unsigned long action, void *__cpu) | 355 | unsigned long action, void *__cpu) |
| 356 | { | 356 | { |
| 357 | int node, cpu = (unsigned long)__cpu; | 357 | int node, cpu = (unsigned long)__cpu; |
| @@ -596,7 +596,7 @@ out_cleanup: | |||
| 596 | #define create_hash_tables() ({ 0; }) | 596 | #define create_hash_tables() ({ 0; }) |
| 597 | #endif | 597 | #endif |
| 598 | 598 | ||
| 599 | int create_proc_profile(void) | 599 | int __ref create_proc_profile(void) /* false positive from hotcpu_notifier */ |
| 600 | { | 600 | { |
| 601 | struct proc_dir_entry *entry; | 601 | struct proc_dir_entry *entry; |
| 602 | 602 | ||
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1e68e4c39e2c..4c8bcd7dd8e0 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
| @@ -612,7 +612,7 @@ int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data) | |||
| 612 | return (copied == sizeof(data)) ? 0 : -EIO; | 612 | return (copied == sizeof(data)) ? 0 : -EIO; |
| 613 | } | 613 | } |
| 614 | 614 | ||
| 615 | #if defined CONFIG_COMPAT && defined __ARCH_WANT_COMPAT_SYS_PTRACE | 615 | #if defined CONFIG_COMPAT |
| 616 | #include <linux/compat.h> | 616 | #include <linux/compat.h> |
| 617 | 617 | ||
| 618 | int compat_ptrace_request(struct task_struct *child, compat_long_t request, | 618 | int compat_ptrace_request(struct task_struct *child, compat_long_t request, |
| @@ -709,4 +709,4 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, | |||
| 709 | unlock_kernel(); | 709 | unlock_kernel(); |
| 710 | return ret; | 710 | return ret; |
| 711 | } | 711 | } |
| 712 | #endif /* CONFIG_COMPAT && __ARCH_WANT_COMPAT_SYS_PTRACE */ | 712 | #endif /* CONFIG_COMPAT */ |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index b5b2b15085a8..b17371185468 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
| @@ -189,7 +189,7 @@ static void grow_pgdat_span(struct pglist_data *pgdat, unsigned long start_pfn, | |||
| 189 | pgdat->node_start_pfn; | 189 | pgdat->node_start_pfn; |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | static int __add_zone(struct zone *zone, unsigned long phys_start_pfn) | 192 | static int __meminit __add_zone(struct zone *zone, unsigned long phys_start_pfn) |
| 193 | { | 193 | { |
| 194 | struct pglist_data *pgdat = zone->zone_pgdat; | 194 | struct pglist_data *pgdat = zone->zone_pgdat; |
| 195 | int nr_pages = PAGES_PER_SECTION; | 195 | int nr_pages = PAGES_PER_SECTION; |
| @@ -216,7 +216,7 @@ static int __add_zone(struct zone *zone, unsigned long phys_start_pfn) | |||
| 216 | return 0; | 216 | return 0; |
| 217 | } | 217 | } |
| 218 | 218 | ||
| 219 | static int __add_section(struct zone *zone, unsigned long phys_start_pfn) | 219 | static int __meminit __add_section(struct zone *zone, unsigned long phys_start_pfn) |
| 220 | { | 220 | { |
| 221 | int nr_pages = PAGES_PER_SECTION; | 221 | int nr_pages = PAGES_PER_SECTION; |
| 222 | int ret; | 222 | int ret; |
| @@ -273,7 +273,7 @@ static int __remove_section(struct zone *zone, struct mem_section *ms) | |||
| 273 | * call this function after deciding the zone to which to | 273 | * call this function after deciding the zone to which to |
| 274 | * add the new pages. | 274 | * add the new pages. |
| 275 | */ | 275 | */ |
| 276 | int __add_pages(struct zone *zone, unsigned long phys_start_pfn, | 276 | int __ref __add_pages(struct zone *zone, unsigned long phys_start_pfn, |
| 277 | unsigned long nr_pages) | 277 | unsigned long nr_pages) |
| 278 | { | 278 | { |
| 279 | unsigned long i; | 279 | unsigned long i; |
| @@ -470,7 +470,8 @@ static void rollback_node_hotadd(int nid, pg_data_t *pgdat) | |||
| 470 | } | 470 | } |
| 471 | 471 | ||
| 472 | 472 | ||
| 473 | int add_memory(int nid, u64 start, u64 size) | 473 | /* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */ |
| 474 | int __ref add_memory(int nid, u64 start, u64 size) | ||
| 474 | { | 475 | { |
| 475 | pg_data_t *pgdat = NULL; | 476 | pg_data_t *pgdat = NULL; |
| 476 | int new_pgdat = 0; | 477 | int new_pgdat = 0; |
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index 1223d927904d..436c00229e70 100644 --- a/mm/page_cgroup.c +++ b/mm/page_cgroup.c | |||
| @@ -21,7 +21,7 @@ static unsigned long total_usage; | |||
| 21 | #if !defined(CONFIG_SPARSEMEM) | 21 | #if !defined(CONFIG_SPARSEMEM) |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | void __init pgdat_page_cgroup_init(struct pglist_data *pgdat) | 24 | void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) |
| 25 | { | 25 | { |
| 26 | pgdat->node_page_cgroup = NULL; | 26 | pgdat->node_page_cgroup = NULL; |
| 27 | } | 27 | } |
| @@ -97,7 +97,8 @@ struct page_cgroup *lookup_page_cgroup(struct page *page) | |||
| 97 | return section->page_cgroup + pfn; | 97 | return section->page_cgroup + pfn; |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | int __meminit init_section_page_cgroup(unsigned long pfn) | 100 | /* __alloc_bootmem...() is protected by !slab_available() */ |
| 101 | int __init_refok init_section_page_cgroup(unsigned long pfn) | ||
| 101 | { | 102 | { |
| 102 | struct mem_section *section; | 103 | struct mem_section *section; |
| 103 | struct page_cgroup *base, *pc; | 104 | struct page_cgroup *base, *pc; |
| @@ -158,7 +159,7 @@ void __free_page_cgroup(unsigned long pfn) | |||
| 158 | } | 159 | } |
| 159 | } | 160 | } |
| 160 | 161 | ||
| 161 | int online_page_cgroup(unsigned long start_pfn, | 162 | int __meminit online_page_cgroup(unsigned long start_pfn, |
| 162 | unsigned long nr_pages, | 163 | unsigned long nr_pages, |
| 163 | int nid) | 164 | int nid) |
| 164 | { | 165 | { |
| @@ -183,7 +184,7 @@ int online_page_cgroup(unsigned long start_pfn, | |||
| 183 | return -ENOMEM; | 184 | return -ENOMEM; |
| 184 | } | 185 | } |
| 185 | 186 | ||
| 186 | int offline_page_cgroup(unsigned long start_pfn, | 187 | int __meminit offline_page_cgroup(unsigned long start_pfn, |
| 187 | unsigned long nr_pages, int nid) | 188 | unsigned long nr_pages, int nid) |
| 188 | { | 189 | { |
| 189 | unsigned long start, end, pfn; | 190 | unsigned long start, end, pfn; |
| @@ -197,7 +198,7 @@ int offline_page_cgroup(unsigned long start_pfn, | |||
| 197 | 198 | ||
| 198 | } | 199 | } |
| 199 | 200 | ||
| 200 | static int page_cgroup_callback(struct notifier_block *self, | 201 | static int __meminit page_cgroup_callback(struct notifier_block *self, |
| 201 | unsigned long action, void *arg) | 202 | unsigned long action, void *arg) |
| 202 | { | 203 | { |
| 203 | struct memory_notify *mn = arg; | 204 | struct memory_notify *mn = arg; |
| @@ -248,7 +249,7 @@ void __init page_cgroup_init(void) | |||
| 248 | " want\n"); | 249 | " want\n"); |
| 249 | } | 250 | } |
| 250 | 251 | ||
| 251 | void __init pgdat_page_cgroup_init(struct pglist_data *pgdat) | 252 | void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) |
| 252 | { | 253 | { |
| 253 | return; | 254 | return; |
| 254 | } | 255 | } |
diff --git a/mm/sparse.c b/mm/sparse.c index 39db301b920d..083f5b63e7a8 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
| @@ -570,7 +570,7 @@ static void free_section_usemap(struct page *memmap, unsigned long *usemap) | |||
| 570 | * set. If this is <=0, then that means that the passed-in | 570 | * set. If this is <=0, then that means that the passed-in |
| 571 | * map was not consumed and must be freed. | 571 | * map was not consumed and must be freed. |
| 572 | */ | 572 | */ |
| 573 | int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, | 573 | int __meminit sparse_add_one_section(struct zone *zone, unsigned long start_pfn, |
| 574 | int nr_pages) | 574 | int nr_pages) |
| 575 | { | 575 | { |
| 576 | unsigned long section_nr = pfn_to_section_nr(start_pfn); | 576 | unsigned long section_nr = pfn_to_section_nr(start_pfn); |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index ba1ab737b55f..eb9164176dab 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -1436,12 +1436,12 @@ static void set_dig_out(struct hda_codec *codec, hda_nid_t nid, | |||
| 1436 | { | 1436 | { |
| 1437 | hda_nid_t *d; | 1437 | hda_nid_t *d; |
| 1438 | 1438 | ||
| 1439 | snd_hda_codec_write(codec, nid, 0, verb, val); | 1439 | snd_hda_codec_write_cache(codec, nid, 0, verb, val); |
| 1440 | d = codec->slave_dig_outs; | 1440 | d = codec->slave_dig_outs; |
| 1441 | if (!d) | 1441 | if (!d) |
| 1442 | return; | 1442 | return; |
| 1443 | for (; *d; d++) | 1443 | for (; *d; d++) |
| 1444 | snd_hda_codec_write(codec, *d, 0, verb, val); | 1444 | snd_hda_codec_write_cache(codec, *d, 0, verb, val); |
| 1445 | } | 1445 | } |
| 1446 | 1446 | ||
| 1447 | static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid, | 1447 | static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 9563b5bbb272..5dd3e89f620a 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -70,7 +70,9 @@ enum { | |||
| 70 | 70 | ||
| 71 | enum { | 71 | enum { |
| 72 | STAC_92HD73XX_REF, | 72 | STAC_92HD73XX_REF, |
| 73 | STAC_DELL_M6, | 73 | STAC_DELL_M6_AMIC, |
| 74 | STAC_DELL_M6_DMIC, | ||
| 75 | STAC_DELL_M6_BOTH, | ||
| 74 | STAC_DELL_EQ, | 76 | STAC_DELL_EQ, |
| 75 | STAC_92HD73XX_MODELS | 77 | STAC_92HD73XX_MODELS |
| 76 | }; | 78 | }; |
| @@ -84,6 +86,7 @@ enum { | |||
| 84 | STAC_92HD71BXX_REF, | 86 | STAC_92HD71BXX_REF, |
| 85 | STAC_DELL_M4_1, | 87 | STAC_DELL_M4_1, |
| 86 | STAC_DELL_M4_2, | 88 | STAC_DELL_M4_2, |
| 89 | STAC_DELL_M4_3, | ||
| 87 | STAC_HP_M4, | 90 | STAC_HP_M4, |
| 88 | STAC_92HD71BXX_MODELS | 91 | STAC_92HD71BXX_MODELS |
| 89 | }; | 92 | }; |
| @@ -137,6 +140,7 @@ struct sigmatel_spec { | |||
| 137 | unsigned int num_mixers; | 140 | unsigned int num_mixers; |
| 138 | 141 | ||
| 139 | int board_config; | 142 | int board_config; |
| 143 | unsigned int eapd_switch: 1; | ||
| 140 | unsigned int surr_switch: 1; | 144 | unsigned int surr_switch: 1; |
| 141 | unsigned int line_switch: 1; | 145 | unsigned int line_switch: 1; |
| 142 | unsigned int mic_switch: 1; | 146 | unsigned int mic_switch: 1; |
| @@ -1600,13 +1604,17 @@ static unsigned int dell_m6_pin_configs[13] = { | |||
| 1600 | 1604 | ||
| 1601 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { | 1605 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { |
| 1602 | [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs, | 1606 | [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs, |
| 1603 | [STAC_DELL_M6] = dell_m6_pin_configs, | 1607 | [STAC_DELL_M6_AMIC] = dell_m6_pin_configs, |
| 1608 | [STAC_DELL_M6_DMIC] = dell_m6_pin_configs, | ||
| 1609 | [STAC_DELL_M6_BOTH] = dell_m6_pin_configs, | ||
| 1604 | [STAC_DELL_EQ] = dell_m6_pin_configs, | 1610 | [STAC_DELL_EQ] = dell_m6_pin_configs, |
| 1605 | }; | 1611 | }; |
| 1606 | 1612 | ||
| 1607 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { | 1613 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { |
| 1608 | [STAC_92HD73XX_REF] = "ref", | 1614 | [STAC_92HD73XX_REF] = "ref", |
| 1609 | [STAC_DELL_M6] = "dell-m6", | 1615 | [STAC_DELL_M6_AMIC] = "dell-m6-amic", |
| 1616 | [STAC_DELL_M6_DMIC] = "dell-m6-dmic", | ||
| 1617 | [STAC_DELL_M6_BOTH] = "dell-m6", | ||
| 1610 | [STAC_DELL_EQ] = "dell-eq", | 1618 | [STAC_DELL_EQ] = "dell-eq", |
| 1611 | }; | 1619 | }; |
| 1612 | 1620 | ||
| @@ -1615,19 +1623,23 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
| 1615 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1623 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
| 1616 | "DFI LanParty", STAC_92HD73XX_REF), | 1624 | "DFI LanParty", STAC_92HD73XX_REF), |
| 1617 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, | 1625 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, |
| 1618 | "unknown Dell", STAC_DELL_M6), | 1626 | "Dell Studio 1535", STAC_DELL_M6_DMIC), |
| 1619 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, | 1627 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, |
| 1620 | "unknown Dell", STAC_DELL_M6), | 1628 | "unknown Dell", STAC_DELL_M6_DMIC), |
| 1621 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, | 1629 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, |
| 1622 | "unknown Dell", STAC_DELL_M6), | 1630 | "unknown Dell", STAC_DELL_M6_BOTH), |
| 1623 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, | 1631 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257, |
| 1624 | "unknown Dell", STAC_DELL_M6), | 1632 | "unknown Dell", STAC_DELL_M6_BOTH), |
| 1625 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, | 1633 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e, |
| 1626 | "unknown Dell", STAC_DELL_M6), | 1634 | "unknown Dell", STAC_DELL_M6_AMIC), |
| 1627 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, | 1635 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f, |
| 1628 | "unknown Dell", STAC_DELL_M6), | 1636 | "unknown Dell", STAC_DELL_M6_AMIC), |
| 1629 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, | 1637 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, |
| 1630 | "unknown Dell", STAC_DELL_M6), | 1638 | "unknown Dell", STAC_DELL_M6_DMIC), |
| 1639 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272, | ||
| 1640 | "unknown Dell", STAC_DELL_M6_DMIC), | ||
| 1641 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f, | ||
| 1642 | "Dell Studio 1537", STAC_DELL_M6_DMIC), | ||
| 1631 | {} /* terminator */ | 1643 | {} /* terminator */ |
| 1632 | }; | 1644 | }; |
| 1633 | 1645 | ||
| @@ -1670,10 +1682,17 @@ static unsigned int dell_m4_2_pin_configs[11] = { | |||
| 1670 | 0x40f000f0, 0x044413b0, 0x044413b0, | 1682 | 0x40f000f0, 0x044413b0, 0x044413b0, |
| 1671 | }; | 1683 | }; |
| 1672 | 1684 | ||
| 1685 | static unsigned int dell_m4_3_pin_configs[11] = { | ||
| 1686 | 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, | ||
| 1687 | 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0, | ||
| 1688 | 0x40f000f0, 0x044413b0, 0x044413b0, | ||
| 1689 | }; | ||
| 1690 | |||
| 1673 | static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { | 1691 | static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { |
| 1674 | [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs, | 1692 | [STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs, |
| 1675 | [STAC_DELL_M4_1] = dell_m4_1_pin_configs, | 1693 | [STAC_DELL_M4_1] = dell_m4_1_pin_configs, |
| 1676 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, | 1694 | [STAC_DELL_M4_2] = dell_m4_2_pin_configs, |
| 1695 | [STAC_DELL_M4_3] = dell_m4_3_pin_configs, | ||
| 1677 | [STAC_HP_M4] = NULL, | 1696 | [STAC_HP_M4] = NULL, |
| 1678 | }; | 1697 | }; |
| 1679 | 1698 | ||
| @@ -1681,6 +1700,7 @@ static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { | |||
| 1681 | [STAC_92HD71BXX_REF] = "ref", | 1700 | [STAC_92HD71BXX_REF] = "ref", |
| 1682 | [STAC_DELL_M4_1] = "dell-m4-1", | 1701 | [STAC_DELL_M4_1] = "dell-m4-1", |
| 1683 | [STAC_DELL_M4_2] = "dell-m4-2", | 1702 | [STAC_DELL_M4_2] = "dell-m4-2", |
| 1703 | [STAC_DELL_M4_3] = "dell-m4-3", | ||
| 1684 | [STAC_HP_M4] = "hp-m4", | 1704 | [STAC_HP_M4] = "hp-m4", |
| 1685 | }; | 1705 | }; |
| 1686 | 1706 | ||
| @@ -1716,6 +1736,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { | |||
| 1716 | "unknown Dell", STAC_DELL_M4_2), | 1736 | "unknown Dell", STAC_DELL_M4_2), |
| 1717 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, | 1737 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264, |
| 1718 | "unknown Dell", STAC_DELL_M4_2), | 1738 | "unknown Dell", STAC_DELL_M4_2), |
| 1739 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa, | ||
| 1740 | "unknown Dell", STAC_DELL_M4_3), | ||
| 1719 | {} /* terminator */ | 1741 | {} /* terminator */ |
| 1720 | }; | 1742 | }; |
| 1721 | 1743 | ||
| @@ -2877,7 +2899,7 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, | |||
| 2877 | cfg->hp_outs && !spec->multiout.hp_nid) | 2899 | cfg->hp_outs && !spec->multiout.hp_nid) |
| 2878 | spec->multiout.hp_nid = nid; | 2900 | spec->multiout.hp_nid = nid; |
| 2879 | 2901 | ||
| 2880 | if (cfg->hp_outs > 1) { | 2902 | if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) { |
| 2881 | err = stac92xx_add_control(spec, | 2903 | err = stac92xx_add_control(spec, |
| 2882 | STAC_CTL_WIDGET_HP_SWITCH, | 2904 | STAC_CTL_WIDGET_HP_SWITCH, |
| 2883 | "Headphone as Line Out Switch", | 2905 | "Headphone as Line Out Switch", |
| @@ -3683,10 +3705,14 @@ static void stac92xx_power_down(struct hda_codec *codec) | |||
| 3683 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3705 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); |
| 3684 | } | 3706 | } |
| 3685 | 3707 | ||
| 3708 | static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, | ||
| 3709 | int enable); | ||
| 3710 | |||
| 3686 | static int stac92xx_init(struct hda_codec *codec) | 3711 | static int stac92xx_init(struct hda_codec *codec) |
| 3687 | { | 3712 | { |
| 3688 | struct sigmatel_spec *spec = codec->spec; | 3713 | struct sigmatel_spec *spec = codec->spec; |
| 3689 | struct auto_pin_cfg *cfg = &spec->autocfg; | 3714 | struct auto_pin_cfg *cfg = &spec->autocfg; |
| 3715 | unsigned int gpio; | ||
| 3690 | int i; | 3716 | int i; |
| 3691 | 3717 | ||
| 3692 | snd_hda_sequence_write(codec, spec->init); | 3718 | snd_hda_sequence_write(codec, spec->init); |
| @@ -3697,6 +3723,16 @@ static int stac92xx_init(struct hda_codec *codec) | |||
| 3697 | snd_hda_codec_write_cache(codec, | 3723 | snd_hda_codec_write_cache(codec, |
| 3698 | spec->adc_nids[i], 0, | 3724 | spec->adc_nids[i], 0, |
| 3699 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); | 3725 | AC_VERB_SET_POWER_STATE, AC_PWRST_D3); |
| 3726 | |||
| 3727 | /* set up GPIO */ | ||
| 3728 | gpio = spec->gpio_data; | ||
| 3729 | /* turn on EAPD statically when spec->eapd_switch isn't set. | ||
| 3730 | * otherwise, unsol event will turn it on/off dynamically | ||
| 3731 | */ | ||
| 3732 | if (!spec->eapd_switch) | ||
| 3733 | gpio |= spec->eapd_mask; | ||
| 3734 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio); | ||
| 3735 | |||
| 3700 | /* set up pins */ | 3736 | /* set up pins */ |
| 3701 | if (spec->hp_detect) { | 3737 | if (spec->hp_detect) { |
| 3702 | /* Enable unsolicited responses on the HP widget */ | 3738 | /* Enable unsolicited responses on the HP widget */ |
| @@ -3736,39 +3772,43 @@ static int stac92xx_init(struct hda_codec *codec) | |||
| 3736 | for (i = 0; i < spec->num_dmics; i++) | 3772 | for (i = 0; i < spec->num_dmics; i++) |
| 3737 | stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], | 3773 | stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], |
| 3738 | AC_PINCTL_IN_EN); | 3774 | AC_PINCTL_IN_EN); |
| 3775 | if (cfg->dig_out_pin) | ||
| 3776 | stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin, | ||
| 3777 | AC_PINCTL_OUT_EN); | ||
| 3778 | if (cfg->dig_in_pin) | ||
| 3779 | stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, | ||
| 3780 | AC_PINCTL_IN_EN); | ||
| 3739 | for (i = 0; i < spec->num_pwrs; i++) { | 3781 | for (i = 0; i < spec->num_pwrs; i++) { |
| 3740 | int event = is_nid_hp_pin(cfg, spec->pwr_nids[i]) | 3782 | hda_nid_t nid = spec->pwr_nids[i]; |
| 3741 | ? STAC_HP_EVENT : STAC_PWR_EVENT; | 3783 | int pinctl, def_conf; |
| 3742 | int pinctl = snd_hda_codec_read(codec, spec->pwr_nids[i], | 3784 | int event = STAC_PWR_EVENT; |
| 3743 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | 3785 | |
| 3744 | int def_conf = snd_hda_codec_read(codec, spec->pwr_nids[i], | 3786 | if (is_nid_hp_pin(cfg, nid) && spec->hp_detect) |
| 3745 | 0, AC_VERB_GET_CONFIG_DEFAULT, 0); | 3787 | continue; /* already has an unsol event */ |
| 3746 | def_conf = get_defcfg_connect(def_conf); | 3788 | |
| 3789 | pinctl = snd_hda_codec_read(codec, nid, 0, | ||
| 3790 | AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
| 3747 | /* outputs are only ports capable of power management | 3791 | /* outputs are only ports capable of power management |
| 3748 | * any attempts on powering down a input port cause the | 3792 | * any attempts on powering down a input port cause the |
| 3749 | * referenced VREF to act quirky. | 3793 | * referenced VREF to act quirky. |
| 3750 | */ | 3794 | */ |
| 3751 | if (pinctl & AC_PINCTL_IN_EN) | 3795 | if (pinctl & AC_PINCTL_IN_EN) |
| 3752 | continue; | 3796 | continue; |
| 3797 | def_conf = snd_hda_codec_read(codec, nid, 0, | ||
| 3798 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
| 3799 | def_conf = get_defcfg_connect(def_conf); | ||
| 3753 | /* skip any ports that don't have jacks since presence | 3800 | /* skip any ports that don't have jacks since presence |
| 3754 | * detection is useless */ | 3801 | * detection is useless */ |
| 3755 | if (def_conf && def_conf != AC_JACK_PORT_FIXED) | 3802 | if (def_conf != AC_JACK_PORT_COMPLEX) { |
| 3803 | if (def_conf != AC_JACK_PORT_NONE) | ||
| 3804 | stac_toggle_power_map(codec, nid, 1); | ||
| 3756 | continue; | 3805 | continue; |
| 3806 | } | ||
| 3757 | enable_pin_detect(codec, spec->pwr_nids[i], event | i); | 3807 | enable_pin_detect(codec, spec->pwr_nids[i], event | i); |
| 3758 | codec->patch_ops.unsol_event(codec, (event | i) << 26); | 3808 | codec->patch_ops.unsol_event(codec, (event | i) << 26); |
| 3759 | } | 3809 | } |
| 3760 | if (spec->dac_list) | 3810 | if (spec->dac_list) |
| 3761 | stac92xx_power_down(codec); | 3811 | stac92xx_power_down(codec); |
| 3762 | if (cfg->dig_out_pin) | ||
| 3763 | stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin, | ||
| 3764 | AC_PINCTL_OUT_EN); | ||
| 3765 | if (cfg->dig_in_pin) | ||
| 3766 | stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, | ||
| 3767 | AC_PINCTL_IN_EN); | ||
| 3768 | |||
| 3769 | stac_gpio_set(codec, spec->gpio_mask, | ||
| 3770 | spec->gpio_dir, spec->gpio_data); | ||
| 3771 | |||
| 3772 | return 0; | 3812 | return 0; |
| 3773 | } | 3813 | } |
| 3774 | 3814 | ||
| @@ -3901,7 +3941,7 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) | |||
| 3901 | for (i = 0; i < cfg->speaker_outs; i++) | 3941 | for (i = 0; i < cfg->speaker_outs; i++) |
| 3902 | stac92xx_reset_pinctl(codec, cfg->speaker_pins[i], | 3942 | stac92xx_reset_pinctl(codec, cfg->speaker_pins[i], |
| 3903 | AC_PINCTL_OUT_EN); | 3943 | AC_PINCTL_OUT_EN); |
| 3904 | if (spec->eapd_mask) | 3944 | if (spec->eapd_mask && spec->eapd_switch) |
| 3905 | stac_gpio_set(codec, spec->gpio_mask, | 3945 | stac_gpio_set(codec, spec->gpio_mask, |
| 3906 | spec->gpio_dir, spec->gpio_data & | 3946 | spec->gpio_dir, spec->gpio_data & |
| 3907 | ~spec->eapd_mask); | 3947 | ~spec->eapd_mask); |
| @@ -3916,7 +3956,7 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) | |||
| 3916 | for (i = 0; i < cfg->speaker_outs; i++) | 3956 | for (i = 0; i < cfg->speaker_outs; i++) |
| 3917 | stac92xx_set_pinctl(codec, cfg->speaker_pins[i], | 3957 | stac92xx_set_pinctl(codec, cfg->speaker_pins[i], |
| 3918 | AC_PINCTL_OUT_EN); | 3958 | AC_PINCTL_OUT_EN); |
| 3919 | if (spec->eapd_mask) | 3959 | if (spec->eapd_mask && spec->eapd_switch) |
| 3920 | stac_gpio_set(codec, spec->gpio_mask, | 3960 | stac_gpio_set(codec, spec->gpio_mask, |
| 3921 | spec->gpio_dir, spec->gpio_data | | 3961 | spec->gpio_dir, spec->gpio_data | |
| 3922 | spec->eapd_mask); | 3962 | spec->eapd_mask); |
| @@ -3933,14 +3973,18 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) | |||
| 3933 | } | 3973 | } |
| 3934 | } | 3974 | } |
| 3935 | 3975 | ||
| 3936 | static void stac92xx_pin_sense(struct hda_codec *codec, int idx) | 3976 | static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid, |
| 3977 | int enable) | ||
| 3937 | { | 3978 | { |
| 3938 | struct sigmatel_spec *spec = codec->spec; | 3979 | struct sigmatel_spec *spec = codec->spec; |
| 3939 | hda_nid_t nid = spec->pwr_nids[idx]; | 3980 | unsigned int idx, val; |
| 3940 | int presence, val; | 3981 | |
| 3941 | val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) | 3982 | for (idx = 0; idx < spec->num_pwrs; idx++) { |
| 3942 | & 0x000000ff; | 3983 | if (spec->pwr_nids[idx] == nid) |
| 3943 | presence = get_hp_pin_presence(codec, nid); | 3984 | break; |
| 3985 | } | ||
| 3986 | if (idx >= spec->num_pwrs) | ||
| 3987 | return; | ||
| 3944 | 3988 | ||
| 3945 | /* several codecs have two power down bits */ | 3989 | /* several codecs have two power down bits */ |
| 3946 | if (spec->pwr_mapping) | 3990 | if (spec->pwr_mapping) |
| @@ -3948,14 +3992,20 @@ static void stac92xx_pin_sense(struct hda_codec *codec, int idx) | |||
| 3948 | else | 3992 | else |
| 3949 | idx = 1 << idx; | 3993 | idx = 1 << idx; |
| 3950 | 3994 | ||
| 3951 | if (presence) | 3995 | val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff; |
| 3996 | if (enable) | ||
| 3952 | val &= ~idx; | 3997 | val &= ~idx; |
| 3953 | else | 3998 | else |
| 3954 | val |= idx; | 3999 | val |= idx; |
| 3955 | 4000 | ||
| 3956 | /* power down unused output ports */ | 4001 | /* power down unused output ports */ |
| 3957 | snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val); | 4002 | snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val); |
| 3958 | }; | 4003 | } |
| 4004 | |||
| 4005 | static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid) | ||
| 4006 | { | ||
| 4007 | stac_toggle_power_map(codec, nid, get_hp_pin_presence(codec, nid)); | ||
| 4008 | } | ||
| 3959 | 4009 | ||
| 3960 | static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) | 4010 | static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) |
| 3961 | { | 4011 | { |
| @@ -4239,31 +4289,29 @@ again: | |||
| 4239 | case STAC_DELL_EQ: | 4289 | case STAC_DELL_EQ: |
| 4240 | spec->init = dell_eq_core_init; | 4290 | spec->init = dell_eq_core_init; |
| 4241 | /* fallthru */ | 4291 | /* fallthru */ |
| 4242 | case STAC_DELL_M6: | 4292 | case STAC_DELL_M6_AMIC: |
| 4293 | case STAC_DELL_M6_DMIC: | ||
| 4294 | case STAC_DELL_M6_BOTH: | ||
| 4243 | spec->num_smuxes = 0; | 4295 | spec->num_smuxes = 0; |
| 4244 | spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER]; | 4296 | spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER]; |
| 4245 | spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; | 4297 | spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; |
| 4298 | spec->eapd_switch = 0; | ||
| 4246 | spec->num_amps = 1; | 4299 | spec->num_amps = 1; |
| 4247 | 4300 | ||
| 4248 | if (!spec->init) | 4301 | if (!spec->init) |
| 4249 | spec->init = dell_m6_core_init; | 4302 | spec->init = dell_m6_core_init; |
| 4250 | switch (codec->subsystem_id) { | 4303 | switch (spec->board_config) { |
| 4251 | case 0x1028025e: /* Analog Mics */ | 4304 | case STAC_DELL_M6_AMIC: /* Analog Mics */ |
| 4252 | case 0x1028025f: | ||
| 4253 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); | 4305 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); |
| 4254 | spec->num_dmics = 0; | 4306 | spec->num_dmics = 0; |
| 4255 | spec->private_dimux.num_items = 1; | 4307 | spec->private_dimux.num_items = 1; |
| 4256 | break; | 4308 | break; |
| 4257 | case 0x10280271: /* Digital Mics */ | 4309 | case STAC_DELL_M6_DMIC: /* Digital Mics */ |
| 4258 | case 0x10280272: | ||
| 4259 | case 0x10280254: | ||
| 4260 | case 0x10280255: | ||
| 4261 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); | 4310 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); |
| 4262 | spec->num_dmics = 1; | 4311 | spec->num_dmics = 1; |
| 4263 | spec->private_dimux.num_items = 2; | 4312 | spec->private_dimux.num_items = 2; |
| 4264 | break; | 4313 | break; |
| 4265 | case 0x10280256: /* Both */ | 4314 | case STAC_DELL_M6_BOTH: /* Both */ |
| 4266 | case 0x10280057: | ||
| 4267 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); | 4315 | stac92xx_set_config_reg(codec, 0x0b, 0x90A70170); |
| 4268 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); | 4316 | stac92xx_set_config_reg(codec, 0x13, 0x90A60160); |
| 4269 | spec->num_dmics = 1; | 4317 | spec->num_dmics = 1; |
| @@ -4274,6 +4322,7 @@ again: | |||
| 4274 | default: | 4322 | default: |
| 4275 | spec->num_dmics = STAC92HD73XX_NUM_DMICS; | 4323 | spec->num_dmics = STAC92HD73XX_NUM_DMICS; |
| 4276 | spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids); | 4324 | spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids); |
| 4325 | spec->eapd_switch = 1; | ||
| 4277 | } | 4326 | } |
| 4278 | if (spec->board_config > STAC_92HD73XX_REF) { | 4327 | if (spec->board_config > STAC_92HD73XX_REF) { |
| 4279 | /* GPIO0 High = Enable EAPD */ | 4328 | /* GPIO0 High = Enable EAPD */ |
| @@ -4419,7 +4468,13 @@ static int stac92hd71xx_resume(struct hda_codec *codec) | |||
| 4419 | 4468 | ||
| 4420 | static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state) | 4469 | static int stac92hd71xx_suspend(struct hda_codec *codec, pm_message_t state) |
| 4421 | { | 4470 | { |
| 4471 | struct sigmatel_spec *spec = codec->spec; | ||
| 4472 | |||
| 4422 | stac92hd71xx_set_power_state(codec, AC_PWRST_D3); | 4473 | stac92hd71xx_set_power_state(codec, AC_PWRST_D3); |
| 4474 | if (spec->eapd_mask) | ||
| 4475 | stac_gpio_set(codec, spec->gpio_mask, | ||
| 4476 | spec->gpio_dir, spec->gpio_data & | ||
| 4477 | ~spec->eapd_mask); | ||
| 4423 | return 0; | 4478 | return 0; |
| 4424 | }; | 4479 | }; |
| 4425 | 4480 | ||
| @@ -4562,14 +4617,21 @@ again: | |||
| 4562 | 4617 | ||
| 4563 | switch (spec->board_config) { | 4618 | switch (spec->board_config) { |
| 4564 | case STAC_HP_M4: | 4619 | case STAC_HP_M4: |
| 4565 | spec->num_dmics = 0; | ||
| 4566 | spec->num_smuxes = 0; | ||
| 4567 | spec->num_dmuxes = 0; | ||
| 4568 | |||
| 4569 | /* enable internal microphone */ | 4620 | /* enable internal microphone */ |
| 4570 | stac92xx_set_config_reg(codec, 0x0e, 0x01813040); | 4621 | stac92xx_set_config_reg(codec, 0x0e, 0x01813040); |
| 4571 | stac92xx_auto_set_pinctl(codec, 0x0e, | 4622 | stac92xx_auto_set_pinctl(codec, 0x0e, |
| 4572 | AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); | 4623 | AC_PINCTL_IN_EN | AC_PINCTL_VREF_80); |
| 4624 | /* fallthru */ | ||
| 4625 | case STAC_DELL_M4_2: | ||
| 4626 | spec->num_dmics = 0; | ||
| 4627 | spec->num_smuxes = 0; | ||
| 4628 | spec->num_dmuxes = 0; | ||
| 4629 | break; | ||
| 4630 | case STAC_DELL_M4_1: | ||
| 4631 | case STAC_DELL_M4_3: | ||
| 4632 | spec->num_dmics = 1; | ||
| 4633 | spec->num_smuxes = 0; | ||
| 4634 | spec->num_dmuxes = 0; | ||
| 4573 | break; | 4635 | break; |
| 4574 | default: | 4636 | default: |
| 4575 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; | 4637 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; |
| @@ -4806,6 +4868,7 @@ static int patch_stac927x(struct hda_codec *codec) | |||
| 4806 | spec->num_pwrs = 0; | 4868 | spec->num_pwrs = 0; |
| 4807 | spec->aloopback_mask = 0x40; | 4869 | spec->aloopback_mask = 0x40; |
| 4808 | spec->aloopback_shift = 0; | 4870 | spec->aloopback_shift = 0; |
| 4871 | spec->eapd_switch = 1; | ||
| 4809 | 4872 | ||
| 4810 | err = stac92xx_parse_auto_config(codec, 0x1e, 0x20); | 4873 | err = stac92xx_parse_auto_config(codec, 0x1e, 0x20); |
| 4811 | if (!err) { | 4874 | if (!err) { |
| @@ -4886,6 +4949,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
| 4886 | 4949 | ||
| 4887 | spec->aloopback_mask = 0x40; | 4950 | spec->aloopback_mask = 0x40; |
| 4888 | spec->aloopback_shift = 0; | 4951 | spec->aloopback_shift = 0; |
| 4952 | spec->eapd_switch = 1; | ||
| 4889 | spec->multiout.dac_nids = spec->dac_nids; | 4953 | spec->multiout.dac_nids = spec->dac_nids; |
| 4890 | 4954 | ||
| 4891 | switch (spec->board_config){ | 4955 | switch (spec->board_config){ |
diff --git a/sound/sound_core.c b/sound/sound_core.c index a75b289a5d78..10ba4218161b 100644 --- a/sound/sound_core.c +++ b/sound/sound_core.c | |||
| @@ -457,7 +457,7 @@ EXPORT_SYMBOL(unregister_sound_mixer); | |||
| 457 | 457 | ||
| 458 | void unregister_sound_midi(int unit) | 458 | void unregister_sound_midi(int unit) |
| 459 | { | 459 | { |
| 460 | return sound_remove_unit(&chains[2], unit); | 460 | sound_remove_unit(&chains[2], unit); |
| 461 | } | 461 | } |
| 462 | 462 | ||
| 463 | EXPORT_SYMBOL(unregister_sound_midi); | 463 | EXPORT_SYMBOL(unregister_sound_midi); |
| @@ -474,7 +474,7 @@ EXPORT_SYMBOL(unregister_sound_midi); | |||
| 474 | 474 | ||
| 475 | void unregister_sound_dsp(int unit) | 475 | void unregister_sound_dsp(int unit) |
| 476 | { | 476 | { |
| 477 | return sound_remove_unit(&chains[3], unit); | 477 | sound_remove_unit(&chains[3], unit); |
| 478 | } | 478 | } |
| 479 | 479 | ||
| 480 | 480 | ||
| @@ -507,7 +507,7 @@ static struct sound_unit *__look_for_unit(int chain, int unit) | |||
| 507 | return NULL; | 507 | return NULL; |
| 508 | } | 508 | } |
| 509 | 509 | ||
| 510 | int soundcore_open(struct inode *inode, struct file *file) | 510 | static int soundcore_open(struct inode *inode, struct file *file) |
| 511 | { | 511 | { |
| 512 | int chain; | 512 | int chain; |
| 513 | int unit = iminor(inode); | 513 | int unit = iminor(inode); |
diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index d44bf98e965e..6c427bbac326 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c | |||
| @@ -1856,7 +1856,7 @@ static int __init snd_cs4231_sbus_create(struct snd_card *card, | |||
| 1856 | return 0; | 1856 | return 0; |
| 1857 | } | 1857 | } |
| 1858 | 1858 | ||
| 1859 | static int __devinit cs4231_sbus_probe(struct of_device *op, const struct of_device_id *match) | 1859 | static int __init cs4231_sbus_probe(struct of_device *op, const struct of_device_id *match) |
| 1860 | { | 1860 | { |
| 1861 | struct resource *rp = &op->resource[0]; | 1861 | struct resource *rp = &op->resource[0]; |
| 1862 | struct snd_card *card; | 1862 | struct snd_card *card; |
| @@ -2048,7 +2048,7 @@ static int __init snd_cs4231_ebus_create(struct snd_card *card, | |||
| 2048 | return 0; | 2048 | return 0; |
| 2049 | } | 2049 | } |
| 2050 | 2050 | ||
| 2051 | static int __devinit cs4231_ebus_probe(struct of_device *op, const struct of_device_id *match) | 2051 | static int __init cs4231_ebus_probe(struct of_device *op, const struct of_device_id *match) |
| 2052 | { | 2052 | { |
| 2053 | struct snd_card *card; | 2053 | struct snd_card *card; |
| 2054 | int err; | 2054 | int err; |
| @@ -2072,7 +2072,7 @@ static int __devinit cs4231_ebus_probe(struct of_device *op, const struct of_dev | |||
| 2072 | } | 2072 | } |
| 2073 | #endif | 2073 | #endif |
| 2074 | 2074 | ||
| 2075 | static int __devinit cs4231_probe(struct of_device *op, const struct of_device_id *match) | 2075 | static int __init cs4231_probe(struct of_device *op, const struct of_device_id *match) |
| 2076 | { | 2076 | { |
| 2077 | #ifdef EBUS_SUPPORT | 2077 | #ifdef EBUS_SUPPORT |
| 2078 | if (!strcmp(op->node->parent->name, "ebus")) | 2078 | if (!strcmp(op->node->parent->name, "ebus")) |
| @@ -2086,7 +2086,7 @@ static int __devinit cs4231_probe(struct of_device *op, const struct of_device_i | |||
| 2086 | return -ENODEV; | 2086 | return -ENODEV; |
| 2087 | } | 2087 | } |
| 2088 | 2088 | ||
| 2089 | static int __devexit cs4231_remove(struct of_device *op) | 2089 | static int __exit cs4231_remove(struct of_device *op) |
| 2090 | { | 2090 | { |
| 2091 | struct snd_cs4231 *chip = dev_get_drvdata(&op->dev); | 2091 | struct snd_cs4231 *chip = dev_get_drvdata(&op->dev); |
| 2092 | 2092 | ||
| @@ -2112,7 +2112,7 @@ static struct of_platform_driver cs4231_driver = { | |||
| 2112 | .name = "audio", | 2112 | .name = "audio", |
| 2113 | .match_table = cs4231_match, | 2113 | .match_table = cs4231_match, |
| 2114 | .probe = cs4231_probe, | 2114 | .probe = cs4231_probe, |
| 2115 | .remove = __devexit_p(cs4231_remove), | 2115 | .remove = __exit_p(cs4231_remove), |
| 2116 | }; | 2116 | }; |
| 2117 | 2117 | ||
| 2118 | static int __init cs4231_init(void) | 2118 | static int __init cs4231_init(void) |
