Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
Linus Torvalds [Sun, 30 Nov 2008 19:07:16 +0000 (11:07 -0800)]
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6:
  [S390] Update default configuration.
  [S390] Fix alignment of initial kernel stack.
  [S390] pgtable.h: Fix oops in unmap_vmas for KVM processes
  [S390] fix/cleanup sched_clock
  [S390] fix system call parameter functions.

86 files changed:
Documentation/input/input-programming.txt
arch/Kconfig
arch/alpha/kernel/pci.c
arch/alpha/kernel/smp.c
arch/alpha/kernel/traps.c
arch/ia64/include/asm/ptrace.h
arch/ia64/sn/kernel/io_init.c
arch/m32r/kernel/head.S
arch/m32r/kernel/vmlinux.lds.S
arch/mips/include/asm/bug.h
arch/mips/include/asm/ptrace.h
arch/parisc/include/asm/ptrace.h
arch/powerpc/include/asm/mmu-hash64.h
arch/powerpc/include/asm/ptrace.h
arch/powerpc/mm/hugetlbpage.c
arch/s390/include/asm/ptrace.h
arch/sparc/include/asm/ptrace_64.h
arch/sparc/kernel/cpu.c
arch/sparc/kernel/head.S
arch/sparc/kernel/smp.c
arch/sparc/kernel/sun4d_smp.c
arch/sparc/kernel/sun4m_smp.c
arch/sparc/kernel/trampoline.S
arch/sparc/kernel/vmlinux.lds.S
arch/sparc/mm/srmmu.c
arch/sparc64/kernel/pci_fire.c
arch/sparc64/kernel/pci_psycho.c
arch/sparc64/kernel/pci_sun4v.c
arch/sparc64/kernel/smp.c
arch/sparc64/mm/init.c
arch/x86/include/asm/ptrace.h
arch/x86/kernel/apic.c
arch/x86/kernel/kvmclock.c
arch/x86/xen/smp.c
arch/x86/xen/xen-ops.h
drivers/acpi/battery.c
drivers/acpi/blacklist.c
drivers/acpi/ec.c
drivers/acpi/osl.c
drivers/acpi/scan.c
drivers/acpi/sleep/main.c
drivers/acpi/toshiba_acpi.c
drivers/acpi/utils.c
drivers/char/agp/uninorth-agp.c
drivers/char/istallion.c
drivers/crypto/talitos.c
drivers/ide/icside.c
drivers/input/ff-memless.c
drivers/input/keyboard/atkbd.c
drivers/input/misc/cm109.c
drivers/input/mouse/hgpk.c
drivers/input/serio/i8042-x86ia64io.h
drivers/input/tablet/wacom.h
drivers/input/tablet/wacom_sys.c
drivers/input/tablet/wacom_wac.c
drivers/input/tablet/wacom_wac.h
drivers/input/touchscreen/elo.c
drivers/input/xen-kbdfront.c
drivers/isdn/hisax/config.c
drivers/macintosh/rack-meter.c
drivers/misc/sony-laptop.c
drivers/misc/thinkpad_acpi.c
drivers/net/ixgbe/ixgbe_main.c
drivers/net/pcmcia/ibmtr_cs.c
drivers/net/smc911x.c
drivers/net/smc91x.c
drivers/net/xen-netfront.c
drivers/pci/pci.c
drivers/rapidio/rio-scan.c
drivers/rapidio/rio.c
drivers/sbus/char/bbc_i2c.c
drivers/scsi/advansys.c
drivers/scsi/gdth.c
drivers/video/xen-fbfront.c
drivers/w1/masters/Kconfig
include/acpi/acpredef.h
include/linux/compat.h
include/linux/memory.h
include/linux/page_cgroup.h
kernel/cpu.c
kernel/profile.c
kernel/ptrace.c
mm/memory_hotplug.c
mm/page_cgroup.c
mm/sparse.c
sound/sparc/cs4231.c

index 81905e8..7f8b9d9 100644 (file)
@@ -20,10 +20,11 @@ pressed or released a BUTTON_IRQ happens. The driver could look like:
 
 static struct input_dev *button_dev;
 
-static void button_interrupt(int irq, void *dummy, struct pt_regs *fp)
+static irqreturn_t button_interrupt(int irq, void *dummy)
 {
        input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1);
        input_sync(button_dev);
+       return IRQ_HANDLED;
 }
 
 static int __init button_init(void)
index 8977d99..471e72d 100644 (file)
@@ -79,8 +79,6 @@ config HAVE_KRETPROBES
 #      task_pt_regs()          in asm/processor.h or asm/ptrace.h
 #      arch_has_single_step()  if there is hardware single-step support
 #      arch_has_block_step()   if there is hardware block-step support
-#      arch_ptrace()           and not #define __ARCH_SYS_PTRACE
-#      compat_arch_ptrace()    and #define __ARCH_WANT_COMPAT_SYS_PTRACE
 #      asm/syscall.h           supplying asm-generic/syscall.h interface
 #      linux/regset.h          user_regset interfaces
 #      CORE_DUMP_USE_REGSET    #define'd in linux/elf.h
index 5cf45fc..ff8cb63 100644 (file)
@@ -338,7 +338,7 @@ common_swizzle(struct pci_dev *dev, u8 *pinp)
        return PCI_SLOT(dev->devfn);
 }
 
-void __devinit
+void
 pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
                         struct resource *res)
 {
index e657c45..cf7da10 100644 (file)
@@ -121,7 +121,7 @@ wait_boot_cpu_to_stop(int cpuid)
 /*
  * Where secondaries begin a life of C.
  */
-void __init
+void __cpuinit
 smp_callin(void)
 {
        int cpuid = hard_smp_processor_id();
@@ -198,7 +198,7 @@ wait_for_txrdy (unsigned long cpumask)
  * Send a message to a secondary's console.  "START" is one such
  * interesting message.  ;-)
  */
-static void __init
+static void __cpuinit
 send_secondary_console_msg(char *str, int cpuid)
 {
        struct percpu_struct *cpu;
@@ -289,7 +289,7 @@ recv_secondary_console_msg(void)
 /*
  * Convince the console to have a secondary cpu begin execution.
  */
-static int __init
+static int __cpuinit
 secondary_cpu_start(int cpuid, struct task_struct *idle)
 {
        struct percpu_struct *cpu;
index c778779..cefc5a3 100644 (file)
@@ -31,7 +31,7 @@
 
 static int opDEC_fix;
 
-static void __init
+static void __cpuinit
 opDEC_check(void)
 {
        __asm__ __volatile__ (
@@ -1072,7 +1072,7 @@ give_sigbus:
        return;
 }
 
-void __init
+void __cpuinit
 trap_init(void)
 {
        /* Tell PAL-code what global pointer we want in the kernel.  */
index 6417c1e..14055c6 100644 (file)
@@ -325,8 +325,6 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)
   #define arch_has_block_step()   (1)
   extern void user_enable_block_step(struct task_struct *);
 
-#define __ARCH_WANT_COMPAT_SYS_PTRACE
-
 #endif /* !__KERNEL__ */
 
 /* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */
index c3aa851..4e1801b 100644 (file)
@@ -292,7 +292,7 @@ EXPORT_SYMBOL(sn_io_slot_fixup);
  * sn_pci_controller_fixup() - This routine sets up a bus's resources
  *                            consistent with the Linux PCI abstraction layer.
  */
-static void
+static void __init
 sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
 {
        s64 status = 0;
index 4018077..9091606 100644 (file)
@@ -23,7 +23,7 @@ __INITDATA
 /*
  * References to members of the boot_cpu_data structure.
  */
-       .text
+.section .text.head, "ax"
        .global start_kernel
        .global __bss_start
        .global _end
@@ -133,7 +133,6 @@ loop1:
 /*
  * AP startup routine
  */
-       .text
        .global eit_vector
 ENTRY(startup_AP)
 ;; setup EVB
@@ -230,6 +229,7 @@ ENTRY(startup_AP)
        nop
 #endif  /* CONFIG_SMP */
 
+       .text
 ENTRY(stack_start)
        .long   init_thread_union+8192
        .long   __KERNEL_DS
index 15a6f36..9db05df 100644 (file)
@@ -27,6 +27,7 @@ SECTIONS
   _text = .;                   /* Text and read-only data */
   .boot : { *(.boot) } = 0
   .text : {
+       *(.text.head)
        TEXT_TEXT
        SCHED_TEXT
        LOCK_TEXT
index 7eb63de..08ea468 100644 (file)
@@ -7,20 +7,31 @@
 
 #include <asm/break.h>
 
-#define BUG()                                                          \
-do {                                                                   \
-       __asm__ __volatile__("break %0" : : "i" (BRK_BUG));             \
-} while (0)
+static inline void __noreturn BUG(void)
+{
+       __asm__ __volatile__("break %0" : : "i" (BRK_BUG));
+       /* Fool GCC into thinking the function doesn't return. */
+       while (1)
+               ;
+}
 
 #define HAVE_ARCH_BUG
 
 #if (_MIPS_ISA > _MIPS_ISA_MIPS1)
 
-#define BUG_ON(condition)                                              \
-do {                                                                   \
-       __asm__ __volatile__("tne $0, %0, %1"                           \
-                            : : "r" (condition), "i" (BRK_BUG));       \
-} while (0)
+static inline void  __BUG_ON(unsigned long condition)
+{
+       if (__builtin_constant_p(condition)) {
+               if (condition)
+                       BUG();
+               else
+                       return;
+       }
+       __asm__ __volatile__("tne $0, %0, %1"
+                            : : "r" (condition), "i" (BRK_BUG));
+}
+
+#define BUG_ON(C) __BUG_ON((unsigned long)(C))
 
 #define HAVE_ARCH_BUG_ON
 
index 813abd1..c2c8bac 100644 (file)
@@ -9,10 +9,6 @@
 #ifndef _ASM_PTRACE_H
 #define _ASM_PTRACE_H
 
-#ifdef CONFIG_64BIT
-#define __ARCH_WANT_COMPAT_SYS_PTRACE
-#endif
-
 /* 0 - 31 are integer registers, 32 - 63 are fp registers.  */
 #define FPR_BASE       32
 #define PC             64
index afa5333..302f68d 100644 (file)
@@ -47,8 +47,6 @@ struct pt_regs {
 
 #define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS))
 
-#define __ARCH_WANT_COMPAT_SYS_PTRACE
-
 struct task_struct;
 #define arch_has_single_step() 1
 void user_disable_single_step(struct task_struct *task);
index 5a44174..68b7526 100644 (file)
@@ -280,7 +280,6 @@ extern int hash_huge_page(struct mm_struct *mm, unsigned long access,
 extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
                             unsigned long pstart, unsigned long prot,
                             int psize, int ssize);
-extern void set_huge_psize(int psize);
 extern void add_gpage(unsigned long addr, unsigned long page_size,
                          unsigned long number_of_pages);
 extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr);
index 280a90c..c9c678f 100644 (file)
@@ -55,8 +55,6 @@ struct pt_regs {
 
 #ifdef __powerpc64__
 
-#define __ARCH_WANT_COMPAT_SYS_PTRACE
-
 #define STACK_FRAME_OVERHEAD   112     /* size of minimum stack frame */
 #define STACK_FRAME_LR_SAVE    2       /* Location of LR in stack frame */
 #define STACK_FRAME_REGS_MARKER        ASM_CONST(0x7265677368657265)
index a117024..7bbf4e4 100644 (file)
@@ -677,7 +677,7 @@ repeat:
        return err;
 }
 
-void set_huge_psize(int psize)
+static void __init set_huge_psize(int psize)
 {
        /* Check that it is a page size supported by the hardware and
         * that it fits within pagetable limits. */
index fb0ca47..5396f9f 100644 (file)
@@ -486,8 +486,6 @@ struct task_struct;
 extern void user_enable_single_step(struct task_struct *);
 extern void user_disable_single_step(struct task_struct *);
 
-#define __ARCH_WANT_COMPAT_SYS_PTRACE
-
 #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)
 #define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN)
 #define user_stack_pointer(regs)((regs)->gprs[15])
index 3d3e9c1..84e969f 100644 (file)
@@ -142,8 +142,6 @@ struct global_reg_snapshot {
 };
 extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
 
-#define __ARCH_WANT_COMPAT_SYS_PTRACE
-
 #define force_successful_syscall_return()          \
 do {   current_thread_info()->syscall_noerror = 1; \
 } while (0)
index e7a0edf..1fc17f5 100644 (file)
@@ -126,7 +126,7 @@ char *sparc_fpu_type;
 
 unsigned int fsr_storage;
 
-void __init cpu_probe(void)
+void __cpuinit cpu_probe(void)
 {
        int psr_impl, psr_vers, fpu_vers;
        int i, psr;
index 2d325fd..51b4042 100644 (file)
@@ -72,7 +72,7 @@ sun4e_notsup:
        .align 4
 
        /* The Sparc trap table, bootloader gives us control at _start. */
-       .text
+       .section .text.head,"ax"
        .globl  start, _stext, _start, __stext
        .globl  trapbase
 _start:   /* danger danger */
index 1619ec1..e396c1f 100644 (file)
@@ -35,7 +35,7 @@
 
 #include "irq.h"
 
-volatile unsigned long cpu_callin_map[NR_CPUS] __initdata = {0,};
+volatile unsigned long cpu_callin_map[NR_CPUS] __cpuinitdata = {0,};
 unsigned char boot_cpu_id = 0;
 unsigned char boot_cpu_id4 = 0; /* boot_cpu_id << 2 */
 
@@ -120,7 +120,7 @@ void cpu_panic(void)
        panic("SMP bolixed\n");
 }
 
-struct linux_prom_registers smp_penguin_ctable __initdata = { 0 };
+struct linux_prom_registers smp_penguin_ctable __cpuinitdata = { 0 };
 
 void smp_send_reschedule(int cpu)
 {
index 7a6a5e7..16ab0cb 100644 (file)
@@ -83,7 +83,7 @@ static inline void show_leds(int cpuid)
                              "i" (ASI_M_CTL));
 }
 
-void __init smp4d_callin(void)
+void __cpuinit smp4d_callin(void)
 {
        int cpuid = hard_smp4d_processor_id();
        extern spinlock_t sun4d_imsk_lock;
@@ -386,7 +386,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs)
 
 extern unsigned int lvl14_resolution;
 
-static void __init smp_setup_percpu_timer(void)
+static void __cpuinit smp_setup_percpu_timer(void)
 {
        int cpu = hard_smp4d_processor_id();
 
index 5fc386d..4f8d605 100644 (file)
@@ -343,7 +343,7 @@ void smp4m_percpu_timer_interrupt(struct pt_regs *regs)
 
 extern unsigned int lvl14_resolution;
 
-static void __init smp_setup_percpu_timer(void)
+static void __cpuinit smp_setup_percpu_timer(void)
 {
        int cpu = smp_processor_id();
 
index 356c56a..5e235c5 100644 (file)
@@ -18,7 +18,7 @@
        .globl sun4m_cpu_startup, __smp4m_processor_id
        .globl sun4d_cpu_startup, __smp4d_processor_id
 
-       __INIT
+       __CPUINIT
        .align 4
 
 /* When we start up a cpu for the first time it enters this routine.
@@ -109,7 +109,7 @@ __smp4d_processor_id:
 /* CPUID in bootbus can be found at PA 0xff0140000 */
 #define SUN4D_BOOTBUS_CPUID    0xf0140000
 
-       __INIT
+       __CPUINIT
        .align  4
 
 sun4d_cpu_startup:
index b1002c6..5b7e69a 100644 (file)
@@ -13,6 +13,7 @@ SECTIONS
        .text 0xf0004000 :
        {
                _text = .;
+               *(.text.head)
                TEXT_TEXT
                SCHED_TEXT
                LOCK_TEXT
index 6a5d7ca..dd8aa36 100644 (file)
@@ -1251,7 +1251,7 @@ static inline void map_kernel(void)
 /* Paging initialization on the Sparc Reference MMU. */
 extern void sparc_context_init(int);
 
-void (*poke_srmmu)(void) __initdata = NULL;
+void (*poke_srmmu)(void) __cpuinitdata = NULL;
 
 extern unsigned long bootmem_init(unsigned long *pages_avail);
 
@@ -1446,7 +1446,7 @@ static void __init init_vac_layout(void)
               (int)vac_cache_size, (int)vac_line_size);
 }
 
-static void __init poke_hypersparc(void)
+static void __cpuinit poke_hypersparc(void)
 {
        volatile unsigned long clear;
        unsigned long mreg = srmmu_get_mmureg();
@@ -1501,7 +1501,7 @@ static void __init init_hypersparc(void)
        hypersparc_setup_blockops();
 }
 
-static void __init poke_cypress(void)
+static void __cpuinit poke_cypress(void)
 {
        unsigned long mreg = srmmu_get_mmureg();
        unsigned long faddr, tagval;
@@ -1589,7 +1589,7 @@ static void __init init_cypress_605(unsigned long mrev)
        init_cypress_common();
 }
 
-static void __init poke_swift(void)
+static void __cpuinit poke_swift(void)
 {
        unsigned long mreg;
 
@@ -1771,7 +1771,7 @@ static void turbosparc_flush_tlb_page(struct vm_area_struct *vma, unsigned long
 }
 
 
-static void __init poke_turbosparc(void)
+static void __cpuinit poke_turbosparc(void)
 {
        unsigned long mreg = srmmu_get_mmureg();
        unsigned long ccreg;
@@ -1834,7 +1834,7 @@ static void __init init_turbosparc(void)
        poke_srmmu = poke_turbosparc;
 }
 
-static void __init poke_tsunami(void)
+static void __cpuinit poke_tsunami(void)
 {
        unsigned long mreg = srmmu_get_mmureg();
 
@@ -1876,7 +1876,7 @@ static void __init init_tsunami(void)
        tsunami_setup_blockops();
 }
 
-static void __init poke_viking(void)
+static void __cpuinit poke_viking(void)
 {
        unsigned long mreg = srmmu_get_mmureg();
        static int smp_catch;
index 9462b68..fcbbac6 100644 (file)
@@ -455,7 +455,7 @@ static int __init pci_fire_pbm_init(struct pci_pbm_info *pbm,
        return 0;
 }
 
-static int __devinit fire_probe(struct of_device *op,
+static int __init fire_probe(struct of_device *op,
                                const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
index dfb3ec8..56605ad 100644 (file)
@@ -493,7 +493,7 @@ static void __init psycho_pbm_init(struct pci_pbm_info *pbm,
        psycho_scan_bus(pbm, &op->dev);
 }
 
-static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)
+static struct pci_pbm_info * __init psycho_find_sibling(u32 upa_portid)
 {
        struct pci_pbm_info *pbm;
 
@@ -506,7 +506,7 @@ static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)
 
 #define PSYCHO_CONFIGSPACE     0x001000000UL
 
-static int __devinit psycho_probe(struct of_device *op,
+static int __init psycho_probe(struct of_device *op,
                                  const struct of_device_id *match)
 {
        const struct linux_prom64_registers *pr_regs;
index 34a1fde..4b27b0e 100644 (file)
@@ -929,7 +929,7 @@ static int __init pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
        return 0;
 }
 
-static int __devinit pci_sun4v_probe(struct of_device *op,
+static int __init pci_sun4v_probe(struct of_device *op,
                                     const struct of_device_id *match)
 {
        const struct linux_prom64_registers *regs;
index e562711..f500b06 100644 (file)
@@ -282,7 +282,7 @@ static unsigned long kimage_addr_to_ra(void *p)
        return kern_base + (val - KERNBASE);
 }
 
-static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg)
+static void __cpuinit ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg)
 {
        extern unsigned long sparc64_ttable_tl0;
        extern unsigned long kern_locked_tte_data;
@@ -343,7 +343,7 @@ extern unsigned long sparc64_cpu_startup;
  */
 static struct thread_info *cpu_new_thread = NULL;
 
-static int __devinit smp_boot_one_cpu(unsigned int cpu)
+static int __cpuinit smp_boot_one_cpu(unsigned int cpu)
 {
        struct trap_per_cpu *tb = &trap_block[cpu];
        unsigned long entry =
index 3c10daf..185f346 100644 (file)
@@ -956,7 +956,7 @@ int of_node_to_nid(struct device_node *dp)
        return nid;
 }
 
-static void add_node_ranges(void)
+static void __init add_node_ranges(void)
 {
        int i;
 
index d1531c8..eefb059 100644 (file)
@@ -271,8 +271,6 @@ extern int do_get_thread_area(struct task_struct *p, int idx,
 extern int do_set_thread_area(struct task_struct *p, int idx,
                              struct user_desc __user *info, int can_allocate);
 
-#define __ARCH_WANT_COMPAT_SYS_PTRACE
-
 #endif /* __KERNEL__ */
 
 #endif /* !__ASSEMBLY__ */
index 04a7f96..16f9487 100644 (file)
@@ -1315,7 +1315,7 @@ void enable_x2apic(void)
        }
 }
 
-void enable_IR_x2apic(void)
+void __init enable_IR_x2apic(void)
 {
 #ifdef CONFIG_INTR_REMAP
        int ret;
index 1c9cc43..e169ae9 100644 (file)
@@ -128,7 +128,7 @@ static int kvm_register_clock(char *txt)
 }
 
 #ifdef CONFIG_X86_LOCAL_APIC
-static void __devinit kvm_setup_secondary_clock(void)
+static void __cpuinit kvm_setup_secondary_clock(void)
 {
        /*
         * Now that the first cpu already had this clocksource initialized,
index d77da61..acd9b67 100644 (file)
@@ -362,7 +362,7 @@ static void xen_cpu_die(unsigned int cpu)
                alternatives_smp_switch(0);
 }
 
-static void xen_play_dead(void)
+static void __cpuinit xen_play_dead(void) /* used only with CPU_HOTPLUG */
 {
        play_dead_common();
        HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
index d7422dc..9e1afae 100644 (file)
@@ -49,7 +49,7 @@ bool xen_vcpu_stolen(int vcpu);
 
 void xen_mark_init_mm_pinned(void);
 
-void __init xen_setup_vcpu_info_placement(void);
+void xen_setup_vcpu_info_placement(void);
 
 #ifdef CONFIG_SMP
 void xen_smp_init(void);
index 1423b0c..a0a178d 100644 (file)
@@ -174,6 +174,15 @@ static int acpi_battery_get_property(struct power_supply *psy,
                break;
        case POWER_SUPPLY_PROP_CURRENT_NOW:
                val->intval = battery->current_now * 1000;
+               /* if power units are mW, convert to mA by
+                  dividing by current voltage (mV/1000) */
+               if (!battery->power_unit) {
+                       if (battery->voltage_now) {
+                               val->intval /= battery->voltage_now;
+                               val->intval *= 1000;
+                       } else
+                               val->intval = -1;
+               }
                break;
        case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
        case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
index ea92bac..09c6980 100644 (file)
@@ -176,16 +176,6 @@ static int __init dmi_enable_osi_linux(const struct dmi_system_id *d)
        acpi_dmi_osi_linux(1, d);       /* enable */
        return 0;
 }
-static int __init dmi_disable_osi_linux(const struct dmi_system_id *d)
-{
-       acpi_dmi_osi_linux(0, d);       /* disable */
-       return 0;
-}
-static int __init dmi_unknown_osi_linux(const struct dmi_system_id *d)
-{
-       acpi_dmi_osi_linux(-1, d);      /* unknown */
-       return 0;
-}
 static int __init dmi_disable_osi_vista(const struct dmi_system_id *d)
 {
        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)
        return 0;
 }
 
-/*
- * Most BIOS that invoke OSI(Linux) do nothing with it.
- * But some cause Linux to break.
- * Only a couple use it to make Linux run better.
- *
- * Thus, Linux should continue to disable OSI(Linux) by default,
- * should continue to discourage BIOS writers from using it, and
- * should whitelist the few existing systems that require it.
- *
- * If it appears clear a vendor isn't using OSI(Linux)
- * for anything constructive, blacklist them by name to disable
- * unnecessary dmesg warnings on all of their products.
- */
-
 static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
-       /*
-        * Disable OSI(Linux) warnings on all "Acer, inc."
-        *
-        * _OSI(Linux) disables the latest Windows BIOS code:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"),
-        * _OSI(Linux) effect unknown:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"),
-        */
-       /*
-        * note that dmi_check_system() uses strstr()
-        * to match sub-strings rather than !strcmp(),
-        * so "Acer" below matches "Acer, inc." above.
-        */
-       /*
-        * Disable OSI(Linux) warnings on all "Acer"
-        *
-        * _OSI(Linux) effect unknown:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"),
-        *
-        * _OSI(Linux) is a NOP:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Acer",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "Apple Computer, Inc."
-        * Disable OSI(Linux) warnings on all "Apple Inc."
-        *
-        * _OSI(Linux) confirmed to be a NOP:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
-        * _OSI(Linux) effect unknown:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Apple",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Apple"),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "BenQ"
-        *
-        * _OSI(Linux) confirmed to be a NOP:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "BenQ",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "BenQ"),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "Clevo Co."
-        *
-        * _OSI(Linux) confirmed to be a NOP:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Clevo",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Clevo Co."),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "COMPAL"
-        *
-        * _OSI(Linux) confirmed to be a NOP:
-        * DMI_MATCH(DMI_BOARD_NAME, "HEL8X"),
-        * _OSI(Linux) unknown effect:
-        * DMI_MATCH(DMI_BOARD_NAME, "IFL91"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Compal",
-       .matches = {
-                    DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
-               },
-       },
-       { /* OSI(Linux) touches USB, unknown side-effect */
-       .callback = dmi_disable_osi_linux,
-       .ident = "Dell Dimension 5150",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM051"),
-               },
-       },
-       { /* OSI(Linux) is a NOP */
-       .callback = dmi_disable_osi_linux,
-       .ident = "Dell i1501",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1501"),
-               },
-       },
-       { /* OSI(Linux) effect unknown */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dell Latitude D830",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D830"),
-               },
-       },
-       { /* OSI(Linux) effect unknown */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dell OptiPlex GX620",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX620"),
-               },
-       },
-       { /* OSI(Linux) causes some USB initialization to not run */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dell OptiPlex 755",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 755"),
-               },
-       },
-       { /* OSI(Linux) effect unknown */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dell PE 1900",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1900"),
-               },
-       },
-       { /* OSI(Linux) is a NOP */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dell PE 1950",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1950"),
-               },
-       },
-       { /* OSI(Linux) is a NOP */
-       .callback = dmi_disable_osi_linux,
-       .ident = "Dell PE R200",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R200"),
-               },
-       },
-       { /* OSI(Linux) touches USB */
-       .callback = dmi_disable_osi_linux,
-       .ident = "Dell PR 390",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 390"),
-               },
-       },
-       { /* OSI(Linux) touches USB */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dell PR 390",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 690"),
-               },
-       },
-       { /* OSI(Linux) unknown - ASL looks benign, but may effect dock/SMM */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dell PR M4300",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Precision M4300"),
-               },
-       },
-       { /* OSI(Linux) is a NOP */
-       .callback = dmi_disable_osi_linux,
-       .ident = "Dell Vostro 1000",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Vostro   1000"),
-               },
-       },
-       { /* OSI(Linux) effect unknown */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dell PE SC440",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge SC440"),
-               },
-       },
-       { /* OSI(Linux) effect unknown */
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Dialogue Flybook V5",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Dialogue Technology Corporation"),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "Flybook V5"),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "FUJITSU SIEMENS"
-        *
-        * _OSI(Linux) disables latest Windows BIOS code:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"),
-        * _OSI(Linux) confirmed to be a NOP:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
-        * _OSI(Linux) unknown effect:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Fujitsu Siemens",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
-               },
-       },
        {
        .callback = dmi_disable_osi_vista,
        .ident = "Fujitsu Siemens",
        .matches = {
                     DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
+                    DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
                },
        },
+
        /*
-        * Disable OSI(Linux) warnings on all "Hewlett-Packard"
-        *
-        * _OSI(Linux) confirmed to be a NOP:
-        * .ident = "HP Pavilion tx 1000"
-        * DMI_MATCH(DMI_BOARD_NAME, "30BF"),
-        * .ident = "HP Pavilion dv2000"
-        * DMI_MATCH(DMI_BOARD_NAME, "30B5"),
-        * .ident = "HP Pavilion dv5000",
-        * DMI_MATCH(DMI_BOARD_NAME, "30A7"),
-        * .ident = "HP Pavilion dv6300 30BC",
-        * DMI_MATCH(DMI_BOARD_NAME, "30BC"),
-        * .ident = "HP Pavilion dv6000",
-        * DMI_MATCH(DMI_BOARD_NAME, "30B7"),
-        * DMI_MATCH(DMI_BOARD_NAME, "30B8"),
-        * .ident = "HP Pavilion dv9000",
-        * DMI_MATCH(DMI_BOARD_NAME, "30B9"),
-        * .ident = "HP Pavilion dv9500",
-        * DMI_MATCH(DMI_BOARD_NAME, "30CB"),
-        * .ident = "HP/Compaq Presario C500",
-        * DMI_MATCH(DMI_BOARD_NAME, "30C6"),
-        * .ident = "HP/Compaq Presario F500",
-        * DMI_MATCH(DMI_BOARD_NAME, "30D3"),
-        * _OSI(Linux) unknown effect:
-        * .ident = "HP Pavilion dv6500",
-        * DMI_MATCH(DMI_BOARD_NAME, "30D0"),
+        * BIOS invocation of _OSI(Linux) is almost always a BIOS bug.
+        * Linux ignores it, except for the machines enumerated below.
         */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Hewlett-Packard",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-               },
-       },
+
        /*
         * Lenovo has a mix of systems OSI(Linux) situations
         * and thus we can not wildcard the vendor.
@@ -519,113 +235,6 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
                     DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"),
                },
        },
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Lenovo 3000 V100",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
-                    DMI_MATCH(DMI_PRODUCT_VERSION, "LENOVO3000 V100"),
-               },
-       },
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Lenovo 3000 N100",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
-                    DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "LG Electronics"
-        *
-        * _OSI(Linux) confirmed to be a NOP:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"),
-        * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
-        *
-        * unknown:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"),
-        * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "LG",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
-               },
-       },
-       /* NEC - OSI(Linux) effect unknown */
-       {
-       .callback = dmi_unknown_osi_linux,
-       .ident = "NEC VERSA M360",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "NEC Computers SAS"),
-                    DMI_MATCH(DMI_PRODUCT_NAME, "NEC VERSA M360"),
-               },
-       },
-       /* Panasonic */
-       {
-       .callback = dmi_unknown_osi_linux,
-       .ident = "Panasonic",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
-                       /* Toughbook CF-52 */
-                    DMI_MATCH(DMI_PRODUCT_NAME, "CF-52CCABVBG"),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "Samsung Electronics"
-        *
-        * OSI(Linux) disables PNP0C32 and other BIOS code for Windows:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Samsung",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "Sony Corporation"
-        *
-        * _OSI(Linux) is a NOP:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NR11S_S"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"),
-        * _OSI(Linux) unknown effect:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Sony",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
-               },
-       },
-       /*
-        * Disable OSI(Linux) warnings on all "TOSHIBA"
-        *
-        * _OSI(Linux) breaks sound (bugzilla 7787):
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"),
-        * _OSI(Linux) is a NOP:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"),
-        * _OSI(Linux) unknown effect:
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"),
-        * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"),
-        */
-       {
-       .callback = dmi_disable_osi_linux,
-       .ident = "Toshiba",
-       .matches = {
-                    DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
-               },
-       },
        {}
 };
 
index cf41f9f..30f3ef2 100644 (file)
@@ -219,7 +219,8 @@ static void gpe_transaction(struct acpi_ec *ec, u8 status)
        goto unlock;
 err:
        /* false interrupt, state didn't change */
-       ++ec->curr->irq_count;
+       if (in_interrupt())
+               ++ec->curr->irq_count;
 unlock:
        spin_unlock_irqrestore(&ec->curr_lock, flags);
 }
index 4be2521..c811142 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/interrupt.h>
 #include <linux/kmod.h>
 #include <linux/delay.h>
-#include <linux/dmi.h>
 #include <linux/workqueue.h>
 #include <linux/nmi.h>
 #include <linux/acpi.h>
@@ -97,54 +96,44 @@ static DEFINE_SPINLOCK(acpi_res_lock);
 static char osi_additional_string[OSI_STRING_LENGTH_MAX];
 
 /*
- * "Ode to _OSI(Linux)"
+ * The story of _OSI(Linux)
  *
- * osi_linux -- Control response to BIOS _OSI(Linux) query.
+ * From pre-history through Linux-2.6.22,
+ * Linux responded TRUE upon a BIOS OSI(Linux) query.
  *
- * As Linux evolves, the features that it supports change.
- * So an OSI string such as "Linux" is not specific enough
- * to be useful across multiple versions of Linux.  It
- * doesn't identify any particular feature, interface,
- * or even any particular version of Linux...
+ * Unfortunately, reference BIOS writers got wind of this
+ * and put OSI(Linux) in their example code, quickly exposing
+ * this string as ill-conceived and opening the door to
+ * an un-bounded number of BIOS incompatibilities.
  *
- * Unfortunately, Linux-2.6.22 and earlier responded "yes"
- * to a BIOS _OSI(Linux) query.  When
- * a reference mobile BIOS started using it, its use
- * started to spread to many vendor platforms.
- * As it is not supportable, we need to halt that spread.
+ * For example, OSI(Linux) was used on resume to re-POST a
+ * video card on one system, because Linux at that time
+ * could not do a speedy restore in its native driver.
+ * But then upon gaining quick native restore capability,
+ * Linux has no way to tell the BIOS to skip the time-consuming
+ * POST -- putting Linux at a permanent performance disadvantage.
+ * On another system, the BIOS writer used OSI(Linux)
+ * to infer native OS support for IPMI!  On other systems,
+ * OSI(Linux) simply got in the way of Linux claiming to
+ * be compatible with other operating systems, exposing
+ * BIOS issues such as skipped device initialization.
  *
- * Today, most BIOS references to _OSI(Linux) are noise --
- * they have no functional effect and are just dead code
- * carried over from the reference BIOS.
- *
- * The next most common case is that _OSI(Linux) harms Linux,
- * usually by causing the BIOS to follow paths that are
- * not tested during Windows validation.
- *
- * Finally, there is a short list of platforms
- * where OSI(Linux) benefits Linux.
- *
- * In Linux-2.6.23, OSI(Linux) is first disabled by default.
- * DMI is used to disable the dmesg warning about OSI(Linux)
- * on platforms where it is known to have no effect.
- * But a dmesg warning remains for systems where
- * we do not know if OSI(Linux) is good or bad for the system.
- * DMI is also used to enable OSI(Linux) for the machines
- * that are known to need it.
+ * So "Linux" turned out to be a really poor chose of
+ * OSI string, and from Linux-2.6.23 onward we respond FALSE.
  *
  * BIOS writers should NOT query _OSI(Linux) on future systems.
- * It will be ignored by default, and to get Linux to
- * not ignore it will require a kernel source update to
- * add a DMI entry, or a boot-time "acpi_osi=Linux" invocation.
+ * Linux will complain on the console when it sees it, and return FALSE.
+ * To get Linux to return TRUE for your system  will require
+ * a kernel source update to add a DMI entry,
+ * or boot with "acpi_osi=Linux"
  */
-#define OSI_LINUX_ENABLE 0
 
 static struct osi_linux {
        unsigned int    enable:1;
        unsigned int    dmi:1;
        unsigned int    cmdline:1;
        unsigned int    known:1;
-} osi_linux = { OSI_LINUX_ENABLE, 0, 0, 0};
+} osi_linux = { 0, 0, 0, 0};
 
 static void __init acpi_request_region (struct acpi_generic_address *addr,
        unsigned int length, char *desc)
@@ -1296,34 +1285,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
        return (AE_OK);
 }
 
-/**
- *     acpi_dmi_dump - dump DMI slots needed for blacklist entry
- *
- *     Returns 0 on success
- */
-static int acpi_dmi_dump(void)
-{
-
-       if (!dmi_available)
-               return -1;
-
-       printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
-               dmi_get_system_info(DMI_SYS_VENDOR));
-       printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
-               dmi_get_system_info(DMI_PRODUCT_NAME));
-       printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
-               dmi_get_system_info(DMI_PRODUCT_VERSION));
-       printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
-               dmi_get_system_info(DMI_BOARD_NAME));
-       printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
-               dmi_get_system_info(DMI_BIOS_VENDOR));
-       printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
-               dmi_get_system_info(DMI_BIOS_DATE));
-
-       return 0;
-}
-
-
 /******************************************************************************
  *
  * FUNCTION:    acpi_os_validate_interface
@@ -1350,21 +1311,6 @@ acpi_os_validate_interface (char *interface)
                        osi_linux.cmdline ? " via cmdline" :
                        osi_linux.dmi ? " via DMI" : "");
 
-               if (!osi_linux.dmi) {
-                       if (acpi_dmi_dump())
-                               printk(KERN_NOTICE PREFIX
-                                       "[please extract dmidecode output]\n");
-                       printk(KERN_NOTICE PREFIX
-                               "Please send DMI info above to "
-                               "linux-acpi@vger.kernel.org\n");
-               }
-               if (!osi_linux.known && !osi_linux.cmdline) {
-                       printk(KERN_NOTICE PREFIX
-                               "If \"acpi_osi=%sLinux\" works better, "
-                               "please notify linux-acpi@vger.kernel.org\n",
-                               osi_linux.enable ? "!" : "");
-               }
-
                if (osi_linux.enable)
                        return AE_OK;
        }
index bd5253e..39b7233 100644 (file)
@@ -751,16 +751,6 @@ static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
        if (!acpi_match_device_ids(device, button_device_ids))
                device->wakeup.flags.run_wake = 1;
 
-       /*
-        * Don't set Power button GPE as run_wake
-        * if Fixed Power button is used
-        */
-       if (!strcmp(device->pnp.hardware_id, "PNP0C0C") &&
-               !(acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON)) {
-               device->wakeup.flags.run_wake = 0;
-               device->wakeup.flags.valid = 0;
-       }
-
       end:
        if (ACPI_FAILURE(status))
                device->flags.wake_capable = 0;
index 80c0868..28a691c 100644 (file)
@@ -90,6 +90,18 @@ void __init acpi_old_suspend_ordering(void)
        old_suspend_ordering = true;
 }
 
+/*
+ * According to the ACPI specification the BIOS should make sure that ACPI is
+ * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states.  Still,
+ * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
+ * on such systems during resume.  Unfortunately that doesn't help in
+ * particularly pathological cases in which SCI_EN has to be set directly on
+ * resume, although the specification states very clearly that this flag is
+ * owned by the hardware.  The set_sci_en_on_resume variable will be set in such
+ * cases.
+ */
+static bool set_sci_en_on_resume;
+
 /**
  *     acpi_pm_disable_gpes - Disable the GPEs.
  */
@@ -235,7 +247,11 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
        }
 
        /* If ACPI is not enabled by the BIOS, we need to enable it here. */
-       acpi_enable();
+       if (set_sci_en_on_resume)
+               acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1);
+       else
+               acpi_enable();
+
        /* Reprogram control registers and execute _BFS */
        acpi_leave_sleep_state_prep(acpi_state);
 
@@ -323,6 +339,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d)
        return 0;
 }
 
+static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d)
+{
+       set_sci_en_on_resume = true;
+       return 0;
+}
+
 static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
        {
        .callback = init_old_suspend_ordering,
@@ -340,6 +362,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
                DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
                },
        },
+       {
+       .callback = init_set_sci_en_on_resume,
+       .ident = "Apple MacBook 1,1",
+       .matches = {
+               DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
+               DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
+               },
+       },
+       {
+       .callback = init_set_sci_en_on_resume,
+       .ident = "Apple MacMini 1,1",
+       .matches = {
+               DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
+               DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
+               },
+       },
        {},
 };
 #endif /* CONFIG_SUSPEND */
index 66aac06..25f531d 100644 (file)
@@ -848,8 +848,6 @@ static int __init toshiba_acpi_init(void)
        ret = input_register_polled_device(toshiba_acpi.poll_dev);
        if (ret) {
                printk(MY_ERR "unable to register kill-switch input device\n");
-               rfkill_free(toshiba_acpi.rfk_dev);
-               toshiba_acpi.rfk_dev = NULL;
                toshiba_acpi_exit();
                return ret;
        }
index e827be3..f844941 100644 (file)
@@ -259,34 +259,26 @@ acpi_evaluate_integer(acpi_handle handle,
                      struct acpi_object_list *arguments, unsigned long long *data)
 {
        acpi_status status = AE_OK;
-       union acpi_object *element;
+       union acpi_object element;
        struct acpi_buffer buffer = { 0, NULL };
 
-
        if (!data)
                return AE_BAD_PARAMETER;
 
-       element = kzalloc(sizeof(union acpi_object), irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL);
-       if (!element)
-               return AE_NO_MEMORY;
-
        buffer.length = sizeof(union acpi_object);
-       buffer.pointer = element;
+       buffer.pointer = &element;
        status = acpi_evaluate_object(handle, pathname, arguments, &buffer);
        if (ACPI_FAILURE(status)) {
                acpi_util_eval_error(handle, pathname, status);
-               kfree(element);
                return status;
        }
 
-       if (element->type != ACPI_TYPE_INTEGER) {
+       if (element.type != ACPI_TYPE_INTEGER) {
                acpi_util_eval_error(handle, pathname, AE_BAD_DATA);
-               kfree(element);
                return AE_BAD_DATA;
        }
 
-       *data = element->integer.value;
-       kfree(element);
+       *data = element.integer.value;
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data));
 
index 0f004b6..03f95ec 100644 (file)
@@ -27,7 +27,7 @@
 static int uninorth_rev;
 static int is_u3;
 
-static char __devinitdata *aperture = NULL;
+static char *aperture = NULL;
 
 static int uninorth_fetch_size(void)
 {
index 44e5d60..4b10770 100644 (file)
@@ -3739,7 +3739,7 @@ static int stli_getbrdnr(void)
  *     do is go probing around in the usual places hoping we can find it.
  */
 
-static int stli_findeisabrds(void)
+static int __init stli_findeisabrds(void)
 {
        struct stlibrd *brdp;
        unsigned int iobase, eid, i;
@@ -3935,7 +3935,7 @@ static struct stlibrd *stli_allocbrd(void)
  *     can find.
  */
 
-static int stli_initbrds(void)
+static int __init stli_initbrds(void)
 {
        struct stlibrd *brdp, *nxtbrdp;
        struct stlconf conf;
index b6ad3ac..2460766 100644 (file)
@@ -1357,7 +1357,7 @@ static int hw_supports(struct device *dev, __be32 desc_hdr_template)
        return ret;
 }
 
-static int __devexit talitos_remove(struct of_device *ofdev)
+static int talitos_remove(struct of_device *ofdev)
 {
        struct device *dev = &ofdev->dev;
        struct talitos_private *priv = dev_get_drvdata(dev);
@@ -1622,7 +1622,7 @@ static struct of_platform_driver talitos_driver = {
        .name = "talitos",
        .match_table = talitos_match,
        .probe = talitos_probe,
-       .remove = __devexit_p(talitos_remove),
+       .remove = talitos_remove,
 };
 
 static int __init talitos_init(void)
index 2d84801..81f70ca 100644 (file)
@@ -419,7 +419,7 @@ static void icside_setup_ports(hw_regs_t *hw, void __iomem *base,
        hw->chipset = ide_acorn;
 }
 
-static int __init
+static int __devinit
 icside_register_v5(struct icside_state *state, struct expansion_card *ec)
 {
        void __iomem *base;
@@ -473,7 +473,7 @@ static const struct ide_port_info icside_v6_port_info __initdata = {
        .swdma_mask             = ATA_SWDMA2,
 };
 
-static int __init
+static int __devinit
 icside_register_v6(struct icside_state *state, struct expansion_card *ec)
 {
        void __iomem *ioc_base, *easi_base;
index 6790e97..bc4e40f 100644 (file)
@@ -397,8 +397,9 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value)
 {
        struct ml_device *ml = dev->ff->private;
        struct ml_effect_state *state = &ml->states[effect_id];
+       unsigned long flags;
 
-       spin_lock_bh(&ml->timer_lock);
+       spin_lock_irqsave(&ml->timer_lock, flags);
 
        if (value > 0) {
                debug("initiated play");
@@ -424,7 +425,7 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value)
                ml_play_effects(ml);
        }
 
-       spin_unlock_bh(&ml->timer_lock);
+       spin_unlock_irqrestore(&ml->timer_lock, flags);
 
        return 0;
 }
index 22016ca..379b7ff 100644 (file)
@@ -824,7 +824,7 @@ static void atkbd_disconnect(struct serio *serio)
        atkbd_disable(atkbd);
 
        /* make sure we don't have a command in flight */
-       flush_scheduled_work();
+       cancel_delayed_work_sync(&atkbd->event_work);
 
        sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
        input_unregister_device(atkbd->dev);
@@ -868,6 +868,22 @@ static void atkbd_hp_keymap_fixup(struct atkbd *atkbd)
 }
 
 /*
+ * Inventec system with broken key release on volume keys
+ */
+static void atkbd_inventec_keymap_fixup(struct atkbd *atkbd)
+{
+       const unsigned int forced_release_keys[] = {
+               0xae, 0xb0,
+       };
+       int i;
+
+       if (atkbd->set == 2)
+               for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++)
+                       __set_bit(forced_release_keys[i],
+                                 atkbd->force_release_mask);
+}
+
+/*
  * atkbd_set_keycode_table() initializes keyboard's keycode table
  * according to the selected scancode set
  */
@@ -1468,6 +1484,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
                .callback = atkbd_setup_fixup,
                .driver_data = atkbd_hp_keymap_fixup,
        },
+       {
+               .ident = "Inventec Symphony",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"),
+               },
+               .callback = atkbd_setup_fixup,
+               .driver_data = atkbd_inventec_keymap_fixup,
+       },
        { }
 };
 
index bce160f..86457fe 100644 (file)
@@ -42,7 +42,7 @@
 
 static char *phone = "kip1000";
 module_param(phone, charp, S_IRUSR);
-MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01}");
+MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01, atcom}");
 
 enum {
        /* HID Registers */
@@ -258,6 +258,37 @@ static unsigned short keymap_usbph01(int scancode)
        }
 }
 
+/*
+ * Keymap for ATCom AU-100
+ * http://www.atcom.cn/En_products_AU100.html
+ * http://www.packetizer.com/products/au100/
+ * http://www.voip-info.org/wiki/view/AU-100
+ *
+ * Contributed by daniel@gimpelevich.san-francisco.ca.us
+ */
+static unsigned short keymap_atcom(int scancode)
+{
+       switch (scancode) {                             /* phone key:   */
+       case 0x82: return KEY_NUMERIC_0;                /*   0          */
+       case 0x11: return KEY_NUMERIC_1;                /*   1          */
+       case 0x12: return KEY_NUMERIC_2;                /*   2          */
+       case 0x14: return KEY_NUMERIC_3;                /*   3          */
+       case 0x21: return KEY_NUMERIC_4;                /*   4          */
+       case 0x22: return KEY_NUMERIC_5;                /*   5          */
+       case 0x24: return KEY_NUMERIC_6;                /*   6          */
+       case 0x41: return KEY_NUMERIC_7;                /*   7          */
+       case 0x42: return KEY_NUMERIC_8;                /*   8          */
+       case 0x44: return KEY_NUMERIC_9;                /*   9          */
+       case 0x84: return KEY_NUMERIC_POUND;            /*   #          */
+       case 0x81: return KEY_NUMERIC_STAR;             /*   *          */
+       case 0x18: return KEY_ENTER;                    /*   pickup     */
+       case 0x28: return KEY_ESC;                      /*   hangup     */
+       case 0x48: return KEY_LEFT;                     /* left arrow   */
+       case 0x88: return KEY_RIGHT;                    /* right arrow  */
+       default:   return special_keymap(scancode);
+       }
+}
+
 static unsigned short (*keymap)(int) = keymap_kip1000;
 
 /*
@@ -840,6 +871,10 @@ static int __init cm109_select_keymap(void)
                keymap = keymap_usbph01;
                printk(KERN_INFO KBUILD_MODNAME ": "
                        "Keymap for Allied-Telesis Corega USBPH01 phone loaded\n");
+       } else if (!strcasecmp(phone, "atcom")) {
+               keymap = keymap_atcom;
+               printk(KERN_INFO KBUILD_MODNAME ": "
+                       "Keymap for ATCom AU-100 phone loaded\n");
        } else {
                printk(KERN_ERR KBUILD_MODNAME ": "
                        "Unsupported phone: %s\n", phone);
index e82d342..88f04bf 100644 (file)
@@ -125,7 +125,7 @@ static void hgpk_spewing_hack(struct psmouse *psmouse,
  */
 static int hgpk_validate_byte(unsigned char *packet)
 {
-       return (packet[0] & 0x0C) == 0x08;
+       return (packet[0] & 0x0C) != 0x08;
 }
 
 static void hgpk_process_packet(struct psmouse *psmouse)
index eec375c..29e6863 100644 (file)
@@ -337,6 +337,20 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
                },
        },
+       {
+               .ident = "Dell XPS M1530",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
+               },
+       },
+       {
+               .ident = "Compal HEL80I",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
+               },
+       },
        { }
 };
 
index ca62ec6..677680e 100644 (file)
@@ -66,6 +66,7 @@
  *                - Support Intuos3 4x6
  *      v1.47 (pc) - Added support for Bamboo
  *      v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX
+ *      v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A)
  */
 
 /*
@@ -86,7 +87,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v1.48"
+#define DRIVER_VERSION "v1.49"
 #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
 #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
 #define DRIVER_LICENSE "GPL"
@@ -103,15 +104,15 @@ struct wacom {
        struct usb_device *usbdev;
        struct usb_interface *intf;
        struct urb *irq;
-       struct wacom_wac * wacom_wac;
+       struct wacom_wac *wacom_wac;
        struct mutex lock;
        unsigned int open:1;
        char phys[32];
 };
 
 struct wacom_combo {
-       struct wacom * wacom;
-       struct urb * urb;
+       struct wacom *wacom;
+       struct urb *urb;
 };
 
 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
 extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac);
 extern __u16 wacom_le16_to_cpu(unsigned char *data);
 extern __u16 wacom_be16_to_cpu(unsigned char *data);
-extern struct wacom_features * get_wacom_feature(const struct usb_device_id *id);
-extern const struct usb_device_id * get_device_table(void);
+extern struct wacom_features *get_wacom_feature(const struct usb_device_id *id);
+extern const struct usb_device_id *get_device_table(void);
 
 #endif
index 09e227a..484496d 100644 (file)
 #include "wacom.h"
 #include "wacom_wac.h"
 
+/* defines to get HID report descriptor */
+#define HID_DEVICET_HID                (USB_TYPE_CLASS | 0x01)
+#define HID_DEVICET_REPORT     (USB_TYPE_CLASS | 0x02)
+#define HID_USAGE_UNDEFINED            0x00
+#define HID_USAGE_PAGE                 0x05
+#define HID_USAGE_PAGE_DIGITIZER       0x0d
+#define HID_USAGE_PAGE_DESKTOP         0x01
+#define HID_USAGE                      0x09
+#define HID_USAGE_X                    0x30
+#define HID_USAGE_Y                    0x31
+#define HID_USAGE_X_TILT               0x3d
+#define HID_USAGE_Y_TILT               0x3e
+#define HID_USAGE_FINGER               0x22
+#define HID_USAGE_STYLUS               0x20
+#define HID_COLLECTION                 0xc0
+
+enum {
+       WCM_UNDEFINED = 0,
+       WCM_DESKTOP,
+       WCM_DIGITIZER,
+};
+
+struct hid_descriptor {
+       struct usb_descriptor_header header;
+       __le16   bcdHID;
+       u8       bCountryCode;
+       u8       bNumDescriptors;
+       u8       bDescriptorType;
+       __le16   wDescriptorLength;
+} __attribute__ ((packed));
+
+/* defines to get/set USB message */
 #define USB_REQ_GET_REPORT     0x01
 #define USB_REQ_SET_REPORT     0x09
+#define WAC_HID_FEATURE_REPORT 0x03
 
 static int usb_get_report(struct usb_interface *intf, unsigned char type,
                                unsigned char id, void *buf, int size)
@@ -80,25 +113,21 @@ static void wacom_sys_irq(struct urb *urb)
 void wacom_report_key(void *wcombo, unsigned int key_type, int key_data)
 {
        input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data);
-       return;
 }
 
 void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data)
 {
        input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data);
-       return;
 }
 
 void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data)
 {
        input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data);
-       return;
 }
 
 void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value)
 {
        input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value);
-       return;
 }
 
 __u16 wacom_be16_to_cpu(unsigned char *data)
@@ -118,7 +147,6 @@ __u16 wacom_le16_to_cpu(unsigned char *data)
 void wacom_input_sync(void *wcombo)
 {
        input_sync(get_input_dev((struct wacom_combo *)wcombo));
-       return;
 }
 
 static int wacom_open(struct input_dev *dev)
@@ -160,7 +188,7 @@ static void wacom_close(struct input_dev *dev)
 
 void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
 {
-       input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_1) |
+       input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_1) |
                BIT_MASK(BTN_5);
        input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
 }
@@ -170,7 +198,7 @@ void input_dev_g4(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
        input_dev->evbit[0] |= BIT_MASK(EV_MSC);
        input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL);
        input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER);
-       input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) |
+       input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) |
                BIT_MASK(BTN_4);
 }
 
@@ -178,7 +206,7 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
 {
        input_dev->evbit[0] |= BIT_MASK(EV_REL);
        input_dev->relbit[0] |= BIT_MASK(REL_WHEEL);
-       input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) |
+       input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) |
                BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);
        input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) |
                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)
 void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
 {
        input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER);
-       input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) |
+       input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) |
                BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3);
        input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
        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)
 
 void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
 {
-       input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_4) |
+       input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_4) |
                BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7);
        input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
 }
 
 void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
 {
-       input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9);
+       input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9);
 }
 
 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)
        input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL);
        input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL);
        input_dev->relbit[0] |= BIT_MASK(REL_WHEEL);
-       input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) |
+       input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) |
                BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) |
                BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA);
        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)
 
 void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
 {
-       input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2) |
-               BIT_MASK(BTN_TOOL_RUBBER);
+       input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2);
 }
 
 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)
        input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER);
 }
 
+static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc,
+                          struct wacom_wac *wacom_wac)
+{
+       struct usb_device *dev = interface_to_usbdev(intf);
+       struct wacom_features *features = wacom_wac->features;
+       char limit = 0, result = 0;
+       int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0;
+       unsigned char *report;
+
+       report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL);
+       if (!report)
+               return -ENOMEM;
+
+       /* retrive report descriptors */
+       do {
+               result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
+                       USB_REQ_GET_DESCRIPTOR,
+                       USB_RECIP_INTERFACE | USB_DIR_IN,
+                       HID_DEVICET_REPORT << 8,
+                       intf->altsetting[0].desc.bInterfaceNumber, /* interface */
+                       report,
+                       hid_desc->wDescriptorLength,
+                       5000); /* 5 secs */
+       } while (result < 0 && limit++ < 5);
+
+       if (result < 0)
+               goto out;
+
+       for (i = 0; i < hid_desc->wDescriptorLength; i++) {
+
+               switch (report[i]) {
+               case HID_USAGE_PAGE:
+                       switch (report[i + 1]) {
+                       case HID_USAGE_PAGE_DIGITIZER:
+                               usage = WCM_DIGITIZER;
+                               i++;
+                               break;
+
+                       case HID_USAGE_PAGE_DESKTOP:
+                               usage = WCM_DESKTOP;
+                               i++;
+                               break;
+                       }
+                       break;
+
+               case HID_USAGE:
+                       switch (report[i + 1]) {
+                       case HID_USAGE_X:
+                               if (usage == WCM_DESKTOP) {
+                                       if (finger) {
+                                               features->touch_x_max =
+                                                       features->touch_y_max =
+                                                       wacom_le16_to_cpu(&report[i + 3]);
+                                               features->x_max =
+                                                       wacom_le16_to_cpu(&report[i + 6]);
+                                               i += 7;
+                                       } else if (pen) {
+                                               features->x_max =
+                                                       wacom_le16_to_cpu(&report[i + 3]);
+                                               i += 4;
+                                       }
+                               } else if (usage == WCM_DIGITIZER) {
+                                       /* max pressure isn't reported
+                                       features->pressure_max = (unsigned short)
+                                                       (report[i+4] << 8  | report[i + 3]);
+                                       */
+                                       features->pressure_max = 255;
+                                       i += 4;
+                               }
+                               break;
+
+                       case HID_USAGE_Y:
+                               if (usage == WCM_DESKTOP)
+                                       features->y_max =
+                                               wacom_le16_to_cpu(&report[i + 3]);
+                               i += 4;
+                               break;
+
+                       case HID_USAGE_FINGER:
+                               finger = 1;
+                               i++;
+                               break;
+
+                       case HID_USAGE_STYLUS:
+                               pen = 1;
+                               i++;
+                               break;
+
+                       case HID_USAGE_UNDEFINED:
+                               if (usage == WCM_DESKTOP && finger) /* capacity */
+                                       features->pressure_max =
+                                               wacom_le16_to_cpu(&report[i + 3]);
+                               i += 4;
+                               break;
+                       }
+                       break;
+
+               case HID_COLLECTION:
+                       /* reset UsagePage ans Finger */
+                       finger = usage = 0;
+                       break;
+               }
+       }
+
+       result = 0;
+
+ out:
+       kfree(report);
+       return result;
+}
+
 static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
        struct usb_device *dev = interface_to_usbdev(intf);
+       struct usb_host_interface *interface = intf->cur_altsetting;
        struct usb_endpoint_descriptor *endpoint;
        struct wacom *wacom;
        struct wacom_wac *wacom_wac;
+       struct wacom_features *features;
        struct input_dev *input_dev;
        int error = -ENOMEM;
        char rep_data[2], limit = 0;
+       struct hid_descriptor *hid_desc;
 
        wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
        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
        usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
        strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
 
-       wacom_wac->features = get_wacom_feature(id);
-       BUG_ON(wacom_wac->features->pktlen > 10);
+       wacom_wac->features = features = get_wacom_feature(id);
+       BUG_ON(features->pktlen > 10);
 
        input_dev->name = wacom_wac->features->name;
        wacom->wacom_wac = wacom_wac;
@@ -282,18 +423,37 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
        input_dev->open = wacom_open;
        input_dev->close = wacom_close;
 
+       endpoint = &intf->cur_altsetting->endpoint[0].desc;
+
+       /* TabletPC need to retrieve the physical and logical maximum from report descriptor */
+       if (wacom_wac->features->type == TABLETPC) {
+               if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
+                       if (usb_get_extra_descriptor(&interface->endpoint[0],
+                                                    HID_DEVICET_REPORT, &hid_desc)) {
+                               printk("wacom: can not retrive extra class descriptor\n");
+                               goto fail2;
+                       }
+               }
+               error = wacom_parse_hid(intf, hid_desc, wacom_wac);
+               if (error)
+                       goto fail2;
+       }
+
        input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
        input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) |
                BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS);
-       input_set_abs_params(input_dev, ABS_X, 0, wacom_wac->features->x_max, 4, 0);
-       input_set_abs_params(input_dev, ABS_Y, 0, wacom_wac->features->y_max, 4, 0);
-       input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom_wac->features->pressure_max, 0, 0);
+       input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0);
+       input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0);
+       input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0);
+       if (features->type == TABLETPC) {
+               input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_DOUBLETAP);
+               input_set_abs_params(input_dev, ABS_RX, 0, features->touch_x_max, 4, 0);
+               input_set_abs_params(input_dev, ABS_RY, 0, features->touch_y_max, 4, 0);
+       }
        input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC);
 
        wacom_init_input_dev(input_dev, wacom_wac);
 
-       endpoint = &intf->cur_altsetting->endpoint[0].desc;
-
        usb_fill_int_urb(wacom->irq, dev,
                         usb_rcvintpipe(dev, endpoint->bEndpointAddress),
                         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
        if (error)
                goto fail3;
 
-       /* Ask the tablet to report tablet data. Repeat until it succeeds */
-       do {
-               rep_data[0] = 2;
-               rep_data[1] = 2;
-               usb_set_report(intf, 3, 2, rep_data, 2);
-               usb_get_report(intf, 3, 2, rep_data, 2);
-       } while (rep_data[1] != 2 && limit++ < 5);
+       /*
+        * Ask the tablet to report tablet data if it is not a Tablet PC.
+        * Repeat until it succeeds
+        */
+       if (wacom_wac->features->type != TABLETPC) {
+               do {
+                       rep_data[0] = 2;
+                       rep_data[1] = 2;
+                       error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
+                                               2, rep_data, 2);
+                       if (error >= 0)
+                               error = usb_get_report(intf,
+                                               WAC_HID_FEATURE_REPORT, 2,
+                                               rep_data, 2);
+               } while ((error < 0 || rep_data[1] != 2) && limit++ < 5);
+       }
 
        usb_set_intfdata(intf, wacom);
        return 0;
@@ -333,7 +502,8 @@ static void wacom_disconnect(struct usb_interface *intf)
        usb_kill_urb(wacom->irq);
        input_unregister_device(wacom->dev);
        usb_free_urb(wacom->irq);
-       usb_buffer_free(interface_to_usbdev(intf), 10, wacom->wacom_wac->data, wacom->data_dma);
+       usb_buffer_free(interface_to_usbdev(intf), 10,
+                       wacom->wacom_wac->data, wacom->data_dma);
        kfree(wacom->wacom_wac);
        kfree(wacom);
 }
index bf3d9a8..8dc8d1e 100644 (file)
@@ -535,31 +535,147 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo)
        return 1;
 }
 
+int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
+{
+       char *data = wacom->data;
+       int prox = 0, pressure;
+       static int stylusInProx, touchInProx = 1, touchOut;
+       struct urb *urb = ((struct wacom_combo *)wcombo)->urb;
+
+       dbg("wacom_tpc_irq: received report #%d", data[0]);
+
+       if (urb->actual_length == 5 || data[0] == 6) { /* Touch data */
+               if (urb->actual_length == 5) {  /* with touch */
+                       prox = data[0] & 0x03;
+               } else {  /* with capacity */
+                       prox = data[1] & 0x03;
+               }
+
+               if (!stylusInProx) { /* stylus not in prox */
+                       if (prox) {
+                               if (touchInProx) {
+                                       wacom->tool[1] = BTN_TOOL_DOUBLETAP;
+                                       wacom->id[0] = TOUCH_DEVICE_ID;
+                                       if (urb->actual_length != 5) {
+                                               wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2]));
+                                               wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4]));
+                                               wacom_report_abs(wcombo, ABS_PRESSURE, wacom_le16_to_cpu(&data[6]));
+                                               wacom_report_key(wcombo, BTN_TOUCH, wacom_le16_to_cpu(&data[6]));
+                                       } else {
+                                               wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[1]));
+                                               wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[3]));
+                                               wacom_report_key(wcombo, BTN_TOUCH, 1);
+                                       }
+                                       wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]);
+                                       wacom_report_key(wcombo, wacom->tool[1], prox & 0x01);
+                                       touchOut = 1;
+                                       return 1;
+                               }
+                       } else {
+                               wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]);
+                               wacom_report_key(wcombo, wacom->tool[1], prox & 0x01);
+                               wacom_report_key(wcombo, BTN_TOUCH, 0);
+                               touchOut = 0;
+                               touchInProx = 1;
+                               return 1;
+                       }
+               } else if (touchOut || !prox) { /* force touch out-prox */
+                       wacom_report_abs(wcombo, ABS_MISC, TOUCH_DEVICE_ID);
+                       wacom_report_key(wcombo, BTN_TOUCH, 0);
+                       touchOut = 0;
+                       touchInProx = 1;
+                       return 1;
+               }
+       } else if (data[0] == 2) { /* Penabled */
+               prox = data[1] & 0x20;
+
+               touchInProx = 0;
+
+               wacom->id[0] = ERASER_DEVICE_ID;
+
+               /*
+                * if going from out of proximity into proximity select between the eraser
+                * and the pen based on the state of the stylus2 button, choose eraser if
+                * pressed else choose pen. if not a proximity change from out to in, send
+                * an out of proximity for previous tool then a in for new tool.
+                */
+               if (prox) { /* in prox */
+                       if (!wacom->tool[0]) {
+                               /* Going into proximity select tool */
+                               wacom->tool[1] = (data[1] & 0x08) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
+                               if (wacom->tool[1] == BTN_TOOL_PEN)
+                                       wacom->id[0] = STYLUS_DEVICE_ID;
+                       } else if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[1] & 0x08)) {
+                               /*
+                                * was entered with stylus2 pressed
+                                * report out proximity for previous tool
+                               */
+                               wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]);
+                               wacom_report_key(wcombo, wacom->tool[1], 0);
+                               wacom_input_sync(wcombo);
+
+                               /* set new tool */
+                               wacom->tool[1] = BTN_TOOL_PEN;
+                               wacom->id[0] = STYLUS_DEVICE_ID;
+                               return 0;
+                       }
+                       if (wacom->tool[1] != BTN_TOOL_RUBBER) {
+                               /* Unknown tool selected default to pen tool */
+                               wacom->tool[1] = BTN_TOOL_PEN;
+                               wacom->id[0] = STYLUS_DEVICE_ID;
+                       }
+                       wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02);
+                       wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10);
+                       wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2]));
+                       wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4]));
+                       pressure = ((data[7] & 0x01) << 8) | data[6];
+                       if (pressure < 0)
+                               pressure = wacom->features->pressure_max + pressure + 1;
+                       wacom_report_abs(wcombo, ABS_PRESSURE, pressure);
+                       wacom_report_key(wcombo, BTN_TOUCH, pressure);
+               } else {
+                       wacom_report_abs(wcombo, ABS_PRESSURE, 0);
+                       wacom_report_key(wcombo, BTN_STYLUS, 0);
+                       wacom_report_key(wcombo, BTN_STYLUS2, 0);
+                       wacom_report_key(wcombo, BTN_TOUCH, 0);
+               }
+               wacom_report_key(wcombo, wacom->tool[1], prox);
+               wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]);
+               stylusInProx = prox;
+               wacom->tool[0] = prox;
+               return 1;
+       }
+       return 0;
+}
+
 int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo)
 {
        switch (wacom_wac->features->type) {
                case PENPARTNER:
-                       return (wacom_penpartner_irq(wacom_wac, wcombo));
-                       break;
+                       return wacom_penpartner_irq(wacom_wac, wcombo);
+
                case PL:
-                       return (wacom_pl_irq(wacom_wac, wcombo));
-                       break;
+                       return wacom_pl_irq(wacom_wac, wcombo);
+
                case WACOM_G4:
                case GRAPHIRE:
                case WACOM_MO:
-                       return (wacom_graphire_irq(wacom_wac, wcombo));
-                       break;
+                       return wacom_graphire_irq(wacom_wac, wcombo);
+
                case PTU:
-                       return (wacom_ptu_irq(wacom_wac, wcombo));
-                       break;
+                       return wacom_ptu_irq(wacom_wac, wcombo);
+
                case INTUOS:
                case INTUOS3S:
                case INTUOS3:
                case INTUOS3L:
                case CINTIQ:
                case WACOM_BEE:
-                       return (wacom_intuos_irq(wacom_wac, wcombo));
-                       break;
+                       return wacom_intuos_irq(wacom_wac, wcombo);
+
+               case TABLETPC:
+                       return wacom_tpc_irq(wacom_wac, wcombo);
+
                default:
                        return 0;
        }
@@ -586,13 +702,15 @@ void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_w
                        /* fall through */
                case INTUOS3S:
                        input_dev_i3s(input_dev, wacom_wac);
+                       /* fall through */
                case INTUOS:
                        input_dev_i(input_dev, wacom_wac);
                        break;
                case PL:
                case PTU:
+               case TABLETPC:
                        input_dev_pl(input_dev, wacom_wac);
-                       break;
+                       /* fall through */
                case PENPARTNER:
                        input_dev_pt(input_dev, wacom_wac);
                        break;
@@ -611,6 +729,7 @@ static struct wacom_features wacom_features[] = {
        { "Wacom Graphire4 6x8", 8,  16704, 12064,  511, 63, WACOM_G4 },
        { "Wacom BambooFun 4x5", 9,  14760,  9225,  511, 63, WACOM_MO },
        { "Wacom BambooFun 6x8", 9,  21648, 13530,  511, 63, WACOM_MO },
+       { "Wacom Bamboo1 Medium",8,  16704, 12064,  511, 63, GRAPHIRE },
        { "Wacom Volito",        8,   5104,  3712,  511, 63, GRAPHIRE },
        { "Wacom PenStation2",   8,   3250,  2320,  255, 63, GRAPHIRE },
        { "Wacom Volito2 4x5",   8,   5104,  3712,  511, 63, GRAPHIRE },
@@ -650,6 +769,10 @@ static struct wacom_features wacom_features[] = {
        { "Wacom Cintiq 21UX",   10, 87200, 65600, 1023, 63, CINTIQ },
        { "Wacom Cintiq 20WSX",  10, 86680, 54180, 1023, 63, WACOM_BEE },
        { "Wacom Cintiq 12WX",   10, 53020, 33440, 1023, 63, WACOM_BEE },
+       { "Wacom DTU1931",        8, 37832, 30305,  511,  0, PL },
+       { "Wacom ISDv4 90",       8, 26202, 16325,  255,  0, TABLETPC },
+       { "Wacom ISDv4 93",       8, 26202, 16325,  255,  0, TABLETPC },
+       { "Wacom ISDv4 9A",       8, 26202, 16325,  255,  0, TABLETPC },
        { "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 31, INTUOS },
        { }
 };
@@ -665,6 +788,7 @@ static struct usb_device_id wacom_ids[] = {
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x19) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) },
@@ -704,18 +828,26 @@ static struct usb_device_id wacom_ids[] = {
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC7) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x90) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x93) },
+       { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x9A) },
        { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) },
        { }
 };
 
-const struct usb_device_id * get_device_table(void) {
-        const struct usb_device_id * id_table = wacom_ids;
+const struct usb_device_id *get_device_table(void)
+{
+        const struct usb_device_id *id_table = wacom_ids;
+
         return id_table;
 }
 
-struct wacom_features * get_wacom_feature(const struct usb_device_id * id) {
+struct wacom_features * get_wacom_feature(const struct usb_device_id *id)
+{
         int index = id - wacom_ids;
         struct wacom_features *wf = &wacom_features[index];
+
         return wf;
 }
 
index 3342bc0..f9c8b69 100644 (file)
@@ -10,6 +10,7 @@
 #define WACOM_WAC_H
 
 #define STYLUS_DEVICE_ID       0x02
+#define TOUCH_DEVICE_ID                0x03
 #define CURSOR_DEVICE_ID       0x06
 #define ERASER_DEVICE_ID       0x0A
 #define PAD_DEVICE_ID          0x0F
@@ -27,6 +28,7 @@ enum {
        CINTIQ,
        WACOM_BEE,
        WACOM_MO,
+       TABLETPC,
        MAX_TYPE
 };
 
@@ -38,6 +40,8 @@ struct wacom_features {
        int pressure_max;
        int distance_max;
        int type;
+       int touch_x_max;
+       int touch_y_max;
 };
 
 struct wacom_wac {
index d20689c..8f38c5e 100644 (file)
@@ -262,7 +262,7 @@ static int elo_setup_10(struct elo *elo)
                input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0);
 
        printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, "
-               "features: %x02x, controller: 0x%02x\n",
+               "features: 0x%02x, controller: 0x%02x\n",
                elo_types[(packet[1] -'0') & 0x03],
                packet[5], packet[4], packet[3], packet[7]);
 
index 3ab6362..928d2ed 100644 (file)
@@ -323,7 +323,7 @@ static struct xenbus_device_id xenkbd_ids[] = {
        { "" }
 };
 
-static struct xenbus_driver xenkbd = {
+static struct xenbus_driver xenkbd_driver = {
        .name = "vkbd",
        .owner = THIS_MODULE,
        .ids = xenkbd_ids,
@@ -342,12 +342,12 @@ static int __init xenkbd_init(void)
        if (xen_initial_domain())
                return -ENODEV;
 
-       return xenbus_register_frontend(&xenkbd);
+       return xenbus_register_frontend(&xenkbd_driver);
 }
 
 static void __exit xenkbd_cleanup(void)
 {
-       xenbus_unregister_driver(&xenkbd);
+       xenbus_unregister_driver(&xenkbd_driver);
 }
 
 module_init(xenkbd_init);
index 84d75a3..ded9d0b 100644 (file)
@@ -1213,7 +1213,7 @@ static void HiSax_shiftcards(int idx)
                memcpy(&cards[i], &cards[i + 1], sizeof(cards[i]));
 }
 
-static int HiSax_inithardware(int *busy_flag)
+static int __init HiSax_inithardware(int *busy_flag)
 {
        int foundcards = 0;
        int i = 0;
@@ -1542,7 +1542,9 @@ static void __exit HiSax_exit(void)
        printk(KERN_INFO "HiSax module removed\n");
 }
 
-int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
+#ifdef CONFIG_HOTPLUG
+
+int __devinit hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
 {
        u_char ids[16];
        int ret = -1;
@@ -1563,6 +1565,8 @@ error:
 }
 
 EXPORT_SYMBOL(hisax_init_pcmcia);
+#endif
+
 EXPORT_SYMBOL(HiSax_closecard);
 
 #include "hisax_if.h"
@@ -1580,6 +1584,11 @@ static void hisax_bc_close(struct BCState *bcs);
 static void hisax_bh(struct work_struct *work);
 static void EChannel_proc_rcv(struct hisax_d_if *d_if);
 
+static int hisax_setup_card_dynamic(struct IsdnCard *card)
+{
+       return 2;
+}
+
 int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
                   char *name, int protocol)
 {
@@ -1599,7 +1608,8 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
        cards[i].protocol = protocol;
        sprintf(id, "%s%d", name, i);
        nrcards++;
-       retval = checkcard(i, id, NULL, hisax_d_if->owner, hisax_cs_setup_card);
+       retval = checkcard(i, id, NULL, hisax_d_if->owner,
+                               hisax_setup_card_dynamic);
        if (retval == 0) { // yuck
                cards[i].typ = 0;
                nrcards--;
index 2c21d4f..a98ab72 100644 (file)
@@ -288,7 +288,7 @@ static void __devexit rackmeter_stop_cpu_sniffer(struct rackmeter *rm)
        cancel_rearming_delayed_work(&rm->cpu[1].sniffer);
 }
 
-static int rackmeter_setup(struct rackmeter *rm)
+static int __devinit rackmeter_setup(struct rackmeter *rm)
 {
        pr_debug("rackmeter: setting up i2s..\n");
        rackmeter_setup_i2s(rm);
@@ -582,12 +582,12 @@ static struct of_device_id rackmeter_match[] = {
        { }
 };
 
-static struct macio_driver rackmeter_drv = {
+static struct macio_driver rackmeter_driver = {
        .name = "rackmeter",
        .owner = THIS_MODULE,
        .match_table = rackmeter_match,
        .probe = rackmeter_probe,
-       .remove = rackmeter_remove,
+       .remove = __devexit_p(rackmeter_remove),
        .shutdown = rackmeter_shutdown,
 };
 
@@ -596,14 +596,14 @@ static int __init rackmeter_init(void)
 {
        pr_debug("rackmeter_init()\n");
 
-       return macio_register_driver(&rackmeter_drv);
+       return macio_register_driver(&rackmeter_driver);
 }
 
 static void __exit rackmeter_exit(void)
 {
        pr_debug("rackmeter_exit()\n");
 
-       macio_unregister_driver(&rackmeter_drv);
+       macio_unregister_driver(&rackmeter_driver);
 }
 
 module_init(rackmeter_init);
index 7bcb810..571b211 100644 (file)
@@ -1038,8 +1038,8 @@ static int sony_nc_add(struct acpi_device *device)
                goto outinput;
        }
 
-       if (!acpi_video_backlight_support()) {
-               printk(KERN_INFO DRV_PFX "Sony: Brightness ignored, must be "
+       if (acpi_video_backlight_support()) {
+               printk(KERN_INFO DRV_PFX "brightness ignored, must be "
                       "controlled by ACPI video driver\n");
        } else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT",
                                                &handle))) {
index 7a4a26b..899766e 100644 (file)
@@ -5318,6 +5318,7 @@ static enum fan_control_commands fan_control_commands;
 
 static u8 fan_control_initial_status;
 static u8 fan_control_desired_level;
+static u8 fan_control_resume_level;
 static int fan_watchdog_maxinterval;
 
 static struct mutex fan_mutex;
@@ -5440,8 +5441,8 @@ static int fan_set_level(int level)
 
        case TPACPI_FAN_WR_ACPI_FANS:
        case TPACPI_FAN_WR_TPEC:
-               if ((level != TP_EC_FAN_AUTO) &&
-                   (level != TP_EC_FAN_FULLSPEED) &&
+               if (!(level & TP_EC_FAN_AUTO) &&
+                   !(level & TP_EC_FAN_FULLSPEED) &&
                    ((level < 0) || (level > 7)))
                        return -EINVAL;
 
@@ -6005,38 +6006,67 @@ static void fan_exit(void)
 
 static void fan_suspend(pm_message_t state)
 {
+       int rc;
+
        if (!fan_control_allowed)
                return;
 
        /* Store fan status in cache */
-       fan_get_status_safe(NULL);
+       fan_control_resume_level = 0;
+       rc = fan_get_status_safe(&fan_control_resume_level);
+       if (rc < 0)
+               printk(TPACPI_NOTICE
+                       "failed to read fan level for later "
+                       "restore during resume: %d\n", rc);
+
+       /* if it is undefined, don't attempt to restore it.
+        * KEEP THIS LAST */
        if (tp_features.fan_ctrl_status_undef)
-               fan_control_desired_level = TP_EC_FAN_AUTO;
+               fan_control_resume_level = 0;
 }
 
 static void fan_resume(void)
 {
-       u8 saved_fan_level;
        u8 current_level = 7;
        bool do_set = false;
+       int rc;
 
        /* DSDT *always* updates status on resume */
        tp_features.fan_ctrl_status_undef = 0;
 
-       saved_fan_level = fan_control_desired_level;
        if (!fan_control_allowed ||
+           !fan_control_resume_level ||
            (fan_get_status_safe(&current_level) < 0))
                return;
 
        switch (fan_control_access_mode) {
        case TPACPI_FAN_WR_ACPI_SFAN:
-               do_set = (saved_fan_level > current_level);
+               /* never decrease fan level */
+               do_set = (fan_control_resume_level > current_level);
                break;
        case TPACPI_FAN_WR_ACPI_FANS:
        case TPACPI_FAN_WR_TPEC:
-               do_set = ((saved_fan_level & TP_EC_FAN_FULLSPEED) ||
-                         (saved_fan_level == 7 &&
-                          !(current_level & TP_EC_FAN_FULLSPEED)));
+               /* never decrease fan level, scale is:
+                * TP_EC_FAN_FULLSPEED > 7 >= TP_EC_FAN_AUTO
+                *
+                * We expect the firmware to set either 7 or AUTO, but we
+                * handle FULLSPEED out of paranoia.
+                *
+                * So, we can safely only restore FULLSPEED or 7, anything
+                * else could slow the fan.  Restoring AUTO is useless, at
+                * best that's exactly what the DSDT already set (it is the
+                * slower it uses).
+                *
+                * Always keep in mind that the DSDT *will* have set the
+                * fans to what the vendor supposes is the best level.  We
+                * muck with it only to speed the fan up.
+                */
+               if (fan_control_resume_level != 7 &&
+                   !(fan_control_resume_level & TP_EC_FAN_FULLSPEED))
+                       return;
+               else
+                       do_set = !(current_level & TP_EC_FAN_FULLSPEED) &&
+                                (current_level != fan_control_resume_level);
                break;
        default:
                return;
@@ -6044,8 +6074,11 @@ static void fan_resume(void)
        if (do_set) {
                printk(TPACPI_NOTICE
                        "restoring fan level to 0x%02x\n",
-                       saved_fan_level);
-               fan_set_level_safe(saved_fan_level);
+                       fan_control_resume_level);
+               rc = fan_set_level_safe(fan_control_resume_level);
+               if (rc < 0)
+                       printk(TPACPI_NOTICE
+                               "failed to restore fan level: %d\n", rc);
        }
 }
 
index 36f2bb6..8ed823a 100644 (file)
@@ -2330,7 +2330,7 @@ static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter,
  * Once we know the feature-set enabled for the device, we'll cache
  * the register offset the descriptor ring is assigned to.
  **/
-static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
+static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
 {
        int feature_mask = 0, rss_i;
        int i, txr_idx, rxr_idx;
@@ -2367,7 +2367,7 @@ static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
  * number of queues at compile-time.  The polling_netdev array is
  * intended for Multiqueue, but should work fine with a single queue.
  **/
-static int __devinit ixgbe_alloc_queues(struct ixgbe_adapter *adapter)
+static int ixgbe_alloc_queues(struct ixgbe_adapter *adapter)
 {
        int i;
 
@@ -2408,8 +2408,7 @@ err_tx_ring_allocation:
  * Attempt to configure the interrupts using the best available
  * capabilities of the hardware and the kernel.
  **/
-static int __devinit ixgbe_set_interrupt_capability(struct ixgbe_adapter
-                                                    *adapter)
+static int ixgbe_set_interrupt_capability(struct ixgbe_adapter *adapter)
 {
        int err = 0;
        int vector, v_budget;
@@ -2501,7 +2500,7 @@ static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter)
  * - Hardware queue count (num_*_queues)
  *   - defined by miscellaneous hardware support/features (RSS, etc.)
  **/
-static int __devinit ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter)
+static int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter)
 {
        int err;
 
index cf3cca4..f51944b 100644 (file)
@@ -349,7 +349,7 @@ static int ibmtr_suspend(struct pcmcia_device *link)
        return 0;
 }
 
-static int ibmtr_resume(struct pcmcia_device *link)
+static int __devinit ibmtr_resume(struct pcmcia_device *link)
 {
        ibmtr_dev_t *info = link->priv;
        struct net_device *dev = info->dev;
index b185cd1..9a16a79 100644 (file)
@@ -1735,7 +1735,7 @@ static const struct ethtool_ops smc911x_ethtool_ops = {
  * This routine has a simple purpose -- make the SMC chip generate an
  * interrupt, so an auto-detect routine can detect it, and find the IRQ,
  */
-static int __init smc911x_findirq(struct net_device *dev)
+static int __devinit smc911x_findirq(struct net_device *dev)
 {
        struct smc911x_local *lp = netdev_priv(dev);
        int timeout = 20;
@@ -1799,7 +1799,7 @@ static int __init smc911x_findirq(struct net_device *dev)
  * o  actually GRAB the irq.
  * o  GRAB the region
  */
-static int __init smc911x_probe(struct net_device *dev)
+static int __devinit smc911x_probe(struct net_device *dev)
 {
        struct smc911x_local *lp = netdev_priv(dev);
        int i, retval;
@@ -2048,7 +2048,7 @@ err_out:
  *      0 --> there is a device
  *      anything else, error
  */
-static int smc911x_drv_probe(struct platform_device *pdev)
+static int __devinit smc911x_drv_probe(struct platform_device *pdev)
 {
 #ifdef SMC_DYNAMIC_BUS_CONFIG
        struct smc911x_platdata *pd = pdev->dev.platform_data;
@@ -2124,7 +2124,7 @@ out:
        return ret;
 }
 
-static int smc911x_drv_remove(struct platform_device *pdev)
+static int __devexit smc911x_drv_remove(struct platform_device *pdev)
 {
        struct net_device *ndev = platform_get_drvdata(pdev);
        struct smc911x_local *lp = netdev_priv(ndev);
@@ -2195,7 +2195,7 @@ static int smc911x_drv_resume(struct platform_device *dev)
 
 static struct platform_driver smc911x_driver = {
        .probe           = smc911x_drv_probe,
-       .remove  = smc911x_drv_remove,
+       .remove  = __devexit_p(smc911x_drv_remove),
        .suspend         = smc911x_drv_suspend,
        .resume  = smc911x_drv_resume,
        .driver  = {
index fc80f25..35c56ab 100644 (file)
@@ -1696,7 +1696,7 @@ static const struct ethtool_ops smc_ethtool_ops = {
  * I just deleted auto_irq.c, since it was never built...
  *   --jgarzik
  */
-static int __init smc_findirq(struct smc_local *lp)
+static int __devinit smc_findirq(struct smc_local *lp)
 {
        void __iomem *ioaddr = lp->base;
        int timeout = 20;
@@ -1770,7 +1770,7 @@ static int __init smc_findirq(struct smc_local *lp)
  * o  actually GRAB the irq.
  * o  GRAB the region
  */
-static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr,
+static int __devinit smc_probe(struct net_device *dev, void __iomem *ioaddr,
                            unsigned long irq_flags)
 {
        struct smc_local *lp = netdev_priv(dev);
@@ -2126,7 +2126,7 @@ static void smc_release_datacs(struct platform_device *pdev, struct net_device *
  *     0 --> there is a device
  *     anything else, error
  */
-static int smc_drv_probe(struct platform_device *pdev)
+static int __devinit smc_drv_probe(struct platform_device *pdev)
 {
        struct smc91x_platdata *pd = pdev->dev.platform_data;
        struct smc_local *lp;
@@ -2240,7 +2240,7 @@ static int smc_drv_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int smc_drv_remove(struct platform_device *pdev)
+static int __devexit smc_drv_remove(struct platform_device *pdev)
 {
        struct net_device *ndev = platform_get_drvdata(pdev);
        struct smc_local *lp = netdev_priv(ndev);
@@ -2305,7 +2305,7 @@ static int smc_drv_resume(struct platform_device *dev)
 
 static struct platform_driver smc_driver = {
        .probe          = smc_drv_probe,
-       .remove         = smc_drv_remove,
+       .remove         = __devexit_p(smc_drv_remove),
        .suspend        = smc_drv_suspend,
        .resume         = smc_drv_resume,
        .driver         = {
index c6948d8..6d017ad 100644 (file)
@@ -1785,7 +1785,7 @@ static int __devexit xennet_remove(struct xenbus_device *dev)
        return 0;
 }
 
-static struct xenbus_driver netfront = {
+static struct xenbus_driver netfront_driver = {
        .name = "vif",
        .owner = THIS_MODULE,
        .ids = netfront_ids,
@@ -1805,7 +1805,7 @@ static int __init netif_init(void)
 
        printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n");
 
-       return xenbus_register_frontend(&netfront);
+       return xenbus_register_frontend(&netfront_driver);
 }
 module_init(netif_init);
 
@@ -1815,7 +1815,7 @@ static void __exit netif_exit(void)
        if (xen_initial_domain())
                return;
 
-       xenbus_unregister_driver(&netfront);
+       xenbus_unregister_driver(&netfront_driver);
 }
 module_exit(netif_exit);
 
index 28af496..061d1ee 100644 (file)
@@ -2042,7 +2042,7 @@ static int __devinit pci_init(void)
        return 0;
 }
 
-static int __devinit pci_setup(char *str)
+static int __init pci_setup(char *str)
 {
        while (str) {
                char *k = strchr(str, ',');
index a926c89..643a6b9 100644 (file)
@@ -879,7 +879,7 @@ static void rio_update_route_tables(struct rio_mport *port)
  * link, then start recursive peer enumeration. Returns %0 if
  * enumeration succeeds or %-EBUSY if enumeration fails.
  */
-int rio_enum_mport(struct rio_mport *mport)
+int __devinit rio_enum_mport(struct rio_mport *mport)
 {
        struct rio_net *net = NULL;
        int rc = 0;
@@ -972,7 +972,7 @@ static void rio_enum_timeout(unsigned long data)
  * peer discovery. Returns %0 if discovery succeeds or %-EBUSY
  * on failure.
  */
-int rio_disc_mport(struct rio_mport *mport)
+int __devinit rio_disc_mport(struct rio_mport *mport)
 {
        struct rio_net *net = NULL;
        int enum_timeout_flag = 0;
index 680661a..6395c78 100644 (file)
@@ -467,7 +467,7 @@ static int __devinit rio_init(void)
 
 device_initcall(rio_init);
 
-int rio_init_mports(void)
+int __devinit rio_init_mports(void)
 {
        int rc = 0;
        struct rio_mport *port;
index f08e169..054f5dd 100644 (file)
@@ -361,7 +361,7 @@ fail:
 extern int bbc_envctrl_init(struct bbc_i2c_bus *bp);
 extern void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp);
 
-static int __devinit bbc_i2c_probe(struct of_device *op,
+static int __init bbc_i2c_probe(struct of_device *op,
                                   const struct of_device_id *match)
 {
        struct bbc_i2c_bus *bp;
@@ -386,7 +386,7 @@ static int __devinit bbc_i2c_probe(struct of_device *op,
        return err;
 }
 
-static int __devexit bbc_i2c_remove(struct of_device *op)
+static int __exit bbc_i2c_remove(struct of_device *op)
 {
        struct bbc_i2c_bus *bp = dev_get_drvdata(&op->dev);
 
@@ -417,7 +417,7 @@ static struct of_platform_driver bbc_i2c_driver = {
        .name           = "bbc_i2c",
        .match_table    = bbc_i2c_match,
        .probe          = bbc_i2c_probe,
-       .remove         = __devexit_p(bbc_i2c_remove),
+       .remove         = __exit_p(bbc_i2c_remove),
 };
 
 static int __init bbc_i2c_init(void)
index 218777b..399fe55 100644 (file)
@@ -13872,8 +13872,10 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost,
        advansys_wide_free_mem(boardp);
        free_irq(boardp->irq, shost);
  err_free_dma:
+#ifdef CONFIG_ISA
        if (shost->dma_channel != NO_ISA_DMA)
                free_dma(shost->dma_channel);
+#endif
  err_free_proc:
        kfree(boardp->prtbuf);
  err_unmap:
@@ -13894,10 +13896,12 @@ static int advansys_release(struct Scsi_Host *shost)
        ASC_DBG(1, "begin\n");
        scsi_remove_host(shost);
        free_irq(board->irq, shost);
+#ifdef CONFIG_ISA
        if (shost->dma_channel != NO_ISA_DMA) {
                ASC_DBG(1, "free_dma()\n");
                free_dma(shost->dma_channel);
        }
+#endif
        if (ASC_NARROW_BOARD(board)) {
                dma_unmap_single(board->dev,
                                        board->dvc_var.asc_dvc_var.overrun_dma,
index c387c15..fb247fd 100644 (file)
@@ -588,7 +588,7 @@ static struct pci_driver gdth_pci_driver = {
        .remove         = gdth_pci_remove_one,
 };
 
-static void gdth_pci_remove_one(struct pci_dev *pdev)
+static void __devexit gdth_pci_remove_one(struct pci_dev *pdev)
 {
        gdth_ha_str *ha = pci_get_drvdata(pdev);
 
@@ -600,7 +600,7 @@ static void gdth_pci_remove_one(struct pci_dev *pdev)
        pci_disable_device(pdev);
 }
 
-static int gdth_pci_init_one(struct pci_dev *pdev,
+static int __devinit gdth_pci_init_one(struct pci_dev *pdev,
                                       const struct pci_device_id *ent)
 {
        ushort vendor = pdev->vendor;
@@ -853,7 +853,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha)
 #endif /* CONFIG_ISA */
 
 #ifdef CONFIG_PCI
-static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr,
+static int __devinit gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr,
                                   gdth_ha_str *ha)
 {
     register gdt6_dpram_str __iomem *dp6_ptr;
@@ -1237,7 +1237,7 @@ static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr,
 
 /* controller protocol functions */
 
-static void __init gdth_enable_int(gdth_ha_str *ha)
+static void __devinit gdth_enable_int(gdth_ha_str *ha)
 {
     ulong flags;
     gdt2_dpram_str __iomem *dp2_ptr;
@@ -1553,7 +1553,7 @@ static int gdth_internal_cmd(gdth_ha_str *ha, unchar service, ushort opcode,
 
 /* search for devices */
 
-static int __init gdth_search_drives(gdth_ha_str *ha)
+static int __devinit gdth_search_drives(gdth_ha_str *ha)
 {
     ushort cdev_cnt, i;
     int ok;
@@ -4935,7 +4935,7 @@ static int __init gdth_eisa_probe_one(ushort eisa_slot)
 #endif /* CONFIG_EISA */
 
 #ifdef CONFIG_PCI
-static int gdth_pci_probe_one(gdth_pci_str *pcistr,
+static int __devinit gdth_pci_probe_one(gdth_pci_str *pcistr,
                             gdth_ha_str **ha_out)
 {
        struct Scsi_Host *shp;
index a463b3d..2493f05 100644 (file)
@@ -668,7 +668,7 @@ static struct xenbus_device_id xenfb_ids[] = {
        { "" }
 };
 
-static struct xenbus_driver xenfb = {
+static struct xenbus_driver xenfb_driver = {
        .name = "vfb",
        .owner = THIS_MODULE,
        .ids = xenfb_ids,
@@ -687,12 +687,12 @@ static int __init xenfb_init(void)
        if (xen_initial_domain())
                return -ENODEV;
 
-       return xenbus_register_frontend(&xenfb);
+       return xenbus_register_frontend(&xenfb_driver);
 }
 
 static void __exit xenfb_cleanup(void)
 {
-       xenbus_unregister_driver(&xenfb);
+       xenbus_unregister_driver(&xenfb_driver);
 }
 
 module_init(xenfb_init);
index a14d5b6..9061682 100644 (file)
@@ -36,7 +36,7 @@ config W1_MASTER_DS2482
 
 config W1_MASTER_DS1WM
        tristate "Maxim DS1WM 1-wire busmaster"
-       depends on W1 && ARM
+       depends on W1 && ARM && HAVE_CLK
        help
          Say Y here to enable the DS1WM 1-wire driver, such as that
          in HP iPAQ devices like h5xxx, h2200, and ASIC3-based like
index 619fb75..16a9ca9 100644 (file)
@@ -167,7 +167,7 @@ static const union acpi_predefined_info predefined_names[] = {
        {.info = {"_BFS", 1, 0}},
        {.info = {"_BIF", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER,
                                          9,
-                                         ACPI_RTYPE_STRING, 4, 0}},    /* fixed (9 Int),(4 Str) */
+                                         ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER, 4, 0}},        /* fixed (9 Int),(4 Str) */
        {.info = {"_BLT", 3, 0}},
        {.info = {"_BMC", 1, 0}},
        {.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[] = {
 
        /* Acpi 1.0 defined _WAK with no return value. Later, it was changed to return a package */
 
-       {.info = {"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_PACKAGE}},
+       {.info = {"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_INTEGER | ACPI_RTYPE_PACKAGE}},
        {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2, 0, 0, 0}},      /* fixed (2 Int), but is optional */
        {.ret_info = {0, 0, 0, 0, 0, 0}}        /* Table terminator */
 };
index f061a1e..e88f3ec 100644 (file)
@@ -252,12 +252,10 @@ extern int compat_ptrace_request(struct task_struct *child,
                                 compat_long_t request,
                                 compat_ulong_t addr, compat_ulong_t data);
 
-#ifdef __ARCH_WANT_COMPAT_SYS_PTRACE
 extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                               compat_ulong_t addr, compat_ulong_t data);
 asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
                                  compat_long_t addr, compat_long_t data);
-#endif /* __ARCH_WANT_COMPAT_SYS_PTRACE */
 
 /*
  * epoll (fs/eventpoll.c) compat bits follow ...
index 2f5f8a5..36c82c9 100644 (file)
@@ -91,7 +91,7 @@ extern int memory_notify(unsigned long val, void *v);
 
 #ifdef CONFIG_MEMORY_HOTPLUG
 #define hotplug_memory_notifier(fn, pri) {                     \
-       static struct notifier_block fn##_mem_nb =              \
+       static __meminitdata struct notifier_block fn##_mem_nb =\
                { .notifier_call = fn, .priority = pri };       \
        register_memory_notifier(&fn##_mem_nb);                 \
 }
index f546ad6..1e6d34b 100644 (file)
@@ -17,7 +17,7 @@ struct page_cgroup {
        struct list_head lru;           /* per cgroup LRU list */
 };
 
-void __init pgdat_page_cgroup_init(struct pglist_data *pgdat);
+void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat);
 void __init page_cgroup_init(void);
 struct page_cgroup *lookup_page_cgroup(struct page *page);
 
@@ -91,7 +91,7 @@ static inline void unlock_page_cgroup(struct page_cgroup *pc)
 #else /* CONFIG_CGROUP_MEM_RES_CTLR */
 struct page_cgroup;
 
-static inline void pgdat_page_cgroup_init(struct pglist_data *pgdat)
+static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat)
 {
 }
 
index 5a732c5..8ea32e8 100644 (file)
@@ -462,7 +462,7 @@ out:
  * It must be called by the arch code on the new cpu, before the new cpu
  * enables interrupts and before the "boot" cpu returns from __cpu_up().
  */
-void notify_cpu_starting(unsigned int cpu)
+void __cpuinit notify_cpu_starting(unsigned int cpu)
 {
        unsigned long val = CPU_STARTING;
 
index 5b7d1ac..dc41827 100644 (file)
@@ -351,7 +351,7 @@ out:
        put_cpu();
 }
 
-static int __devinit profile_cpu_callback(struct notifier_block *info,
+static int __cpuinit profile_cpu_callback(struct notifier_block *info,
                                        unsigned long action, void *__cpu)
 {
        int node, cpu = (unsigned long)__cpu;
@@ -596,7 +596,7 @@ out_cleanup:
 #define create_hash_tables()                   ({ 0; })
 #endif
 
-int create_proc_profile(void)
+int __ref create_proc_profile(void) /* false positive from hotcpu_notifier */
 {
        struct proc_dir_entry *entry;
 
index 1e68e4c..4c8bcd7 100644 (file)
@@ -612,7 +612,7 @@ int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data)
        return (copied == sizeof(data)) ? 0 : -EIO;
 }
 
-#if defined CONFIG_COMPAT && defined __ARCH_WANT_COMPAT_SYS_PTRACE
+#if defined CONFIG_COMPAT
 #include <linux/compat.h>
 
 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,
        unlock_kernel();
        return ret;
 }
-#endif /* CONFIG_COMPAT && __ARCH_WANT_COMPAT_SYS_PTRACE */
+#endif /* CONFIG_COMPAT */
index b5b2b15..b173711 100644 (file)
@@ -189,7 +189,7 @@ static void grow_pgdat_span(struct pglist_data *pgdat, unsigned long start_pfn,
                                        pgdat->node_start_pfn;
 }
 
-static int __add_zone(struct zone *zone, unsigned long phys_start_pfn)
+static int __meminit __add_zone(struct zone *zone, unsigned long phys_start_pfn)
 {
        struct pglist_data *pgdat = zone->zone_pgdat;
        int nr_pages = PAGES_PER_SECTION;
@@ -216,7 +216,7 @@ static int __add_zone(struct zone *zone, unsigned long phys_start_pfn)
        return 0;
 }
 
-static int __add_section(struct zone *zone, unsigned long phys_start_pfn)
+static int __meminit __add_section(struct zone *zone, unsigned long phys_start_pfn)
 {
        int nr_pages = PAGES_PER_SECTION;
        int ret;
@@ -273,7 +273,7 @@ static int __remove_section(struct zone *zone, struct mem_section *ms)
  * call this function after deciding the zone to which to
  * add the new pages.
  */
-int __add_pages(struct zone *zone, unsigned long phys_start_pfn,
+int __ref __add_pages(struct zone *zone, unsigned long phys_start_pfn,
                 unsigned long nr_pages)
 {
        unsigned long i;
@@ -470,7 +470,8 @@ static void rollback_node_hotadd(int nid, pg_data_t *pgdat)
 }
 
 
-int add_memory(int nid, u64 start, u64 size)
+/* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */
+int __ref add_memory(int nid, u64 start, u64 size)
 {
        pg_data_t *pgdat = NULL;
        int new_pgdat = 0;
index 1223d92..436c002 100644 (file)
@@ -21,7 +21,7 @@ static unsigned long total_usage;
 #if !defined(CONFIG_SPARSEMEM)
 
 
-void __init pgdat_page_cgroup_init(struct pglist_data *pgdat)
+void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat)
 {
        pgdat->node_page_cgroup = NULL;
 }
@@ -97,7 +97,8 @@ struct page_cgroup *lookup_page_cgroup(struct page *page)
        return section->page_cgroup + pfn;
 }
 
-int __meminit init_section_page_cgroup(unsigned long pfn)
+/* __alloc_bootmem...() is protected by !slab_available() */
+int __init_refok init_section_page_cgroup(unsigned long pfn)
 {
        struct mem_section *section;
        struct page_cgroup *base, *pc;
@@ -158,7 +159,7 @@ void __free_page_cgroup(unsigned long pfn)
        }
 }
 
-int online_page_cgroup(unsigned long start_pfn,
+int __meminit online_page_cgroup(unsigned long start_pfn,
                        unsigned long nr_pages,
                        int nid)
 {
@@ -183,7 +184,7 @@ int online_page_cgroup(unsigned long start_pfn,
        return -ENOMEM;
 }
 
-int offline_page_cgroup(unsigned long start_pfn,
+int __meminit offline_page_cgroup(unsigned long start_pfn,
                unsigned long nr_pages, int nid)
 {
        unsigned long start, end, pfn;
@@ -197,7 +198,7 @@ int offline_page_cgroup(unsigned long start_pfn,
 
 }
 
-static int page_cgroup_callback(struct notifier_block *self,
+static int __meminit page_cgroup_callback(struct notifier_block *self,
                               unsigned long action, void *arg)
 {
        struct memory_notify *mn = arg;
@@ -248,7 +249,7 @@ void __init page_cgroup_init(void)
        " want\n");
 }
 
-void __init pgdat_page_cgroup_init(struct pglist_data *pgdat)
+void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat)
 {
        return;
 }
index 39db301..083f5b6 100644 (file)
@@ -570,7 +570,7 @@ static void free_section_usemap(struct page *memmap, unsigned long *usemap)
  * set.  If this is <=0, then that means that the passed-in
  * map was not consumed and must be freed.
  */
-int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
+int __meminit sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
                           int nr_pages)
 {
        unsigned long section_nr = pfn_to_section_nr(start_pfn);
index d44bf98..6c427bb 100644 (file)
@@ -1856,7 +1856,7 @@ static int __init snd_cs4231_sbus_create(struct snd_card *card,
        return 0;
 }
 
-static int __devinit cs4231_sbus_probe(struct of_device *op, const struct of_device_id *match)
+static int __init cs4231_sbus_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct resource *rp = &op->resource[0];
        struct snd_card *card;
@@ -2048,7 +2048,7 @@ static int __init snd_cs4231_ebus_create(struct snd_card *card,
        return 0;
 }
 
-static int __devinit cs4231_ebus_probe(struct of_device *op, const struct of_device_id *match)
+static int __init cs4231_ebus_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct snd_card *card;
        int err;
@@ -2072,7 +2072,7 @@ static int __devinit cs4231_ebus_probe(struct of_device *op, const struct of_dev
 }
 #endif
 
-static int __devinit cs4231_probe(struct of_device *op, const struct of_device_id *match)
+static int __init cs4231_probe(struct of_device *op, const struct of_device_id *match)
 {
 #ifdef EBUS_SUPPORT
        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
        return -ENODEV;
 }
 
-static int __devexit cs4231_remove(struct of_device *op)
+static int __exit cs4231_remove(struct of_device *op)
 {
        struct snd_cs4231 *chip = dev_get_drvdata(&op->dev);
 
@@ -2112,7 +2112,7 @@ static struct of_platform_driver cs4231_driver = {
        .name           = "audio",
        .match_table    = cs4231_match,
        .probe          = cs4231_probe,
-       .remove         = __devexit_p(cs4231_remove),
+       .remove         = __exit_p(cs4231_remove),
 };
 
 static int __init cs4231_init(void)