Pull trivial into test branch
authorLen Brown <len.brown@intel.com>
Sat, 16 Dec 2006 05:45:07 +0000 (00:45 -0500)
committerLen Brown <len.brown@intel.com>
Sat, 16 Dec 2006 05:45:07 +0000 (00:45 -0500)
Conflicts:

drivers/acpi/ec.c

1  2 
MAINTAINERS
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
drivers/acpi/ec.c
drivers/acpi/glue.c
include/asm-i386/acpi.h
include/asm-x86_64/acpi.h

diff --combined MAINTAINERS
@@@ -155,16 -155,16 +155,16 @@@ L:      netdev@vger.kernel.or
  S:    Maintained
  
  9P FILE SYSTEM
 -P:      Eric Van Hensbergen
 -M:      ericvh@gmail.com
 -P:      Ron Minnich
 -M:      rminnich@lanl.gov
 -P:      Latchesar Ionkov
 -M:      lucho@ionkov.net
 -L:      v9fs-developer@lists.sourceforge.net
 -W:      http://v9fs.sf.net
 -T:      git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs.git
 -S:      Maintained
 +P:    Eric Van Hensbergen
 +M:    ericvh@gmail.com
 +P:    Ron Minnich
 +M:    rminnich@lanl.gov
 +P:    Latchesar Ionkov
 +M:    lucho@ionkov.net
 +L:    v9fs-developer@lists.sourceforge.net
 +W:    http://v9fs.sf.net
 +T:    git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs.git
 +S:    Maintained
  
  A2232 SERIAL BOARD DRIVER
  P:    Enver Haase
@@@ -277,7 -277,7 +277,7 @@@ S: Maintaine
  
  ALI1563 I2C DRIVER
  P:    Rudolf Marek
 -M:    r.marek@sh.cvut.cz
 +M:    r.marek@assembler.cz
  L:    i2c@lm-sensors.org
  S:    Maintained
  
@@@ -290,19 -290,12 +290,19 @@@ M:      ink@jurassic.park.msu.r
  S:    Maintained for 2.4; PCI support for 2.6.
  
  AMD GEODE PROCESSOR/CHIPSET SUPPORT
 -P:      Jordan Crouse
 -M:      info-linux@geode.amd.com
 +P:    Jordan Crouse
 +M:    info-linux@geode.amd.com
  L:    info-linux@geode.amd.com
  W:    http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html
  S:    Supported
  
 +AMS (Apple Motion Sensor) DRIVER
 +P:    Stelian Pop
 +M:    stelian@popies.net
 +P:    Michael Hanselmann
 +M:    linux-kernel@hansmi.ch
 +S:    Supported
 +
  AMSO1100 RNIC DRIVER
  P:    Tom Tucker
  M:    tom@opengridcomputing.com
@@@ -355,24 -348,11 +355,24 @@@ P:      Ian Molto
  M:    spyro@f2s.com
  S:    Maintained
  
 +ARM/ATMEL AT91RM9200 ARM ARCHITECTURE
 +P:      Andrew Victor
 +M:      andrew@sanpeople.com
 +L:      linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
 +W:      http://maxim.org.za/at91_26.html
 +S:      Maintained
 +
  ARM/CORGI MACHINE SUPPORT
  P:    Richard Purdie
  M:    rpurdie@rpsys.net
  S:    Maintained
  
 +ARM/HP JORNADA 7XX MACHINE SUPPORT
 +P:      Kristoffer Ericson
 +M:      kristoffer_e1@hotmail.com
 +W:      www.jlime.com
 +S:      Maintained
 +
  ARM/TOSA MACHINE SUPPORT
  P:    Dirk Opfer
  M:    dirk@opfer-online.de
@@@ -446,13 -426,6 +446,13 @@@ L:       linux-atm-general@lists.sourceforge.
  W:    http://linux-atm.sourceforge.net
  S:    Maintained
  
 +ATMEL MACB ETHERNET DRIVER
 +P:    Atmel AVR32 Support Team
 +M:    avr32@atmel.com
 +P:    Haavard Skinnemoen
 +M:    hskinnemoen@atmel.com
 +S:    Supported
 +
  ATMEL WIRELESS DRIVER
  P:    Simon Kelley
  M:    simon@thekelleys.org.uk
@@@ -520,7 -493,7 +520,7 @@@ S: Maintaine
  
  BFS FILE SYSTEM
  P:    Tigran A. Aivazian
 -M:    tigran@veritas.com
 +M:    tigran@aivazian.fsnet.co.uk
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  
@@@ -622,13 -595,13 +622,13 @@@ M:      maxk@qualcomm.co
  S:    Maintained
  
  BONDING DRIVER
 -P:   Chad Tindel
 -M:   ctindel@users.sourceforge.net
 -P:   Jay Vosburgh
 -M:   fubar@us.ibm.com
 -L:   bonding-devel@lists.sourceforge.net
 -W:   http://sourceforge.net/projects/bonding/
 -S:   Supported
 +P:    Chad Tindel
 +M:    ctindel@users.sourceforge.net
 +P:    Jay Vosburgh
 +M:    fubar@us.ibm.com
 +L:    bonding-devel@lists.sourceforge.net
 +W:    http://sourceforge.net/projects/bonding/
 +S:    Supported
  
  BROADBAND PROCESSOR ARCHITECTURE
  P:    Arnd Bergmann
@@@ -691,7 -664,7 +691,7 @@@ S: Supporte
  CIRRUS LOGIC GENERIC FBDEV DRIVER
  P:    Jeff Garzik
  M:    jgarzik@pobox.com
 -L:    linux-fbdev-devel@lists.sourceforge.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
  S:    Odd Fixes
  
  CIRRUS LOGIC CS4280/CS461x SOUNDDRIVER
@@@ -747,7 -720,7 +747,7 @@@ P: Dave Jone
  M:    davej@codemonkey.org.uk
  L:    cpufreq@lists.linux.org.uk
  W:    http://www.codemonkey.org.uk/projects/cpufreq/
 -T:    git kernel.org/pub/scm/linux/kernel/davej/cpufreq.git
 +T:    git kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git
  S:    Maintained
  
  CPUID/MSR DRIVER
@@@ -765,8 -738,8 +765,8 @@@ W: http://www.bullopensource.org/cpuset
  S:    Supported
  
  CRAMFS FILESYSTEM
 -W:     http://sourceforge.net/projects/cramfs/
 -S:     Orphan
 +W:    http://sourceforge.net/projects/cramfs/
 +S:    Orphan
  
  CRIS PORT
  P:    Mikael Starvik
@@@ -798,7 -771,7 +798,7 @@@ S: Maintaine
  CYBLAFB FRAMEBUFFER DRIVER
  P:    Knut Petersen
  M:    Knut_Petersen@t-online.de
 -L:    linux-fbdev-devel@lists.sourceforge.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
  S:    Maintained
  
  CYCLADES 2X SYNC CARD DRIVER
@@@ -1075,11 -1048,11 +1075,11 @@@ W:   http://sourceforge.net/projects/emu1
  S:    Maintained
  
  EMULEX LPFC FC SCSI DRIVER
 -P:      James Smart
 -M:      james.smart@emulex.com
 -L:      linux-scsi@vger.kernel.org
 -W:      http://sourceforge.net/projects/lpfcxxxx
 -S:      Supported
 +P:    James Smart
 +M:    james.smart@emulex.com
 +L:    linux-scsi@vger.kernel.org
 +W:    http://sourceforge.net/projects/lpfcxxxx
 +S:    Supported
  
  EPSON 1355 FRAMEBUFFER DRIVER
  P:    Christopher Hoover
@@@ -1105,19 -1078,13 +1105,19 @@@ M:   miku@iki.f
  S:    Maintained
  
  EXT2 FILE SYSTEM
 -L:    ext2-devel@lists.sourceforge.net
 +L:    linux-ext4@vger.kernel.org
  S:    Maintained
  
  EXT3 FILE SYSTEM
  P:    Stephen Tweedie, Andrew Morton
  M:    sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
 -L:    ext2-devel@lists.sourceforge.net
 +L:    linux-ext4@vger.kernel.org
 +S:    Maintained
 +
 +EXT4 FILE SYSTEM
 +P:    Stephen Tweedie, Andrew Morton
 +M:    sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
 +L:    linux-ext4@vger.kernel.org
  S:    Maintained
  
  F71805F HARDWARE MONITORING DRIVER
@@@ -1135,7 -1102,7 +1135,7 @@@ S:      Supporte
  FRAMEBUFFER LAYER
  P:    Antonino Daplas
  M:    adaplas@pol.net
 -L:    linux-fbdev-devel@lists.sourceforge.net 
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
  W:    http://linux-fbdev.sourceforge.net/
  S:    Maintained
  
@@@ -1186,6 -1153,11 +1186,6 @@@ P:     David Howell
  M:    dhowells@redhat.com
  S:    Maintained
  
 -FTAPE/QIC-117
 -L:    linux-tape@vger.kernel.org
 -W:    http://sourceforge.net/projects/ftape
 -S:    Orphan
 -
  FUSE: FILESYSTEM IN USERSPACE
  P:    Miklos Szeredi
  M:    miklos@szeredi.hu
@@@ -1234,8 -1206,7 +1234,8 @@@ HARDWARE MONITORIN
  P:    Jean Delvare
  M:    khali@linux-fr.org
  L:    lm-sensors@lm-sensors.org
 -W:    http://www.lm-sensors.nu/
 +W:    http://www.lm-sensors.org/
 +T:    quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-hwmon/
  S:    Maintained
  
  HARDWARE RANDOM NUMBER GENERATOR CORE
@@@ -1361,7 -1332,8 +1361,7 @@@ I2C SUBSYSTE
  P:    Jean Delvare
  M:    khali@linux-fr.org
  L:    i2c@lm-sensors.org
 -W:    http://www.lm-sensors.nu/
 -T:    quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
 +T:    quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
  S:    Maintained
  
  I2O
@@@ -1397,6 -1369,15 +1397,15 @@@ W:    http://www.ia64-linux.org
  T:    git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
  S:    Maintained
  
+ IBM ACPI EXTRAS DRIVER
+ P:    Henrique de Moraes Holschuh
+ M:    ibm-acpi@hmh.eng.br
+ L:    ibm-acpi-devel@lists.sourceforge.net
+ W:    http://ibm-acpi.sourceforge.net
+ W:    http://thinkwiki.org/wiki/Ibm-acpi
+ T:    git repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
+ S:    Maintained
  SN-IA64 (Itanium) SUB-PLATFORM
  P:    Jes Sorensen
  M:    jes@sgi.com
@@@ -1486,7 -1467,7 +1495,7 @@@ S:      Maintaine
  IMS TWINTURBO FRAMEBUFFER DRIVER
  P:    Paul Mundt
  M:    lethal@chaoticdreams.org
 -L:    linux-fbdev-devel@lists.sourceforge.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
  S:    Maintained
  
  INFINIBAND SUBSYSTEM
@@@ -1511,24 -1492,22 +1520,24 @@@ T:   git kernel.org:/pub/scm/linux/kernel
  S:    Maintained
  
  INOTIFY
 -P:    John McCutchan and Robert Love
 -M:    ttb@tentacle.dhs.org and rml@novell.com
 +P:    John McCutchan
 +M:    ttb@tentacle.dhs.org
 +P:    Robert Love
 +M:    rml@novell.com
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  
  INTEL FRAMEBUFFER DRIVER (excluding 810 and 815)
 -P:      Sylvain Meyer
 -M:      sylvain.meyer@worldonline.fr
 -L:      linux-fbdev-devel@lists.sourceforge.net
 -S:      Maintained
 +P:    Sylvain Meyer
 +M:    sylvain.meyer@worldonline.fr
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
 +S:    Maintained
  
  INTEL 810/815 FRAMEBUFFER DRIVER
 -P:      Antonino Daplas
 -M:      adaplas@pol.net
 -L:      linux-fbdev-devel@lists.sourceforge.net
 -S:      Maintained
 +P:    Antonino Daplas
 +M:    adaplas@pol.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
 +S:    Maintained
  
  INTEL APIC/IOAPIC, LOWLEVEL X86 SMP SUPPORT
  P:    Ingo Molnar
@@@ -1543,7 -1522,7 +1552,7 @@@ S:      Maintaine
  
  INTEL IA32 MICROCODE UPDATE SUPPORT
  P:    Tigran Aivazian
 -M:    tigran@veritas.com
 +M:    tigran@aivazian.fsnet.co.uk
  S:    Maintained
  
  INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
@@@ -1695,7 -1674,7 +1704,7 @@@ S:      Supporte
  JOURNALLING LAYER FOR BLOCK DEVICES (JBD)
  P:    Stephen Tweedie, Andrew Morton
  M:    sct@redhat.com, akpm@osdl.org
 -L:    ext2-devel@lists.sourceforge.net
 +L:    linux-ext4@vger.kernel.org
  S:    Maintained
  
  K8TEMP HARDWARE MONITORING DRIVER
@@@ -1754,13 -1733,6 +1763,13 @@@ W:    http://nfs.sourceforge.net
  W:    http://www.cse.unsw.edu.au/~neilb/patches/linux-devel/
  S:    Maintained
  
 +KERNEL VIRTUAL MACHINE (KVM)
 +P:    Avi Kivity
 +M:    avi@qumranet.com
 +L:    kvm-devel@lists.sourceforge.net
 +W:    kvm.sourceforge.net
 +S:    Supported
 +
  KEXEC
  P:    Eric Biederman
  M:    ebiederm@xmission.com
@@@ -1861,11 -1833,11 +1870,11 @@@ L:   linuxppc-embedded@ozlabs.or
  S:    Maintained
  
  LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
 -P:     Kumar Gala
 -M:     galak@kernel.crashing.org
 -W:     http://www.penguinppc.org/
 -L:     linuxppc-embedded@ozlabs.org
 -S:     Maintained
 +P:    Kumar Gala
 +M:    galak@kernel.crashing.org
 +W:    http://www.penguinppc.org/
 +L:    linuxppc-embedded@ozlabs.org
 +S:    Maintained
  
  LINUX FOR POWERPC PA SEMI PWRFICIENT
  P:    Olof Johansson
@@@ -1964,10 -1936,10 +1973,10 @@@ W:   http://www.syskonnect.co
  S:    Supported
  
  MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
 -P: Michael Kerrisk
 -M: mtk-manpages@gmx.net
 -W: ftp://ftp.kernel.org/pub/linux/docs/manpages
 -S: Maintained
 +P:    Michael Kerrisk
 +M:    mtk-manpages@gmx.net
 +W:    ftp://ftp.kernel.org/pub/linux/docs/manpages
 +S:    Maintained
  
  MARVELL MV643XX ETHERNET DRIVER
  P:    Dale Farnsworth
@@@ -1980,15 -1952,15 +1989,15 @@@ S:   Odd Fixes for 2.4; Maintained for 2.
  MATROX FRAMEBUFFER DRIVER
  P:    Petr Vandrovec
  M:    vandrove@vc.cvut.cz
 -L:    linux-fbdev-devel@lists.sourceforge.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
  S:    Maintained
  
  MEGARAID SCSI DRIVERS
 -P:     Neela Syam Kolli
 -M:     Neela.Kolli@engenio.com
 -S:     linux-scsi@vger.kernel.org
 -W:     http://megaraid.lsilogic.com
 -S:     Maintained
 +P:    Neela Syam Kolli
 +M:    Neela.Kolli@engenio.com
 +S:    linux-scsi@vger.kernel.org
 +W:    http://megaraid.lsilogic.com
 +S:    Maintained
  
  MEMORY MANAGEMENT
  L:    linux-mm@kvack.org
@@@ -2041,12 -2013,6 +2050,12 @@@ M:    rubini@ipvvis.unipv.i
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  
 +MOXA SMARTIO/INDUSTIO SERIAL CARD (MXSER 2.0)
 +P:    Jiri Slaby
 +M:    jirislaby@gmail.com
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +
  MSI LAPTOP SUPPORT
  P:    Lennart Poettering
  M:    mzxreary@0pointer.de
@@@ -2072,12 -2038,6 +2081,12 @@@ P:    Andrew Veliat
  M:    andrewtv@usa.net
  S:    Maintained
  
 +MULTITECH MULTIPORT CARD (ISICOM)
 +P:    Jiri Slaby
 +M:    jirislaby@gmail.com
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +
  NATSEMI ETHERNET DRIVER (DP8381x)
  P:    Tim Hockin
  M:    thockin@hockin.org
@@@ -2175,13 -2135,6 +2184,13 @@@ L:    netdev@vger.kernel.or
  T:    git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
  S:    Maintained
  
 +NETXEN (1/10) GbE SUPPORT
 +P:    Amit S. Kale
 +M:    amitkale@netxen.com
 +L:    netdev@vger.kernel.org
 +W:    http://www.netxen.com
 +S:    Supported
 +
  IPVS
  P:    Wensong Zhang
  M:    wensong@linux-vs.org
@@@ -2236,10 -2189,10 +2245,10 @@@ T:   git kernel.org:/pub/scm/linux/kernel
  S:    Maintained
  
  NVIDIA (rivafb and nvidiafb) FRAMEBUFFER DRIVER
 -P:      Antonino Daplas
 -M:      adaplas@pol.net
 -L:      linux-fbdev-devel@lists.sourceforge.net
 -S:      Maintained
 +P:    Antonino Daplas
 +M:    adaplas@pol.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
 +S:    Maintained
  
  OPENCORES I2C BUS DRIVER
  P:    Peter Korsgaard
@@@ -2479,13 -2432,6 +2488,13 @@@ M:    promise@pnd-pc.demon.co.u
  W:    http://www.pnd-pc.demon.co.uk/promise/
  S:    Maintained
  
 +PS3 PLATFORM SUPPORT
 +P:    Geoff Levand
 +M:    geoffrey.levand@am.sony.com
 +L:    linuxppc-dev@ozlabs.org
 +L:    cbe-oss-dev@ozlabs.org
 +S:    Supported
 +
  PVRUSB2 VIDEO4LINUX DRIVER
  P:    Mike Isely
  M:    isely@pobox.com
@@@ -2522,13 -2468,13 +2531,13 @@@ S:   Maintaine
  RADEON FRAMEBUFFER DISPLAY DRIVER
  P:    Benjamin Herrenschmidt
  M:    benh@kernel.crashing.org
 -L:    linux-fbdev-devel@lists.sourceforge.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
  S:    Maintained
  
  RAGE128 FRAMEBUFFER DISPLAY DRIVER
  P:    Paul Mackerras
  M:    paulus@samba.org
 -L:    linux-fbdev-devel@lists.sourceforge.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
  S:    Maintained
  
  RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER
@@@ -2570,7 -2516,7 +2579,7 @@@ S:      Maintaine
  REAL TIME CLOCK (RTC) SUBSYSTEM
  P:    Alessandro Zummo
  M:    a.zummo@towertech.it
 -L:    linux-kernel@vger.kernel.org
 +L:    rtc-linux@googlegroups.com
  S:    Maintained
  
  REISERFS FILE SYSTEM
@@@ -2596,10 -2542,10 +2605,10 @@@ RISCOM8 DRIVE
  S:    Orphan
  
  S3 SAVAGE FRAMEBUFFER DRIVER
 -P:      Antonino Daplas
 -M:      adaplas@pol.net
 -L:      linux-fbdev-devel@lists.sourceforge.net
 -S:      Maintained
 +P:    Antonino Daplas
 +M:    adaplas@pol.net
 +L:    linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
 +S:    Maintained
  
  S390
  P:    Martin Schwidefsky
@@@ -2680,10 -2626,10 +2689,10 @@@ L:   linux-scsi@vger.kernel.or
  S:    Maintained
  
  SCTP PROTOCOL
 -P: Sridhar Samudrala
 -M: sri@us.ibm.com
 -L: lksctp-developers@lists.sourceforge.net
 -S: Supported
 +P:    Sridhar Samudrala
 +M:    sri@us.ibm.com
 +L:    lksctp-developers@lists.sourceforge.net
 +S:    Supported
  
  SCx200 CPU SUPPORT
  P:    Jim Cromie
@@@ -2851,9 -2797,9 +2860,9 @@@ L:      tpmdd-devel@lists.sourceforge.ne
  S:    Maintained
  
  Telecom Clock Driver for MCPL0010
 -P: Mark Gross
 -M: mark.gross@intel.com
 -S: Supported
 +P:    Mark Gross
 +M:    mark.gross@intel.com
 +S:    Supported
  
  TENSILICA XTENSA PORT (xtensa):
  P:    Chris Zankel
@@@ -2954,6 -2900,7 +2963,6 @@@ S:      Maintaine
  SUN3/3X
  P:    Sam Creasey
  M:    sammy@sammy.net
 -L:    sun3-list@redhat.com
  W:    http://sammy.net/sun3/
  S:    Maintained
  
@@@ -2999,9 -2946,9 +3008,9 @@@ L:      linux-kernel@vger.kernel.or
  S:    Maintained
  
  TI PARALLEL LINK CABLE DRIVER
 -P:     Romain Lievin
 -M:     roms@lpg.ticalc.org
 -S:     Maintained
 +P:    Romain Lievin
 +M:    roms@lpg.ticalc.org
 +S:    Maintained
  
  TIPC NETWORK LAYER
  P:    Per Liden
@@@ -3051,12 -2998,12 +3060,12 @@@ L:   linux-kernel@vger.kernel.or
  S:    Maintained
  
  TRIVIAL PATCHES
 -P:      Adrian Bunk
 -M:      trivial@kernel.org
 -L:      linux-kernel@vger.kernel.org
 -W:      http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/
 -T:      git kernel.org:/pub/scm/linux/kernel/git/bunk/trivial.git
 -S:      Maintained
 +P:    Adrian Bunk
 +M:    trivial@kernel.org
 +L:    linux-kernel@vger.kernel.org
 +W:    http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/
 +T:    git kernel.org:/pub/scm/linux/kernel/git/bunk/trivial.git
 +S:    Maintained
  
  TMS380 TOKEN-RING NETWORK DRIVER
  P:    Adam Fritzler
@@@ -3134,13 -3081,6 +3143,13 @@@ L:    video4linux-list@redhat.co
  W:    http://www.linux-projects.org
  S:    Maintained
  
 +USB GADGET/PERIPHERAL SUBSYSTEM
 +P:    David Brownell
 +M:    dbrownell@users.sourceforge.net
 +L:    linux-usb-devel@lists.sourceforge.net
 +W:    http://www.linux-usb.org/gadget
 +S:    Maintained
 +
  USB HID/HIDBP DRIVERS
  P:    Vojtech Pavlik
  M:    vojtech@suse.cz
@@@ -3324,11 -3264,10 +3333,11 @@@ L:   linux-usb-users@lists.sourceforge.ne
  L:    linux-usb-devel@lists.sourceforge.net
  S:    Maintained
  
 -USB "USBNET" DRIVER
 +USB "USBNET" DRIVER FRAMEWORK
  P:    David Brownell
  M:    dbrownell@users.sourceforge.net
  L:    linux-usb-devel@lists.sourceforge.net
 +W:    http://www.linux-usb.org/usbnet
  S:    Maintained
  
  USB W996[87]CF DRIVER
@@@ -3443,12 -3382,6 +3452,12 @@@ M:    bezaur@gmail.co
  L:    lm-sensors@lm-sensors.org
  S:    Maintained
  
 +W83793 HARDWARE MONITORING DRIVER
 +P:    Rudolf Marek
 +M:    r.marek@assembler.cz
 +L:    lm-sensors@lm-sensors.org
 +S:    Maintained
 +
  W83L51xD SD/MMC CARD INTERFACE DRIVER
  P:    Pierre Ossman
  M:    drzeus-wbsd@drzeus.cx
@@@ -3500,12 -3433,6 +3509,12 @@@ W:    http://oss.sgi.com/projects/xf
  T:    git git://oss.sgi.com:8090/xfs/xfs-2.6
  S:    Supported
  
 +XILINX UARTLITE SERIAL DRIVER
 +P:    Peter Korsgaard
 +M:    jacmet@sunsite.dk
 +L:    linux-serial@vger.kernel.org
 +S:    Maintained
 +
  X86 3-LEVEL PAGING (PAE) SUPPORT
  P:    Ingo Molnar
  M:    mingo@redhat.com
@@@ -70,7 -70,7 +70,7 @@@ static inline int acpi_madt_oem_check(c
  
  #define PREFIX                        "ACPI: "
  
 -int acpi_noirq __initdata;    /* skip ACPI IRQ initialization */
 +int acpi_noirq;                               /* skip ACPI IRQ initialization */
  int acpi_pci_disabled __initdata;     /* skip ACPI PCI scan and IRQ initialization */
  int acpi_ht __initdata = 1;   /* enable HT */
  
@@@ -82,7 -82,6 +82,7 @@@ EXPORT_SYMBOL(acpi_strict)
  acpi_interrupt_flags acpi_sci_flags __initdata;
  int acpi_sci_override_gsi __initdata;
  int acpi_skip_timer_override __initdata;
 +int acpi_use_timer_override __initdata;
  
  #ifdef CONFIG_X86_LOCAL_APIC
  static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
@@@ -333,7 -332,7 +333,7 @@@ acpi_parse_ioapic(acpi_table_entry_head
  /*
   * Parse Interrupt Source Override for the ACPI SCI
   */
 -static void acpi_sci_ioapic_setup(u32 bus_irq, u32 gsi, u16 polarity, u16 trigger)
 +static void acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger)
  {
        if (trigger == 0)       /* compatible SCI trigger is level */
                trigger = 3;
         * If GSI is < 16, this will update its flags,
         * else it will create a new mp_irqs[] entry.
         */
 -      mp_override_legacy_irq(bus_irq, polarity, trigger, gsi);
 +      mp_override_legacy_irq(gsi, polarity, trigger, gsi);
  
        /*
         * stash over-ride to indicate we've been here
         * and for later update of acpi_fadt
         */
 -      acpi_sci_override_gsi = bus_irq;
 +      acpi_sci_override_gsi = gsi;
        return;
  }
  
@@@ -377,7 -376,7 +377,7 @@@ acpi_parse_int_src_ovr(acpi_table_entry
        acpi_table_print_madt_entry(header);
  
        if (intsrc->bus_irq == acpi_fadt.sci_int) {
 -              acpi_sci_ioapic_setup(intsrc->bus_irq, intsrc->global_irq,
 +              acpi_sci_ioapic_setup(intsrc->global_irq,
                                      intsrc->flags.polarity,
                                      intsrc->flags.trigger);
                return 0;
@@@ -880,7 -879,7 +880,7 @@@ static int __init acpi_parse_madt_ioapi
         * pretend we got one so we can set the SCI flags.
         */
        if (!acpi_sci_override_gsi)
 -              acpi_sci_ioapic_setup(acpi_fadt.sci_int, acpi_fadt.sci_int, 0, 0);
 +              acpi_sci_ioapic_setup(acpi_fadt.sci_int, 0, 0);
  
        /* Fill in identity legacy mapings where no override */
        mp_config_acpi_legacy_irqs();
@@@ -1301,13 -1300,6 +1301,13 @@@ static int __init parse_acpi_skip_timer
        return 0;
  }
  early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override);
 +
 +static int __init parse_acpi_use_timer_override(char *arg)
 +{
 +      acpi_use_timer_override = 1;
 +      return 0;
 +}
 +early_param("acpi_use_timer_override", parse_acpi_use_timer_override);
  #endif /* CONFIG_X86_IO_APIC */
  
  static int __init setup_acpi_sci(char *s)
        return 0;
  }
  early_param("acpi_sci", setup_acpi_sci);
+ int __acpi_acquire_global_lock(unsigned int *lock)
+ {
+       unsigned int old, new, val;
+       do {
+               old = *lock;
+               new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
+               val = cmpxchg(lock, old, new);
+       } while (unlikely (val != old));
+       return (new < 3) ? -1 : 0;
+ }
+ int __acpi_release_global_lock(unsigned int *lock)
+ {
+       unsigned int old, new, val;
+       do {
+               old = *lock;
+               new = old & ~0x3;
+               val = cmpxchg(lock, old, new);
+       } while (unlikely (val != old));
+       return old & 0x1;
+ }
@@@ -1,10 -1,9 +1,10 @@@
  /*
 - * acpi-cpufreq.c - ACPI Processor P-States Driver ($Revision: 1.3 $)
 + * acpi-cpufreq.c - ACPI Processor P-States Driver ($Revision: 1.4 $)
   *
   *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
   *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   *  Copyright (C) 2002 - 2004 Dominik Brodowski <linux@brodo.de>
 + *  Copyright (C) 2006       Denis Sadykov <denis.m.sadykov@intel.com>
   *
   * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   *
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/init.h>
 +#include <linux/smp.h>
 +#include <linux/sched.h>
  #include <linux/cpufreq.h>
 -#include <linux/proc_fs.h>
 -#include <linux/seq_file.h>
  #include <linux/compiler.h>
 -#include <linux/sched.h>      /* current */
  #include <linux/dmi.h>
 -#include <asm/io.h>
 -#include <asm/delay.h>
 -#include <asm/uaccess.h>
  
  #include <linux/acpi.h>
  #include <acpi/processor.h>
  
 +#include <asm/io.h>
 +#include <asm/msr.h>
 +#include <asm/processor.h>
 +#include <asm/cpufeature.h>
 +#include <asm/delay.h>
 +#include <asm/uaccess.h>
 +
  #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "acpi-cpufreq", msg)
  
  MODULE_AUTHOR("Paul Diefenbaugh, Dominik Brodowski");
  MODULE_DESCRIPTION("ACPI Processor P-States Driver");
  MODULE_LICENSE("GPL");
  
 +enum {
 +      UNDEFINED_CAPABLE = 0,
 +      SYSTEM_INTEL_MSR_CAPABLE,
 +      SYSTEM_IO_CAPABLE,
 +};
 +
 +#define INTEL_MSR_RANGE               (0xffff)
 +#define CPUID_6_ECX_APERFMPERF_CAPABILITY     (0x1)
  
 -struct cpufreq_acpi_io {
 -      struct acpi_processor_performance       *acpi_data;
 -      struct cpufreq_frequency_table          *freq_table;
 -      unsigned int                            resume;
 +struct acpi_cpufreq_data {
 +      struct acpi_processor_performance *acpi_data;
 +      struct cpufreq_frequency_table *freq_table;
 +      unsigned int max_freq;
 +      unsigned int resume;
 +      unsigned int cpu_feature;
  };
  
 -static struct cpufreq_acpi_io *acpi_io_data[NR_CPUS];
 -static struct acpi_processor_performance      *acpi_perf_data[NR_CPUS];
 +static struct acpi_cpufreq_data *drv_data[NR_CPUS];
 +static struct acpi_processor_performance *acpi_perf_data[NR_CPUS];
  
  static struct cpufreq_driver acpi_cpufreq_driver;
  
  static unsigned int acpi_pstate_strict;
  
 -static int
 -acpi_processor_write_port(
 -      u16     port,
 -      u8      bit_width,
 -      u32     value)
 +static int check_est_cpu(unsigned int cpuid)
 +{
 +      struct cpuinfo_x86 *cpu = &cpu_data[cpuid];
 +
 +      if (cpu->x86_vendor != X86_VENDOR_INTEL ||
 +          !cpu_has(cpu, X86_FEATURE_EST))
 +              return 0;
 +
 +      return 1;
 +}
 +
 +static unsigned extract_io(u32 value, struct acpi_cpufreq_data *data)
 +{
 +      struct acpi_processor_performance *perf;
 +      int i;
 +
 +      perf = data->acpi_data;
 +
 +      for (i=0; i<perf->state_count; i++) {
 +              if (value == perf->states[i].status)
 +                      return data->freq_table[i].frequency;
 +      }
 +      return 0;
 +}
 +
 +static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
  {
 -      if (bit_width <= 8) {
 +      int i;
 +      struct acpi_processor_performance *perf;
 +
 +      msr &= INTEL_MSR_RANGE;
 +      perf = data->acpi_data;
 +
 +      for (i=0; data->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
 +              if (msr == perf->states[data->freq_table[i].index].status)
 +                      return data->freq_table[i].frequency;
 +      }
 +      return data->freq_table[0].frequency;
 +}
 +
 +static unsigned extract_freq(u32 val, struct acpi_cpufreq_data *data)
 +{
 +      switch (data->cpu_feature) {
 +      case SYSTEM_INTEL_MSR_CAPABLE:
 +              return extract_msr(val, data);
 +      case SYSTEM_IO_CAPABLE:
 +              return extract_io(val, data);
 +      default:
 +              return 0;
 +      }
 +}
 +
 +static void wrport(u16 port, u8 bit_width, u32 value)
 +{
 +      if (bit_width <= 8)
                outb(value, port);
 -      } else if (bit_width <= 16) {
 +      else if (bit_width <= 16)
                outw(value, port);
 -      } else if (bit_width <= 32) {
 +      else if (bit_width <= 32)
                outl(value, port);
 -      } else {
 -              return -ENODEV;
 -      }
 -      return 0;
  }
  
 -static int
 -acpi_processor_read_port(
 -      u16     port,
 -      u8      bit_width,
 -      u32     *ret)
 +static void rdport(u16 port, u8 bit_width, u32 * ret)
  {
        *ret = 0;
 -      if (bit_width <= 8) {
 +      if (bit_width <= 8)
                *ret = inb(port);
 -      } else if (bit_width <= 16) {
 +      else if (bit_width <= 16)
                *ret = inw(port);
 -      } else if (bit_width <= 32) {
 +      else if (bit_width <= 32)
                *ret = inl(port);
 -      } else {
 -              return -ENODEV;
 +}
 +
 +struct msr_addr {
 +      u32 reg;
 +};
 +
 +struct io_addr {
 +      u16 port;
 +      u8 bit_width;
 +};
 +
 +typedef union {
 +      struct msr_addr msr;
 +      struct io_addr io;
 +} drv_addr_union;
 +
 +struct drv_cmd {
 +      unsigned int type;
 +      cpumask_t mask;
 +      drv_addr_union addr;
 +      u32 val;
 +};
 +
 +static void do_drv_read(struct drv_cmd *cmd)
 +{
 +      u32 h;
 +
 +      switch (cmd->type) {
 +      case SYSTEM_INTEL_MSR_CAPABLE:
 +              rdmsr(cmd->addr.msr.reg, cmd->val, h);
 +              break;
 +      case SYSTEM_IO_CAPABLE:
 +              rdport(cmd->addr.io.port, cmd->addr.io.bit_width, &cmd->val);
 +              break;
 +      default:
 +              break;
        }
 -      return 0;
  }
  
 -static int
 -acpi_processor_set_performance (
 -      struct cpufreq_acpi_io  *data,
 -      unsigned int            cpu,
 -      int                     state)
 +static void do_drv_write(struct drv_cmd *cmd)
  {
 -      u16                     port = 0;
 -      u8                      bit_width = 0;
 -      int                     i = 0;
 -      int                     ret = 0;
 -      u32                     value = 0;
 -      int                     retval;
 -      struct acpi_processor_performance       *perf;
 -
 -      dprintk("acpi_processor_set_performance\n");
 -
 -      retval = 0;
 -      perf = data->acpi_data; 
 -      if (state == perf->state) {
 -              if (unlikely(data->resume)) {
 -                      dprintk("Called after resume, resetting to P%d\n", state);
 -                      data->resume = 0;
 -              } else {
 -                      dprintk("Already at target state (P%d)\n", state);
 -                      return (retval);
 -              }
 +      u32 h = 0;
 +
 +      switch (cmd->type) {
 +      case SYSTEM_INTEL_MSR_CAPABLE:
 +              wrmsr(cmd->addr.msr.reg, cmd->val, h);
 +              break;
 +      case SYSTEM_IO_CAPABLE:
 +              wrport(cmd->addr.io.port, cmd->addr.io.bit_width, cmd->val);
 +              break;
 +      default:
 +              break;
        }
 +}
  
 -      dprintk("Transitioning from P%d to P%d\n", perf->state, state);
 +static void drv_read(struct drv_cmd *cmd)
 +{
 +      cpumask_t saved_mask = current->cpus_allowed;
 +      cmd->val = 0;
  
 -      /*
 -       * First we write the target state's 'control' value to the
 -       * control_register.
 -       */
 +      set_cpus_allowed(current, cmd->mask);
 +      do_drv_read(cmd);
 +      set_cpus_allowed(current, saved_mask);
 +}
 +
 +static void drv_write(struct drv_cmd *cmd)
 +{
 +      cpumask_t saved_mask = current->cpus_allowed;
 +      unsigned int i;
 +
 +      for_each_cpu_mask(i, cmd->mask) {
 +              set_cpus_allowed(current, cpumask_of_cpu(i));
 +              do_drv_write(cmd);
 +      }
 +
 +      set_cpus_allowed(current, saved_mask);
 +      return;
 +}
 +
 +static u32 get_cur_val(cpumask_t mask)
 +{
 +      struct acpi_processor_performance *perf;
 +      struct drv_cmd cmd;
 +
 +      if (unlikely(cpus_empty(mask)))
 +              return 0;
 +
 +      switch (drv_data[first_cpu(mask)]->cpu_feature) {
 +      case SYSTEM_INTEL_MSR_CAPABLE:
 +              cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
 +              cmd.addr.msr.reg = MSR_IA32_PERF_STATUS;
 +              break;
 +      case SYSTEM_IO_CAPABLE:
 +              cmd.type = SYSTEM_IO_CAPABLE;
 +              perf = drv_data[first_cpu(mask)]->acpi_data;
 +              cmd.addr.io.port = perf->control_register.address;
 +              cmd.addr.io.bit_width = perf->control_register.bit_width;
 +              break;
 +      default:
 +              return 0;
 +      }
 +
 +      cmd.mask = mask;
  
 -      port = perf->control_register.address;
 -      bit_width = perf->control_register.bit_width;
 -      value = (u32) perf->states[state].control;
 +      drv_read(&cmd);
  
 -      dprintk("Writing 0x%08x to port 0x%04x\n", value, port);
 +      dprintk("get_cur_val = %u\n", cmd.val);
  
 -      ret = acpi_processor_write_port(port, bit_width, value);
 -      if (ret) {
 -              dprintk("Invalid port width 0x%04x\n", bit_width);
 -              return (ret);
 +      return cmd.val;
 +}
 +
 +/*
 + * Return the measured active (C0) frequency on this CPU since last call
 + * to this function.
 + * Input: cpu number
 + * Return: Average CPU frequency in terms of max frequency (zero on error)
 + *
 + * We use IA32_MPERF and IA32_APERF MSRs to get the measured performance
 + * over a period of time, while CPU is in C0 state.
 + * IA32_MPERF counts at the rate of max advertised frequency
 + * IA32_APERF counts at the rate of actual CPU frequency
 + * Only IA32_APERF/IA32_MPERF ratio is architecturally defined and
 + * no meaning should be associated with absolute values of these MSRs.
 + */
 +static unsigned int get_measured_perf(unsigned int cpu)
 +{
 +      union {
 +              struct {
 +                      u32 lo;
 +                      u32 hi;
 +              } split;
 +              u64 whole;
 +      } aperf_cur, mperf_cur;
 +
 +      cpumask_t saved_mask;
 +      unsigned int perf_percent;
 +      unsigned int retval;
 +
 +      saved_mask = current->cpus_allowed;
 +      set_cpus_allowed(current, cpumask_of_cpu(cpu));
 +      if (get_cpu() != cpu) {
 +              /* We were not able to run on requested processor */
 +              put_cpu();
 +              return 0;
        }
  
 +      rdmsr(MSR_IA32_APERF, aperf_cur.split.lo, aperf_cur.split.hi);
 +      rdmsr(MSR_IA32_MPERF, mperf_cur.split.lo, mperf_cur.split.hi);
 +
 +      wrmsr(MSR_IA32_APERF, 0,0);
 +      wrmsr(MSR_IA32_MPERF, 0,0);
 +
 +#ifdef __i386__
        /*
 -       * Assume the write went through when acpi_pstate_strict is not used.
 -       * As read status_register is an expensive operation and there 
 -       * are no specific error cases where an IO port write will fail.
 +       * We dont want to do 64 bit divide with 32 bit kernel
 +       * Get an approximate value. Return failure in case we cannot get
 +       * an approximate value.
         */
 -      if (acpi_pstate_strict) {
 -              /* Then we read the 'status_register' and compare the value 
 -               * with the target state's 'status' to make sure the 
 -               * transition was successful.
 -               * Note that we'll poll for up to 1ms (100 cycles of 10us) 
 -               * before giving up.
 -               */
 -
 -              port = perf->status_register.address;
 -              bit_width = perf->status_register.bit_width;
 -
 -              dprintk("Looking for 0x%08x from port 0x%04x\n",
 -                      (u32) perf->states[state].status, port);
 -
 -              for (i = 0; i < 100; i++) {
 -                      ret = acpi_processor_read_port(port, bit_width, &value);
 -                      if (ret) {      
 -                              dprintk("Invalid port width 0x%04x\n", bit_width);
 -                              return (ret);
 -                      }
 -                      if (value == (u32) perf->states[state].status)
 -                              break;
 -                      udelay(10);
 -              }
 -      } else {
 -              value = (u32) perf->states[state].status;
 +      if (unlikely(aperf_cur.split.hi || mperf_cur.split.hi)) {
 +              int shift_count;
 +              u32 h;
 +
 +              h = max_t(u32, aperf_cur.split.hi, mperf_cur.split.hi);
 +              shift_count = fls(h);
 +
 +              aperf_cur.whole >>= shift_count;
 +              mperf_cur.whole >>= shift_count;
 +      }
 +
 +      if (((unsigned long)(-1) / 100) < aperf_cur.split.lo) {
 +              int shift_count = 7;
 +              aperf_cur.split.lo >>= shift_count;
 +              mperf_cur.split.lo >>= shift_count;
        }
  
 -      if (unlikely(value != (u32) perf->states[state].status)) {
 -              printk(KERN_WARNING "acpi-cpufreq: Transition failed\n");
 -              retval = -ENODEV;
 -              return (retval);
 +      if (aperf_cur.split.lo && mperf_cur.split.lo)
 +              perf_percent = (aperf_cur.split.lo * 100) / mperf_cur.split.lo;
 +      else
 +              perf_percent = 0;
 +
 +#else
 +      if (unlikely(((unsigned long)(-1) / 100) < aperf_cur.whole)) {
 +              int shift_count = 7;
 +              aperf_cur.whole >>= shift_count;
 +              mperf_cur.whole >>= shift_count;
        }
  
 -      dprintk("Transition successful after %d microseconds\n", i * 10);
 +      if (aperf_cur.whole && mperf_cur.whole)
 +              perf_percent = (aperf_cur.whole * 100) / mperf_cur.whole;
 +      else
 +              perf_percent = 0;
 +
 +#endif
 +
 +      retval = drv_data[cpu]->max_freq * perf_percent / 100;
 +
 +      put_cpu();
 +      set_cpus_allowed(current, saved_mask);
  
 -      perf->state = state;
 -      return (retval);
 +      dprintk("cpu %d: performance percent %d\n", cpu, perf_percent);
 +      return retval;
  }
  
 +static unsigned int get_cur_freq_on_cpu(unsigned int cpu)
 +{
 +      struct acpi_cpufreq_data *data = drv_data[cpu];
 +      unsigned int freq;
 +
 +      dprintk("get_cur_freq_on_cpu (%d)\n", cpu);
  
 -static int
 -acpi_cpufreq_target (
 -      struct cpufreq_policy   *policy,
 -      unsigned int target_freq,
 -      unsigned int relation)
 +      if (unlikely(data == NULL ||
 +                   data->acpi_data == NULL || data->freq_table == NULL)) {
 +              return 0;
 +      }
 +
 +      freq = extract_freq(get_cur_val(cpumask_of_cpu(cpu)), data);
 +      dprintk("cur freq = %u\n", freq);
 +
 +      return freq;
 +}
 +
 +static unsigned int check_freqs(cpumask_t mask, unsigned int freq,
 +                              struct acpi_cpufreq_data *data)
  {
 -      struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
 +      unsigned int cur_freq;
 +      unsigned int i;
 +
 +      for (i=0; i<100; i++) {
 +              cur_freq = extract_freq(get_cur_val(mask), data);
 +              if (cur_freq == freq)
 +                      return 1;
 +              udelay(10);
 +      }
 +      return 0;
 +}
 +
 +static int acpi_cpufreq_target(struct cpufreq_policy *policy,
 +                             unsigned int target_freq, unsigned int relation)
 +{
 +      struct acpi_cpufreq_data *data = drv_data[policy->cpu];
        struct acpi_processor_performance *perf;
        struct cpufreq_freqs freqs;
        cpumask_t online_policy_cpus;
 -      cpumask_t saved_mask;
 -      cpumask_t set_mask;
 -      cpumask_t covered_cpus;
 -      unsigned int cur_state = 0;
 +      struct drv_cmd cmd;
 +      unsigned int msr;
        unsigned int next_state = 0;
 -      unsigned int result = 0;
 -      unsigned int j;
 -      unsigned int tmp;
 +      unsigned int next_perf_state = 0;
 +      unsigned int i;
 +      int result = 0;
  
 -      dprintk("acpi_cpufreq_setpolicy\n");
 +      dprintk("acpi_cpufreq_target %d (%d)\n", target_freq, policy->cpu);
  
 -      result = cpufreq_frequency_table_target(policy,
 -                      data->freq_table,
 -                      target_freq,
 -                      relation,
 -                      &next_state);
 -      if (unlikely(result))
 -              return (result);
 +      if (unlikely(data == NULL ||
 +           data->acpi_data == NULL || data->freq_table == NULL)) {
 +              return -ENODEV;
 +      }
  
        perf = data->acpi_data;
 -      cur_state = perf->state;
 -      freqs.old = data->freq_table[cur_state].frequency;
 -      freqs.new = data->freq_table[next_state].frequency;
 +      result = cpufreq_frequency_table_target(policy,
 +                                              data->freq_table,
 +                                              target_freq,
 +                                              relation, &next_state);
 +      if (unlikely(result))
 +              return -ENODEV;
  
  #ifdef CONFIG_HOTPLUG_CPU
        /* cpufreq holds the hotplug lock, so we are safe from here on */
        online_policy_cpus = policy->cpus;
  #endif
  
 -      for_each_cpu_mask(j, online_policy_cpus) {
 -              freqs.cpu = j;
 -              cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
 +      next_perf_state = data->freq_table[next_state].index;
 +      if (perf->state == next_perf_state) {
 +              if (unlikely(data->resume)) {
 +                      dprintk("Called after resume, resetting to P%d\n",
 +                              next_perf_state);
 +                      data->resume = 0;
 +              } else {
 +                      dprintk("Already at target state (P%d)\n",
 +                              next_perf_state);
 +                      return 0;
 +              }
        }
  
 -      /*
 -       * We need to call driver->target() on all or any CPU in
 -       * policy->cpus, depending on policy->shared_type.
 -       */
 -      saved_mask = current->cpus_allowed;
 -      cpus_clear(covered_cpus);
 -      for_each_cpu_mask(j, online_policy_cpus) {
 -              /*
 -               * Support for SMP systems.
 -               * Make sure we are running on CPU that wants to change freq
 -               */
 -              cpus_clear(set_mask);
 -              if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
 -                      cpus_or(set_mask, set_mask, online_policy_cpus);
 -              else
 -                      cpu_set(j, set_mask);
 -
 -              set_cpus_allowed(current, set_mask);
 -              if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) {
 -                      dprintk("couldn't limit to CPUs in this domain\n");
 -                      result = -EAGAIN;
 -                      break;
 -              }
 +      switch (data->cpu_feature) {
 +      case SYSTEM_INTEL_MSR_CAPABLE:
 +              cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
 +              cmd.addr.msr.reg = MSR_IA32_PERF_CTL;
 +              msr =
 +                  (u32) perf->states[next_perf_state].
 +                  control & INTEL_MSR_RANGE;
 +              cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr;
 +              break;
 +      case SYSTEM_IO_CAPABLE:
 +              cmd.type = SYSTEM_IO_CAPABLE;
 +              cmd.addr.io.port = perf->control_register.address;
 +              cmd.addr.io.bit_width = perf->control_register.bit_width;
 +              cmd.val = (u32) perf->states[next_perf_state].control;
 +              break;
 +      default:
 +              return -ENODEV;
 +      }
  
 -              result = acpi_processor_set_performance (data, j, next_state);
 -              if (result) {
 -                      result = -EAGAIN;
 -                      break;
 -              }
 +      cpus_clear(cmd.mask);
  
 -              if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
 -                      break;
 - 
 -              cpu_set(j, covered_cpus);
 -      }
 +      if (policy->shared_type != CPUFREQ_SHARED_TYPE_ANY)
 +              cmd.mask = online_policy_cpus;
 +      else
 +              cpu_set(policy->cpu, cmd.mask);
  
 -      for_each_cpu_mask(j, online_policy_cpus) {
 -              freqs.cpu = j;
 -              cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 +      freqs.old = data->freq_table[perf->state].frequency;
 +      freqs.new = data->freq_table[next_perf_state].frequency;
 +      for_each_cpu_mask(i, cmd.mask) {
 +              freqs.cpu = i;
 +              cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
        }
  
 -      if (unlikely(result)) {
 -              /*
 -               * We have failed halfway through the frequency change.
 -               * We have sent callbacks to online_policy_cpus and
 -               * acpi_processor_set_performance() has been called on 
 -               * coverd_cpus. Best effort undo..
 -               */
 -
 -              if (!cpus_empty(covered_cpus)) {
 -                      for_each_cpu_mask(j, covered_cpus) {
 -                              policy->cpu = j;
 -                              acpi_processor_set_performance (data, 
 -                                              j, 
 -                                              cur_state);
 -                      }
 -              }
 +      drv_write(&cmd);
  
 -              tmp = freqs.new;
 -              freqs.new = freqs.old;
 -              freqs.old = tmp;
 -              for_each_cpu_mask(j, online_policy_cpus) {
 -                      freqs.cpu = j;
 -                      cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
 -                      cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 +      if (acpi_pstate_strict) {
 +              if (!check_freqs(cmd.mask, freqs.new, data)) {
 +                      dprintk("acpi_cpufreq_target failed (%d)\n",
 +                              policy->cpu);
 +                      return -EAGAIN;
                }
        }
  
 -      set_cpus_allowed(current, saved_mask);
 -      return (result);
 -}
 +      for_each_cpu_mask(i, cmd.mask) {
 +              freqs.cpu = i;
 +              cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 +      }
 +      perf->state = next_perf_state;
  
 +      return result;
 +}
  
 -static int
 -acpi_cpufreq_verify (
 -      struct cpufreq_policy   *policy)
 +static int acpi_cpufreq_verify(struct cpufreq_policy *policy)
  {
 -      unsigned int result = 0;
 -      struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
 +      struct acpi_cpufreq_data *data = drv_data[policy->cpu];
  
        dprintk("acpi_cpufreq_verify\n");
  
 -      result = cpufreq_frequency_table_verify(policy, 
 -                      data->freq_table);
 -
 -      return (result);
 +      return cpufreq_frequency_table_verify(policy, data->freq_table);
  }
  
 -
  static unsigned long
 -acpi_cpufreq_guess_freq (
 -      struct cpufreq_acpi_io  *data,
 -      unsigned int            cpu)
 +acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu)
  {
 -      struct acpi_processor_performance       *perf = data->acpi_data;
 +      struct acpi_processor_performance *perf = data->acpi_data;
  
        if (cpu_khz) {
                /* search the closest match to cpu_khz */
                unsigned long freq;
                unsigned long freqn = perf->states[0].core_frequency * 1000;
  
 -              for (i = 0; i < (perf->state_count - 1); i++) {
 +              for (i=0; i<(perf->state_count-1); i++) {
                        freq = freqn;
                        freqn = perf->states[i+1].core_frequency * 1000;
                        if ((2 * cpu_khz) > (freqn + freq)) {
                                perf->state = i;
 -                              return (freq);
 +                              return freq;
                        }
                }
 -              perf->state = perf->state_count - 1;
 -              return (freqn);
 +              perf->state = perf->state_count-1;
 +              return freqn;
        } else {
                /* assume CPU is at P0... */
                perf->state = 0;
        }
  }
  
 -
  /*
   * acpi_cpufreq_early_init - initialize ACPI P-States library
   *
   * do _PDC and _PSD and find out the processor dependency for the
   * actual init that will happen later...
   */
 -static int acpi_cpufreq_early_init_acpi(void)
 +static int acpi_cpufreq_early_init(void)
  {
 -      struct acpi_processor_performance       *data;
 -      unsigned int                            i, j;
 +      struct acpi_processor_performance *data;
 +      cpumask_t covered;
 +      unsigned int i, j;
  
        dprintk("acpi_cpufreq_early_init\n");
  
        for_each_possible_cpu(i) {
 -              data = kzalloc(sizeof(struct acpi_processor_performance), 
 -                      GFP_KERNEL);
 +              data = kzalloc(sizeof(struct acpi_processor_performance),
 +                             GFP_KERNEL);
                if (!data) {
 -                      for_each_possible_cpu(j) {
 +                      for_each_cpu_mask(j, covered) {
                                kfree(acpi_perf_data[j]);
                                acpi_perf_data[j] = NULL;
                        }
 -                      return (-ENOMEM);
 +                      return -ENOMEM;
                }
                acpi_perf_data[i] = data;
 +              cpu_set(i, covered);
        }
  
        /* Do initialization in ACPI core */
 -      return acpi_processor_preregister_performance(acpi_perf_data);
 +      acpi_processor_preregister_performance(acpi_perf_data);
 +      return 0;
  }
  
 +#ifdef CONFIG_SMP
  /*
   * Some BIOSes do SW_ANY coordination internally, either set it up in hw
   * or do it in BIOS firmware and won't inform about it to OS. If not
@@@ -569,6 -402,7 +569,7 @@@ static int sw_any_bug_found(struct dmi_
        return 0;
  }
  
+ #ifdef CONFIG_SMP
  static struct dmi_system_id sw_any_bug_dmi_table[] = {
        {
                .callback = sw_any_bug_found,
  };
  #endif
  
 -static int
 -acpi_cpufreq_cpu_init (
 -      struct cpufreq_policy   *policy)
 +static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
  {
 -      unsigned int            i;
 -      unsigned int            cpu = policy->cpu;
 -      struct cpufreq_acpi_io  *data;
 -      unsigned int            result = 0;
 +      unsigned int i;
 +      unsigned int valid_states = 0;
 +      unsigned int cpu = policy->cpu;
 +      struct acpi_cpufreq_data *data;
 +      unsigned int result = 0;
        struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
 -      struct acpi_processor_performance       *perf;
 +      struct acpi_processor_performance *perf;
  
        dprintk("acpi_cpufreq_cpu_init\n");
  
        if (!acpi_perf_data[cpu])
 -              return (-ENODEV);
 +              return -ENODEV;
  
 -      data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
 +      data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL);
        if (!data)
 -              return (-ENOMEM);
 +              return -ENOMEM;
  
        data->acpi_data = acpi_perf_data[cpu];
 -      acpi_io_data[cpu] = data;
 +      drv_data[cpu] = data;
  
 -      result = acpi_processor_register_performance(data->acpi_data, cpu);
 +      if (cpu_has(c, X86_FEATURE_CONSTANT_TSC))
 +              acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS;
  
 +      result = acpi_processor_register_performance(data->acpi_data, cpu);
        if (result)
                goto err_free;
  
        perf = data->acpi_data;
        policy->shared_type = perf->shared_type;
 +
        /*
 -       * Will let policy->cpus know about dependency only when software 
 +       * Will let policy->cpus know about dependency only when software
         * coordination is required.
         */
        if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL ||
        }
  #endif
  
 -      if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) {
 -              acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS;
 -      }
 -
        /* capability check */
        if (perf->state_count <= 1) {
                dprintk("No P-States\n");
                goto err_unreg;
        }
  
 -      if ((perf->control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) ||
 -          (perf->status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) {
 -              dprintk("Unsupported address space [%d, %d]\n",
 -                      (u32) (perf->control_register.space_id),
 -                      (u32) (perf->status_register.space_id));
 +      if (perf->control_register.space_id != perf->status_register.space_id) {
 +              result = -ENODEV;
 +              goto err_unreg;
 +      }
 +
 +      switch (perf->control_register.space_id) {
 +      case ACPI_ADR_SPACE_SYSTEM_IO:
 +              dprintk("SYSTEM IO addr space\n");
 +              data->cpu_feature = SYSTEM_IO_CAPABLE;
 +              break;
 +      case ACPI_ADR_SPACE_FIXED_HARDWARE:
 +              dprintk("HARDWARE addr space\n");
 +              if (!check_est_cpu(cpu)) {
 +                      result = -ENODEV;
 +                      goto err_unreg;
 +              }
 +              data->cpu_feature = SYSTEM_INTEL_MSR_CAPABLE;
 +              break;
 +      default:
 +              dprintk("Unknown addr space %d\n",
 +                      (u32) (perf->control_register.space_id));
                result = -ENODEV;
                goto err_unreg;
        }
  
 -      /* alloc freq_table */
 -      data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * (perf->state_count + 1), GFP_KERNEL);
 +      data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) *
 +                  (perf->state_count+1), GFP_KERNEL);
        if (!data->freq_table) {
                result = -ENOMEM;
                goto err_unreg;
        /* detect transition latency */
        policy->cpuinfo.transition_latency = 0;
        for (i=0; i<perf->state_count; i++) {
 -              if ((perf->states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency)
 -                      policy->cpuinfo.transition_latency = perf->states[i].transition_latency * 1000;
 +              if ((perf->states[i].transition_latency * 1000) >
 +                  policy->cpuinfo.transition_latency)
 +                      policy->cpuinfo.transition_latency =
 +                          perf->states[i].transition_latency * 1000;
        }
        policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
  
 -      /* The current speed is unknown and not detectable by ACPI...  */
 -      policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
 -
 +      data->max_freq = perf->states[0].core_frequency * 1000;
        /* table init */
 -      for (i=0; i<=perf->state_count; i++)
 -      {
 -              data->freq_table[i].index = i;
 -              if (i<perf->state_count)
 -                      data->freq_table[i].frequency = perf->states[i].core_frequency * 1000;
 -              else
 -                      data->freq_table[i].frequency = CPUFREQ_TABLE_END;
 +      for (i=0; i<perf->state_count; i++) {
 +              if (i>0 && perf->states[i].core_frequency ==
 +                  perf->states[i-1].core_frequency)
 +                      continue;
 +
 +              data->freq_table[valid_states].index = i;
 +              data->freq_table[valid_states].frequency =
 +                  perf->states[i].core_frequency * 1000;
 +              valid_states++;
        }
 +      data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END;
  
        result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table);
 -      if (result) {
 +      if (result)
                goto err_freqfree;
 +
 +      switch (data->cpu_feature) {
 +      case ACPI_ADR_SPACE_SYSTEM_IO:
 +              /* Current speed is unknown and not detectable by IO port */
 +              policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
 +              break;
 +      case ACPI_ADR_SPACE_FIXED_HARDWARE:
 +              acpi_cpufreq_driver.get = get_cur_freq_on_cpu;
 +              get_cur_freq_on_cpu(cpu);
 +              break;
 +      default:
 +              break;
        }
  
        /* notify BIOS that we exist */
        acpi_processor_notify_smm(THIS_MODULE);
  
 -      printk(KERN_INFO "acpi-cpufreq: CPU%u - ACPI performance management activated.\n",
 -             cpu);
 +      /* Check for APERF/MPERF support in hardware */
 +      if (c->x86_vendor == X86_VENDOR_INTEL && c->cpuid_level >= 6) {
 +              unsigned int ecx;
 +              ecx = cpuid_ecx(6);
 +              if (ecx & CPUID_6_ECX_APERFMPERF_CAPABILITY)
 +                      acpi_cpufreq_driver.getavg = get_measured_perf;
 +      }
 +
 +      dprintk("CPU%u - ACPI performance management activated.\n", cpu);
        for (i = 0; i < perf->state_count; i++)
                dprintk("     %cP%d: %d MHz, %d mW, %d uS\n",
 -                      (i == perf->state?'*':' '), i,
 +                      (i == perf->state ? '*' : ' '), i,
                        (u32) perf->states[i].core_frequency,
                        (u32) perf->states[i].power,
                        (u32) perf->states[i].transition_latency);
  
        cpufreq_frequency_table_get_attr(data->freq_table, policy->cpu);
 -      
 +
        /*
         * the first call to ->target() should result in us actually
         * writing something to the appropriate registers.
         */
        data->resume = 1;
 -      
 -      return (result);
  
 - err_freqfree:
 +      return result;
 +
 +err_freqfree:
        kfree(data->freq_table);
 - err_unreg:
 +err_unreg:
        acpi_processor_unregister_performance(perf, cpu);
 - err_free:
 +err_free:
        kfree(data);
 -      acpi_io_data[cpu] = NULL;
 +      drv_data[cpu] = NULL;
  
 -      return (result);
 +      return result;
  }
  
 -
 -static int
 -acpi_cpufreq_cpu_exit (
 -      struct cpufreq_policy   *policy)
 +static int acpi_cpufreq_cpu_exit(struct cpufreq_policy *policy)
  {
 -      struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
 -
 +      struct acpi_cpufreq_data *data = drv_data[policy->cpu];
  
        dprintk("acpi_cpufreq_cpu_exit\n");
  
        if (data) {
                cpufreq_frequency_table_put_attr(policy->cpu);
 -              acpi_io_data[policy->cpu] = NULL;
 -              acpi_processor_unregister_performance(data->acpi_data, policy->cpu);
 +              drv_data[policy->cpu] = NULL;
 +              acpi_processor_unregister_performance(data->acpi_data,
 +                                                    policy->cpu);
                kfree(data);
        }
  
 -      return (0);
 +      return 0;
  }
  
 -static int
 -acpi_cpufreq_resume (
 -      struct cpufreq_policy   *policy)
 +static int acpi_cpufreq_resume(struct cpufreq_policy *policy)
  {
 -      struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
 -
 +      struct acpi_cpufreq_data *data = drv_data[policy->cpu];
  
        dprintk("acpi_cpufreq_resume\n");
  
        data->resume = 1;
  
 -      return (0);
 +      return 0;
  }
  
 -
 -static struct freq_attr* acpi_cpufreq_attr[] = {
 +static struct freq_attr *acpi_cpufreq_attr[] = {
        &cpufreq_freq_attr_scaling_available_freqs,
        NULL,
  };
  
  static struct cpufreq_driver acpi_cpufreq_driver = {
 -      .verify = acpi_cpufreq_verify,
 -      .target = acpi_cpufreq_target,
 -      .init   = acpi_cpufreq_cpu_init,
 -      .exit   = acpi_cpufreq_cpu_exit,
 -      .resume = acpi_cpufreq_resume,
 -      .name   = "acpi-cpufreq",
 -      .owner  = THIS_MODULE,
 -      .attr   = acpi_cpufreq_attr,
 +      .verify = acpi_cpufreq_verify,
 +      .target = acpi_cpufreq_target,
 +      .init = acpi_cpufreq_cpu_init,
 +      .exit = acpi_cpufreq_cpu_exit,
 +      .resume = acpi_cpufreq_resume,
 +      .name = "acpi-cpufreq",
 +      .owner = THIS_MODULE,
 +      .attr = acpi_cpufreq_attr,
  };
  
 -
 -static int __init
 -acpi_cpufreq_init (void)
 +static int __init acpi_cpufreq_init(void)
  {
        dprintk("acpi_cpufreq_init\n");
  
 -      acpi_cpufreq_early_init_acpi();
 +      acpi_cpufreq_early_init();
  
        return cpufreq_register_driver(&acpi_cpufreq_driver);
  }
  
 -
 -static void __exit
 -acpi_cpufreq_exit (void)
 +static void __exit acpi_cpufreq_exit(void)
  {
 -      unsigned int    i;
 +      unsigned int i;
        dprintk("acpi_cpufreq_exit\n");
  
        cpufreq_unregister_driver(&acpi_cpufreq_driver);
  }
  
  module_param(acpi_pstate_strict, uint, 0644);
 -MODULE_PARM_DESC(acpi_pstate_strict, "value 0 or non-zero. non-zero -> strict ACPI checks are performed during frequency changes.");
 +MODULE_PARM_DESC(acpi_pstate_strict,
 +      "value 0 or non-zero. non-zero -> strict ACPI checks are "
 +      "performed during frequency changes.");
  
  late_initcall(acpi_cpufreq_init);
  module_exit(acpi_cpufreq_exit);
diff --combined drivers/acpi/ec.c
@@@ -45,34 -45,35 +45,34 @@@ ACPI_MODULE_NAME("acpi_ec"
  #define ACPI_EC_DRIVER_NAME           "ACPI Embedded Controller Driver"
  #define ACPI_EC_DEVICE_NAME           "Embedded Controller"
  #define ACPI_EC_FILE_INFO             "info"
 -
 +#undef PREFIX
 +#define PREFIX                                "ACPI: EC: "
  /* EC status register */
  #define ACPI_EC_FLAG_OBF      0x01    /* Output buffer full */
  #define ACPI_EC_FLAG_IBF      0x02    /* Input buffer full */
  #define ACPI_EC_FLAG_BURST    0x10    /* burst mode */
  #define ACPI_EC_FLAG_SCI      0x20    /* EC-SCI occurred */
 -
  /* EC commands */
 -#define ACPI_EC_COMMAND_READ  0x80
 -#define ACPI_EC_COMMAND_WRITE 0x81
 -#define ACPI_EC_BURST_ENABLE  0x82
 -#define ACPI_EC_BURST_DISABLE 0x83
 -#define ACPI_EC_COMMAND_QUERY 0x84
 -
 +enum ec_command {
 +      ACPI_EC_COMMAND_READ = 0x80,
 +      ACPI_EC_COMMAND_WRITE = 0x81,
 +      ACPI_EC_BURST_ENABLE = 0x82,
 +      ACPI_EC_BURST_DISABLE = 0x83,
 +      ACPI_EC_COMMAND_QUERY = 0x84,
 +};
  /* EC events */
 -enum {
 +enum ec_event {
        ACPI_EC_EVENT_OBF_1 = 1,        /* Output buffer full */
 -      ACPI_EC_EVENT_IBF_0,            /* Input buffer empty */
 +      ACPI_EC_EVENT_IBF_0,    /* Input buffer empty */
  };
  
 -#define ACPI_EC_DELAY         50      /* Wait 50ms max. during EC ops */
 +#define ACPI_EC_DELAY         500     /* Wait 500ms max. during EC ops */
  #define ACPI_EC_UDELAY_GLK    1000    /* Wait 1ms max. to get global lock */
 -#define ACPI_EC_UDELAY         100    /* Poll @ 100us increments */
 -#define ACPI_EC_UDELAY_COUNT   1000   /* Wait 10ms max. during EC ops */
  
 -enum {
 -      EC_INTR = 1,    /* Output buffer full */
 -      EC_POLL,        /* Input buffer empty */
 -};
 +static enum ec_mode {
 +      EC_INTR = 1,            /* Output buffer full */
 +      EC_POLL,                /* Input buffer empty */
 +} acpi_ec_mode = EC_INTR;
  
  static int acpi_ec_remove(struct acpi_device *device, int type);
  static int acpi_ec_start(struct acpi_device *device);
@@@ -95,18 -96,19 +95,18 @@@ static struct acpi_driver acpi_ec_drive
  struct acpi_ec {
        acpi_handle handle;
        unsigned long uid;
 -      unsigned long gpe_bit;
 +      unsigned long gpe;
        unsigned long command_addr;
        unsigned long data_addr;
        unsigned long global_lock;
 -      struct semaphore sem;
 -      unsigned int expect_event;
 +      struct mutex lock;
 +      atomic_t query_pending;
        atomic_t leaving_burst; /* 0 : No, 1 : Yes, 2: abort */
        wait_queue_head_t wait;
  } *ec_ecdt;
  
  /* External interfaces use first EC only, so remember */
  static struct acpi_device *first_ec;
 -static int acpi_ec_mode = EC_INTR;
  
  /* --------------------------------------------------------------------------
                               Transaction Management
@@@ -132,41 -134,54 +132,41 @@@ static inline void acpi_ec_write_data(s
        outb(data, ec->data_addr);
  }
  
 -static int acpi_ec_check_status(u8 status, u8 event)
 +static inline int acpi_ec_check_status(struct acpi_ec *ec, enum ec_event event)
  {
 -      switch (event) {
 -      case ACPI_EC_EVENT_OBF_1:
 +      u8 status = acpi_ec_read_status(ec);
 +
 +      if (event == ACPI_EC_EVENT_OBF_1) {
                if (status & ACPI_EC_FLAG_OBF)
                        return 1;
 -              break;
 -      case ACPI_EC_EVENT_IBF_0:
 +      } else if (event == ACPI_EC_EVENT_IBF_0) {
                if (!(status & ACPI_EC_FLAG_IBF))
                        return 1;
 -              break;
 -      default:
 -              break;
        }
  
        return 0;
  }
  
 -static int acpi_ec_wait(struct acpi_ec *ec, u8 event)
 +static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event)
  {
 -      int i = (acpi_ec_mode == EC_POLL) ? ACPI_EC_UDELAY_COUNT : 0;
 -      long time_left;
 -
 -      ec->expect_event = event;
 -      if (acpi_ec_check_status(acpi_ec_read_status(ec), event)) {
 -              ec->expect_event = 0;
 -              return 0;
 -      }
 -
 -      do {
 -              if (acpi_ec_mode == EC_POLL) {
 -                      udelay(ACPI_EC_UDELAY);
 -              } else {
 -                      time_left = wait_event_timeout(ec->wait,
 -                                  !ec->expect_event,
 -                                  msecs_to_jiffies(ACPI_EC_DELAY));
 -                      if (time_left > 0) {
 -                              ec->expect_event = 0;
 +      if (acpi_ec_mode == EC_POLL) {
 +              unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
 +              while (time_before(jiffies, delay)) {
 +                      if (acpi_ec_check_status(ec, event))
                                return 0;
 -                      }
                }
 -              if (acpi_ec_check_status(acpi_ec_read_status(ec), event)) {
 -                      ec->expect_event = 0;
 +      } else {
 +              if (wait_event_timeout(ec->wait,
 +                                     acpi_ec_check_status(ec, event),
 +                                     msecs_to_jiffies(ACPI_EC_DELAY)) ||
 +                  acpi_ec_check_status(ec, event)) {
                        return 0;
 +              } else {
 +                      printk(KERN_ERR PREFIX "acpi_ec_wait timeout,"
 +                             " status = %d, expect_event = %d\n",
 +                             acpi_ec_read_status(ec), event);
                }
 -      } while (--i > 0);
 -
 -      ec->expect_event = 0;
 +      }
  
        return -ETIME;
  }
@@@ -181,6 -196,7 +181,6 @@@ int acpi_ec_enter_burst_mode(struct acp
        u8 tmp = 0;
        u8 status = 0;
  
 -
        status = acpi_ec_read_status(ec);
        if (status != -EINVAL && !(status & ACPI_EC_FLAG_BURST)) {
                status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0);
  
        atomic_set(&ec->leaving_burst, 0);
        return 0;
 -  end:
 +      end:
        ACPI_EXCEPTION((AE_INFO, status, "EC wait, burst mode"));
        return -1;
  }
@@@ -205,68 -221,58 +205,68 @@@ int acpi_ec_leave_burst_mode(struct acp
  {
        u8 status = 0;
  
 -
        status = acpi_ec_read_status(ec);
 -      if (status != -EINVAL && (status & ACPI_EC_FLAG_BURST)){
 +      if (status != -EINVAL && (status & ACPI_EC_FLAG_BURST)) {
                status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0);
 -              if(status)
 +              if (status)
                        goto end;
                acpi_ec_write_cmd(ec, ACPI_EC_BURST_DISABLE);
                acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0);
        }
        atomic_set(&ec->leaving_burst, 1);
        return 0;
 -  end:
 +      end:
        ACPI_EXCEPTION((AE_INFO, status, "EC leave burst mode"));
        return -1;
  }
 -#endif /* ACPI_FUTURE_USAGE */
 +#endif                                /* ACPI_FUTURE_USAGE */
  
  static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command,
 -                                      const u8 *wdata, unsigned wdata_len,
 -                                      u8 *rdata, unsigned rdata_len)
 +                                      const u8 * wdata, unsigned wdata_len,
 +                                      u8 * rdata, unsigned rdata_len)
  {
 -      int result;
 +      int result = 0;
  
        acpi_ec_write_cmd(ec, command);
  
 -      for (; wdata_len > 0; wdata_len --) {
 +      for (; wdata_len > 0; --wdata_len) {
                result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0);
 -              if (result)
 -                      return result;
 +              if (result) {
 +                      printk(KERN_ERR PREFIX
 +                             "write_cmd timeout, command = %d\n", command);
 +                      goto end;
 +              }
                acpi_ec_write_data(ec, *(wdata++));
        }
  
 -      if (command == ACPI_EC_COMMAND_WRITE) {
 +      if (!rdata_len) {
                result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0);
 -              if (result)
 -                      return result;
 +              if (result) {
 +                      printk(KERN_ERR PREFIX
 +                             "finish-write timeout, command = %d\n", command);
 +                      goto end;
 +              }
 +      } else if (command == ACPI_EC_COMMAND_QUERY) {
 +              atomic_set(&ec->query_pending, 0);
        }
  
 -      for (; rdata_len > 0; rdata_len --) {
 +      for (; rdata_len > 0; --rdata_len) {
                result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF_1);
 -              if (result)
 -                      return result;
 +              if (result) {
 +                      printk(KERN_ERR PREFIX "read timeout, command = %d\n",
 +                             command);
 +                      goto end;
 +              }
  
                *(rdata++) = acpi_ec_read_data(ec);
        }
 -
 -      return 0;
 +      end:
 +      return result;
  }
  
  static int acpi_ec_transaction(struct acpi_ec *ec, u8 command,
 -                              const u8 *wdata, unsigned wdata_len,
 -                              u8 *rdata, unsigned rdata_len)
 +                             const u8 * wdata, unsigned wdata_len,
 +                             u8 * rdata, unsigned rdata_len)
  {
        int status;
        u32 glk;
        if (!ec || (wdata_len && !wdata) || (rdata_len && !rdata))
                return -EINVAL;
  
 -        if (rdata)
 -                memset(rdata, 0, rdata_len);
 +      if (rdata)
 +              memset(rdata, 0, rdata_len);
  
 +      mutex_lock(&ec->lock);
        if (ec->global_lock) {
                status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
                if (ACPI_FAILURE(status))
                        return -ENODEV;
        }
 -      down(&ec->sem);
 +
 +      /* Make sure GPE is enabled before doing transaction */
 +      acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
  
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0);
        if (status) {
 -              printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
 +              printk(KERN_DEBUG PREFIX
 +                     "input buffer is not empty, aborting transaction\n");
                goto end;
        }
  
 -        status = acpi_ec_transaction_unlocked(ec, command,
 -                                              wdata, wdata_len,
 -                                              rdata, rdata_len);
 +      status = acpi_ec_transaction_unlocked(ec, command,
 +                                            wdata, wdata_len,
 +                                            rdata, rdata_len);
  
 -end:
 -      up(&ec->sem);
 +      end:
  
        if (ec->global_lock)
                acpi_release_global_lock(glk);
 +      mutex_unlock(&ec->lock);
  
        return status;
  }
  
 -static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data)
 +static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
  {
        int result;
        u8 d;
  
  static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
  {
 -        u8 wdata[2] = { address, data };
 -        return acpi_ec_transaction(ec, ACPI_EC_COMMAND_WRITE,
 +      u8 wdata[2] = { address, data };
 +      return acpi_ec_transaction(ec, ACPI_EC_COMMAND_WRITE,
                                   wdata, 2, NULL, 0);
  }
  
  /*
   * Externally callable EC access functions. For now, assume 1 EC only
   */
 -int ec_read(u8 addr, u8 *val)
 +int ec_read(u8 addr, u8 * val)
  {
        struct acpi_ec *ec;
        int err;
@@@ -367,9 -369,9 +367,9 @@@ int ec_write(u8 addr, u8 val
  
  EXPORT_SYMBOL(ec_write);
  
extern int ec_transaction(u8 command,
+ int ec_transaction(u8 command,
 -                          const u8 *wdata, unsigned wdata_len,
 -                          u8 *rdata, unsigned rdata_len)
 +                        const u8 * wdata, unsigned wdata_len,
 +                        u8 * rdata, unsigned rdata_len)
  {
        struct acpi_ec *ec;
  
  
  EXPORT_SYMBOL(ec_transaction);
  
 -static int acpi_ec_query(struct acpi_ec *ec, u8 *data)
 +static int acpi_ec_query(struct acpi_ec *ec, u8 * data)
  {
        int result;
 -        u8 d;
 +      u8 d;
  
 -        if (!ec || !data)
 -                return -EINVAL;
 +      if (!ec || !data)
 +              return -EINVAL;
  
 -        /*
 -         * Query the EC to find out which _Qxx method we need to evaluate.
 -         * Note that successful completion of the query causes the ACPI_EC_SCI
 -         * bit to be cleared (and thus clearing the interrupt source).
 -         */
 +      /*
 +       * Query the EC to find out which _Qxx method we need to evaluate.
 +       * Note that successful completion of the query causes the ACPI_EC_SCI
 +       * bit to be cleared (and thus clearing the interrupt source).
 +       */
  
 -        result = acpi_ec_transaction(ec, ACPI_EC_COMMAND_QUERY, NULL, 0, &d, 1);
 -        if (result)
 -                return result;
 +      result = acpi_ec_transaction(ec, ACPI_EC_COMMAND_QUERY, NULL, 0, &d, 1);
 +      if (result)
 +              return result;
  
 -        if (!d)
 -                return -ENODATA;
 +      if (!d)
 +              return -ENODATA;
  
 -        *data = d;
 -        return 0;
 +      *data = d;
 +      return 0;
  }
  
  /* --------------------------------------------------------------------------
                                  Event Management
     -------------------------------------------------------------------------- */
  
 -struct acpi_ec_query_data {
 -      acpi_handle handle;
 -      u8 data;
 -};
 -
  static void acpi_ec_gpe_query(void *ec_cxt)
  {
        struct acpi_ec *ec = (struct acpi_ec *)ec_cxt;
        u8 value = 0;
 -      static char object_name[8];
 +      char object_name[8];
  
 -      if (!ec)
 -              goto end;
 -
 -      value = acpi_ec_read_status(ec);
 -
 -      if (!(value & ACPI_EC_FLAG_SCI))
 -              goto end;
 -
 -      if (acpi_ec_query(ec, &value))
 -              goto end;
 +      if (!ec || acpi_ec_query(ec, &value))
 +              return;
  
        snprintf(object_name, 8, "_Q%2.2X", value);
  
 -      ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s", object_name));
 +      printk(KERN_INFO PREFIX "evaluating %s\n", object_name);
  
        acpi_evaluate_object(ec->handle, object_name, NULL, NULL);
 -
 -      end:
 -      acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
  }
  
  static u32 acpi_ec_gpe_handler(void *data)
        u8 value;
        struct acpi_ec *ec = (struct acpi_ec *)data;
  
 -      acpi_clear_gpe(NULL, ec->gpe_bit, ACPI_ISR);
 -      value = acpi_ec_read_status(ec);
 -
        if (acpi_ec_mode == EC_INTR) {
 -              if (acpi_ec_check_status(value, ec->expect_event)) {
 -                      ec->expect_event = 0;
 -                      wake_up(&ec->wait);
 -              }
 +              wake_up(&ec->wait);
        }
  
 -      if (value & ACPI_EC_FLAG_SCI) {
 -              status = acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, ec);
 -              return status == AE_OK ?
 -                  ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
 +      value = acpi_ec_read_status(ec);
 +      if ((value & ACPI_EC_FLAG_SCI) && !atomic_read(&ec->query_pending)) {
 +              atomic_set(&ec->query_pending, 1);
 +              status =
 +                  acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query,
 +                                  ec);
        }
 -      acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_ISR);
 +
        return status == AE_OK ?
            ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
  }
@@@ -482,6 -504,7 +482,6 @@@ acpi_ec_space_handler(u32 function
        acpi_integer f_v = 0;
        int i = 0;
  
 -
        if ((address > 0xFF) || !value || !handler_context)
                return AE_BAD_PARAMETER;
  
        switch (function) {
        case ACPI_READ:
                temp = 0;
 -              result = acpi_ec_read(ec, (u8) address, (u8 *) &temp);
 +              result = acpi_ec_read(ec, (u8) address, (u8 *) & temp);
                break;
        case ACPI_WRITE:
                result = acpi_ec_write(ec, (u8) address, (u8) temp);
@@@ -548,15 -571,18 +548,15 @@@ static int acpi_ec_read_info(struct seq
  {
        struct acpi_ec *ec = (struct acpi_ec *)seq->private;
  
 -
        if (!ec)
                goto end;
  
 -      seq_printf(seq, "gpe bit:                 0x%02x\n",
 -                 (u32) ec->gpe_bit);
 +      seq_printf(seq, "gpe:                 0x%02x\n", (u32) ec->gpe);
        seq_printf(seq, "ports:                   0x%02x, 0x%02x\n",
 -                 (u32) ec->command_addr,
 -                 (u32) ec->data_addr);
 +                 (u32) ec->command_addr, (u32) ec->data_addr);
        seq_printf(seq, "use global lock:         %s\n",
                   ec->global_lock ? "yes" : "no");
 -      acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
 +      acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
  
        end:
        return 0;
@@@ -579,6 -605,7 +579,6 @@@ static int acpi_ec_add_fs(struct acpi_d
  {
        struct proc_dir_entry *entry = NULL;
  
 -
        if (!acpi_device_dir(device)) {
                acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
                                                     acpi_ec_dir);
@@@ -621,6 -648,7 +621,6 @@@ static int acpi_ec_add(struct acpi_devi
        acpi_status status = AE_OK;
        struct acpi_ec *ec = NULL;
  
 -
        if (!device)
                return -EINVAL;
  
  
        ec->handle = device->handle;
        ec->uid = -1;
 -      init_MUTEX(&ec->sem);
 +      mutex_init(&ec->lock);
 +      atomic_set(&ec->query_pending, 0);
        if (acpi_ec_mode == EC_INTR) {
                atomic_set(&ec->leaving_burst, 1);
                init_waitqueue_head(&ec->wait);
        acpi_driver_data(device) = ec;
  
        /* Use the global lock for all EC transactions? */
 -      acpi_evaluate_integer(ec->handle, "_GLK", NULL,
 -                            &ec->global_lock);
 +      acpi_evaluate_integer(ec->handle, "_GLK", NULL, &ec->global_lock);
  
        /* XXX we don't test uids, because on some boxes ecdt uid = 0, see:
           http://bugzilla.kernel.org/show_bug.cgi?id=6111 */
                                                  ACPI_ADR_SPACE_EC,
                                                  &acpi_ec_space_handler);
  
 -              acpi_remove_gpe_handler(NULL, ec_ecdt->gpe_bit,
 +              acpi_remove_gpe_handler(NULL, ec_ecdt->gpe,
                                        &acpi_ec_gpe_handler);
  
                kfree(ec_ecdt);
  
        /* Get GPE bit assignment (EC events). */
        /* TODO: Add support for _GPE returning a package */
 -      status =
 -          acpi_evaluate_integer(ec->handle, "_GPE", NULL,
 -                                &ec->gpe_bit);
 +      status = acpi_evaluate_integer(ec->handle, "_GPE", NULL, &ec->gpe);
        if (ACPI_FAILURE(status)) {
 -              ACPI_EXCEPTION((AE_INFO, status, "Obtaining GPE bit assignment"));
 +              ACPI_EXCEPTION((AE_INFO, status,
 +                              "Obtaining GPE bit assignment"));
                result = -ENODEV;
                goto end;
        }
                goto end;
  
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s [%s] (gpe %d) interrupt mode.",
 -             acpi_device_name(device), acpi_device_bid(device),
 -             (u32) ec->gpe_bit));
 +                        acpi_device_name(device), acpi_device_bid(device),
 +                        (u32) ec->gpe));
  
        if (!first_ec)
                first_ec = device;
  
 -  end:
 +      end:
        if (result)
                kfree(ec);
  
@@@ -689,6 -718,7 +689,6 @@@ static int acpi_ec_remove(struct acpi_d
  {
        struct acpi_ec *ec = NULL;
  
 -
        if (!device)
                return -EINVAL;
  
@@@ -731,6 -761,7 +731,6 @@@ static int acpi_ec_start(struct acpi_de
        acpi_status status = AE_OK;
        struct acpi_ec *ec = NULL;
  
 -
        if (!device)
                return -EINVAL;
  
        }
  
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "gpe=0x%02lx, ports=0x%2lx,0x%2lx",
 -                        ec->gpe_bit, ec->command_addr, ec->data_addr));
 +                        ec->gpe, ec->command_addr, ec->data_addr));
  
        /*
         * Install GPE handler
         */
 -      status = acpi_install_gpe_handler(NULL, ec->gpe_bit,
 +      status = acpi_install_gpe_handler(NULL, ec->gpe,
                                          ACPI_GPE_EDGE_TRIGGERED,
                                          &acpi_ec_gpe_handler, ec);
        if (ACPI_FAILURE(status)) {
                return -ENODEV;
        }
 -      acpi_set_gpe_type(NULL, ec->gpe_bit, ACPI_GPE_TYPE_RUNTIME);
 -      acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
 +      acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME);
 +      acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
  
        status = acpi_install_address_space_handler(ec->handle,
                                                    ACPI_ADR_SPACE_EC,
                                                    &acpi_ec_space_handler,
                                                    &acpi_ec_space_setup, ec);
        if (ACPI_FAILURE(status)) {
 -              acpi_remove_gpe_handler(NULL, ec->gpe_bit,
 -                                      &acpi_ec_gpe_handler);
 +              acpi_remove_gpe_handler(NULL, ec->gpe, &acpi_ec_gpe_handler);
                return -ENODEV;
        }
  
@@@ -782,6 -814,7 +782,6 @@@ static int acpi_ec_stop(struct acpi_dev
        acpi_status status = AE_OK;
        struct acpi_ec *ec = NULL;
  
 -
        if (!device)
                return -EINVAL;
  
        if (ACPI_FAILURE(status))
                return -ENODEV;
  
 -      status =
 -          acpi_remove_gpe_handler(NULL, ec->gpe_bit,
 -                                  &acpi_ec_gpe_handler);
 +      status = acpi_remove_gpe_handler(NULL, ec->gpe, &acpi_ec_gpe_handler);
        if (ACPI_FAILURE(status))
                return -ENODEV;
  
@@@ -806,7 -841,7 +806,7 @@@ acpi_fake_ecdt_callback(acpi_handle han
  {
        acpi_status status;
  
 -      init_MUTEX(&ec_ecdt->sem);
 +      mutex_init(&ec_ecdt->lock);
        if (acpi_ec_mode == EC_INTR) {
                init_waitqueue_head(&ec_ecdt->wait);
        }
        ec_ecdt->uid = -1;
        acpi_evaluate_integer(handle, "_UID", NULL, &ec_ecdt->uid);
  
 -      status =
 -          acpi_evaluate_integer(handle, "_GPE", NULL,
 -                                &ec_ecdt->gpe_bit);
 +      status = acpi_evaluate_integer(handle, "_GPE", NULL, &ec_ecdt->gpe);
        if (ACPI_FAILURE(status))
                return status;
        ec_ecdt->global_lock = TRUE;
        ec_ecdt->handle = handle;
  
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "GPE=0x%02lx, ports=0x%2lx, 0x%2lx",
 -             ec_ecdt->gpe_bit, ec_ecdt->command_addr, ec_ecdt->data_addr));
 +                        ec_ecdt->gpe, ec_ecdt->command_addr,
 +                        ec_ecdt->data_addr));
  
        return AE_CTRL_TERMINATE;
  }
@@@ -865,7 -901,7 +865,7 @@@ static int __init acpi_ec_fake_ecdt(voi
                goto error;
        }
        return 0;
 -  error:
 +      error:
        return ret;
  }
  
@@@ -890,24 -926,25 +890,24 @@@ static int __init acpi_ec_get_real_ecdt
                return -ENOMEM;
        memset(ec_ecdt, 0, sizeof(struct acpi_ec));
  
 -      init_MUTEX(&ec_ecdt->sem);
 +      mutex_init(&ec_ecdt->lock);
        if (acpi_ec_mode == EC_INTR) {
                init_waitqueue_head(&ec_ecdt->wait);
        }
        ec_ecdt->command_addr = ecdt_ptr->ec_control.address;
        ec_ecdt->data_addr = ecdt_ptr->ec_data.address;
 -      ec_ecdt->gpe_bit = ecdt_ptr->gpe_bit;
 +      ec_ecdt->gpe = ecdt_ptr->gpe_bit;
        /* use the GL just to be safe */
        ec_ecdt->global_lock = TRUE;
        ec_ecdt->uid = ecdt_ptr->uid;
  
 -      status =
 -          acpi_get_handle(NULL, ecdt_ptr->ec_id, &ec_ecdt->handle);
 +      status = acpi_get_handle(NULL, ecdt_ptr->ec_id, &ec_ecdt->handle);
        if (ACPI_FAILURE(status)) {
                goto error;
        }
  
        return 0;
 -  error:
 +      error:
        ACPI_EXCEPTION((AE_INFO, status, "Could not use ECDT"));
        kfree(ec_ecdt);
        ec_ecdt = NULL;
@@@ -933,14 -970,14 +933,14 @@@ int __init acpi_ec_ecdt_probe(void
        /*
         * Install GPE handler
         */
 -      status = acpi_install_gpe_handler(NULL, ec_ecdt->gpe_bit,
 +      status = acpi_install_gpe_handler(NULL, ec_ecdt->gpe,
                                          ACPI_GPE_EDGE_TRIGGERED,
                                          &acpi_ec_gpe_handler, ec_ecdt);
        if (ACPI_FAILURE(status)) {
                goto error;
        }
 -      acpi_set_gpe_type(NULL, ec_ecdt->gpe_bit, ACPI_GPE_TYPE_RUNTIME);
 -      acpi_enable_gpe(NULL, ec_ecdt->gpe_bit, ACPI_NOT_ISR);
 +      acpi_set_gpe_type(NULL, ec_ecdt->gpe, ACPI_GPE_TYPE_RUNTIME);
 +      acpi_enable_gpe(NULL, ec_ecdt->gpe, ACPI_NOT_ISR);
  
        status = acpi_install_address_space_handler(ACPI_ROOT_OBJECT,
                                                    ACPI_ADR_SPACE_EC,
                                                    &acpi_ec_space_setup,
                                                    ec_ecdt);
        if (ACPI_FAILURE(status)) {
 -              acpi_remove_gpe_handler(NULL, ec_ecdt->gpe_bit,
 +              acpi_remove_gpe_handler(NULL, ec_ecdt->gpe,
                                        &acpi_ec_gpe_handler);
                goto error;
        }
@@@ -967,6 -1004,7 +967,6 @@@ static int __init acpi_ec_init(void
  {
        int result = 0;
  
 -
        if (acpi_disabled)
                return 0;
  
@@@ -1019,8 -1057,7 +1019,8 @@@ static int __init acpi_ec_set_intr_mode
                acpi_ec_mode = EC_POLL;
        }
        acpi_ec_driver.ops.add = acpi_ec_add;
 -      ACPI_DEBUG_PRINT((ACPI_DB_INFO, "EC %s mode.\n", intr ? "interrupt" : "polling"));
 +      ACPI_DEBUG_PRINT((ACPI_DB_INFO, "EC %s mode.\n",
 +                        intr ? "interrupt" : "polling"));
  
        return 1;
  }
diff --combined drivers/acpi/glue.c
@@@ -189,8 -189,12 +189,12 @@@ find_pci_rootbridge(acpi_handle handle
        bus = tmp;
  
        if (seg == find->seg && bus == find->bus)
+       {
                find->handle = handle;
-       status = AE_OK;
+               status = AE_CTRL_TERMINATE;
+       }
+       else
+               status = AE_OK;
        exit:
        kfree(buffer.pointer);
        return status;
@@@ -267,9 -271,9 +271,9 @@@ static int acpi_bind_one(struct device 
  {
        acpi_status status;
  
 -      if (dev->firmware_data) {
 +      if (dev->archdata.acpi_handle) {
                printk(KERN_WARNING PREFIX
 -                     "Drivers changed 'firmware_data' for %s\n", dev->bus_id);
 +                     "Drivers changed 'acpi_handle' for %s\n", dev->bus_id);
                return -EINVAL;
        }
        get_device(dev);
                put_device(dev);
                return -EINVAL;
        }
 -      dev->firmware_data = handle;
 +      dev->archdata.acpi_handle = handle;
  
        return 0;
  }
  
  static int acpi_unbind_one(struct device *dev)
  {
 -      if (!dev->firmware_data)
 +      if (!dev->archdata.acpi_handle)
                return 0;
 -      if (dev == acpi_get_physical_device(dev->firmware_data)) {
 +      if (dev == acpi_get_physical_device(dev->archdata.acpi_handle)) {
                /* acpi_get_physical_device increase refcnt by one */
                put_device(dev);
 -              acpi_detach_data(dev->firmware_data, acpi_glue_data_handler);
 -              dev->firmware_data = NULL;
 +              acpi_detach_data(dev->archdata.acpi_handle,
 +                               acpi_glue_data_handler);
 +              dev->archdata.acpi_handle = NULL;
                /* acpi_bind_one increase refcnt by one */
                put_device(dev);
        } else {
                printk(KERN_ERR PREFIX
 -                     "Oops, 'firmware_data' corrupt for %s\n", dev->bus_id);
 +                     "Oops, 'acpi_handle' corrupt for %s\n", dev->bus_id);
        }
        return 0;
  }
@@@ -329,8 -332,7 +333,8 @@@ static int acpi_platform_notify(struct 
        if (!ret) {
                struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
  
 -              acpi_get_name(dev->firmware_data, ACPI_FULL_PATHNAME, &buffer);
 +              acpi_get_name(dev->archdata.acpi_handle,
 +                            ACPI_FULL_PATHNAME, &buffer);
                DBG("Device %s -> %s\n", dev->bus_id, (char *)buffer.pointer);
                kfree(buffer.pointer);
        } else
diff --combined include/asm-i386/acpi.h
  #define ACPI_ENABLE_IRQS()  local_irq_enable()
  #define ACPI_FLUSH_CPU_CACHE()        wbinvd()
  
- static inline int
- __acpi_acquire_global_lock (unsigned int *lock)
- {
-       unsigned int old, new, val;
-       do {
-               old = *lock;
-               new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
-               val = cmpxchg(lock, old, new);
-       } while (unlikely (val != old));
-       return (new < 3) ? -1 : 0;
- }
- static inline int
- __acpi_release_global_lock (unsigned int *lock)
- {
-       unsigned int old, new, val;
-       do {
-               old = *lock;
-               new = old & ~0x3;
-               val = cmpxchg(lock, old, new);
-       } while (unlikely (val != old));
-       return old & 0x1;
- }
+ int __acpi_acquire_global_lock(unsigned int *lock);
+ int __acpi_release_global_lock(unsigned int *lock);
  
  #define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
        ((Acq) = __acpi_acquire_global_lock((unsigned int *) GLptr))
@@@ -132,7 -110,6 +110,7 @@@ extern int acpi_gsi_to_irq(u32 gsi, uns
  
  #ifdef CONFIG_X86_IO_APIC
  extern int acpi_skip_timer_override;
 +extern int acpi_use_timer_override;
  #endif
  
  static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
  #define ACPI_ENABLE_IRQS()  local_irq_enable()
  #define ACPI_FLUSH_CPU_CACHE()        wbinvd()
  
- static inline int
- __acpi_acquire_global_lock (unsigned int *lock)
- {
-       unsigned int old, new, val;
-       do {
-               old = *lock;
-               new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
-               val = cmpxchg(lock, old, new);
-       } while (unlikely (val != old));
-       return (new < 3) ? -1 : 0;
- }
- static inline int
- __acpi_release_global_lock (unsigned int *lock)
- {
-       unsigned int old, new, val;
-       do {
-               old = *lock;
-               new = old & ~0x3;
-               val = cmpxchg(lock, old, new);
-       } while (unlikely (val != old));
-       return old & 0x1;
- }
+ int __acpi_acquire_global_lock(unsigned int *lock);
+ int __acpi_release_global_lock(unsigned int *lock);
  
  #define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
        ((Acq) = __acpi_acquire_global_lock((unsigned int *) GLptr))
@@@ -163,7 -141,6 +141,7 @@@ extern u8 x86_acpiid_to_apicid[]
  #define ARCH_HAS_POWER_INIT 1
  
  extern int acpi_skip_timer_override;
 +extern int acpi_use_timer_override;
  
  #endif /*__KERNEL__*/