Merge tag 'mfd-3.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 May 2012 18:53:11 +0000 (11:53 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 May 2012 18:53:11 +0000 (11:53 -0700)
Pull MFD changes from Samuel Ortiz:
 "Besides the usual cleanups, this one brings:

   * Support for 5 new chipsets: Intel's ICH LPC and SCH Centerton,
     ST-E's STAX211, Samsung's MAX77693 and TI's LM3533.

   * Device tree support for the twl6040, tps65910, da9502 and ab8500
     drivers.

   * Fairly big tps56910, ab8500 and db8500 updates.

   * i2c support for mc13xxx.

   * Our regular update for the wm8xxx driver from Mark."

Fix up various conflicts with other trees, largely due to ab5500 removal
etc.

* tag 'mfd-3.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6: (106 commits)
  mfd: Fix build break of max77693 by adding REGMAP_I2C option
  mfd: Fix twl6040 build failure
  mfd: Fix max77693 build failure
  mfd: ab8500-core should depend on MFD_DB8500_PRCMU
  gpio: tps65910: dt: process gpio specific device node info
  mfd: Remove the parsing of dt info for tps65910 gpio
  mfd: Save device node parsed platform data for tps65910 sub devices
  mfd: Add r_select to lm3533 platform data
  gpio: Add Intel Centerton support to gpio-sch
  mfd: Emulate active low IRQs as well as active high IRQs for wm831x
  mfd: Mark two lm3533 zone registers as volatile
  mfd: Fix return type of lm533 attribute is_visible
  mfd: Enable Device Tree support in the ab8500-pwm driver
  mfd: Enable Device Tree support in the ab8500-sysctrl driver
  mfd: Add support for Device Tree to twl6040
  mfd: Register the twl6040 child for the ASoC codec unconditionally
  mfd: Allocate twl6040 IRQ numbers dynamically
  mfd: twl6040 code cleanup in interrupt initialization part
  mfd: Enable ab8500-gpadc driver for Device Tree
  mfd: Prevent unassigned pointer from being used in ab8500-gpadc driver
  ...

18 files changed:
1  2 
MAINTAINERS
arch/arm/mach-ux500/board-mop500.c
drivers/gpio/Kconfig
drivers/gpio/Makefile
drivers/mfd/Kconfig
drivers/mfd/Makefile
drivers/mfd/da9052-core.c
drivers/mfd/mc13xxx-core.c
drivers/mfd/tps65090.c
drivers/regulator/anatop-regulator.c
drivers/regulator/tps65910-regulator.c
drivers/regulator/wm831x-dcdc.c
drivers/regulator/wm831x-isink.c
drivers/regulator/wm831x-ldo.c
drivers/watchdog/Kconfig
include/linux/mfd/asic3.h
include/linux/mfd/da9052/da9052.h
include/linux/mfd/wm8994/core.h

diff --combined MAINTAINERS
@@@ -640,6 -640,13 +640,6 @@@ S:        Maintaine
  F:    drivers/amba/
  F:    include/linux/amba/bus.h
  
 -ARM/ADI ROADRUNNER MACHINE SUPPORT
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-ixp23xx/
 -F:    arch/arm/mach-ixp23xx/include/mach/
 -
  ARM/ADS SPHERE MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -739,10 -746,7 +739,10 @@@ M:       Barry Song <baohua.song@csr.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-prima2/
 -F:    drivers/dma/sirf-dma*
 +F:    drivers/dma/sirf-dma.c
 +F:    drivers/i2c/busses/i2c-sirf.c
 +F:    drivers/pinctrl/pinctrl-sirf.c
 +F:    drivers/spi/spi-sirf.c
  
  ARM/EBSA110 MACHINE SUPPORT
  M:    Russell King <linux@arm.linux.org.uk>
@@@ -855,11 -859,21 +855,11 @@@ M:      Dan Williams <dan.j.williams@intel.c
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
 -ARM/INTEL IXP2000 ARM ARCHITECTURE
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/INTEL IXDP2850 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
 -ARM/INTEL IXP23XX ARM ARCHITECTURE
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/INTEL IXP4XX ARM ARCHITECTURE
  M:    Imre Kaloz <kaloz@openwrt.org>
  M:    Krzysztof Halasa <khc@pm.waw.pl>
@@@ -894,12 -908,11 +894,12 @@@ ARM/MAGICIAN MACHINE SUPPOR
  M:    Philipp Zabel <philipp.zabel@gmail.com>
  S:    Maintained
  
 -ARM/Marvell Loki/Kirkwood/MV78xx0/Orion SOC support
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -M:    Nicolas Pitre <nico@fluxnic.net>
 +ARM/Marvell Dove/Kirkwood/MV78xx0/Orion SOC support
 +M:    Jason Cooper <jason@lakedaemon.net>
 +M:    Andrew Lunn <andrew@lunn.ch>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Odd Fixes
 +S:    Maintained
 +F:    arch/arm/mach-dove/
  F:    arch/arm/mach-kirkwood/
  F:    arch/arm/mach-mv78xx0/
  F:    arch/arm/mach-orion5x/
@@@ -1318,21 -1331,6 +1318,21 @@@ M:    Nicolas Ferre <nicolas.ferre@atmel.c
  S:    Supported
  F:    drivers/tty/serial/atmel_serial.c
  
 +ATMEL DMA DRIVER
 +M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Supported
 +F:    drivers/dma/at_hdmac.c
 +F:    drivers/dma/at_hdmac_regs.h
 +F:    arch/arm/mach-at91/include/mach/at_hdmac.h
 +
 +ATMEL ISI DRIVER
 +M:    Josh Wu <josh.wu@atmel.com>
 +L:    linux-media@vger.kernel.org
 +S:    Supported
 +F:    drivers/media/video/atmel-isi.c
 +F:    include/media/atmel-isi.h
 +
  ATMEL LCDFB DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
  L:    linux-fbdev@vger.kernel.org
@@@ -1350,22 -1348,10 +1350,22 @@@ M:   Nicolas Ferre <nicolas.ferre@atmel.c
  S:    Supported
  F:    drivers/spi/spi-atmel.*
  
 +ATMEL Timer Counter (TC) AND CLOCKSOURCE DRIVERS
 +M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Supported
 +F:    drivers/misc/atmel_tclib.c
 +F:    drivers/clocksource/tcb_clksrc.c
 +
 +ATMEL TSADCC DRIVER
 +M:    Josh Wu <josh.wu@atmel.com>
 +L:    linux-input@vger.kernel.org
 +S:    Supported
 +F:    drivers/input/touchscreen/atmel_tsadcc.c
 +
  ATMEL USBA UDC DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -W:    http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver
  S:    Supported
  F:    drivers/usb/gadget/atmel_usba_udc.*
  
@@@ -1445,7 -1431,6 +1445,7 @@@ F:      include/linux/backlight.
  BATMAN ADVANCED
  M:    Marek Lindner <lindner_marek@yahoo.de>
  M:    Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
 +M:    Antonio Quartulli <ordex@autistici.org>
  L:    b.a.t.m.a.n@lists.open-mesh.org
  W:    http://www.open-mesh.org/
  S:    Maintained
@@@ -1613,7 -1598,6 +1613,7 @@@ F:      include/linux/bcma
  
  BROCADE BFA FC SCSI DRIVER
  M:    Jing Huang <huangj@brocade.com>
 +M:    Krishna C Gudipati <kgudipat@brocade.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/bfa/
@@@ -1747,7 -1731,6 +1747,7 @@@ S:      Supporte
  F:    include/linux/capability.h
  F:    security/capability.c
  F:    security/commoncap.c 
 +F:    kernel/capability.c
  
  CELL BROADBAND ENGINE ARCHITECTURE
  M:    Arnd Bergmann <arnd@arndb.de>
@@@ -1826,12 -1809,6 +1826,12 @@@ L:    linux-kernel@zh-kernel.org (moderate
  S:    Maintained
  F:    Documentation/zh_CN/
  
 +CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER
 +M:    Alexander Shishkin <alexander.shishkin@linux.intel.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    drivers/usb/chipidea/
 +
  CISCO VIC ETHERNET NIC DRIVER
  M:    Christian Benvenuti <benve@cisco.com>
  M:    Roopa Prabhu <roprabhu@cisco.com>
@@@ -1905,16 -1882,6 +1905,16 @@@ F:    Documentation/filesystems/coda.tx
  F:    fs/coda/
  F:    include/linux/coda*.h
  
 +COMMON CLK FRAMEWORK
 +M:    Mike Turquette <mturquette@ti.com>
 +M:    Mike Turquette <mturquette@linaro.org>
 +L:    linux-arm-kernel@lists.infradead.org (same as CLK API & CLKDEV)
 +T:    git git://git.linaro.org/people/mturquette/linux.git
 +S:    Maintained
 +F:    drivers/clk/clk.c
 +F:    drivers/clk/clk-*
 +F:    include/linux/clk-pr*
 +
  COMMON INTERNET FILE SYSTEM (CIFS)
  M:    Steve French <sfrench@samba.org>
  L:    linux-cifs@vger.kernel.org
@@@ -2001,9 -1968,10 +2001,9 @@@ S:     Maintaine
  F:    drivers/net/ethernet/ti/cpmac.c
  
  CPU FREQUENCY DRIVERS
 -M:    Dave Jones <davej@redhat.com>
 +M:    Rafael J. Wysocki <rjw@sisk.pl>
  L:    cpufreq@vger.kernel.org
 -W:    http://www.codemonkey.org.uk/projects/cpufreq/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git
 +L:    linux-pm@vger.kernel.org
  S:    Maintained
  F:    drivers/cpufreq/
  F:    include/linux/cpufreq.h
@@@ -2408,10 -2376,10 +2408,10 @@@ F:   drivers/gpu/drm
  F:    include/drm/
  
  INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
 -M:    Keith Packard <keithp@keithp.com>
 +M:    Daniel Vetter <daniel.vetter@ffwll.ch>
  L:    intel-gfx@lists.freedesktop.org (subscribers-only)
  L:    dri-devel@lists.freedesktop.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/keithp/linux.git
 +T:    git git://people.freedesktop.org/~danvet/drm-intel
  S:    Supported
  F:    drivers/gpu/drm/i915
  F:    include/drm/i915*
@@@ -2728,13 -2696,6 +2728,13 @@@ S:    Maintaine
  F:    Documentation/hwmon/f71805f
  F:    drivers/hwmon/f71805f.c
  
 +FC0011 TUNER DRIVER
 +M:    Michael Buesch <m@bues.ch>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/media/common/tuners/fc0011.h
 +F:    drivers/media/common/tuners/fc0011.c
 +
  FANOTIFY
  M:    Eric Paris <eparis@redhat.com>
  S:    Maintained
@@@ -2793,15 -2754,6 +2793,15 @@@ T:    git git://git.alsa-project.org/alsa-
  S:    Maintained
  F:    sound/firewire/
  
 +FIREWIRE SBP-2 TARGET
 +M:    Chris Boot <bootc@bootc.net>
 +L:    linux-scsi@vger.kernel.org
 +L:    target-devel@vger.kernel.org
 +L:    linux1394-devel@lists.sourceforge.net
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/nab/lio-core-2.6.git master
 +S:    Maintained
 +F:    drivers/target/sbp/
 +
  FIREWIRE SUBSYSTEM
  M:    Stefan Richter <stefanr@s5r6.in-berlin.de>
  L:    linux1394-devel@lists.sourceforge.net
@@@ -2938,7 -2890,7 +2938,7 @@@ S:      Maintaine
  F:    arch/frv/
  
  FUJITSU LAPTOP EXTRAS
 -M:    Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
 +M:    Jonathan Woithe <jwoithe@just42.net>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
  F:    drivers/platform/x86/fujitsu-laptop.c
@@@ -2988,9 -2940,9 +2988,9 @@@ GENERIC GPIO I2C MULTIPLEXER DRIVE
  M:    Peter Korsgaard <peter.korsgaard@barco.com>
  L:    linux-i2c@vger.kernel.org
  S:    Supported
 -F:    drivers/i2c/muxes/gpio-i2cmux.c
 -F:    include/linux/gpio-i2cmux.h
 -F:    Documentation/i2c/muxes/gpio-i2cmux
 +F:    drivers/i2c/muxes/i2c-mux-gpio.c
 +F:    include/linux/i2c-mux-gpio.h
 +F:    Documentation/i2c/muxes/i2c-mux-gpio
  
  GENERIC HDLC (WAN) DRIVERS
  M:    Krzysztof Halasa <khc@pm.waw.pl>
@@@ -3364,6 -3316,12 +3364,6 @@@ T:     git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    arch/ia64/
  
 -IBM MCA SCSI SUBSYSTEM DRIVER
 -M:    Michael Lang <langa2@kph.uni-mainz.de>
 -W:    http://www.uni-mainz.de/~langm000/linux.html
 -S:    Maintained
 -F:    drivers/scsi/ibmmca.c
 -
  IBM Power Linux RAID adapter
  M:    Brian King <brking@us.ibm.com>
  S:    Supported
@@@ -3382,6 -3340,12 +3382,12 @@@ W:    http://www.developer.ibm.com/welcome
  S:    Supported
  F:    drivers/scsi/ips.*
  
+ ICH LPC AND GPIO DRIVER
+ M:    Peter Tyser <ptyser@xes-inc.com>
+ S:    Maintained
+ F:    drivers/mfd/lpc_ich.c
+ F:    drivers/gpio/gpio-ich.c
  IDE SUBSYSTEM
  M:    "David S. Miller" <davem@davemloft.net>
  L:    linux-ide@vger.kernel.org
@@@ -3426,7 -3390,6 +3432,7 @@@ IIO SUBSYSTEM AND DRIVER
  M:    Jonathan Cameron <jic23@cam.ac.uk>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 +F:    drivers/iio/
  F:    drivers/staging/iio/
  
  IKANOS/ADI EAGLE ADSL USB DRIVER
@@@ -3475,8 -3438,6 +3481,8 @@@ Q:      http://patchwork.kernel.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
  S:    Maintained
  F:    drivers/input/
 +F:    include/linux/input.h
 +F:    include/linux/input/
  
  INPUT MULTITOUCH (MT) PROTOCOL
  M:    Henrik Rydberg <rydberg@euromail.se>
@@@ -3564,6 -3525,12 +3570,6 @@@ M:     Deepak Saxena <dsaxena@plexity.net
  S:    Maintained
  F:    drivers/char/hw_random/ixp4xx-rng.c
  
 -INTEL IXP2000 ETHERNET DRIVER
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 -L:    netdev@vger.kernel.org
 -S:    Maintained
 -F:    drivers/net/ethernet/xscale/ixp2000/
 -
  INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe/ixgbevf)
  M:    Jeff Kirsher <jeffrey.t.kirsher@intel.com>
  M:    Jesse Brandeburg <jesse.brandeburg@intel.com>
@@@ -3648,14 -3615,6 +3654,14 @@@ S:    Supporte
  W:    http://wireless.kernel.org/en/users/Drivers/iwmc3200wifi
  F:    drivers/net/wireless/iwmc3200wifi/
  
 +INTEL MANAGEMENT ENGINE (mei)
 +M:    Tomas Winkler <tomas.winkler@intel.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +F:    include/linux/mei.h
 +F:    drivers/misc/mei/*
 +F:    Documentation/mei/*
 +
  IOC3 ETHERNET DRIVER
  M:    Ralf Baechle <ralf@linux-mips.org>
  L:    linux-mips@linux-mips.org
@@@ -3681,7 -3640,7 +3687,7 @@@ S:      Maintaine
  F:    drivers/net/ethernet/icplus/ipg.*
  
  IPATH DRIVER
 -M:    Mike Marciniszyn <infinipath@qlogic.com>
 +M:    Mike Marciniszyn <infinipath@intel.com>
  L:    linux-rdma@vger.kernel.org
  S:    Maintained
  F:    drivers/infiniband/hw/ipath/
@@@ -4084,7 -4043,6 +4090,7 @@@ F:      Documentation/scsi/53c700.tx
  F:    drivers/scsi/53c700*
  
  LED SUBSYSTEM
 +M:    Bryan Wu <bryan.wu@canonical.com>
  M:    Richard Purdie <rpurdie@rpsys.net>
  S:    Maintained
  F:    drivers/leds/
@@@ -4471,6 -4429,13 +4477,6 @@@ T:     git git://git.monstr.eu/linux-2.6-mi
  S:    Supported
  F:    arch/microblaze/
  
 -MICROCHANNEL ARCHITECTURE (MCA)
 -M:    James Bottomley <James.Bottomley@HansenPartnership.com>
 -S:    Maintained
 -F:    Documentation/mca.txt
 -F:    drivers/mca/
 -F:    include/linux/mca*
 -
  MICROTEK X6 SCANNER
  M:    Oliver Neukum <oliver@neukum.name>
  S:    Maintained
@@@ -5148,7 -5113,7 +5154,7 @@@ PCA9541 I2C BUS MASTER SELECTOR DRIVE
  M:    Guenter Roeck <guenter.roeck@ericsson.com>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
 -F:    drivers/i2c/muxes/pca9541.c
 +F:    drivers/i2c/muxes/i2c-mux-pca9541.c
  
  PCA9564/PCA9665 I2C BUS DRIVER
  M:    Wolfram Sang <w.sang@pengutronix.de>
@@@ -5174,13 -5139,19 +5180,13 @@@ F:   Documentation/powerpc/eeh-pci-error-
  PCI SUBSYSTEM
  M:    Bjorn Helgaas <bhelgaas@google.com>
  L:    linux-pci@vger.kernel.org
 -Q:    http://patchwork.kernel.org/project/linux-pci/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci.git
 +Q:    http://patchwork.ozlabs.org/project/linux-pci/list/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/linux.git
  S:    Supported
  F:    Documentation/PCI/
  F:    drivers/pci/
  F:    include/linux/pci*
  
 -PCI HOTPLUG
 -M:    Bjorn Helgaas <bhelgaas@google.com>
 -L:    linux-pci@vger.kernel.org
 -S:    Supported
 -F:    drivers/pci/hotplug
 -
  PCMCIA SUBSYSTEM
  P:    Linux PCMCIA Team
  L:    linux-pcmcia@lists.infradead.org
@@@ -5243,7 -5214,7 +5249,7 @@@ S:      Maintaine
  F:    include/linux/personality.h
  
  PHONET PROTOCOL
 -M:    Remi Denis-Courmont <remi.denis-courmont@nokia.com>
 +M:    Remi Denis-Courmont <courmisch@gmail.com>
  S:    Supported
  F:    Documentation/networking/phonet.txt
  F:    include/linux/phonet.h
@@@ -5270,14 -5241,6 +5276,14 @@@ M:    Linus Walleij <linus.walleij@linaro.
  S:    Maintained
  F:    drivers/pinctrl/
  
 +PIN CONTROLLER - ST SPEAR
 +M:    Viresh Kumar <viresh.kumar@st.com>
 +L:    spear-devel@list.st.com
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +W:    http://www.st.com/spear
 +S:    Maintained
 +F:    driver/pinctrl/spear/
 +
  PKTCDVD DRIVER
  M:    Peter Osterlund <petero2@telia.com>
  S:    Maintained
@@@ -5501,7 -5464,7 +5507,7 @@@ L:      rtc-linux@googlegroups.co
  S:    Maintained
  
  QIB DRIVER
 -M:    Mike Marciniszyn <infinipath@qlogic.com>
 +M:    Mike Marciniszyn <infinipath@intel.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  F:    drivers/infiniband/hw/qib/
@@@ -5651,13 -5614,14 +5657,13 @@@ F:   net/rds
  READ-COPY UPDATE (RCU)
  M:    Dipankar Sarma <dipankar@in.ibm.com>
  M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 -W:    http://www.rdrop.com/users/paulmck/rclock/
 +W:    http://www.rdrop.com/users/paulmck/RCU/
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
  F:    Documentation/RCU/
 +X:    Documentation/RCU/torture.txt
  F:    include/linux/rcu*
 -F:    include/linux/srcu*
  F:    kernel/rcu*
 -F:    kernel/srcu*
  X:    kernel/rcutorture.c
  
  REAL TIME CLOCK (RTC) SUBSYSTEM
@@@ -5934,11 -5898,11 +5940,11 @@@ F:   Documentation/scsi/st.tx
  F:    drivers/scsi/st*
  
  SCTP PROTOCOL
 -M:    Vlad Yasevich <vladislav.yasevich@hp.com>
 +M:    Vlad Yasevich <vyasevich@gmail.com>
  M:    Sridhar Samudrala <sri@us.ibm.com>
  L:    linux-sctp@vger.kernel.org
  W:    http://lksctp.sourceforge.net
 -S:    Supported
 +S:    Maintained
  F:    Documentation/networking/sctp.txt
  F:    include/linux/sctp.h
  F:    include/net/sctp/
@@@ -6003,7 -5967,7 +6009,7 @@@ SECURITY SUBSYSTE
  M:    James Morris <james.l.morris@oracle.com>
  L:    linux-security-module@vger.kernel.org (suggested Cc:)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security.git
 -W:    http://security.wiki.kernel.org/
 +W:    http://kernsec.org/
  S:    Supported
  F:    security/
  
@@@ -6174,15 -6138,6 +6180,15 @@@ S:    Maintaine
  F:    include/linux/sl?b*.h
  F:    mm/sl?b.c
  
 +SLEEPABLE READ-COPY UPDATE (SRCU)
 +M:    Lai Jiangshan <laijs@cn.fujitsu.com>
 +M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +W:    http://www.rdrop.com/users/paulmck/RCU/
 +S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 +F:    include/linux/srcu*
 +F:    kernel/srcu*
 +
  SMC91x ETHERNET DRIVER
  M:    Nicolas Pitre <nico@fluxnic.net>
  S:    Odd Fixes
@@@ -6350,48 -6305,52 +6356,48 @@@ F:   include/linux/compiler.
  
  SPEAR PLATFORM SUPPORT
  M:    Viresh Kumar <viresh.kumar@st.com>
 +M:    Shiraz Hashim <shiraz.hashim@st.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
  S:    Maintained
  F:    arch/arm/plat-spear/
  
 -SPEAR3XX MACHINE SUPPORT
 +SPEAR13XX MACHINE SUPPORT
  M:    Viresh Kumar <viresh.kumar@st.com>
 +M:    Shiraz Hashim <shiraz.hashim@st.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
  S:    Maintained
 -F:    arch/arm/mach-spear3xx/
 +F:    arch/arm/mach-spear13xx/
  
 -SPEAR6XX MACHINE SUPPORT
 -M:    Rajeev Kumar <rajeev-dlh.kumar@st.com>
 +SPEAR3XX MACHINE SUPPORT
 +M:    Viresh Kumar <viresh.kumar@st.com>
 +M:    Shiraz Hashim <shiraz.hashim@st.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
  S:    Maintained
 -F:    arch/arm/mach-spear6xx/
 +F:    arch/arm/mach-spear3xx/
  
 -SPEAR CLOCK FRAMEWORK SUPPORT
 +SPEAR6XX MACHINE SUPPORT
 +M:    Rajeev Kumar <rajeev-dlh.kumar@st.com>
 +M:    Shiraz Hashim <shiraz.hashim@st.com>
  M:    Viresh Kumar <viresh.kumar@st.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
  S:    Maintained
 -F:    arch/arm/mach-spear*/clock.c
 -F:    arch/arm/plat-spear/clock.c
 -F:    arch/arm/plat-spear/include/plat/clock.h
 +F:    arch/arm/mach-spear6xx/
  
 -SPEAR PAD MULTIPLEXING SUPPORT
 +SPEAR CLOCK FRAMEWORK SUPPORT
  M:    Viresh Kumar <viresh.kumar@st.com>
  L:    spear-devel@list.st.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.st.com/spear
  S:    Maintained
 -F:    arch/arm/plat-spear/include/plat/padmux.h
 -F:    arch/arm/plat-spear/padmux.c
 -F:    arch/arm/mach-spear*/spear*xx.c
 -F:    arch/arm/mach-spear*/include/mach/generic.h
 -F:    arch/arm/mach-spear3xx/spear3*0.c
 -F:    arch/arm/mach-spear3xx/spear3*0_evb.c
 -F:    arch/arm/mach-spear6xx/spear600.c
 -F:    arch/arm/mach-spear6xx/spear600_evb.c
 +F:    drivers/clk/spear/
  
  SPI SUBSYSTEM
  M:    Grant Likely <grant.likely@secretlab.ca>
@@@ -6599,7 -6558,7 +6605,7 @@@ M:      Paul Mundt <lethal@linux-sh.org
  L:    linux-sh@vger.kernel.org
  W:    http://www.linux-sh.org
  Q:    http://patchwork.kernel.org/project/linux-sh/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.git sh-latest
 +T:    git git://github.com/pmundt/linux-sh.git sh-latest
  S:    Supported
  F:    Documentation/sh/
  F:    arch/sh/
@@@ -6717,28 -6676,12 +6723,28 @@@ F:   drivers/misc/tifm
  F:    drivers/mmc/host/tifm_sd.c
  F:    include/linux/tifm.h
  
 +TI LM49xxx FAMILY ASoC CODEC DRIVERS
 +M:    M R Swami Reddy <mr.swami.reddy@ti.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    sound/soc/codecs/lm49453*
 +
  TI TWL4030 SERIES SOC CODEC DRIVER
  M:    Peter Ujfalusi <peter.ujfalusi@ti.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Maintained
  F:    sound/soc/codecs/twl4030*
  
 +TI WILINK WIRELESS DRIVERS
 +M:    Luciano Coelho <coelho@ti.com>
 +L:    linux-wireless@vger.kernel.org
 +W:    http://wireless.kernel.org/en/users/Drivers/wl12xx
 +W:    http://wireless.kernel.org/en/users/Drivers/wl1251
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
 +S:    Maintained
 +F:    drivers/net/wireless/ti/
 +F:    include/linux/wl12xx.h
 +
  TIPC NETWORK LAYER
  M:    Jon Maloy <jon.maloy@ericsson.com>
  M:    Allan Stephens <allan.stephens@windriver.com>
@@@ -6946,14 -6889,6 +6952,14 @@@ F:    Documentation/cdrom
  F:    drivers/cdrom/cdrom.c
  F:    include/linux/cdrom.h
  
 +UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER
 +M:    Vinayak Holikatti <vinholikatti@gmail.com>
 +M:    Santosh Y <santoshsy@gmail.com>
 +L:    linux-scsi@vger.kernel.org
 +S:    Supported
 +F:    Documentation/scsi/ufs.txt
 +F:    drivers/scsi/ufs/
 +
  UNSORTED BLOCK IMAGES (UBI)
  M:    Artem Bityutskiy <dedekind1@gmail.com>
  W:    http://www.linux-mtd.infradead.org/
@@@ -7100,14 -7035,6 +7106,14 @@@ W:    http://pegasus2.sourceforge.net
  S:    Maintained
  F:    drivers/net/usb/pegasus.*
  
 +USB PHY LAYER
 +M:    Felipe Balbi <balbi@ti.com>
 +L:    linux-usb@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
 +S:    Maintained
 +F:    drivers/usb/phy/
 +F:    drivers/usb/otg/
 +
  USB PRINTER DRIVER (usblp)
  M:    Pete Zaitcev <zaitcev@redhat.com>
  L:    linux-usb@vger.kernel.org
@@@ -7221,7 -7148,7 +7227,7 @@@ F:      include/linux/usb/usbnet.
  
  USB VIDEO CLASS
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 -L:    linux-uvc-devel@lists.berlios.de (subscribers-only)
 +L:    linux-uvc-devel@lists.sourceforge.net (subscribers-only)
  L:    linux-media@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git
  W:    http://www.ideasonboard.org/uvc/
@@@ -7391,18 -7318,6 +7397,18 @@@ S:    Maintaine
  F:    drivers/vlynq/vlynq.c
  F:    include/linux/vlynq.h
  
 +VME SUBSYSTEM
 +M:    Martyn Welch <martyn.welch@ge.com>
 +M:    Manohar Vanga <manohar.vanga@cern.ch>
 +M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 +L:    devel@driverdev.osuosl.org
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
 +F:    Documentation/vme_api.txt
 +F:    drivers/staging/vme/
 +F:    drivers/vme/
 +F:    include/linux/vme*
 +
  VMWARE VMXNET3 ETHERNET DRIVER
  M:    Shreyas Bhatewara <sbhatewara@vmware.com>
  M:    "VMware, Inc." <pv-drivers@vmware.com>
@@@ -7523,6 -7438,23 +7529,6 @@@ M:     Miloslav Trmac <mitr@volny.cz
  S:    Maintained
  F:    drivers/input/misc/wistron_btns.c
  
 -WL1251 WIRELESS DRIVER
 -M:    Luciano Coelho <coelho@ti.com>
 -L:    linux-wireless@vger.kernel.org
 -W:    http://wireless.kernel.org/en/users/Drivers/wl1251
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
 -S:    Maintained
 -F:    drivers/net/wireless/wl1251/*
 -
 -WL1271 WIRELESS DRIVER
 -M:    Luciano Coelho <coelho@ti.com>
 -L:    linux-wireless@vger.kernel.org
 -W:    http://wireless.kernel.org/en/users/Drivers/wl12xx
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
 -S:    Maintained
 -F:    drivers/net/wireless/wl12xx/
 -F:    include/linux/wl12xx.h
 -
  WL3501 WIRELESS PCMCIA CARD DRIVER
  M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
  L:    linux-wireless@vger.kernel.org
@@@ -7644,7 -7576,7 +7650,7 @@@ XFS FILESYSTE
  P:    Silicon Graphics Inc
  M:    Ben Myers <bpm@sgi.com>
  M:    Alex Elder <elder@kernel.org>
 -M:    xfs-masters@oss.sgi.com
 +M:    xfs@oss.sgi.com
  L:    xfs@oss.sgi.com
  W:    http://oss.sgi.com/projects/xfs
  T:    git git://oss.sgi.com/xfs/xfs.git
@@@ -1,4 -1,3 +1,4 @@@
 +
  /*
   * Copyright (C) 2008-2009 ST-Ericsson
   *
  #include <linux/smsc911x.h>
  #include <linux/gpio_keys.h>
  #include <linux/delay.h>
 -
  #include <linux/of.h>
  #include <linux/of_platform.h>
 -
  #include <linux/leds.h>
 +#include <linux/pinctrl/consumer.h>
 +
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  #include <asm/hardware/gic.h>
  
  #include <plat/i2c.h>
  #include <plat/ste_dma40.h>
 -#include <plat/pincfg.h>
  #include <plat/gpio-nomadik.h>
  
  #include <mach/hardware.h>
  #include <mach/setup.h>
  #include <mach/devices.h>
  #include <mach/irqs.h>
 +#include <mach/crypto-ux500.h>
  
 -#include "pins-db8500.h"
  #include "ste-dma40-db8500.h"
  #include "devices-db8500.h"
  #include "board-mop500.h"
  #include "board-mop500-regulators.h"
 +#include "board-mop500-msp.h"
  
  static struct gpio_led snowball_led_array[] = {
        {
@@@ -206,7 -205,7 +206,7 @@@ static struct resource ab8500_resources
  };
  
  struct platform_device ab8500_device = {
-       .name = "ab8500-i2c",
+       .name = "ab8500-core",
        .id = 0,
        .dev = {
                .platform_data = &ab8500_platdata,
@@@ -418,45 -417,6 +418,45 @@@ static void mop500_prox_deactivate(stru
        regulator_put(prox_regulator);
  }
  
 +static struct cryp_platform_data u8500_cryp1_platform_data = {
 +              .mem_to_engine = {
 +                              .dir = STEDMA40_MEM_TO_PERIPH,
 +                              .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
 +                              .dst_dev_type = DB8500_DMA_DEV48_CAC1_TX,
 +                              .src_info.data_width = STEDMA40_WORD_WIDTH,
 +                              .dst_info.data_width = STEDMA40_WORD_WIDTH,
 +                              .mode = STEDMA40_MODE_LOGICAL,
 +                              .src_info.psize = STEDMA40_PSIZE_LOG_4,
 +                              .dst_info.psize = STEDMA40_PSIZE_LOG_4,
 +              },
 +              .engine_to_mem = {
 +                              .dir = STEDMA40_PERIPH_TO_MEM,
 +                              .src_dev_type = DB8500_DMA_DEV48_CAC1_RX,
 +                              .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
 +                              .src_info.data_width = STEDMA40_WORD_WIDTH,
 +                              .dst_info.data_width = STEDMA40_WORD_WIDTH,
 +                              .mode = STEDMA40_MODE_LOGICAL,
 +                              .src_info.psize = STEDMA40_PSIZE_LOG_4,
 +                              .dst_info.psize = STEDMA40_PSIZE_LOG_4,
 +              }
 +};
 +
 +static struct stedma40_chan_cfg u8500_hash_dma_cfg_tx = {
 +              .dir = STEDMA40_MEM_TO_PERIPH,
 +              .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
 +              .dst_dev_type = DB8500_DMA_DEV50_HAC1_TX,
 +              .src_info.data_width = STEDMA40_WORD_WIDTH,
 +              .dst_info.data_width = STEDMA40_WORD_WIDTH,
 +              .mode = STEDMA40_MODE_LOGICAL,
 +              .src_info.psize = STEDMA40_PSIZE_LOG_16,
 +              .dst_info.psize = STEDMA40_PSIZE_LOG_16,
 +};
 +
 +static struct hash_platform_data u8500_hash1_platform_data = {
 +              .mem_to_engine = &u8500_hash_dma_cfg_tx,
 +              .dma_filter = stedma40_filter,
 +};
 +
  /* add any platform devices here - TODO */
  static struct platform_device *mop500_platform_devs[] __initdata = {
        &mop500_gpio_keys_device,
@@@ -560,6 -520,14 +560,6 @@@ static struct stedma40_chan_cfg uart2_d
  };
  #endif
  
 -
 -static pin_cfg_t mop500_pins_uart0[] = {
 -      GPIO0_U0_CTSn   | PIN_INPUT_PULLUP,
 -      GPIO1_U0_RTSn   | PIN_OUTPUT_HIGH,
 -      GPIO2_U0_RXD    | PIN_INPUT_PULLUP,
 -      GPIO3_U0_TXD    | PIN_OUTPUT_HIGH,
 -};
 -
  #define PRCC_K_SOFTRST_SET      0x18
  #define PRCC_K_SOFTRST_CLEAR    0x1C
  static void ux500_uart0_reset(void)
        udelay(1);
  }
  
 +/* This needs to be referenced by callbacks */
 +struct pinctrl *u0_p;
 +struct pinctrl_state *u0_def;
 +struct pinctrl_state *u0_sleep;
 +
  static void ux500_uart0_init(void)
  {
        int ret;
  
 -      ret = nmk_config_pins(mop500_pins_uart0,
 -                      ARRAY_SIZE(mop500_pins_uart0));
 -      if (ret < 0)
 -              pr_err("pl011: uart pins_enable failed\n");
 +      if (IS_ERR(u0_p) || IS_ERR(u0_def))
 +              return;
 +
 +      ret = pinctrl_select_state(u0_p, u0_def);
 +      if (ret)
 +              pr_err("could not set UART0 defstate\n");
  }
  
  static void ux500_uart0_exit(void)
  {
        int ret;
  
 -      ret = nmk_config_pins_sleep(mop500_pins_uart0,
 -                      ARRAY_SIZE(mop500_pins_uart0));
 -      if (ret < 0)
 -              pr_err("pl011: uart pins_disable failed\n");
 +      if (IS_ERR(u0_p) || IS_ERR(u0_sleep))
 +              return;
 +
 +      ret = pinctrl_select_state(u0_p, u0_sleep);
 +      if (ret)
 +              pr_err("could not set UART0 idlestate\n");
  }
  
  static struct amba_pl011_data uart0_plat = {
@@@ -638,41 -597,15 +638,41 @@@ static struct amba_pl011_data uart2_pla
  
  static void __init mop500_uart_init(struct device *parent)
  {
 -      db8500_add_uart0(parent, &uart0_plat);
 +      struct amba_device *uart0_device;
 +
 +      uart0_device = db8500_add_uart0(parent, &uart0_plat);
 +      if (uart0_device) {
 +              u0_p = pinctrl_get(&uart0_device->dev);
 +              if (IS_ERR(u0_p))
 +                      dev_err(&uart0_device->dev,
 +                              "could not get UART0 pinctrl\n");
 +              else {
 +                      u0_def = pinctrl_lookup_state(u0_p,
 +                                                    PINCTRL_STATE_DEFAULT);
 +                      if (IS_ERR(u0_def)) {
 +                              dev_err(&uart0_device->dev,
 +                                      "could not get UART0 defstate\n");
 +                      }
 +                      u0_sleep = pinctrl_lookup_state(u0_p,
 +                                                      PINCTRL_STATE_SLEEP);
 +                      if (IS_ERR(u0_sleep))
 +                              dev_err(&uart0_device->dev,
 +                                      "could not get UART0 idlestate\n");
 +              }
 +      }
        db8500_add_uart1(parent, &uart1_plat);
        db8500_add_uart2(parent, &uart2_plat);
  }
  
 +static void __init u8500_cryp1_hash1_init(struct device *parent)
 +{
 +      db8500_add_cryp1(parent, &u8500_cryp1_platform_data);
 +      db8500_add_hash1(parent, &u8500_hash1_platform_data);
 +}
 +
  static struct platform_device *snowball_platform_devs[] __initdata = {
        &snowball_led_dev,
        &snowball_key_dev,
 -      &snowball_sbnet_dev,
        &ab8500_device,
  };
  
@@@ -684,9 -617,10 +684,9 @@@ static void __init mop500_init_machine(
  
        mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
  
 +      mop500_pinmaps_init();
        parent = u8500_init_devices();
  
 -      mop500_pins_init();
 -
        /* FIXME: parent of ab8500 should be prcmu */
        for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
                mop500_platform_devs[i]->dev.parent = parent;
        mop500_i2c_init(parent);
        mop500_sdi_init(parent);
        mop500_spi_init(parent);
 +      mop500_msp_init(parent);
        mop500_uart_init(parent);
  
 +      u8500_cryp1_hash1_init(parent);
 +
        i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
  
        i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
  static void __init snowball_init_machine(void)
  {
        struct device *parent = NULL;
 -      int i2c0_devs;
        int i;
  
 +      snowball_pinmaps_init();
        parent = u8500_init_devices();
  
 -      snowball_pins_init();
 -
        for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)
                snowball_platform_devs[i]->dev.parent = parent;
  
        mop500_i2c_init(parent);
        snowball_sdi_init(parent);
        mop500_spi_init(parent);
 +      mop500_msp_init(parent);
        mop500_uart_init(parent);
  
 -      i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
 -      i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
 -      i2c_register_board_info(2, mop500_i2c2_devices,
 -                              ARRAY_SIZE(mop500_i2c2_devices));
 -
        /* This board has full regulator constraints */
        regulator_has_full_constraints();
  }
@@@ -749,9 -686,10 +749,9 @@@ static void __init hrefv60_init_machine
         */
        mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
  
 +      hrefv60_pinmaps_init();
        parent = u8500_init_devices();
  
 -      hrefv60_pins_init();
 -
        for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
                mop500_platform_devs[i]->dev.parent = parent;
  
        mop500_i2c_init(parent);
        hrefv60_sdi_init(parent);
        mop500_spi_init(parent);
 +      mop500_msp_init(parent);
        mop500_uart_init(parent);
  
        i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
@@@ -785,7 -722,6 +785,7 @@@ MACHINE_START(U8500, "ST-Ericsson MOP50
        .timer          = &ux500_timer,
        .handle_irq     = gic_handle_irq,
        .init_machine   = mop500_init_machine,
 +      .init_late      = ux500_init_late,
  MACHINE_END
  
  MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
        .timer          = &ux500_timer,
        .handle_irq     = gic_handle_irq,
        .init_machine   = hrefv60_init_machine,
 +      .init_late      = ux500_init_late,
  MACHINE_END
  
  MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
        .timer          = &ux500_timer,
        .handle_irq     = gic_handle_irq,
        .init_machine   = snowball_init_machine,
 +      .init_late      = ux500_init_late,
  MACHINE_END
  
  #ifdef CONFIG_MACH_UX500_DT
  
  struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
 +      /* Requires DMA and call-back bindings. */
        OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat),
        OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat),
        OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat),
 +      /* Requires DMA bindings. */
        OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0",  &ssp0_plat),
 +      /* Requires clock name bindings. */
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e000, "gpio.0", NULL),
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e080, "gpio.1", NULL),
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e000, "gpio.2", NULL),
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e080, "gpio.3", NULL),
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e100, "gpio.4", NULL),
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e180, "gpio.5", NULL),
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL),
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL),
 +      OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL),
        {},
  };
  
 -static const struct of_device_id u8500_soc_node[] = {
 +static const struct of_device_id u8500_local_bus_nodes[] = {
        /* only create devices below soc node */
        { .compatible = "stericsson,db8500", },
 +      { .compatible = "simple-bus"},
        { },
  };
  
@@@ -844,15 -765,8 +844,15 @@@ static void __init u8500_init_machine(v
        int i2c0_devs;
        int i;
  
 +      /* Pinmaps must be in place before devices register */
 +      if (of_machine_is_compatible("st-ericsson,mop500"))
 +              mop500_pinmaps_init();
 +      else if (of_machine_is_compatible("calaosystems,snowball-a9500"))
 +              snowball_pinmaps_init();
 +      else if (of_machine_is_compatible("st-ericsson,hrefv60+"))
 +              hrefv60_pinmaps_init();
 +
        parent = u8500_init_devices();
 -      i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
  
        for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
                mop500_platform_devs[i]->dev.parent = parent;
                snowball_platform_devs[i]->dev.parent = parent;
  
        /* automatically probe child nodes of db8500 device */
 -      of_platform_populate(NULL, u8500_soc_node, u8500_auxdata_lookup, parent);
 +      of_platform_populate(NULL, u8500_local_bus_nodes, u8500_auxdata_lookup, parent);
  
        if (of_machine_is_compatible("st-ericsson,mop500")) {
                mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
 -              mop500_pins_init();
  
                platform_add_devices(mop500_platform_devs,
                                ARRAY_SIZE(mop500_platform_devs));
  
                mop500_sdi_init(parent);
 +
 +              i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
 +              i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
 +              i2c_register_board_info(2, mop500_i2c2_devices,
 +                                      ARRAY_SIZE(mop500_i2c2_devices));
 +
        } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
 -              snowball_pins_init();
                platform_add_devices(snowball_platform_devs,
                                ARRAY_SIZE(snowball_platform_devs));
  
                 * instead.
                 */
                mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
 -              i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
 -              hrefv60_pins_init();
                platform_add_devices(mop500_platform_devs,
                                ARRAY_SIZE(mop500_platform_devs));
  
                hrefv60_sdi_init(parent);
 +
 +              i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
 +              i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
 +
 +              i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
 +              i2c_register_board_info(2, mop500_i2c2_devices,
 +                                      ARRAY_SIZE(mop500_i2c2_devices));
        }
        mop500_i2c_init(parent);
  
 -      i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
 -      i2c_register_board_info(2, mop500_i2c2_devices,
 -                              ARRAY_SIZE(mop500_i2c2_devices));
 -
        /* This board has full regulator constraints */
        regulator_has_full_constraints();
  }
@@@ -921,7 -830,6 +921,7 @@@ DT_MACHINE_START(U8500_DT, "ST-Ericsso
        .timer          = &ux500_timer,
        .handle_irq     = gic_handle_irq,
        .init_machine   = u8500_init_machine,
 +      .init_late      = ux500_init_late,
        .dt_compat      = u8500_dt_board_compat,
  MACHINE_END
  #endif
diff --combined drivers/gpio/Kconfig
@@@ -2,14 -2,6 +2,14 @@@
  # GPIO infrastructure and drivers
  #
  
 +config ARCH_HAVE_CUSTOM_GPIO_H
 +      bool
 +      help
 +        Selecting this config option from the architecture Kconfig allows
 +        the architecture to provide a custom asm/gpio.h implementation
 +        overriding the default implementations.  New uses of this are
 +        strongly discouraged.
 +
  config ARCH_WANT_OPTIONAL_GPIOLIB
        bool
        help
@@@ -45,10 -37,6 +45,10 @@@ menuconfig GPIOLI
  
  if GPIOLIB
  
 +config OF_GPIO
 +      def_bool y
 +      depends on OF && !SPARC
 +
  config DEBUG_GPIO
        bool "Debug GPIO calls"
        depends on DEBUG_KERNEL
@@@ -103,12 -91,6 +103,12 @@@ config GPIO_IT8761
        help
          Say yes here to support GPIO functionality of IT8761E super I/O chip.
  
 +config GPIO_EM
 +      tristate "Emma Mobile GPIO"
 +      depends on ARM
 +      help
 +        Say yes here to support GPIO on Renesas Emma Mobile SoCs.
 +
  config GPIO_EP93XX
        def_bool y
        depends on ARCH_EP93XX
@@@ -167,6 -149,14 +167,14 @@@ config GPIO_PX
        help
          Say yes here to support the PXA GPIO device
  
+ config GPIO_STA2X11
+       bool "STA2x11/ConneXt GPIO support"
+       depends on MFD_STA2X11
+       select GENERIC_IRQ_CHIP
+       help
+         Say yes here to support the STA2x11/ConneXt GPIO device.
+         The GPIO module has 128 GPIO pins with alternate functions.
  config GPIO_XILINX
        bool "Xilinx GPIO support"
        depends on PPC_OF || MICROBLAZE
@@@ -180,13 -170,13 +188,13 @@@ config GPIO_VR41X
          Say yes here to support the NEC VR4100 series General-purpose I/O Uint
  
  config GPIO_SCH
-       tristate "Intel SCH/TunnelCreek GPIO"
+       tristate "Intel SCH/TunnelCreek/Centerton GPIO"
        depends on PCI && X86
        select MFD_CORE
        select LPC_SCH
        help
-         Say yes here to support GPIO interface on Intel Poulsbo SCH
-         or Intel Tunnel Creek processor.
+         Say yes here to support GPIO interface on Intel Poulsbo SCH,
+         Intel Tunnel Creek processor or Intel Centerton processor.
          The Intel SCH contains a total of 14 GPIO pins. Ten GPIOs are
          powered by the core power rail and are turned off during sleep
          modes (S3 and higher). The remaining four GPIOs are powered by
          system from the Suspend-to-RAM state.
          The Intel Tunnel Creek processor has 5 GPIOs powered by the
          core power rail and 9 from suspend power supply.
+         The Intel Centerton processor has a total of 30 GPIO pins.
+         Twenty-one are powered by the core power rail and 9 from the
+         suspend power supply.
+ config GPIO_ICH
+       tristate "Intel ICH GPIO"
+       depends on PCI && X86
+       select MFD_CORE
+       select LPC_ICH
+       help
+         Say yes here to support the GPIO functionality of a number of Intel
+         ICH-based chipsets.  Currently supported devices: ICH6, ICH7, ICH8
+         ICH9, ICH10, Series 5/3400 (eg Ibex Peak), Series 6/C200 (eg
+         Cougar Point), NM10 (Tiger Point), and 3100 (Whitmore Lake).
+         If unsure, say N.
  
  config GPIO_VX855
        tristate "VIA VX855/VX875 GPIO"
@@@ -261,7 -267,7 +285,7 @@@ config GPIO_MC9S08DZ6
          Select this to enable the MC9S08DZ60 GPIO driver
  
  config GPIO_PCA953X
 -      tristate "PCA953x, PCA955x, TCA64xx, and MAX7310 I/O ports"
 +      tristate "PCA953x, PCA955x, PCA957x, TCA64xx, and MAX7310 I/O ports"
        depends on I2C
        help
          Say yes here to provide access to several register-oriented
  
          4 bits:       pca9536, pca9537
  
 -        8 bits:       max7310, pca9534, pca9538, pca9554, pca9557,
 -                      tca6408
 +        8 bits:       max7310, max7315, pca6107, pca9534, pca9538, pca9554,
 +                      pca9556, pca9557, pca9574, tca6408
  
 -        16 bits:      pca9535, pca9539, pca9555, tca6416
 +        16 bits:      max7312, max7313, pca9535, pca9539, pca9555, pca9575,
 +                      tca6416
  
  config GPIO_PCA953X_IRQ
        bool "Interrupt controller support for PCA953x"
@@@ -307,15 -312,6 +331,15 @@@ config GPIO_PCF857
          This driver provides an in-kernel interface to those GPIOs using
          platform-neutral GPIO calls.
  
 +config GPIO_RC5T583
 +      bool "RICOH RC5T583 GPIO"
 +      depends on MFD_RC5T583
 +      help
 +        Select this option to enable GPIO driver for the Ricoh RC5T583
 +        chip family.
 +        This driver provides the support for driving/reading the gpio pins
 +        of RC5T583 device through standard gpio library.
 +
  config GPIO_SX150X
        bool "Semtech SX150x I2C GPIO expander"
        depends on I2C=y
@@@ -427,7 -423,6 +451,7 @@@ config GPIO_BT8X
  config GPIO_LANGWELL
        bool "Intel Langwell/Penwell GPIO support"
        depends on PCI && X86
 +      select IRQ_DOMAIN
        help
          Say Y here to support Intel Langwell/Penwell GPIO.
  
@@@ -543,12 -538,4 +567,12 @@@ config GPIO_TPS6591
        help
          Select this option to enable GPIO driver for the TPS65910
          chip family.
 +
 +config GPIO_MSIC
 +      bool "Intel MSIC mixed signal gpio support"
 +      depends on MFD_INTEL_MSIC
 +      help
 +        Enable support for GPIO on intel MSIC controllers found in
 +        intel MID devices
 +
  endif
diff --combined drivers/gpio/Makefile
@@@ -3,7 -3,6 +3,7 @@@
  ccflags-$(CONFIG_DEBUG_GPIO)  += -DDEBUG
  
  obj-$(CONFIG_GPIOLIB)         += gpiolib.o devres.o
 +obj-$(CONFIG_OF_GPIO)         += gpiolib-of.o
  
  # Device drivers. Generally keep list sorted alphabetically
  obj-$(CONFIG_GPIO_GENERIC)    += gpio-generic.o
@@@ -16,9 -15,9 +16,10 @@@ obj-$(CONFIG_GPIO_BT8XX)     += gpio-bt8xx.
  obj-$(CONFIG_GPIO_CS5535)     += gpio-cs5535.o
  obj-$(CONFIG_GPIO_DA9052)     += gpio-da9052.o
  obj-$(CONFIG_ARCH_DAVINCI)    += gpio-davinci.o
 +obj-$(CONFIG_GPIO_EM)         += gpio-em.o
  obj-$(CONFIG_GPIO_EP93XX)     += gpio-ep93xx.o
  obj-$(CONFIG_GPIO_GE_FPGA)    += gpio-ge.o
+ obj-$(CONFIG_GPIO_ICH)                += gpio-ich.o
  obj-$(CONFIG_GPIO_IT8761E)    += gpio-it8761e.o
  obj-$(CONFIG_GPIO_JANZ_TTL)   += gpio-janz-ttl.o
  obj-$(CONFIG_ARCH_KS8695)     += gpio-ks8695.o
@@@ -34,23 -33,23 +35,24 @@@ obj-$(CONFIG_GPIO_MCP23S08)        += gpio-mcp
  obj-$(CONFIG_GPIO_ML_IOH)     += gpio-ml-ioh.o
  obj-$(CONFIG_GPIO_MPC5200)    += gpio-mpc5200.o
  obj-$(CONFIG_GPIO_MPC8XXX)    += gpio-mpc8xxx.o
 +obj-$(CONFIG_GPIO_MSIC)               += gpio-msic.o
  obj-$(CONFIG_GPIO_MSM_V1)     += gpio-msm-v1.o
  obj-$(CONFIG_GPIO_MSM_V2)     += gpio-msm-v2.o
  obj-$(CONFIG_GPIO_MXC)                += gpio-mxc.o
  obj-$(CONFIG_GPIO_MXS)                += gpio-mxs.o
 -obj-$(CONFIG_PLAT_NOMADIK)    += gpio-nomadik.o
  obj-$(CONFIG_ARCH_OMAP)               += gpio-omap.o
  obj-$(CONFIG_GPIO_PCA953X)    += gpio-pca953x.o
  obj-$(CONFIG_GPIO_PCF857X)    += gpio-pcf857x.o
  obj-$(CONFIG_GPIO_PCH)                += gpio-pch.o
  obj-$(CONFIG_GPIO_PL061)      += gpio-pl061.o
  obj-$(CONFIG_GPIO_PXA)                += gpio-pxa.o
 +obj-$(CONFIG_GPIO_RC5T583)    += gpio-rc5t583.o
  obj-$(CONFIG_GPIO_RDC321X)    += gpio-rdc321x.o
  obj-$(CONFIG_PLAT_SAMSUNG)    += gpio-samsung.o
  obj-$(CONFIG_ARCH_SA1100)     += gpio-sa1100.o
  obj-$(CONFIG_GPIO_SCH)                += gpio-sch.o
  obj-$(CONFIG_GPIO_SODAVILLE)  += gpio-sodaville.o
+ obj-$(CONFIG_GPIO_STA2X11)    += gpio-sta2x11.o
  obj-$(CONFIG_GPIO_STMPE)      += gpio-stmpe.o
  obj-$(CONFIG_GPIO_SX150X)     += gpio-sx150x.o
  obj-$(CONFIG_GPIO_TC3589X)    += gpio-tc3589x.o
diff --combined drivers/mfd/Kconfig
@@@ -106,6 -106,19 +106,19 @@@ config UCB1400_COR
          To compile this driver as a module, choose M here: the
          module will be called ucb1400_core.
  
+ config MFD_LM3533
+       tristate "LM3533 Lighting Power chip"
+       depends on I2C
+       select MFD_CORE
+       select REGMAP_I2C
+       help
+         Say yes here to enable support for National Semiconductor / TI
+         LM3533 Lighting Power chips.
+         This driver provides common support for accessing the device;
+         additional drivers must be enabled in order to use the LED,
+         backlight or ambient-light-sensor functionality of the device.
  config TPS6105X
        tristate "TPS61050/61052 Boost Converters"
        depends on I2C
@@@ -162,7 -175,6 +175,7 @@@ config MFD_TPS6586
        bool "TPS6586x Power Management chips"
        depends on I2C=y && GPIOLIB && GENERIC_HARDIRQS
        select MFD_CORE
 +      depends on REGULATOR
        help
          If you say yes here you get support for the TPS6586X series of
          Power Management chips.
@@@ -177,8 -189,8 +190,8 @@@ config MFD_TPS6591
        bool "TPS65910 Power Management chip"
        depends on I2C=y && GPIOLIB
        select MFD_CORE
-       select GPIO_TPS65910
        select REGMAP_I2C
+       select IRQ_DOMAIN
        help
          if you say yes here you get support for the TPS65910 series of
          Power Management chips.
@@@ -409,13 -421,26 +422,26 @@@ config PMIC_ADP552
          individual components like LCD backlight, LEDs, GPIOs and Kepad
          under the corresponding menus.
  
+ config MFD_MAX77693
+       bool "Maxim Semiconductor MAX77693 PMIC Support"
+       depends on I2C=y && GENERIC_HARDIRQS
+       select MFD_CORE
+       select REGMAP_I2C
+       help
+         Say yes here to support for Maxim Semiconductor MAX77693.
+         This is a companion Power Management IC with Flash, Haptic, Charger,
+         and MUIC(Micro USB Interface Controller) controls on chip.
+         This driver provides common support for accessing the device;
+         additional drivers must be enabled in order to use the functionality
+         of the device.
  config MFD_MAX8925
        bool "Maxim Semiconductor MAX8925 PMIC Support"
        depends on I2C=y && GENERIC_HARDIRQS
        select MFD_CORE
        help
          Say yes here to support for Maxim Semiconductor MAX8925. This is
 -        a Power Management IC. This driver provies common support for
 +        a Power Management IC. This driver provides common support for
          accessing the device, additional drivers must be enabled in order
          to use the functionality of the device.
  
@@@ -438,7 -463,7 +464,7 @@@ config MFD_MAX899
        help
          Say yes here to support for Maxim Semiconductor MAX8998 and
          National Semiconductor LP3974. This is a Power Management IC.
 -        This driver provies common support for accessing the device,
 +        This driver provides common support for accessing the device,
          additional drivers must be enabled in order to use the functionality
          of the device.
  
@@@ -449,14 -474,14 +475,14 @@@ config MFD_S5M_COR
        select REGMAP_I2C
        help
         Support for the Samsung Electronics S5M MFD series.
 -       This driver provies common support for accessing the device,
 +       This driver provides common support for accessing the device,
         additional drivers must be enabled in order to use the functionality
         of the device
  
  config MFD_WM8400
-       tristate "Support Wolfson Microelectronics WM8400"
+       bool "Support Wolfson Microelectronics WM8400"
        select MFD_CORE
-       depends on I2C
+       depends on I2C=y
        select REGMAP_I2C
        help
          Support for the Wolfson Microelecronics WM8400 PMIC and audio
@@@ -473,6 -498,7 +499,7 @@@ config MFD_WM831X_I2
        select MFD_CORE
        select MFD_WM831X
        select REGMAP_I2C
+       select IRQ_DOMAIN
        depends on I2C=y && GENERIC_HARDIRQS
        help
          Support for the Wolfson Microelecronics WM831x and WM832x PMICs
@@@ -485,6 -511,7 +512,7 @@@ config MFD_WM831X_SP
        select MFD_CORE
        select MFD_WM831X
        select REGMAP_SPI
+       select IRQ_DOMAIN
        depends on SPI_MASTER && GENERIC_HARDIRQS
        help
          Support for the Wolfson Microelecronics WM831x and WM832x PMICs
@@@ -597,17 -624,32 +625,32 @@@ config MFD_MC1378
        tristate
  
  config MFD_MC13XXX
-       tristate "Support Freescale MC13783 and MC13892"
-       depends on SPI_MASTER
+       tristate
+       depends on SPI_MASTER || I2C
        select MFD_CORE
        select MFD_MC13783
        help
-         Support for the Freescale (Atlas) PMIC and audio CODECs
-         MC13783 and MC13892.
-         This driver provides common support for accessing  the device,
+         Enable support for the Freescale MC13783 and MC13892 PMICs.
+         This driver provides common support for accessing the device,
          additional drivers must be enabled in order to use the
          functionality of the device.
  
+ config MFD_MC13XXX_SPI
+       tristate "Freescale MC13783 and MC13892 SPI interface"
+       depends on SPI_MASTER
+       select REGMAP_SPI
+       select MFD_MC13XXX
+       help
+         Select this if your MC13xxx is connected via an SPI bus.
+ config MFD_MC13XXX_I2C
+       tristate "Freescale MC13892 I2C interface"
+       depends on I2C
+       select REGMAP_I2C
+       select MFD_MC13XXX
+       help
+         Select this if your MC13xxx is connected via an I2C bus.
  config ABX500_CORE
        bool "ST-Ericsson ABX500 Mixed Signal Circuit register functions"
        default y if ARCH_U300 || ARCH_U8500
@@@ -649,9 -691,26 +692,9 @@@ config EZX_PCA
          This enables the PCAP ASIC present on EZX Phones. This is
          needed for MMC, TouchScreen, Sound, USB, etc..
  
 -config AB5500_CORE
 -      bool "ST-Ericsson AB5500 Mixed Signal Power Management chip"
 -      depends on ABX500_CORE && MFD_DB5500_PRCMU
 -      select MFD_CORE
 -      help
 -        Select this option to enable access to AB5500 power management
 -        chip. This connects to the db5500 chip via the I2C bus via PRCMU.
 -        This chip embeds various other multimedia funtionalities as well.
 -
 -config AB5500_DEBUG
 -      bool "Enable debug info via debugfs"
 -      depends on AB5500_CORE && DEBUG_FS
 -      default y if DEBUG_FS
 -      help
 -        Select this option if you want debug information from the AB5500
 -        using the debug filesystem, debugfs.
 -
  config AB8500_CORE
        bool "ST-Ericsson AB8500 Mixed Signal Power Management chip"
-       depends on GENERIC_HARDIRQS && ABX500_CORE
+       depends on GENERIC_HARDIRQS && ABX500_CORE && MFD_DB8500_PRCMU
        select MFD_CORE
        help
          Select this option to enable access to AB8500 power management
@@@ -695,6 -754,16 +738,6 @@@ config MFD_DB8500_PRCM
          system controller running an XP70 microprocessor, which is accessed
          through a register map.
  
 -config MFD_DB5500_PRCMU
 -      bool "ST-Ericsson DB5500 Power Reset Control Management Unit"
 -      depends on UX500_SOC_DB5500
 -      select MFD_CORE
 -      help
 -        Select this option to enable support for the DB5500 Power Reset
 -        and Control Management Unit. This is basically an autonomous
 -        system controller running an XP70 microprocessor, which is accessed
 -        through a register map.
 -
  config MFD_CS5535
        tristate "Support for CS5535 and CS5536 southbridge core functions"
        select MFD_CORE
@@@ -722,6 -791,16 +765,16 @@@ config LPC_SC
          LPC bridge function of the Intel SCH provides support for
          System Management Bus and General Purpose I/O.
  
+ config LPC_ICH
+       tristate "Intel ICH LPC"
+       depends on PCI
+       select MFD_CORE
+       help
+         The LPC bridge function of the Intel ICH provides support for
+         many functional units. This driver provides needed support for
+         other drivers to control these functions, currently GPIO and
+         watchdog.
  config MFD_RDC321X
        tristate "Support for RDC-R321x southbridge"
        select MFD_CORE
@@@ -854,6 -933,11 +907,11 @@@ config MFD_RC5T58
          Additional drivers must be enabled in order to use the
          different functionality of the device.
  
+ config MFD_STA2X11
+       bool "STA2X11 multi function device support"
+       depends on STA2X11
+       select MFD_CORE
  config MFD_ANATOP
        bool "Support for Freescale i.MX on-chip ANATOP controller"
        depends on SOC_IMX6Q
          MFD controller. This controller embeds regulator and
          thermal devices for Freescale i.MX platforms.
  
 +config MFD_PALMAS
 +      bool "Support for the TI Palmas series chips"
 +      select MFD_CORE
 +      select REGMAP_I2C
 +      select REGMAP_IRQ
 +      depends on I2C=y
 +      help
 +        If you say yes here you get support for the Palmas
 +        series of PMIC chips from Texas Instruments.
 +
  endmenu
  endif
  
diff --combined drivers/mfd/Makefile
@@@ -15,6 -15,7 +15,7 @@@ obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)  +
  obj-$(CONFIG_MFD_DM355EVM_MSP)        += dm355evm_msp.o
  obj-$(CONFIG_MFD_TI_SSP)      += ti-ssp.o
  
+ obj-$(CONFIG_MFD_STA2X11)     += sta2x11-mfd.o
  obj-$(CONFIG_MFD_STMPE)               += stmpe.o
  obj-$(CONFIG_STMPE_I2C)               += stmpe-i2c.o
  obj-$(CONFIG_STMPE_SPI)               += stmpe-spi.o
@@@ -54,6 -55,8 +55,8 @@@ obj-$(CONFIG_TWL6030_PWM)     += twl6030-pw
  obj-$(CONFIG_TWL6040_CORE)    += twl6040-core.o twl6040-irq.o
  
  obj-$(CONFIG_MFD_MC13XXX)     += mc13xxx-core.o
+ obj-$(CONFIG_MFD_MC13XXX_SPI) += mc13xxx-spi.o
+ obj-$(CONFIG_MFD_MC13XXX_I2C) += mc13xxx-i2c.o
  
  obj-$(CONFIG_MFD_CORE)                += mfd-core.o
  
@@@ -75,6 -78,7 +78,7 @@@ obj-$(CONFIG_PMIC_DA9052)     += da9052-cor
  obj-$(CONFIG_MFD_DA9052_SPI)  += da9052-spi.o
  obj-$(CONFIG_MFD_DA9052_I2C)  += da9052-i2c.o
  
+ obj-$(CONFIG_MFD_MAX77693)    += max77693.o max77693-irq.o
  max8925-objs                  := max8925-core.o max8925-i2c.o
  obj-$(CONFIG_MFD_MAX8925)     += max8925.o
  obj-$(CONFIG_MFD_MAX8997)     += max8997.o max8997-irq.o
@@@ -87,15 -91,18 +91,15 @@@ obj-$(CONFIG_PCF50633_GPIO)        += pcf50633
  obj-$(CONFIG_ABX500_CORE)     += abx500-core.o
  obj-$(CONFIG_AB3100_CORE)     += ab3100-core.o
  obj-$(CONFIG_AB3100_OTP)      += ab3100-otp.o
- obj-$(CONFIG_AB8500_CORE)     += ab8500-core.o ab8500-sysctrl.o
 -obj-$(CONFIG_AB5500_CORE)     += ab5500-core.o
 -obj-$(CONFIG_AB5500_DEBUG)    += ab5500-debugfs.o
  obj-$(CONFIG_AB8500_DEBUG)    += ab8500-debugfs.o
  obj-$(CONFIG_AB8500_GPADC)    += ab8500-gpadc.o
  obj-$(CONFIG_MFD_DB8500_PRCMU)        += db8500-prcmu.o
- # ab8500-i2c need to come after db8500-prcmu (which provides the channel)
- obj-$(CONFIG_AB8500_I2C_CORE) += ab8500-i2c.o
+ # ab8500-core need to come after db8500-prcmu (which provides the channel)
+ obj-$(CONFIG_AB8500_CORE)     += ab8500-core.o ab8500-sysctrl.o
 -obj-$(CONFIG_MFD_DB5500_PRCMU)        += db5500-prcmu.o
  obj-$(CONFIG_MFD_TIMBERDALE)    += timberdale.o
  obj-$(CONFIG_PMIC_ADP5520)    += adp5520.o
  obj-$(CONFIG_LPC_SCH)         += lpc_sch.o
+ obj-$(CONFIG_LPC_ICH)         += lpc_ich.o
  obj-$(CONFIG_MFD_RDC321X)     += rdc321x-southbridge.o
  obj-$(CONFIG_MFD_JANZ_CMODIO) += janz-cmodio.o
  obj-$(CONFIG_MFD_JZ4740_ADC)  += jz4740-adc.o
@@@ -110,7 -117,6 +114,7 @@@ obj-$(CONFIG_TPS65911_COMPARATOR)  += tp
  obj-$(CONFIG_MFD_TPS65090)    += tps65090.o
  obj-$(CONFIG_MFD_AAT2870_CORE)        += aat2870-core.o
  obj-$(CONFIG_MFD_INTEL_MSIC)  += intel_msic.o
 +obj-$(CONFIG_MFD_PALMAS)      += palmas.o
  obj-$(CONFIG_MFD_RC5T583)     += rc5t583.o rc5t583-irq.o
  obj-$(CONFIG_MFD_S5M_CORE)    += s5m-core.o s5m-irq.o
  obj-$(CONFIG_MFD_ANATOP)      += anatop-mfd.o
@@@ -318,6 -318,135 +318,135 @@@ static bool da9052_reg_volatile(struct 
        }
  }
  
+ /*
+  * TBAT look-up table is computed from the R90 reg (8 bit register)
+  * reading as below. The battery temperature is in milliCentigrade
+  * TBAT = (1/(t1+1/298) - 273) * 1000 mC
+  * where t1 = (1/B)* ln(( ADCval * 2.5)/(R25*ITBAT*255))
+  * Default values are R25 = 10e3, B = 3380, ITBAT = 50e-6
+  * Example:
+  * R25=10E3, B=3380, ITBAT=50e-6, ADCVAL=62d calculates
+  * TBAT = 20015 mili degrees Centrigrade
+  *
+ */
+ static const int32_t tbat_lookup[255] = {
+       183258, 144221, 124334, 111336, 101826, 94397, 88343, 83257,
+       78889, 75071, 71688, 68656, 65914, 63414, 61120, 59001,
+       570366, 55204, 53490, 51881, 50364, 48931, 47574, 46285,
+       45059, 43889, 42772, 41703, 40678, 39694, 38748, 37838,
+       36961, 36115, 35297, 34507, 33743, 33002, 32284, 31588,
+       30911, 30254, 29615, 28994, 28389, 27799, 27225, 26664,
+       26117, 25584, 25062, 24553, 24054, 23567, 23091, 22624,
+       22167, 21719, 21281, 20851, 20429, 20015, 19610, 19211,
+       18820, 18436, 18058, 17688, 17323, 16965, 16612, 16266,
+       15925, 15589, 15259, 14933, 14613, 14298, 13987, 13681,
+       13379, 13082, 12788, 12499, 12214, 11933, 11655, 11382,
+       11112, 10845, 10582, 10322, 10066, 9812, 9562, 9315,
+       9071, 8830, 8591, 8356, 8123, 7893, 7665, 7440,
+       7218, 6998, 6780, 6565, 6352, 6141, 5933, 5726,
+       5522, 5320, 5120, 4922, 4726, 4532, 4340, 4149,
+       3961, 3774, 3589, 3406, 3225, 3045, 2867, 2690,
+       2516, 2342, 2170, 2000, 1831, 1664, 1498, 1334,
+       1171, 1009, 849, 690, 532, 376, 221, 67,
+       -84, -236, -386, -535, -683, -830, -975, -1119,
+       -1263, -1405, -1546, -1686, -1825, -1964, -2101, -2237,
+       -2372, -2506, -2639, -2771, -2902, -3033, -3162, -3291,
+       -3418, -3545, -3671, -3796, -3920, -4044, -4166, -4288,
+       -4409, -4529, -4649, -4767, -4885, -5002, -5119, -5235,
+       -5349, -5464, -5577, -5690, -5802, -5913, -6024, -6134,
+       -6244, -6352, -6461, -6568, -6675, -6781, -6887, -6992,
+       -7096, -7200, -7303, -7406, -7508, -7609, -7710, -7810,
+       -7910, -8009, -8108, -8206, -8304, -8401, -8497, -8593,
+       -8689, -8784, -8878, -8972, -9066, -9159, -9251, -9343,
+       -9435, -9526, -9617, -9707, -9796, -9886, -9975, -10063,
+       -10151, -10238, -10325, -10412, -10839, -10923, -11007, -11090,
+       -11173, -11256, -11338, -11420, -11501, -11583, -11663, -11744,
+       -11823, -11903, -11982
+ };
+ static const u8 chan_mux[DA9052_ADC_VBBAT + 1] = {
+       [DA9052_ADC_VDDOUT]     = DA9052_ADC_MAN_MUXSEL_VDDOUT,
+       [DA9052_ADC_ICH]        = DA9052_ADC_MAN_MUXSEL_ICH,
+       [DA9052_ADC_TBAT]       = DA9052_ADC_MAN_MUXSEL_TBAT,
+       [DA9052_ADC_VBAT]       = DA9052_ADC_MAN_MUXSEL_VBAT,
+       [DA9052_ADC_IN4]        = DA9052_ADC_MAN_MUXSEL_AD4,
+       [DA9052_ADC_IN5]        = DA9052_ADC_MAN_MUXSEL_AD5,
+       [DA9052_ADC_IN6]        = DA9052_ADC_MAN_MUXSEL_AD6,
+       [DA9052_ADC_VBBAT]      = DA9052_ADC_MAN_MUXSEL_VBBAT
+ };
+ int da9052_adc_manual_read(struct da9052 *da9052, unsigned char channel)
+ {
+       int ret;
+       unsigned short calc_data;
+       unsigned short data;
+       unsigned char mux_sel;
+       if (channel > DA9052_ADC_VBBAT)
+               return -EINVAL;
+       mutex_lock(&da9052->auxadc_lock);
+       /* Channel gets activated on enabling the Conversion bit */
+       mux_sel = chan_mux[channel] | DA9052_ADC_MAN_MAN_CONV;
+       ret = da9052_reg_write(da9052, DA9052_ADC_MAN_REG, mux_sel);
+       if (ret < 0)
+               goto err;
+       /* Wait for an interrupt */
+       if (!wait_for_completion_timeout(&da9052->done,
+                                        msecs_to_jiffies(500))) {
+               dev_err(da9052->dev,
+                       "timeout waiting for ADC conversion interrupt\n");
+               ret = -ETIMEDOUT;
+               goto err;
+       }
+       ret = da9052_reg_read(da9052, DA9052_ADC_RES_H_REG);
+       if (ret < 0)
+               goto err;
+       calc_data = (unsigned short)ret;
+       data = calc_data << 2;
+       ret = da9052_reg_read(da9052, DA9052_ADC_RES_L_REG);
+       if (ret < 0)
+               goto err;
+       calc_data = (unsigned short)(ret & DA9052_ADC_RES_LSB);
+       data |= calc_data;
+       ret = data;
+ err:
+       mutex_unlock(&da9052->auxadc_lock);
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(da9052_adc_manual_read);
+ static irqreturn_t da9052_auxadc_irq(int irq, void *irq_data)
+ {
+       struct da9052 *da9052 = irq_data;
+       complete(&da9052->done);
+       return IRQ_HANDLED;
+ }
+ int da9052_adc_read_temp(struct da9052 *da9052)
+ {
+       int tbat;
+       tbat = da9052_reg_read(da9052, DA9052_TBAT_RES_REG);
+       if (tbat <= 0)
+               return tbat;
+       /* ARRAY_SIZE check is not needed since TBAT is a 8-bit register */
+       return tbat_lookup[tbat - 1];
+ }
+ EXPORT_SYMBOL_GPL(da9052_adc_read_temp);
  static struct resource da9052_rtc_resource = {
        .name = "ALM",
        .start = DA9052_IRQ_ALARM,
@@@ -646,6 -775,9 +775,9 @@@ int __devinit da9052_device_init(struc
        struct irq_desc *desc;
        int ret;
  
+       mutex_init(&da9052->auxadc_lock);
+       init_completion(&da9052->done);
        if (pdata && pdata->init != NULL)
                pdata->init(da9052);
  
        ret = regmap_add_irq_chip(da9052->regmap, da9052->chip_irq,
                                  IRQF_TRIGGER_LOW | IRQF_ONESHOT,
                                  da9052->irq_base, &da9052_regmap_irq_chip,
 -                                NULL);
 +                                &da9052->irq_data);
        if (ret < 0)
                goto regmap_err;
  
 -      desc = irq_to_desc(da9052->chip_irq);
 -      da9052->irq_base = regmap_irq_chip_get_base(desc->action->dev_id);
 +      da9052->irq_base = regmap_irq_chip_get_base(da9052->irq_data);
  
+       ret = request_threaded_irq(DA9052_IRQ_ADC_EOM, NULL, da9052_auxadc_irq,
+                                  IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+                                  "adc irq", da9052);
+       if (ret != 0)
+               dev_err(da9052->dev, "DA9052 ADC IRQ failed ret=%d\n", ret);
        ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info,
                              ARRAY_SIZE(da9052_subdev_info), NULL, 0);
        if (ret)
        return 0;
  
  err:
+       free_irq(DA9052_IRQ_ADC_EOM, da9052);
        mfd_remove_devices(da9052->dev);
  regmap_err:
        return ret;
  
  void da9052_device_exit(struct da9052 *da9052)
  {
 -      regmap_del_irq_chip(da9052->chip_irq,
 -                          irq_get_irq_data(da9052->irq_base)->chip_data);
+       free_irq(DA9052_IRQ_ADC_EOM, da9052);
 +      regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data);
        mfd_remove_devices(da9052->dev);
  }
  
  #include <linux/platform_device.h>
  #include <linux/mutex.h>
  #include <linux/interrupt.h>
- #include <linux/spi/spi.h>
  #include <linux/mfd/core.h>
  #include <linux/mfd/mc13xxx.h>
  #include <linux/of.h>
  #include <linux/of_device.h>
  #include <linux/of_gpio.h>
  
- struct mc13xxx {
-       struct spi_device *spidev;
-       struct mutex lock;
-       int irq;
-       int flags;
-       irq_handler_t irqhandler[MC13XXX_NUM_IRQ];
-       void *irqdata[MC13XXX_NUM_IRQ];
-       int adcflags;
- };
+ #include "mc13xxx.h"
  
  #define MC13XXX_IRQSTAT0      0
  #define MC13XXX_IRQSTAT0_ADCDONEI     (1 << 0)
  
  #define MC13XXX_ADC2          45
  
- #define MC13XXX_NUMREGS 0x3f
  void mc13xxx_lock(struct mc13xxx *mc13xxx)
  {
        if (!mutex_trylock(&mc13xxx->lock)) {
-               dev_dbg(&mc13xxx->spidev->dev, "wait for %s from %pf\n",
+               dev_dbg(mc13xxx->dev, "wait for %s from %pf\n",
                                __func__, __builtin_return_address(0));
  
                mutex_lock(&mc13xxx->lock);
        }
-       dev_dbg(&mc13xxx->spidev->dev, "%s from %pf\n",
+       dev_dbg(mc13xxx->dev, "%s from %pf\n",
                        __func__, __builtin_return_address(0));
  }
  EXPORT_SYMBOL(mc13xxx_lock);
  
  void mc13xxx_unlock(struct mc13xxx *mc13xxx)
  {
-       dev_dbg(&mc13xxx->spidev->dev, "%s from %pf\n",
+       dev_dbg(mc13xxx->dev, "%s from %pf\n",
                        __func__, __builtin_return_address(0));
        mutex_unlock(&mc13xxx->lock);
  }
  EXPORT_SYMBOL(mc13xxx_unlock);
  
- #define MC13XXX_REGOFFSET_SHIFT 25
  int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)
  {
-       struct spi_transfer t;
-       struct spi_message m;
        int ret;
  
        BUG_ON(!mutex_is_locked(&mc13xxx->lock));
        if (offset > MC13XXX_NUMREGS)
                return -EINVAL;
  
-       *val = offset << MC13XXX_REGOFFSET_SHIFT;
-       memset(&t, 0, sizeof(t));
-       t.tx_buf = val;
-       t.rx_buf = val;
-       t.len = sizeof(u32);
-       spi_message_init(&m);
-       spi_message_add_tail(&t, &m);
-       ret = spi_sync(mc13xxx->spidev, &m);
-       /* error in message.status implies error return from spi_sync */
-       BUG_ON(!ret && m.status);
+       ret = regmap_read(mc13xxx->regmap, offset, val);
+       dev_vdbg(mc13xxx->dev, "[0x%02x] -> 0x%06x\n", offset, *val);
  
-       if (ret)
-               return ret;
-       *val &= 0xffffff;
-       dev_vdbg(&mc13xxx->spidev->dev, "[0x%02x] -> 0x%06x\n", offset, *val);
-       return 0;
+       return ret;
  }
  EXPORT_SYMBOL(mc13xxx_reg_read);
  
  int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)
  {
-       u32 buf;
-       struct spi_transfer t;
-       struct spi_message m;
-       int ret;
        BUG_ON(!mutex_is_locked(&mc13xxx->lock));
  
-       dev_vdbg(&mc13xxx->spidev->dev, "[0x%02x] <- 0x%06x\n", offset, val);
+       dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x\n", offset, val);
  
        if (offset > MC13XXX_NUMREGS || val > 0xffffff)
                return -EINVAL;
  
-       buf = 1 << 31 | offset << MC13XXX_REGOFFSET_SHIFT | val;
-       memset(&t, 0, sizeof(t));
-       t.tx_buf = &buf;
-       t.rx_buf = &buf;
-       t.len = sizeof(u32);
-       spi_message_init(&m);
-       spi_message_add_tail(&t, &m);
-       ret = spi_sync(mc13xxx->spidev, &m);
-       BUG_ON(!ret && m.status);
-       if (ret)
-               return ret;
-       return 0;
+       return regmap_write(mc13xxx->regmap, offset, val);
  }
  EXPORT_SYMBOL(mc13xxx_reg_write);
  
  int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset,
                u32 mask, u32 val)
  {
-       int ret;
-       u32 valread;
+       BUG_ON(!mutex_is_locked(&mc13xxx->lock));
        BUG_ON(val & ~mask);
+       dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x (mask: 0x%06x)\n",
+                       offset, val, mask);
  
-       ret = mc13xxx_reg_read(mc13xxx, offset, &valread);
-       if (ret)
-               return ret;
-       valread = (valread & ~mask) | val;
-       return mc13xxx_reg_write(mc13xxx, offset, valread);
+       return regmap_update_bits(mc13xxx->regmap, offset, mask, val);
  }
  EXPORT_SYMBOL(mc13xxx_reg_rmw);
  
@@@ -439,7 -374,7 +374,7 @@@ static int mc13xxx_irq_handle(struct mc
                        if (handled == IRQ_HANDLED)
                                num_handled++;
                } else {
-                       dev_err(&mc13xxx->spidev->dev,
+                       dev_err(mc13xxx->dev,
                                        "BUG: irq %u but no handler\n",
                                        baseirq + irq);
  
@@@ -475,25 -410,23 +410,23 @@@ static irqreturn_t mc13xxx_irq_thread(i
        return IRQ_RETVAL(handled);
  }
  
- enum mc13xxx_id {
-       MC13XXX_ID_MC13783,
-       MC13XXX_ID_MC13892,
-       MC13XXX_ID_INVALID,
- };
  static const char *mc13xxx_chipname[] = {
        [MC13XXX_ID_MC13783] = "mc13783",
        [MC13XXX_ID_MC13892] = "mc13892",
  };
  
  #define maskval(reg, mask)    (((reg) & (mask)) >> __ffs(mask))
- static int mc13xxx_identify(struct mc13xxx *mc13xxx, enum mc13xxx_id *id)
+ static int mc13xxx_identify(struct mc13xxx *mc13xxx)
  {
        u32 icid;
        u32 revision;
-       const char *name;
        int ret;
  
+       /*
+        * Get the generation ID from register 46, as apparently some older
+        * IC revisions only have this info at this location. Newer ICs seem to
+        * have both.
+        */
        ret = mc13xxx_reg_read(mc13xxx, 46, &icid);
        if (ret)
                return ret;
  
        switch (icid) {
        case 2:
-               *id = MC13XXX_ID_MC13783;
-               name = "mc13783";
+               mc13xxx->ictype = MC13XXX_ID_MC13783;
                break;
        case 7:
-               *id = MC13XXX_ID_MC13892;
-               name = "mc13892";
+               mc13xxx->ictype = MC13XXX_ID_MC13892;
                break;
        default:
-               *id = MC13XXX_ID_INVALID;
+               mc13xxx->ictype = MC13XXX_ID_INVALID;
                break;
        }
  
-       if (*id == MC13XXX_ID_MC13783 || *id == MC13XXX_ID_MC13892) {
+       if (mc13xxx->ictype == MC13XXX_ID_MC13783 ||
+                       mc13xxx->ictype == MC13XXX_ID_MC13892) {
                ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision);
-               if (ret)
-                       return ret;
  
-               dev_info(&mc13xxx->spidev->dev, "%s: rev: %d.%d, "
+               dev_info(mc13xxx->dev, "%s: rev: %d.%d, "
                                "fin: %d, fab: %d, icid: %d/%d\n",
-                               mc13xxx_chipname[*id],
+                               mc13xxx_chipname[mc13xxx->ictype],
                                maskval(revision, MC13XXX_REVISION_REVFULL),
                                maskval(revision, MC13XXX_REVISION_REVMETAL),
                                maskval(revision, MC13XXX_REVISION_FIN),
                                maskval(revision, MC13XXX_REVISION_ICIDCODE));
        }
  
-       if (*id != MC13XXX_ID_INVALID) {
-               const struct spi_device_id *devid =
-                       spi_get_device_id(mc13xxx->spidev);
-               if (!devid || devid->driver_data != *id)
-                       dev_warn(&mc13xxx->spidev->dev, "device id doesn't "
-                                       "match auto detection!\n");
-       }
-       return 0;
+       return (mc13xxx->ictype == MC13XXX_ID_INVALID) ? -ENODEV : 0;
  }
  
  static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx)
  {
-       const struct spi_device_id *devid =
-               spi_get_device_id(mc13xxx->spidev);
-       if (!devid)
-               return NULL;
-       return mc13xxx_chipname[devid->driver_data];
+       return mc13xxx_chipname[mc13xxx->ictype];
  }
  
  int mc13xxx_get_flags(struct mc13xxx *mc13xxx)
@@@ -592,7 -508,7 +508,7 @@@ int mc13xxx_adc_do_conversion(struct mc
        };
        init_completion(&adcdone_data.done);
  
-       dev_dbg(&mc13xxx->spidev->dev, "%s\n", __func__);
+       dev_dbg(mc13xxx->dev, "%s\n", __func__);
  
        mc13xxx_lock(mc13xxx);
  
        adc1 |= ato << MC13783_ADC1_ATO_SHIFT;
        if (atox)
                adc1 |= MC13783_ADC1_ATOX;
-       dev_dbg(&mc13xxx->spidev->dev, "%s: request irq\n", __func__);
+       dev_dbg(mc13xxx->dev, "%s: request irq\n", __func__);
        mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_ADCDONE,
                        mc13xxx_handler_adcdone, __func__, &adcdone_data);
        mc13xxx_irq_ack(mc13xxx, MC13XXX_IRQ_ADCDONE);
@@@ -695,7 -612,7 +612,7 @@@ static int mc13xxx_add_subdevice_pdata(
        if (!cell.name)
                return -ENOMEM;
  
-       return mfd_add_devices(&mc13xxx->spidev->dev, -1, &cell, 1, NULL, 0);
+       return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0);
  }
  
  static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)
  #ifdef CONFIG_OF
  static int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx)
  {
-       struct device_node *np = mc13xxx->spidev->dev.of_node;
+       struct device_node *np = mc13xxx->dev->of_node;
  
        if (!np)
                return -ENODEV;
@@@ -732,55 -649,15 +649,15 @@@ static inline int mc13xxx_probe_flags_d
  }
  #endif
  
- static const struct spi_device_id mc13xxx_device_id[] = {
-       {
-               .name = "mc13783",
-               .driver_data = MC13XXX_ID_MC13783,
-       }, {
-               .name = "mc13892",
-               .driver_data = MC13XXX_ID_MC13892,
-       }, {
-               /* sentinel */
-       }
- };
- MODULE_DEVICE_TABLE(spi, mc13xxx_device_id);
- static const struct of_device_id mc13xxx_dt_ids[] = {
-       { .compatible = "fsl,mc13783", .data = (void *) MC13XXX_ID_MC13783, },
-       { .compatible = "fsl,mc13892", .data = (void *) MC13XXX_ID_MC13892, },
-       { /* sentinel */ }
- };
- MODULE_DEVICE_TABLE(of, mc13xxx_dt_ids);
- static int mc13xxx_probe(struct spi_device *spi)
+ int mc13xxx_common_init(struct mc13xxx *mc13xxx,
+               struct mc13xxx_platform_data *pdata, int irq)
  {
-       const struct of_device_id *of_id;
-       struct spi_driver *sdrv = to_spi_driver(spi->dev.driver);
-       struct mc13xxx *mc13xxx;
-       struct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev);
-       enum mc13xxx_id id;
        int ret;
  
-       of_id = of_match_device(mc13xxx_dt_ids, &spi->dev);
-       if (of_id)
-               sdrv->id_table = &mc13xxx_device_id[(enum mc13xxx_id) of_id->data];
-       mc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL);
-       if (!mc13xxx)
-               return -ENOMEM;
-       dev_set_drvdata(&spi->dev, mc13xxx);
-       spi->mode = SPI_MODE_0 | SPI_CS_HIGH;
-       spi->bits_per_word = 32;
-       spi_setup(spi);
-       mc13xxx->spidev = spi;
-       mutex_init(&mc13xxx->lock);
        mc13xxx_lock(mc13xxx);
  
-       ret = mc13xxx_identify(mc13xxx, &id);
-       if (ret || id == MC13XXX_ID_INVALID)
+       ret = mc13xxx_identify(mc13xxx);
+       if (ret)
                goto err_revision;
  
        /* mask all irqs */
        if (ret)
                goto err_mask;
  
-       ret = request_threaded_irq(spi->irq, NULL, mc13xxx_irq_thread,
+       ret = request_threaded_irq(irq, NULL, mc13xxx_irq_thread,
                        IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx);
  
        if (ret) {
  err_mask:
  err_revision:
                mc13xxx_unlock(mc13xxx);
-               dev_set_drvdata(&spi->dev, NULL);
                kfree(mc13xxx);
                return ret;
        }
  
+       mc13xxx->irq = irq;
        mc13xxx_unlock(mc13xxx);
  
        if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata)
                mc13xxx_add_subdevice(mc13xxx, "%s-adc");
  
        if (mc13xxx->flags & MC13XXX_USE_CODEC)
 -              mc13xxx_add_subdevice(mc13xxx, "%s-codec");
 +              mc13xxx_add_subdevice_pdata(mc13xxx, "%s-codec",
 +                                      pdata->codec, sizeof(*pdata->codec));
  
        if (mc13xxx->flags & MC13XXX_USE_RTC)
                mc13xxx_add_subdevice(mc13xxx, "%s-rtc");
  
        return 0;
  }
+ EXPORT_SYMBOL_GPL(mc13xxx_common_init);
  
static int __devexit mc13xxx_remove(struct spi_device *spi)
void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx)
  {
-       struct mc13xxx *mc13xxx = dev_get_drvdata(&spi->dev);
+       free_irq(mc13xxx->irq, mc13xxx);
  
-       free_irq(mc13xxx->spidev->irq, mc13xxx);
+       mfd_remove_devices(mc13xxx->dev);
  
-       mfd_remove_devices(&spi->dev);
+       regmap_exit(mc13xxx->regmap);
  
        kfree(mc13xxx);
-       return 0;
- }
- static struct spi_driver mc13xxx_driver = {
-       .id_table = mc13xxx_device_id,
-       .driver = {
-               .name = "mc13xxx",
-               .owner = THIS_MODULE,
-               .of_match_table = mc13xxx_dt_ids,
-       },
-       .probe = mc13xxx_probe,
-       .remove = __devexit_p(mc13xxx_remove),
- };
- static int __init mc13xxx_init(void)
- {
-       return spi_register_driver(&mc13xxx_driver);
- }
- subsys_initcall(mc13xxx_init);
- static void __exit mc13xxx_exit(void)
- {
-       spi_unregister_driver(&mc13xxx_driver);
  }
module_exit(mc13xxx_exit);
EXPORT_SYMBOL_GPL(mc13xxx_common_cleanup);
  
  MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC");
  MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>");
diff --combined drivers/mfd/tps65090.c
@@@ -78,6 -78,17 +78,6 @@@ static struct mfd_cell tps65090s[] = 
        },
  };
  
 -struct tps65090 {
 -      struct mutex            lock;
 -      struct device           *dev;
 -      struct i2c_client       *client;
 -      struct regmap           *rmap;
 -      struct irq_chip         irq_chip;
 -      struct mutex            irq_lock;
 -      int                     irq_base;
 -      unsigned int            id;
 -};
 -
  int tps65090_write(struct device *dev, int reg, uint8_t val)
  {
        struct tps65090 *tps = dev_get_drvdata(dev);
@@@ -283,27 -294,24 +283,24 @@@ static int __devinit tps65090_i2c_probe
                }
        }
  
-       tps65090->rmap = regmap_init_i2c(tps65090->client,
-               &tps65090_regmap_config);
+       tps65090->rmap = devm_regmap_init_i2c(tps65090->client,
+                                             &tps65090_regmap_config);
        if (IS_ERR(tps65090->rmap)) {
-               dev_err(&client->dev, "regmap_init failed with err: %ld\n",
-                       PTR_ERR(tps65090->rmap));
+               ret = PTR_ERR(tps65090->rmap);
+               dev_err(&client->dev, "regmap_init failed with err: %d\n", ret);
                goto err_irq_exit;
-       };
+       }
  
        ret = mfd_add_devices(tps65090->dev, -1, tps65090s,
                ARRAY_SIZE(tps65090s), NULL, 0);
        if (ret) {
                dev_err(&client->dev, "add mfd devices failed with err: %d\n",
                        ret);
-               goto err_regmap_exit;
+               goto err_irq_exit;
        }
  
        return 0;
  
- err_regmap_exit:
-       regmap_exit(tps65090->rmap);
  err_irq_exit:
        if (client->irq)
                free_irq(client->irq, tps65090);
@@@ -316,29 -324,34 +313,34 @@@ static int __devexit tps65090_i2c_remov
        struct tps65090 *tps65090 = i2c_get_clientdata(client);
  
        mfd_remove_devices(tps65090->dev);
-       regmap_exit(tps65090->rmap);
        if (client->irq)
                free_irq(client->irq, tps65090);
  
        return 0;
  }
  
- #ifdef CONFIG_PM
- static int tps65090_i2c_suspend(struct i2c_client *client, pm_message_t state)
+ #ifdef CONFIG_PM_SLEEP
+ static int tps65090_suspend(struct device *dev)
  {
+       struct i2c_client *client = to_i2c_client(dev);
        if (client->irq)
                disable_irq(client->irq);
        return 0;
  }
  
- static int tps65090_i2c_resume(struct i2c_client *client)
+ static int tps65090_resume(struct device *dev)
  {
+       struct i2c_client *client = to_i2c_client(dev);
        if (client->irq)
                enable_irq(client->irq);
        return 0;
  }
  #endif
  
+ static const struct dev_pm_ops tps65090_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(tps65090_suspend, tps65090_resume)
+ };
  static const struct i2c_device_id tps65090_id_table[] = {
        { "tps65090", 0 },
        { },
@@@ -349,13 -362,10 +351,10 @@@ static struct i2c_driver tps65090_drive
        .driver = {
                .name   = "tps65090",
                .owner  = THIS_MODULE,
+               .pm     = &tps65090_pm_ops,
        },
        .probe          = tps65090_i2c_probe,
        .remove         = __devexit_p(tps65090_i2c_remove),
- #ifdef CONFIG_PM
-       .suspend        = tps65090_i2c_suspend,
-       .resume         = tps65090_i2c_resume,
- #endif
        .id_table       = tps65090_id_table,
  };
  
@@@ -47,7 -47,7 +47,7 @@@ static int anatop_set_voltage(struct re
                                  int max_uV, unsigned *selector)
  {
        struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
-       u32 val, sel;
+       u32 val, sel, mask;
        int uv;
  
        uv = min_uV;
        val = anatop_reg->min_bit_val + sel;
        *selector = sel;
        dev_dbg(&reg->dev, "%s: calculated val %d\n", __func__, val);
-       anatop_set_bits(anatop_reg->mfd,
-                       anatop_reg->control_reg,
-                       anatop_reg->vol_bit_shift,
-                       anatop_reg->vol_bit_width,
-                       val);
+       mask = ((1 << anatop_reg->vol_bit_width) - 1) <<
+               anatop_reg->vol_bit_shift;
+       val <<= anatop_reg->vol_bit_shift;
+       anatop_write_reg(anatop_reg->mfd, anatop_reg->control_reg, val, mask);
  
        return 0;
  }
@@@ -88,10 -87,9 +87,9 @@@ static int anatop_get_voltage_sel(struc
        if (!anatop_reg->control_reg)
                return -ENOTSUPP;
  
-       val = anatop_get_bits(anatop_reg->mfd,
-                             anatop_reg->control_reg,
-                             anatop_reg->vol_bit_shift,
-                             anatop_reg->vol_bit_width);
+       val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg);
+       val = (val & ((1 << anatop_reg->vol_bit_width) - 1)) >>
+               anatop_reg->vol_bit_shift;
  
        return val - anatop_reg->min_bit_val;
  }
@@@ -122,7 -120,6 +120,7 @@@ static int __devinit anatop_regulator_p
        struct anatop_regulator *sreg;
        struct regulator_init_data *initdata;
        struct anatop *anatopmfd = dev_get_drvdata(pdev->dev.parent);
 +      struct regulator_config config = { };
        int ret = 0;
  
        initdata = of_get_regulator_init_data(dev, np);
        rdesc->n_voltages = (sreg->max_voltage - sreg->min_voltage)
                / 25000 + 1;
  
 +      config.dev = &pdev->dev;
 +      config.init_data = initdata;
 +      config.driver_data = sreg;
 +      config.of_node = pdev->dev.of_node;
 +
        /* register regulator */
 -      rdev = regulator_register(rdesc, dev,
 -                                initdata, sreg, pdev->dev.of_node);
 +      rdev = regulator_register(rdesc, &config);
        if (IS_ERR(rdev)) {
                dev_err(dev, "failed to register %s\n",
                        rdesc->name);
  #include <linux/platform_device.h>
  #include <linux/regulator/driver.h>
  #include <linux/regulator/machine.h>
 -#include <linux/delay.h>
  #include <linux/slab.h>
  #include <linux/gpio.h>
  #include <linux/mfd/tps65910.h>
 +#include <linux/regulator/of_regulator.h>
  
  #define TPS65910_SUPPLY_STATE_ENABLED 0x1
  #define EXT_SLEEP_CONTROL (TPS65910_SLEEP_CONTROL_EXT_INPUT_EN1 |     \
                        TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3 |          \
                        TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP)
  
 -/* supported VIO voltages in milivolts */
 +/* supported VIO voltages in millivolts */
  static const u16 VIO_VSEL_table[] = {
        1500, 1800, 2500, 3300,
  };
  
  /* VSEL tables for TPS65910 specific LDOs and dcdc's */
  
 -/* supported VDD3 voltages in milivolts */
 +/* supported VDD3 voltages in millivolts */
  static const u16 VDD3_VSEL_table[] = {
        5000,
  };
  
 -/* supported VDIG1 voltages in milivolts */
 +/* supported VDIG1 voltages in millivolts */
  static const u16 VDIG1_VSEL_table[] = {
        1200, 1500, 1800, 2700,
  };
  
 -/* supported VDIG2 voltages in milivolts */
 +/* supported VDIG2 voltages in millivolts */
  static const u16 VDIG2_VSEL_table[] = {
        1000, 1100, 1200, 1800,
  };
  
 -/* supported VPLL voltages in milivolts */
 +/* supported VPLL voltages in millivolts */
  static const u16 VPLL_VSEL_table[] = {
        1000, 1100, 1800, 2500,
  };
  
 -/* supported VDAC voltages in milivolts */
 +/* supported VDAC voltages in millivolts */
  static const u16 VDAC_VSEL_table[] = {
        1800, 2600, 2800, 2850,
  };
  
 -/* supported VAUX1 voltages in milivolts */
 +/* supported VAUX1 voltages in millivolts */
  static const u16 VAUX1_VSEL_table[] = {
        1800, 2500, 2800, 2850,
  };
  
 -/* supported VAUX2 voltages in milivolts */
 +/* supported VAUX2 voltages in millivolts */
  static const u16 VAUX2_VSEL_table[] = {
        1800, 2800, 2900, 3300,
  };
  
 -/* supported VAUX33 voltages in milivolts */
 +/* supported VAUX33 voltages in millivolts */
  static const u16 VAUX33_VSEL_table[] = {
        1800, 2000, 2800, 3300,
  };
  
 -/* supported VMMC voltages in milivolts */
 +/* supported VMMC voltages in millivolts */
  static const u16 VMMC_VSEL_table[] = {
        1800, 2800, 3000, 3300,
  };
@@@ -94,11 -94,11 +94,11 @@@ struct tps_info 
  
  static struct tps_info tps65910_regs[] = {
        {
 -              .name = "VRTC",
 +              .name = "vrtc",
                .enable_time_us = 2200,
        },
        {
 -              .name = "VIO",
 +              .name = "vio",
                .min_uV = 1500000,
                .max_uV = 3300000,
                .n_voltages = ARRAY_SIZE(VIO_VSEL_table),
                .enable_time_us = 350,
        },
        {
 -              .name = "VDD1",
 +              .name = "vdd1",
                .min_uV = 600000,
                .max_uV = 4500000,
                .enable_time_us = 350,
        },
        {
 -              .name = "VDD2",
 +              .name = "vdd2",
                .min_uV = 600000,
                .max_uV = 4500000,
                .enable_time_us = 350,
        },
        {
 -              .name = "VDD3",
 +              .name = "vdd3",
                .min_uV = 5000000,
                .max_uV = 5000000,
                .n_voltages = ARRAY_SIZE(VDD3_VSEL_table),
                .enable_time_us = 200,
        },
        {
 -              .name = "VDIG1",
 +              .name = "vdig1",
                .min_uV = 1200000,
                .max_uV = 2700000,
                .n_voltages = ARRAY_SIZE(VDIG1_VSEL_table),
                .enable_time_us = 100,
        },
        {
 -              .name = "VDIG2",
 +              .name = "vdig2",
                .min_uV = 1000000,
                .max_uV = 1800000,
                .n_voltages = ARRAY_SIZE(VDIG2_VSEL_table),
                .enable_time_us = 100,
        },
        {
 -              .name = "VPLL",
 +              .name = "vpll",
                .min_uV = 1000000,
                .max_uV = 2500000,
                .n_voltages = ARRAY_SIZE(VPLL_VSEL_table),
                .enable_time_us = 100,
        },
        {
 -              .name = "VDAC",
 +              .name = "vdac",
                .min_uV = 1800000,
                .max_uV = 2850000,
                .n_voltages = ARRAY_SIZE(VDAC_VSEL_table),
                .enable_time_us = 100,
        },
        {
 -              .name = "VAUX1",
 +              .name = "vaux1",
                .min_uV = 1800000,
                .max_uV = 2850000,
                .n_voltages = ARRAY_SIZE(VAUX1_VSEL_table),
                .enable_time_us = 100,
        },
        {
 -              .name = "VAUX2",
 +              .name = "vaux2",
                .min_uV = 1800000,
                .max_uV = 3300000,
                .n_voltages = ARRAY_SIZE(VAUX2_VSEL_table),
                .enable_time_us = 100,
        },
        {
 -              .name = "VAUX33",
 +              .name = "vaux33",
                .min_uV = 1800000,
                .max_uV = 3300000,
                .n_voltages = ARRAY_SIZE(VAUX33_VSEL_table),
                .enable_time_us = 100,
        },
        {
 -              .name = "VMMC",
 +              .name = "vmmc",
                .min_uV = 1800000,
                .max_uV = 3300000,
                .n_voltages = ARRAY_SIZE(VMMC_VSEL_table),
  
  static struct tps_info tps65911_regs[] = {
        {
 -              .name = "VRTC",
 +              .name = "vrtc",
                .enable_time_us = 2200,
        },
        {
 -              .name = "VIO",
 +              .name = "vio",
                .min_uV = 1500000,
                .max_uV = 3300000,
                .n_voltages = ARRAY_SIZE(VIO_VSEL_table),
                .enable_time_us = 350,
        },
        {
 -              .name = "VDD1",
 +              .name = "vdd1",
                .min_uV = 600000,
                .max_uV = 4500000,
                .n_voltages = 73,
                .enable_time_us = 350,
        },
        {
 -              .name = "VDD2",
 +              .name = "vdd2",
                .min_uV = 600000,
                .max_uV = 4500000,
                .n_voltages = 73,
                .enable_time_us = 350,
        },
        {
 -              .name = "VDDCTRL",
 +              .name = "vddctrl",
                .min_uV = 600000,
                .max_uV = 1400000,
                .n_voltages = 65,
                .enable_time_us = 900,
        },
        {
 -              .name = "LDO1",
 +              .name = "ldo1",
                .min_uV = 1000000,
                .max_uV = 3300000,
                .n_voltages = 47,
                .enable_time_us = 420,
        },
        {
 -              .name = "LDO2",
 +              .name = "ldo2",
                .min_uV = 1000000,
                .max_uV = 3300000,
                .n_voltages = 47,
                .enable_time_us = 420,
        },
        {
 -              .name = "LDO3",
 +              .name = "ldo3",
                .min_uV = 1000000,
                .max_uV = 3300000,
                .n_voltages = 24,
                .enable_time_us = 230,
        },
        {
 -              .name = "LDO4",
 +              .name = "ldo4",
                .min_uV = 1000000,
                .max_uV = 3300000,
                .n_voltages = 47,
                .enable_time_us = 230,
        },
        {
 -              .name = "LDO5",
 +              .name = "ldo5",
                .min_uV = 1000000,
                .max_uV = 3300000,
                .n_voltages = 24,
                .enable_time_us = 230,
        },
        {
 -              .name = "LDO6",
 +              .name = "ldo6",
                .min_uV = 1000000,
                .max_uV = 3300000,
                .n_voltages = 24,
                .enable_time_us = 230,
        },
        {
 -              .name = "LDO7",
 +              .name = "ldo7",
                .min_uV = 1000000,
                .max_uV = 3300000,
                .n_voltages = 24,
                .enable_time_us = 230,
        },
        {
 -              .name = "LDO8",
 +              .name = "ldo8",
                .min_uV = 1000000,
                .max_uV = 3300000,
                .n_voltages = 24,
@@@ -331,21 -331,16 +331,16 @@@ struct tps65910_reg 
  
  static inline int tps65910_read(struct tps65910_reg *pmic, u8 reg)
  {
-       u8 val;
+       unsigned int val;
        int err;
  
-       err = pmic->mfd->read(pmic->mfd, reg, 1, &val);
+       err = tps65910_reg_read(pmic->mfd, reg, &val);
        if (err)
                return err;
  
        return val;
  }
  
- static inline int tps65910_write(struct tps65910_reg *pmic, u8 reg, u8 val)
- {
-       return pmic->mfd->write(pmic->mfd, reg, 1, &val);
- }
  static int tps65910_modify_bits(struct tps65910_reg *pmic, u8 reg,
                                        u8 set_mask, u8 clear_mask)
  {
  
        data &= ~clear_mask;
        data |= set_mask;
-       err = tps65910_write(pmic, reg, data);
+       err = tps65910_reg_write(pmic->mfd, reg, data);
        if (err)
                dev_err(pmic->mfd->dev, "Write for reg 0x%x failed\n", reg);
  
@@@ -371,7 -366,7 +366,7 @@@ out
        return err;
  }
  
- static int tps65910_reg_read(struct tps65910_reg *pmic, u8 reg)
+ static int tps65910_reg_read_locked(struct tps65910_reg *pmic, u8 reg)
  {
        int data;
  
        return data;
  }
  
- static int tps65910_reg_write(struct tps65910_reg *pmic, u8 reg, u8 val)
+ static int tps65910_reg_write_locked(struct tps65910_reg *pmic, u8 reg, u8 val)
  {
        int err;
  
        mutex_lock(&pmic->mutex);
  
-       err = tps65910_write(pmic, reg, val);
+       err = tps65910_reg_write(pmic->mfd, reg, val);
        if (err < 0)
                dev_err(pmic->mfd->dev, "Write for reg 0x%x failed\n", reg);
  
@@@ -467,6 -462,48 +462,6 @@@ static int tps65911_get_ctrl_register(i
        }
  }
  
 -static int tps65910_is_enabled(struct regulator_dev *dev)
 -{
 -      struct tps65910_reg *pmic = rdev_get_drvdata(dev);
 -      int reg, value, id = rdev_get_id(dev);
 -
 -      reg = pmic->get_ctrl_reg(id);
 -      if (reg < 0)
 -              return reg;
 -
 -      value = tps65910_reg_read_locked(pmic, reg);
 -      if (value < 0)
 -              return value;
 -
 -      return value & TPS65910_SUPPLY_STATE_ENABLED;
 -}
 -
 -static int tps65910_enable(struct regulator_dev *dev)
 -{
 -      struct tps65910_reg *pmic = rdev_get_drvdata(dev);
 -      struct tps65910 *mfd = pmic->mfd;
 -      int reg, id = rdev_get_id(dev);
 -
 -      reg = pmic->get_ctrl_reg(id);
 -      if (reg < 0)
 -              return reg;
 -
 -      return tps65910_reg_set_bits(mfd, reg, TPS65910_SUPPLY_STATE_ENABLED);
 -}
 -
 -static int tps65910_disable(struct regulator_dev *dev)
 -{
 -      struct tps65910_reg *pmic = rdev_get_drvdata(dev);
 -      struct tps65910 *mfd = pmic->mfd;
 -      int reg, id = rdev_get_id(dev);
 -
 -      reg = pmic->get_ctrl_reg(id);
 -      if (reg < 0)
 -              return reg;
 -
 -      return tps65910_reg_clear_bits(mfd, reg, TPS65910_SUPPLY_STATE_ENABLED);
 -}
 -
  static int tps65910_enable_time(struct regulator_dev *dev)
  {
        struct tps65910_reg *pmic = rdev_get_drvdata(dev);
@@@ -490,9 -527,9 +485,9 @@@ static int tps65910_set_mode(struct reg
                                                        LDO_ST_MODE_BIT);
        case REGULATOR_MODE_IDLE:
                value = LDO_ST_ON_BIT | LDO_ST_MODE_BIT;
-               return tps65910_set_bits(mfd, reg, value);
+               return tps65910_reg_set_bits(mfd, reg, value);
        case REGULATOR_MODE_STANDBY:
-               return tps65910_clear_bits(mfd, reg, LDO_ST_ON_BIT);
+               return tps65910_reg_clear_bits(mfd, reg, LDO_ST_ON_BIT);
        }
  
        return -EINVAL;
@@@ -507,7 -544,7 +502,7 @@@ static unsigned int tps65910_get_mode(s
        if (reg < 0)
                return reg;
  
-       value = tps65910_reg_read(pmic, reg);
+       value = tps65910_reg_read_locked(pmic, reg);
        if (value < 0)
                return value;
  
@@@ -527,28 -564,28 +522,28 @@@ static int tps65910_get_voltage_dcdc_se
  
        switch (id) {
        case TPS65910_REG_VDD1:
-               opvsel = tps65910_reg_read(pmic, TPS65910_VDD1_OP);
-               mult = tps65910_reg_read(pmic, TPS65910_VDD1);
+               opvsel = tps65910_reg_read_locked(pmic, TPS65910_VDD1_OP);
+               mult = tps65910_reg_read_locked(pmic, TPS65910_VDD1);
                mult = (mult & VDD1_VGAIN_SEL_MASK) >> VDD1_VGAIN_SEL_SHIFT;
-               srvsel = tps65910_reg_read(pmic, TPS65910_VDD1_SR);
+               srvsel = tps65910_reg_read_locked(pmic, TPS65910_VDD1_SR);
                sr = opvsel & VDD1_OP_CMD_MASK;
                opvsel &= VDD1_OP_SEL_MASK;
                srvsel &= VDD1_SR_SEL_MASK;
                vselmax = 75;
                break;
        case TPS65910_REG_VDD2:
-               opvsel = tps65910_reg_read(pmic, TPS65910_VDD2_OP);
-               mult = tps65910_reg_read(pmic, TPS65910_VDD2);
+               opvsel = tps65910_reg_read_locked(pmic, TPS65910_VDD2_OP);
+               mult = tps65910_reg_read_locked(pmic, TPS65910_VDD2);
                mult = (mult & VDD2_VGAIN_SEL_MASK) >> VDD2_VGAIN_SEL_SHIFT;
-               srvsel = tps65910_reg_read(pmic, TPS65910_VDD2_SR);
+               srvsel = tps65910_reg_read_locked(pmic, TPS65910_VDD2_SR);
                sr = opvsel & VDD2_OP_CMD_MASK;
                opvsel &= VDD2_OP_SEL_MASK;
                srvsel &= VDD2_SR_SEL_MASK;
                vselmax = 75;
                break;
        case TPS65911_REG_VDDCTRL:
-               opvsel = tps65910_reg_read(pmic, TPS65911_VDDCTRL_OP);
-               srvsel = tps65910_reg_read(pmic, TPS65911_VDDCTRL_SR);
+               opvsel = tps65910_reg_read_locked(pmic, TPS65911_VDDCTRL_OP);
+               srvsel = tps65910_reg_read_locked(pmic, TPS65911_VDDCTRL_SR);
                sr = opvsel & VDDCTRL_OP_CMD_MASK;
                opvsel &= VDDCTRL_OP_SEL_MASK;
                srvsel &= VDDCTRL_SR_SEL_MASK;
        return -EINVAL;
  }
  
 -static int tps65910_get_voltage(struct regulator_dev *dev)
 +static int tps65910_get_voltage_sel(struct regulator_dev *dev)
  {
        struct tps65910_reg *pmic = rdev_get_drvdata(dev);
 -      int reg, value, id = rdev_get_id(dev), voltage = 0;
 +      int reg, value, id = rdev_get_id(dev);
  
        reg = pmic->get_ctrl_reg(id);
        if (reg < 0)
                return reg;
  
-       value = tps65910_reg_read(pmic, reg);
+       value = tps65910_reg_read_locked(pmic, reg);
        if (value < 0)
                return value;
  
                return -EINVAL;
        }
  
 -      voltage = pmic->info[id]->voltage_table[value] * 1000;
 -
 -      return voltage;
 +      return value;
  }
  
  static int tps65910_get_voltage_vdd3(struct regulator_dev *dev)
        return 5 * 1000 * 1000;
  }
  
 -static int tps65911_get_voltage(struct regulator_dev *dev)
 +static int tps65911_get_voltage_sel(struct regulator_dev *dev)
  {
        struct tps65910_reg *pmic = rdev_get_drvdata(dev);
 -      int step_mv, id = rdev_get_id(dev);
 +      int id = rdev_get_id(dev);
        u8 value, reg;
  
        reg = pmic->get_ctrl_reg(id);
  
-       value = tps65910_reg_read(pmic, reg);
+       value = tps65910_reg_read_locked(pmic, reg);
  
        switch (id) {
        case TPS65911_REG_LDO1:
        case TPS65911_REG_LDO4:
                value &= LDO1_SEL_MASK;
                value >>= LDO_SEL_SHIFT;
 -              /* The first 5 values of the selector correspond to 1V */
 -              if (value < 5)
 -                      value = 0;
 -              else
 -                      value -= 4;
 -
 -              step_mv = 50;
                break;
        case TPS65911_REG_LDO3:
        case TPS65911_REG_LDO5:
        case TPS65911_REG_LDO8:
                value &= LDO3_SEL_MASK;
                value >>= LDO_SEL_SHIFT;
 -              /* The first 3 values of the selector correspond to 1V */
 -              if (value < 3)
 -                      value = 0;
 -              else
 -                      value -= 2;
 -
 -              step_mv = 100;
                break;
        case TPS65910_REG_VIO:
                value &= LDO_SEL_MASK;
                value >>= LDO_SEL_SHIFT;
 -              return pmic->info[id]->voltage_table[value] * 1000;
 +              break;
        default:
                return -EINVAL;
        }
  
 -      return (LDO_MIN_VOLT + value * step_mv) * 1000;
 +      return value;
  }
  
  static int tps65910_set_voltage_dcdc_sel(struct regulator_dev *dev,
                tps65910_modify_bits(pmic, TPS65910_VDD1,
                                (dcdc_mult << VDD1_VGAIN_SEL_SHIFT),
                                                VDD1_VGAIN_SEL_MASK);
-               tps65910_reg_write(pmic, TPS65910_VDD1_OP, vsel);
+               tps65910_reg_write_locked(pmic, TPS65910_VDD1_OP, vsel);
                break;
        case TPS65910_REG_VDD2:
                dcdc_mult = (selector / VDD1_2_NUM_VOLT_FINE) + 1;
                tps65910_modify_bits(pmic, TPS65910_VDD2,
                                (dcdc_mult << VDD2_VGAIN_SEL_SHIFT),
                                                VDD1_VGAIN_SEL_MASK);
-               tps65910_reg_write(pmic, TPS65910_VDD2_OP, vsel);
+               tps65910_reg_write_locked(pmic, TPS65910_VDD2_OP, vsel);
                break;
        case TPS65911_REG_VDDCTRL:
                vsel = selector + 3;
-               tps65910_reg_write(pmic, TPS65911_VDDCTRL_OP, vsel);
+               tps65910_reg_write_locked(pmic, TPS65911_VDDCTRL_OP, vsel);
        }
  
        return 0;
@@@ -856,9 -909,9 +851,9 @@@ static int tps65910_set_voltage_dcdc_ti
  
  /* Regulator ops (except VRTC) */
  static struct regulator_ops tps65910_ops_dcdc = {
 -      .is_enabled             = tps65910_is_enabled,
 -      .enable                 = tps65910_enable,
 -      .disable                = tps65910_disable,
 +      .is_enabled             = regulator_is_enabled_regmap,
 +      .enable                 = regulator_enable_regmap,
 +      .disable                = regulator_disable_regmap,
        .enable_time            = tps65910_enable_time,
        .set_mode               = tps65910_set_mode,
        .get_mode               = tps65910_get_mode,
  };
  
  static struct regulator_ops tps65910_ops_vdd3 = {
 -      .is_enabled             = tps65910_is_enabled,
 -      .enable                 = tps65910_enable,
 -      .disable                = tps65910_disable,
 +      .is_enabled             = regulator_is_enabled_regmap,
 +      .enable                 = regulator_enable_regmap,
 +      .disable                = regulator_disable_regmap,
        .enable_time            = tps65910_enable_time,
        .set_mode               = tps65910_set_mode,
        .get_mode               = tps65910_get_mode,
  };
  
  static struct regulator_ops tps65910_ops = {
 -      .is_enabled             = tps65910_is_enabled,
 -      .enable                 = tps65910_enable,
 -      .disable                = tps65910_disable,
 +      .is_enabled             = regulator_is_enabled_regmap,
 +      .enable                 = regulator_enable_regmap,
 +      .disable                = regulator_disable_regmap,
        .enable_time            = tps65910_enable_time,
        .set_mode               = tps65910_set_mode,
        .get_mode               = tps65910_get_mode,
 -      .get_voltage            = tps65910_get_voltage,
 +      .get_voltage_sel        = tps65910_get_voltage_sel,
        .set_voltage_sel        = tps65910_set_voltage_sel,
        .list_voltage           = tps65910_list_voltage,
  };
  
  static struct regulator_ops tps65911_ops = {
 -      .is_enabled             = tps65910_is_enabled,
 -      .enable                 = tps65910_enable,
 -      .disable                = tps65910_disable,
 +      .is_enabled             = regulator_is_enabled_regmap,
 +      .enable                 = regulator_enable_regmap,
 +      .disable                = regulator_disable_regmap,
        .enable_time            = tps65910_enable_time,
        .set_mode               = tps65910_set_mode,
        .get_mode               = tps65910_get_mode,
 -      .get_voltage            = tps65911_get_voltage,
 +      .get_voltage_sel        = tps65911_get_voltage_sel,
        .set_voltage_sel        = tps65911_set_voltage_sel,
        .list_voltage           = tps65911_list_voltage,
  };
@@@ -936,10 -989,10 +931,10 @@@ static int tps65910_set_ext_sleep_confi
  
        /* External EN1 control */
        if (ext_sleep_config & TPS65910_SLEEP_CONTROL_EXT_INPUT_EN1)
-               ret = tps65910_set_bits(mfd,
+               ret = tps65910_reg_set_bits(mfd,
                                TPS65910_EN1_LDO_ASS + regoffs, bit_pos);
        else
-               ret = tps65910_clear_bits(mfd,
+               ret = tps65910_reg_clear_bits(mfd,
                                TPS65910_EN1_LDO_ASS + regoffs, bit_pos);
        if (ret < 0) {
                dev_err(mfd->dev,
  
        /* External EN2 control */
        if (ext_sleep_config & TPS65910_SLEEP_CONTROL_EXT_INPUT_EN2)
-               ret = tps65910_set_bits(mfd,
+               ret = tps65910_reg_set_bits(mfd,
                                TPS65910_EN2_LDO_ASS + regoffs, bit_pos);
        else
-               ret = tps65910_clear_bits(mfd,
+               ret = tps65910_reg_clear_bits(mfd,
                                TPS65910_EN2_LDO_ASS + regoffs, bit_pos);
        if (ret < 0) {
                dev_err(mfd->dev,
        if ((tps65910_chip_id(mfd) == TPS65910) &&
                        (id >= TPS65910_REG_VDIG1)) {
                if (ext_sleep_config & TPS65910_SLEEP_CONTROL_EXT_INPUT_EN3)
-                       ret = tps65910_set_bits(mfd,
+                       ret = tps65910_reg_set_bits(mfd,
                                TPS65910_EN3_LDO_ASS + regoffs, bit_pos);
                else
-                       ret = tps65910_clear_bits(mfd,
+                       ret = tps65910_reg_clear_bits(mfd,
                                TPS65910_EN3_LDO_ASS + regoffs, bit_pos);
                if (ret < 0) {
                        dev_err(mfd->dev,
        /* Return if no external control is selected */
        if (!(ext_sleep_config & EXT_SLEEP_CONTROL)) {
                /* Clear all sleep controls */
-               ret = tps65910_clear_bits(mfd,
+               ret = tps65910_reg_clear_bits(mfd,
                        TPS65910_SLEEP_KEEP_LDO_ON + regoffs, bit_pos);
                if (!ret)
-                       ret = tps65910_clear_bits(mfd,
+                       ret = tps65910_reg_clear_bits(mfd,
                                TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
                if (ret < 0)
                        dev_err(mfd->dev,
                                (tps65910_chip_id(mfd) == TPS65911))) {
                int op_reg_add = pmic->get_ctrl_reg(id) + 1;
                int sr_reg_add = pmic->get_ctrl_reg(id) + 2;
-               int opvsel = tps65910_reg_read(pmic, op_reg_add);
-               int srvsel = tps65910_reg_read(pmic, sr_reg_add);
+               int opvsel = tps65910_reg_read_locked(pmic, op_reg_add);
+               int srvsel = tps65910_reg_read_locked(pmic, sr_reg_add);
                if (opvsel & VDD1_OP_CMD_MASK) {
                        u8 reg_val = srvsel & VDD1_OP_SEL_MASK;
-                       ret = tps65910_reg_write(pmic, op_reg_add, reg_val);
+                       ret = tps65910_reg_write_locked(pmic, op_reg_add,
+                                                       reg_val);
                        if (ret < 0) {
                                dev_err(mfd->dev,
                                        "Error in configuring op register\n");
                                return ret;
                        }
                }
-               ret = tps65910_reg_write(pmic, sr_reg_add, 0);
+               ret = tps65910_reg_write_locked(pmic, sr_reg_add, 0);
                if (ret < 0) {
                        dev_err(mfd->dev, "Error in settting sr register\n");
                        return ret;
                }
        }
  
-       ret = tps65910_clear_bits(mfd,
+       ret = tps65910_reg_clear_bits(mfd,
                        TPS65910_SLEEP_KEEP_LDO_ON + regoffs, bit_pos);
        if (!ret) {
                if (ext_sleep_config & TPS65911_SLEEP_CONTROL_EXT_INPUT_SLEEP)
-                       ret = tps65910_set_bits(mfd,
+                       ret = tps65910_reg_set_bits(mfd,
                                TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
                else
-                       ret = tps65910_clear_bits(mfd,
+                       ret = tps65910_reg_clear_bits(mfd,
                                TPS65910_SLEEP_SET_LDO_OFF + regoffs, bit_pos);
        }
        if (ret < 0)
        return ret;
  }
  
 +#ifdef CONFIG_OF
 +
 +static struct of_regulator_match tps65910_matches[] = {
 +      { .name = "vrtc",       .driver_data = (void *) &tps65910_regs[0] },
 +      { .name = "vio",        .driver_data = (void *) &tps65910_regs[1] },
 +      { .name = "vdd1",       .driver_data = (void *) &tps65910_regs[2] },
 +      { .name = "vdd2",       .driver_data = (void *) &tps65910_regs[3] },
 +      { .name = "vdd3",       .driver_data = (void *) &tps65910_regs[4] },
 +      { .name = "vdig1",      .driver_data = (void *) &tps65910_regs[5] },
 +      { .name = "vdig2",      .driver_data = (void *) &tps65910_regs[6] },
 +      { .name = "vpll",       .driver_data = (void *) &tps65910_regs[7] },
 +      { .name = "vdac",       .driver_data = (void *) &tps65910_regs[8] },
 +      { .name = "vaux1",      .driver_data = (void *) &tps65910_regs[9] },
 +      { .name = "vaux2",      .driver_data = (void *) &tps65910_regs[10] },
 +      { .name = "vaux33",     .driver_data = (void *) &tps65910_regs[11] },
 +      { .name = "vmmc",       .driver_data = (void *) &tps65910_regs[12] },
 +};
 +
 +static struct of_regulator_match tps65911_matches[] = {
 +      { .name = "vrtc",       .driver_data = (void *) &tps65911_regs[0] },
 +      { .name = "vio",        .driver_data = (void *) &tps65911_regs[1] },
 +      { .name = "vdd1",       .driver_data = (void *) &tps65911_regs[2] },
 +      { .name = "vdd2",       .driver_data = (void *) &tps65911_regs[3] },
 +      { .name = "vddctrl",    .driver_data = (void *) &tps65911_regs[4] },
 +      { .name = "ldo1",       .driver_data = (void *) &tps65911_regs[5] },
 +      { .name = "ldo2",       .driver_data = (void *) &tps65911_regs[6] },
 +      { .name = "ldo3",       .driver_data = (void *) &tps65911_regs[7] },
 +      { .name = "ldo4",       .driver_data = (void *) &tps65911_regs[8] },
 +      { .name = "ldo5",       .driver_data = (void *) &tps65911_regs[9] },
 +      { .name = "ldo6",       .driver_data = (void *) &tps65911_regs[10] },
 +      { .name = "ldo7",       .driver_data = (void *) &tps65911_regs[11] },
 +      { .name = "ldo8",       .driver_data = (void *) &tps65911_regs[12] },
 +};
 +
 +static struct tps65910_board *tps65910_parse_dt_reg_data(
 +              struct platform_device *pdev,
 +              struct of_regulator_match **tps65910_reg_matches)
 +{
 +      struct tps65910_board *pmic_plat_data;
 +      struct tps65910 *tps65910 = dev_get_drvdata(pdev->dev.parent);
 +      struct device_node *np = pdev->dev.parent->of_node;
 +      struct device_node *regulators;
 +      struct of_regulator_match *matches;
 +      unsigned int prop;
 +      int idx = 0, ret, count;
 +
 +      pmic_plat_data = devm_kzalloc(&pdev->dev, sizeof(*pmic_plat_data),
 +                                      GFP_KERNEL);
 +
 +      if (!pmic_plat_data) {
 +              dev_err(&pdev->dev, "Failure to alloc pdata for regulators.\n");
 +              return NULL;
 +      }
 +
 +      regulators = of_find_node_by_name(np, "regulators");
 +      if (!regulators) {
 +              dev_err(&pdev->dev, "regulator node not found\n");
 +              return NULL;
 +      }
 +
 +      switch (tps65910_chip_id(tps65910)) {
 +      case TPS65910:
 +              count = ARRAY_SIZE(tps65910_matches);
 +              matches = tps65910_matches;
 +              break;
 +      case TPS65911:
 +              count = ARRAY_SIZE(tps65911_matches);
 +              matches = tps65911_matches;
 +              break;
 +      default:
 +              dev_err(&pdev->dev, "Invalid tps chip version\n");
 +              return NULL;
 +      }
 +
 +      ret = of_regulator_match(pdev->dev.parent, regulators, matches, count);
 +      if (ret < 0) {
 +              dev_err(&pdev->dev, "Error parsing regulator init data: %d\n",
 +                      ret);
 +              return NULL;
 +      }
 +
 +      *tps65910_reg_matches = matches;
 +
 +      for (idx = 0; idx < count; idx++) {
 +              if (!matches[idx].init_data || !matches[idx].of_node)
 +                      continue;
 +
 +              pmic_plat_data->tps65910_pmic_init_data[idx] =
 +                                                      matches[idx].init_data;
 +
 +              ret = of_property_read_u32(matches[idx].of_node,
 +                              "ti,regulator-ext-sleep-control", &prop);
 +              if (!ret)
 +                      pmic_plat_data->regulator_ext_sleep_control[idx] = prop;
 +      }
 +
 +      return pmic_plat_data;
 +}
 +#else
 +static inline struct tps65910_board *tps65910_parse_dt_reg_data(
 +                      struct platform_device *pdev,
 +                      struct of_regulator_match **tps65910_reg_matches)
 +{
 +      *tps65910_reg_matches = NULL;
 +      return 0;
 +}
 +#endif
 +
  static __devinit int tps65910_probe(struct platform_device *pdev)
  {
        struct tps65910 *tps65910 = dev_get_drvdata(pdev->dev.parent);
 +      struct regulator_config config = { };
        struct tps_info *info;
        struct regulator_init_data *reg_data;
        struct regulator_dev *rdev;
        struct tps65910_reg *pmic;
        struct tps65910_board *pmic_plat_data;
 +      struct of_regulator_match *tps65910_reg_matches = NULL;
        int i, err;
  
        pmic_plat_data = dev_get_platdata(tps65910->dev);
 -      if (!pmic_plat_data)
 +      if (!pmic_plat_data && tps65910->dev->of_node)
 +              pmic_plat_data = tps65910_parse_dt_reg_data(pdev,
 +                                              &tps65910_reg_matches);
 +
 +      if (!pmic_plat_data) {
 +              dev_err(&pdev->dev, "Platform data not found\n");
                return -EINVAL;
 +      }
  
 -      pmic = kzalloc(sizeof(*pmic), GFP_KERNEL);
 -      if (!pmic)
 +      pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
 +      if (!pmic) {
 +              dev_err(&pdev->dev, "Memory allocation failed for pmic\n");
                return -ENOMEM;
 +      }
  
        mutex_init(&pmic->mutex);
        pmic->mfd = tps65910;
        platform_set_drvdata(pdev, pmic);
  
        /* Give control of all register to control port */
-       tps65910_set_bits(pmic->mfd, TPS65910_DEVCTRL,
+       tps65910_reg_set_bits(pmic->mfd, TPS65910_DEVCTRL,
                                DEVCTRL_SR_CTL_I2C_SEL_MASK);
  
        switch(tps65910_chip_id(tps65910)) {
                info = tps65911_regs;
                break;
        default:
 -              pr_err("Invalid tps chip version\n");
 -              kfree(pmic);
 +              dev_err(&pdev->dev, "Invalid tps chip version\n");
                return -ENODEV;
        }
  
 -      pmic->desc = kcalloc(pmic->num_regulators,
 +      pmic->desc = devm_kzalloc(&pdev->dev, pmic->num_regulators *
                        sizeof(struct regulator_desc), GFP_KERNEL);
        if (!pmic->desc) {
 -              err = -ENOMEM;
 -              goto err_free_pmic;
 +              dev_err(&pdev->dev, "Memory alloc fails for desc\n");
 +              return -ENOMEM;
        }
  
 -      pmic->info = kcalloc(pmic->num_regulators,
 +      pmic->info = devm_kzalloc(&pdev->dev, pmic->num_regulators *
                        sizeof(struct tps_info *), GFP_KERNEL);
        if (!pmic->info) {
 -              err = -ENOMEM;
 -              goto err_free_desc;
 +              dev_err(&pdev->dev, "Memory alloc fails for info\n");
 +              return -ENOMEM;
        }
  
 -      pmic->rdev = kcalloc(pmic->num_regulators,
 +      pmic->rdev = devm_kzalloc(&pdev->dev, pmic->num_regulators *
                        sizeof(struct regulator_dev *), GFP_KERNEL);
        if (!pmic->rdev) {
 -              err = -ENOMEM;
 -              goto err_free_info;
 +              dev_err(&pdev->dev, "Memory alloc fails for rdev\n");
 +              return -ENOMEM;
        }
  
        for (i = 0; i < pmic->num_regulators && i < TPS65910_NUM_REGS;
  
                pmic->desc[i].type = REGULATOR_VOLTAGE;
                pmic->desc[i].owner = THIS_MODULE;
 +              pmic->desc[i].enable_reg = pmic->get_ctrl_reg(i);
 +              pmic->desc[i].enable_mask = TPS65910_SUPPLY_STATE_ENABLED;
 +
 +              config.dev = tps65910->dev;
 +              config.init_data = reg_data;
 +              config.driver_data = pmic;
 +              config.regmap = tps65910->regmap;
 +
 +              if (tps65910_reg_matches)
 +                      config.of_node = tps65910_reg_matches[i].of_node;
  
 -              rdev = regulator_register(&pmic->desc[i],
 -                              tps65910->dev, reg_data, pmic, NULL);
 +              rdev = regulator_register(&pmic->desc[i], &config);
                if (IS_ERR(rdev)) {
                        dev_err(tps65910->dev,
                                "failed to register %s regulator\n",
  err_unregister_regulator:
        while (--i >= 0)
                regulator_unregister(pmic->rdev[i]);
 -      kfree(pmic->rdev);
 -err_free_info:
 -      kfree(pmic->info);
 -err_free_desc:
 -      kfree(pmic->desc);
 -err_free_pmic:
 -      kfree(pmic);
        return err;
  }
  
@@@ -1303,6 -1238,10 +1299,6 @@@ static int __devexit tps65910_remove(st
        for (i = 0; i < pmic->num_regulators; i++)
                regulator_unregister(pmic->rdev[i]);
  
 -      kfree(pmic->rdev);
 -      kfree(pmic->info);
 -      kfree(pmic->desc);
 -      kfree(pmic);
        return 0;
  }
  
@@@ -35,7 -35,7 +35,7 @@@
  #define WM831X_DCDC_MODE_IDLE    2
  #define WM831X_DCDC_MODE_STANDBY 3
  
 -#define WM831X_DCDC_MAX_NAME 6
 +#define WM831X_DCDC_MAX_NAME 9
  
  /* Register offsets in control block */
  #define WM831X_DCDC_CONTROL_1     0
@@@ -50,7 -50,6 +50,7 @@@
  
  struct wm831x_dcdc {
        char name[WM831X_DCDC_MAX_NAME];
 +      char supply_name[WM831X_DCDC_MAX_NAME];
        struct regulator_desc desc;
        int base;
        struct wm831x *wm831x;
        int dvs_vsel;
  };
  
 -static int wm831x_dcdc_is_enabled(struct regulator_dev *rdev)
 -{
 -      struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = dcdc->wm831x;
 -      int mask = 1 << rdev_get_id(rdev);
 -      int reg;
 -
 -      reg = wm831x_reg_read(wm831x, WM831X_DCDC_ENABLE);
 -      if (reg < 0)
 -              return reg;
 -
 -      if (reg & mask)
 -              return 1;
 -      else
 -              return 0;
 -}
 -
 -static int wm831x_dcdc_enable(struct regulator_dev *rdev)
 -{
 -      struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = dcdc->wm831x;
 -      int mask = 1 << rdev_get_id(rdev);
 -
 -      return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, mask);
 -}
 -
 -static int wm831x_dcdc_disable(struct regulator_dev *rdev)
 -{
 -      struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = dcdc->wm831x;
 -      int mask = 1 << rdev_get_id(rdev);
 -
 -      return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, 0);
 -}
 -
  static unsigned int wm831x_dcdc_get_mode(struct regulator_dev *rdev)
  
  {
@@@ -380,9 -414,9 +380,9 @@@ static struct regulator_ops wm831x_buck
        .set_current_limit = wm831x_buckv_set_current_limit,
        .get_current_limit = wm831x_buckv_get_current_limit,
  
 -      .is_enabled = wm831x_dcdc_is_enabled,
 -      .enable = wm831x_dcdc_enable,
 -      .disable = wm831x_dcdc_disable,
 +      .is_enabled = regulator_is_enabled_regmap,
 +      .enable = regulator_enable_regmap,
 +      .disable = regulator_disable_regmap,
        .get_status = wm831x_dcdc_get_status,
        .get_mode = wm831x_dcdc_get_mode,
        .set_mode = wm831x_dcdc_set_mode,
@@@ -403,17 -437,23 +403,17 @@@ static __devinit void wm831x_buckv_dvs_
        if (!pdata || !pdata->dvs_gpio)
                return;
  
 -      ret = gpio_request(pdata->dvs_gpio, "DCDC DVS");
 -      if (ret < 0) {
 -              dev_err(wm831x->dev, "Failed to get %s DVS GPIO: %d\n",
 -                      dcdc->name, ret);
 -              return;
 -      }
 -
        /* gpiolib won't let us read the GPIO status so pick the higher
         * of the two existing voltages so we take it as platform data.
         */
        dcdc->dvs_gpio_state = pdata->dvs_init_state;
  
 -      ret = gpio_direction_output(pdata->dvs_gpio, dcdc->dvs_gpio_state);
 +      ret = gpio_request_one(pdata->dvs_gpio,
 +                             dcdc->dvs_gpio_state ? GPIOF_INIT_HIGH : 0,
 +                             "DCDC DVS");
        if (ret < 0) {
 -              dev_err(wm831x->dev, "Failed to enable %s DVS GPIO: %d\n",
 +              dev_err(wm831x->dev, "Failed to get %s DVS GPIO: %d\n",
                        dcdc->name, ret);
 -              gpio_free(pdata->dvs_gpio);
                return;
        }
  
@@@ -458,7 -498,6 +458,7 @@@ static __devinit int wm831x_buckv_probe
  {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 +      struct regulator_config config = { };
        int id;
        struct wm831x_dcdc *dcdc;
        struct resource *res;
  
        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
  
 -      if (pdata == NULL || pdata->dcdc[id] == NULL)
 -              return -ENODEV;
 -
        dcdc = devm_kzalloc(&pdev->dev,  sizeof(struct wm831x_dcdc),
                            GFP_KERNEL);
        if (dcdc == NULL) {
  
        snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
        dcdc->desc.name = dcdc->name;
 +
 +      snprintf(dcdc->supply_name, sizeof(dcdc->supply_name),
 +               "DC%dVDD", id + 1);
 +      dcdc->desc.supply_name = dcdc->supply_name;
 +
        dcdc->desc.id = id;
        dcdc->desc.type = REGULATOR_VOLTAGE;
        dcdc->desc.n_voltages = WM831X_BUCKV_MAX_SELECTOR + 1;
        dcdc->desc.ops = &wm831x_buckv_ops;
        dcdc->desc.owner = THIS_MODULE;
 +      dcdc->desc.enable_reg = WM831X_DCDC_ENABLE;
 +      dcdc->desc.enable_mask = 1 << id;
  
        ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
        if (ret < 0) {
        }
        dcdc->dvs_vsel = ret & WM831X_DC1_DVS_VSEL_MASK;
  
 -      if (pdata->dcdc[id])
 +      if (pdata && pdata->dcdc[id])
                wm831x_buckv_dvs_init(dcdc, pdata->dcdc[id]->driver_data);
  
 -      dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 -                                           pdata->dcdc[id], dcdc, NULL);
 +      config.dev = pdev->dev.parent;
 +      if (pdata)
 +              config.init_data = pdata->dcdc[id];
 +      config.driver_data = dcdc;
 +      config.regmap = wm831x->regmap;
 +
 +      dcdc->regulator = regulator_register(&dcdc->desc, &config);
        if (IS_ERR(dcdc->regulator)) {
                ret = PTR_ERR(dcdc->regulator);
                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
                goto err;
        }
  
-       irq = platform_get_irq_byname(pdev, "UV");
+       irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
                                   IRQF_TRIGGER_RISING, dcdc->name, dcdc);
        if (ret != 0) {
                goto err_regulator;
        }
  
-       irq = platform_get_irq_byname(pdev, "HC");
+       irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "HC"));
        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_oc_irq,
                                   IRQF_TRIGGER_RISING, dcdc->name, dcdc);
        if (ret != 0) {
        return 0;
  
  err_uv:
-       free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
+       free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV")),
+                dcdc);
  err_regulator:
        regulator_unregister(dcdc->regulator);
  err:
  static __devexit int wm831x_buckv_remove(struct platform_device *pdev)
  {
        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
+       struct wm831x *wm831x = dcdc->wm831x;
  
        platform_set_drvdata(pdev, NULL);
  
-       free_irq(platform_get_irq_byname(pdev, "HC"), dcdc);
-       free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
+       free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "HC")),
+                           dcdc);
+       free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV")),
+                           dcdc);
        regulator_unregister(dcdc->regulator);
        if (dcdc->dvs_gpio)
                gpio_free(dcdc->dvs_gpio);
@@@ -645,15 -679,29 +649,15 @@@ static int wm831x_buckp_set_suspend_vol
        return wm831x_buckp_set_voltage_int(rdev, reg, uV, uV, &selector);
  }
  
 -static int wm831x_buckp_get_voltage_sel(struct regulator_dev *rdev)
 -{
 -      struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = dcdc->wm831x;
 -      u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 -      int val;
 -
 -      val = wm831x_reg_read(wm831x, reg);
 -      if (val < 0)
 -              return val;
 -
 -      return val & WM831X_DC3_ON_VSEL_MASK;
 -}
 -
  static struct regulator_ops wm831x_buckp_ops = {
        .set_voltage = wm831x_buckp_set_voltage,
 -      .get_voltage_sel = wm831x_buckp_get_voltage_sel,
 +      .get_voltage_sel = regulator_get_voltage_sel_regmap,
        .list_voltage = wm831x_buckp_list_voltage,
        .set_suspend_voltage = wm831x_buckp_set_suspend_voltage,
  
 -      .is_enabled = wm831x_dcdc_is_enabled,
 -      .enable = wm831x_dcdc_enable,
 -      .disable = wm831x_dcdc_disable,
 +      .is_enabled = regulator_is_enabled_regmap,
 +      .enable = regulator_enable_regmap,
 +      .disable = regulator_disable_regmap,
        .get_status = wm831x_dcdc_get_status,
        .get_mode = wm831x_dcdc_get_mode,
        .set_mode = wm831x_dcdc_set_mode,
@@@ -664,7 -712,6 +668,7 @@@ static __devinit int wm831x_buckp_probe
  {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 +      struct regulator_config config = { };
        int id;
        struct wm831x_dcdc *dcdc;
        struct resource *res;
  
        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
  
 -      if (pdata == NULL || pdata->dcdc[id] == NULL)
 -              return -ENODEV;
 -
        dcdc = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_dcdc),
                            GFP_KERNEL);
        if (dcdc == NULL) {
  
        snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
        dcdc->desc.name = dcdc->name;
 +
 +      snprintf(dcdc->supply_name, sizeof(dcdc->supply_name),
 +               "DC%dVDD", id + 1);
 +      dcdc->desc.supply_name = dcdc->supply_name;
 +
        dcdc->desc.id = id;
        dcdc->desc.type = REGULATOR_VOLTAGE;
        dcdc->desc.n_voltages = WM831X_BUCKP_MAX_SELECTOR + 1;
        dcdc->desc.ops = &wm831x_buckp_ops;
        dcdc->desc.owner = THIS_MODULE;
 -
 -      dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 -                                           pdata->dcdc[id], dcdc, NULL);
 +      dcdc->desc.vsel_reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 +      dcdc->desc.vsel_mask = WM831X_DC3_ON_VSEL_MASK;
 +      dcdc->desc.enable_reg = WM831X_DCDC_ENABLE;
 +      dcdc->desc.enable_mask = 1 << id;
 +
 +      config.dev = pdev->dev.parent;
 +      if (pdata)
 +              config.init_data = pdata->dcdc[id];
 +      config.driver_data = dcdc;
 +      config.regmap = wm831x->regmap;
 +
 +      dcdc->regulator = regulator_register(&dcdc->desc, &config);
        if (IS_ERR(dcdc->regulator)) {
                ret = PTR_ERR(dcdc->regulator);
                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
                goto err;
        }
  
-       irq = platform_get_irq_byname(pdev, "UV");
+       irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
                                   IRQF_TRIGGER_RISING, dcdc->name, dcdc);
        if (ret != 0) {
@@@ -751,7 -787,8 +755,8 @@@ static __devexit int wm831x_buckp_remov
  
        platform_set_drvdata(pdev, NULL);
  
-       free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
+       free_irq(wm831x_irq(dcdc->wm831x, platform_get_irq_byname(pdev, "UV")),
+                           dcdc);
        regulator_unregister(dcdc->regulator);
  
        return 0;
@@@ -800,16 -837,15 +805,16 @@@ static int wm831x_boostp_get_status(str
  static struct regulator_ops wm831x_boostp_ops = {
        .get_status = wm831x_boostp_get_status,
  
 -      .is_enabled = wm831x_dcdc_is_enabled,
 -      .enable = wm831x_dcdc_enable,
 -      .disable = wm831x_dcdc_disable,
 +      .is_enabled = regulator_is_enabled_regmap,
 +      .enable = regulator_enable_regmap,
 +      .disable = regulator_disable_regmap,
  };
  
  static __devinit int wm831x_boostp_probe(struct platform_device *pdev)
  {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 +      struct regulator_config config = { };
        int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
        struct wm831x_dcdc *dcdc;
        struct resource *res;
        if (pdata == NULL || pdata->dcdc[id] == NULL)
                return -ENODEV;
  
 -      dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
 +      dcdc = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_dcdc), GFP_KERNEL);
        if (dcdc == NULL) {
                dev_err(&pdev->dev, "Unable to allocate private data\n");
                return -ENOMEM;
        dcdc->desc.type = REGULATOR_VOLTAGE;
        dcdc->desc.ops = &wm831x_boostp_ops;
        dcdc->desc.owner = THIS_MODULE;
 +      dcdc->desc.enable_reg = WM831X_DCDC_ENABLE;
 +      dcdc->desc.enable_mask = 1 << id;
  
 -      dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 -                                           pdata->dcdc[id], dcdc, NULL);
 +      config.dev = pdev->dev.parent;
 +      if (pdata)
 +              config.init_data = pdata->dcdc[id];
 +      config.driver_data = dcdc;
 +      config.regmap = wm831x->regmap;
 +
 +      dcdc->regulator = regulator_register(&dcdc->desc, &config);
        if (IS_ERR(dcdc->regulator)) {
                ret = PTR_ERR(dcdc->regulator);
                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
                goto err;
        }
  
-       irq = platform_get_irq_byname(pdev, "UV");
+       irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
                                   IRQF_TRIGGER_RISING, dcdc->name,
                                   dcdc);
  err_regulator:
        regulator_unregister(dcdc->regulator);
  err:
 -      kfree(dcdc);
        return ret;
  }
  
@@@ -885,8 -915,10 +890,9 @@@ static __devexit int wm831x_boostp_remo
  
        platform_set_drvdata(pdev, NULL);
  
-       free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
+       free_irq(wm831x_irq(dcdc->wm831x, platform_get_irq_byname(pdev, "UV")),
+                dcdc);
        regulator_unregister(dcdc->regulator);
 -      kfree(dcdc);
  
        return 0;
  }
@@@ -910,9 -942,9 +916,9 @@@ static struct platform_driver wm831x_bo
  #define WM831X_EPE_BASE 6
  
  static struct regulator_ops wm831x_epe_ops = {
 -      .is_enabled = wm831x_dcdc_is_enabled,
 -      .enable = wm831x_dcdc_enable,
 -      .disable = wm831x_dcdc_disable,
 +      .is_enabled = regulator_is_enabled_regmap,
 +      .enable = regulator_enable_regmap,
 +      .disable = regulator_disable_regmap,
        .get_status = wm831x_dcdc_get_status,
  };
  
@@@ -920,14 -952,16 +926,14 @@@ static __devinit int wm831x_epe_probe(s
  {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 +      struct regulator_config config = { };
        int id = pdev->id % ARRAY_SIZE(pdata->epe);
        struct wm831x_dcdc *dcdc;
        int ret;
  
        dev_dbg(&pdev->dev, "Probing EPE%d\n", id + 1);
  
 -      if (pdata == NULL || pdata->epe[id] == NULL)
 -              return -ENODEV;
 -
 -      dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
 +      dcdc = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_dcdc), GFP_KERNEL);
        if (dcdc == NULL) {
                dev_err(&pdev->dev, "Unable to allocate private data\n");
                return -ENOMEM;
        dcdc->desc.ops = &wm831x_epe_ops;
        dcdc->desc.type = REGULATOR_VOLTAGE;
        dcdc->desc.owner = THIS_MODULE;
 +      dcdc->desc.enable_reg = WM831X_DCDC_ENABLE;
 +      dcdc->desc.enable_mask = 1 << dcdc->desc.id;
 +
 +      config.dev = pdev->dev.parent;
 +      if (pdata)
 +              config.init_data = pdata->epe[id];
 +      config.driver_data = dcdc;
 +      config.regmap = wm831x->regmap;
  
 -      dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 -                                           pdata->epe[id], dcdc, NULL);
 +      dcdc->regulator = regulator_register(&dcdc->desc, &config);
        if (IS_ERR(dcdc->regulator)) {
                ret = PTR_ERR(dcdc->regulator);
                dev_err(wm831x->dev, "Failed to register EPE%d: %d\n",
        return 0;
  
  err:
 -      kfree(dcdc);
        return ret;
  }
  
@@@ -974,7 -1002,9 +980,7 @@@ static __devexit int wm831x_epe_remove(
        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
  
        platform_set_drvdata(pdev, NULL);
 -
        regulator_unregister(dcdc->regulator);
 -      kfree(dcdc);
  
        return 0;
  }
@@@ -154,7 -154,6 +154,7 @@@ static __devinit int wm831x_isink_probe
        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
        struct wm831x_isink *isink;
        int id = pdev->id % ARRAY_SIZE(pdata->isink);
 +      struct regulator_config config = { };
        struct resource *res;
        int ret, irq;
  
        isink->desc.type = REGULATOR_CURRENT;
        isink->desc.owner = THIS_MODULE;
  
 -      isink->regulator = regulator_register(&isink->desc, &pdev->dev,
 -                                           pdata->isink[id], isink, NULL);
 +      config.dev = pdev->dev.parent;
 +      config.init_data = pdata->isink[id];
 +      config.driver_data = isink;
 +
 +      isink->regulator = regulator_register(&isink->desc, &config);
        if (IS_ERR(isink->regulator)) {
                ret = PTR_ERR(isink->regulator);
                dev_err(wm831x->dev, "Failed to register ISINK%d: %d\n",
                goto err;
        }
  
-       irq = platform_get_irq(pdev, 0);
+       irq = wm831x_irq(wm831x, platform_get_irq(pdev, 0));
        ret = request_threaded_irq(irq, NULL, wm831x_isink_irq,
                                   IRQF_TRIGGER_RISING, isink->name, isink);
        if (ret != 0) {
@@@ -227,7 -223,7 +227,7 @@@ static __devexit int wm831x_isink_remov
  
        platform_set_drvdata(pdev, NULL);
  
-       free_irq(platform_get_irq(pdev, 0), isink);
+       free_irq(wm831x_irq(isink->wm831x, platform_get_irq(pdev, 0)), isink);
  
        regulator_unregister(isink->regulator);
  
@@@ -25,7 -25,7 +25,7 @@@
  #include <linux/mfd/wm831x/regulator.h>
  #include <linux/mfd/wm831x/pdata.h>
  
 -#define WM831X_LDO_MAX_NAME 6
 +#define WM831X_LDO_MAX_NAME 9
  
  #define WM831X_LDO_CONTROL       0
  #define WM831X_LDO_ON_CONTROL    1
@@@ -36,7 -36,6 +36,7 @@@
  
  struct wm831x_ldo {
        char name[WM831X_LDO_MAX_NAME];
 +      char supply_name[WM831X_LDO_MAX_NAME];
        struct regulator_desc desc;
        int base;
        struct wm831x *wm831x;
   * Shared
   */
  
 -static int wm831x_ldo_is_enabled(struct regulator_dev *rdev)
 -{
 -      struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = ldo->wm831x;
 -      int mask = 1 << rdev_get_id(rdev);
 -      int reg;
 -
 -      reg = wm831x_reg_read(wm831x, WM831X_LDO_ENABLE);
 -      if (reg < 0)
 -              return reg;
 -
 -      if (reg & mask)
 -              return 1;
 -      else
 -              return 0;
 -}
 -
 -static int wm831x_ldo_enable(struct regulator_dev *rdev)
 -{
 -      struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = ldo->wm831x;
 -      int mask = 1 << rdev_get_id(rdev);
 -
 -      return wm831x_set_bits(wm831x, WM831X_LDO_ENABLE, mask, mask);
 -}
 -
 -static int wm831x_ldo_disable(struct regulator_dev *rdev)
 -{
 -      struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = ldo->wm831x;
 -      int mask = 1 << rdev_get_id(rdev);
 -
 -      return wm831x_set_bits(wm831x, WM831X_LDO_ENABLE, mask, 0);
 -}
 -
  static irqreturn_t wm831x_ldo_uv_irq(int irq, void *data)
  {
        struct wm831x_ldo *ldo = data;
@@@ -71,7 -105,7 +71,7 @@@ static int wm831x_gp_ldo_list_voltage(s
        /* 0.9-1.6V in 50mV steps */
        if (selector <= WM831X_GP_LDO_SELECTOR_LOW)
                return 900000 + (selector * 50000);
 -      /* 1.7-3.3V in 50mV steps */
 +      /* 1.7-3.3V in 100mV steps */
        if (selector <= WM831X_GP_LDO_MAX_SELECTOR)
                return 1600000 + ((selector - WM831X_GP_LDO_SELECTOR_LOW)
                                  * 100000);
@@@ -126,6 -160,22 +126,6 @@@ static int wm831x_gp_ldo_set_suspend_vo
        return wm831x_gp_ldo_set_voltage_int(rdev, reg, uV, uV, &selector);
  }
  
 -static int wm831x_gp_ldo_get_voltage_sel(struct regulator_dev *rdev)
 -{
 -      struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = ldo->wm831x;
 -      int reg = ldo->base + WM831X_LDO_ON_CONTROL;
 -      int ret;
 -
 -      ret = wm831x_reg_read(wm831x, reg);
 -      if (ret < 0)
 -              return ret;
 -
 -      ret &= WM831X_LDO1_ON_VSEL_MASK;
 -
 -      return ret;
 -}
 -
  static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
  {
        struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
@@@ -243,7 -293,7 +243,7 @@@ static unsigned int wm831x_gp_ldo_get_o
  
  static struct regulator_ops wm831x_gp_ldo_ops = {
        .list_voltage = wm831x_gp_ldo_list_voltage,
 -      .get_voltage_sel = wm831x_gp_ldo_get_voltage_sel,
 +      .get_voltage_sel = regulator_get_voltage_sel_regmap,
        .set_voltage = wm831x_gp_ldo_set_voltage,
        .set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
        .get_mode = wm831x_gp_ldo_get_mode,
        .get_status = wm831x_gp_ldo_get_status,
        .get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
  
 -      .is_enabled = wm831x_ldo_is_enabled,
 -      .enable = wm831x_ldo_enable,
 -      .disable = wm831x_ldo_disable,
 +      .is_enabled = regulator_is_enabled_regmap,
 +      .enable = regulator_enable_regmap,
 +      .disable = regulator_disable_regmap,
  };
  
  static __devinit int wm831x_gp_ldo_probe(struct platform_device *pdev)
  {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 +      struct regulator_config config = { };
        int id;
        struct wm831x_ldo *ldo;
        struct resource *res;
  
        dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
  
 -      if (pdata == NULL || pdata->ldo[id] == NULL)
 -              return -ENODEV;
 -
        ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
        if (ldo == NULL) {
                dev_err(&pdev->dev, "Unable to allocate private data\n");
  
        snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
        ldo->desc.name = ldo->name;
 +
 +      snprintf(ldo->supply_name, sizeof(ldo->supply_name),
 +               "LDO%dVDD", id + 1);
 +      ldo->desc.supply_name = ldo->supply_name;
 +
        ldo->desc.id = id;
        ldo->desc.type = REGULATOR_VOLTAGE;
        ldo->desc.n_voltages = WM831X_GP_LDO_MAX_SELECTOR + 1;
        ldo->desc.ops = &wm831x_gp_ldo_ops;
        ldo->desc.owner = THIS_MODULE;
 -
 -      ldo->regulator = regulator_register(&ldo->desc, &pdev->dev,
 -                                           pdata->ldo[id], ldo, NULL);
 +      ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 +      ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
 +      ldo->desc.enable_reg = WM831X_LDO_ENABLE;
 +      ldo->desc.enable_mask = 1 << id;
 +
 +      config.dev = pdev->dev.parent;
 +      if (pdata)
 +              config.init_data = pdata->ldo[id];
 +      config.driver_data = ldo;
 +      config.regmap = wm831x->regmap;
 +
 +      ldo->regulator = regulator_register(&ldo->desc, &config);
        if (IS_ERR(ldo->regulator)) {
                ret = PTR_ERR(ldo->regulator);
                dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
                goto err;
        }
  
-       irq = platform_get_irq_byname(pdev, "UV");
+       irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
        ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
                                   IRQF_TRIGGER_RISING, ldo->name,
                                   ldo);
@@@ -347,7 -385,8 +347,8 @@@ static __devexit int wm831x_gp_ldo_remo
  
        platform_set_drvdata(pdev, NULL);
  
-       free_irq(platform_get_irq_byname(pdev, "UV"), ldo);
+       free_irq(wm831x_irq(ldo->wm831x,
+                           platform_get_irq_byname(pdev, "UV")), ldo);
        regulator_unregister(ldo->regulator);
  
        return 0;
@@@ -376,7 -415,7 +377,7 @@@ static int wm831x_aldo_list_voltage(str
        /* 1-1.6V in 50mV steps */
        if (selector <= WM831X_ALDO_SELECTOR_LOW)
                return 1000000 + (selector * 50000);
 -      /* 1.7-3.5V in 50mV steps */
 +      /* 1.7-3.5V in 100mV steps */
        if (selector <= WM831X_ALDO_MAX_SELECTOR)
                return 1600000 + ((selector - WM831X_ALDO_SELECTOR_LOW)
                                  * 100000);
@@@ -430,6 -469,22 +431,6 @@@ static int wm831x_aldo_set_suspend_volt
        return wm831x_aldo_set_voltage_int(rdev, reg, uV, uV, &selector);
  }
  
 -static int wm831x_aldo_get_voltage_sel(struct regulator_dev *rdev)
 -{
 -      struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = ldo->wm831x;
 -      int reg = ldo->base + WM831X_LDO_ON_CONTROL;
 -      int ret;
 -
 -      ret = wm831x_reg_read(wm831x, reg);
 -      if (ret < 0)
 -              return ret;
 -
 -      ret &= WM831X_LDO7_ON_VSEL_MASK;
 -
 -      return ret;
 -}
 -
  static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
  {
        struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
@@@ -505,23 -560,22 +506,23 @@@ static int wm831x_aldo_get_status(struc
  
  static struct regulator_ops wm831x_aldo_ops = {
        .list_voltage = wm831x_aldo_list_voltage,
 -      .get_voltage_sel = wm831x_aldo_get_voltage_sel,
 +      .get_voltage_sel = regulator_get_voltage_sel_regmap,
        .set_voltage = wm831x_aldo_set_voltage,
        .set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
        .get_mode = wm831x_aldo_get_mode,
        .set_mode = wm831x_aldo_set_mode,
        .get_status = wm831x_aldo_get_status,
  
 -      .is_enabled = wm831x_ldo_is_enabled,
 -      .enable = wm831x_ldo_enable,
 -      .disable = wm831x_ldo_disable,
 +      .is_enabled = regulator_is_enabled_regmap,
 +      .enable = regulator_enable_regmap,
 +      .disable = regulator_disable_regmap,
  };
  
  static __devinit int wm831x_aldo_probe(struct platform_device *pdev)
  {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 +      struct regulator_config config = { };
        int id;
        struct wm831x_ldo *ldo;
        struct resource *res;
  
        dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
  
 -      if (pdata == NULL || pdata->ldo[id] == NULL)
 -              return -ENODEV;
 -
        ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
        if (ldo == NULL) {
                dev_err(&pdev->dev, "Unable to allocate private data\n");
  
        snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
        ldo->desc.name = ldo->name;
 +
 +      snprintf(ldo->supply_name, sizeof(ldo->supply_name),
 +               "LDO%dVDD", id + 1);
 +      ldo->desc.supply_name = ldo->supply_name;
 +
        ldo->desc.id = id;
        ldo->desc.type = REGULATOR_VOLTAGE;
        ldo->desc.n_voltages = WM831X_ALDO_MAX_SELECTOR + 1;
        ldo->desc.ops = &wm831x_aldo_ops;
        ldo->desc.owner = THIS_MODULE;
 -
 -      ldo->regulator = regulator_register(&ldo->desc, &pdev->dev,
 -                                           pdata->ldo[id], ldo, NULL);
 +      ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 +      ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
 +      ldo->desc.enable_reg = WM831X_LDO_ENABLE;
 +      ldo->desc.enable_mask = 1 << id;
 +
 +      config.dev = pdev->dev.parent;
 +      if (pdata)
 +              config.init_data = pdata->ldo[id];
 +      config.driver_data = ldo;
 +      config.regmap = wm831x->regmap;
 +
 +      ldo->regulator = regulator_register(&ldo->desc, &config);
        if (IS_ERR(ldo->regulator)) {
                ret = PTR_ERR(ldo->regulator);
                dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
                goto err;
        }
  
-       irq = platform_get_irq_byname(pdev, "UV");
+       irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
        ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
                                   IRQF_TRIGGER_RISING, ldo->name, ldo);
        if (ret != 0) {
@@@ -605,7 -648,8 +606,8 @@@ static __devexit int wm831x_aldo_remove
  {
        struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
  
-       free_irq(platform_get_irq_byname(pdev, "UV"), ldo);
+       free_irq(wm831x_irq(ldo->wm831x, platform_get_irq_byname(pdev, "UV")),
+                ldo);
        regulator_unregister(ldo->regulator);
  
        return 0;
@@@ -626,6 -670,15 +628,6 @@@ static struct platform_driver wm831x_al
  
  #define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
  
 -static int wm831x_alive_ldo_list_voltage(struct regulator_dev *rdev,
 -                                    unsigned int selector)
 -{
 -      /* 0.8-1.55V in 50mV steps */
 -      if (selector <= WM831X_ALIVE_LDO_MAX_SELECTOR)
 -              return 800000 + (selector * 50000);
 -      return -EINVAL;
 -}
 -
  static int wm831x_alive_ldo_set_voltage_int(struct regulator_dev *rdev,
                                            int reg,
                                            int min_uV, int max_uV,
  
        vsel = (min_uV - 800000) / 50000;
  
 -      ret = wm831x_alive_ldo_list_voltage(rdev, vsel);
 +      ret = regulator_list_voltage_linear(rdev, vsel);
        if (ret < 0)
                return ret;
        if (ret < min_uV || ret > max_uV)
@@@ -669,6 -722,22 +671,6 @@@ static int wm831x_alive_ldo_set_suspend
        return wm831x_alive_ldo_set_voltage_int(rdev, reg, uV, uV, &selector);
  }
  
 -static int wm831x_alive_ldo_get_voltage_sel(struct regulator_dev *rdev)
 -{
 -      struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 -      struct wm831x *wm831x = ldo->wm831x;
 -      int reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
 -      int ret;
 -
 -      ret = wm831x_reg_read(wm831x, reg);
 -      if (ret < 0)
 -              return ret;
 -
 -      ret &= WM831X_LDO11_ON_VSEL_MASK;
 -
 -      return ret;
 -}
 -
  static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
  {
        struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
  }
  
  static struct regulator_ops wm831x_alive_ldo_ops = {
 -      .list_voltage = wm831x_alive_ldo_list_voltage,
 -      .get_voltage_sel = wm831x_alive_ldo_get_voltage_sel,
 +      .list_voltage = regulator_list_voltage_linear,
 +      .get_voltage_sel = regulator_get_voltage_sel_regmap,
        .set_voltage = wm831x_alive_ldo_set_voltage,
        .set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
        .get_status = wm831x_alive_ldo_get_status,
  
 -      .is_enabled = wm831x_ldo_is_enabled,
 -      .enable = wm831x_ldo_enable,
 -      .disable = wm831x_ldo_disable,
 +      .is_enabled = regulator_is_enabled_regmap,
 +      .enable = regulator_enable_regmap,
 +      .disable = regulator_disable_regmap,
  };
  
  static __devinit int wm831x_alive_ldo_probe(struct platform_device *pdev)
  {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 +      struct regulator_config config = { };
        int id;
        struct wm831x_ldo *ldo;
        struct resource *res;
  
        dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
  
 -      if (pdata == NULL || pdata->ldo[id] == NULL)
 -              return -ENODEV;
 -
        ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
        if (ldo == NULL) {
                dev_err(&pdev->dev, "Unable to allocate private data\n");
  
        snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
        ldo->desc.name = ldo->name;
 +
 +      snprintf(ldo->supply_name, sizeof(ldo->supply_name),
 +               "LDO%dVDD", id + 1);
 +      ldo->desc.supply_name = ldo->supply_name;
 +
        ldo->desc.id = id;
        ldo->desc.type = REGULATOR_VOLTAGE;
        ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
        ldo->desc.ops = &wm831x_alive_ldo_ops;
        ldo->desc.owner = THIS_MODULE;
 -
 -      ldo->regulator = regulator_register(&ldo->desc, &pdev->dev,
 -                                           pdata->ldo[id], ldo, NULL);
 +      ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
 +      ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
 +      ldo->desc.enable_reg = WM831X_LDO_ENABLE;
 +      ldo->desc.enable_mask = 1 << id;
 +      ldo->desc.min_uV = 800000;
 +      ldo->desc.uV_step = 50000;
 +
 +      config.dev = pdev->dev.parent;
 +      if (pdata)
 +              config.init_data = pdata->ldo[id];
 +      config.driver_data = ldo;
 +      config.regmap = wm831x->regmap;
 +
 +      ldo->regulator = regulator_register(&ldo->desc, &config);
        if (IS_ERR(ldo->regulator)) {
                ret = PTR_ERR(ldo->regulator);
                dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
diff --combined drivers/watchdog/Kconfig
@@@ -129,6 -129,17 +129,6 @@@ config 977_WATCHDO
  
          Not sure? It's safe to say N.
  
 -config IXP2000_WATCHDOG
 -      tristate "IXP2000 Watchdog"
 -      depends on ARCH_IXP2000
 -      help
 -        Say Y here if to include support for the watchdog timer
 -        in the Intel IXP2000(2400, 2800, 2850) network processors.
 -        This driver can be built as a module by choosing M. The module
 -        will be called ixp2000_wdt.
 -
 -        Say N if you are unsure.
 -
  config IXP4XX_WATCHDOG
        tristate "IXP4xx Watchdog"
        depends on ARCH_IXP4XX
@@@ -532,7 -543,7 +532,7 @@@ config WAFER_WD
  
  config I6300ESB_WDT
        tristate "Intel 6300ESB Timer/Watchdog"
 -      depends on X86 && PCI
 +      depends on PCI
        ---help---
          Hardware driver for the watchdog timer built into the Intel
          6300ESB controller hub.
          To compile this driver as a module, choose M here: the
          module will be called i6300esb.
  
 +config IE6XX_WDT
 +      tristate "Intel Atom E6xx Watchdog"
 +      depends on X86 && PCI
 +      select WATCHDOG_CORE
 +      select MFD_CORE
 +      select LPC_SCH
 +      ---help---
 +        Hardware driver for the watchdog timer built into the Intel
 +        Atom E6XX (TunnelCreek) processor.
 +
 +        To compile this driver as a module, choose M here: the
 +        module will be called ie6xx_wdt.
 +
  config INTEL_SCU_WATCHDOG
        bool "Intel SCU Watchdog for Mobile Platforms"
        depends on X86_MRST
  config ITCO_WDT
        tristate "Intel TCO Timer/Watchdog"
        depends on (X86 || IA64) && PCI
+       select LPC_ICH
        ---help---
          Hardware driver for the intel TCO timer based watchdog devices.
          These drivers are included in the Intel 82801 I/O Controller
@@@ -609,12 -608,7 +610,12 @@@ config IT87_WD
        depends on X86 && EXPERIMENTAL
        ---help---
          This is the driver for the hardware watchdog on the ITE IT8702,
 -        IT8712, IT8716, IT8718, IT8720, IT8721, IT8726 Super I/O chips.
 +        IT8712, IT8716, IT8718, IT8720, IT8721, IT8726 and IT8728
 +        Super I/O chips.
 +
 +        If the driver does not work, then make sure that the game port in
 +        the BIOS is enabled.
 +
          This watchdog simply watches your kernel to make sure it doesn't
          freeze, and if it does, it reboots your computer after a certain
          amount of time.
@@@ -787,7 -781,7 +788,7 @@@ config SMSC37B787_WD
  
  config VIA_WDT
        tristate "VIA Watchdog Timer"
 -      depends on X86
 +      depends on X86 && PCI
        select WATCHDOG_CORE
        ---help---
        This is the driver for the hardware watchdog timer on VIA
@@@ -944,7 -938,7 +945,7 @@@ config BCM47XX_WD
        tristate "Broadcom BCM47xx Watchdog Timer"
        depends on BCM47XX
        help
 -        Hardware driver for the Broadcom BCM47xx Watchog Timer.
 +        Hardware driver for the Broadcom BCM47xx Watchdog Timer.
  
  config RC32434_WDT
        tristate "IDT RC32434 SoC Watchdog Timer"
@@@ -1145,7 -1139,6 +1146,7 @@@ config ZVM_WATCHDO
  config SH_WDT
        tristate "SuperH Watchdog"
        depends on SUPERH && (CPU_SH3 || CPU_SH4)
 +      select WATCHDOG_CORE
        help
          This driver adds watchdog support for the integrated watchdog in the
          SuperH processors. If you have one of these processors and wish
@@@ -31,6 -31,8 +31,8 @@@ struct asic3_platform_data 
  
        unsigned int gpio_base;
  
+       unsigned int clock_rate;
        struct asic3_led *leds;
  };
  
  #define ASIC3_GPIOC13_nPWAIT          ASIC3_CONFIG_GPIO(45, 1, 1, 0)
  #define ASIC3_GPIOC14_nPIOIS16                ASIC3_CONFIG_GPIO(46, 1, 1, 0)
  #define ASIC3_GPIOC15_nPIOR           ASIC3_CONFIG_GPIO(47, 1, 0, 0)
 +#define ASIC3_GPIOD4_CF_nCD           ASIC3_CONFIG_GPIO(52, 1, 0, 0)
  #define ASIC3_GPIOD11_nCIOIS16                ASIC3_CONFIG_GPIO(59, 1, 0, 0)
  #define ASIC3_GPIOD12_nCWAIT          ASIC3_CONFIG_GPIO(60, 1, 0, 0)
  #define ASIC3_GPIOD15_nPIOW           ASIC3_CONFIG_GPIO(63, 1, 0, 0)
  
  #include <linux/mfd/da9052/reg.h>
  
+ /* Common - HWMON Channel Definations */
+ #define DA9052_ADC_VDDOUT     0
+ #define DA9052_ADC_ICH                1
+ #define DA9052_ADC_TBAT       2
+ #define DA9052_ADC_VBAT       3
+ #define DA9052_ADC_IN4                4
+ #define DA9052_ADC_IN5                5
+ #define DA9052_ADC_IN6                6
+ #define DA9052_ADC_TSI                7
+ #define DA9052_ADC_TJUNC      8
+ #define DA9052_ADC_VBBAT      9
  #define DA9052_IRQ_DCIN       0
  #define DA9052_IRQ_VBUS       1
  #define DA9052_IRQ_DCINREM    2
@@@ -79,13 -91,19 +91,20 @@@ struct da9052 
        struct device *dev;
        struct regmap *regmap;
  
+       struct mutex auxadc_lock;
+       struct completion done;
        int irq_base;
 +      struct regmap_irq_chip_data *irq_data;
        u8 chip_id;
  
        int chip_irq;
  };
  
+ /* ADC API */
+ int da9052_adc_manual_read(struct da9052 *da9052, unsigned char channel);
+ int da9052_adc_read_temp(struct da9052 *da9052);
  /* Device I/O API */
  static inline int da9052_reg_read(struct da9052 *da9052, unsigned char reg)
  {
@@@ -17,7 -17,6 +17,7 @@@
  
  #include <linux/mutex.h>
  #include <linux/interrupt.h>
 +#include <linux/regmap.h>
  
  enum wm8994_type {
        WM8994 = 0,
@@@ -27,6 -26,7 +27,6 @@@
  
  struct regulator_dev;
  struct regulator_bulk_data;
 -struct regmap;
  
  #define WM8994_NUM_GPIO_REGS 11
  #define WM8994_NUM_LDO_REGS   2
@@@ -57,6 -57,7 +57,7 @@@ struct wm8994 
  
        enum wm8994_type type;
        int revision;
+       int cust_id;
  
        struct device *dev;
        struct regmap *regmap;
@@@ -94,17 -95,17 +95,17 @@@ static inline int wm8994_request_irq(st
                                     irq_handler_t handler, const char *name,
                                     void *data)
  {
 -      if (!wm8994->irq_base)
 +      if (!wm8994->irq_data)
                return -EINVAL;
 -      return request_threaded_irq(wm8994->irq_base + irq, NULL, handler,
 -                                  IRQF_TRIGGER_RISING, name,
 +      return request_threaded_irq(regmap_irq_get_virq(wm8994->irq_data, irq),
 +                                  NULL, handler, IRQF_TRIGGER_RISING, name,
                                    data);
  }
  static inline void wm8994_free_irq(struct wm8994 *wm8994, int irq, void *data)
  {
 -      if (!wm8994->irq_base)
 +      if (!wm8994->irq_data)
                return;
 -      free_irq(wm8994->irq_base + irq, data);
 +      free_irq(regmap_irq_get_virq(wm8994->irq_data, irq), data);
  }
  
  int wm8994_irq_init(struct wm8994 *wm8994);