Merge tag 'gpio-v4.21-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 29 Dec 2018 04:00:21 +0000 (20:00 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 29 Dec 2018 04:00:21 +0000 (20:00 -0800)
Pull GPIO updates from Linus Walleij:
 "This is the bulk of GPIO changes for the v4.21 kernel series.

  Core changes:

   - Some core changes are already in outside of this pull request as
     they came through the regulator tree, most notably
     devm_gpiod_unhinge() that removes devres refcount management from a
     GPIO descriptor. This is needed in subsystems such as regulators
     where the regulator core need to take over the reference counting
     and lifecycle management for a GPIO descriptor.

   - We dropped devm_gpiochip_remove() and devm_gpio_chip_match() as
     nothing needs it. We can bring it back if need be.

   - Add a global TODO so people see where we are going. This helps
     setting the direction now that we are two GPIO maintainers.

   - Handle the MMC CD/WP properties in the device tree core. (The bulk
     of patches activating this code is already merged through the
     MMC/SD tree.)

   - Augment gpiochip_request_own_desc() to pass a flag so we as
     gpiochips can request lines as active low or open drain etc even
     from ourselves.

  New drivers:

   - New driver for Cadence GPIO blocks.

   - New driver for Atmel SAMA5D2 PIOBU GPIO lines.

  Driver improvements:

   - A major refactoring of the PCA953x driver - this driver has been
     around for ages, and is now modernized to reduce code duplication
     that has stacked up and is using regmap to read write and cache
     registers.

   - Intel drivers are now maintained in a separate tree and start with
     a round of cleanups and unifications"

* tag 'gpio-v4.21-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: (99 commits)
  gpio: sama5d2-piobu: Depend on OF_GPIO
  gpio: Add Cadence GPIO driver
  dt-bindings: gpio: Add bindings for Cadence GPIO
  gpiolib-acpi: remove unused variable 'err', cleans up build warning
  gpio: mxs: read pin level directly instead of using .get
  gpio: aspeed: remove duplicated statement
  gpio: add driver for SAMA5D2 PIOBU pins
  dt-bindings: arm: atmel: describe SECUMOD usage as a GPIO controller
  gpio/mmc/of: Respect polarity in the device tree
  dt-bindings: gpio: rcar: Add r8a774c0 (RZ/G2E) support
  memory: omap-gpmc: Get the header of the enum
  ARM: omap1: Fix new user of gpiochip_request_own_desc()
  gpio: pca953x: Add regmap dependency for PCA953x driver
  gpio: raspberrypi-exp: decrease refcount on firmware dt node
  gpiolib: Fix return value of gpio_to_desc() stub if !GPIOLIB
  gpio: pca953x: Restore registers after suspend/resume cycle
  gpio: pca953x: Zap single use of pca953x_read_single()
  gpio: pca953x: Zap ad-hoc reg_output cache
  gpio: pca953x: Zap ad-hoc reg_direction cache
  gpio: pca953x: Perform basic regmap conversion
  ...

1  2 
Documentation/driver-model/devres.txt
MAINTAINERS
arch/arm/mach-omap1/board-ams-delta.c
drivers/gpio/gpio-mvebu.c
drivers/gpio/gpio-omap.c
drivers/gpio/gpio-pca953x.c
drivers/gpio/gpiolib-acpi.c
drivers/gpio/gpiolib.c
include/linux/gpio/consumer.h

index fc4cc24dfb9767e38760295ac157adba3b88b182,48aa1ef80d7585e7640b885754ed91d7e8db9ca7..52a752300e9447ecf395e271bbf57b805c23df03
@@@ -254,9 -254,7 +254,8 @@@ GPI
    devm_gpiod_get_index_optional()
    devm_gpiod_get_optional()
    devm_gpiod_put()
 +  devm_gpiod_unhinge()
    devm_gpiochip_add_data()
-   devm_gpiochip_remove()
    devm_gpio_request()
    devm_gpio_request_one()
    devm_gpio_free()
diff --combined MAINTAINERS
index 784c78a4ae7e40e46cccee7c6209ef0666ce7c33,79979ca0edd4df7200dff74abc32c4f3379647ac..966dc329013cd4b73029d4deadefa37bdc8c342d
@@@ -140,7 -140,7 +140,7 @@@ Maintainers List (try to look for most 
  M:    Steffen Klassert <klassert@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Odd Fixes
 -F:    Documentation/networking/vortex.txt
 +F:    Documentation/networking/device_drivers/3com/vortex.txt
  F:    drivers/net/ethernet/3com/3c59x.c
  
  3CR990 NETWORK DRIVER
@@@ -180,7 -180,6 +180,7 @@@ F: drivers/net/hamradio/6pack.
  
  8169 10/100/1000 GIGABIT ETHERNET DRIVER
  M:    Realtek linux nic maintainers <nic_swsd@realtek.com>
 +M:    Heiner Kallweit <hkallweit1@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/realtek/r8169.c
@@@ -718,7 -717,7 +718,7 @@@ F: include/linux/mfd/altera-a10sr.
  F:    include/dt-bindings/reset/altr,rst-mgr-a10sr.h
  
  ALTERA TRIPLE SPEED ETHERNET DRIVER
 -M:    Vince Bridgers <vbridger@opensource.altera.com>
 +M:    Thor Thayer <thor.thayer@linux.intel.com>
  L:    netdev@vger.kernel.org
  L:    nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
  S:    Maintained
@@@ -740,7 -739,7 +740,7 @@@ R: Saeed Bishara <saeedb@amazon.com
  R:    Zorik Machulsky <zorik@amazon.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/ena.txt
 +F:    Documentation/networking/device_drivers/amazon/ena.txt
  F:    drivers/net/ethernet/amazon/
  
  AMD CRYPTOGRAPHIC COPROCESSOR (CCP) DRIVER
@@@ -1310,13 -1309,6 +1310,13 @@@ F:    drivers/pinctrl/meson
  F:    drivers/mmc/host/meson*
  N:    meson
  
 +ARM/Amlogic Meson SoC Sound Drivers
 +M:    Jerome Brunet <jbrunet@baylibre.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    sound/soc/meson/
 +F:    Documentation/devicetree/bindings/sound/amlogic*
 +
  ARM/Annapurna Labs ALPINE ARCHITECTURE
  M:    Tsahee Zidenberg <tsahee@annapurnalabs.com>
  M:    Antoine Tenart <antoine.tenart@bootlin.com>
@@@ -1479,7 -1471,6 +1479,7 @@@ F:      drivers/clk/sirf
  F:    drivers/clocksource/timer-prima2.c
  F:    drivers/clocksource/timer-atlas7.c
  N:    [^a-z]sirf
 +X:    drivers/gnss
  
  ARM/EBSA110 MACHINE SUPPORT
  M:    Russell King <linux@armlinux.org.uk>
@@@ -1746,17 -1737,13 +1746,17 @@@ ARM/Mediatek SoC suppor
  M:    Matthias Brugger <matthias.bgg@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
 +W:    https://mtk.bcnfs.org/
 +C:    irc://chat.freenode.net/linux-mediatek
  S:    Maintained
  F:    arch/arm/boot/dts/mt6*
  F:    arch/arm/boot/dts/mt7*
  F:    arch/arm/boot/dts/mt8*
  F:    arch/arm/mach-mediatek/
  F:    arch/arm64/boot/dts/mediatek/
 +F:    drivers/soc/mediatek/
  N:    mtk
 +N:    mt[678]
  K:    mediatek
  
  ARM/Mediatek USB3 PHY DRIVER
@@@ -1935,6 -1922,7 +1935,6 @@@ ARM/QUALCOMM SUPPOR
  M:    Andy Gross <andy.gross@linaro.org>
  M:    David Brown <david.brown@linaro.org>
  L:    linux-arm-msm@vger.kernel.org
 -L:    linux-soc@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/soc/qcom/
  F:    arch/arm/boot/dts/qcom-*.dts
@@@ -2074,6 -2062,7 +2074,6 @@@ M:      Andrzej Hajda <a.hajda@samsung.com
  L:    linux-arm-kernel@lists.infradead.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
 -F:    arch/arm/plat-samsung/s5p-dev-mfc.c
  F:    drivers/media/platform/s5p-mfc/
  
  ARM/SHMOBILE ARM ARCHITECTURE
@@@ -2425,14 -2414,6 +2425,14 @@@ S:    Maintaine
  F:    Documentation/hwmon/asc7621
  F:    drivers/hwmon/asc7621.c
  
 +ASPEED VIDEO ENGINE DRIVER
 +M:    Eddie James <eajames@linux.ibm.com>
 +L:    linux-media@vger.kernel.org
 +L:    openbmc@lists.ozlabs.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    drivers/media/platform/aspeed-video.c
 +F:    Documentation/devicetree/bindings/media/aspeed-video.txt
 +
  ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS
  M:    Corentin Chary <corentin.chary@gmail.com>
  L:    acpi4asus-user@lists.sourceforge.net
@@@ -2509,7 -2490,7 +2509,7 @@@ F:      drivers/net/wireless/ath/
  ATHEROS ATH5K WIRELESS DRIVER
  M:    Jiri Slaby <jirislaby@gmail.com>
  M:    Nick Kossifidis <mickflemm@gmail.com>
 -M:    "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
 +M:    Luis Chamberlain <mcgrof@kernel.org>
  L:    linux-wireless@vger.kernel.org
  W:    http://wireless.kernel.org/en/users/Drivers/ath5k
  S:    Maintained
@@@ -2647,13 -2628,6 +2647,13 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/sound/axentia,*
  F:    sound/soc/atmel/tse850-pcm5142.c
  
 +AXXIA I2C CONTROLLER
 +M:    Krzysztof Adamski <krzysztof.adamski@nokia.com>
 +L:    linux-i2c@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-axxia.txt
 +F:    drivers/i2c/busses/i2c-axxia.c
 +
  AZ6007 DVB DRIVER
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  L:    linux-media@vger.kernel.org
@@@ -2826,7 -2800,7 +2826,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
  Q:    https://patchwork.ozlabs.org/project/netdev/list/?delegate=77147
  S:    Supported
 -F:    arch/x86/net/bpf_jit*
 +F:    arch/*/net/*
  F:    Documentation/networking/filter.txt
  F:    Documentation/bpf/
  F:    include/linux/bpf*
@@@ -2846,67 -2820,6 +2846,67 @@@ F:    tools/bpf
  F:    tools/lib/bpf/
  F:    tools/testing/selftests/bpf/
  
 +BPF JIT for ARM
 +M:    Shubham Bansal <illusionist.neo@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    arch/arm/net/
 +
 +BPF JIT for ARM64
 +M:    Daniel Borkmann <daniel@iogearbox.net>
 +M:    Alexei Starovoitov <ast@kernel.org>
 +M:    Zi Shen Lim <zlim.lnx@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    arch/arm64/net/
 +
 +BPF JIT for MIPS (32-BIT AND 64-BIT)
 +M:    Paul Burton <paul.burton@mips.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    arch/mips/net/
 +
 +BPF JIT for NFP NICs
 +M:    Jakub Kicinski <jakub.kicinski@netronome.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/ethernet/netronome/nfp/bpf/
 +
 +BPF JIT for POWERPC (32-BIT AND 64-BIT)
 +M:    Naveen N. Rao <naveen.n.rao@linux.ibm.com>
 +M:    Sandipan Das <sandipan@linux.ibm.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    arch/powerpc/net/
 +
 +BPF JIT for S390
 +M:    Martin Schwidefsky <schwidefsky@de.ibm.com>
 +M:    Heiko Carstens <heiko.carstens@de.ibm.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    arch/s390/net/
 +X:    arch/s390/net/pnet.c
 +
 +BPF JIT for SPARC (32-BIT AND 64-BIT)
 +M:    David S. Miller <davem@davemloft.net>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    arch/sparc/net/
 +
 +BPF JIT for X86 32-BIT
 +M:    Wang YanQing <udknight@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    arch/x86/net/bpf_jit_comp32.c
 +
 +BPF JIT for X86 64-BIT
 +M:    Alexei Starovoitov <ast@kernel.org>
 +M:    Daniel Borkmann <daniel@iogearbox.net>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    arch/x86/net/
 +X:    arch/x86/net/bpf_jit_comp32.c
 +
  BROADCOM B44 10/100 ETHERNET DRIVER
  M:    Michael Chan <michael.chan@broadcom.com>
  L:    netdev@vger.kernel.org
@@@ -2947,7 -2860,7 +2947,7 @@@ F:      drivers/staging/vc04_service
  BROADCOM BCM47XX MIPS ARCHITECTURE
  M:    Hauke Mehrtens <hauke@hauke-m.de>
  M:    Rafał Miłecki <zajec5@gmail.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/mips/brcm/
  F:    arch/mips/bcm47xx/*
@@@ -2956,6 -2869,7 +2956,6 @@@ F:      arch/mips/include/asm/mach-bcm47xx/
  BROADCOM BCM5301X ARM ARCHITECTURE
  M:    Hauke Mehrtens <hauke@hauke-m.de>
  M:    Rafał Miłecki <zajec5@gmail.com>
 -M:    Jon Mason <jonmason@broadcom.com>
  M:    bcm-kernel-feedback-list@broadcom.com
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
@@@ -3010,7 -2924,7 +3010,7 @@@ F:      drivers/cpufreq/bmips-cpufreq.
  BROADCOM BMIPS MIPS ARCHITECTURE
  M:    Kevin Cernekee <cernekee@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  T:    git git://github.com/broadcom/stblinux.git
  S:    Maintained
  F:    arch/mips/bmips/*
@@@ -3101,6 -3015,7 +3101,6 @@@ F:      drivers/net/ethernet/broadcom/genet
  BROADCOM IPROC ARM ARCHITECTURE
  M:    Ray Jui <rjui@broadcom.com>
  M:    Scott Branden <sbranden@broadcom.com>
 -M:    Jon Mason <jonmason@broadcom.com>
  M:    bcm-kernel-feedback-list@broadcom.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  T:    git git://github.com/broadcom/cygnus-linux.git
@@@ -3147,7 -3062,7 +3147,7 @@@ F:      include/uapi/rdma/bnxt_re-abi.
  
  BROADCOM NVRAM DRIVER
  M:    Rafał Miłecki <zajec5@gmail.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    drivers/firmware/broadcom/*
  
@@@ -3297,16 -3212,11 +3297,16 @@@ S:   Maintaine
  F:    sound/pci/oxygen/
  
  C-SKY ARCHITECTURE
 -M:    Guo Ren <ren_guo@c-sky.com>
 +M:    Guo Ren <guoren@kernel.org>
  T:    git https://github.com/c-sky/csky-linux.git
  S:    Supported
  F:    arch/csky/
  F:    Documentation/devicetree/bindings/csky/
 +F:    drivers/irqchip/irq-csky-*
 +F:    Documentation/devicetree/bindings/interrupt-controller/csky,*
 +F:    drivers/clocksource/timer-gx6605s.c
 +F:    drivers/clocksource/timer-mp-csky.c
 +F:    Documentation/devicetree/bindings/timer/csky,*
  K:    csky
  N:    csky
  
@@@ -3366,12 -3276,6 +3366,12 @@@ F:    include/uapi/linux/caif
  F:    include/net/caif/
  F:    net/caif/
  
 +CAKE QDISC
 +M:    Toke Høiland-Jørgensen <toke@toke.dk>
 +L:    cake@lists.bufferbloat.net (moderated for non-subscribers)
 +S:    Maintained
 +F:    net/sched/sch_cake.c
 +
  CALGARY x86-64 IOMMU
  M:    Muli Ben-Yehuda <mulix@mulix.org>
  M:    Jon Mason <jdmason@kudzu.us>
@@@ -3484,7 -3388,6 +3484,7 @@@ F:      include/linux/spi/cc2520.
  F:    Documentation/devicetree/bindings/net/ieee802154/cc2520.txt
  
  CCREE ARM TRUSTZONE CRYPTOCELL REE DRIVER
 +M:    Yael Chemla <yael.chemla@foss.arm.com>
  M:    Gilad Ben-Yossef <gilad@benyossef.com>
  L:    linux-crypto@vger.kernel.org
  S:    Supported
@@@ -3688,8 -3591,6 +3688,8 @@@ F:      drivers/net/ethernet/cisco/enic
  
  CISCO VIC LOW LATENCY NIC DRIVER
  M:    Christian Benvenuti <benve@cisco.com>
 +M:    Nelson Escobar <neescoba@cisco.com>
 +M:    Parvi Kaustubhi <pkaustub@cisco.com>
  S:    Supported
  F:    drivers/infiniband/hw/usnic/
  
@@@ -3703,10 -3604,8 +3703,10 @@@ W:    https://github.com/CirrusLogic/linux
  S:    Supported
  F:    Documentation/devicetree/bindings/mfd/madera.txt
  F:    Documentation/devicetree/bindings/pinctrl/cirrus,madera-pinctrl.txt
 +F:    include/linux/irqchip/irq-madera*
  F:    include/linux/mfd/madera/*
  F:    drivers/gpio/gpio-madera*
 +F:    drivers/irqchip/irq-madera*
  F:    drivers/mfd/madera*
  F:    drivers/mfd/cs47l*
  F:    drivers/pinctrl/cirrus/*
@@@ -4014,20 -3913,13 +4014,20 @@@ T:   git git://linuxtv.org/media_tree.gi
  W:    http://linuxtv.org
  S:    Odd Fixes
  F:    drivers/media/i2c/cs3308.c
 -F:    drivers/media/i2c/cs3308.h
  
  CS5535 Audio ALSA driver
  M:    Jaya Kumar <jayakumar.alsa@gmail.com>
  S:    Maintained
  F:    sound/pci/cs5535audio/
  
 +CSI DRIVERS FOR ALLWINNER V3s
 +M:    Yong Deng <yong.deng@magewell.com>
 +L:    linux-media@vger.kernel.org
 +T:    git git://linuxtv.org/media_tree.git
 +S:    Maintained
 +F:    drivers/media/platform/sunxi/sun6i-csi/
 +F:    Documentation/devicetree/bindings/media/sun6i-csi.txt
 +
  CW1200 WLAN driver
  M:    Solomon Peachy <pizza@shaftnet.org>
  S:    Maintained
@@@ -4052,7 -3944,7 +4052,7 @@@ T:      git git://linuxtv.org/media_tree.gi
  W:    https://linuxtv.org
  S:    Maintained
  F:    drivers/media/common/cx2341x*
 -F:    include/media/cx2341x*
 +F:    include/media/drv-intf/cx2341x.h
  
  CX24120 MEDIA DRIVER
  M:    Jemma Denson <jdenson@gmail.com>
@@@ -4083,7 -3975,7 +4083,7 @@@ S:      Maintaine
  F:    drivers/media/dvb-frontends/cxd2820r*
  
  CXGB3 ETHERNET DRIVER (CXGB3)
 -M:    Santosh Raspatur <santosh@chelsio.com>
 +M:    Arjun Vynipadath <arjun@chelsio.com>
  L:    netdev@vger.kernel.org
  W:    http://www.chelsio.com
  S:    Supported
@@@ -4112,7 -4004,7 +4112,7 @@@ S:      Supporte
  F:    drivers/crypto/chelsio
  
  CXGB4 ETHERNET DRIVER (CXGB4)
 -M:    Ganesh Goudar <ganeshgr@chelsio.com>
 +M:    Arjun Vynipadath <arjun@chelsio.com>
  L:    netdev@vger.kernel.org
  W:    http://www.chelsio.com
  S:    Supported
@@@ -4141,7 -4033,7 +4141,7 @@@ S:      Supporte
  F:    drivers/net/ethernet/chelsio/cxgb4vf/
  
  CXL (IBM Coherent Accelerator Processor Interface CAPI) DRIVER
 -M:    Frederic Barrat <fbarrat@linux.vnet.ibm.com>
 +M:    Frederic Barrat <fbarrat@linux.ibm.com>
  M:    Andrew Donnellan <andrew.donnellan@au1.ibm.com>
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Supported
@@@ -4153,9 -4045,9 +4153,9 @@@ F:      Documentation/powerpc/cxl.tx
  F:    Documentation/ABI/testing/sysfs-class-cxl
  
  CXLFLASH (IBM Coherent Accelerator Processor Interface CAPI Flash) SCSI DRIVER
 -M:    Manoj N. Kumar <manoj@linux.vnet.ibm.com>
 -M:    Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
 -M:    Uma Krishnan <ukrishn@linux.vnet.ibm.com>
 +M:    Manoj N. Kumar <manoj@linux.ibm.com>
 +M:    Matthew R. Ochs <mrochs@linux.ibm.com>
 +M:    Uma Krishnan <ukrishn@linux.ibm.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/cxlflash/
@@@ -4227,7 -4119,7 +4227,7 @@@ F:      net/ax25/sysctl_net_ax25.
  DAVICOM FAST ETHERNET (DMFE) NETWORK DRIVER
  L:    netdev@vger.kernel.org
  S:    Orphan
 -F:    Documentation/networking/dmfe.txt
 +F:    Documentation/networking/device_drivers/dec/dmfe.txt
  F:    drivers/net/ethernet/dec/tulip/dmfe.c
  
  DC390/AM53C974 SCSI driver
@@@ -4266,7 -4158,7 +4266,7 @@@ F:      net/decnet
  
  DECSTATION PLATFORM SUPPORT
  M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  W:    http://www.linux-mips.org/wiki/DECstation
  S:    Maintained
  F:    arch/mips/dec/
@@@ -4763,13 -4655,6 +4763,13 @@@ S:    Maintaine
  F:    drivers/gpu/drm/tinydrm/ili9225.c
  F:    Documentation/devicetree/bindings/display/ilitek,ili9225.txt
  
 +DRM DRIVER FOR HX8357D PANELS
 +M:    Eric Anholt <eric@anholt.net>
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +S:    Maintained
 +F:    drivers/gpu/drm/tinydrm/hx8357d.c
 +F:    Documentation/devicetree/bindings/display/himax,hx8357d.txt
 +
  DRM DRIVER FOR INTEL I810 VIDEO CARDS
  S:    Orphan / Obsolete
  F:    drivers/gpu/drm/i810/
@@@ -4811,12 -4696,6 +4811,12 @@@ S:    Supporte
  F:    drivers/gpu/drm/nouveau/
  F:    include/uapi/drm/nouveau_drm.h
  
 +DRM DRIVER FOR OLIMEX LCD-OLINUXINO PANELS
 +M:    Stefan Mavrodiev <stefan@olimex.com>
 +S:    Maintained
 +F:    drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c
 +F:    Documentation/devicetree/bindings/display/panel/olimex,lcd-olinuxino.txt
 +
  DRM DRIVER FOR PERVASIVE DISPLAYS REPAPER PANELS
  M:    Noralf Trønnes <noralf@tronnes.org>
  S:    Maintained
@@@ -4882,8 -4761,10 +4882,8 @@@ T:     git git://anongit.freedesktop.org/dr
  
  DRM DRIVER FOR VMWARE VIRTUAL GPU
  M:    "VMware Graphics" <linux-graphics-maintainer@vmware.com>
 -M:    Sinclair Yeh <syeh@vmware.com>
  M:    Thomas Hellstrom <thellstrom@vmware.com>
  L:    dri-devel@lists.freedesktop.org
 -T:    git git://people.freedesktop.org/~syeh/repos_linux
  T:    git git://people.freedesktop.org/~thomash/linux
  S:    Supported
  F:    drivers/gpu/drm/vmwgfx/
@@@ -4891,7 -4772,6 +4891,7 @@@ F:      include/uapi/drm/vmwgfx_drm.
  
  DRM DRIVERS
  M:    David Airlie <airlied@linux.ie>
 +M:    Daniel Vetter <daniel@ffwll.ch>
  L:    dri-devel@lists.freedesktop.org
  T:    git git://anongit.freedesktop.org/drm/drm
  B:    https://bugs.freedesktop.org/
@@@ -4941,7 -4821,7 +4941,7 @@@ F:      Documentation/gpu/meson.rs
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  
  DRM DRIVERS FOR ATMEL HLCDC
 -M:    Boris Brezillon <boris.brezillon@bootlin.com>
 +M:    Boris Brezillon <bbrezillon@kernel.org>
  L:    dri-devel@lists.freedesktop.org
  S:    Supported
  F:    drivers/gpu/drm/atmel-hlcdc/
@@@ -5369,7 -5249,7 +5369,7 @@@ EDAC-CAVIUM OCTEO
  M:    Ralf Baechle <ralf@linux-mips.org>
  M:    David Daney <david.daney@cavium.com>
  L:    linux-edac@vger.kernel.org
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Supported
  F:    drivers/edac/octeon_edac*
  
@@@ -5450,6 -5330,7 +5450,6 @@@ S:      Maintaine
  F:    drivers/edac/i82443bxgx_edac.c
  
  EDAC-I82975X
 -M:    Ranganathan Desikan <ravi@jetztechnologies.com>
  M:    "Arvind R." <arvino55@gmail.com>
  L:    linux-edac@vger.kernel.org
  S:    Maintained
@@@ -5547,7 -5428,7 +5547,7 @@@ S:      Orpha
  F:    fs/efs/
  
  EHEA (IBM pSeries eHEA 10Gb ethernet adapter) DRIVER
 -M:    Douglas Miller <dougmill@linux.vnet.ibm.com>
 +M:    Douglas Miller <dougmill@linux.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/ibm/ehea/
@@@ -5647,7 -5528,6 +5647,7 @@@ F:      net/bridge
  ETHERNET PHY LIBRARY
  M:    Andrew Lunn <andrew@lunn.ch>
  M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Heiner Kallweit <hkallweit1@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-bus-mdio
@@@ -5661,7 -5541,6 +5661,7 @@@ F:      include/linux/of_net.
  F:    include/linux/phy.h
  F:    include/linux/phy_fixed.h
  F:    include/linux/platform_data/mdio-bcm-unimac.h
 +F:    include/linux/platform_data/mdio-gpio.h
  F:    include/trace/events/mdio.h
  F:    include/uapi/linux/mdio.h
  F:    include/uapi/linux/mii.h
@@@ -5686,7 -5565,7 +5686,7 @@@ F:      Documentation/filesystems/ext4/ext4.
  F:    fs/ext4/
  
  Extended Verification Module (EVM)
 -M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
 +M:    Mimi Zohar <zohar@linux.ibm.com>
  L:    linux-integrity@vger.kernel.org
  S:    Supported
  F:    security/integrity/evm/
@@@ -5887,7 -5766,7 +5887,7 @@@ F:      include/uapi/linux/firewire*.
  F:    tools/firewire/
  
  FIRMWARE LOADER (request_firmware)
 -M:    Luis R. Rodriguez <mcgrof@kernel.org>
 +M:    Luis Chamberlain <mcgrof@kernel.org>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    Documentation/firmware_class/
@@@ -5896,7 -5775,7 +5896,7 @@@ F:      include/linux/firmware.
  
  FLASH ADAPTER DRIVER (IBM Flash Adapter 900GB Full Height PCI Flash Card)
  M:    Joshua Morris <josh.h.morris@us.ibm.com>
 -M:    Philip Kelleher <pjk1939@linux.vnet.ibm.com>
 +M:    Philip Kelleher <pjk1939@linux.ibm.com>
  S:    Maintained
  F:    drivers/block/rsxx/
  
@@@ -6163,7 -6042,7 +6163,7 @@@ F:      include/linux/fscrypt*.
  F:    Documentation/filesystems/fscrypt.rst
  
  FSI-ATTACHED I2C DRIVER
 -M:    Eddie James <eajames@linux.vnet.ibm.com>
 +M:    Eddie James <eajames@linux.ibm.com>
  L:    linux-i2c@vger.kernel.org
  L:    openbmc@lists.ozlabs.org (moderated for non-subscribers)
  S:    Maintained
@@@ -6339,7 -6218,8 +6339,7 @@@ S:      Supporte
  F:    drivers/uio/uio_pci_generic.c
  
  GENWQE (IBM Generic Workqueue Card)
 -M:    Frank Haverkamp <haver@linux.vnet.ibm.com>
 -M:    Guilherme G. Piccoli <gpiccoli@linux.vnet.ibm.com>
 +M:    Frank Haverkamp <haver@linux.ibm.com>
  S:    Supported
  F:    drivers/misc/genwqe/
  
@@@ -6370,7 -6250,6 +6370,7 @@@ F:      include/uapi/linux/gigaset_dev.
  
  GNSS SUBSYSTEM
  M:    Johan Hovold <johan@kernel.org>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/johan/gnss.git
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-class-gnss
  F:    Documentation/devicetree/bindings/gnss/
@@@ -6412,7 -6291,6 +6412,6 @@@ F:      drivers/media/rc/gpio-ir-tx.
  
  GPIO MOCKUP DRIVER
  M:    Bamvor Jian Zhang <bamv2005@gmail.com>
- R:    Bartosz Golaszewski <brgl@bgdev.pl>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
  F:    drivers/gpio/gpio-mockup.c
@@@ -6420,7 -6298,6 +6419,7 @@@ F:      tools/testing/selftests/gpio
  
  GPIO SUBSYSTEM
  M:    Linus Walleij <linus.walleij@linaro.org>
 +M:    Bartosz Golaszewski <bgolaszewski@baylibre.com>
  L:    linux-gpio@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
  S:    Maintained
@@@ -6729,9 -6606,9 +6728,9 @@@ F:      arch/*/include/asm/suspend*.
  
  HID CORE LAYER
  M:    Jiri Kosina <jikos@kernel.org>
 -R:    Benjamin Tissoires <benjamin.tissoires@redhat.com>
 +M:    Benjamin Tissoires <benjamin.tissoires@redhat.com>
  L:    linux-input@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
  S:    Maintained
  F:    drivers/hid/
  F:    include/linux/hid*
@@@ -6949,11 -6826,9 +6948,11 @@@ Hyper-V CORE AND DRIVER
  M:    "K. Y. Srinivasan" <kys@microsoft.com>
  M:    Haiyang Zhang <haiyangz@microsoft.com>
  M:    Stephen Hemminger <sthemmin@microsoft.com>
 +M:    Sasha Levin <sashal@kernel.org>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git
  L:    devel@linuxdriverproject.org
 -S:    Maintained
 -F:    Documentation/networking/netvsc.txt
 +S:    Supported
 +F:    Documentation/networking/device_drivers/microsoft/netvsc.txt
  F:    arch/x86/include/asm/mshyperv.h
  F:    arch/x86/include/asm/trace/hyperv.h
  F:    arch/x86/include/asm/hyperv-tlfs.h
@@@ -6985,13 -6860,6 +6984,13 @@@ L:    linux-acpi@vger.kernel.or
  S:    Maintained
  F:    drivers/i2c/i2c-core-acpi.c
  
 +I2C CONTROLLER DRIVER FOR NVIDIA GPU
 +M:    Ajay Gupta <ajayg@nvidia.com>
 +L:    linux-i2c@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/i2c/busses/i2c-nvidia-gpu
 +F:    drivers/i2c/busses/i2c-nvidia-gpu.c
 +
  I2C MUXES
  M:    Peter Rosin <peda@axentia.se>
  L:    linux-i2c@vger.kernel.org
@@@ -7113,24 -6981,6 +7112,24 @@@ L:    linux-i2c@vger.kernel.or
  S:    Maintained
  F:    drivers/i2c/i2c-stub.c
  
 +I3C SUBSYSTEM
 +M:    Boris Brezillon <bbrezillon@kernel.org>
 +L:    linux-i3c@lists.infradead.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux.git
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-i3c
 +F:    Documentation/devicetree/bindings/i3c/
 +F:    Documentation/driver-api/i3c
 +F:    drivers/i3c/
 +F:    include/linux/i3c/
 +F:    include/dt-bindings/i3c/
 +
 +I3C DRIVER FOR SYNOPSYS DESIGNWARE
 +M:    Vitor Soares <vitor.soares@synopsys.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.txt
 +F:    drivers/i3c/master/dw*
 +
  IA64 (Itanium) PLATFORM
  M:    Tony Luck <tony.luck@intel.com>
  M:    Fenghua Yu <fenghua.yu@intel.com>
@@@ -7150,9 -7000,8 +7149,9 @@@ F:      crypto/842.
  F:    lib/842/
  
  IBM Power in-Nest Crypto Acceleration
 -M:    Leonidas S. Barbosa <leosilva@linux.vnet.ibm.com>
 -M:    Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
 +M:    Breno Leitão <leitao@debian.org>
 +M:    Nayna Jain <nayna@linux.ibm.com>
 +M:    Paulo Flabiano Smorigo <pfsmorigo@gmail.com>
  L:    linux-crypto@vger.kernel.org
  S:    Supported
  F:    drivers/crypto/nx/Makefile
@@@ -7169,8 -7018,8 +7168,8 @@@ S:      Supporte
  F:    drivers/scsi/ipr.*
  
  IBM Power SRIOV Virtual NIC Device Driver
 -M:    Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
 -M:    John Allen <jallen@linux.vnet.ibm.com>
 +M:    Thomas Falcon <tlfalcon@linux.ibm.com>
 +M:    John Allen <jallen@linux.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/ibm/ibmvnic.*
@@@ -7185,40 -7034,41 +7184,40 @@@ F:   arch/powerpc/include/asm/vas.
  F:    arch/powerpc/include/uapi/asm/vas.h
  
  IBM Power Virtual Ethernet Device Driver
 -M:    Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
 +M:    Thomas Falcon <tlfalcon@linux.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/ibm/ibmveth.*
  
  IBM Power Virtual FC Device Drivers
 -M:    Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
 +M:    Tyrel Datwyler <tyreld@linux.ibm.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/ibmvscsi/ibmvfc*
  
  IBM Power Virtual Management Channel Driver
 -M:    Bryant G. Ly <bryantly@linux.vnet.ibm.com>
 -M:    Steven Royer <seroyer@linux.vnet.ibm.com>
 +M:    Steven Royer <seroyer@linux.ibm.com>
  S:    Supported
  F:    drivers/misc/ibmvmc.*
  
  IBM Power Virtual SCSI Device Drivers
 -M:    Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
 +M:    Tyrel Datwyler <tyreld@linux.ibm.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/ibmvscsi/ibmvscsi*
  F:    include/scsi/viosrp.h
  
  IBM Power Virtual SCSI Device Target Driver
 -M:    Bryant G. Ly <bryantly@linux.vnet.ibm.com>
 -M:    Michael Cyr <mikecyr@linux.vnet.ibm.com>
 +M:    Michael Cyr <mikecyr@linux.ibm.com>
  L:    linux-scsi@vger.kernel.org
  L:    target-devel@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/ibmvscsi_tgt/
  
  IBM Power VMX Cryptographic instructions
 -M:    Leonidas S. Barbosa <leosilva@linux.vnet.ibm.com>
 -M:    Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
 +M:    Breno Leitão <leitao@debian.org>
 +M:    Nayna Jain <nayna@linux.ibm.com>
 +M:    Paulo Flabiano Smorigo <pfsmorigo@gmail.com>
  L:    linux-crypto@vger.kernel.org
  S:    Supported
  F:    drivers/crypto/vmx/Makefile
@@@ -7495,7 -7345,7 +7494,7 @@@ S:      Maintaine
  L:    linux-crypto@vger.kernel.org
  
  INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
 -M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
 +M:    Mimi Zohar <zohar@linux.ibm.com>
  M:    Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
  L:    linux-integrity@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
@@@ -7555,18 -7405,18 +7554,18 @@@ Q:   http://patchwork.ozlabs.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-queue.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue.git
  S:    Supported
 -F:    Documentation/networking/e100.rst
 -F:    Documentation/networking/e1000.rst
 -F:    Documentation/networking/e1000e.rst
 -F:    Documentation/networking/fm10k.rst
 -F:    Documentation/networking/igb.rst
 -F:    Documentation/networking/igbvf.rst
 -F:    Documentation/networking/ixgb.rst
 -F:    Documentation/networking/ixgbe.rst
 -F:    Documentation/networking/ixgbevf.rst
 -F:    Documentation/networking/i40e.rst
 -F:    Documentation/networking/iavf.rst
 -F:    Documentation/networking/ice.rst
 +F:    Documentation/networking/device_drivers/intel/e100.rst
 +F:    Documentation/networking/device_drivers/intel/e1000.rst
 +F:    Documentation/networking/device_drivers/intel/e1000e.rst
 +F:    Documentation/networking/device_drivers/intel/fm10k.rst
 +F:    Documentation/networking/device_drivers/intel/igb.rst
 +F:    Documentation/networking/device_drivers/intel/igbvf.rst
 +F:    Documentation/networking/device_drivers/intel/ixgb.rst
 +F:    Documentation/networking/device_drivers/intel/ixgbe.rst
 +F:    Documentation/networking/device_drivers/intel/ixgbevf.rst
 +F:    Documentation/networking/device_drivers/intel/i40e.rst
 +F:    Documentation/networking/device_drivers/intel/iavf.rst
 +F:    Documentation/networking/device_drivers/intel/ice.rst
  F:    drivers/net/ethernet/intel/
  F:    drivers/net/ethernet/intel/*/
  F:    include/linux/avf/virtchnl.h
@@@ -7656,14 -7506,6 +7655,14 @@@ S:    Maintaine
  F:    drivers/media/pci/intel/ipu3/
  F:    Documentation/media/uapi/v4l/pixfmt-srggb10-ipu3.rst
  
 +INTEL IPU3 CSI-2 IMGU DRIVER
 +M:    Sakari Ailus <sakari.ailus@linux.intel.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/media/ipu3/
 +F:    Documentation/media/uapi/v4l/pixfmt-meta-intel-ipu3.rst
 +F:    Documentation/media/v4l-drivers/ipu3.rst
 +
  INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
  M:    Krzysztof Halasa <khalasa@piap.pl>
  S:    Maintained
@@@ -7748,8 -7590,8 +7747,8 @@@ INTEL PRO/WIRELESS 2100, 2200BG, 2915AB
  M:    Stanislav Yakovlev <stas.yakovlev@gmail.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 -F:    Documentation/networking/README.ipw2100
 -F:    Documentation/networking/README.ipw2200
 +F:    Documentation/networking/device_drivers/intel/ipw2100.txt
 +F:    Documentation/networking/device_drivers/intel/ipw2200.txt
  F:    drivers/net/wireless/intel/ipw2x00/
  
  INTEL PSTATE DRIVER
@@@ -7844,7 -7686,7 +7843,7 @@@ F:      Documentation/devicetree/bindings/ii
  
  IOC3 ETHERNET DRIVER
  M:    Ralf Baechle <ralf@linux-mips.org>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/sgi/ioc3-eth.c
  
@@@ -8009,6 -7851,13 +8008,6 @@@ F:     include/linux/isdn
  F:    include/uapi/linux/isdn.h
  F:    include/uapi/linux/isdn/
  
 -ISDN SUBSYSTEM (Eicon active card driver)
 -M:    Armin Schindler <mac@melware.de>
 -L:    isdn4linux@listserv.isdn4linux.de (subscribers-only)
 -W:    http://www.melware.de
 -S:    Maintained
 -F:    drivers/isdn/hardware/eicon/
 -
  IT87 HARDWARE MONITORING DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -8097,8 -7946,9 +8096,8 @@@ S:      Maintaine
  F:    drivers/media/platform/rcar_jpu.c
  
  JSM Neo PCI based serial card
 -M:    Guilherme G. Piccoli <gpiccoli@linux.vnet.ibm.com>
  L:    linux-serial@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    drivers/tty/serial/jsm/
  
  K10TEMP HARDWARE MONITORING DRIVER
@@@ -8207,7 -8057,7 +8206,7 @@@ F:      tools/testing/selftests
  F:    Documentation/dev-tools/kselftest*
  
  KERNEL USERMODE HELPER
 -M:    "Luis R. Rodriguez" <mcgrof@kernel.org>
 +M:    Luis Chamberlain <mcgrof@kernel.org>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    kernel/umh.c
@@@ -8264,7 -8114,7 +8263,7 @@@ F:      arch/arm64/kvm
  
  KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
  M:    James Hogan <jhogan@kernel.org>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Supported
  F:    arch/mips/include/uapi/asm/kvm*
  F:    arch/mips/include/asm/kvm*
@@@ -8304,7 -8154,6 +8303,7 @@@ W:      http://www.linux-kvm.or
  T:    git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
  S:    Supported
  F:    arch/x86/kvm/
 +F:    arch/x86/kvm/*/
  F:    arch/x86/include/uapi/asm/kvm*
  F:    arch/x86/include/asm/kvm*
  F:    arch/x86/include/asm/pvclock-abi.h
@@@ -8329,7 -8178,7 +8328,7 @@@ F:      include/uapi/linux/kexec.
  F:    kernel/kexec*
  
  KEYS-ENCRYPTED
 -M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
 +M:    Mimi Zohar <zohar@linux.ibm.com>
  L:    linux-integrity@vger.kernel.org
  L:    keyrings@vger.kernel.org
  S:    Supported
@@@ -8338,9 -8187,9 +8337,9 @@@ F:      include/keys/encrypted-type.
  F:    security/keys/encrypted-keys/
  
  KEYS-TRUSTED
 -M:    James Bottomley <jejb@linux.vnet.ibm.com>
 +M:    James Bottomley <jejb@linux.ibm.com>
  M:      Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
 -M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
 +M:    Mimi Zohar <zohar@linuxibm.com>
  L:    linux-integrity@vger.kernel.org
  L:    keyrings@vger.kernel.org
  S:    Supported
@@@ -8384,7 -8233,7 +8383,7 @@@ F:      mm/kmemleak.
  F:    mm/kmemleak-test.c
  
  KMOD KERNEL MODULE LOADER - USERMODE HELPER
 -M:    "Luis R. Rodriguez" <mcgrof@kernel.org>
 +M:    Luis Chamberlain <mcgrof@kernel.org>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    kernel/kmod.c
@@@ -8393,7 -8242,7 +8392,7 @@@ F:      lib/test_kmod.
  F:    tools/testing/selftests/kmod/
  
  KPROBES
 -M:    Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
 +M:    Naveen N. Rao <naveen.n.rao@linux.ibm.com>
  M:    Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  M:    "David S. Miller" <davem@davemloft.net>
  M:    Masami Hiramatsu <mhiramat@kernel.org>
@@@ -8438,7 -8287,7 +8437,7 @@@ F:      drivers/net/dsa/lantiq_gswip.
  
  LANTIQ MIPS ARCHITECTURE
  M:    John Crispin <john@phrozen.org>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/lantiq
  F:    drivers/soc/lantiq
@@@ -8526,7 -8375,7 +8525,7 @@@ F:      drivers/media/dvb-frontends/lgdt3305
  LIBATA PATA ARASAN COMPACT FLASH CONTROLLER
  M:    Viresh Kumar <vireshk@kernel.org>
  L:    linux-ide@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  S:    Maintained
  F:    include/linux/pata_arasan_cf_data.h
  F:    drivers/ata/pata_arasan_cf.c
@@@ -8543,7 -8392,7 +8542,7 @@@ F:      drivers/ata/ata_generic.
  LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-ide@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  S:    Maintained
  F:    drivers/ata/pata_ftide010.c
  F:    drivers/ata/sata_gemini.c
@@@ -8562,7 -8411,7 +8561,7 @@@ F:      include/linux/ahci_platform.
  LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
  M:    Mikael Pettersson <mikpelinux@gmail.com>
  L:    linux-ide@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  S:    Maintained
  F:    drivers/ata/sata_promise.*
  
@@@ -8749,7 -8598,7 +8748,7 @@@ M:      Nicholas Piggin <npiggin@gmail.com
  M:    David Howells <dhowells@redhat.com>
  M:    Jade Alglave <j.alglave@ucl.ac.uk>
  M:    Luc Maranget <luc.maranget@inria.fr>
 -M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    "Paul E. McKenney" <paulmck@linux.ibm.com>
  R:    Akira Yokosawa <akiyks@gmail.com>
  R:    Daniel Lustig <dlustig@nvidia.com>
  L:    linux-kernel@vger.kernel.org
@@@ -9001,13 -8850,13 +9000,13 @@@ S:   Maintaine
  
  MARDUK (CREATOR CI40) DEVICE TREE SUPPORT
  M:    Rahul Bedarkar <rahulbedarkar89@gmail.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/boot/dts/img/pistachio_marduk.dts
  
  MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
  M:    Andrew Lunn <andrew@lunn.ch>
 -M:    Vivien Didelot <vivien.didelot@savoirfairelinux.com>
 +M:    Vivien Didelot <vivien.didelot@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/dsa/mv88e6xxx/
@@@ -9024,7 -8873,7 +9023,7 @@@ F:      include/uapi/drm/armada_drm.
  F:    Documentation/devicetree/bindings/display/armada/
  
  MARVELL CRYPTO DRIVER
 -M:    Boris Brezillon <boris.brezillon@bootlin.com>
 +M:    Boris Brezillon <bbrezillon@kernel.org>
  M:    Arnaud Ebalard <arno@natisbad.org>
  F:    drivers/crypto/marvell/
  S:    Maintained
@@@ -9512,13 -9361,6 +9511,13 @@@ F:    drivers/media/platform/mtk-vpu
  F:    Documentation/devicetree/bindings/media/mediatek-vcodec.txt
  F:    Documentation/devicetree/bindings/media/mediatek-vpu.txt
  
 +MEDIATEK MT76 WIRELESS LAN DRIVER
 +M:    Felix Fietkau <nbd@nbd.name>
 +M:    Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
 +L:    linux-wireless@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/wireless/mediatek/mt76/
 +
  MEDIATEK MT7601U WIRELESS LAN DRIVER
  M:    Jakub Kicinski <kubakici@wp.pl>
  L:    linux-wireless@vger.kernel.org
@@@ -9714,7 -9556,7 +9713,7 @@@ F:      drivers/platform/x86/mlx-platform.
  
  MEMBARRIER SUPPORT
  M:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 -M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    "Paul E. McKenney" <paulmck@linux.ibm.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  F:    kernel/sched/membarrier.c
@@@ -9735,7 -9577,7 +9734,7 @@@ F:      mm
  MEMORY TECHNOLOGY DEVICES (MTD)
  M:    David Woodhouse <dwmw2@infradead.org>
  M:    Brian Norris <computersforpeace@gmail.com>
 -M:    Boris Brezillon <boris.brezillon@bootlin.com>
 +M:    Boris Brezillon <bbrezillon@kernel.org>
  M:    Marek Vasut <marek.vasut@gmail.com>
  M:    Richard Weinberger <richard@nod.at>
  L:    linux-mtd@lists.infradead.org
@@@ -9836,14 -9678,14 +9835,14 @@@ L:   linux-media@vger.kernel.or
  S:    Supported
  F:    drivers/media/platform/atmel/atmel-isc.c
  F:    drivers/media/platform/atmel/atmel-isc-regs.h
 -F:    devicetree/bindings/media/atmel-isc.txt
 +F:    Documentation/devicetree/bindings/media/atmel-isc.txt
  
  MICROCHIP ISI DRIVER
  M:    Eugen Hristev <eugen.hristev@microchip.com>
  L:    linux-media@vger.kernel.org
  S:    Supported
  F:    drivers/media/platform/atmel/atmel-isi.c
 -F:    include/media/atmel-isi.h
 +F:    drivers/media/platform/atmel/atmel-isi.h
  
  MICROCHIP AT91 USART MFD DRIVER
  M:    Radu Pirea <radu_nicolae.pirea@upb.ro>
@@@ -9889,13 -9731,6 +9888,13 @@@ M:    Ludovic Desroches <ludovic.desroches
  S:    Maintained
  F:    drivers/mmc/host/atmel-mci.c
  
 +MICROCHIP MCP16502 PMIC DRIVER
 +M:    Andrei Stefanescu <andrei.stefanescu@microchip.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/regulator/mcp16502-regulator.txt
 +F:    drivers/regulator/mcp16502.c
 +
  MICROCHIP MCP3911 ADC DRIVER
  M:    Marcus Folkesson <marcus.folkesson@gmail.com>
  M:    Kent Gustavsson <kent@minoris.se>
@@@ -9933,6 -9768,12 +9932,12 @@@ M:    Nicolas Ferre <nicolas.ferre@microch
  S:    Supported
  F:    drivers/power/reset/at91-sama5d2_shdwc.c
  
+ MICROCHIP SAMA5D2-COMPATIBLE PIOBU GPIO
+ M:    Andrei Stefanescu <andrei.stefanescu@microchip.com>
+ L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+ L:    linux-gpio@vger.kernel.org
+ F:    drivers/gpio/gpio-sama5d2-piobu.c
  MICROCHIP SPI DRIVER
  M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  S:    Supported
@@@ -9974,7 -9815,7 +9979,7 @@@ F:      drivers/dma/at_xdmac.
  
  MICROSEMI MIPS SOCS
  M:    Alexandre Belloni <alexandre.belloni@bootlin.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/generic/board-ocelot.c
  F:    arch/mips/configs/generic/board-ocelot.config
@@@ -9995,7 -9836,6 +10000,7 @@@ F:     Documentation/scsi/smartpqi.tx
  
  MICROSEMI ETHERNET SWITCH DRIVER
  M:    Alexandre Belloni <alexandre.belloni@bootlin.com>
 +M:    Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/mscc/
  M:    Ralf Baechle <ralf@linux-mips.org>
  M:    Paul Burton <paul.burton@mips.com>
  M:    James Hogan <jhogan@kernel.org>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  W:    http://www.linux-mips.org/
  T:    git git://git.linux-mips.org/pub/scm/ralf/linux.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git
@@@ -10028,7 -9868,7 +10033,7 @@@ F:    drivers/platform/mips
  
  MIPS BOSTON DEVELOPMENT BOARD
  M:    Paul Burton <paul.burton@mips.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/clock/img,boston-clock.txt
  F:    arch/mips/boot/dts/img/boston.dts
@@@ -10038,7 -9878,7 +10043,7 @@@ F:    include/dt-bindings/clock/boston-clo
  
  MIPS GENERIC PLATFORM
  M:    Paul Burton <paul.burton@mips.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/power/mti,mips-cpc.txt
  F:    arch/mips/generic/
@@@ -10046,7 -9886,7 +10051,7 @@@ F:    arch/mips/tools/generic-board-config
  
  MIPS/LOONGSON1 ARCHITECTURE
  M:    Keguang Zhang <keguang.zhang@gmail.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/loongson32/
  F:    arch/mips/include/asm/mach-loongson32/
@@@ -10055,7 -9895,7 +10060,7 @@@ F:    drivers/*/*/*loongson1
  
  MIPS/LOONGSON2 ARCHITECTURE
  M:    Jiaxun Yang <jiaxun.yang@flygoat.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/loongson64/fuloong-2e/
  F:    arch/mips/loongson64/lemote-2f/
@@@ -10065,7 -9905,7 +10070,7 @@@ F:    drivers/*/*/*loongson2
  
  MIPS/LOONGSON3 ARCHITECTURE
  M:    Huacai Chen <chenhc@lemote.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/loongson64/
  F:    arch/mips/include/asm/mach-loongson64/
@@@ -10075,7 -9915,7 +10080,7 @@@ F:    drivers/*/*/*loongson3
  
  MIPS RINT INSTRUCTION EMULATION
  M:    Aleksandar Markovic <aleksandar.markovic@mips.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Supported
  F:    arch/mips/math-emu/sp_rint.c
  F:    arch/mips/math-emu/dp_rint.c
@@@ -10089,9 -9929,12 +10094,9 @@@ S:   Odd Fixe
  F:    drivers/media/radio/radio-miropcm20*
  
  MMP SUPPORT
 -M:    Eric Miao <eric.y.miao@gmail.com>
 -M:    Haojian Zhuang <haojian.zhuang@gmail.com>
 +R:    Lubomir Rintel <lkundrak@v3.sk>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://github.com/hzhuang1/linux.git
 -T:    git git://git.linaro.org/people/ycmiao/pxa-linux.git
 -S:    Maintained
 +S:    Odd Fixes
  F:    arch/arm/boot/dts/mmp*
  F:    arch/arm/mach-mmp/
  
@@@ -10330,7 -10173,7 +10335,7 @@@ S:   Supporte
  F:    drivers/net/ethernet/myricom/myri10ge/
  
  NAND FLASH SUBSYSTEM
 -M:    Boris Brezillon <boris.brezillon@bootlin.com>
 +M:    Boris Brezillon <bbrezillon@kernel.org>
  M:    Miquel Raynal <miquel.raynal@bootlin.com>
  R:    Richard Weinberger <richard@nod.at>
  L:    linux-mtd@lists.infradead.org
@@@ -10407,8 -10250,8 +10412,8 @@@ NETERION 10GbE DRIVERS (s2io/vxge
  M:    Jon Mason <jdmason@kudzu.us>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/s2io.txt
 -F:    Documentation/networking/vxge.txt
 +F:    Documentation/networking/device_drivers/neterion/s2io.txt
 +F:    Documentation/networking/device_drivers/neterion/vxge.txt
  F:    drivers/net/ethernet/neterion/
  
  NETFILTER
@@@ -10497,7 -10340,7 +10502,7 @@@ F:   drivers/net/wireless
  
  NETWORKING [DSA]
  M:    Andrew Lunn <andrew@lunn.ch>
 -M:    Vivien Didelot <vivien.didelot@savoirfairelinux.com>
 +M:    Vivien Didelot <vivien.didelot@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/dsa/
@@@ -10850,14 -10693,6 +10855,14 @@@ L: linux-nfc@lists.01.org (moderated fo
  S:    Supported
  F:    drivers/nfc/nxp-nci
  
 +OBJAGG
 +M:    Jiri Pirko <jiri@mellanox.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    lib/objagg.c
 +F:    lib/test_objagg.c
 +F:    include/linux/objagg.h
 +
  OBJTOOL
  M:    Josh Poimboeuf <jpoimboe@redhat.com>
  M:    Peter Zijlstra <peterz@infradead.org>
@@@ -10865,7 -10700,7 +10870,7 @@@ S:   Supporte
  F:    tools/objtool/
  
  OCXL (Open Coherent Accelerator Processor Interface OpenCAPI) DRIVER
 -M:    Frederic Barrat <fbarrat@linux.vnet.ibm.com>
 +M:    Frederic Barrat <fbarrat@linux.ibm.com>
  M:    Andrew Donnellan <andrew.donnellan@au1.ibm.com>
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Supported
@@@ -10882,10 -10717,7 +10887,10 @@@ M: Jarkko Nikula <jarkko.nikula@bitmer.
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  L:    linux-omap@vger.kernel.org
  S:    Maintained
 -F:    sound/soc/omap/
 +F:    sound/soc/ti/omap*
 +F:    sound/soc/ti/rx51.c
 +F:    sound/soc/ti/n810.c
 +F:    sound/soc/ti/sdma-pcm.*
  
  OMAP CLOCK FRAMEWORK SUPPORT
  M:    Paul Walmsley <paul@pwsan.com>
@@@ -10966,14 -10798,6 +10971,14 @@@ L: linux-omap@vger.kernel.or
  S:    Maintained
  F:    arch/arm/mach-omap2/omap_hwmod.*
  
 +OMAP I2C DRIVER
 +M:    Vignesh R <vigneshr@ti.com>
 +L:    linux-omap@vger.kernel.org
 +L:    linux-i2c@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-omap.txt
 +F:    drivers/i2c/busses/i2c-omap.c
 +
  OMAP IMAGING SUBSYSTEM (OMAP3 ISP and OMAP4 ISS)
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-media@vger.kernel.org
@@@ -10983,9 -10807,9 +10988,9 @@@ F:   drivers/media/platform/omap3isp
  F:    drivers/staging/media/omap4iss/
  
  OMAP MMC SUPPORT
 -M:    Jarkko Lavinen <jarkko.lavinen@nokia.com>
 +M:    Aaro Koskinen <aaro.koskinen@iki.fi>
  L:    linux-omap@vger.kernel.org
 -S:    Maintained
 +S:    Odd Fixes
  F:    drivers/mmc/host/omap.c
  
  OMAP POWER MANAGEMENT SUPPORT
@@@ -11068,7 -10892,7 +11073,7 @@@ F:   include/linux/platform_data/i2c-omap
  
  ONION OMEGA2+ BOARD
  M:    Harvey Hunt <harveyhuntnexus@gmail.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/boot/dts/ralink/omega2p.dts
  
@@@ -11920,7 -11744,6 +11925,7 @@@ F:   Documentation/devicetree/bindings/pi
  PIN CONTROLLER - INTEL
  M:    Mika Westerberg <mika.westerberg@linux.intel.com>
  M:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/intel.git
  S:    Maintained
  F:    drivers/pinctrl/intel/
  
@@@ -11977,7 -11800,7 +11982,7 @@@ F:   drivers/pinctrl/spear
  
  PISTACHIO SOC SUPPORT
  M:    James Hartley <james.hartley@sondrel.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Odd Fixes
  F:    arch/mips/pistachio/
  F:    arch/mips/include/asm/mach-pistachio/
@@@ -12157,7 -11980,7 +12162,7 @@@ F:   kernel/printk
  F:    include/linux/printk.h
  
  PRISM54 WIRELESS DRIVER
 -M:    "Luis R. Rodriguez" <mcgrof@gmail.com>
 +M:    Luis Chamberlain <mcgrof@kernel.org>
  L:    linux-wireless@vger.kernel.org
  W:    http://wireless.kernel.org/en/users/Drivers/p54
  S:    Obsolete
@@@ -12171,10 -11994,9 +12176,10 @@@ S: Maintaine
  F:    fs/proc/
  F:    include/linux/proc_fs.h
  F:    tools/testing/selftests/proc/
 +F:    Documentation/filesystems/proc.txt
  
  PROC SYSCTL
 -M:    "Luis R. Rodriguez" <mcgrof@kernel.org>
 +M:    Luis Chamberlain <mcgrof@kernel.org>
  M:    Kees Cook <keescook@chromium.org>
  L:    linux-kernel@vger.kernel.org
  L:    linux-fsdevel@vger.kernel.org
@@@ -12421,7 -12243,7 +12426,7 @@@ QLOGIC QLA3XXX NETWORK DRIVE
  M:    Dept-GELinuxNICDev@cavium.com
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/LICENSE.qla3xxx
 +F:    Documentation/networking/device_drivers/qlogic/LICENSE.qla3xxx
  F:    drivers/net/ethernet/qlogic/qla3xxx.*
  
  QLOGIC QLA4XXX iSCSI DRIVER
@@@ -12473,7 -12295,7 +12478,7 @@@ L:   linux-kernel@vger.kernel.or
  S:    Maintained
  F:    drivers/bus/fsl-mc/
  F:    Documentation/devicetree/bindings/misc/fsl,qoriq-mc.txt
 -F:    Documentation/networking/dpaa2/overview.rst
 +F:    Documentation/networking/device_drivers/freescale/dpaa2/overview.rst
  
  QT1010 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
@@@ -12501,7 -12323,7 +12506,7 @@@ S:   Supporte
  F:    drivers/net/wireless/ath/ath9k/
  
  QUALCOMM CAMERA SUBSYSTEM DRIVER
 -M:    Todor Tomov <todor.tomov@linaro.org>
 +M:    Todor Tomov <todor.too@gmail.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/media/qcom,camss.txt
@@@ -12637,7 -12459,7 +12642,7 @@@ F:   drivers/media/usb/rainshadow-cec/
  
  RALINK MIPS ARCHITECTURE
  M:    John Crispin <john@phrozen.org>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/ralink
  
@@@ -12657,7 -12479,7 +12662,7 @@@ F:   drivers/block/brd.
  
  RANCHU VIRTUAL BOARD FOR MIPS
  M:    Miodrag Dinic <miodrag.dinic@mips.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Supported
  F:    arch/mips/generic/board-ranchu.c
  F:    arch/mips/configs/generic/board-ranchu.config
@@@ -12679,7 -12501,7 +12684,7 @@@ S:   Orpha
  F:    drivers/net/wireless/ray*
  
  RCUTORTURE TEST FRAMEWORK
 -M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    "Paul E. McKenney" <paulmck@linux.ibm.com>
  M:    Josh Triplett <josh@joshtriplett.org>
  R:    Steven Rostedt <rostedt@goodmis.org>
  R:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
@@@ -12721,17 -12543,16 +12726,17 @@@ M:        Fenghua Yu <fenghua.yu@intel.com
  M:    Reinette Chatre <reinette.chatre@intel.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
 -F:    arch/x86/kernel/cpu/intel_rdt*
 -F:    arch/x86/include/asm/intel_rdt_sched.h
 -F:    Documentation/x86/intel_rdt*
 +F:    arch/x86/kernel/cpu/resctrl/
 +F:    arch/x86/include/asm/resctrl_sched.h
 +F:    Documentation/x86/resctrl*
  
  READ-COPY UPDATE (RCU)
 -M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    "Paul E. McKenney" <paulmck@linux.ibm.com>
  M:    Josh Triplett <josh@joshtriplett.org>
  R:    Steven Rostedt <rostedt@goodmis.org>
  R:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  R:    Lai Jiangshan <jiangshanlai@gmail.com>
 +R:    Joel Fernandes <joel@joelfernandes.org>
  L:    linux-kernel@vger.kernel.org
  W:    http://www.rdrop.com/users/paulmck/RCU/
  S:    Supported
@@@ -12867,7 -12688,7 +12872,7 @@@ F:   include/linux/reset-controller.
  RESTARTABLE SEQUENCES SUPPORT
  M:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  M:    Peter Zijlstra <peterz@infradead.org>
 -M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    "Paul E. McKenney" <paulmck@linux.ibm.com>
  M:    Boqun Feng <boqun.feng@gmail.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
@@@ -12935,13 -12756,6 +12940,13 @@@ S: Maintaine
  F:    drivers/media/platform/rockchip/rga/
  F:    Documentation/devicetree/bindings/media/rockchip-rga.txt
  
 +ROCKCHIP VPU CODEC DRIVER
 +M:    Ezequiel Garcia <ezequiel@collabora.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/media/platform/rockchip/vpu/
 +F:    Documentation/devicetree/bindings/media/rockchip-vpu.txt
 +
  ROCKER DRIVER
  M:    Jiri Pirko <jiri@resnulli.us>
  L:    netdev@vger.kernel.org
@@@ -13191,7 -13005,7 +13196,7 @@@ T:   git git://linuxtv.org/media_tree.gi
  S:    Maintained
  F:    drivers/media/common/saa7146/
  F:    drivers/media/pci/saa7146/
 -F:    include/media/saa7146*
 +F:    include/media/drv-intf/saa7146*
  
  SAMSUNG AUDIO (ASoC) DRIVERS
  M:    Krzysztof Kozlowski <krzk@kernel.org>
@@@ -13399,7 -13213,7 +13404,7 @@@ F:   drivers/scsi/sg.
  F:    include/scsi/sg.h
  
  SCSI SUBSYSTEM
 -M:    "James E.J. Bottomley" <jejb@linux.vnet.ibm.com>
 +M:    "James E.J. Bottomley" <jejb@linux.ibm.com>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git
  M:    "Martin K. Petersen" <martin.petersen@oracle.com>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git
@@@ -13457,12 -13271,6 +13462,12 @@@ L: sdricohcs-devel@lists.sourceforge.ne
  S:    Maintained
  F:    drivers/mmc/host/sdricoh_cs.c
  
 +SECO BOARDS CEC DRIVER
 +M:    Ettore Chimenti <ek5.chimenti@gmail.com>
 +S:    Maintained
 +F:    drivers/media/platform/seco-cec/seco-cec.c
 +F:    drivers/media/platform/seco-cec/seco-cec.h
 +
  SECURE COMPUTING
  M:    Kees Cook <keescook@chromium.org>
  R:    Andy Lutomirski <luto@amacapital.net>
@@@ -13840,7 -13648,7 +13845,7 @@@ F:   mm/sl?b
  
  SLEEPABLE READ-COPY UPDATE (SRCU)
  M:    Lai Jiangshan <jiangshanlai@gmail.com>
 -M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    "Paul E. McKenney" <paulmck@linux.ibm.com>
  M:    Josh Triplett <josh@joshtriplett.org>
  R:    Steven Rostedt <rostedt@goodmis.org>
  R:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
@@@ -13996,13 -13804,6 +14001,13 @@@ F: drivers/md/raid
  F:    include/linux/raid/
  F:    include/uapi/linux/raid/
  
 +SOCIONEXT (SNI) AVE NETWORK DRIVER
 +M:    Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/ethernet/socionext/sni_ave.c
 +F:    Documentation/devicetree/bindings/net/socionext,uniphier-ave4.txt
 +
  SOCIONEXT (SNI) NETSEC NETWORK DRIVER
  M:    Jassi Brar <jaswinder.singh@linaro.org>
  L:    netdev@vger.kernel.org
@@@ -14036,14 -13837,6 +14041,14 @@@ S: Maintaine
  F:    drivers/ssb/
  F:    include/linux/ssb/
  
 +SONY IMX214 SENSOR DRIVER
 +M:    Ricardo Ribalda <ricardo.ribalda@gmail.com>
 +L:    linux-media@vger.kernel.org
 +T:    git git://linuxtv.org/media_tree.git
 +S:    Maintained
 +F:    drivers/media/i2c/imx214.c
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx214.txt
 +
  SONY IMX258 SENSOR DRIVER
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
@@@ -14136,7 -13929,6 +14141,7 @@@ S:   Supporte
  F:    Documentation/devicetree/bindings/sound/
  F:    Documentation/sound/soc/
  F:    sound/soc/
 +F:    include/dt-bindings/sound/
  F:    include/sound/soc*
  
  SOUNDWIRE SUBSYSTEM
@@@ -14184,10 -13976,11 +14189,10 @@@ F:        drivers/tty/serial/sunzilog.
  F:    drivers/tty/vcc.c
  
  SPARSE CHECKER
 -M:    "Christopher Li" <sparse@chrisli.org>
 +M:    "Luc Van Oostenryck" <luc.vanoostenryck@gmail.com>
  L:    linux-sparse@vger.kernel.org
  W:    https://sparse.wiki.kernel.org/
  T:    git git://git.kernel.org/pub/scm/devel/sparse/sparse.git
 -T:    git git://git.kernel.org/pub/scm/devel/sparse/chrisl/sparse.git
  S:    Maintained
  F:    include/linux/compiler.h
  
@@@ -14235,7 -14028,7 +14240,7 @@@ SPIDERNET NETWORK DRIVER for CEL
  M:    Ishizaki Kou <kou.ishizaki@toshiba.co.jp>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    Documentation/networking/spider_net.txt
 +F:    Documentation/networking/device_drivers/toshiba/spider_net.txt
  F:    drivers/net/ethernet/toshiba/spider_net*
  
  SPMI SUBSYSTEM
@@@ -14284,7 -14077,6 +14289,7 @@@ F:   Documentation/devicetree/bindings/ii
  
  STABLE BRANCH
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 +M:    Sasha Levin <sashal@kernel.org>
  L:    stable@vger.kernel.org
  S:    Supported
  F:    Documentation/process/stable-kernel-rules.rst
@@@ -14951,12 -14743,6 +14956,12 @@@ F: Documentation/devicetree/bindings/cl
  F:    drivers/clk/keystone/sci-clk.c
  F:    drivers/reset/reset-ti-sci.c
  
 +Texas Instruments ASoC drivers
 +M:    Peter Ujfalusi <peter.ujfalusi@ti.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    sound/soc/ti/
 +
  THANKO'S RAREMONO AM/FM/SW RADIO RECEIVER USB DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -15231,7 -15017,7 +15236,7 @@@ M:   Samuel Chessman <chessman@tux.org
  L:    tlan-devel@lists.sourceforge.net (subscribers-only)
  W:    http://sourceforge.net/projects/tlan/
  S:    Maintained
 -F:    Documentation/networking/tlan.txt
 +F:    Documentation/networking/device_drivers/ti/tlan.txt
  F:    drivers/net/ethernet/ti/tlan.*
  
  TM6000 VIDEO4LINUX DRIVER
@@@ -15285,7 -15071,7 +15290,7 @@@ F:   drivers/platform/x86/topstar-laptop.
  
  TORTURE-TEST MODULES
  M:    Davidlohr Bueso <dave@stgolabs.net>
 -M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 +M:    "Paul E. McKenney" <paulmck@linux.ibm.com>
  M:    Josh Triplett <josh@joshtriplett.org>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
@@@ -15428,7 -15214,7 +15433,7 @@@ F:   arch/um/os-Linux/drivers
  TURBOCHANNEL SUBSYSTEM
  M:    "Maciej W. Rozycki" <macro@linux-mips.org>
  M:    Ralf Baechle <ralf@linux-mips.org>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  Q:    http://patchwork.linux-mips.org/project/linux-mips/list/
  S:    Maintained
  F:    drivers/tc/
@@@ -15664,9 -15450,9 +15669,9 @@@ F:   include/linux/usb/gadget
  
  USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...)
  M:    Jiri Kosina <jikos@kernel.org>
 -R:    Benjamin Tissoires <benjamin.tissoires@redhat.com>
 +M:    Benjamin Tissoires <benjamin.tissoires@redhat.com>
  L:    linux-usb@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
  S:    Maintained
  F:    Documentation/hid/hiddev.txt
  F:    drivers/hid/usbhid/
@@@ -16249,7 -16035,7 +16254,7 @@@ F:   drivers/net/vmxnet3
  
  VOCORE VOCORE2 BOARD
  M:    Harvey Hunt <harveyhuntnexus@gmail.com>
 -L:    linux-mips@linux-mips.org
 +L:    linux-mips@vger.kernel.org
  S:    Maintained
  F:    arch/mips/boot/dts/ralink/vocore2.dts
  
@@@ -16544,12 -16330,6 +16549,12 @@@ F: include/linux/idr.
  F:    include/linux/xarray.h
  F:    tools/testing/radix-tree
  
 +XBOX DVD IR REMOTE
 +M:    Benjamin Valentin <benpicco@googlemail.com>
 +S:    Maintained
 +F:    drivers/media/rc/xbox_remote.c
 +F:    drivers/media/rc/keymaps/rc-xbox-dvd.c
 +
  XC2028/3028 TUNER DRIVER
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  L:    linux-media@vger.kernel.org
@@@ -16596,7 -16376,6 +16601,7 @@@ L:   xen-devel@lists.xenproject.org (mode
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip.git
  S:    Supported
  F:    arch/x86/xen/
 +F:    arch/x86/platform/pvh/
  F:    drivers/*/xen-*front.c
  F:    drivers/xen/
  F:    arch/x86/include/asm/xen/
index 691a8da13fac771473cb167ec15119f31f8c5056,b53ff6399d312a7937cb783cfc00ab223422e1cb..49e3adffbf5beccf45847bcd005e39fc97186003
@@@ -296,13 -296,23 +296,13 @@@ struct modem_private_data 
  
  static struct modem_private_data modem_priv;
  
 -static struct resource ams_delta_nand_resources[] = {
 -      [0] = {
 -              .start  = OMAP1_MPUIO_BASE,
 -              .end    = OMAP1_MPUIO_BASE +
 -                              OMAP_MPUIO_IO_CNTL + sizeof(u32) - 1,
 -              .flags  = IORESOURCE_MEM,
 -      },
 -};
 -
  static struct platform_device ams_delta_nand_device = {
        .name   = "ams-delta-nand",
        .id     = -1,
 -      .num_resources  = ARRAY_SIZE(ams_delta_nand_resources),
 -      .resource       = ams_delta_nand_resources,
  };
  
 -#define OMAP_GPIO_LABEL       "gpio-0-15"
 +#define OMAP_GPIO_LABEL               "gpio-0-15"
 +#define OMAP_MPUIO_LABEL      "mpuio"
  
  static struct gpiod_lookup_table ams_delta_nand_gpio_table = {
        .table = {
                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWE, "nwe", 0),
                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_ALE, "ale", 0),
                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_CLE, "cle", 0),
 +              GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 0, "data", 0, 0),
 +              GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 1, "data", 1, 0),
 +              GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 2, "data", 2, 0),
 +              GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 3, "data", 3, 0),
 +              GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 4, "data", 4, 0),
 +              GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 5, "data", 5, 0),
 +              GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 6, "data", 6, 0),
 +              GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 7, "data", 7, 0),
                { },
        },
  };
@@@ -601,7 -603,7 +601,7 @@@ static void __init modem_assign_irq(str
        struct gpio_desc *gpiod;
  
        gpiod = gpiochip_request_own_desc(chip, AMS_DELTA_GPIO_PIN_MODEM_IRQ,
-                                         "modem_irq");
+                                         "modem_irq", 0);
        if (IS_ERR(gpiod)) {
                pr_err("%s: modem IRQ GPIO request failed (%ld)\n", __func__,
                       PTR_ERR(gpiod));
@@@ -748,9 -750,6 +748,9 @@@ static void modem_pm(struct uart_port *
        struct modem_private_data *priv = port->private_data;
        int ret;
  
 +      if (!priv)
 +              return;
 +
        if (IS_ERR(priv->regulator))
                return;
  
@@@ -809,7 -808,7 +809,7 @@@ static void __init ams_delta_led_init(s
        int i;
  
        for (i = LATCH1_PIN_LED_CAMERA; i < LATCH1_PIN_DOCKIT1; i++) {
-               gpiod = gpiochip_request_own_desc(chip, i, NULL);
+               gpiod = gpiochip_request_own_desc(chip, i, "camera-led", 0);
                if (IS_ERR(gpiod)) {
                        pr_warn("%s: %s GPIO %d request failed (%ld)\n",
                                __func__, LATCH1_LABEL, i, PTR_ERR(gpiod));
index adc768f908f1ae1937f3d245088c590b449e574f,6c675c5accbafddf78e8bdf329844c20441edb8f..7d5c55494ccd50a94281be8702508bead6b78804
@@@ -608,7 -608,7 +608,7 @@@ static int mvebu_pwm_request(struct pwm
                ret = -EBUSY;
        } else {
                desc = gpiochip_request_own_desc(&mvchip->chip,
-                                                pwm->hwpwm, "mvebu-pwm");
+                                                pwm->hwpwm, "mvebu-pwm", 0);
                if (IS_ERR(desc)) {
                        ret = PTR_ERR(desc);
                        goto out;
@@@ -773,6 -773,9 +773,6 @@@ static int mvebu_pwm_probe(struct platf
                                     "marvell,armada-370-gpio"))
                return 0;
  
 -      if (IS_ERR(mvchip->clk))
 -              return PTR_ERR(mvchip->clk);
 -
        /*
         * There are only two sets of PWM configuration registers for
         * all the GPIO lines on those SoCs which this driver reserves
        if (!res)
                return 0;
  
 +      if (IS_ERR(mvchip->clk))
 +              return PTR_ERR(mvchip->clk);
 +
        /*
         * Use set A for lines of GPIO chip with id 0, B for GPIO chip
         * with id 1. Don't allow further GPIO chips to be used for PWM.
diff --combined drivers/gpio/gpio-omap.c
index 5b3e83cd71378b0ee81f83a51e4a69380d752fef,6ed621a0056182f8b9c7e2af450c478e90c01b19..f4e9921fa9663643bf966e378c1095e6a260661f
@@@ -32,6 -32,7 +32,6 @@@
  #define OMAP4_GPIO_DEBOUNCINGTIME_MASK 0xFF
  
  #define OMAP_GPIO_QUIRK_IDLE_REMOVE_TRIGGER   BIT(2)
 -#define OMAP_GPIO_QUIRK_DEFERRED_WKUP_EN      BIT(1)
  
  struct gpio_regs {
        u32 irqenable1;
@@@ -378,9 -379,18 +378,9 @@@ static inline void omap_set_gpio_trigge
                        readl_relaxed(bank->base + bank->regs->fallingdetect);
  
        if (likely(!(bank->non_wakeup_gpios & gpio_bit))) {
 -              /* Defer wkup_en register update until we idle? */
 -              if (bank->quirks & OMAP_GPIO_QUIRK_DEFERRED_WKUP_EN) {
 -                      if (trigger)
 -                              bank->context.wake_en |= gpio_bit;
 -                      else
 -                              bank->context.wake_en &= ~gpio_bit;
 -              } else {
 -                      omap_gpio_rmw(base, bank->regs->wkup_en, gpio_bit,
 -                                    trigger != 0);
 -                      bank->context.wake_en =
 -                              readl_relaxed(bank->base + bank->regs->wkup_en);
 -              }
 +              omap_gpio_rmw(base, bank->regs->wkup_en, gpio_bit, trigger != 0);
 +              bank->context.wake_en =
 +                      readl_relaxed(bank->base + bank->regs->wkup_en);
        }
  
        /* This part needs to be executed always for OMAP{34xx, 44xx} */
@@@ -932,12 -942,49 +932,11 @@@ omap2_gpio_disable_level_quirk(struct g
                       bank->base + bank->regs->risingdetect);
  }
  
 -/*
 - * On omap4 and later SoC variants a level interrupt with wkup_en
 - * enabled blocks the GPIO functional clock from idling until the GPIO
 - * instance has been reset. To avoid that, we must set wkup_en only for
 - * idle for level interrupts, and clear level registers for the duration
 - * of idle. The level interrupts will be still there on wakeup by their
 - * nature.
 - */
 -static void __maybe_unused
 -omap4_gpio_enable_level_quirk(struct gpio_bank *bank)
 -{
 -      /* Update wake register for idle, edge bits might be already set */
 -      writel_relaxed(bank->context.wake_en,
 -                     bank->base + bank->regs->wkup_en);
 -
 -      /* Clear level registers for idle */
 -      writel_relaxed(0, bank->base + bank->regs->leveldetect0);
 -      writel_relaxed(0, bank->base + bank->regs->leveldetect1);
 -}
 -
 -static void __maybe_unused
 -omap4_gpio_disable_level_quirk(struct gpio_bank *bank)
 -{
 -      /* Restore level registers after idle */
 -      writel_relaxed(bank->context.leveldetect0,
 -                     bank->base + bank->regs->leveldetect0);
 -      writel_relaxed(bank->context.leveldetect1,
 -                     bank->base + bank->regs->leveldetect1);
 -
 -      /* Clear saved wkup_en for level, it will be set for next idle again */
 -      bank->context.wake_en &= ~(bank->context.leveldetect0 |
 -                                 bank->context.leveldetect1);
 -
 -      /* Update wake with only edge configuration */
 -      writel_relaxed(bank->context.wake_en,
 -                     bank->base + bank->regs->wkup_en);
 -}
 -
  /*---------------------------------------------------------------------*/
  
  static int omap_mpuio_suspend_noirq(struct device *dev)
  {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct gpio_bank        *bank = platform_get_drvdata(pdev);
+       struct gpio_bank        *bank = dev_get_drvdata(dev);
        void __iomem            *mask_reg = bank->base +
                                        OMAP_MPUIO_GPIO_MASKIT / bank->stride;
        unsigned long           flags;
  
  static int omap_mpuio_resume_noirq(struct device *dev)
  {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct gpio_bank        *bank = platform_get_drvdata(pdev);
+       struct gpio_bank        *bank = dev_get_drvdata(dev);
        void __iomem            *mask_reg = bank->base +
                                        OMAP_MPUIO_GPIO_MASKIT / bank->stride;
        unsigned long           flags;
@@@ -1364,7 -1410,12 +1362,7 @@@ static int omap_gpio_probe(struct platf
                                omap_set_gpio_dataout_mask_multiple;
        }
  
 -      if (bank->quirks & OMAP_GPIO_QUIRK_DEFERRED_WKUP_EN) {
 -              bank->funcs.idle_enable_level_quirk =
 -                      omap4_gpio_enable_level_quirk;
 -              bank->funcs.idle_disable_level_quirk =
 -                      omap4_gpio_disable_level_quirk;
 -      } else if (bank->quirks & OMAP_GPIO_QUIRK_IDLE_REMOVE_TRIGGER) {
 +      if (bank->quirks & OMAP_GPIO_QUIRK_IDLE_REMOVE_TRIGGER) {
                bank->funcs.idle_enable_level_quirk =
                        omap2_gpio_enable_level_quirk;
                bank->funcs.idle_disable_level_quirk =
@@@ -1635,8 -1686,7 +1633,7 @@@ static void omap_gpio_restore_context(s
  
  static int __maybe_unused omap_gpio_runtime_suspend(struct device *dev)
  {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct gpio_bank *bank = platform_get_drvdata(pdev);
+       struct gpio_bank *bank = dev_get_drvdata(dev);
        unsigned long flags;
        int error = 0;
  
@@@ -1656,8 -1706,7 +1653,7 @@@ unlock
  
  static int __maybe_unused omap_gpio_runtime_resume(struct device *dev)
  {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct gpio_bank *bank = platform_get_drvdata(pdev);
+       struct gpio_bank *bank = dev_get_drvdata(dev);
        unsigned long flags;
        int error = 0;
  
@@@ -1753,7 -1802,8 +1749,7 @@@ static const struct omap_gpio_platform_
        .regs = &omap4_gpio_regs,
        .bank_width = 32,
        .dbck_flag = true,
 -      .quirks = OMAP_GPIO_QUIRK_IDLE_REMOVE_TRIGGER |
 -                OMAP_GPIO_QUIRK_DEFERRED_WKUP_EN,
 +      .quirks = OMAP_GPIO_QUIRK_IDLE_REMOVE_TRIGGER,
  };
  
  static const struct of_device_id omap_gpio_match[] = {
index 540166443c34d07a80c498622ab7425b5e0ee17e,905dc1916883cf6368aabfd6a2cc8151257127b0..83617fdc661d27012712a4591907335e8d7e5d14
@@@ -20,6 -20,7 +20,7 @@@
  #include <linux/module.h>
  #include <linux/of_platform.h>
  #include <linux/platform_data/pca953x.h>
+ #include <linux/regmap.h>
  #include <linux/regulator/consumer.h>
  #include <linux/slab.h>
  
@@@ -30,6 -31,8 +31,8 @@@
  #define PCA953X_INVERT                0x02
  #define PCA953X_DIRECTION     0x03
  
+ #define REG_ADDR_MASK         0x3f
+ #define REG_ADDR_EXT          0x40
  #define REG_ADDR_AI           0x80
  
  #define PCA957X_IN            0x00
@@@ -58,7 -61,7 +61,7 @@@
  #define PCA_GPIO_MASK         0x00FF
  
  #define PCAL_GPIO_MASK                0x1f
- #define PCAL_PINCTRL_MASK     0xe0
+ #define PCAL_PINCTRL_MASK     0x60
  
  #define PCA_INT                       0x0100
  #define PCA_PCAL              0x0200
@@@ -119,25 -122,27 +122,27 @@@ struct pca953x_reg_config 
        int direction;
        int output;
        int input;
+       int invert;
  };
  
  static const struct pca953x_reg_config pca953x_regs = {
        .direction = PCA953X_DIRECTION,
        .output = PCA953X_OUTPUT,
        .input = PCA953X_INPUT,
+       .invert = PCA953X_INVERT,
  };
  
  static const struct pca953x_reg_config pca957x_regs = {
        .direction = PCA957X_CFG,
        .output = PCA957X_OUT,
        .input = PCA957X_IN,
+       .invert = PCA957X_INVRT,
  };
  
  struct pca953x_chip {
        unsigned gpio_start;
-       u8 reg_output[MAX_BANK];
-       u8 reg_direction[MAX_BANK];
        struct mutex i2c_lock;
+       struct regmap *regmap;
  
  #ifdef CONFIG_GPIO_PCA953X_IRQ
        struct mutex irq_lock;
        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,
-                               int off)
+ static int pca953x_bank_shift(struct pca953x_chip *chip)
  {
-       int ret;
-       int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
-       int offset = off / BANK_SZ;
+       return fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
+ }
  
-       ret = i2c_smbus_read_byte_data(chip->client,
-                               (reg << bank_shift) + offset);
-       *val = ret;
+ #define PCA953x_BANK_INPUT    BIT(0)
+ #define PCA953x_BANK_OUTPUT   BIT(1)
+ #define PCA953x_BANK_POLARITY BIT(2)
+ #define PCA953x_BANK_CONFIG   BIT(3)
  
-       if (ret < 0) {
-               dev_err(&chip->client->dev, "failed reading register\n");
-               return ret;
+ #define PCA957x_BANK_INPUT    BIT(0)
+ #define PCA957x_BANK_POLARITY BIT(1)
+ #define PCA957x_BANK_BUSHOLD  BIT(2)
+ #define PCA957x_BANK_CONFIG   BIT(4)
+ #define PCA957x_BANK_OUTPUT   BIT(5)
+ #define PCAL9xxx_BANK_IN_LATCH        BIT(8 + 2)
+ #define PCAL9xxx_BANK_IRQ_MASK        BIT(8 + 5)
+ #define PCAL9xxx_BANK_IRQ_STAT        BIT(8 + 6)
+ /*
+  * We care about the following registers:
+  * - Standard set, below 0x40, each port can be replicated up to 8 times
+  *   - PCA953x standard
+  *     Input port                     0x00 + 0 * bank_size    R
+  *     Output port                    0x00 + 1 * bank_size    RW
+  *     Polarity Inversion port                0x00 + 2 * bank_size    RW
+  *     Configuration port             0x00 + 3 * bank_size    RW
+  *   - PCA957x with mixed up registers
+  *     Input port                     0x00 + 0 * bank_size    R
+  *     Polarity Inversion port                0x00 + 1 * bank_size    RW
+  *     Bus hold port                  0x00 + 2 * bank_size    RW
+  *     Configuration port             0x00 + 4 * bank_size    RW
+  *     Output port                    0x00 + 5 * bank_size    RW
+  *
+  * - Extended set, above 0x40, often chip specific.
+  *   - PCAL6524/PCAL9555A with custom PCAL IRQ handling:
+  *     Input latch register           0x40 + 2 * bank_size    RW
+  *     Interrupt mask register                0x40 + 5 * bank_size    RW
+  *     Interrupt status register      0x40 + 6 * bank_size    R
+  *
+  * - Registers with bit 0x80 set, the AI bit
+  *   The bit is cleared and the registers fall into one of the
+  *   categories above.
+  */
+ static bool pca953x_check_register(struct pca953x_chip *chip, unsigned int reg,
+                                  u32 checkbank)
+ {
+       int bank_shift = pca953x_bank_shift(chip);
+       int bank = (reg & REG_ADDR_MASK) >> bank_shift;
+       int offset = reg & (BIT(bank_shift) - 1);
+       /* Special PCAL extended register check. */
+       if (reg & REG_ADDR_EXT) {
+               if (!(chip->driver_data & PCA_PCAL))
+                       return false;
+               bank += 8;
        }
  
-       return 0;
+       /* Register is not in the matching bank. */
+       if (!(BIT(bank) & checkbank))
+               return false;
+       /* Register is not within allowed range of bank. */
+       if (offset >= NBANK(chip))
+               return false;
+       return true;
  }
  
- static int pca953x_write_single(struct pca953x_chip *chip, int reg, u32 val,
-                               int off)
+ static bool pca953x_readable_register(struct device *dev, unsigned int reg)
  {
-       int ret;
-       int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
-       int offset = off / BANK_SZ;
+       struct pca953x_chip *chip = dev_get_drvdata(dev);
+       u32 bank;
  
-       ret = i2c_smbus_write_byte_data(chip->client,
-                                       (reg << bank_shift) + offset, val);
+       if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE) {
+               bank = PCA953x_BANK_INPUT | PCA953x_BANK_OUTPUT |
+                      PCA953x_BANK_POLARITY | PCA953x_BANK_CONFIG;
+       } else {
+               bank = PCA957x_BANK_INPUT | PCA957x_BANK_OUTPUT |
+                      PCA957x_BANK_POLARITY | PCA957x_BANK_CONFIG |
+                      PCA957x_BANK_BUSHOLD;
+       }
  
-       if (ret < 0) {
-               dev_err(&chip->client->dev, "failed writing register\n");
-               return ret;
+       if (chip->driver_data & PCA_PCAL) {
+               bank |= PCAL9xxx_BANK_IN_LATCH | PCAL9xxx_BANK_IRQ_MASK |
+                       PCAL9xxx_BANK_IRQ_STAT;
        }
  
-       return 0;
+       return pca953x_check_register(chip, reg, bank);
  }
  
- static int pca953x_write_regs_8(struct pca953x_chip *chip, int reg, u8 *val)
+ static bool pca953x_writeable_register(struct device *dev, unsigned int reg)
  {
-       return i2c_smbus_write_byte_data(chip->client, reg, *val);
- }
+       struct pca953x_chip *chip = dev_get_drvdata(dev);
+       u32 bank;
  
- static int pca953x_write_regs_16(struct pca953x_chip *chip, int reg, u8 *val)
- {
-       u16 word = get_unaligned((u16 *)val);
+       if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE) {
+               bank = PCA953x_BANK_OUTPUT | PCA953x_BANK_POLARITY |
+                       PCA953x_BANK_CONFIG;
+       } else {
+               bank = PCA957x_BANK_OUTPUT | PCA957x_BANK_POLARITY |
+                       PCA957x_BANK_CONFIG | PCA957x_BANK_BUSHOLD;
+       }
  
-       return i2c_smbus_write_word_data(chip->client, reg << 1, word);
+       if (chip->driver_data & PCA_PCAL)
+               bank |= PCAL9xxx_BANK_IN_LATCH | PCAL9xxx_BANK_IRQ_MASK;
+       return pca953x_check_register(chip, reg, bank);
  }
  
- static int pca957x_write_regs_16(struct pca953x_chip *chip, int reg, u8 *val)
+ static bool pca953x_volatile_register(struct device *dev, unsigned int reg)
  {
-       int ret;
+       struct pca953x_chip *chip = dev_get_drvdata(dev);
+       u32 bank;
  
-       ret = i2c_smbus_write_byte_data(chip->client, reg << 1, val[0]);
-       if (ret < 0)
-               return ret;
+       if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE)
+               bank = PCA953x_BANK_INPUT;
+       else
+               bank = PCA957x_BANK_INPUT;
+       if (chip->driver_data & PCA_PCAL)
+               bank |= PCAL9xxx_BANK_IRQ_STAT;
  
-       return i2c_smbus_write_byte_data(chip->client, (reg << 1) + 1, val[1]);
+       return pca953x_check_register(chip, reg, bank);
  }
  
- static int pca953x_write_regs_24(struct pca953x_chip *chip, int reg, u8 *val)
+ const struct regmap_config pca953x_i2c_regmap = {
+       .reg_bits = 8,
+       .val_bits = 8,
+       .readable_reg = pca953x_readable_register,
+       .writeable_reg = pca953x_writeable_register,
+       .volatile_reg = pca953x_volatile_register,
+       .cache_type = REGCACHE_RBTREE,
+       .max_register = 0x7f,
+ };
+ static u8 pca953x_recalc_addr(struct pca953x_chip *chip, int reg, int off,
+                             bool write, bool addrinc)
  {
-       int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
+       int bank_shift = pca953x_bank_shift(chip);
        int addr = (reg & PCAL_GPIO_MASK) << bank_shift;
        int pinctrl = (reg & PCAL_PINCTRL_MASK) << 1;
+       u8 regaddr = pinctrl | addr | (off / BANK_SZ);
+       /* Single byte read doesn't need AI bit set. */
+       if (!addrinc)
+               return regaddr;
+       /* Chips with 24 and more GPIOs always support Auto Increment */
+       if (write && NBANK(chip) > 2)
+               regaddr |= REG_ADDR_AI;
  
-       return i2c_smbus_write_i2c_block_data(chip->client,
-                                             pinctrl | addr | REG_ADDR_AI,
-                                             NBANK(chip), val);
+       /* PCA9575 needs address-increment on multi-byte writes */
+       if (PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE)
+               regaddr |= REG_ADDR_AI;
+       return regaddr;
  }
  
  static int pca953x_write_regs(struct pca953x_chip *chip, int reg, u8 *val)
  {
-       int ret = 0;
+       u8 regaddr = pca953x_recalc_addr(chip, reg, 0, true, true);
+       int ret;
  
-       ret = chip->write_regs(chip, reg, val);
+       ret = regmap_bulk_write(chip->regmap, regaddr, val, NBANK(chip));
        if (ret < 0) {
                dev_err(&chip->client->dev, "failed writing register\n");
                return ret;
        return 0;
  }
  
- static int pca953x_read_regs_8(struct pca953x_chip *chip, int reg, u8 *val)
- {
-       int ret;
-       ret = i2c_smbus_read_byte_data(chip->client, reg);
-       *val = ret;
-       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);
-       put_unaligned(ret, (u16 *)val);
-       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);
-       int addr = (reg & PCAL_GPIO_MASK) << bank_shift;
-       int pinctrl = (reg & PCAL_PINCTRL_MASK) << 1;
-       return i2c_smbus_read_i2c_block_data(chip->client,
-                                            pinctrl | addr | REG_ADDR_AI,
-                                            NBANK(chip), val);
- }
  static int pca953x_read_regs(struct pca953x_chip *chip, int reg, u8 *val)
  {
+       u8 regaddr = pca953x_recalc_addr(chip, reg, 0, false, true);
        int ret;
  
-       ret = chip->read_regs(chip, reg, val);
+       ret = regmap_bulk_read(chip->regmap, regaddr, val, NBANK(chip));
        if (ret < 0) {
                dev_err(&chip->client->dev, "failed reading register\n");
                return ret;
  static int pca953x_gpio_direction_input(struct gpio_chip *gc, unsigned off)
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
-       u8 reg_val;
+       u8 dirreg = pca953x_recalc_addr(chip, chip->regs->direction, off,
+                                       true, false);
+       u8 bit = BIT(off % BANK_SZ);
        int ret;
  
        mutex_lock(&chip->i2c_lock);
-       reg_val = chip->reg_direction[off / BANK_SZ] | (1u << (off % BANK_SZ));
-       ret = pca953x_write_single(chip, chip->regs->direction, reg_val, off);
-       if (ret)
-               goto exit;
-       chip->reg_direction[off / BANK_SZ] = reg_val;
- exit:
+       ret = regmap_write_bits(chip->regmap, dirreg, bit, bit);
        mutex_unlock(&chip->i2c_lock);
        return ret;
  }
@@@ -310,31 -370,21 +370,21 @@@ static int pca953x_gpio_direction_outpu
                unsigned off, int val)
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
-       u8 reg_val;
+       u8 dirreg = pca953x_recalc_addr(chip, chip->regs->direction, off,
+                                       true, false);
+       u8 outreg = pca953x_recalc_addr(chip, chip->regs->output, off,
+                                       true, false);
+       u8 bit = BIT(off % BANK_SZ);
        int ret;
  
        mutex_lock(&chip->i2c_lock);
        /* set output level */
-       if (val)
-               reg_val = chip->reg_output[off / BANK_SZ]
-                       | (1u << (off % BANK_SZ));
-       else
-               reg_val = chip->reg_output[off / BANK_SZ]
-                       & ~(1u << (off % BANK_SZ));
-       ret = pca953x_write_single(chip, chip->regs->output, reg_val, off);
+       ret = regmap_write_bits(chip->regmap, outreg, bit, val ? bit : 0);
        if (ret)
                goto exit;
  
-       chip->reg_output[off / BANK_SZ] = reg_val;
        /* then direction */
-       reg_val = chip->reg_direction[off / BANK_SZ] & ~(1u << (off % BANK_SZ));
-       ret = pca953x_write_single(chip, chip->regs->direction, reg_val, off);
-       if (ret)
-               goto exit;
-       chip->reg_direction[off / BANK_SZ] = reg_val;
+       ret = regmap_write_bits(chip->regmap, dirreg, bit, 0);
  exit:
        mutex_unlock(&chip->i2c_lock);
        return ret;
  static int pca953x_gpio_get_value(struct gpio_chip *gc, unsigned off)
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
+       u8 inreg = pca953x_recalc_addr(chip, chip->regs->input, off,
+                                      true, false);
+       u8 bit = BIT(off % BANK_SZ);
        u32 reg_val;
        int ret;
  
        mutex_lock(&chip->i2c_lock);
-       ret = pca953x_read_single(chip, chip->regs->input, &reg_val, off);
+       ret = regmap_read(chip->regmap, inreg, &reg_val);
        mutex_unlock(&chip->i2c_lock);
        if (ret < 0) {
                /* NOTE:  diagnostic already emitted; that's all we should
                return 0;
        }
  
-       return (reg_val & (1u << (off % BANK_SZ))) ? 1 : 0;
+       return !!(reg_val & bit);
  }
  
  static void pca953x_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
-       u8 reg_val;
-       int ret;
+       u8 outreg = pca953x_recalc_addr(chip, chip->regs->output, off,
+                                       true, false);
+       u8 bit = BIT(off % BANK_SZ);
  
        mutex_lock(&chip->i2c_lock);
-       if (val)
-               reg_val = chip->reg_output[off / BANK_SZ]
-                       | (1u << (off % BANK_SZ));
-       else
-               reg_val = chip->reg_output[off / BANK_SZ]
-                       & ~(1u << (off % BANK_SZ));
-       ret = pca953x_write_single(chip, chip->regs->output, reg_val, off);
-       if (ret)
-               goto exit;
-       chip->reg_output[off / BANK_SZ] = reg_val;
- exit:
+       regmap_write_bits(chip->regmap, outreg, bit, val ? bit : 0);
        mutex_unlock(&chip->i2c_lock);
  }
  
  static int pca953x_gpio_get_direction(struct gpio_chip *gc, unsigned off)
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
+       u8 dirreg = pca953x_recalc_addr(chip, chip->regs->direction, off,
+                                       true, false);
+       u8 bit = BIT(off % BANK_SZ);
        u32 reg_val;
        int ret;
  
        mutex_lock(&chip->i2c_lock);
-       ret = pca953x_read_single(chip, chip->regs->direction, &reg_val, off);
+       ret = regmap_read(chip->regmap, dirreg, &reg_val);
        mutex_unlock(&chip->i2c_lock);
        if (ret < 0)
                return ret;
  
-       return !!(reg_val & (1u << (off % BANK_SZ)));
+       return !!(reg_val & bit);
  }
  
  static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
  {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
        unsigned int bank_mask, bank_val;
-       int bank_shift, bank;
+       int bank;
        u8 reg_val[MAX_BANK];
        int ret;
  
-       bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
        mutex_lock(&chip->i2c_lock);
-       memcpy(reg_val, chip->reg_output, NBANK(chip));
+       ret = pca953x_read_regs(chip, chip->regs->output, reg_val);
+       if (ret)
+               goto exit;
        for (bank = 0; bank < NBANK(chip); bank++) {
                bank_mask = mask[bank / sizeof(*mask)] >>
                           ((bank % sizeof(*mask)) * 8);
                }
        }
  
-       ret = i2c_smbus_write_i2c_block_data(chip->client,
-                                            chip->regs->output << bank_shift,
-                                            NBANK(chip), reg_val);
-       if (ret)
-               goto exit;
-       memcpy(chip->reg_output, reg_val, NBANK(chip));
+       pca953x_write_regs(chip, chip->regs->output, reg_val);
  exit:
        mutex_unlock(&chip->i2c_lock);
  }
@@@ -449,7 -489,7 +489,7 @@@ static void pca953x_setup_gpio(struct p
  
        gc->base = chip->gpio_start;
        gc->ngpio = gpios;
 -      gc->label = chip->client->name;
 +      gc->label = dev_name(&chip->client->dev);
        gc->parent = &chip->client->dev;
        gc->owner = THIS_MODULE;
        gc->names = chip->names;
@@@ -487,6 -527,10 +527,10 @@@ static void pca953x_irq_bus_sync_unlock
        u8 new_irqs;
        int level, i;
        u8 invert_irq_mask[MAX_BANK];
+       int reg_direction[MAX_BANK];
+       regmap_bulk_read(chip->regmap, chip->regs->direction, reg_direction,
+                        NBANK(chip));
  
        if (chip->driver_data & PCA_PCAL) {
                /* Enable latch on interrupt-enabled inputs */
        /* Look for any newly setup interrupt */
        for (i = 0; i < NBANK(chip); i++) {
                new_irqs = chip->irq_trig_fall[i] | chip->irq_trig_raise[i];
-               new_irqs &= ~chip->reg_direction[i];
+               new_irqs &= reg_direction[i];
  
                while (new_irqs) {
                        level = __ffs(new_irqs);
@@@ -567,6 -611,7 +611,7 @@@ static bool pca953x_irq_pending(struct 
        bool pending_seen = false;
        bool trigger_seen = false;
        u8 trigger[MAX_BANK];
+       int reg_direction[MAX_BANK];
        int ret, i;
  
        if (chip->driver_data & PCA_PCAL) {
                return false;
  
        /* Remove output pins from the equation */
+       regmap_bulk_read(chip->regmap, chip->regs->direction, reg_direction,
+                        NBANK(chip));
        for (i = 0; i < NBANK(chip); i++)
-               cur_stat[i] &= chip->reg_direction[i];
+               cur_stat[i] &= reg_direction[i];
  
        memcpy(old_stat, chip->irq_stat, NBANK(chip));
  
@@@ -652,6 -699,7 +699,7 @@@ static int pca953x_irq_setup(struct pca
                             int irq_base)
  {
        struct i2c_client *client = chip->client;
+       int reg_direction[MAX_BANK];
        int ret, i;
  
        if (client->irq && irq_base != -1
                 * interrupt.  We have to rely on the previous read for
                 * this purpose.
                 */
+               regmap_bulk_read(chip->regmap, chip->regs->direction,
+                                reg_direction, NBANK(chip));
                for (i = 0; i < NBANK(chip); i++)
-                       chip->irq_stat[i] &= chip->reg_direction[i];
+                       chip->irq_stat[i] &= reg_direction[i];
                mutex_init(&chip->irq_lock);
  
                ret = devm_request_threaded_irq(&client->dev,
@@@ -715,20 -765,19 +765,19 @@@ static int pca953x_irq_setup(struct pca
  }
  #endif
  
- static int device_pca953x_init(struct pca953x_chip *chip, u32 invert)
+ static int device_pca95xx_init(struct pca953x_chip *chip, u32 invert)
  {
        int ret;
        u8 val[MAX_BANK];
  
-       chip->regs = &pca953x_regs;
-       ret = pca953x_read_regs(chip, chip->regs->output, chip->reg_output);
-       if (ret)
+       ret = regcache_sync_region(chip->regmap, chip->regs->output,
+                                  chip->regs->output + NBANK(chip));
+       if (ret != 0)
                goto out;
  
-       ret = pca953x_read_regs(chip, chip->regs->direction,
-                               chip->reg_direction);
-       if (ret)
+       ret = regcache_sync_region(chip->regmap, chip->regs->direction,
+                                  chip->regs->direction + NBANK(chip));
+       if (ret != 0)
                goto out;
  
        /* set platform specific polarity inversion */
        else
                memset(val, 0, NBANK(chip));
  
-       ret = pca953x_write_regs(chip, PCA953X_INVERT, val);
+       ret = pca953x_write_regs(chip, chip->regs->invert, val);
  out:
        return ret;
  }
@@@ -747,22 -796,7 +796,7 @@@ static int device_pca957x_init(struct p
        int ret;
        u8 val[MAX_BANK];
  
-       chip->regs = &pca957x_regs;
-       ret = pca953x_read_regs(chip, chip->regs->output, chip->reg_output);
-       if (ret)
-               goto out;
-       ret = pca953x_read_regs(chip, chip->regs->direction,
-                               chip->reg_direction);
-       if (ret)
-               goto out;
-       /* set platform specific polarity inversion */
-       if (invert)
-               memset(val, 0xFF, NBANK(chip));
-       else
-               memset(val, 0, NBANK(chip));
-       ret = pca953x_write_regs(chip, PCA957X_INVRT, val);
+       ret = device_pca95xx_init(chip, invert);
        if (ret)
                goto out;
  
@@@ -853,6 -887,16 +887,16 @@@ static int pca953x_probe(struct i2c_cli
                }
        }
  
+       i2c_set_clientdata(client, chip);
+       chip->regmap = devm_regmap_init_i2c(client, &pca953x_i2c_regmap);
+       if (IS_ERR(chip->regmap)) {
+               ret = PTR_ERR(chip->regmap);
+               goto err_exit;
+       }
+       regcache_mark_dirty(chip->regmap);
        mutex_init(&chip->i2c_lock);
        /*
         * In case we have an i2c-mux controlled by a GPIO provided by an
         */
        pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK);
  
-       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;
+       if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE) {
+               chip->regs = &pca953x_regs;
+               ret = device_pca95xx_init(chip, invert);
        } 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
+               chip->regs = &pca957x_regs;
                ret = device_pca957x_init(chip, invert);
+       }
        if (ret)
                goto err_exit;
  
                        dev_warn(&client->dev, "setup failed, %d\n", ret);
        }
  
-       i2c_set_clientdata(client, chip);
        return 0;
  
  err_exit:
@@@ -943,6 -975,91 +975,91 @@@ static int pca953x_remove(struct i2c_cl
        return ret;
  }
  
+ #ifdef CONFIG_PM_SLEEP
+ static int pca953x_regcache_sync(struct device *dev)
+ {
+       struct pca953x_chip *chip = dev_get_drvdata(dev);
+       int ret;
+       /*
+        * The ordering between direction and output is important,
+        * sync these registers first and only then sync the rest.
+        */
+       ret = regcache_sync_region(chip->regmap, chip->regs->direction,
+                                  chip->regs->direction + NBANK(chip));
+       if (ret != 0) {
+               dev_err(dev, "Failed to sync GPIO dir registers: %d\n", ret);
+               return ret;
+       }
+       ret = regcache_sync_region(chip->regmap, chip->regs->output,
+                                  chip->regs->output + NBANK(chip));
+       if (ret != 0) {
+               dev_err(dev, "Failed to sync GPIO out registers: %d\n", ret);
+               return ret;
+       }
+ #ifdef CONFIG_GPIO_PCA953X_IRQ
+       if (chip->driver_data & PCA_PCAL) {
+               ret = regcache_sync_region(chip->regmap, PCAL953X_IN_LATCH,
+                                          PCAL953X_IN_LATCH + NBANK(chip));
+               if (ret != 0) {
+                       dev_err(dev, "Failed to sync INT latch registers: %d\n",
+                               ret);
+                       return ret;
+               }
+               ret = regcache_sync_region(chip->regmap, PCAL953X_INT_MASK,
+                                          PCAL953X_INT_MASK + NBANK(chip));
+               if (ret != 0) {
+                       dev_err(dev, "Failed to sync INT mask registers: %d\n",
+                               ret);
+                       return ret;
+               }
+       }
+ #endif
+       return 0;
+ }
+ static int pca953x_suspend(struct device *dev)
+ {
+       struct pca953x_chip *chip = dev_get_drvdata(dev);
+       regcache_cache_only(chip->regmap, true);
+       regulator_disable(chip->regulator);
+       return 0;
+ }
+ static int pca953x_resume(struct device *dev)
+ {
+       struct pca953x_chip *chip = dev_get_drvdata(dev);
+       int ret;
+       ret = regulator_enable(chip->regulator);
+       if (ret != 0) {
+               dev_err(dev, "Failed to enable regulator: %d\n", ret);
+               return 0;
+       }
+       regcache_cache_only(chip->regmap, false);
+       regcache_mark_dirty(chip->regmap);
+       ret = pca953x_regcache_sync(dev);
+       if (ret)
+               return ret;
+       ret = regcache_sync(chip->regmap);
+       if (ret != 0) {
+               dev_err(dev, "Failed to restore register map: %d\n", ret);
+               return ret;
+       }
+       return 0;
+ }
+ #endif
  /* convenience to stop overlong match-table lines */
  #define OF_953X(__nrgpio, __int) (void *)(__nrgpio | PCA953X_TYPE | __int)
  #define OF_957X(__nrgpio, __int) (void *)(__nrgpio | PCA957X_TYPE | __int)
@@@ -986,9 -1103,12 +1103,12 @@@ static const struct of_device_id pca953
  
  MODULE_DEVICE_TABLE(of, pca953x_dt_ids);
  
+ static SIMPLE_DEV_PM_OPS(pca953x_pm_ops, pca953x_suspend, pca953x_resume);
  static struct i2c_driver pca953x_driver = {
        .driver = {
                .name   = "pca953x",
+               .pm     = &pca953x_pm_ops,
                .of_match_table = pca953x_dt_ids,
                .acpi_match_table = ACPI_PTR(pca953x_acpi_ids),
        },
index 7f93954c58ea47f3be84c0955d6887f45fac5c25,d7ac8b9ab7c9a82f53f82a28780b4bd4f5fb76c4..48534bda73d39eb90e6ffde1a305e32582f8ef51
  
  #include "gpiolib.h"
  
 +/**
 + * struct acpi_gpio_event - ACPI GPIO event handler data
 + *
 + * @node:       list-entry of the events list of the struct acpi_gpio_chip
 + * @handle:     handle of ACPI method to execute when the IRQ triggers
 + * @handler:    irq_handler to pass to request_irq when requesting the IRQ
 + * @pin:        GPIO pin number on the gpio_chip
 + * @irq:        Linux IRQ number for the event, for request_ / free_irq
 + * @irqflags:     flags to pass to request_irq when requesting the IRQ
 + * @irq_is_wake:  If the ACPI flags indicate the IRQ is a wakeup source
 + * @is_requested: True if request_irq has been done
 + * @desc:       gpio_desc for the GPIO pin for this event
 + */
  struct acpi_gpio_event {
        struct list_head node;
        acpi_handle handle;
 +      irq_handler_t handler;
        unsigned int pin;
        unsigned int irq;
 +      unsigned long irqflags;
 +      bool irq_is_wake;
 +      bool irq_requested;
        struct gpio_desc *desc;
  };
  
@@@ -66,10 -49,10 +66,10 @@@ struct acpi_gpio_chip 
  
  /*
   * For gpiochips which call acpi_gpiochip_request_interrupts() before late_init
 - * (so builtin drivers) we register the ACPI GpioInt event handlers from a
 + * (so builtin drivers) we register the ACPI GpioInt IRQ handlers from a
   * late_initcall_sync handler, so that other builtin drivers can register their
   * OpRegions before the event handlers can run.  This list contains gpiochips
 - * for which the acpi_gpiochip_request_interrupts() has been deferred.
 + * for which the acpi_gpiochip_request_irqs() call has been deferred.
   */
  static DEFINE_MUTEX(acpi_gpio_deferred_req_irqs_lock);
  static LIST_HEAD(acpi_gpio_deferred_req_irqs_list);
@@@ -150,42 -133,8 +150,42 @@@ bool acpi_gpio_get_irq_resource(struct 
  }
  EXPORT_SYMBOL_GPL(acpi_gpio_get_irq_resource);
  
 -static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
 -                                                 void *context)
 +static void acpi_gpiochip_request_irq(struct acpi_gpio_chip *acpi_gpio,
 +                                    struct acpi_gpio_event *event)
 +{
 +      int ret, value;
 +
 +      ret = request_threaded_irq(event->irq, NULL, event->handler,
 +                                 event->irqflags, "ACPI:Event", event);
 +      if (ret) {
 +              dev_err(acpi_gpio->chip->parent,
 +                      "Failed to setup interrupt handler for %d\n",
 +                      event->irq);
 +              return;
 +      }
 +
 +      if (event->irq_is_wake)
 +              enable_irq_wake(event->irq);
 +
 +      event->irq_requested = true;
 +
 +      /* Make sure we trigger the initial state of edge-triggered IRQs */
 +      value = gpiod_get_raw_value_cansleep(event->desc);
 +      if (((event->irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
 +          ((event->irqflags & IRQF_TRIGGER_FALLING) && value == 0))
 +              event->handler(event->irq, event);
 +}
 +
 +static void acpi_gpiochip_request_irqs(struct acpi_gpio_chip *acpi_gpio)
 +{
 +      struct acpi_gpio_event *event;
 +
 +      list_for_each_entry(event, &acpi_gpio->events, node)
 +              acpi_gpiochip_request_irq(acpi_gpio, event);
 +}
 +
 +static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares,
 +                                           void *context)
  {
        struct acpi_gpio_chip *acpi_gpio = context;
        struct gpio_chip *chip = acpi_gpio->chip;
        struct acpi_gpio_event *event;
        irq_handler_t handler = NULL;
        struct gpio_desc *desc;
 -      unsigned long irqflags;
 -      int ret, pin, irq, value;
 +      int ret, pin, irq;
  
        if (!acpi_gpio_get_irq_resource(ares, &agpio))
                return AE_OK;
        if (!handler)
                return AE_OK;
  
-       desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
+       desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event", 0);
        if (IS_ERR(desc)) {
                dev_err(chip->parent, "Failed to request GPIO\n");
                return AE_ERROR;
  
        gpiod_direction_input(desc);
  
 -      value = gpiod_get_value_cansleep(desc);
 -
        ret = gpiochip_lock_as_irq(chip, pin);
        if (ret) {
                dev_err(chip->parent, "Failed to lock GPIO as interrupt\n");
                goto fail_unlock_irq;
        }
  
 -      irqflags = IRQF_ONESHOT;
 +      event = kzalloc(sizeof(*event), GFP_KERNEL);
 +      if (!event)
 +              goto fail_unlock_irq;
 +
 +      event->irqflags = IRQF_ONESHOT;
        if (agpio->triggering == ACPI_LEVEL_SENSITIVE) {
                if (agpio->polarity == ACPI_ACTIVE_HIGH)
 -                      irqflags |= IRQF_TRIGGER_HIGH;
 +                      event->irqflags |= IRQF_TRIGGER_HIGH;
                else
 -                      irqflags |= IRQF_TRIGGER_LOW;
 +                      event->irqflags |= IRQF_TRIGGER_LOW;
        } else {
                switch (agpio->polarity) {
                case ACPI_ACTIVE_HIGH:
 -                      irqflags |= IRQF_TRIGGER_RISING;
 +                      event->irqflags |= IRQF_TRIGGER_RISING;
                        break;
                case ACPI_ACTIVE_LOW:
 -                      irqflags |= IRQF_TRIGGER_FALLING;
 +                      event->irqflags |= IRQF_TRIGGER_FALLING;
                        break;
                default:
 -                      irqflags |= IRQF_TRIGGER_RISING |
 -                                  IRQF_TRIGGER_FALLING;
 +                      event->irqflags |= IRQF_TRIGGER_RISING |
 +                                         IRQF_TRIGGER_FALLING;
                        break;
                }
        }
  
 -      event = kzalloc(sizeof(*event), GFP_KERNEL);
 -      if (!event)
 -              goto fail_unlock_irq;
 -
        event->handle = evt_handle;
 +      event->handler = handler;
        event->irq = irq;
 +      event->irq_is_wake = agpio->wake_capable == ACPI_WAKE_CAPABLE;
        event->pin = pin;
        event->desc = desc;
  
 -      ret = request_threaded_irq(event->irq, NULL, handler, irqflags,
 -                                 "ACPI:Event", event);
 -      if (ret) {
 -              dev_err(chip->parent,
 -                      "Failed to setup interrupt handler for %d\n",
 -                      event->irq);
 -              goto fail_free_event;
 -      }
 -
 -      if (agpio->wake_capable == ACPI_WAKE_CAPABLE)
 -              enable_irq_wake(irq);
 -
        list_add_tail(&event->node, &acpi_gpio->events);
  
 -      /*
 -       * Make sure we trigger the initial state of the IRQ when using RISING
 -       * or FALLING.  Note we run the handlers on late_init, the AML code
 -       * may refer to OperationRegions from other (builtin) drivers which
 -       * may be probed after us.
 -       */
 -      if (((irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
 -          ((irqflags & IRQF_TRIGGER_FALLING) && value == 0))
 -              handler(event->irq, event);
 -
        return AE_OK;
  
 -fail_free_event:
 -      kfree(event);
  fail_unlock_irq:
        gpiochip_unlock_as_irq(chip, pin);
  fail_free_desc:
@@@ -309,9 -283,6 +309,9 @@@ void acpi_gpiochip_request_interrupts(s
        if (ACPI_FAILURE(status))
                return;
  
 +      acpi_walk_resources(handle, "_AEI",
 +                          acpi_gpiochip_alloc_event, acpi_gpio);
 +
        mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
        defer = !acpi_gpio_deferred_req_irqs_done;
        if (defer)
        if (defer)
                return;
  
 -      acpi_walk_resources(handle, "_AEI",
 -                          acpi_gpiochip_request_interrupt, acpi_gpio);
 +      acpi_gpiochip_request_irqs(acpi_gpio);
  }
  EXPORT_SYMBOL_GPL(acpi_gpiochip_request_interrupts);
  
@@@ -359,13 -331,10 +359,13 @@@ void acpi_gpiochip_free_interrupts(stru
        list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {
                struct gpio_desc *desc;
  
 -              if (irqd_is_wakeup_set(irq_get_irq_data(event->irq)))
 -                      disable_irq_wake(event->irq);
 +              if (event->irq_requested) {
 +                      if (event->irq_is_wake)
 +                              disable_irq_wake(event->irq);
 +
 +                      free_irq(event->irq, event);
 +              }
  
 -              free_irq(event->irq, event);
                desc = event->desc;
                if (WARN_ON(IS_ERR(desc)))
                        continue;
@@@ -913,23 -882,15 +913,15 @@@ acpi_gpio_adr_space_handler(u32 functio
                if (!found) {
                        enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio);
                        const char *label = "ACPI:OpRegion";
-                       int err;
  
-                       desc = gpiochip_request_own_desc(chip, pin, label);
+                       desc = gpiochip_request_own_desc(chip, pin, label,
+                                                        flags);
                        if (IS_ERR(desc)) {
                                status = AE_ERROR;
                                mutex_unlock(&achip->conn_lock);
                                goto out;
                        }
  
-                       err = gpiod_configure_flags(desc, label, 0, flags);
-                       if (err < 0) {
-                               status = AE_NOT_CONFIGURED;
-                               gpiochip_free_own_desc(desc);
-                               mutex_unlock(&achip->conn_lock);
-                               goto out;
-                       }
                        conn = kzalloc(sizeof(*conn), GFP_KERNEL);
                        if (!conn) {
                                status = AE_NO_MEMORY;
@@@ -1231,16 -1192,23 +1223,16 @@@ bool acpi_can_fallback_to_crs(struct ac
        return con_id == NULL;
  }
  
 -/* Run deferred acpi_gpiochip_request_interrupts() */
 -static int acpi_gpio_handle_deferred_request_interrupts(void)
 +/* Run deferred acpi_gpiochip_request_irqs() */
 +static int acpi_gpio_handle_deferred_request_irqs(void)
  {
        struct acpi_gpio_chip *acpi_gpio, *tmp;
  
        mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
        list_for_each_entry_safe(acpi_gpio, tmp,
                                 &acpi_gpio_deferred_req_irqs_list,
 -                               deferred_req_irqs_list_entry) {
 -              acpi_handle handle;
 -
 -              handle = ACPI_HANDLE(acpi_gpio->chip->parent);
 -              acpi_walk_resources(handle, "_AEI",
 -                                  acpi_gpiochip_request_interrupt, acpi_gpio);
 -
 -              list_del_init(&acpi_gpio->deferred_req_irqs_list_entry);
 -      }
 +                               deferred_req_irqs_list_entry)
 +              acpi_gpiochip_request_irqs(acpi_gpio);
  
        acpi_gpio_deferred_req_irqs_done = true;
        mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
        return 0;
  }
  /* We must use _sync so that this runs after the first deferred_probe run */
 -late_initcall_sync(acpi_gpio_handle_deferred_request_interrupts);
 +late_initcall_sync(acpi_gpio_handle_deferred_request_irqs);
diff --combined drivers/gpio/gpiolib.c
index 985c09ce80fbc45a2e74f54b2d9cd0cba1a8a828,2ec8b0d2096aa35bbbb87eee660605736cc287a4..1651d7f0a303c3e7ea77f3924e83751dd9a41d47
@@@ -1295,7 -1295,7 +1295,7 @@@ int gpiochip_add_data_with_key(struct g
        gdev->descs = kcalloc(chip->ngpio, sizeof(gdev->descs[0]), GFP_KERNEL);
        if (!gdev->descs) {
                status = -ENOMEM;
 -              goto err_free_gdev;
 +              goto err_free_ida;
        }
  
        if (chip->ngpio == 0) {
@@@ -1427,9 -1427,8 +1427,9 @@@ err_free_label
        kfree_const(gdev->label);
  err_free_descs:
        kfree(gdev->descs);
 -err_free_gdev:
 +err_free_ida:
        ida_simple_remove(&gpio_ida, gdev->id);
 +err_free_gdev:
        /* failures here can mean systems won't boot... */
        pr_err("%s: GPIOs %d..%d (%s) failed to register, %d\n", __func__,
               gdev->base, gdev->base + gdev->ngpio - 1,
@@@ -1512,19 -1511,6 +1512,6 @@@ static void devm_gpio_chip_release(stru
        gpiochip_remove(chip);
  }
  
- static int devm_gpio_chip_match(struct device *dev, void *res, void *data)
- {
-       struct gpio_chip **r = res;
-       if (!r || !*r) {
-               WARN_ON(!r || !*r);
-               return 0;
-       }
-       return *r == data;
- }
  /**
   * devm_gpiochip_add_data() - Resource manager gpiochip_add_data()
   * @dev: pointer to the device that gpio_chip belongs to.
@@@ -1564,23 -1550,6 +1551,6 @@@ int devm_gpiochip_add_data(struct devic
  }
  EXPORT_SYMBOL_GPL(devm_gpiochip_add_data);
  
- /**
-  * devm_gpiochip_remove() - Resource manager of gpiochip_remove()
-  * @dev: device for which which resource was allocated
-  * @chip: the chip to remove
-  *
-  * A gpio_chip with any GPIOs still requested may not be removed.
-  */
- void devm_gpiochip_remove(struct device *dev, struct gpio_chip *chip)
- {
-       int ret;
-       ret = devres_release(dev, devm_gpio_chip_release,
-                            devm_gpio_chip_match, chip);
-       WARN_ON(ret);
- }
- EXPORT_SYMBOL_GPL(devm_gpiochip_remove);
  /**
   * gpiochip_find() - iterator for locating a specific gpio_chip
   * @data: data to pass to match function
@@@ -2299,6 -2268,12 +2269,12 @@@ static int gpiod_request_commit(struct 
        unsigned long           flags;
        unsigned                offset;
  
+       if (label) {
+               label = kstrdup_const(label, GFP_KERNEL);
+               if (!label)
+                       return -ENOMEM;
+       }
        spin_lock_irqsave(&gpio_lock, flags);
  
        /* NOTE:  gpio_request() can be called in early boot,
                desc_set_label(desc, label ? : "?");
                status = 0;
        } else {
+               kfree_const(label);
                status = -EBUSY;
                goto done;
        }
  
                if (status < 0) {
                        desc_set_label(desc, NULL);
+                       kfree_const(label);
                        clear_bit(FLAG_REQUESTED, &desc->flags);
                        goto done;
                }
@@@ -2420,6 -2397,7 +2398,7 @@@ static bool gpiod_free_commit(struct gp
                        chip->free(chip, gpio_chip_hwgpio(desc));
                        spin_lock_irqsave(&gpio_lock, flags);
                }
+               kfree_const(desc->label);
                desc_set_label(desc, NULL);
                clear_bit(FLAG_ACTIVE_LOW, &desc->flags);
                clear_bit(FLAG_REQUESTED, &desc->flags);
@@@ -2476,6 -2454,7 +2455,7 @@@ EXPORT_SYMBOL_GPL(gpiochip_is_requested
   * @chip: GPIO chip
   * @hwnum: hardware number of the GPIO for which to request the descriptor
   * @label: label for the GPIO
+  * @flags: flags for this GPIO or 0 if default
   *
   * Function allows GPIO chip drivers to request and use their own GPIO
   * descriptors via gpiolib API. Difference to gpiod_request() is that this
   * code on failure.
   */
  struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
-                                           const char *label)
+                                           const char *label,
+                                           enum gpiod_flags flags)
  {
        struct gpio_desc *desc = gpiochip_get_desc(chip, hwnum);
        int err;
        if (err < 0)
                return ERR_PTR(err);
  
+       err = gpiod_configure_flags(desc, label, 0, flags);
+       if (err) {
+               chip_err(chip, "setup of own GPIO %s failed\n", label);
+               gpiod_free_commit(desc);
+               return ERR_PTR(err);
+       }
        return desc;
  }
  EXPORT_SYMBOL_GPL(gpiochip_request_own_desc);
@@@ -3375,11 -3362,19 +3363,19 @@@ EXPORT_SYMBOL_GPL(gpiod_cansleep)
   * @desc: gpio to set the consumer name on
   * @name: the new consumer name
   */
void gpiod_set_consumer_name(struct gpio_desc *desc, const char *name)
int gpiod_set_consumer_name(struct gpio_desc *desc, const char *name)
  {
-       VALIDATE_DESC_VOID(desc);
-       /* Just overwrite whatever the previous name was */
-       desc->label = name;
+       VALIDATE_DESC(desc);
+       if (name) {
+               name = kstrdup_const(name, GFP_KERNEL);
+               if (!name)
+                       return -ENOMEM;
+       }
+       kfree_const(desc->label);
+       desc_set_label(desc, name);
+       return 0;
  }
  EXPORT_SYMBOL_GPL(gpiod_set_consumer_name);
  
@@@ -4205,8 -4200,6 +4201,8 @@@ struct gpio_desc *gpiod_get_from_of_nod
        transitory = flags & OF_GPIO_TRANSITORY;
  
        ret = gpiod_request(desc, label);
 +      if (ret == -EBUSY && (flags & GPIOD_FLAGS_BIT_NONEXCLUSIVE))
 +              return desc;
        if (ret)
                return ERR_PTR(ret);
  
@@@ -4348,7 -4341,15 +4344,15 @@@ int gpiod_hog(struct gpio_desc *desc, c
        chip = gpiod_to_chip(desc);
        hwnum = gpio_chip_hwgpio(desc);
  
-       local_desc = gpiochip_request_own_desc(chip, hwnum, name);
+       /*
+        * FIXME: not very elegant that we call gpiod_configure_flags()
+        * twice here (once inside gpiochip_request_own_desc() and
+        * again here), but the gpiochip_request_own_desc() is external
+        * and cannot really pass the lflags so this is the lesser evil
+        * at the moment. Pass zero as dflags on this first call so we
+        * don't screw anything up.
+        */
+       local_desc = gpiochip_request_own_desc(chip, hwnum, name, 0);
        if (IS_ERR(local_desc)) {
                status = PTR_ERR(local_desc);
                pr_err("requesting hog GPIO %s (chip %s, offset %d) failed, %d\n",
index 8aebcf822082ea84ecbd7dafeecde7be662d1f00,3b01fbcafc945132ecf87e949a6f051c6c1a54e7..9ddcf50a3c5924ad754d40029a3b0dd707ac556f
@@@ -104,7 -104,6 +104,7 @@@ struct gpio_descs *__must_chec
  devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
                              enum gpiod_flags flags);
  void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
 +void devm_gpiod_unhinge(struct device *dev, struct gpio_desc *desc);
  void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs);
  
  int gpiod_get_direction(struct gpio_desc *desc);
@@@ -163,7 -162,7 +163,7 @@@ int gpiod_is_active_low(const struct gp
  int gpiod_cansleep(const struct gpio_desc *desc);
  
  int gpiod_to_irq(const struct gpio_desc *desc);
void gpiod_set_consumer_name(struct gpio_desc *desc, const char *name);
int gpiod_set_consumer_name(struct gpio_desc *desc, const char *name);
  
  /* Convert between the old gpio_ and new gpiod_ interfaces */
  struct gpio_desc *gpio_to_desc(unsigned gpio);
@@@ -173,10 -172,6 +173,10 @@@ int desc_to_gpio(const struct gpio_des
  struct device_node;
  struct fwnode_handle;
  
 +struct gpio_desc *gpiod_get_from_of_node(struct device_node *node,
 +                                       const char *propname, int index,
 +                                       enum gpiod_flags dflags,
 +                                       const char *label);
  struct gpio_desc *devm_gpiod_get_from_of_node(struct device *dev,
                                              struct device_node *node,
                                              const char *propname, int index,
@@@ -250,15 -245,6 +250,15 @@@ static inline void gpiod_put(struct gpi
        WARN_ON(1);
  }
  
 +static inline void devm_gpiod_unhinge(struct device *dev,
 +                                    struct gpio_desc *desc)
 +{
 +      might_sleep();
 +
 +      /* GPIO can never have been requested */
 +      WARN_ON(1);
 +}
 +
  static inline void gpiod_put_array(struct gpio_descs *descs)
  {
        might_sleep();
@@@ -509,15 -495,17 +509,17 @@@ static inline int gpiod_to_irq(const st
        return -EINVAL;
  }
  
- static inline void gpiod_set_consumer_name(struct gpio_desc *desc, const char *name)
+ static inline int gpiod_set_consumer_name(struct gpio_desc *desc,
+                                         const char *name)
  {
        /* GPIO can never have been requested */
        WARN_ON(1);
+       return -EINVAL;
  }
  
  static inline struct gpio_desc *gpio_to_desc(unsigned gpio)
  {
-       return ERR_PTR(-EINVAL);
+       return NULL;
  }
  
  static inline int desc_to_gpio(const struct gpio_desc *desc)
  struct device_node;
  struct fwnode_handle;
  
 +static inline
 +struct gpio_desc *gpiod_get_from_of_node(struct device_node *node,
 +                                       const char *propname, int index,
 +                                       enum gpiod_flags dflags,
 +                                       const char *label)
 +{
 +      return ERR_PTR(-ENOSYS);
 +}
 +
  static inline
  struct gpio_desc *devm_gpiod_get_from_of_node(struct device *dev,
                                              struct device_node *node,