Merge branch 'i2c/for-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 Oct 2016 21:12:21 +0000 (14:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 Oct 2016 21:12:21 +0000 (14:12 -0700)
Pull i2c updates from Wolfram Sang:
 "Here is the 4.9 pull request from I2C including:

   - centralized error messages when registering to the core
   - improved lockdep annotations to prevent false positives
   - DT support for muxes, gates, and arbitrators
   - bus speeds can now be obtained from ACPI
   - i2c-octeon got refactored and now supports ThunderX SoCs, too
   - i2c-tegra and i2c-designware got a bigger bunch of updates
   - a couple of standard driver fixes and improvements"

* 'i2c/for-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: (71 commits)
  i2c: axxia: disable clks in case of failure in probe
  i2c: octeon: thunderx: Limit register access retries
  i2c: uniphier-f: fix misdetection of incomplete STOP condition
  gpio: pca953x: variable 'id' was used twice
  i2c: i801: Add support for Kaby Lake PCH-H
  gpio: pca953x: fix an incorrect lockdep warning
  i2c: add a warning to i2c_adapter_depth()
  lockdep: make MAX_LOCKDEP_SUBCLASSES unconditionally visible
  i2c: export i2c_adapter_depth()
  i2c: rk3x: Fix variable 'min_total_ns' unused warning
  i2c: rk3x: Fix sparse warning
  i2c / ACPI: Do not touch an I2C device if it belongs to another adapter
  i2c: octeon: Fix high-level controller status check
  i2c: octeon: Avoid sending STOP during recovery
  i2c: octeon: Fix set SCL recovery function
  i2c: rcar: add support for r8a7796 (R-Car M3-W)
  i2c: imx: make bus recovery through pinctrl optional
  i2c: meson: add gxbb compatible string
  i2c: uniphier-f: set the adapter to master mode when probing
  i2c: uniphier-f: avoid WARN_ON() of clk_disable() in failure path
  ...

1  2 
MAINTAINERS
drivers/gpio/gpio-pca953x.c
drivers/i2c/busses/i2c-bcm-kona.c
drivers/i2c/busses/i2c-cadence.c
drivers/i2c/busses/i2c-designware-core.c
drivers/i2c/busses/i2c-i801.c
drivers/i2c/busses/i2c-rcar.c
drivers/i2c/busses/i2c-rk3x.c
drivers/i2c/busses/i2c-sh_mobile.c
drivers/i2c/muxes/i2c-mux-pca954x.c

diff --combined MAINTAINERS
@@@ -636,15 -636,6 +636,15 @@@ F:       drivers/tty/serial/altera_jtaguart.
  F:    include/linux/altera_uart.h
  F:    include/linux/altera_jtaguart.h
  
 +AMAZON ETHERNET DRIVERS
 +M:    Netanel Belgazal <netanel@annapurnalabs.com>
 +R:    Saeed Bishara <saeed@annapurnalabs.com>
 +R:    Zorik Machulsky <zorik@annapurnalabs.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    Documentation/networking/ena.txt
 +F:    drivers/net/ethernet/amazon/
 +
  AMD CRYPTOGRAPHIC COPROCESSOR (CCP) DRIVER
  M:    Tom Lendacky <thomas.lendacky@amd.com>
  M:    Gary Hook <gary.hook@amd.com>
@@@ -807,7 -798,6 +807,7 @@@ M: Laura Abbott <labbott@redhat.com
  M:    Sumit Semwal <sumit.semwal@linaro.org>
  L:    devel@driverdev.osuosl.org
  S:    Supported
 +F:    Documentation/devicetree/bindings/staging/ion/
  F:    drivers/staging/android/ion
  F:    drivers/staging/android/uapi/ion.h
  F:    drivers/staging/android/uapi/ion_test.h
@@@ -819,11 -809,11 +819,11 @@@ L:      alsa-devel@alsa-project.org (moderat
  S:    Maintained
  F:    sound/aoa/
  
 -APEX EMBEDDED SYSTEMS STX104 DAC DRIVER
 +APEX EMBEDDED SYSTEMS STX104 IIO DRIVER
  M:    William Breathitt Gray <vilhelm.gray@gmail.com>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -F:    drivers/iio/dac/stx104.c
 +F:    drivers/iio/adc/stx104.c
  
  APM DRIVER
  M:    Jiri Kosina <jikos@kernel.org>
@@@ -891,15 -881,6 +891,15 @@@ S:       Supporte
  F:    drivers/gpu/drm/arc/
  F:    Documentation/devicetree/bindings/display/snps,arcpgu.txt
  
 +ARM ARCHITECTED TIMER DRIVER
 +M:    Mark Rutland <mark.rutland@arm.com>
 +M:    Marc Zyngier <marc.zyngier@arm.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/include/asm/arch_timer.h
 +F:    arch/arm64/include/asm/arch_timer.h
 +F:    drivers/clocksource/arm_arch_timer.c
 +
  ARM HDLCD DRM DRIVER
  M:    Liviu Dudau <liviu.dudau@arm.com>
  S:    Supported
@@@ -922,17 -903,15 +922,17 @@@ F:      arch/arm/include/asm/floppy.
  
  ARM PMU PROFILING AND DEBUGGING
  M:    Will Deacon <will.deacon@arm.com>
 -R:    Mark Rutland <mark.rutland@arm.com>
 +M:    Mark Rutland <mark.rutland@arm.com>
  S:    Maintained
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  F:    arch/arm*/kernel/perf_*
  F:    arch/arm/oprofile/common.c
  F:    arch/arm*/kernel/hw_breakpoint.c
  F:    arch/arm*/include/asm/hw_breakpoint.h
  F:    arch/arm*/include/asm/perf_event.h
 -F:    drivers/perf/arm_pmu.c
 +F:    drivers/perf/*
  F:    include/linux/perf/arm_pmu.h
 +F:    Documentation/devicetree/bindings/arm/pmu.txt
  
  ARM PORT
  M:    Russell King <linux@armlinux.org.uk>
@@@ -1134,11 -1113,6 +1134,11 @@@ F:    drivers/hwtracing/coresight/
  F:    Documentation/trace/coresight.txt
  F:    Documentation/devicetree/bindings/arm/coresight.txt
  F:    Documentation/ABI/testing/sysfs-bus-coresight-devices-*
 +F:    tools/perf/arch/arm/util/pmu.c
 +F:    tools/perf/arch/arm/util/auxtrace.c
 +F:    tools/perf/arch/arm/util/cs-etm.c
 +F:    tools/perf/arch/arm/util/cs-etm.h
 +F:    tools/perf/util/cs-etm.h
  
  ARM/CORGI MACHINE SUPPORT
  M:    Richard Purdie <rpurdie@rpsys.net>
@@@ -1640,8 -1614,7 +1640,8 @@@ N:      rockchi
  
  ARM/SAMSUNG EXYNOS ARM ARCHITECTURES
  M:    Kukjin Kim <kgene@kernel.org>
 -M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
 +R:    Javier Martinez Canillas <javier@osg.samsung.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  S:    Maintained
@@@ -1661,6 -1634,7 +1661,6 @@@ F:      drivers/*/*s3c64xx
  F:    drivers/*/*s5pv210*
  F:    drivers/memory/samsung/*
  F:    drivers/soc/samsung/*
 -F:    drivers/spi/spi-s3c*
  F:    Documentation/arm/Samsung/
  F:    Documentation/devicetree/bindings/arm/samsung/
  F:    Documentation/devicetree/bindings/sram/samsung-sram.txt
@@@ -1848,7 -1822,6 +1848,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  ARM/UNIPHIER ARCHITECTURE
  M:    Masahiro Yamada <yamada.masahiro@socionext.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-uniphier.git
  S:    Maintained
  F:    arch/arm/boot/dts/uniphier*
  F:    arch/arm/include/asm/hardware/cache-uniphier.h
@@@ -1856,7 -1829,6 +1856,7 @@@ F:      arch/arm/mach-uniphier
  F:    arch/arm/mm/cache-uniphier.c
  F:    arch/arm64/boot/dts/socionext/
  F:    drivers/bus/uniphier-system-bus.c
 +F:    drivers/clk/uniphier/
  F:    drivers/i2c/busses/i2c-uniphier*
  F:    drivers/pinctrl/uniphier/
  F:    drivers/tty/serial/8250/8250_uniphier.c
@@@ -1993,13 -1965,6 +1993,13 @@@ S:    Maintaine
  F:    drivers/media/i2c/as3645a.c
  F:    include/media/i2c/as3645a.h
  
 +ASAHI KASEI AK8974 DRIVER
 +M:    Linus Walleij <linus.walleij@linaro.org>
 +L:    linux-iio@vger.kernel.org
 +W:    http://www.akm.com/
 +S:    Supported
 +F:    drivers/iio/magnetometer/ak8974.c
 +
  ASC7621 HARDWARE MONITOR DRIVER
  M:    George Joseph <george.joseph@fairview5.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -2138,6 -2103,11 +2138,6 @@@ M:     Ludovic Desroches <ludovic.desroches
  S:    Maintained
  F:    drivers/mmc/host/atmel-mci.c
  
 -ATMEL AT91 / AT32 SERIAL DRIVER
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 -S:    Supported
 -F:    drivers/tty/serial/atmel_serial.c
 -
  ATMEL AT91 SAMA5D2-Compatible Shutdown Controller
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
  S:    Supported
@@@ -2505,7 -2475,7 +2505,7 @@@ F:      include/net/bluetooth
  BONDING DRIVER
  M:    Jay Vosburgh <j.vosburgh@gmail.com>
  M:    Veaceslav Falico <vfalico@gmail.com>
 -M:    Andy Gospodarek <gospo@cumulusnetworks.com>
 +M:    Andy Gospodarek <andy@greyhouse.net>
  L:    netdev@vger.kernel.org
  W:    http://sourceforge.net/projects/bonding/
  S:    Supported
@@@ -2520,7 -2490,7 +2520,7 @@@ S:      Supporte
  F:    kernel/bpf/
  
  BROADCOM B44 10/100 ETHERNET DRIVER
 -M:    Gary Zambrano <zambrano@broadcom.com>
 +M:    Michael Chan <michael.chan@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/broadcom/b44.*
@@@ -2908,6 -2878,14 +2908,14 @@@ S:    Maintaine
  F:    drivers/iio/light/cm*
  F:    Documentation/devicetree/bindings/i2c/trivial-devices.txt
  
+ CAVIUM I2C DRIVER
+ M:    Jan Glauber <jglauber@cavium.com>
+ M:    David Daney <david.daney@cavium.com>
+ W:    http://www.cavium.com
+ S:    Supported
+ F:    drivers/i2c/busses/i2c-octeon*
+ F:    drivers/i2c/busses/i2c-thunderx*
  CAVIUM LIQUIDIO NETWORK DRIVER
  M:     Derek Chickles <derek.chickles@caviumnetworks.com>
  M:     Satanand Burla <satananda.burla@caviumnetworks.com>
@@@ -3155,7 -3133,7 +3163,7 @@@ L:      cocci@systeme.lip6.fr (moderated fo
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git misc
  W:    http://coccinelle.lip6.fr/
  S:    Supported
 -F:    Documentation/coccinelle.txt
 +F:    Documentation/dev-tools/coccinelle.rst
  F:    scripts/coccinelle/
  F:    scripts/coccicheck
  
@@@ -3181,7 -3159,6 +3189,7 @@@ COMMON CLK FRAMEWOR
  M:    Michael Turquette <mturquette@baylibre.com>
  M:    Stephen Boyd <sboyd@codeaurora.org>
  L:    linux-clk@vger.kernel.org
 +Q:    http://patchwork.kernel.org/project/linux-clk/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git
  S:    Maintained
  F:    Documentation/devicetree/bindings/clock/
@@@ -3269,7 -3246,7 +3277,7 @@@ F:      kernel/cpuset.
  CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG)
  M:    Johannes Weiner <hannes@cmpxchg.org>
  M:    Michal Hocko <mhocko@kernel.org>
 -M:    Vladimir Davydov <vdavydov@virtuozzo.com>
 +M:    Vladimir Davydov <vdavydov.dev@gmail.com>
  L:    cgroups@vger.kernel.org
  L:    linux-mm@kvack.org
  S:    Maintained
@@@ -3290,7 -3267,7 +3298,7 @@@ S:      Maintaine
  F:    drivers/net/wan/cosa*
  
  CPMAC ETHERNET DRIVER
 -M:    Florian Fainelli <florian@openwrt.org>
 +M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/ti/cpmac.c
@@@ -3302,7 -3279,6 +3310,7 @@@ L:      linux-pm@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
  T:    git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
 +F:    Documentation/cpu-freq/
  F:    drivers/cpufreq/
  F:    include/linux/cpufreq.h
  
@@@ -3784,8 -3760,8 +3792,8 @@@ F:      drivers/leds/leds-da90??.
  F:    drivers/mfd/da903x.c
  F:    drivers/mfd/da90??-*.c
  F:    drivers/mfd/da91??-*.c
 -F:    drivers/power/da9052-battery.c
 -F:    drivers/power/da91??-*.c
 +F:    drivers/power/supply/da9052-battery.c
 +F:    drivers/power/supply/da91??-*.c
  F:    drivers/regulator/da903x.c
  F:    drivers/regulator/da9???-regulator.[ch]
  F:    drivers/rtc/rtc-da90??.c
@@@ -3801,12 -3777,6 +3809,12 @@@ F:    include/linux/regulator/da9211.
  F:    include/sound/da[79]*.h
  F:    sound/soc/codecs/da[79]*.[ch]
  
 +DIAMOND SYSTEMS GPIO-MM GPIO DRIVER
 +M:    William Breathitt Gray <vilhelm.gray@gmail.com>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/gpio/gpio-gpio-mm.c
 +
  DIGI NEO AND CLASSIC PCI PRODUCTS
  M:    Lidza Louina <lidza.louina@gmail.com>
  M:    Mark Hounschell <markh@compro.net>
@@@ -4432,6 -4402,7 +4440,6 @@@ F:      Documentation/filesystems/ecryptfs.t
  F:    fs/ecryptfs/
  
  EDAC-CORE
 -M:    Doug Thompson <dougthompson@xmission.com>
  M:    Borislav Petkov <bp@alien8.de>
  M:    Mauro Carvalho Chehab <mchehab@s-opensource.com>
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
@@@ -4444,12 -4415,14 +4452,12 @@@ F:   drivers/edac
  F:    include/linux/edac.h
  
  EDAC-AMD64
 -M:    Doug Thompson <dougthompson@xmission.com>
  M:    Borislav Petkov <bp@alien8.de>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
  F:    drivers/edac/amd64_edac*
  
  EDAC-CALXEDA
 -M:    Doug Thompson <dougthompson@xmission.com>
  M:    Robert Richter <rric@kernel.org>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
@@@ -4465,21 -4438,17 +4473,21 @@@ F:   drivers/edac/octeon_edac
  
  EDAC-E752X
  M:    Mark Gross <mark.gross@intel.com>
 -M:    Doug Thompson <dougthompson@xmission.com>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
  F:    drivers/edac/e752x_edac.c
  
  EDAC-E7XXX
 -M:    Doug Thompson <dougthompson@xmission.com>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
  F:    drivers/edac/e7xxx_edac.c
  
 +EDAC-FSL_DDR
 +M:    York Sun <york.sun@nxp.com>
 +L:    linux-edac@vger.kernel.org
 +S:    Maintained
 +F:    drivers/edac/fsl_ddr_edac.*
 +
  EDAC-GHES
  M:    Mauro Carvalho Chehab <mchehab@s-opensource.com>
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
@@@ -4494,11 -4463,13 +4502,11 @@@ S:   Maintaine
  F:    drivers/edac/i82443bxgx_edac.c
  
  EDAC-I3000
 -M:    Jason Uhlenkott <juhlenko@akamai.com>
  L:    linux-edac@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    drivers/edac/i3000_edac.c
  
  EDAC-I5000
 -M:    Doug Thompson <dougthompson@xmission.com>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
  F:    drivers/edac/i5000_edac.c
@@@ -4610,13 -4581,6 +4618,13 @@@ M:    Peter Jones <pjones@redhat.com
  S:    Maintained
  F:    drivers/video/fbdev/efifb.c
  
 +EFI TEST DRIVER
 +L:    linux-efi@vger.kernel.org
 +M:    Ivan Hu <ivan.hu@canonical.com>
 +M:    Matt Fleming <matt@codeblueprint.co.uk>
 +S:    Maintained
 +F:    drivers/firmware/efi/test/
 +
  EFS FILESYSTEM
  W:    http://aeschi.ch.eu.org/efs/
  S:    Orphan
@@@ -4884,7 -4848,6 +4892,7 @@@ F:      tools/firewire
  
  FIRMWARE LOADER (request_firmware)
  M:    Ming Lei <ming.lei@canonical.com>
 +M:    Luis R. Rodriguez <mcgrof@kernel.org>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    Documentation/firmware_class/
@@@ -5105,9 -5068,10 +5113,9 @@@ F:     include/linux/fscrypto.
  
  F2FS FILE SYSTEM
  M:    Jaegeuk Kim <jaegeuk@kernel.org>
 -M:    Changman Lee <cm224.lee@samsung.com>
 -R:    Chao Yu <yuchao0@huawei.com>
 +M:    Chao Yu <yuchao0@huawei.com>
  L:    linux-f2fs-devel@lists.sourceforge.net
 -W:    http://en.wikipedia.org/wiki/F2FS
 +W:    https://f2fs.wiki.kernel.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git
  S:    Maintained
  F:    Documentation/filesystems/f2fs.txt
@@@ -5169,7 -5133,7 +5177,7 @@@ GCOV BASED KERNEL PROFILIN
  M:    Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
  S:    Maintained
  F:    kernel/gcov/
 -F:    Documentation/gcov.txt
 +F:    Documentation/dev-tools/gcov.rst
  
  GDT SCSI DISK ARRAY CONTROLLER DRIVER
  M:    Achim Leubner <achim_leubner@adaptec.com>
@@@ -5286,13 -5250,6 +5294,13 @@@ L:    linux-input@vger.kernel.or
  S:    Maintained
  F:    drivers/input/touchscreen/goodix.c
  
 +GPIO MOCKUP DRIVER
 +M:    Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/gpio/gpio-mockup.c
 +F:    tools/testing/selftests/gpio/
 +
  GPIO SUBSYSTEM
  M:    Linus Walleij <linus.walleij@linaro.org>
  M:    Alexandre Courbot <gnurou@gmail.com>
@@@ -5324,77 -5281,6 +5332,77 @@@ L:    netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/ethernet/aeroflex/
  
 +GREYBUS SUBSYSTEM
 +M:    Johan Hovold <johan@kernel.org>
 +M:    Alex Elder <elder@kernel.org>
 +M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 +S:    Maintained
 +F:    drivers/staging/greybus/
 +
 +GREYBUS AUDIO PROTOCOLS DRIVERS
 +M:    Vaibhav Agarwal <vaibhav.sr@gmail.com>
 +M:    Mark Greer <mgreer@animalcreek.com>
 +S:    Maintained
 +F:    drivers/staging/greybus/audio_apbridgea.c
 +F:    drivers/staging/greybus/audio_apbridgea.h
 +F:    drivers/staging/greybus/audio_codec.c
 +F:    drivers/staging/greybus/audio_codec.h
 +F:    drivers/staging/greybus/audio_gb.c
 +F:    drivers/staging/greybus/audio_manager.c
 +F:    drivers/staging/greybus/audio_manager.h
 +F:    drivers/staging/greybus/audio_manager_module.c
 +F:    drivers/staging/greybus/audio_manager_private.h
 +F:    drivers/staging/greybus/audio_manager_sysfs.c
 +F:    drivers/staging/greybus/audio_module.c
 +F:    drivers/staging/greybus/audio_topology.c
 +
 +GREYBUS PROTOCOLS DRIVERS
 +M:    Rui Miguel Silva <rmfrfs@gmail.com>
 +S:    Maintained
 +F:    drivers/staging/greybus/sdio.c
 +F:    drivers/staging/greybus/light.c
 +F:    drivers/staging/greybus/gpio.c
 +F:    drivers/staging/greybus/power_supply.c
 +F:    drivers/staging/greybus/spi.c
 +F:    drivers/staging/greybus/spilib.c
 +
 +GREYBUS PROTOCOLS DRIVERS
 +M:    Bryan O'Donoghue <pure.logic@nexus-software.ie>
 +S:    Maintained
 +F:    drivers/staging/greybus/loopback.c
 +F:    drivers/staging/greybus/timesync.c
 +F:    drivers/staging/greybus/timesync_platform.c
 +
 +GREYBUS PROTOCOLS DRIVERS
 +M:    Viresh Kumar <vireshk@kernel.org>
 +S:    Maintained
 +F:    drivers/staging/greybus/authentication.c
 +F:    drivers/staging/greybus/bootrom.c
 +F:    drivers/staging/greybus/firmware.h
 +F:    drivers/staging/greybus/fw-core.c
 +F:    drivers/staging/greybus/fw-download.c
 +F:    drivers/staging/greybus/fw-managament.c
 +F:    drivers/staging/greybus/greybus_authentication.h
 +F:    drivers/staging/greybus/greybus_firmware.h
 +F:    drivers/staging/greybus/hid.c
 +F:    drivers/staging/greybus/i2c.c
 +F:    drivers/staging/greybus/spi.c
 +F:    drivers/staging/greybus/spilib.c
 +F:    drivers/staging/greybus/spilib.h
 +
 +GREYBUS PROTOCOLS DRIVERS
 +M:    David Lin <dtwlin@gmail.com>
 +S:    Maintained
 +F:    drivers/staging/greybus/uart.c
 +F:    drivers/staging/greybus/log.c
 +
 +GREYBUS PLATFORM DRIVERS
 +M:    Vaibhav Hiremath <hvaibhav.linux@gmail.com>
 +S:    Maintained
 +F:    drivers/staging/greybus/arche-platform.c
 +F:    drivers/staging/greybus/arche-apb-ctrl.c
 +F:    drivers/staging/greybus/arche_platform.h
 +
  GSPCA FINEPIX SUBDRIVER
  M:    Frank Zago <frank@zago.net>
  L:    linux-media@vger.kernel.org
@@@ -5695,9 -5581,10 +5703,9 @@@ F:     Documentation/devicetree/bindings/sc
  
  HOST AP DRIVER
  M:    Jouni Malinen <j@w1.fi>
 -L:    hostap@shmoo.com (subscribers-only)
  L:    linux-wireless@vger.kernel.org
 -W:    http://hostap.epitest.fi/
 -S:    Maintained
 +W:    http://w1.fi/hostap-driver.html
 +S:    Obsolete
  F:    drivers/net/wireless/intersil/hostap/
  
  HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
@@@ -5734,7 -5621,7 +5742,7 @@@ M:      Sebastian Reichel <sre@kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi.git
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-bus-hsi
 -F:    Documentation/hsi.txt
 +F:    Documentation/device-drivers/serial-interfaces.rst
  F:    drivers/hsi/
  F:    include/linux/hsi/
  F:    include/uapi/linux/hsi/
@@@ -5788,6 -5675,8 +5796,8 @@@ S:      Maintaine
  F:    Documentation/i2c/i2c-topology
  F:    Documentation/i2c/muxes/
  F:    Documentation/devicetree/bindings/i2c/i2c-mux*
+ F:    Documentation/devicetree/bindings/i2c/i2c-arb*
+ F:    Documentation/devicetree/bindings/i2c/i2c-gate*
  F:    drivers/i2c/i2c-mux.c
  F:    drivers/i2c/muxes/
  F:    include/linux/i2c-mux.h
@@@ -6205,13 -6094,6 +6215,13 @@@ T:    git git://git.kernel.org/pub/scm/lin
  S:    Supported
  F:    drivers/idle/intel_idle.c
  
 +INTEL INTEGRATED SENSOR HUB DRIVER
 +M:    Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
 +M:    Jiri Kosina <jikos@kernel.org>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hid/intel-ish-hid/
 +
  INTEL PSTATE DRIVER
  M:    Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
  M:    Len Brown <lenb@kernel.org>
@@@ -6220,7 -6102,7 +6230,7 @@@ S:      Supporte
  F:    drivers/cpufreq/intel_pstate.c
  
  INTEL FRAMEBUFFER DRIVER (excluding 810 and 815)
 -M:    Maik Broemme <mbroemme@plusserver.de>
 +M:    Maik Broemme <mbroemme@libmpq.org>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/fb/intelfb.txt
@@@ -6722,7 -6604,7 +6732,7 @@@ L:      kasan-dev@googlegroups.co
  S:    Maintained
  F:    arch/*/include/asm/kasan.h
  F:    arch/*/mm/kasan_init*
 -F:    Documentation/kasan.txt
 +F:    Documentation/dev-tools/kasan.rst
  F:    include/linux/kasan*.h
  F:    lib/test_kasan.c
  F:    mm/kasan/
@@@ -6938,7 -6820,7 +6948,7 @@@ KMEMCHEC
  M:    Vegard Nossum <vegardno@ifi.uio.no>
  M:    Pekka Enberg <penberg@kernel.org>
  S:    Maintained
 -F:    Documentation/kmemcheck.txt
 +F:    Documentation/dev-tools/kmemcheck.rst
  F:    arch/x86/include/asm/kmemcheck.h
  F:    arch/x86/mm/kmemcheck/
  F:    include/linux/kmemcheck.h
@@@ -6947,7 -6829,7 +6957,7 @@@ F:      mm/kmemcheck.
  KMEMLEAK
  M:    Catalin Marinas <catalin.marinas@arm.com>
  S:    Maintained
 -F:    Documentation/kmemleak.txt
 +F:    Documentation/dev-tools/kmemleak.rst
  F:    include/linux/kmemleak.h
  F:    mm/kmemleak.c
  F:    mm/kmemleak-test.c
@@@ -7560,8 -7442,9 +7570,8 @@@ F:      Documentation/hwmon/max2075
  F:    drivers/hwmon/max20751.c
  
  MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER
 -M:    "Hans J. Koch" <hjk@hansjkoch.de>
  L:    linux-hwmon@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/hwmon/max6650
  F:    drivers/hwmon/max6650.c
  
@@@ -7582,12 -7465,11 +7592,12 @@@ F:   Documentation/devicetree/bindings/so
  F:    sound/soc/codecs/max9860.*
  
  MAXIM MUIC CHARGER DRIVERS FOR EXYNOS BASED BOARDS
 -M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
 +M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-pm@vger.kernel.org
  S:    Supported
 -F:    drivers/power/max14577_charger.c
 -F:    drivers/power/max77693_charger.c
 +F:    drivers/power/supply/max14577_charger.c
 +F:    drivers/power/supply/max77693_charger.c
  
  MAXIM MAX77802 MULTIFUNCTION PMIC DEVICE DRIVERS
  M:    Javier Martinez Canillas <javier@osg.samsung.com>
@@@ -7599,8 -7481,7 +7609,8 @@@ F:      include/dt-bindings/*/*max77802.
  
  MAXIM PMIC AND MUIC DRIVERS FOR EXYNOS BASED BOARDS
  M:    Chanwoo Choi <cw00.choi@samsung.com>
 -M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
 +M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  F:    drivers/*/max14577*.c
@@@ -7632,12 -7513,6 +7642,12 @@@ L:    linux-iio@vger.kernel.or
  S:    Maintained
  F:    drivers/iio/potentiometer/mcp4531.c
  
 +MEASUREMENT COMPUTING CIO-DAC IIO DRIVER
 +M:    William Breathitt Gray <vilhelm.gray@gmail.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/iio/dac/cio-dac.c
 +
  MEDIA DRIVERS FOR RENESAS - FCP
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-media@vger.kernel.org
@@@ -7790,26 -7665,13 +7800,26 @@@ W:   http://www.mellanox.co
  Q:    http://patchwork.ozlabs.org/project/netdev/list/
  F:    drivers/net/ethernet/mellanox/mlxsw/
  
 +MELLANOX MLXCPLD LED DRIVER
 +M:    Vadim Pasternak <vadimp@mellanox.com>
 +L:    linux-leds@vger.kernel.org
 +S:    Supported
 +F:    drivers/leds/leds-mlxcpld.c
 +F:    Documentation/leds/leds-mlxcpld.txt
 +
 +MELLANOX PLATFORM DRIVER
 +M:      Vadim Pasternak <vadimp@mellanox.com>
 +L:      platform-driver-x86@vger.kernel.org
 +S:      Supported
 +F:      arch/x86/platform/mellanox/mlx-platform.c
 +
  SOFT-ROCE DRIVER (rxe)
  M:    Moni Shoua <monis@mellanox.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  W:    https://github.com/SoftRoCE/rxe-dev/wiki/rxe-dev:-Home
  Q:    http://patchwork.kernel.org/project/linux-rdma/list/
 -F:    drivers/infiniband/hw/rxe/
 +F:    drivers/infiniband/sw/rxe/
  F:    include/uapi/rdma/rdma_user_rxe.h
  
  MEMBARRIER SUPPORT
@@@ -7888,12 -7750,6 +7898,12 @@@ T:    git git://git.monstr.eu/linux-2.6-mi
  S:    Supported
  F:    arch/microblaze/
  
 +MICROCHIP / ATMEL AT91 / AT32 SERIAL DRIVER
 +M:    Richard Genoud <richard.genoud@gmail.com>
 +S:    Maintained
 +F:    drivers/tty/serial/atmel_serial.c
 +F:    include/linux/atmel_serial.h
 +
  MICROSOFT SURFACE PRO 3 BUTTON DRIVER
  M:    Chen Yu <yu.c.chen@intel.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -7980,18 -7836,6 +7990,18 @@@ W:    http://www.melexis.co
  S:    Supported
  F:    drivers/iio/temperature/mlx90614.c
  
 +MICROSEMI SMART ARRAY SMARTPQI DRIVER (smartpqi)
 +M:    Don Brace <don.brace@microsemi.com>
 +L:    esc.storagedev@microsemi.com
 +L:    linux-scsi@vger.kernel.org
 +S:    Supported
 +F:    drivers/scsi/smartpqi/smartpqi*.[ch]
 +F:    drivers/scsi/smartpqi/Kconfig
 +F:    drivers/scsi/smartpqi/Makefile
 +F:    include/linux/cciss*.h
 +F:    include/uapi/linux/cciss*.h
 +F:    Documentation/scsi/smartpqi.txt
 +
  MN88472 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
  L:    linux-media@vger.kernel.org
@@@ -8117,7 -7961,6 +8127,7 @@@ MULTIFUNCTION DEVICES (MFD
  M:    Lee Jones <lee.jones@linaro.org>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
  S:    Supported
 +F:    Documentation/devicetree/bindings/mfd/
  F:    drivers/mfd/
  F:    include/linux/mfd/
  
@@@ -8204,16 -8047,20 +8214,16 @@@ M:   Michael Schmitz <schmitzmic@gmail.co
  L:    linux-scsi@vger.kernel.org
  S:    Maintained
  F:    Documentation/scsi/g_NCR5380.txt
 -F:    Documentation/scsi/dtc3x80.txt
  F:    drivers/scsi/NCR5380.*
  F:    drivers/scsi/arm/cumana_1.c
  F:    drivers/scsi/arm/oak.c
  F:    drivers/scsi/atari_scsi.*
  F:    drivers/scsi/dmx3191d.c
 -F:    drivers/scsi/dtc.*
  F:    drivers/scsi/g_NCR5380.*
  F:    drivers/scsi/g_NCR5380_mmio.c
  F:    drivers/scsi/mac_scsi.*
 -F:    drivers/scsi/pas16.*
  F:    drivers/scsi/sun3_scsi.*
  F:    drivers/scsi/sun3_scsi_vme.c
 -F:    drivers/scsi/t128.*
  
  NCR DUAL 700 SCSI DRIVER (MICROCHANNEL)
  M:    "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
@@@ -8311,15 -8158,6 +8321,15 @@@ S:    Maintaine
  W:    https://fedorahosted.org/dropwatch/
  F:    net/core/drop_monitor.c
  
 +NETWORKING [DSA]
 +M:    Andrew Lunn <andrew@lunn.ch>
 +M:    Vivien Didelot <vivien.didelot@savoirfairelinux.com>
 +M:    Florian Fainelli <f.fainelli@gmail.com>
 +S:    Maintained
 +F:    net/dsa/
 +F:    include/net/dsa.h
 +F:    drivers/net/dsa/
 +
  NETWORKING [GENERAL]
  M:    "David S. Miller" <davem@davemloft.net>
  L:    netdev@vger.kernel.org
@@@ -8502,11 -8340,11 +8512,11 @@@ R:   Pali Rohár <pali.rohar@gmail.com
  F:    include/linux/power/bq2415x_charger.h
  F:    include/linux/power/bq27xxx_battery.h
  F:    include/linux/power/isp1704_charger.h
 -F:    drivers/power/bq2415x_charger.c
 -F:    drivers/power/bq27xxx_battery.c
 -F:    drivers/power/bq27xxx_battery_i2c.c
 -F:    drivers/power/isp1704_charger.c
 -F:    drivers/power/rx51_battery.c
 +F:    drivers/power/supply/bq2415x_charger.c
 +F:    drivers/power/supply/bq27xxx_battery.c
 +F:    drivers/power/supply/bq27xxx_battery_i2c.c
 +F:    drivers/power/supply/isp1704_charger.c
 +F:    drivers/power/supply/rx51_battery.c
  
  NTB DRIVER CORE
  M:    Jon Mason <jdmason@kudzu.us>
@@@ -8895,7 -8733,7 +8905,7 @@@ F:      drivers/oprofile
  F:    include/linux/oprofile.h
  
  ORACLE CLUSTER FILESYSTEM 2 (OCFS2)
 -M:    Mark Fasheh <mfasheh@suse.com>
 +M:    Mark Fasheh <mfasheh@versity.com>
  M:    Joel Becker <jlbec@evilplan.org>
  L:    ocfs2-devel@oss.oracle.com (moderated for non-subscribers)
  W:    http://ocfs2.wiki.kernel.org
@@@ -9007,7 -8845,6 +9017,7 @@@ S:      Supporte
  F:    Documentation/virtual/paravirt_ops.txt
  F:    arch/*/kernel/paravirt*
  F:    arch/*/include/asm/paravirt.h
 +F:    include/linux/hypervisor.h
  
  PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES
  M:    Tim Waugh <tim@cyberelk.net>
@@@ -9263,15 -9100,6 +9273,15 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/pci/hisilicon-pcie.txt
  F:    drivers/pci/host/pcie-hisi.c
  
 +PCIE DRIVER FOR ROCKCHIP
 +M:    Shawn Lin <shawn.lin@rock-chips.com>
 +M:    Wenrui Li <wenrui.li@rock-chips.com>
 +L:    linux-pci@vger.kernel.org
 +L:    linux-rockchip@lists.infradead.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/pci/rockchip-pcie.txt
 +F:    drivers/pci/host/pcie-rockchip.c
 +
  PCIE DRIVER FOR QUALCOMM MSM
  M:     Stanimir Varbanov <svarbanov@mm-sol.com>
  L:     linux-pci@vger.kernel.org
@@@ -9419,7 -9247,7 +9429,7 @@@ F:      drivers/pinctrl/sh-pfc
  
  PIN CONTROLLER - SAMSUNG
  M:    Tomasz Figa <tomasz.figa@gmail.com>
 -M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
  M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
@@@ -9515,12 -9343,16 +9525,12 @@@ F:   drivers/powercap
  
  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
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git
  S:    Maintained
 -F:    Documentation/devicetree/bindings/power/
 -F:    Documentation/devicetree/bindings/power_supply/
 +F:    Documentation/devicetree/bindings/power/supply/
  F:    include/linux/power_supply.h
 -F:    drivers/power/
 -X:    drivers/power/avs/
 +F:    drivers/power/supply/
  
  POWER STATE COORDINATION INTERFACE (PSCI)
  M:    Mark Rutland <mark.rutland@arm.com>
@@@ -9856,12 -9688,6 +9866,12 @@@ T:    git git://git.kernel.org/pub/scm/lin
  S:    Supported
  F:    drivers/net/wireless/ath/ath10k/
  
 +QUALCOMM EMAC GIGABIT ETHERNET DRIVER
 +M:    Timur Tabi <timur@codeaurora.org>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/ethernet/qualcomm/emac/
 +
  QUALCOMM HEXAGON ARCHITECTURE
  M:    Richard Kuo <rkuo@codeaurora.org>
  L:    linux-hexagon@vger.kernel.org
@@@ -10082,12 -9908,6 +10092,12 @@@ F:  drivers/rpmsg
  F:    Documentation/rpmsg.txt
  F:    include/linux/rpmsg.h
  
 +RENESAS CLOCK DRIVERS
 +M:    Geert Uytterhoeven <geert+renesas@glider.be>
 +L:    linux-renesas-soc@vger.kernel.org
 +S:    Supported
 +F:    drivers/clk/renesas/
 +
  RENESAS ETHERNET DRIVERS
  R:    Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
  L:    netdev@vger.kernel.org
@@@ -10123,7 -9943,6 +10133,7 @@@ F:    net/rfkill
  
  RHASHTABLE
  M:    Thomas Graf <tgraf@suug.ch>
 +M:    Herbert Xu <herbert@gondor.apana.org.au>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    lib/rhashtable.c
@@@ -10267,8 -10086,8 +10277,8 @@@ S:   Supporte
  F:    drivers/s390/cio/
  
  S390 DASD DRIVER
 -M:    Stefan Weinhuber <wein@de.ibm.com>
 -M:    Stefan Haberland <stefan.haberland@de.ibm.com>
 +M:    Stefan Haberland <sth@linux.vnet.ibm.com>
 +M:    Jan Hoeppner <hoeppner@linux.vnet.ibm.com>
  L:    linux-s390@vger.kernel.org
  W:    http://www.ibm.com/developerworks/linux/linux390/
  S:    Supported
@@@ -10361,7 -10180,7 +10371,7 @@@ S:   Maintaine
  F:    drivers/platform/x86/samsung-laptop.c
  
  SAMSUNG AUDIO (ASoC) DRIVERS
 -M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
  M:    Sangbeom Kim <sbkim73@samsung.com>
  M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -10376,8 -10195,7 +10386,8 @@@ F:   drivers/video/fbdev/s3c-fb.
  
  SAMSUNG MULTIFUNCTION PMIC DEVICE DRIVERS
  M:    Sangbeom Kim <sbkim73@samsung.com>
 -M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
 +M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-kernel@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Supported
@@@ -10432,23 -10250,9 +10442,23 @@@ F: drivers/nfc/s3fwrn
  SAMSUNG SOC CLOCK DRIVERS
  M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
  M:    Tomasz Figa <tomasz.figa@gmail.com>
 +M:    Chanwoo Choi <cw00.choi@samsung.com>
  S:    Supported
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  F:    drivers/clk/samsung/
 +F:    include/dt-bindings/clock/exynos*.h
 +F:    Documentation/devicetree/bindings/clock/exynos*.txt
 +
 +SAMSUNG SPI DRIVERS
 +M:    Kukjin Kim <kgene@kernel.org>
 +M:    Krzysztof Kozlowski <krzk@kernel.org>
 +M:    Andi Shyti <andi.shyti@samsung.com>
 +L:    linux-spi@vger.kernel.org
 +L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/spi/spi-samsung.txt
 +F:    drivers/spi/spi-s3c*
 +F:    include/linux/platform_data/spi-s3c64xx.h
  
  SAMSUNG SXGBE DRIVERS
  M:    Byungho An <bh74.an@samsung.com>
@@@ -10535,8 -10339,8 +10545,8 @@@ F:   drivers/thunderbolt
  TI BQ27XXX POWER SUPPLY DRIVER
  R:    Andrew F. Davis <afd@ti.com>
  F:    include/linux/power/bq27xxx_battery.h
 -F:    drivers/power/bq27xxx_battery.c
 -F:    drivers/power/bq27xxx_battery_i2c.c
 +F:    drivers/power/supply/bq27xxx_battery.c
 +F:    drivers/power/supply/bq27xxx_battery_i2c.c
  
  TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
  M:    John Stultz <john.stultz@linaro.org>
@@@ -10764,12 -10568,12 +10774,12 @@@ S:        Maintaine
  F:    drivers/misc/phantom.c
  F:    include/uapi/linux/phantom.h
  
 -SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
 -M:    Jayamohan Kallickal <jayamohan.kallickal@avagotech.com>
 -M:    Ketan Mukadam <ketan.mukadam@avagotech.com>
 -M:    John Soni Jose <sony.john@avagotech.com>
 +Emulex 10Gbps iSCSI - OneConnect DRIVER
 +M:    Subbu Seetharaman <subbu.seetharaman@broadcom.com>
 +M:    Ketan Mukadam <ketan.mukadam@broadcom.com>
 +M:    Jitendra Bhivare <jitendra.bhivare@broadcom.com>
  L:    linux-scsi@vger.kernel.org
 -W:    http://www.avagotech.com
 +W:    http://www.broadcom.com
  S:    Supported
  F:    drivers/scsi/be2iscsi/
  
@@@ -11296,7 -11100,6 +11306,7 @@@ F:   Documentation/spi
  F:    drivers/spi/
  F:    include/linux/spi/
  F:    include/uapi/linux/spi/
 +F:    tools/spi/
  
  SPIDERNET NETWORK DRIVER for CELL
  M:    Ishizaki Kou <kou.ishizaki@toshiba.co.jp>
@@@ -11367,7 -11170,6 +11377,7 @@@ F:   drivers/staging/media/lirc
  STAGING - LUSTRE PARALLEL FILESYSTEM
  M:    Oleg Drokin <oleg.drokin@intel.com>
  M:    Andreas Dilger <andreas.dilger@intel.com>
 +M:    James Simmons <jsimmons@infradead.org>
  L:    lustre-devel@lists.lustre.org (moderated for non-subscribers)
  W:    http://wiki.lustre.org/
  S:    Maintained
@@@ -11394,6 -11196,13 +11404,6 @@@ M:  Florian Schilhabel <florian.c.schilh
  S:    Odd Fixes
  F:    drivers/staging/rtl8712/
  
 -STAGING - REALTEK RTL8723U WIRELESS DRIVER
 -M:    Larry Finger <Larry.Finger@lwfinger.net>
 -M:    Jes Sorensen <Jes.Sorensen@redhat.com>
 -L:    linux-wireless@vger.kernel.org
 -S:    Maintained
 -F:    drivers/staging/rtl8723au/
 -
  STAGING - SILICON MOTION SM750 FRAME BUFFER DRIVER
  M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
  M:    Teddy Wang <teddy.wang@siliconmotion.com>
@@@ -11424,8 -11233,12 +11434,8 @@@ S:  Odd Fixe
  F:    drivers/staging/vt665?/
  
  STAGING - WILC1000 WIFI DRIVER
 -M:    Johnny Kim <johnny.kim@atmel.com>
 -M:    Austin Shin <austin.shin@atmel.com>
 -M:    Chris Park <chris.park@atmel.com>
 -M:    Tony Cho <tony.cho@atmel.com>
 -M:    Glen Lee <glen.lee@atmel.com>
 -M:    Leo Kim <leo.kim@atmel.com>
 +M:    Aditya Shankar <aditya.shankar@microchip.com>
 +M:    Ganesh Krishna <ganesh.krishna@microchip.com>
  L:    linux-wireless@vger.kernel.org
  S:    Supported
  F:    drivers/staging/wilc1000/
@@@ -11533,14 -11346,6 +11543,14 @@@ T: git git://git.kernel.org/pub/scm/lin
  S:    Supported
  F:    drivers/mfd/syscon.c
  
 +SYSTEM RESET/SHUTDOWN DRIVERS
 +M:    Sebastian Reichel <sre@kernel.org>
 +L:    linux-pm@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/power/reset/
 +F:    drivers/power/reset/
 +
  SYSV FILESYSTEM
  M:    Christoph Hellwig <hch@infradead.org>
  S:    Maintained
@@@ -11801,7 -11606,7 +11811,7 @@@ F:   Documentation/devicetree/bindings/th
  THERMAL/CPU_COOLING
  M:    Amit Daniel Kachhap <amit.kachhap@gmail.com>
  M:    Viresh Kumar <viresh.kumar@linaro.org>
 -M:    Javi Merino <javi.merino@arm.com>
 +M:    Javi Merino <javi.merino@kernel.org>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  F:    Documentation/thermal/cpu-cooling-api.txt
@@@ -11889,7 -11694,7 +11899,7 @@@ F:   include/linux/platform_data/lp855x.
  TI LP8727 CHARGER DRIVER
  M:    Milo Kim <milo.kim@ti.com>
  S:    Maintained
 -F:    drivers/power/lp8727_charger.c
 +F:    drivers/power/supply/lp8727_charger.c
  F:    include/linux/platform_data/lp8727.h
  
  TI LP8788 MFD DRIVER
@@@ -11898,7 -11703,7 +11908,7 @@@ S:   Maintaine
  F:    drivers/iio/adc/lp8788_adc.c
  F:    drivers/leds/leds-lp8788.c
  F:    drivers/mfd/lp8788*.c
 -F:    drivers/power/lp8788-charger.c
 +F:    drivers/power/supply/lp8788-charger.c
  F:    drivers/regulator/lp8788-*.c
  F:    include/linux/mfd/lp8788*.h
  
@@@ -12167,6 -11972,12 +12177,6 @@@ S:  Maintaine
  F:    drivers/tc/
  F:    include/linux/tc.h
  
 -U14-34F SCSI DRIVER
 -M:    Dario Ballabio <ballabio_dario@emc.com>
 -L:    linux-scsi@vger.kernel.org
 -S:    Maintained
 -F:    drivers/scsi/u14-34f.c
 -
  UBI FILE SYSTEM (UBIFS)
  M:    Richard Weinberger <richard@nod.at>
  M:    Artem Bityutskiy <dedekind1@gmail.com>
@@@ -12362,7 -12173,7 +12372,7 @@@ S:   Maintaine
  F:    drivers/net/usb/lan78xx.*
  
  USB MASS STORAGE DRIVER
 -M:    Matthew Dharm <mdharm-usb@one-eyed-alien.net>
 +M:    Alan Stern <stern@rowland.harvard.edu>
  L:    linux-usb@vger.kernel.org
  L:    usb-storage@lists.one-eyed-alien.net
  S:    Maintained
@@@ -12446,7 -12257,6 +12456,7 @@@ F:   drivers/net/usb/rtl8150.
  USB SERIAL SUBSYSTEM
  M:    Johan Hovold <johan@kernel.org>
  L:    linux-usb@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial.git
  S:    Maintained
  F:    Documentation/usb/usb-serial.txt
  F:    drivers/usb/serial/
@@@ -12460,7 -12270,6 +12470,7 @@@ F:   drivers/net/usb/smsc75xx.
  
  USB SMSC95XX ETHERNET DRIVER
  M:    Steve Glendinning <steve.glendinning@shawell.net>
 +M:    Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/usb/smsc95xx.*
@@@ -12567,6 -12376,7 +12577,6 @@@ F:   fs/hostfs
  F:    fs/hppfs/
  
  USERSPACE I/O (UIO)
 -M:    "Hans J. Koch" <hjk@hansjkoch.de>
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
@@@ -12748,7 -12558,7 +12758,7 @@@ F:   include/linux/if_*vlan.
  F:    net/8021q/
  
  VLYNQ BUS
 -M:    Florian Fainelli <florian@openwrt.org>
 +M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    openwrt-devel@lists.openwrt.org (subscribers-only)
  S:    Maintained
  F:    drivers/vlynq/vlynq.c
@@@ -12894,6 -12704,12 +12904,6 @@@ F:  drivers/watchdog
  F:    include/linux/watchdog.h
  F:    include/uapi/linux/watchdog.h
  
 -WD7000 SCSI DRIVER
 -M:    Miroslav Zagorac <zaga@fly.cc.fer.hr>
 -L:    linux-scsi@vger.kernel.org
 -S:    Maintained
 -F:    drivers/scsi/wd7000.c
 -
  WIIMOTE HID DRIVER
  M:    David Herrmann <dh.herrmann@googlemail.com>
  L:    linux-input@vger.kernel.org
@@@ -12963,7 -12779,7 +12973,7 @@@ F:   drivers/input/touchscreen/wm97*.
  F:    drivers/mfd/arizona*
  F:    drivers/mfd/wm*.c
  F:    drivers/mfd/cs47l24*
 -F:    drivers/power/wm83*.c
 +F:    drivers/power/supply/wm83*.c
  F:    drivers/rtc/rtc-wm83*.c
  F:    drivers/regulator/wm8*.c
  F:    drivers/video/backlight/wm83*_bl.c
@@@ -13115,10 -12931,11 +13125,10 @@@ F:        arch/x86/xen/*swiotlb
  F:    drivers/xen/*swiotlb*
  
  XFS FILESYSTEM
 -P:    Silicon Graphics Inc
  M:    Dave Chinner <david@fromorbit.com>
 -M:    xfs@oss.sgi.com
 -L:    xfs@oss.sgi.com
 -W:    http://oss.sgi.com/projects/xfs
 +M:    linux-xfs@vger.kernel.org
 +L:    linux-xfs@vger.kernel.org
 +W:    http://xfs.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git
  S:    Supported
  F:    Documentation/filesystems/xfs.txt
@@@ -21,7 -21,6 +21,7 @@@
  #include <asm/unaligned.h>
  #include <linux/of_platform.h>
  #include <linux/acpi.h>
 +#include <linux/regulator/consumer.h>
  
  #define PCA953X_INPUT         0
  #define PCA953X_OUTPUT                1
@@@ -95,24 -94,6 +95,24 @@@ MODULE_DEVICE_TABLE(acpi, pca953x_acpi_
  
  #define NBANK(chip) DIV_ROUND_UP(chip->gpio_chip.ngpio, BANK_SZ)
  
 +struct pca953x_reg_config {
 +      int direction;
 +      int output;
 +      int input;
 +};
 +
 +static const struct pca953x_reg_config pca953x_regs = {
 +      .direction = PCA953X_DIRECTION,
 +      .output = PCA953X_OUTPUT,
 +      .input = PCA953X_INPUT,
 +};
 +
 +static const struct pca953x_reg_config pca957x_regs = {
 +      .direction = PCA957X_CFG,
 +      .output = PCA957X_OUT,
 +      .input = PCA957X_IN,
 +};
 +
  struct pca953x_chip {
        unsigned gpio_start;
        u8 reg_output[MAX_BANK];
        struct i2c_client *client;
        struct gpio_chip gpio_chip;
        const char *const *names;
 -      int     chip_type;
        unsigned long driver_data;
 +      struct regulator *regulator;
 +
 +      const struct pca953x_reg_config *regs;
 +
 +      int (*write_regs)(struct pca953x_chip *, int, u8 *);
 +      int (*read_regs)(struct pca953x_chip *, int, u8 *);
  };
  
  static int pca953x_read_single(struct pca953x_chip *chip, int reg, u32 *val,
@@@ -176,44 -152,38 +176,44 @@@ static int pca953x_write_single(struct 
        return 0;
  }
  
 -static int pca953x_write_regs(struct pca953x_chip *chip, int reg, u8 *val)
 +static int pca953x_write_regs_8(struct pca953x_chip *chip, int reg, u8 *val)
  {
 -      int ret = 0;
 +      return i2c_smbus_write_byte_data(chip->client, reg, *val);
 +}
  
 -      if (chip->gpio_chip.ngpio <= 8)
 -              ret = i2c_smbus_write_byte_data(chip->client, reg, *val);
 -      else if (chip->gpio_chip.ngpio >= 24) {
 -              int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
 -              ret = i2c_smbus_write_i2c_block_data(chip->client,
 -                                      (reg << bank_shift) | REG_ADDR_AI,
 -                                      NBANK(chip), val);
 -      } else {
 -              switch (chip->chip_type) {
 -              case PCA953X_TYPE: {
 -                      __le16 word = cpu_to_le16(get_unaligned((u16 *)val));
 +static int pca953x_write_regs_16(struct pca953x_chip *chip, int reg, u8 *val)
 +{
 +      __le16 word = cpu_to_le16(get_unaligned((u16 *)val));
  
 -                      ret = i2c_smbus_write_word_data(chip->client, reg << 1,
 -                                                      (__force u16)word);
 -                      break;
 -              }
 -              case PCA957X_TYPE:
 -                      ret = i2c_smbus_write_byte_data(chip->client, reg << 1,
 -                                                      val[0]);
 -                      if (ret < 0)
 -                              break;
 -                      ret = i2c_smbus_write_byte_data(chip->client,
 -                                                      (reg << 1) + 1,
 -                                                      val[1]);
 -                      break;
 -              }
 -      }
 +      return i2c_smbus_write_word_data(chip->client,
 +                                       reg << 1, (__force u16)word);
 +}
 +
 +static int pca957x_write_regs_16(struct pca953x_chip *chip, int reg, u8 *val)
 +{
 +      int ret;
 +
 +      ret = i2c_smbus_write_byte_data(chip->client, reg << 1, val[0]);
 +      if (ret < 0)
 +              return ret;
 +
 +      return i2c_smbus_write_byte_data(chip->client, (reg << 1) + 1, val[1]);
 +}
 +
 +static int pca953x_write_regs_24(struct pca953x_chip *chip, int reg, u8 *val)
 +{
 +      int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
 +
 +      return i2c_smbus_write_i2c_block_data(chip->client,
 +                                            (reg << bank_shift) | REG_ADDR_AI,
 +                                            NBANK(chip), val);
 +}
  
 +static int pca953x_write_regs(struct pca953x_chip *chip, int reg, u8 *val)
 +{
 +      int ret = 0;
 +
 +      ret = chip->write_regs(chip, reg, val);
        if (ret < 0) {
                dev_err(&chip->client->dev, "failed writing register\n");
                return ret;
        return 0;
  }
  
 -static int pca953x_read_regs(struct pca953x_chip *chip, int reg, u8 *val)
 +static int pca953x_read_regs_8(struct pca953x_chip *chip, int reg, u8 *val)
  {
        int ret;
  
 -      if (chip->gpio_chip.ngpio <= 8) {
 -              ret = i2c_smbus_read_byte_data(chip->client, reg);
 -              *val = ret;
 -      } else if (chip->gpio_chip.ngpio >= 24) {
 -              int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
 +      ret = i2c_smbus_read_byte_data(chip->client, reg);
 +      *val = ret;
  
 -              ret = i2c_smbus_read_i2c_block_data(chip->client,
 -                                      (reg << bank_shift) | REG_ADDR_AI,
 -                                      NBANK(chip), val);
 -      } else {
 -              ret = i2c_smbus_read_word_data(chip->client, reg << 1);
 -              val[0] = (u16)ret & 0xFF;
 -              val[1] = (u16)ret >> 8;
 -      }
 +      return ret;
 +}
 +
 +static int pca953x_read_regs_16(struct pca953x_chip *chip, int reg, u8 *val)
 +{
 +      int ret;
 +
 +      ret = i2c_smbus_read_word_data(chip->client, reg << 1);
 +      val[0] = (u16)ret & 0xFF;
 +      val[1] = (u16)ret >> 8;
 +
 +      return ret;
 +}
 +
 +static int pca953x_read_regs_24(struct pca953x_chip *chip, int reg, u8 *val)
 +{
 +      int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
 +
 +      return i2c_smbus_read_i2c_block_data(chip->client,
 +                                           (reg << bank_shift) | REG_ADDR_AI,
 +                                           NBANK(chip), val);
 +}
 +
 +static int pca953x_read_regs(struct pca953x_chip *chip, int reg, u8 *val)
 +{
 +      int ret;
 +
 +      ret = chip->read_regs(chip, reg, val);
        if (ret < 0) {
                dev_err(&chip->client->dev, "failed reading register\n");
                return ret;
@@@ -269,12 -222,20 +269,12 @@@ static int pca953x_gpio_direction_input
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
        u8 reg_val;
 -      int ret, offset = 0;
 +      int ret;
  
        mutex_lock(&chip->i2c_lock);
        reg_val = chip->reg_direction[off / BANK_SZ] | (1u << (off % BANK_SZ));
  
 -      switch (chip->chip_type) {
 -      case PCA953X_TYPE:
 -              offset = PCA953X_DIRECTION;
 -              break;
 -      case PCA957X_TYPE:
 -              offset = PCA957X_CFG;
 -              break;
 -      }
 -      ret = pca953x_write_single(chip, offset, reg_val, off);
 +      ret = pca953x_write_single(chip, chip->regs->direction, reg_val, off);
        if (ret)
                goto exit;
  
@@@ -289,7 -250,7 +289,7 @@@ static int pca953x_gpio_direction_outpu
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
        u8 reg_val;
 -      int ret, offset = 0;
 +      int ret;
  
        mutex_lock(&chip->i2c_lock);
        /* set output level */
                reg_val = chip->reg_output[off / BANK_SZ]
                        & ~(1u << (off % BANK_SZ));
  
 -      switch (chip->chip_type) {
 -      case PCA953X_TYPE:
 -              offset = PCA953X_OUTPUT;
 -              break;
 -      case PCA957X_TYPE:
 -              offset = PCA957X_OUT;
 -              break;
 -      }
 -      ret = pca953x_write_single(chip, offset, reg_val, off);
 +      ret = pca953x_write_single(chip, chip->regs->output, reg_val, off);
        if (ret)
                goto exit;
  
  
        /* then direction */
        reg_val = chip->reg_direction[off / BANK_SZ] & ~(1u << (off % BANK_SZ));
 -      switch (chip->chip_type) {
 -      case PCA953X_TYPE:
 -              offset = PCA953X_DIRECTION;
 -              break;
 -      case PCA957X_TYPE:
 -              offset = PCA957X_CFG;
 -              break;
 -      }
 -      ret = pca953x_write_single(chip, offset, reg_val, off);
 +      ret = pca953x_write_single(chip, chip->regs->direction, reg_val, off);
        if (ret)
                goto exit;
  
@@@ -322,10 -299,18 +322,10 @@@ static int pca953x_gpio_get_value(struc
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
        u32 reg_val;
 -      int ret, offset = 0;
 +      int ret;
  
        mutex_lock(&chip->i2c_lock);
 -      switch (chip->chip_type) {
 -      case PCA953X_TYPE:
 -              offset = PCA953X_INPUT;
 -              break;
 -      case PCA957X_TYPE:
 -              offset = PCA957X_IN;
 -              break;
 -      }
 -      ret = pca953x_read_single(chip, offset, &reg_val, off);
 +      ret = pca953x_read_single(chip, chip->regs->input, &reg_val, off);
        mutex_unlock(&chip->i2c_lock);
        if (ret < 0) {
                /* NOTE:  diagnostic already emitted; that's all we should
@@@ -342,7 -327,7 +342,7 @@@ static void pca953x_gpio_set_value(stru
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
        u8 reg_val;
 -      int ret, offset = 0;
 +      int ret;
  
        mutex_lock(&chip->i2c_lock);
        if (val)
                reg_val = chip->reg_output[off / BANK_SZ]
                        & ~(1u << (off % BANK_SZ));
  
 -      switch (chip->chip_type) {
 -      case PCA953X_TYPE:
 -              offset = PCA953X_OUTPUT;
 -              break;
 -      case PCA957X_TYPE:
 -              offset = PCA957X_OUT;
 -              break;
 -      }
 -      ret = pca953x_write_single(chip, offset, reg_val, off);
 +      ret = pca953x_write_single(chip, chip->regs->output, reg_val, off);
        if (ret)
                goto exit;
  
@@@ -362,31 -355,35 +362,31 @@@ exit
  }
  
  static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
 -              unsigned long *mask, unsigned long *bits)
 +                                    unsigned long *mask, unsigned long *bits)
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
 +      unsigned int bank_mask, bank_val;
 +      int bank_shift, bank;
        u8 reg_val[MAX_BANK];
 -      int ret, offset = 0;
 -      int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
 -      int bank;
 -
 -      switch (chip->chip_type) {
 -      case PCA953X_TYPE:
 -              offset = PCA953X_OUTPUT;
 -              break;
 -      case PCA957X_TYPE:
 -              offset = PCA957X_OUT;
 -              break;
 -      }
 +      int ret;
 +
 +      bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
  
        memcpy(reg_val, chip->reg_output, NBANK(chip));
        mutex_lock(&chip->i2c_lock);
 -      for(bank=0; bank<NBANK(chip); bank++) {
 -              unsigned bankmask = mask[bank / sizeof(*mask)] >>
 -                                  ((bank % sizeof(*mask)) * 8);
 -              if(bankmask) {
 -                      unsigned bankval  = bits[bank / sizeof(*bits)] >>
 -                                          ((bank % sizeof(*bits)) * 8);
 -                      reg_val[bank] = (reg_val[bank] & ~bankmask) | bankval;
 +      for (bank = 0; bank < NBANK(chip); bank++) {
 +              bank_mask = mask[bank / sizeof(*mask)] >>
 +                         ((bank % sizeof(*mask)) * 8);
 +              if (bank_mask) {
 +                      bank_val = bits[bank / sizeof(*bits)] >>
 +                                ((bank % sizeof(*bits)) * 8);
 +                      reg_val[bank] = (reg_val[bank] & ~bank_mask) | bank_val;
                }
        }
 -      ret = i2c_smbus_write_i2c_block_data(chip->client, offset << bank_shift, NBANK(chip), reg_val);
 +
 +      ret = i2c_smbus_write_i2c_block_data(chip->client,
 +                                           chip->regs->output << bank_shift,
 +                                           NBANK(chip), reg_val);
        if (ret)
                goto exit;
  
@@@ -518,7 -515,7 +518,7 @@@ static bool pca953x_irq_pending(struct 
        bool pending_seen = false;
        bool trigger_seen = false;
        u8 trigger[MAX_BANK];
 -      int ret, i, offset = 0;
 +      int ret, i;
  
        if (chip->driver_data & PCA_PCAL) {
                /* Read the current interrupt status from the device */
                return pending_seen;
        }
  
 -      switch (chip->chip_type) {
 -      case PCA953X_TYPE:
 -              offset = PCA953X_INPUT;
 -              break;
 -      case PCA957X_TYPE:
 -              offset = PCA957X_IN;
 -              break;
 -      }
 -      ret = pca953x_read_regs(chip, offset, cur_stat);
 +      ret = pca953x_read_regs(chip, chip->regs->input, cur_stat);
        if (ret)
                return false;
  
@@@ -603,13 -608,20 +603,13 @@@ static int pca953x_irq_setup(struct pca
                             int irq_base)
  {
        struct i2c_client *client = chip->client;
 -      int ret, i, offset = 0;
 +      int ret, i;
  
        if (client->irq && irq_base != -1
                        && (chip->driver_data & PCA_INT)) {
  
 -              switch (chip->chip_type) {
 -              case PCA953X_TYPE:
 -                      offset = PCA953X_INPUT;
 -                      break;
 -              case PCA957X_TYPE:
 -                      offset = PCA957X_IN;
 -                      break;
 -              }
 -              ret = pca953x_read_regs(chip, offset, chip->irq_stat);
 +              ret = pca953x_read_regs(chip,
 +                                      chip->regs->input, chip->irq_stat);
                if (ret)
                        return ret;
  
@@@ -672,14 -684,12 +672,14 @@@ static int device_pca953x_init(struct p
        int ret;
        u8 val[MAX_BANK];
  
 -      ret = pca953x_read_regs(chip, PCA953X_OUTPUT, chip->reg_output);
 +      chip->regs = &pca953x_regs;
 +
 +      ret = pca953x_read_regs(chip, chip->regs->output, chip->reg_output);
        if (ret)
                goto out;
  
 -      ret = pca953x_read_regs(chip, PCA953X_DIRECTION,
 -                             chip->reg_direction);
 +      ret = pca953x_read_regs(chip, chip->regs->direction,
 +                              chip->reg_direction);
        if (ret)
                goto out;
  
@@@ -699,13 -709,10 +699,13 @@@ static int device_pca957x_init(struct p
        int ret;
        u8 val[MAX_BANK];
  
 -      ret = pca953x_read_regs(chip, PCA957X_OUT, chip->reg_output);
 +      chip->regs = &pca957x_regs;
 +
 +      ret = pca953x_read_regs(chip, chip->regs->output, chip->reg_output);
        if (ret)
                goto out;
 -      ret = pca953x_read_regs(chip, PCA957X_CFG, chip->reg_direction);
 +      ret = pca953x_read_regs(chip, chip->regs->direction,
 +                              chip->reg_direction);
        if (ret)
                goto out;
  
@@@ -732,14 -739,13 +732,14 @@@ out
  static const struct of_device_id pca953x_dt_ids[];
  
  static int pca953x_probe(struct i2c_client *client,
-                                  const struct i2c_device_id *id)
+                                  const struct i2c_device_id *i2c_id)
  {
        struct pca953x_platform_data *pdata;
        struct pca953x_chip *chip;
        int irq_base = 0;
        int ret;
        u32 invert = 0;
 +      struct regulator *reg;
  
        chip = devm_kzalloc(&client->dev,
                        sizeof(struct pca953x_chip), GFP_KERNEL);
  
        chip->client = client;
  
-       if (id) {
-               chip->driver_data = id->driver_data;
 +      reg = devm_regulator_get(&client->dev, "vcc");
 +      if (IS_ERR(reg)) {
 +              ret = PTR_ERR(reg);
 +              if (ret != -EPROBE_DEFER)
 +                      dev_err(&client->dev, "reg get err: %d\n", ret);
 +              return ret;
 +      }
 +      ret = regulator_enable(reg);
 +      if (ret) {
 +              dev_err(&client->dev, "reg en err: %d\n", ret);
 +              return ret;
 +      }
 +      chip->regulator = reg;
 +
+       if (i2c_id) {
+               chip->driver_data = i2c_id->driver_data;
        } else {
-               const struct acpi_device_id *id;
+               const struct acpi_device_id *acpi_id;
                const struct of_device_id *match;
  
                match = of_match_device(pca953x_dt_ids, &client->dev);
                if (match) {
                        chip->driver_data = (int)(uintptr_t)match->data;
                } else {
-                       id = acpi_match_device(pca953x_acpi_ids, &client->dev);
-                       if (!id) {
+                       acpi_id = acpi_match_device(pca953x_acpi_ids, &client->dev);
 -                      if (!acpi_id)
 -                              return -ENODEV;
++                      if (!acpi_id) {
 +                              ret = -ENODEV;
 +                              goto err_exit;
 +                      }
  
-                       chip->driver_data = id->driver_data;
+                       chip->driver_data = acpi_id->driver_data;
                }
        }
  
 -      chip->chip_type = PCA_CHIP_TYPE(chip->driver_data);
 -
        mutex_init(&chip->i2c_lock);
+       lockdep_set_subclass(&chip->i2c_lock,
+                            i2c_adapter_depth(client->adapter));
  
        /* initialize cached registers from their original values.
         * we can't share this chip with another i2c master.
         */
        pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK);
  
 -      if (chip->chip_type == PCA953X_TYPE)
 +      if (chip->gpio_chip.ngpio <= 8) {
 +              chip->write_regs = pca953x_write_regs_8;
 +              chip->read_regs = pca953x_read_regs_8;
 +      } else if (chip->gpio_chip.ngpio >= 24) {
 +              chip->write_regs = pca953x_write_regs_24;
 +              chip->read_regs = pca953x_read_regs_24;
 +      } else {
 +              if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE)
 +                      chip->write_regs = pca953x_write_regs_16;
 +              else
 +                      chip->write_regs = pca957x_write_regs_16;
 +              chip->read_regs = pca953x_read_regs_16;
 +      }
 +
 +      if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE)
                ret = device_pca953x_init(chip, invert);
        else
                ret = device_pca957x_init(chip, invert);
        if (ret)
 -              return ret;
 +              goto err_exit;
  
        ret = devm_gpiochip_add_data(&client->dev, &chip->gpio_chip, chip);
        if (ret)
 -              return ret;
 +              goto err_exit;
  
        ret = pca953x_irq_setup(chip, irq_base);
        if (ret)
 -              return ret;
 +              goto err_exit;
  
        if (pdata && pdata->setup) {
                ret = pdata->setup(client, chip->gpio_chip.base,
  
        i2c_set_clientdata(client, chip);
        return 0;
 +
 +err_exit:
 +      regulator_disable(chip->regulator);
 +      return ret;
  }
  
  static int pca953x_remove(struct i2c_client *client)
        if (pdata && pdata->teardown) {
                ret = pdata->teardown(client, chip->gpio_chip.base,
                                chip->gpio_chip.ngpio, pdata->context);
 -              if (ret < 0) {
 +              if (ret < 0)
                        dev_err(&client->dev, "%s failed, %d\n",
                                        "teardown", ret);
 -                      return ret;
 -              }
 +      } else {
 +              ret = 0;
        }
  
 -      return 0;
 +      regulator_disable(chip->regulator);
 +
 +      return ret;
  }
  
  /* convenience to stop overlong match-table lines */
@@@ -643,7 -643,7 +643,7 @@@ static int bcm_kona_i2c_xfer(struct i2c
                        if (rc < 0) {
                                dev_err(dev->device,
                                        "restart cmd failed rc = %d\n", rc);
 -                                      goto xfer_send_stop;
 +                              goto xfer_send_stop;
                        }
                }
  
@@@ -858,10 -858,8 +858,8 @@@ static int bcm_kona_i2c_probe(struct pl
        adap->dev.of_node = pdev->dev.of_node;
  
        rc = i2c_add_adapter(adap);
-       if (rc) {
-               dev_err(dev->device, "failed to add adapter\n");
+       if (rc)
                return rc;
-       }
  
        dev_info(dev->device, "device registered successfully\n");
  
@@@ -767,7 -767,7 +767,7 @@@ static int cdns_i2c_setclk(unsigned lon
   * depending on the scaling direction.
   *
   * Return:    NOTIFY_STOP if the rate change should be aborted, NOTIFY_OK
 - *            to acknowedge the change, NOTIFY_DONE if the notification is
 + *            to acknowledge the change, NOTIFY_DONE if the notification is
   *            considered irrelevant.
   */
  static int cdns_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long
@@@ -963,10 -963,8 +963,8 @@@ static int cdns_i2c_probe(struct platfo
        }
  
        ret = i2c_add_adapter(&id->adap);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "reg adap failed: %d\n", ret);
+       if (ret < 0)
                goto err_clk_dis;
-       }
  
        /*
         * Cadence I2C controller has a bug wherein it generates
@@@ -42,6 -42,8 +42,8 @@@
  #define DW_IC_SS_SCL_LCNT     0x18
  #define DW_IC_FS_SCL_HCNT     0x1c
  #define DW_IC_FS_SCL_LCNT     0x20
+ #define DW_IC_HS_SCL_HCNT     0x24
+ #define DW_IC_HS_SCL_LCNT     0x28
  #define DW_IC_INTR_STAT               0x2c
  #define DW_IC_INTR_MASK               0x30
  #define DW_IC_RAW_INTR_STAT   0x34
                                         DW_IC_INTR_TX_ABRT | \
                                         DW_IC_INTR_STOP_DET)
  
- #define DW_IC_STATUS_ACTIVITY 0x1
+ #define DW_IC_STATUS_ACTIVITY         0x1
+ #define DW_IC_STATUS_TFE              BIT(2)
+ #define DW_IC_STATUS_MST_ACTIVITY     BIT(5)
  
  #define DW_IC_ERR_TX_ABRT     0x1
  
  #define DW_IC_TAR_10BITADDR_MASTER BIT(12)
  
+ #define DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH    (BIT(2) | BIT(3))
+ #define DW_IC_COMP_PARAM_1_SPEED_MODE_MASK    GENMASK(3, 2)
  /*
   * status codes
   */
@@@ -252,10 -259,15 +259,15 @@@ static u32 i2c_dw_scl_lcnt(u32 ic_clk, 
  
  static void __i2c_dw_enable(struct dw_i2c_dev *dev, bool enable)
  {
+       dw_writel(dev, enable, DW_IC_ENABLE);
+ }
+ static void __i2c_dw_enable_and_wait(struct dw_i2c_dev *dev, bool enable)
+ {
        int timeout = 100;
  
        do {
-               dw_writel(dev, enable, DW_IC_ENABLE);
+               __i2c_dw_enable(dev, enable);
                if ((dw_readl(dev, DW_IC_ENABLE_STATUS) & 1) == enable)
                        return;
  
@@@ -282,6 -294,28 +294,28 @@@ static unsigned long i2c_dw_clk_rate(st
        return dev->get_clk_rate_khz(dev);
  }
  
+ static int i2c_dw_acquire_lock(struct dw_i2c_dev *dev)
+ {
+       int ret;
+       if (!dev->acquire_lock)
+               return 0;
+       ret = dev->acquire_lock(dev);
+       if (!ret)
+               return 0;
+       dev_err(dev->dev, "couldn't acquire bus ownership\n");
+       return ret;
+ }
+ static void i2c_dw_release_lock(struct dw_i2c_dev *dev)
+ {
+       if (dev->release_lock)
+               dev->release_lock(dev);
+ }
  /**
   * i2c_dw_init() - initialize the designware i2c master hardware
   * @dev: device private data
  int i2c_dw_init(struct dw_i2c_dev *dev)
  {
        u32 hcnt, lcnt;
-       u32 reg;
+       u32 reg, comp_param1;
        u32 sda_falling_time, scl_falling_time;
        int ret;
  
-       if (dev->acquire_lock) {
-               ret = dev->acquire_lock(dev);
-               if (ret) {
-                       dev_err(dev->dev, "couldn't acquire bus ownership\n");
-                       return ret;
-               }
-       }
+       ret = i2c_dw_acquire_lock(dev);
+       if (ret)
+               return ret;
  
        reg = dw_readl(dev, DW_IC_COMP_TYPE);
        if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
        } else if (reg != DW_IC_COMP_TYPE_VALUE) {
                dev_err(dev->dev, "Unknown Synopsys component type: "
                        "0x%08x\n", reg);
-               if (dev->release_lock)
-                       dev->release_lock(dev);
+               i2c_dw_release_lock(dev);
                return -ENODEV;
        }
  
+       comp_param1 = dw_readl(dev, DW_IC_COMP_PARAM_1);
        /* Disable the adapter */
-       __i2c_dw_enable(dev, false);
+       __i2c_dw_enable_and_wait(dev, false);
  
        /* set standard and fast speed deviders for high/low periods */
  
        dw_writel(dev, lcnt, DW_IC_SS_SCL_LCNT);
        dev_dbg(dev->dev, "Standard-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt);
  
-       /* Set SCL timing parameters for fast-mode */
-       if (dev->fs_hcnt && dev->fs_lcnt) {
+       /* Set SCL timing parameters for fast-mode or fast-mode plus */
+       if ((dev->clk_freq == 1000000) && dev->fp_hcnt && dev->fp_lcnt) {
+               hcnt = dev->fp_hcnt;
+               lcnt = dev->fp_lcnt;
+       } else if (dev->fs_hcnt && dev->fs_lcnt) {
                hcnt = dev->fs_hcnt;
                lcnt = dev->fs_lcnt;
        } else {
        dw_writel(dev, lcnt, DW_IC_FS_SCL_LCNT);
        dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt);
  
+       if ((dev->master_cfg & DW_IC_CON_SPEED_MASK) ==
+               DW_IC_CON_SPEED_HIGH) {
+               if ((comp_param1 & DW_IC_COMP_PARAM_1_SPEED_MODE_MASK)
+                       != DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH) {
+                       dev_err(dev->dev, "High Speed not supported!\n");
+                       dev->master_cfg &= ~DW_IC_CON_SPEED_MASK;
+                       dev->master_cfg |= DW_IC_CON_SPEED_FAST;
+               } else if (dev->hs_hcnt && dev->hs_lcnt) {
+                       hcnt = dev->hs_hcnt;
+                       lcnt = dev->hs_lcnt;
+                       dw_writel(dev, hcnt, DW_IC_HS_SCL_HCNT);
+                       dw_writel(dev, lcnt, DW_IC_HS_SCL_LCNT);
+                       dev_dbg(dev->dev, "HighSpeed-mode HCNT:LCNT = %d:%d\n",
+                               hcnt, lcnt);
+               }
+       }
        /* Configure SDA Hold Time if required */
 -      if (dev->sda_hold_time) {
 -              reg = dw_readl(dev, DW_IC_COMP_VERSION);
 -              if (reg >= DW_IC_SDA_HOLD_MIN_VERS)
 +      reg = dw_readl(dev, DW_IC_COMP_VERSION);
 +      if (reg >= DW_IC_SDA_HOLD_MIN_VERS) {
 +              if (dev->sda_hold_time) {
                        dw_writel(dev, dev->sda_hold_time, DW_IC_SDA_HOLD);
 -              else
 -                      dev_warn(dev->dev,
 -                              "Hardware too old to adjust SDA hold time.");
 +              } else {
 +                      /* Keep previous hold time setting if no one set it */
 +                      dev->sda_hold_time = dw_readl(dev, DW_IC_SDA_HOLD);
 +              }
 +      } else {
 +              dev_warn(dev->dev,
 +                      "Hardware too old to adjust SDA hold time.\n");
        }
  
        /* Configure Tx/Rx FIFO threshold levels */
        /* configure the i2c master */
        dw_writel(dev, dev->master_cfg , DW_IC_CON);
  
-       if (dev->release_lock)
-               dev->release_lock(dev);
+       i2c_dw_release_lock(dev);
        return 0;
  }
  EXPORT_SYMBOL_GPL(i2c_dw_init);
@@@ -415,27 -462,45 +466,45 @@@ static int i2c_dw_wait_bus_not_busy(str
  static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
  {
        struct i2c_msg *msgs = dev->msgs;
-       u32 ic_con, ic_tar = 0;
+       u32 ic_tar = 0;
+       bool enabled;
  
-       /* Disable the adapter */
-       __i2c_dw_enable(dev, false);
+       enabled = dw_readl(dev, DW_IC_ENABLE_STATUS) & 1;
+       if (enabled) {
+               u32 ic_status;
+               /*
+                * Only disable adapter if ic_tar and ic_con can't be
+                * dynamically updated
+                */
+               ic_status = dw_readl(dev, DW_IC_STATUS);
+               if (!dev->dynamic_tar_update_enabled ||
+                   (ic_status & DW_IC_STATUS_MST_ACTIVITY) ||
+                   !(ic_status & DW_IC_STATUS_TFE)) {
+                       __i2c_dw_enable_and_wait(dev, false);
+                       enabled = false;
+               }
+       }
  
        /* if the slave address is ten bit address, enable 10BITADDR */
-       ic_con = dw_readl(dev, DW_IC_CON);
-       if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) {
-               ic_con |= DW_IC_CON_10BITADDR_MASTER;
+       if (dev->dynamic_tar_update_enabled) {
                /*
                 * If I2C_DYNAMIC_TAR_UPDATE is set, the 10-bit addressing
-                * mode has to be enabled via bit 12 of IC_TAR register.
-                * We set it always as I2C_DYNAMIC_TAR_UPDATE can't be
-                * detected from registers.
+                * mode has to be enabled via bit 12 of IC_TAR register,
+                * otherwise bit 4 of IC_CON is used.
                 */
-               ic_tar = DW_IC_TAR_10BITADDR_MASTER;
+               if (msgs[dev->msg_write_idx].flags & I2C_M_TEN)
+                       ic_tar = DW_IC_TAR_10BITADDR_MASTER;
        } else {
-               ic_con &= ~DW_IC_CON_10BITADDR_MASTER;
-       }
+               u32 ic_con = dw_readl(dev, DW_IC_CON);
  
-       dw_writel(dev, ic_con, DW_IC_CON);
+               if (msgs[dev->msg_write_idx].flags & I2C_M_TEN)
+                       ic_con |= DW_IC_CON_10BITADDR_MASTER;
+               else
+                       ic_con &= ~DW_IC_CON_10BITADDR_MASTER;
+               dw_writel(dev, ic_con, DW_IC_CON);
+       }
  
        /*
         * Set the slave (target) address and enable 10-bit addressing mode
        /* enforce disabled interrupts (due to HW issues) */
        i2c_dw_disable_int(dev);
  
-       /* Enable the adapter */
-       __i2c_dw_enable(dev, true);
+       if (!enabled)
+               __i2c_dw_enable(dev, true);
  
        /* Clear and enable interrupts */
        dw_readl(dev, DW_IC_CLR_INTR);
@@@ -628,7 -693,8 +697,8 @@@ static int i2c_dw_handle_tx_abort(struc
  }
  
  /*
-  * Prepare controller for a transaction and call i2c_dw_xfer_msg
+  * Prepare controller for a transaction and start transfer by calling
+  * i2c_dw_xfer_init()
   */
  static int
  i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
        dev->abort_source = 0;
        dev->rx_outstanding = 0;
  
-       if (dev->acquire_lock) {
-               ret = dev->acquire_lock(dev);
-               if (ret) {
-                       dev_err(dev->dev, "couldn't acquire bus ownership\n");
-                       goto done_nolock;
-               }
-       }
+       ret = i2c_dw_acquire_lock(dev);
+       if (ret)
+               goto done_nolock;
  
        ret = i2c_dw_wait_bus_not_busy(dev);
        if (ret < 0)
                goto done;
        }
  
-       /*
-        * We must disable the adapter before returning and signaling the end
-        * of the current transfer. Otherwise the hardware might continue
-        * generating interrupts which in turn causes a race condition with
-        * the following transfer.  Needs some more investigation if the
-        * additional interrupts are a hardware bug or this driver doesn't
-        * handle them correctly yet.
-        */
-       __i2c_dw_enable(dev, false);
        if (dev->msg_err) {
                ret = dev->msg_err;
                goto done;
        ret = -EIO;
  
  done:
-       if (dev->release_lock)
-               dev->release_lock(dev);
+       i2c_dw_release_lock(dev);
  
  done_nolock:
        pm_runtime_mark_last_busy(dev->dev);
@@@ -822,9 -873,19 +877,19 @@@ static irqreturn_t i2c_dw_isr(int this_
         */
  
  tx_aborted:
-       if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) || dev->msg_err)
+       if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET))
+                       || dev->msg_err) {
+               /*
+                * We must disable interruts before returning and signaling
+                * the end of the current transfer. Otherwise the hardware
+                * might continue generating interrupts for non-existent
+                * transfers.
+                */
+               i2c_dw_disable_int(dev);
+               dw_readl(dev, DW_IC_CLR_INTR);
                complete(&dev->cmd_complete);
-       else if (unlikely(dev->accessor_flags & ACCESS_INTR_MASK)) {
+       else if (unlikely(dev->accessor_flags & ACCESS_INTR_MASK)) {
                /* workaround to trigger pending interrupt */
                stat = dw_readl(dev, DW_IC_INTR_MASK);
                i2c_dw_disable_int(dev);
  void i2c_dw_disable(struct dw_i2c_dev *dev)
  {
        /* Disable controller */
-       __i2c_dw_enable(dev, false);
+       __i2c_dw_enable_and_wait(dev, false);
  
        /* Disable all interupts */
        dw_writel(dev, 0, DW_IC_INTR_MASK);
@@@ -861,6 -922,7 +926,7 @@@ int i2c_dw_probe(struct dw_i2c_dev *dev
  {
        struct i2c_adapter *adap = &dev->adapter;
        int r;
+       u32 reg;
  
        init_completion(&dev->cmd_complete);
  
        if (r)
                return r;
  
+       r = i2c_dw_acquire_lock(dev);
+       if (r)
+               return r;
+       /*
+        * Test if dynamic TAR update is enabled in this controller by writing
+        * to IC_10BITADDR_MASTER field in IC_CON: when it is enabled this
+        * field is read-only so it should not succeed
+        */
+       reg = dw_readl(dev, DW_IC_CON);
+       dw_writel(dev, reg ^ DW_IC_CON_10BITADDR_MASTER, DW_IC_CON);
+       if ((dw_readl(dev, DW_IC_CON) & DW_IC_CON_10BITADDR_MASTER) ==
+           (reg & DW_IC_CON_10BITADDR_MASTER)) {
+               dev->dynamic_tar_update_enabled = true;
+               dev_dbg(dev->dev, "Dynamic TAR update enabled");
+       }
+       i2c_dw_release_lock(dev);
        snprintf(adap->name, sizeof(adap->name),
                 "Synopsys DesignWare I2C adapter");
        adap->retries = 3;
@@@ -64,6 -64,7 +64,7 @@@
   * Broxton (SOC)              0x5ad4  32      hard    yes     yes     yes
   * Lewisburg (PCH)            0xa1a3  32      hard    yes     yes     yes
   * Lewisburg Supersku (PCH)   0xa223  32      hard    yes     yes     yes
+  * Kaby Lake PCH-H (PCH)      0xa2a3  32      hard    yes     yes     yes
   *
   * Features supported by this driver:
   * Software PEC                               no
  #define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS      0xa123
  #define PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS           0xa1a3
  #define PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS      0xa223
+ #define PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS      0xa2a3
  
  struct i801_mux_config {
        char *gpio_chip;
@@@ -1006,6 -1008,7 +1008,7 @@@ static const struct pci_device_id i801_
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BROXTON_SMBUS) },
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS) },
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS) },
        { 0, }
  };
  
@@@ -1482,13 -1485,12 +1485,14 @@@ static int i801_probe(struct pci_dev *d
        case PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS:
        case PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS:
        case PCI_DEVICE_ID_INTEL_DNV_SMBUS:
+       case PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS:
                priv->features |= FEATURE_I2C_BLOCK_READ;
                priv->features |= FEATURE_IRQ;
                priv->features |= FEATURE_SMBUS_PEC;
                priv->features |= FEATURE_BLOCK_BUFFER;
 -              priv->features |= FEATURE_TCO;
 +              /* If we have ACPI based watchdog use that instead */
 +              if (!acpi_has_watchdog())
 +                      priv->features |= FEATURE_TCO;
                priv->features |= FEATURE_HOST_NOTIFY;
                break;
  
                "SMBus I801 adapter at %04lx", priv->smba);
        err = i2c_add_adapter(&priv->adapter);
        if (err) {
-               dev_err(&dev->dev, "Failed to add SMBus adapter\n");
                i801_acpi_remove(priv);
                return err;
        }
@@@ -378,7 -378,7 +378,7 @@@ static void rcar_i2c_dma(struct rcar_i2
        }
  
        dma_addr = dma_map_single(chan->device->dev, buf, len, dir);
 -      if (dma_mapping_error(dev, dma_addr)) {
 +      if (dma_mapping_error(chan->device->dev, dma_addr)) {
                dev_dbg(dev, "dma map failed, using PIO\n");
                return;
        }
@@@ -802,6 -802,7 +802,7 @@@ static const struct of_device_id rcar_i
        { .compatible = "renesas,i2c-r8a7793", .data = (void *)I2C_RCAR_GEN2 },
        { .compatible = "renesas,i2c-r8a7794", .data = (void *)I2C_RCAR_GEN2 },
        { .compatible = "renesas,i2c-r8a7795", .data = (void *)I2C_RCAR_GEN3 },
+       { .compatible = "renesas,i2c-r8a7796", .data = (void *)I2C_RCAR_GEN3 },
        {},
  };
  MODULE_DEVICE_TABLE(of, rcar_i2c_dt_ids);
@@@ -875,10 -876,8 +876,8 @@@ static int rcar_i2c_probe(struct platfo
        platform_set_drvdata(pdev, priv);
  
        ret = i2c_add_numbered_adapter(adap);
-       if (ret < 0) {
-               dev_err(dev, "reg adap failed: %d\n", ret);
+       if (ret < 0)
                goto out_pm_disable;
-       }
  
        dev_info(dev, "probed\n");
  
@@@ -58,7 -58,7 +58,7 @@@ enum 
  #define REG_CON_LASTACK   BIT(5) /* 1: send NACK after last received byte */
  #define REG_CON_ACTACK    BIT(6) /* 1: stop if NACK is received */
  
- #define REG_CON_TUNING_MASK GENMASK(15, 8)
+ #define REG_CON_TUNING_MASK GENMASK_ULL(15, 8)
  
  #define REG_CON_SDA_CFG(cfg) ((cfg) << 8)
  #define REG_CON_STA_CFG(cfg) ((cfg) << 12)
@@@ -742,7 -742,7 +742,7 @@@ static int rk3x_i2c_v1_calc_timings(uns
                                    struct i2c_timings *t,
                                    struct rk3x_i2c_calced_timings *t_calc)
  {
-       unsigned long min_low_ns, min_high_ns, min_total_ns;
+       unsigned long min_low_ns, min_high_ns;
        unsigned long min_setup_start_ns, min_setup_data_ns;
        unsigned long min_setup_stop_ns, max_hold_data_ns;
  
  
        /* These are the min dividers needed for min hold times. */
        min_div_for_hold = (min_low_div + min_high_div);
-       min_total_ns = min_low_ns + min_high_ns;
  
        /*
         * This is the maximum divider so we don't go over the maximum.
@@@ -918,7 -917,7 +917,7 @@@ static void rk3x_i2c_adapt_div(struct r
   * Code adapted from i2c-cadence.c.
   *
   * Return:    NOTIFY_STOP if the rate change should be aborted, NOTIFY_OK
 - *            to acknowedge the change, NOTIFY_DONE if the notification is
 + *            to acknowledge the change, NOTIFY_DONE if the notification is
   *            considered irrelevant.
   */
  static int rk3x_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long
@@@ -1111,15 -1110,6 +1110,15 @@@ static int rk3x_i2c_xfer(struct i2c_ada
        return ret < 0 ? ret : num;
  }
  
 +static __maybe_unused int rk3x_i2c_resume(struct device *dev)
 +{
 +      struct rk3x_i2c *i2c = dev_get_drvdata(dev);
 +
 +      rk3x_i2c_adapt_div(i2c, clk_get_rate(i2c->clk));
 +
 +      return 0;
 +}
 +
  static u32 rk3x_i2c_func(struct i2c_adapter *adap)
  {
        return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING;
@@@ -1312,10 -1302,8 +1311,8 @@@ static int rk3x_i2c_probe(struct platfo
        rk3x_i2c_adapt_div(i2c, clk_rate);
  
        ret = i2c_add_adapter(&i2c->adap);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "Could not register adapter\n");
+       if (ret < 0)
                goto err_clk_notifier;
-       }
  
        dev_info(&pdev->dev, "Initialized RK3xxx I2C bus at %p\n", i2c->regs);
  
@@@ -1343,15 -1331,12 +1340,15 @@@ static int rk3x_i2c_remove(struct platf
        return 0;
  }
  
 +static SIMPLE_DEV_PM_OPS(rk3x_i2c_pm_ops, NULL, rk3x_i2c_resume);
 +
  static struct platform_driver rk3x_i2c_driver = {
        .probe   = rk3x_i2c_probe,
        .remove  = rk3x_i2c_remove,
        .driver  = {
                .name  = "rk3x-i2c",
                .of_match_table = rk3x_i2c_match,
 +              .pm = &rk3x_i2c_pm_ops,
        },
  };
  
@@@ -610,7 -610,7 +610,7 @@@ static void sh_mobile_i2c_xfer_dma(stru
                return;
  
        dma_addr = dma_map_single(chan->device->dev, pd->msg->buf, pd->msg->len, dir);
 -      if (dma_mapping_error(pd->dev, dma_addr)) {
 +      if (dma_mapping_error(chan->device->dev, dma_addr)) {
                dev_dbg(pd->dev, "dma map failed, using PIO\n");
                return;
        }
@@@ -981,7 -981,6 +981,6 @@@ static int sh_mobile_i2c_probe(struct p
        ret = i2c_add_numbered_adapter(adap);
        if (ret < 0) {
                sh_mobile_i2c_release_dma(pd);
-               dev_err(&dev->dev, "cannot add numbered adapter\n");
                return ret;
        }
  
@@@ -42,6 -42,7 +42,7 @@@
  #include <linux/i2c/pca954x.h>
  #include <linux/module.h>
  #include <linux/of.h>
+ #include <linux/of_device.h>
  #include <linux/pm.h>
  #include <linux/slab.h>
  
@@@ -58,14 -59,6 +59,6 @@@ enum pca_type 
        pca_9548,
  };
  
- struct pca954x {
-       enum pca_type type;
-       u8 last_chan;           /* last register value */
-       u8 deselect;
-       struct i2c_client *client;
- };
  struct chip_desc {
        u8 nchans;
        u8 enable;      /* used for muxes only */
        } muxtype;
  };
  
+ struct pca954x {
+       const struct chip_desc *chip;
+       u8 last_chan;           /* last register value */
+       u8 deselect;
+       struct i2c_client *client;
+ };
  /* Provide specs for the PCA954x types we know about */
  static const struct chip_desc chips[] = {
        [pca_9540] = {
@@@ -119,6 -120,20 +120,20 @@@ static const struct i2c_device_id pca95
  };
  MODULE_DEVICE_TABLE(i2c, pca954x_id);
  
+ #ifdef CONFIG_OF
+ static const struct of_device_id pca954x_of_match[] = {
+       { .compatible = "nxp,pca9540", .data = &chips[pca_9540] },
+       { .compatible = "nxp,pca9542", .data = &chips[pca_9542] },
+       { .compatible = "nxp,pca9543", .data = &chips[pca_9543] },
+       { .compatible = "nxp,pca9544", .data = &chips[pca_9544] },
+       { .compatible = "nxp,pca9545", .data = &chips[pca_9545] },
+       { .compatible = "nxp,pca9546", .data = &chips[pca_9546] },
+       { .compatible = "nxp,pca9547", .data = &chips[pca_9547] },
+       { .compatible = "nxp,pca9548", .data = &chips[pca_9548] },
+       {}
+ };
+ #endif
  /* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer()
     for this as they will try to lock adapter a second time */
  static int pca954x_reg_write(struct i2c_adapter *adap,
@@@ -151,7 -166,7 +166,7 @@@ static int pca954x_select_chan(struct i
  {
        struct pca954x *data = i2c_mux_priv(muxc);
        struct i2c_client *client = data->client;
-       const struct chip_desc *chip = &chips[data->type];
+       const struct chip_desc *chip = data->chip;
        u8 regval;
        int ret = 0;
  
        /* Only select the channel if its different from the last channel */
        if (data->last_chan != regval) {
                ret = pca954x_reg_write(muxc->parent, client, regval);
 -              data->last_chan = regval;
 +              data->last_chan = ret ? 0 : regval;
        }
  
        return ret;
@@@ -197,6 -212,7 +212,7 @@@ static int pca954x_probe(struct i2c_cli
        int num, force, class;
        struct i2c_mux_core *muxc;
        struct pca954x *data;
+       const struct of_device_id *match;
        int ret;
  
        if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE))
                return -ENODEV;
        }
  
-       data->type = id->driver_data;
+       match = of_match_device(of_match_ptr(pca954x_of_match), &client->dev);
+       if (match)
+               data->chip = of_device_get_match_data(&client->dev);
+       else
+               data->chip = &chips[id->driver_data];
        data->last_chan = 0;               /* force the first selection */
  
        idle_disconnect_dt = of_node &&
                of_property_read_bool(of_node, "i2c-mux-idle-disconnect");
  
        /* Now create an adapter for each channel */
-       for (num = 0; num < chips[data->type].nchans; num++) {
+       for (num = 0; num < data->chip->nchans; num++) {
                bool idle_disconnect_pd = false;
  
                force = 0;                        /* dynamic adap number */
  
        dev_info(&client->dev,
                 "registered %d multiplexed busses for I2C %s %s\n",
-                num, chips[data->type].muxtype == pca954x_ismux
+                num, data->chip->muxtype == pca954x_ismux
                                ? "mux" : "switch", client->name);
  
        return 0;
@@@ -299,6 -320,7 +320,7 @@@ static struct i2c_driver pca954x_drive
        .driver         = {
                .name   = "pca954x",
                .pm     = &pca954x_pm,
+               .of_match_table = of_match_ptr(pca954x_of_match),
        },
        .probe          = pca954x_probe,
        .remove         = pca954x_remove,