Merge tag 'mfd-for-linus-3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Aug 2014 00:17:39 +0000 (17:17 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Aug 2014 00:17:39 +0000 (17:17 -0700)
Pull MFD update from Lee Jones:
 "Changes to existing drivers:
   - checkpatch fixes throughout the subsystem
   - use Regmap to handle IRQs in max77686, extcon-max77693 and
     mc13xxx-core
   - use DMA in rtsx_pcr
   - restrict building on unsupported architectures on timberdale,
     cs5535
   - SPI hardening in cros_ec_spi
   - more robust error handing in asic3, cros_ec, ab8500-debugfs,
     max77686 and pcf50633-core
   - reorder PM runtime and regulator handing during shutdown in arizona
   - enable wakeup in cros_ec_spi
   - unused variable/code clean-up in pm8921-core, cros_ec, htc-i2cpld,
     tps65912-spi, wm5110-tables and ab8500-debugfs
   - add regulator handing into suspend() in sec-core
   - remove pointless wrapper functions in extcon-max77693 and
     i2c-cros-ec-tunnel
   - use cross-architecture friendly data sizes in stmpe-i2c, arizona,
     max77686 and tps65910
   - devicetree documentation updates throughout
   - provide power management support in max77686
   - few OF clean-ups in max77686
   - use manged resources in tps6105x

  New drivers/supported devices:
   - add support for s2mpu02 to sec-core
   - add support for Allwinner A32 to sun6i-prcm
   - add support for Maxim 77802 in max77686
   - add support for DA9063 AD in da9063
   - new driver for Intel PMICs (generic) and specifically Crystal Cove

  (Re-)moved drivers ==
   - move out keyboard functionality cros_ec ==> input/keyboard/cros_ec_keyb"

* tag 'mfd-for-linus-3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (101 commits)
  MAINTAINERS: Update MFD repo location
  mfd: omap-usb-host: Fix improper mask use.
  mfd: arizona: Only free the CTRLIF_ERR IRQ if we requested it
  mfd: arizona: Add missing handling for ISRC3 under/overclocked
  mfd: wm5110: Add new interrupt register definitions
  mfd: arizona: Rename thermal shutdown interrupt
  mfd: wm5110: Add in the output done interrupts
  mfd: wm5110: Remove non-existant interrupts
  mfd: tps65912-spi: Remove unused variable
  mfd: htc-i2cpld: Remove unused code
  mfd: da9063: Add support for AD silicon variant
  mfd: arizona: Map MICVDD from extcon device to the Arizona core
  mfd: arizona: Add MICVDD to mapped regulators for wm8997
  mfd: max77686: Ensure device type IDs are architecture agnostic
  mfd: max77686: Add Maxim 77802 PMIC support
  mfd: tps6105x: Use managed resources when allocating memory
  mfd: wm8997-tables: Suppress 'line over 80 chars' warnings
  mfd: kempld-core: Correct a variety of checkpatch warnings
  mfd: ipaq-micro: Fix coding style errors/warnings reported by checkpatch
  mfd: si476x-cmd: Remedy checkpatch style complains
  ...

1  2 
MAINTAINERS
drivers/mfd/cros_ec_spi.c
drivers/regulator/s2mps11.c
include/linux/mfd/arizona/core.h
sound/soc/codecs/arizona.c

diff --combined MAINTAINERS
index b0981c2f421874f15adf2bc8e89ab9859ccacff2,768805592088ad61546e9896e58552b7b34ab75e..8b0c4e22119ce2e7b35de4b003669b7158df2aab
@@@ -70,8 -70,6 +70,8 @@@ Descriptions of section entries
  
        P: Person (obsolete)
        M: Mail patches to: FullName <address@domain>
 +      R: Designated reviewer: FullName <address@domain>
 +         These reviewers should be CCed on patches.
        L: Mailing list that is relevant to this area
        W: Web-page with status/info
        Q: Patchwork web based patch tracking system site
@@@ -150,14 -148,6 +150,14 @@@ L:       linux-scsi@vger.kernel.or
  S:    Maintained
  F:    drivers/scsi/53c700*
  
 +6LOWPAN GENERIC (BTLE/IEEE 802.15.4)
 +M:    Alexander Aring <alex.aring@gmail.com>
 +L:    linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
 +L:    linux-bluetooth@vger.kernel.org
 +S:    Maintained
 +F:    net/6lowpan/
 +F:    include/net/6lowpan.h
 +
  6PACK NETWORK DRIVER FOR AX.25
  M:    Andreas Koensgen <ajk@comnets.uni-bremen.de>
  L:    linux-hams@vger.kernel.org
@@@ -166,6 -156,7 +166,6 @@@ F: drivers/net/hamradio/6pack.
  
  8169 10/100/1000 GIGABIT ETHERNET DRIVER
  M:    Realtek linux nic maintainers <nic_swsd@realtek.com>
 -M:    Francois Romieu <romieu@fr.zoreil.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/realtek/r8169.c
@@@ -524,16 -515,6 +524,16 @@@ S:       Supporte
  F:    fs/aio.c
  F:    include/linux/*aio*.h
  
 +AIRSPY MEDIA DRIVER
 +M:    Antti Palosaari <crope@iki.fi>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +W:    http://palosaari.fi/linux/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +T:    git git://linuxtv.org/anttip/media_tree.git
 +S:    Maintained
 +F:    drivers/media/usb/airspy/
 +
  ALCATEL SPEEDTOUCH USB DRIVER
  M:    Duncan Sands <duncan.sands@free.fr>
  L:    linux-usb@vger.kernel.org
@@@ -1333,20 -1314,6 +1333,20 @@@ W:    http://oss.renesas.co
  Q:    http://patchwork.kernel.org/project/linux-sh/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git next
  S:    Supported
 +F:    arch/arm/boot/dts/emev2*
 +F:    arch/arm/boot/dts/r7s*
 +F:    arch/arm/boot/dts/r8a*
 +F:    arch/arm/boot/dts/sh*
 +F:    arch/arm/configs/ape6evm_defconfig
 +F:    arch/arm/configs/armadillo800eva_defconfig
 +F:    arch/arm/configs/bockw_defconfig
 +F:    arch/arm/configs/genmai_defconfig
 +F:    arch/arm/configs/koelsch_defconfig
 +F:    arch/arm/configs/kzm9g_defconfig
 +F:    arch/arm/configs/lager_defconfig
 +F:    arch/arm/configs/mackerel_defconfig
 +F:    arch/arm/configs/marzen_defconfig
 +F:    arch/arm/configs/shmobile_defconfig
  F:    arch/arm/mach-shmobile/
  F:    drivers/sh/
  
@@@ -1814,13 -1781,6 +1814,13 @@@ W:    http://bcache.evilpiepirate.or
  S:    Maintained:
  F:    drivers/md/bcache/
  
 +BECEEM BCS200/BCS220-3/BCSM250 WIMAX SUPPORT
 +M: Kevin McKinney <klmckinney1@gmail.com>
 +M: Matthias Beyer <mail@beyermatthias.de>
 +L: devel@driverdev.osuosl.org
 +S: Maintained
 +F: drivers/staging/bcm*
 +
  BEFS FILE SYSTEM
  S:    Orphan
  F:    Documentation/filesystems/befs.txt
@@@ -1939,13 -1899,6 +1939,13 @@@ S:    Supporte
  F:    drivers/net/bonding/
  F:    include/uapi/linux/if_bonding.h
  
 +BPF (Safe dynamic programs and tools)
 +M:    Alexei Starovoitov <ast@kernel.org>
 +L:    netdev@vger.kernel.org
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +F:    kernel/bpf/
 +
  BROADCOM B44 10/100 ETHERNET DRIVER
  M:    Gary Zambrano <zambrano@broadcom.com>
  L:    netdev@vger.kernel.org
@@@ -1959,8 -1912,7 +1959,8 @@@ S:      Supporte
  F:    drivers/net/ethernet/broadcom/genet/
  
  BROADCOM BNX2 GIGABIT ETHERNET DRIVER
 -M:    Michael Chan <mchan@broadcom.com>
 +M:    Sony Chacko <sony.chacko@qlogic.com>
 +M:    Dept-HSGLinuxNICDev@qlogic.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bnx2.*
@@@ -2005,7 -1957,7 +2005,7 @@@ F:      arch/arm/boot/dts/bcm5301x.dts
  F:    arch/arm/boot/dts/bcm470*
  
  BROADCOM TG3 GIGABIT ETHERNET DRIVER
 -M:    Nithin Nayak Sujir <nsujir@broadcom.com>
 +M:    Prashant Sreedharan <prashant@broadcom.com>
  M:    Michael Chan <mchan@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -2022,13 -1974,13 +2022,13 @@@ S:   Supporte
  F:    drivers/net/wireless/brcm80211/
  
  BROADCOM BNX2FC 10 GIGABIT FCOE DRIVER
 -M:    Eddie Wai <eddie.wai@broadcom.com>
 +M:    QLogic-Storage-Upstream@qlogic.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/bnx2fc/
  
  BROADCOM BNX2I 1/10 GIGABIT iSCSI DRIVER
 -M:    Eddie Wai <eddie.wai@broadcom.com>
 +M:    QLogic-Storage-Upstream@qlogic.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/bnx2i/
@@@ -2556,8 -2508,8 +2556,8 @@@ F:      arch/x86/kernel/cpuid.
  F:    arch/x86/kernel/msr.c
  
  CPU POWER MONITORING SUBSYSTEM
 -M:    Dominik Brodowski <linux@dominikbrodowski.net>
  M:    Thomas Renninger <trenn@suse.de>
 +L:    linux-pm@vger.kernel.org
  S:    Maintained
  F:    tools/power/cpupower/
  
@@@ -2892,7 -2844,6 +2892,7 @@@ F:      drivers/staging/dgnc
  DIGI EPCA PCI PRODUCTS
  M:    Lidza Louina <lidza.louina@gmail.com>
  M:    Mark Hounschell <markh@compro.net>
 +M:    Daeseok Youn <daeseok.youn@gmail.com>
  L:    driverdev-devel@linuxdriverproject.org
  S:    Maintained
  F:    drivers/staging/dgap/
@@@ -2949,8 -2900,8 +2949,8 @@@ S:      Maintaine
  L:    linux-media@vger.kernel.org
  L:    dri-devel@lists.freedesktop.org
  L:    linaro-mm-sig@lists.linaro.org
 -F:    drivers/base/dma-buf*
 -F:    include/linux/dma-buf*
 +F:    drivers/dma-buf/
 +F:    include/linux/dma-buf* include/linux/reservation.h include/linux/*fence.h
  F:    Documentation/dma-buf-sharing.txt
  T:    git git://git.linaro.org/people/sumitsemwal/linux-dma-buf.git
  
@@@ -3386,13 -3337,6 +3386,13 @@@ W:    bluesmoke.sourceforge.ne
  S:    Maintained
  F:    drivers/edac/i82975x_edac.c
  
 +EDAC-IE31200
 +M:    Jason Baron <jbaron@akamai.com>
 +L:    linux-edac@vger.kernel.org
 +W:    bluesmoke.sourceforge.net
 +S:    Maintained
 +F:    drivers/edac/ie31200_edac.c
 +
  EDAC-MPC85XX
  M:    Johannes Thumshirn <johannes.thumshirn@men.de>
  L:    linux-edac@vger.kernel.org
@@@ -4019,12 -3963,6 +4019,12 @@@ F:    Documentation/isdn/README.gigase
  F:    drivers/isdn/gigaset/
  F:    include/uapi/linux/gigaset_dev.h
  
 +GO7007 MPEG CODEC
 +M:    Hans Verkuil <hans.verkuil@cisco.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/media/usb/go7007/
 +
  GPIO SUBSYSTEM
  M:    Linus Walleij <linus.walleij@linaro.org>
  M:    Alexandre Courbot <gnurou@gmail.com>
@@@ -4253,7 -4191,7 +4253,7 @@@ L:      linux-kernel@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Maintained
  F:    Documentation/timers/
 -F:    kernel/hrtimer.c
 +F:    kernel/time/hrtimer.c
  F:    kernel/time/clockevents.c
  F:    kernel/time/tick*.*
  F:    kernel/time/timer_*.c
@@@ -4559,7 -4497,8 +4559,7 @@@ S:      Supporte
  F:    drivers/idle/i7300_idle.c
  
  IEEE 802.15.4 SUBSYSTEM
 -M:    Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
 -M:    Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
 +M:    Alexander Aring <alex.aring@gmail.com>
  L:    linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://apps.sourceforge.net/trac/linux-zigbee
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
@@@ -5115,6 -5054,13 +5115,6 @@@ S:     Maintaine
  F:    Documentation/hwmon/k8temp
  F:    drivers/hwmon/k8temp.c
  
 -KTAP
 -M:    Jovi Zhangwei <jovi.zhangwei@gmail.com>
 -W:    http://www.ktap.org
 -L:    ktap@freelists.org
 -S:    Maintained
 -F:    drivers/staging/ktap/
 -
  KCONFIG
  M:    "Yann E. MORIN" <yann.morin.1998@free.fr>
  L:    linux-kbuild@vger.kernel.org
@@@ -5424,7 -5370,6 +5424,7 @@@ F:      arch/powerpc/boot/rs6000.
  LINUX FOR POWERPC (32-BIT AND 64-BIT)
  M:    Benjamin Herrenschmidt <benh@kernel.crashing.org>
  M:    Paul Mackerras <paulus@samba.org>
 +M:    Michael Ellerman <mpe@ellerman.id.au>
  W:    http://www.penguinppc.org/
  L:    linuxppc-dev@lists.ozlabs.org
  Q:    http://patchwork.ozlabs.org/project/linuxppc-dev/list/
@@@ -5466,17 -5411,16 +5466,17 @@@ F:   arch/powerpc/*/*/*virtex
  
  LINUX FOR POWERPC EMBEDDED PPC8XX
  M:    Vitaly Bordug <vitb@kernel.crashing.org>
 -M:    Marcelo Tosatti <marcelo@kvack.org>
  W:    http://www.penguinppc.org/
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Maintained
  F:    arch/powerpc/platforms/8xx/
  
  LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
 +M:    Scott Wood <scottwood@freescale.com>
  M:    Kumar Gala <galak@kernel.crashing.org>
  W:    http://www.penguinppc.org/
  L:    linuxppc-dev@lists.ozlabs.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux.git
  S:    Maintained
  F:    arch/powerpc/platforms/83xx/
  F:    arch/powerpc/platforms/85xx/
@@@ -5699,6 -5643,16 +5699,6 @@@ F:     Documentation/networking/mac80211-in
  F:    include/net/mac80211.h
  F:    net/mac80211/
  
 -MAC80211 PID RATE CONTROL
 -M:    Stefano Brivio <stefano.brivio@polimi.it>
 -M:    Mattias Nissler <mattias.nissler@gmx.de>
 -L:    linux-wireless@vger.kernel.org
 -W:    http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/PID
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
 -S:    Maintained
 -F:    net/mac80211/rc80211_pid*
 -
  MACVLAN DRIVER
  M:    Patrick McHardy <kaber@trash.net>
  L:    netdev@vger.kernel.org
@@@ -5743,8 -5697,7 +5743,8 @@@ S:      Maintaine
  F:    drivers/net/ethernet/marvell/mvneta.*
  
  MARVELL MWIFIEX WIRELESS DRIVER
 -M:    Bing Zhao <bzhao@marvell.com>
 +M:    Amitkumar Karwar <akarwar@marvell.com>
 +M:    Avinash Patil <patila@marvell.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
  F:    drivers/net/wireless/mwifiex/
@@@ -5990,9 -5943,9 +5990,9 @@@ W:      http://palosaari.fi/linux
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  T:    git git://linuxtv.org/anttip/media_tree.git
  S:    Maintained
 -F:    drivers/staging/media/msi3101/msi001*
 +F:    drivers/media/tuners/msi001*
  
 -MSI3101 MEDIA DRIVER
 +MSI2500 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
  L:    linux-media@vger.kernel.org
  W:    http://linuxtv.org/
@@@ -6000,7 -5953,7 +6000,7 @@@ W:      http://palosaari.fi/linux
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  T:    git git://linuxtv.org/anttip/media_tree.git
  S:    Maintained
 -F:    drivers/staging/media/msi3101/sdr-msi3101*
 +F:    drivers/media/usb/msi2500/
  
  MT9M032 APTINA SENSOR DRIVER
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
@@@ -6037,8 -5990,7 +6037,7 @@@ F:      include/media/mt9v032.
  MULTIFUNCTION DEVICES (MFD)
  M:    Samuel Ortiz <sameo@linux.intel.com>
  M:    Lee Jones <lee.jones@linaro.org>
- T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-next.git
- T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-fixes.git
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
  S:    Supported
  F:    drivers/mfd/
  F:    include/linux/mfd/
@@@ -6524,12 -6476,11 +6523,12 @@@ L:   linux-omap@vger.kernel.or
  S:    Maintained
  F:    arch/arm/mach-omap2/omap_hwmod_44xx_data.c
  
 -OMAP IMAGE SIGNAL PROCESSOR (ISP)
 +OMAP IMAGING SUBSYSTEM (OMAP3 ISP and OMAP4 ISS)
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    drivers/media/platform/omap3isp/
 +F:    drivers/staging/media/omap4iss/
  
  OMAP USB SUPPORT
  M:    Felipe Balbi <balbi@ti.com>
@@@ -6835,7 -6786,7 +6834,7 @@@ F:      arch/x86/kernel/quirks.
  
  PCI DRIVER FOR IMX6
  M:    Richard Zhu <r65037@freescale.com>
 -M:    Shawn Guo <shawn.guo@linaro.org>
 +M:    Shawn Guo <shawn.guo@freescale.com>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -6992,12 -6943,6 +6991,12 @@@ L:    linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    drivers/pinctrl/pinctrl-at91.c
  
 +PIN CONTROLLER - RENESAS
 +M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 +L:    linux-sh@vger.kernel.org
 +S:    Maintained
 +F:    drivers/pinctrl/sh-pfc/
 +
  PIN CONTROLLER - SAMSUNG
  M:    Tomasz Figa <t.figa@samsung.com>
  M:    Thomas Abraham <thomas.abraham@linaro.org>
@@@ -7062,16 -7007,14 +7061,16 @@@ POSIX CLOCKS and TIMER
  M:    Thomas Gleixner <tglx@linutronix.de>
  L:    linux-kernel@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 -S:    Supported
 +S:    Maintained
  F:    fs/timerfd.c
  F:    include/linux/timer*
 -F:    kernel/*timer*
 +F:    kernel/time/*timer*
  
  POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS
 +M:    Sebastian Reichel <sre@kernel.org>
  M:    Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
  M:    David Woodhouse <dwmw2@infradead.org>
 +L:    linux-pm@vger.kernel.org
  T:    git git://git.infradead.org/battery-2.6.git
  S:    Maintained
  F:    include/linux/power_supply.h
@@@ -7281,12 -7224,6 +7280,12 @@@ M:    Robert Jarzmik <robert.jarzmik@free.
  L:    rtc-linux@googlegroups.com
  S:    Maintained
  
 +QAT DRIVER
 +M:      Tadeusz Struk <tadeusz.struk@intel.com>
 +L:      qat-linux@intel.com
 +S:      Supported
 +F:      drivers/crypto/qat/
 +
  QIB DRIVER
  M:    Mike Marciniszyn <infinipath@intel.com>
  L:    linux-rdma@vger.kernel.org
@@@ -7468,20 -7405,16 +7467,20 @@@ S:   Orpha
  F:    drivers/net/wireless/ray*
  
  RCUTORTURE MODULE
 -M:    Josh Triplett <josh@freedesktop.org>
 +M:    Josh Triplett <josh@joshtriplett.org>
  M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
  F:    Documentation/RCU/torture.txt
 -F:    kernel/rcu/torture.c
 +F:    kernel/rcu/rcutorture.c
  
  RCUTORTURE TEST FRAMEWORK
  M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    Josh Triplett <josh@joshtriplett.org>
 +R:    Steven Rostedt <rostedt@goodmis.org>
 +R:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 +R:    Lai Jiangshan <laijs@cn.fujitsu.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
@@@ -7504,11 -7437,8 +7503,11 @@@ S:    Supporte
  F:    net/rds/
  
  READ-COPY UPDATE (RCU)
 -M:    Dipankar Sarma <dipankar@in.ibm.com>
  M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    Josh Triplett <josh@joshtriplett.org>
 +R:    Steven Rostedt <rostedt@goodmis.org>
 +R:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 +R:    Lai Jiangshan <laijs@cn.fujitsu.com>
  L:    linux-kernel@vger.kernel.org
  W:    http://www.rdrop.com/users/paulmck/RCU/
  S:    Supported
@@@ -7518,7 -7448,7 +7517,7 @@@ X:      Documentation/RCU/torture.tx
  F:    include/linux/rcu*
  X:    include/linux/srcu.h
  F:    kernel/rcu/
 -X:    kernel/rcu/torture.c
 +X:    kernel/torture.c
  
  REAL TIME CLOCK (RTC) SUBSYSTEM
  M:    Alessandro Zummo <a.zummo@towertech.it>
@@@ -7530,13 -7460,6 +7529,13 @@@ F:    drivers/rtc
  F:    include/linux/rtc.h
  F:    include/uapi/linux/rtc.h
  
 +REALTEK AUDIO CODECS
 +M:    Bard Liao <bardliao@realtek.com>
 +M:    Oder Chiou <oder_chiou@realtek.com>
 +S:    Maintained
 +F:    sound/soc/codecs/rt*
 +F:    include/sound/rt*.h
 +
  REISERFS FILE SYSTEM
  L:    reiserfs-devel@vger.kernel.org
  S:    Supported
@@@ -7646,7 -7569,7 +7645,7 @@@ W:      http://palosaari.fi/linux
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  T:    git git://linuxtv.org/anttip/media_tree.git
  S:    Maintained
 -F:    drivers/staging/media/rtl2832u_sdr/rtl2832_sdr*
 +F:    drivers/media/dvb-frontends/rtl2832_sdr*
  
  RTL8180 WIRELESS DRIVER
  M:    "John W. Linville" <linville@tuxdriver.com>
@@@ -7880,11 -7803,6 +7879,11 @@@ S:    Maintaine
  F:    include/linux/mmc/dw_mmc.h
  F:    drivers/mmc/host/dw_mmc*
  
 +THUNDERBOLT DRIVER
 +M:    Andreas Noever <andreas.noever@gmail.com>
 +S:    Maintained
 +F:    drivers/thunderbolt/
 +
  TIMEKEEPING, CLOCKSOURCE CORE, NTP
  M:    John Stultz <john.stultz@linaro.org>
  M:    Thomas Gleixner <tglx@linutronix.de>
@@@ -8020,16 -7938,6 +8019,16 @@@ S:    Maintaine
  F:    drivers/mmc/host/sdhci.*
  F:    drivers/mmc/host/sdhci-pltfm.[ch]
  
 +SECURE COMPUTING
 +M:    Kees Cook <keescook@chromium.org>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git seccomp
 +S:    Supported
 +F:    kernel/seccomp.c
 +F:    include/uapi/linux/seccomp.h
 +F:    include/linux/seccomp.h
 +K:    \bsecure_computing
 +K:    \bTIF_SECCOMP\b
 +
  SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF)
  M:    Anton Vorontsov <anton@enomsg.org>
  L:    linuxppc-dev@lists.ozlabs.org
@@@ -8098,16 -8006,6 +8097,16 @@@ F:    drivers/ata
  F:    include/linux/ata.h
  F:    include/linux/libata.h
  
 +SERIAL ATA AHCI PLATFORM devices support
 +M:    Hans de Goede <hdegoede@redhat.com>
 +M:    Tejun Heo <tj@kernel.org>
 +L:    linux-ide@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
 +S:    Supported
 +F:    drivers/ata/ahci_platform.c
 +F:    drivers/ata/libahci_platform.c
 +F:    include/linux/ahci_platform.h
 +
  SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
  M:    Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
  L:    linux-scsi@vger.kernel.org
@@@ -8323,9 -8221,6 +8322,9 @@@ F:      mm/sl?b
  SLEEPABLE READ-COPY UPDATE (SRCU)
  M:    Lai Jiangshan <laijs@cn.fujitsu.com>
  M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    Josh Triplett <josh@joshtriplett.org>
 +R:    Steven Rostedt <rostedt@goodmis.org>
 +R:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  L:    linux-kernel@vger.kernel.org
  W:    http://www.rdrop.com/users/paulmck/RCU/
  S:    Supported
@@@ -8425,12 -8320,6 +8424,12 @@@ M:    Chris Boot <bootc@bootc.net
  S:    Maintained
  F:    drivers/leds/leds-net48xx.c
  
 +SOFTLOGIC 6x10 MPEG CODEC
 +M:    Ismael Luceno <ismael.luceno@corp.bluecherry.net>
 +L:    linux-media@vger.kernel.org
 +S:    Supported
 +F:    drivers/media/pci/solo6x10/
 +
  SOFTWARE RAID (Multiple Disks) SUPPORT
  M:    Neil Brown <neilb@suse.de>
  L:    linux-raid@vger.kernel.org
@@@ -8621,12 -8510,37 +8620,12 @@@ L:   devel@driverdev.osuosl.or
  S:    Supported
  F:    drivers/staging/
  
 -STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS
 -M:    Henk de Groot <pe1dnn@amsat.org>
 -S:    Odd Fixes
 -F:    drivers/staging/wlags49_h2/
 -F:    drivers/staging/wlags49_h25/
 -
 -STAGING - ASUS OLED
 -M:    Jakub Schmidtke <sjakub@gmail.com>
 -S:    Odd Fixes
 -F:    drivers/staging/asus_oled/
 -
  STAGING - COMEDI
  M:    Ian Abbott <abbotti@mev.co.uk>
  M:    H Hartley Sweeten <hsweeten@visionengravers.com>
  S:    Odd Fixes
  F:    drivers/staging/comedi/
  
 -STAGING - CRYSTAL HD VIDEO DECODER
 -M:    Naren Sankar <nsankar@broadcom.com>
 -M:    Jarod Wilson <jarod@wilsonet.com>
 -M:    Scott Davilla <davilla@4pi.com>
 -M:    Manu Abraham <abraham.manu@gmail.com>
 -S:    Odd Fixes
 -F:    drivers/staging/crystalhd/
 -
 -STAGING - ECHO CANCELLER
 -M:    Steve Underwood <steveu@coppice.org>
 -M:    David Rowe <david@rowetel.com>
 -S:    Odd Fixes
 -F:    drivers/staging/echo/
 -
  STAGING - ET131X NETWORK DRIVER
  M:    Mark Einon <mark.einon@gmail.com>
  S:    Odd Fixes
@@@ -8637,6 -8551,16 +8636,6 @@@ M:     Marek Belisko <marek.belisko@gmail.c
  S:    Odd Fixes
  F:    drivers/staging/ft1000/
  
 -STAGING - FRONTIER TRANZPORT AND ALPHATRACK
 -M:    David Täht <d@teklibre.com>
 -S:    Odd Fixes
 -F:    drivers/staging/frontier/
 -
 -STAGING - GO7007 MPEG CODEC
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 -S:    Maintained
 -F:    drivers/staging/media/go7007/
 -
  STAGING - INDUSTRIAL IO
  M:    Jonathan Cameron <jic23@kernel.org>
  L:    linux-iio@vger.kernel.org
@@@ -8688,27 -8612,52 +8687,27 @@@ L:   linux-wireless@vger.kernel.or
  S:    Maintained
  F:    drivers/staging/rtl8723au/
  
 -STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER
 -M:    Teddy Wang <teddy.wang@siliconmotion.com.cn>
 -S:    Odd Fixes
 -F:    drivers/staging/sm7xxfb/
 -
  STAGING - SLICOSS
  M:    Lior Dotan <liodot@gmail.com>
  M:    Christopher Harrer <charrer@alacritech.com>
  S:    Odd Fixes
  F:    drivers/staging/slicoss/
  
 -STAGING - SOFTLOGIC 6x10 MPEG CODEC
 -M:    Ismael Luceno <ismael.luceno@corp.bluecherry.net>
 -S:    Supported
 -F:    drivers/staging/media/solo6x10/
 -
  STAGING - SPEAKUP CONSOLE SPEECH DRIVER
  M:    William Hubbs <w.d.hubbs@gmail.com>
  M:    Chris Brannon <chris@the-brannons.com>
  M:    Kirk Reiser <kirk@reisers.ca>
  M:    Samuel Thibault <samuel.thibault@ens-lyon.org>
 -L:    speakup@braille.uwo.ca
 +L:    speakup@linux-speakup.org
  W:    http://www.linux-speakup.org/
  S:    Odd Fixes
  F:    drivers/staging/speakup/
  
 -STAGING - TI DSP BRIDGE DRIVERS
 -M:    Omar Ramirez Luna <omar.ramirez@copitl.com>
 -S:    Odd Fixes
 -F:    drivers/staging/tidspbridge/
 -
 -STAGING - USB ENE SM/MS CARD READER DRIVER
 -M:    Al Cho <acho@novell.com>
 -S:    Odd Fixes
 -F:    drivers/staging/keucr/
 -
  STAGING - VIA VT665X DRIVERS
  M:    Forest Bond <forest@alittletooquiet.net>
  S:    Odd Fixes
  F:    drivers/staging/vt665?/
  
 -STAGING - WINBOND IS89C35 WLAN USB DRIVER
 -M:    Pavel Machek <pavel@ucw.cz>
 -S:    Odd Fixes
 -F:    drivers/staging/winbond/
 -
  STAGING - XGI Z7,Z9,Z11 PCI DISPLAY DRIVER
  M:    Arnaud Patard <arnaud.patard@rtp-net.org>
  S:    Odd Fixes
@@@ -8944,7 -8893,7 +8943,7 @@@ M:      Stephen Warren <swarren@wwwdotorg.or
  M:    Thierry Reding <thierry.reding@gmail.com>
  L:    linux-tegra@vger.kernel.org
  Q:    http://patchwork.ozlabs.org/project/linux-tegra/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-tegra.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux.git
  S:    Supported
  N:    [^a-z]tegra
  
@@@ -9034,7 -8983,7 +9033,7 @@@ F:      drivers/media/radio/radio-raremono.
  
  THERMAL
  M:    Zhang Rui <rui.zhang@intel.com>
 -M:    Eduardo Valentin <eduardo.valentin@ti.com>
 +M:    Eduardo Valentin <edubezval@gmail.com>
  L:    linux-pm@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git
@@@ -9061,18 -9010,11 +9060,18 @@@ S:   Maintaine
  F:    drivers/platform/x86/thinkpad_acpi.c
  
  TI BANDGAP AND THERMAL DRIVER
 -M:    Eduardo Valentin <eduardo.valentin@ti.com>
 +M:    Eduardo Valentin <edubezval@gmail.com>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  F:    drivers/thermal/ti-soc-thermal/
  
 +TI CLOCK DRIVER
 +M:    Tero Kristo <t-kristo@ti.com>
 +L:    linux-omap@vger.kernel.org
 +S:    Maintained
 +F:    drivers/clk/ti/
 +F:    include/linux/clk/ti.h
 +
  TI FLASH MEDIA INTERFACE DRIVER
  M:    Alex Dubov <oakad@yahoo.com>
  S:    Maintained
@@@ -9560,6 -9502,15 +9559,6 @@@ L:     netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/usb/smsc95xx.*
  
 -USB SN9C1xx DRIVER
 -M:    Luca Risolia <luca.risolia@studio.unibo.it>
 -L:    linux-usb@vger.kernel.org
 -L:    linux-media@vger.kernel.org
 -T:    git git://linuxtv.org/media_tree.git
 -W:    http://www.linux-projects.org
 -S:    Maintained
 -F:    drivers/staging/media/sn9c102/
 -
  USB SUBSYSTEM
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  L:    linux-usb@vger.kernel.org
@@@ -10066,13 -10017,6 +10065,13 @@@ S: Supporte
  F:    arch/x86/pci/*xen*
  F:    drivers/pci/*xen*
  
 +XEN BLOCK SUBSYSTEM
 +M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
 +L:    xen-devel@lists.xenproject.org (moderated for non-subscribers)
 +S:    Supported
 +F:    drivers/block/xen-blkback/*
 +F:    drivers/block/xen*
 +
  XEN SWIOTLB SUBSYSTEM
  M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
  L:    xen-devel@lists.xenproject.org (moderated for non-subscribers)
index 8c1c7cc373f8fe3456ca4a14bfbb72df676c5461,ac52e3653e90395d9fb9a0d51c975cad33526ef4..588c700af39c17882fb4c8b5af9131d195427c5e
@@@ -73,7 -73,7 +73,7 @@@
   *    if no record
   * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that
   *      is sent when we want to turn off CS at the end of a transaction.
-  * @lock: mutex to ensure only one user of cros_ec_command_spi_xfer at a time
+  * @lock: mutex to ensure only one user of cros_ec_cmd_xfer_spi at a time
   */
  struct cros_ec_spi {
        struct spi_device *spi;
@@@ -210,13 -210,13 +210,13 @@@ static int cros_ec_spi_receive_response
  }
  
  /**
-  * cros_ec_command_spi_xfer - Transfer a message over SPI and receive the reply
+  * cros_ec_cmd_xfer_spi - Transfer a message over SPI and receive the reply
   *
   * @ec_dev: ChromeOS EC device
   * @ec_msg: Message to transfer
   */
- static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
-                                   struct cros_ec_msg *ec_msg)
+ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev,
+                               struct cros_ec_command *ec_msg)
  {
        struct cros_ec_spi *ec_spi = ec_dev->priv;
        struct spi_transfer trans;
        u8 *ptr;
        int sum;
        int ret = 0, final_ret;
 -      struct timespec ts;
  
        /*
         * We have the shared ec_dev buffer plus we do lots of separate spi_sync
  
        /* If it's too soon to do another transaction, wait */
        if (ec_spi->last_transfer_ns) {
 -              struct timespec ts;
                unsigned long delay;    /* The delay completed so far */
  
 -              ktime_get_ts(&ts);
 -              delay = timespec_to_ns(&ts) - ec_spi->last_transfer_ns;
 +              delay = ktime_get_ns() - ec_spi->last_transfer_ns;
                if (delay < EC_SPI_RECOVERY_TIME_NS)
                        ndelay(EC_SPI_RECOVERY_TIME_NS - delay);
        }
        /* Get the response */
        if (!ret) {
                ret = cros_ec_spi_receive_response(ec_dev,
-                               ec_msg->in_len + EC_MSG_TX_PROTO_BYTES);
+                               ec_msg->insize + EC_MSG_TX_PROTO_BYTES);
        } else {
                dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret);
        }
  
-       /* turn off CS */
+       /*
+        * Turn off CS, possibly adding a delay to ensure the rising edge
+        * doesn't come too soon after the end of the data.
+        */
        spi_message_init(&msg);
-       if (ec_spi->end_of_msg_delay) {
-               /*
-                * Add delay for last transaction, to ensure the rising edge
-                * doesn't come too soon after the end of the data.
-                */
-               memset(&trans, 0, sizeof(trans));
-               trans.delay_usecs = ec_spi->end_of_msg_delay;
-               spi_message_add_tail(&trans, &msg);
-       }
+       memset(&trans, 0, sizeof(trans));
+       trans.delay_usecs = ec_spi->end_of_msg_delay;
+       spi_message_add_tail(&trans, &msg);
  
        final_ret = spi_sync(ec_spi->spi, &msg);
 -      ktime_get_ts(&ts);
 -      ec_spi->last_transfer_ns = timespec_to_ns(&ts);
 +      ec_spi->last_transfer_ns = ktime_get_ns();
        if (!ret)
                ret = final_ret;
        if (ret < 0) {
                goto exit;
        }
  
-       /* check response error code */
        ptr = ec_dev->din;
-       if (ptr[0]) {
-               dev_warn(ec_dev->dev, "command 0x%02x returned an error %d\n",
-                        ec_msg->cmd, ptr[0]);
-               debug_packet(ec_dev->dev, "in_err", ptr, len);
-               ret = -EINVAL;
+       /* check response error code */
+       ec_msg->result = ptr[0];
+       ret = cros_ec_check_result(ec_dev, ec_msg);
+       if (ret)
                goto exit;
-       }
        len = ptr[1];
        sum = ptr[0] + ptr[1];
-       if (len > ec_msg->in_len) {
+       if (len > ec_msg->insize) {
                dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)",
-                       len, ec_msg->in_len);
+                       len, ec_msg->insize);
                ret = -ENOSPC;
                goto exit;
        }
        /* copy response packet payload and compute checksum */
        for (i = 0; i < len; i++) {
                sum += ptr[i + 2];
-               if (ec_msg->in_len)
-                       ec_msg->in_buf[i] = ptr[i + 2];
+               if (ec_msg->insize)
+                       ec_msg->indata[i] = ptr[i + 2];
        }
        sum &= 0xff;
  
                goto exit;
        }
  
-       ret = 0;
+       ret = len;
  exit:
        mutex_unlock(&ec_spi->lock);
        return ret;
@@@ -364,11 -363,10 +359,10 @@@ static int cros_ec_spi_probe(struct spi
        cros_ec_spi_dt_probe(ec_spi, dev);
  
        spi_set_drvdata(spi, ec_dev);
-       ec_dev->name = "SPI";
        ec_dev->dev = dev;
        ec_dev->priv = ec_spi;
        ec_dev->irq = spi->irq;
-       ec_dev->command_xfer = cros_ec_command_spi_xfer;
+       ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi;
        ec_dev->ec_name = ec_spi->spi->modalias;
        ec_dev->phys_name = dev_name(&ec_spi->spi->dev);
        ec_dev->parent = &ec_spi->spi->dev;
                return err;
        }
  
+       device_init_wakeup(&spi->dev, true);
        return 0;
  }
  
index 2b7e9e22049775da7aea382e9b4b7815e881cff4,2daacc632e65b7ec38a2240e2a9688f5cbbe8a63..b16c53a8272f84e4920fd46883f4ae6eb148405a
@@@ -31,6 -31,7 +31,7 @@@
  #include <linux/mfd/samsung/core.h>
  #include <linux/mfd/samsung/s2mps11.h>
  #include <linux/mfd/samsung/s2mps14.h>
+ #include <linux/mfd/samsung/s2mpu02.h>
  
  struct s2mps11_info {
        unsigned int rdev_num;
        int ramp_delay16;
        int ramp_delay7810;
        int ramp_delay9;
+       enum sec_device_type dev_type;
        /*
-        * One bit for each S2MPS14 regulator whether the suspend mode
+        * One bit for each S2MPS14/S2MPU02 regulator whether the suspend mode
         * was enabled.
         */
-       unsigned int s2mps14_suspend_state:30;
+       unsigned long long s2mps14_suspend_state:35;
        /* Array of size rdev_num with GPIO-s for external sleep control */
        int *ext_control_gpio;
  };
@@@ -415,12 -420,24 +420,24 @@@ static int s2mps14_regulator_enable(str
        struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
        unsigned int val;
  
-       if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev)))
-               val = S2MPS14_ENABLE_SUSPEND;
-       else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
-               val = S2MPS14_ENABLE_EXT_CONTROL;
-       else
-               val = rdev->desc->enable_mask;
+       switch (s2mps11->dev_type) {
+       case S2MPS14X:
+               if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev)))
+                       val = S2MPS14_ENABLE_SUSPEND;
+               else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
+                       val = S2MPS14_ENABLE_EXT_CONTROL;
+               else
+                       val = rdev->desc->enable_mask;
+               break;
+       case S2MPU02:
+               if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev)))
+                       val = S2MPU02_ENABLE_SUSPEND;
+               else
+                       val = rdev->desc->enable_mask;
+               break;
+       default:
+               return -EINVAL;
+       };
  
        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
                        rdev->desc->enable_mask, val);
  static int s2mps14_regulator_set_suspend_disable(struct regulator_dev *rdev)
  {
        int ret;
-       unsigned int val;
+       unsigned int val, state;
        struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
+       int rdev_id = rdev_get_id(rdev);
  
-       /* LDO3 should be always on and does not support suspend mode */
-       if (rdev_get_id(rdev) == S2MPS14_LDO3)
-               return 0;
+       /* Below LDO should be always on or does not support suspend mode. */
+       switch (s2mps11->dev_type) {
+       case S2MPS14X:
+               switch (rdev_id) {
+               case S2MPS14_LDO3:
+                       return 0;
+               default:
+                       state = S2MPS14_ENABLE_SUSPEND;
+                       break;
+               };
+               break;
+       case S2MPU02:
+               switch (rdev_id) {
+               case S2MPU02_LDO13:
+               case S2MPU02_LDO14:
+               case S2MPU02_LDO15:
+               case S2MPU02_LDO17:
+               case S2MPU02_BUCK7:
+                       state = S2MPU02_DISABLE_SUSPEND;
+                       break;
+               default:
+                       state = S2MPU02_ENABLE_SUSPEND;
+                       break;
+               };
+               break;
+       default:
+               return -EINVAL;
+       };
  
        ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
        if (ret < 0)
                return 0;
  
        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
-                       rdev->desc->enable_mask, S2MPS14_ENABLE_SUSPEND);
+                       rdev->desc->enable_mask, state);
  }
  
  static struct regulator_ops s2mps14_reg_ops = {
@@@ -605,8 -648,7 +648,7 @@@ static void s2mps14_pmic_dt_parse_ext_c
  }
  
  static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
-               struct of_regulator_match *rdata, struct s2mps11_info *s2mps11,
-               enum sec_device_type dev_type)
+               struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)
  {
        struct device_node *reg_np;
  
        }
  
        of_regulator_match(&pdev->dev, reg_np, rdata, s2mps11->rdev_num);
-       if (dev_type == S2MPS14X)
+       if (s2mps11->dev_type == S2MPS14X)
                s2mps14_pmic_dt_parse_ext_control_gpio(pdev, rdata, s2mps11);
  
        of_node_put(reg_np);
        return 0;
  }
  
+ static int s2mpu02_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
+ {
+       unsigned int ramp_val, ramp_shift, ramp_reg;
+       switch (rdev_get_id(rdev)) {
+       case S2MPU02_BUCK1:
+               ramp_shift = S2MPU02_BUCK1_RAMP_SHIFT;
+               break;
+       case S2MPU02_BUCK2:
+               ramp_shift = S2MPU02_BUCK2_RAMP_SHIFT;
+               break;
+       case S2MPU02_BUCK3:
+               ramp_shift = S2MPU02_BUCK3_RAMP_SHIFT;
+               break;
+       case S2MPU02_BUCK4:
+               ramp_shift = S2MPU02_BUCK4_RAMP_SHIFT;
+               break;
+       default:
+               return 0;
+       }
+       ramp_reg = S2MPU02_REG_RAMP1;
+       ramp_val = get_ramp_delay(ramp_delay);
+       return regmap_update_bits(rdev->regmap, ramp_reg,
+                                 S2MPU02_BUCK1234_RAMP_MASK << ramp_shift,
+                                 ramp_val << ramp_shift);
+ }
+ static struct regulator_ops s2mpu02_ldo_ops = {
+       .list_voltage           = regulator_list_voltage_linear,
+       .map_voltage            = regulator_map_voltage_linear,
+       .is_enabled             = regulator_is_enabled_regmap,
+       .enable                 = s2mps14_regulator_enable,
+       .disable                = regulator_disable_regmap,
+       .get_voltage_sel        = regulator_get_voltage_sel_regmap,
+       .set_voltage_sel        = regulator_set_voltage_sel_regmap,
+       .set_voltage_time_sel   = regulator_set_voltage_time_sel,
+       .set_suspend_disable    = s2mps14_regulator_set_suspend_disable,
+ };
+ static struct regulator_ops s2mpu02_buck_ops = {
+       .list_voltage           = regulator_list_voltage_linear,
+       .map_voltage            = regulator_map_voltage_linear,
+       .is_enabled             = regulator_is_enabled_regmap,
+       .enable                 = s2mps14_regulator_enable,
+       .disable                = regulator_disable_regmap,
+       .get_voltage_sel        = regulator_get_voltage_sel_regmap,
+       .set_voltage_sel        = regulator_set_voltage_sel_regmap,
+       .set_voltage_time_sel   = regulator_set_voltage_time_sel,
+       .set_suspend_disable    = s2mps14_regulator_set_suspend_disable,
+       .set_ramp_delay         = s2mpu02_set_ramp_delay,
+ };
+ #define regulator_desc_s2mpu02_ldo1(num) {            \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_900MV,        \
+       .uV_step        = S2MPU02_LDO_STEP_12_5MV,      \
+       .linear_min_sel = S2MPU02_LDO_GROUP1_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L1CTRL,           \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L1CTRL,           \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+ }
+ #define regulator_desc_s2mpu02_ldo2(num) {            \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_1050MV,       \
+       .uV_step        = S2MPU02_LDO_STEP_25MV,        \
+       .linear_min_sel = S2MPU02_LDO_GROUP2_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L2CTRL1,          \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L2CTRL1,          \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+ }
+ #define regulator_desc_s2mpu02_ldo3(num) {            \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_900MV,        \
+       .uV_step        = S2MPU02_LDO_STEP_12_5MV,      \
+       .linear_min_sel = S2MPU02_LDO_GROUP1_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+ }
+ #define regulator_desc_s2mpu02_ldo4(num) {            \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_1050MV,       \
+       .uV_step        = S2MPU02_LDO_STEP_25MV,        \
+       .linear_min_sel = S2MPU02_LDO_GROUP2_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+ }
+ #define regulator_desc_s2mpu02_ldo5(num) {            \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_1600MV,       \
+       .uV_step        = S2MPU02_LDO_STEP_50MV,        \
+       .linear_min_sel = S2MPU02_LDO_GROUP3_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+ }
+ #define regulator_desc_s2mpu02_buck1234(num) {                        \
+       .name           = "BUCK"#num,                           \
+       .id             = S2MPU02_BUCK##num,                    \
+       .ops            = &s2mpu02_buck_ops,                    \
+       .type           = REGULATOR_VOLTAGE,                    \
+       .owner          = THIS_MODULE,                          \
+       .min_uV         = S2MPU02_BUCK1234_MIN_600MV,           \
+       .uV_step        = S2MPU02_BUCK1234_STEP_6_25MV,         \
+       .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = S2MPU02_BUCK1234_START_SEL,           \
+       .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
+       .vsel_reg       = S2MPU02_REG_B1CTRL2 + (num - 1) * 2,  \
+       .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
+       .enable_reg     = S2MPU02_REG_B1CTRL1 + (num - 1) * 2,  \
+       .enable_mask    = S2MPU02_ENABLE_MASK                   \
+ }
+ #define regulator_desc_s2mpu02_buck5(num) {                   \
+       .name           = "BUCK"#num,                           \
+       .id             = S2MPU02_BUCK##num,                    \
+       .ops            = &s2mpu02_ldo_ops,                     \
+       .type           = REGULATOR_VOLTAGE,                    \
+       .owner          = THIS_MODULE,                          \
+       .min_uV         = S2MPU02_BUCK5_MIN_1081_25MV,          \
+       .uV_step        = S2MPU02_BUCK5_STEP_6_25MV,            \
+       .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = S2MPU02_BUCK5_START_SEL,              \
+       .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
+       .vsel_reg       = S2MPU02_REG_B5CTRL2,                  \
+       .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
+       .enable_reg     = S2MPU02_REG_B5CTRL1,                  \
+       .enable_mask    = S2MPU02_ENABLE_MASK                   \
+ }
+ #define regulator_desc_s2mpu02_buck6(num) {                   \
+       .name           = "BUCK"#num,                           \
+       .id             = S2MPU02_BUCK##num,                    \
+       .ops            = &s2mpu02_ldo_ops,                     \
+       .type           = REGULATOR_VOLTAGE,                    \
+       .owner          = THIS_MODULE,                          \
+       .min_uV         = S2MPU02_BUCK6_MIN_1700MV,             \
+       .uV_step        = S2MPU02_BUCK6_STEP_2_50MV,            \
+       .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = S2MPU02_BUCK6_START_SEL,              \
+       .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
+       .vsel_reg       = S2MPU02_REG_B6CTRL2,                  \
+       .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
+       .enable_reg     = S2MPU02_REG_B6CTRL1,                  \
+       .enable_mask    = S2MPU02_ENABLE_MASK                   \
+ }
+ #define regulator_desc_s2mpu02_buck7(num) {                   \
+       .name           = "BUCK"#num,                           \
+       .id             = S2MPU02_BUCK##num,                    \
+       .ops            = &s2mpu02_ldo_ops,                     \
+       .type           = REGULATOR_VOLTAGE,                    \
+       .owner          = THIS_MODULE,                          \
+       .min_uV         = S2MPU02_BUCK7_MIN_900MV,              \
+       .uV_step        = S2MPU02_BUCK7_STEP_6_25MV,            \
+       .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = S2MPU02_BUCK7_START_SEL,              \
+       .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
+       .vsel_reg       = S2MPU02_REG_B7CTRL2,                  \
+       .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
+       .enable_reg     = S2MPU02_REG_B7CTRL1,                  \
+       .enable_mask    = S2MPU02_ENABLE_MASK                   \
+ }
+ static const struct regulator_desc s2mpu02_regulators[] = {
+       regulator_desc_s2mpu02_ldo1(1),
+       regulator_desc_s2mpu02_ldo2(2),
+       regulator_desc_s2mpu02_ldo4(3),
+       regulator_desc_s2mpu02_ldo5(4),
+       regulator_desc_s2mpu02_ldo4(5),
+       regulator_desc_s2mpu02_ldo3(6),
+       regulator_desc_s2mpu02_ldo3(7),
+       regulator_desc_s2mpu02_ldo4(8),
+       regulator_desc_s2mpu02_ldo5(9),
+       regulator_desc_s2mpu02_ldo3(10),
+       regulator_desc_s2mpu02_ldo4(11),
+       regulator_desc_s2mpu02_ldo5(12),
+       regulator_desc_s2mpu02_ldo5(13),
+       regulator_desc_s2mpu02_ldo5(14),
+       regulator_desc_s2mpu02_ldo5(15),
+       regulator_desc_s2mpu02_ldo5(16),
+       regulator_desc_s2mpu02_ldo4(17),
+       regulator_desc_s2mpu02_ldo5(18),
+       regulator_desc_s2mpu02_ldo3(19),
+       regulator_desc_s2mpu02_ldo4(20),
+       regulator_desc_s2mpu02_ldo5(21),
+       regulator_desc_s2mpu02_ldo5(22),
+       regulator_desc_s2mpu02_ldo5(23),
+       regulator_desc_s2mpu02_ldo4(24),
+       regulator_desc_s2mpu02_ldo5(25),
+       regulator_desc_s2mpu02_ldo4(26),
+       regulator_desc_s2mpu02_ldo5(27),
+       regulator_desc_s2mpu02_ldo5(28),
+       regulator_desc_s2mpu02_buck1234(1),
+       regulator_desc_s2mpu02_buck1234(2),
+       regulator_desc_s2mpu02_buck1234(3),
+       regulator_desc_s2mpu02_buck1234(4),
+       regulator_desc_s2mpu02_buck5(5),
+       regulator_desc_s2mpu02_buck6(6),
+       regulator_desc_s2mpu02_buck7(7),
+ };
  static int s2mps11_pmic_probe(struct platform_device *pdev)
  {
        struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
        struct s2mps11_info *s2mps11;
        int i, ret = 0;
        const struct regulator_desc *regulators;
-       enum sec_device_type dev_type;
  
        s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
                                GFP_KERNEL);
        if (!s2mps11)
                return -ENOMEM;
  
-       dev_type = platform_get_device_id(pdev)->driver_data;
-       switch (dev_type) {
+       s2mps11->dev_type = platform_get_device_id(pdev)->driver_data;
+       switch (s2mps11->dev_type) {
        case S2MPS11X:
                s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators);
                regulators = s2mps11_regulators;
                s2mps11->rdev_num = ARRAY_SIZE(s2mps14_regulators);
                regulators = s2mps14_regulators;
                break;
+       case S2MPU02:
+               s2mps11->rdev_num = ARRAY_SIZE(s2mpu02_regulators);
+               regulators = s2mpu02_regulators;
+               break;
        default:
-               dev_err(&pdev->dev, "Invalid device type: %u\n", dev_type);
+               dev_err(&pdev->dev, "Invalid device type: %u\n",
+                                   s2mps11->dev_type);
                return -EINVAL;
        };
  
        for (i = 0; i < s2mps11->rdev_num; i++)
                rdata[i].name = regulators[i].name;
  
-       ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11, dev_type);
+       ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11);
        if (ret)
                goto out;
  
@@@ -739,6 -1017,7 +1017,7 @@@ out
  static const struct platform_device_id s2mps11_pmic_id[] = {
        { "s2mps11-pmic", S2MPS11X},
        { "s2mps14-pmic", S2MPS14X},
+       { "s2mpu02-pmic", S2MPU02},
        { },
  };
  MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);
@@@ -766,5 -1045,5 +1045,5 @@@ module_exit(s2mps11_pmic_exit)
  
  /* Module information */
  MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
 -MODULE_DESCRIPTION("SAMSUNG S2MPS11/S2MPS14 Regulator Driver");
 +MODULE_DESCRIPTION("SAMSUNG S2MPS11/S2MPS14/S2MPU02 Regulator Driver");
  MODULE_LICENSE("GPL");
index a614b33d0a3943906c50c608e2046b65a00d7f04,fdd8b7b82db579e3d0a473a552d66cd2298cd876..f34723f7663c722c6983dcda572f7d342def4b74
@@@ -18,7 -18,7 +18,7 @@@
  #include <linux/regulator/consumer.h>
  #include <linux/mfd/arizona/pdata.h>
  
- #define ARIZONA_MAX_CORE_SUPPLIES 3
+ #define ARIZONA_MAX_CORE_SUPPLIES 2
  
  enum arizona_type {
        WM5102 = 1,
@@@ -46,8 -46,8 +46,8 @@@
  #define ARIZONA_IRQ_DSP_IRQ6              17
  #define ARIZONA_IRQ_DSP_IRQ7              18
  #define ARIZONA_IRQ_DSP_IRQ8              19
- #define ARIZONA_IRQ_SPK_SHUTDOWN_WARN     20
- #define ARIZONA_IRQ_SPK_SHUTDOWN          21
+ #define ARIZONA_IRQ_SPK_OVERHEAT_WARN     20
+ #define ARIZONA_IRQ_SPK_OVERHEAT          21
  #define ARIZONA_IRQ_MICDET                22
  #define ARIZONA_IRQ_HPDET                 23
  #define ARIZONA_IRQ_WSEQ_DONE             24
  #define ARIZONA_IRQ_FLL1_CLOCK_OK         49
  #define ARIZONA_IRQ_MICD_CLAMP_RISE     50
  #define ARIZONA_IRQ_MICD_CLAMP_FALL     51
- #define ARIZONA_NUM_IRQ                   52
+ #define ARIZONA_IRQ_HP3R_DONE             52
+ #define ARIZONA_IRQ_HP3L_DONE             53
+ #define ARIZONA_IRQ_HP2R_DONE             54
+ #define ARIZONA_IRQ_HP2L_DONE             55
+ #define ARIZONA_IRQ_HP1R_DONE             56
+ #define ARIZONA_IRQ_HP1L_DONE             57
+ #define ARIZONA_IRQ_ISRC3_CFG_ERR         58
+ #define ARIZONA_IRQ_DSP_SHARED_WR_COLL    59
+ #define ARIZONA_IRQ_SPK_SHUTDOWN          60
+ #define ARIZONA_IRQ_SPK1R_SHORT           61
+ #define ARIZONA_IRQ_SPK1L_SHORT           62
+ #define ARIZONA_IRQ_HP3R_SC_NEG           63
+ #define ARIZONA_IRQ_HP3R_SC_POS           64
+ #define ARIZONA_IRQ_HP3L_SC_NEG           65
+ #define ARIZONA_IRQ_HP3L_SC_POS           66
+ #define ARIZONA_IRQ_HP2R_SC_NEG           67
+ #define ARIZONA_IRQ_HP2R_SC_POS           68
+ #define ARIZONA_IRQ_HP2L_SC_NEG           69
+ #define ARIZONA_IRQ_HP2L_SC_POS           70
+ #define ARIZONA_IRQ_HP1R_SC_NEG           71
+ #define ARIZONA_IRQ_HP1R_SC_POS           72
+ #define ARIZONA_IRQ_HP1L_SC_NEG           73
+ #define ARIZONA_IRQ_HP1L_SC_POS           74
+ #define ARIZONA_NUM_IRQ                   75
  
  struct snd_soc_dapm_context;
  
@@@ -109,13 -132,9 +132,15 @@@ struct arizona 
        struct mutex clk_lock;
        int clk32k_ref;
  
+       bool ctrlif_error;
        struct snd_soc_dapm_context *dapm;
 +
 +      int tdm_width[ARIZONA_MAX_AIF];
 +      int tdm_slots[ARIZONA_MAX_AIF];
 +
 +      uint16_t dac_comp_coeff;
 +      uint8_t dac_comp_enabled;
  };
  
  int arizona_clk32k_enable(struct arizona *arizona);
index 2f2e91ac690f683c6f87347b34d4b9cbe11c8038,1b14105d8da33e446721abbf19240a924056403f..bd41ee4da078c6c7808364db38d344eab4151a75
@@@ -107,7 -107,7 +107,7 @@@ static int arizona_spk_ev(struct snd_so
                break;
        case SND_SOC_DAPM_POST_PMU:
                val = snd_soc_read(codec, ARIZONA_INTERRUPT_RAW_STATUS_3);
-               if (val & ARIZONA_SPK_SHUTDOWN_STS) {
+               if (val & ARIZONA_SPK_OVERHEAT_STS) {
                        dev_crit(arizona->dev,
                                 "Speaker not enabled due to temperature\n");
                        return -EBUSY;
@@@ -159,7 -159,7 +159,7 @@@ static irqreturn_t arizona_thermal_warn
        if (ret != 0) {
                dev_err(arizona->dev, "Failed to read thermal status: %d\n",
                        ret);
-       } else if (val & ARIZONA_SPK_SHUTDOWN_WARN_STS) {
+       } else if (val & ARIZONA_SPK_OVERHEAT_WARN_STS) {
                dev_crit(arizona->dev, "Thermal warning\n");
        }
  
@@@ -177,7 -177,7 +177,7 @@@ static irqreturn_t arizona_thermal_shut
        if (ret != 0) {
                dev_err(arizona->dev, "Failed to read thermal status: %d\n",
                        ret);
-       } else if (val & ARIZONA_SPK_SHUTDOWN_STS) {
+       } else if (val & ARIZONA_SPK_OVERHEAT_STS) {
                dev_crit(arizona->dev, "Thermal shutdown\n");
                ret = regmap_update_bits(arizona->regmap,
                                         ARIZONA_OUTPUT_ENABLES_1,
@@@ -223,7 -223,7 +223,7 @@@ int arizona_init_spk(struct snd_soc_cod
                break;
        }
  
-       ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_SHUTDOWN_WARN,
+       ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN,
                                  "Thermal warning", arizona_thermal_warn,
                                  arizona);
        if (ret != 0)
                        "Failed to get thermal warning IRQ: %d\n",
                        ret);
  
-       ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_SHUTDOWN,
+       ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT,
                                  "Thermal shutdown", arizona_thermal_shutdown,
                                  arizona);
        if (ret != 0)
  }
  EXPORT_SYMBOL_GPL(arizona_init_spk);
  
 +static const struct snd_soc_dapm_route arizona_mono_routes[] = {
 +      { "OUT1R", NULL, "OUT1L" },
 +      { "OUT2R", NULL, "OUT2L" },
 +      { "OUT3R", NULL, "OUT3L" },
 +      { "OUT4R", NULL, "OUT4L" },
 +      { "OUT5R", NULL, "OUT5L" },
 +      { "OUT6R", NULL, "OUT6L" },
 +};
 +
 +int arizona_init_mono(struct snd_soc_codec *codec)
 +{
 +      struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
 +      struct arizona *arizona = priv->arizona;
 +      int i;
 +
 +      for (i = 0; i < ARIZONA_MAX_OUTPUT; ++i) {
 +              if (arizona->pdata.out_mono[i])
 +                      snd_soc_dapm_add_routes(&codec->dapm,
 +                                              &arizona_mono_routes[i], 1);
 +      }
 +
 +      return 0;
 +}
 +EXPORT_SYMBOL_GPL(arizona_init_mono);
 +
  int arizona_init_gpio(struct snd_soc_codec *codec)
  {
        struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
@@@ -1152,31 -1127,6 +1152,31 @@@ static int arizona_startup(struct snd_p
                                          constraint);
  }
  
 +static void arizona_wm5102_set_dac_comp(struct snd_soc_codec *codec,
 +                                      unsigned int rate)
 +{
 +      struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
 +      struct arizona *arizona = priv->arizona;
 +      struct reg_default dac_comp[] = {
 +              { 0x80, 0x3 },
 +              { ARIZONA_DAC_COMP_1, 0 },
 +              { ARIZONA_DAC_COMP_2, 0 },
 +              { 0x80, 0x0 },
 +      };
 +
 +      mutex_lock(&codec->mutex);
 +
 +      dac_comp[1].def = arizona->dac_comp_coeff;
 +      if (rate >= 176400)
 +              dac_comp[2].def = arizona->dac_comp_enabled;
 +
 +      mutex_unlock(&codec->mutex);
 +
 +      regmap_multi_reg_write(arizona->regmap,
 +                             dac_comp,
 +                             ARRAY_SIZE(dac_comp));
 +}
 +
  static int arizona_hw_params_rate(struct snd_pcm_substream *substream,
                                  struct snd_pcm_hw_params *params,
                                  struct snd_soc_dai *dai)
  
        switch (dai_priv->clk) {
        case ARIZONA_CLK_SYSCLK:
 +              switch (priv->arizona->type) {
 +              case WM5102:
 +                      arizona_wm5102_set_dac_comp(codec,
 +                                                  params_rate(params));
 +                      break;
 +              default:
 +                      break;
 +              }
 +
                snd_soc_update_bits(codec, ARIZONA_SAMPLE_RATE_1,
                                    ARIZONA_SAMPLE_RATE_1_MASK, sr_val);
                if (base)
        return 0;
  }
  
 +static bool arizona_aif_cfg_changed(struct snd_soc_codec *codec,
 +                                  int base, int bclk, int lrclk, int frame)
 +{
 +      int val;
 +
 +      val = snd_soc_read(codec, base + ARIZONA_AIF_BCLK_CTRL);
 +      if (bclk != (val & ARIZONA_AIF1_BCLK_FREQ_MASK))
 +              return true;
 +
 +      val = snd_soc_read(codec, base + ARIZONA_AIF_TX_BCLK_RATE);
 +      if (lrclk != (val & ARIZONA_AIF1TX_BCPF_MASK))
 +              return true;
 +
 +      val = snd_soc_read(codec, base + ARIZONA_AIF_FRAME_CTRL_1);
 +      if (frame != (val & (ARIZONA_AIF1TX_WL_MASK |
 +                           ARIZONA_AIF1TX_SLOT_LEN_MASK)))
 +              return true;
 +
 +      return false;
 +}
 +
  static int arizona_hw_params(struct snd_pcm_substream *substream,
                             struct snd_pcm_hw_params *params,
                             struct snd_soc_dai *dai)
        int base = dai->driver->base;
        const int *rates;
        int i, ret, val;
 +      int channels = params_channels(params);
        int chan_limit = arizona->pdata.max_channels_clocked[dai->id - 1];
 +      int tdm_width = arizona->tdm_width[dai->id - 1];
 +      int tdm_slots = arizona->tdm_slots[dai->id - 1];
        int bclk, lrclk, wl, frame, bclk_target;
 +      bool reconfig;
 +      unsigned int aif_tx_state, aif_rx_state;
  
        if (params_rate(params) % 8000)
                rates = &arizona_44k1_bclk_rates[0];
        else
                rates = &arizona_48k_bclk_rates[0];
  
 -      bclk_target = snd_soc_params_to_bclk(params);
 -      if (chan_limit && chan_limit < params_channels(params)) {
 +      if (tdm_slots) {
 +              arizona_aif_dbg(dai, "Configuring for %d %d bit TDM slots\n",
 +                              tdm_slots, tdm_width);
 +              bclk_target = tdm_slots * tdm_width * params_rate(params);
 +              channels = tdm_slots;
 +      } else {
 +              bclk_target = snd_soc_params_to_bclk(params);
 +      }
 +
 +      if (chan_limit && chan_limit < channels) {
                arizona_aif_dbg(dai, "Limiting to %d channels\n", chan_limit);
 -              bclk_target /= params_channels(params);
 +              bclk_target /= channels;
                bclk_target *= chan_limit;
        }
  
 -      /* Force stereo for I2S mode */
 +      /* Force multiple of 2 channels for I2S mode */
        val = snd_soc_read(codec, base + ARIZONA_AIF_FORMAT);
 -      if (params_channels(params) == 1 && (val & ARIZONA_AIF1_FMT_MASK)) {
 +      if ((channels & 1) && (val & ARIZONA_AIF1_FMT_MASK)) {
                arizona_aif_dbg(dai, "Forcing stereo mode\n");
 -              bclk_target *= 2;
 +              bclk_target /= channels;
 +              bclk_target *= channels + 1;
        }
  
        for (i = 0; i < ARRAY_SIZE(arizona_44k1_bclk_rates); i++) {
        wl = snd_pcm_format_width(params_format(params));
        frame = wl << ARIZONA_AIF1TX_WL_SHIFT | wl;
  
 +      reconfig = arizona_aif_cfg_changed(codec, base, bclk, lrclk, frame);
 +
 +      if (reconfig) {
 +              /* Save AIF TX/RX state */
 +              aif_tx_state = snd_soc_read(codec,
 +                                          base + ARIZONA_AIF_TX_ENABLES);
 +              aif_rx_state = snd_soc_read(codec,
 +                                          base + ARIZONA_AIF_RX_ENABLES);
 +              /* Disable AIF TX/RX before reconfiguring it */
 +              regmap_update_bits_async(arizona->regmap,
 +                                  base + ARIZONA_AIF_TX_ENABLES, 0xff, 0x0);
 +              regmap_update_bits(arizona->regmap,
 +                                  base + ARIZONA_AIF_RX_ENABLES, 0xff, 0x0);
 +      }
 +
        ret = arizona_hw_params_rate(substream, params, dai);
        if (ret != 0)
 -              return ret;
 +              goto restore_aif;
  
 -      regmap_update_bits_async(arizona->regmap,
 -                               base + ARIZONA_AIF_BCLK_CTRL,
 -                               ARIZONA_AIF1_BCLK_FREQ_MASK, bclk);
 -      regmap_update_bits_async(arizona->regmap,
 -                               base + ARIZONA_AIF_TX_BCLK_RATE,
 -                               ARIZONA_AIF1TX_BCPF_MASK, lrclk);
 -      regmap_update_bits_async(arizona->regmap,
 -                               base + ARIZONA_AIF_RX_BCLK_RATE,
 -                               ARIZONA_AIF1RX_BCPF_MASK, lrclk);
 -      regmap_update_bits_async(arizona->regmap,
 -                               base + ARIZONA_AIF_FRAME_CTRL_1,
 -                               ARIZONA_AIF1TX_WL_MASK |
 -                               ARIZONA_AIF1TX_SLOT_LEN_MASK, frame);
 -      regmap_update_bits(arizona->regmap, base + ARIZONA_AIF_FRAME_CTRL_2,
 -                         ARIZONA_AIF1RX_WL_MASK |
 -                         ARIZONA_AIF1RX_SLOT_LEN_MASK, frame);
 +      if (reconfig) {
 +              regmap_update_bits_async(arizona->regmap,
 +                                       base + ARIZONA_AIF_BCLK_CTRL,
 +                                       ARIZONA_AIF1_BCLK_FREQ_MASK, bclk);
 +              regmap_update_bits_async(arizona->regmap,
 +                                       base + ARIZONA_AIF_TX_BCLK_RATE,
 +                                       ARIZONA_AIF1TX_BCPF_MASK, lrclk);
 +              regmap_update_bits_async(arizona->regmap,
 +                                       base + ARIZONA_AIF_RX_BCLK_RATE,
 +                                       ARIZONA_AIF1RX_BCPF_MASK, lrclk);
 +              regmap_update_bits_async(arizona->regmap,
 +                                       base + ARIZONA_AIF_FRAME_CTRL_1,
 +                                       ARIZONA_AIF1TX_WL_MASK |
 +                                       ARIZONA_AIF1TX_SLOT_LEN_MASK, frame);
 +              regmap_update_bits(arizona->regmap,
 +                                 base + ARIZONA_AIF_FRAME_CTRL_2,
 +                                 ARIZONA_AIF1RX_WL_MASK |
 +                                 ARIZONA_AIF1RX_SLOT_LEN_MASK, frame);
 +      }
  
 -      return 0;
 +restore_aif:
 +      if (reconfig) {
 +              /* Restore AIF TX/RX state */
 +              regmap_update_bits_async(arizona->regmap,
 +                                       base + ARIZONA_AIF_TX_ENABLES,
 +                                       0xff, aif_tx_state);
 +              regmap_update_bits(arizona->regmap,
 +                                 base + ARIZONA_AIF_RX_ENABLES,
 +                                 0xff, aif_rx_state);
 +      }
 +      return ret;
  }
  
  static const char *arizona_dai_clk_str(int clk_id)
@@@ -1446,63 -1324,9 +1446,63 @@@ static int arizona_set_tristate(struct 
                                   ARIZONA_AIF1_TRI, reg);
  }
  
 +static void arizona_set_channels_to_mask(struct snd_soc_dai *dai,
 +                                       unsigned int base,
 +                                       int channels, unsigned int mask)
 +{
 +      struct snd_soc_codec *codec = dai->codec;
 +      struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
 +      struct arizona *arizona = priv->arizona;
 +      int slot, i;
 +
 +      for (i = 0; i < channels; ++i) {
 +              slot = ffs(mask) - 1;
 +              if (slot < 0)
 +                      return;
 +
 +              regmap_write(arizona->regmap, base + i, slot);
 +
 +              mask &= ~(1 << slot);
 +      }
 +
 +      if (mask)
 +              arizona_aif_warn(dai, "Too many channels in TDM mask\n");
 +}
 +
 +static int arizona_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 +                              unsigned int rx_mask, int slots, int slot_width)
 +{
 +      struct snd_soc_codec *codec = dai->codec;
 +      struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
 +      struct arizona *arizona = priv->arizona;
 +      int base = dai->driver->base;
 +      int rx_max_chan = dai->driver->playback.channels_max;
 +      int tx_max_chan = dai->driver->capture.channels_max;
 +
 +      /* Only support TDM for the physical AIFs */
 +      if (dai->id > ARIZONA_MAX_AIF)
 +              return -ENOTSUPP;
 +
 +      if (slots == 0) {
 +              tx_mask = (1 << tx_max_chan) - 1;
 +              rx_mask = (1 << rx_max_chan) - 1;
 +      }
 +
 +      arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_3,
 +                                   tx_max_chan, tx_mask);
 +      arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_11,
 +                                   rx_max_chan, rx_mask);
 +
 +      arizona->tdm_width[dai->id - 1] = slot_width;
 +      arizona->tdm_slots[dai->id - 1] = slots;
 +
 +      return 0;
 +}
 +
  const struct snd_soc_dai_ops arizona_dai_ops = {
        .startup = arizona_startup,
        .set_fmt = arizona_set_fmt,
 +      .set_tdm_slot = arizona_set_tdm_slot,
        .hw_params = arizona_hw_params,
        .set_sysclk = arizona_dai_set_sysclk,
        .set_tristate = arizona_set_tristate,
@@@ -1576,12 -1400,6 +1576,12 @@@ static int arizona_validate_fll(struct 
  {
        unsigned int Fvco_min;
  
 +      if (fll->fout && Fout != fll->fout) {
 +              arizona_fll_err(fll,
 +                              "Can't change output on active FLL\n");
 +              return -EINVAL;
 +      }
 +
        if (Fref / ARIZONA_FLL_MAX_REFDIV > ARIZONA_FLL_MAX_FREF) {
                arizona_fll_err(fll,
                                "Can't scale %dMHz in to <=13.5MHz\n",
@@@ -1660,10 -1478,6 +1660,10 @@@ static int arizona_calc_fratio(struct a
        while (div <= ARIZONA_FLL_MAX_REFDIV) {
                for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO;
                     ratio++) {
 +                      if ((ARIZONA_FLL_VCO_CORNER / 2) /
 +                          (fll->vco_mult * ratio) < Fref)
 +                              break;
 +
                        if (target % (ratio * Fref)) {
                                cfg->refdiv = refdiv;
                                cfg->fratio = ratio - 1;
                        }
                }
  
 -              for (ratio = init_ratio - 1; ratio >= 0; ratio--) {
 -                      if (ARIZONA_FLL_VCO_CORNER / (fll->vco_mult * ratio) <
 -                          Fref)
 -                              break;
 -
 +              for (ratio = init_ratio - 1; ratio > 0; ratio--) {
                        if (target % (ratio * Fref)) {
                                cfg->refdiv = refdiv;
                                cfg->fratio = ratio - 1;
@@@ -1798,7 -1616,7 +1798,7 @@@ static void arizona_apply_fll(struct ar
                                 ARIZONA_FLL1_CTRL_UPD | cfg->n);
  }
  
 -static bool arizona_is_enabled_fll(struct arizona_fll *fll)
 +static int arizona_is_enabled_fll(struct arizona_fll *fll)
  {
        struct arizona *arizona = fll->arizona;
        unsigned int reg;
        return reg & ARIZONA_FLL1_ENA;
  }
  
 -static void arizona_enable_fll(struct arizona_fll *fll)
 +static int arizona_enable_fll(struct arizona_fll *fll)
  {
        struct arizona *arizona = fll->arizona;
        int ret;
        bool use_sync = false;
 +      int already_enabled = arizona_is_enabled_fll(fll);
        struct arizona_fll_cfg cfg;
  
 +      if (already_enabled < 0)
 +              return already_enabled;
 +
 +      if (already_enabled) {
 +              /* Facilitate smooth refclk across the transition */
 +              regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x7,
 +                                       ARIZONA_FLL1_GAIN_MASK, 0);
 +              regmap_update_bits_async(fll->arizona->regmap, fll->base + 1,
 +                                       ARIZONA_FLL1_FREERUN,
 +                                       ARIZONA_FLL1_FREERUN);
 +      }
 +
        /*
         * If we have both REFCLK and SYNCCLK then enable both,
         * otherwise apply the SYNCCLK settings to REFCLK.
                                         ARIZONA_FLL1_SYNC_ENA, 0);
        } else {
                arizona_fll_err(fll, "No clocks provided\n");
 -              return;
 +              return -EINVAL;
        }
  
        /*
                                         ARIZONA_FLL1_SYNC_BW,
                                         ARIZONA_FLL1_SYNC_BW);
  
 -      if (!arizona_is_enabled_fll(fll))
 +      if (!already_enabled)
                pm_runtime_get(arizona->dev);
  
        /* Clear any pending completions */
        try_wait_for_completion(&fll->ok);
  
 -      regmap_update_bits_async(arizona->regmap, fll->base + 1,
 -                               ARIZONA_FLL1_FREERUN, 0);
        regmap_update_bits_async(arizona->regmap, fll->base + 1,
                                 ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
        if (use_sync)
                                         ARIZONA_FLL1_SYNC_ENA,
                                         ARIZONA_FLL1_SYNC_ENA);
  
 +      if (already_enabled)
 +              regmap_update_bits_async(arizona->regmap, fll->base + 1,
 +                                       ARIZONA_FLL1_FREERUN, 0);
 +
        ret = wait_for_completion_timeout(&fll->ok,
                                          msecs_to_jiffies(250));
        if (ret == 0)
                arizona_fll_warn(fll, "Timed out waiting for lock\n");
 +
 +      return 0;
  }
  
  static void arizona_disable_fll(struct arizona_fll *fll)
                                 ARIZONA_FLL1_ENA, 0, &change);
        regmap_update_bits(arizona->regmap, fll->base + 0x11,
                           ARIZONA_FLL1_SYNC_ENA, 0);
 +      regmap_update_bits_async(arizona->regmap, fll->base + 1,
 +                               ARIZONA_FLL1_FREERUN, 0);
  
        if (change)
                pm_runtime_put_autosuspend(arizona->dev);
  int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
                           unsigned int Fref, unsigned int Fout)
  {
 -      int ret;
 +      int ret = 0;
  
        if (fll->ref_src == source && fll->ref_freq == Fref)
                return 0;
        fll->ref_freq = Fref;
  
        if (fll->fout && Fref > 0) {
 -              arizona_enable_fll(fll);
 +              ret = arizona_enable_fll(fll);
        }
  
 -      return 0;
 +      return ret;
  }
  EXPORT_SYMBOL_GPL(arizona_set_fll_refclk);
  
  int arizona_set_fll(struct arizona_fll *fll, int source,
                    unsigned int Fref, unsigned int Fout)
  {
 -      int ret;
 +      int ret = 0;
  
        if (fll->sync_src == source &&
            fll->sync_freq == Fref && fll->fout == Fout)
        fll->sync_freq = Fref;
        fll->fout = Fout;
  
 -      if (Fout) {
 -              arizona_enable_fll(fll);
 -      } else {
 +      if (Fout)
 +              ret = arizona_enable_fll(fll);
 +      else
                arizona_disable_fll(fll);
 -      }
  
 -      return 0;
 +      return ret;
  }
  EXPORT_SYMBOL_GPL(arizona_set_fll);
  
This page took 0.062191 seconds and 5 git commands to generate.