Merge tag 'pinctrl-v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 13 Jul 2019 22:02:27 +0000 (15:02 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 13 Jul 2019 22:02:27 +0000 (15:02 -0700)
Pull pin control updates from Linus Walleij:
 "This is the bulk of pin control changes for the v5.3 kernel cycle:

  Core changes:

   - Device links can optionally be added between a pin control producer
     and its consumers. This will affect how the system power management
     is handled: a pin controller will not suspend before all of its
     consumers have been suspended.

     This was necessary for the ST Microelectronics STMFX expander and
     need to be tested on other systems as well: it makes sense to make
     this default in the long run.

     Right now it is opt-in per driver.

   - Drive strength can be specified in microamps. With decreases in
     silicon technology, milliamps isn't granular enough, let's make it
     possible to select drive strengths in microamps.

     Right now the Meson (AMlogic) driver needs this.

  New drivers:

   - New subdriver for the Tegra 194 SoC.

   - New subdriver for the Qualcomm SDM845.

   - New subdriver for the Qualcomm SM8150.

   - New subdriver for the Freescale i.MX8MN (Freescale is now a product
     line of NXP).

   - New subdriver for Marvell MV98DX1135.

  Driver improvements:

   - The Bitmain BM1880 driver now supports pin config in addition to
     muxing.

   - The Qualcomm drivers can now reserve some GPIOs as taken aside and
     not usable for users. This is used in ACPI systems to take out some
     GPIO lines used by the BIOS so that noone else (neither kernel nor
     userspace) will play with them by mistake and crash the machine.

   - A slew of refurbishing around the Aspeed drivers (board management
     controllers for servers) in preparation for the new Aspeed AST2600
     SoC.

   - A slew of improvements over the SH PFC drivers as usual.

   - Misc cleanups and fixes"

* tag 'pinctrl-v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (106 commits)
  pinctrl: aspeed: Strip moved macros and structs from private header
  pinctrl: aspeed: Fix missed include
  pinctrl: baytrail: Use GENMASK() consistently
  pinctrl: baytrail: Re-use data structures from pinctrl-intel.h
  pinctrl: baytrail: Use defined macro instead of magic in byt_get_gpio_mux()
  pinctrl: qcom: Add SM8150 pinctrl driver
  dt-bindings: pinctrl: qcom: Add SM8150 pinctrl binding
  dt-bindings: pinctrl: qcom: Document missing gpio nodes
  pinctrl: aspeed: Add implementation-related documentation
  pinctrl: aspeed: Split out pinmux from general pinctrl
  pinctrl: aspeed: Clarify comment about strapping W1C
  pinctrl: aspeed: Correct comment that is no longer true
  MAINTAINERS: Add entry for ASPEED pinctrl drivers
  dt-bindings: pinctrl: aspeed: Convert AST2500 bindings to json-schema
  dt-bindings: pinctrl: aspeed: Convert AST2400 bindings to json-schema
  dt-bindings: pinctrl: aspeed: Split bindings document in two
  pinctrl: qcom: Add irq_enable callback for msm gpio
  pinctrl: madera: Fixup SPDX headers
  pinctrl: qcom: sdm845: Fix CONFIG preprocessor guard
  pinctrl: tegra: Add bitmask support for parked bits
  ...

32 files changed:
1  2 
MAINTAINERS
drivers/pinctrl/aspeed/Makefile
drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c
drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c
drivers/pinctrl/aspeed/pinctrl-aspeed.c
drivers/pinctrl/aspeed/pinctrl-aspeed.h
drivers/pinctrl/bcm/Kconfig
drivers/pinctrl/core.c
drivers/pinctrl/freescale/Kconfig
drivers/pinctrl/meson/pinctrl-meson.c
drivers/pinctrl/meson/pinctrl-meson.h
drivers/pinctrl/mvebu/pinctrl-kirkwood.c
drivers/pinctrl/pinconf-generic.c
drivers/pinctrl/pinctrl-rockchip.c
drivers/pinctrl/pinctrl-tb10x.c
drivers/pinctrl/qcom/Kconfig
drivers/pinctrl/qcom/pinctrl-msm.c
drivers/pinctrl/qcom/pinctrl-msm.h
drivers/pinctrl/sh-pfc/pfc-r8a77980.c
drivers/pinctrl/tegra/Kconfig
drivers/pinctrl/tegra/pinctrl-tegra.c
drivers/pinctrl/tegra/pinctrl-tegra.h
drivers/pinctrl/tegra/pinctrl-tegra114.c
drivers/pinctrl/tegra/pinctrl-tegra124.c
drivers/pinctrl/tegra/pinctrl-tegra20.c
drivers/pinctrl/tegra/pinctrl-tegra210.c
drivers/pinctrl/tegra/pinctrl-tegra30.c
include/linux/gpio/driver.h
include/linux/pinctrl/pinconf-generic.h
include/linux/pinctrl/pinconf.h
include/linux/pinctrl/pinctrl.h
include/linux/pinctrl/pinmux.h

diff --combined MAINTAINERS
index 1be025959be9ea58580a9cf133d995a561606200,4c73fe3df3d2d35420a014120088a13dd446533c..32bb6280c2192243d004ce82cdf75dcaff479afc
@@@ -321,7 -321,7 +321,7 @@@ F: drivers/pnp/pnpacpi
  F:    include/linux/acpi.h
  F:    include/linux/fwnode.h
  F:    include/acpi/
 -F:    Documentation/acpi/
 +F:    Documentation/firmware-guide/acpi/
  F:    Documentation/ABI/testing/sysfs-bus-acpi
  F:    Documentation/ABI/testing/configfs-acpi
  F:    drivers/pci/*acpi*
@@@ -364,7 -364,7 +364,7 @@@ F: drivers/acpi/fan.
  
  ACPI FOR ARM64 (ACPI/arm64)
  M:    Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
 -M:    Hanjun Guo <hanjun.guo@linaro.org>
 +M:    Hanjun Guo <guohanjun@huawei.com>
  M:    Sudeep Holla <sudeep.holla@arm.com>
  L:    linux-acpi@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -551,7 -551,6 +551,7 @@@ W: http://wiki.analog.com/ADXL34
  W:    http://ez.analog.com/community/linux-device-drivers
  S:    Supported
  F:    drivers/input/misc/adxl34x.c
 +F:    Documentation/devicetree/bindings/iio/accel/adi,adxl345.yaml
  
  ADXL372 THREE-AXIS DIGITAL ACCELEROMETER DRIVER
  M:    Stefan Popa <stefan.popa@analog.com>
@@@ -560,7 -559,7 +560,7 @@@ S: Supporte
  F:    drivers/iio/accel/adxl372.c
  F:    drivers/iio/accel/adxl372_spi.c
  F:    drivers/iio/accel/adxl372_i2c.c
 -F:    Documentation/devicetree/bindings/iio/accel/adxl372.txt
 +F:    Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml
  
  AF9013 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
@@@ -669,13 -668,6 +669,13 @@@ S:       Maintaine
  F:    Documentation/i2c/busses/i2c-ali1563
  F:    drivers/i2c/busses/i2c-ali1563.c
  
 +ALLEGRO DVT VIDEO IP CORE DRIVER
 +M:    Michael Tretter <m.tretter@pengutronix.de>
 +R:    Pengutronix Kernel Team <kernel@pengutronix.de>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/media/allegro-dvt/
 +
  ALLWINNER SECURITY SYSTEM
  M:    Corentin Labbe <clabbe.montjoie@gmail.com>
  L:    linux-crypto@vger.kernel.org
@@@ -704,7 -696,6 +704,7 @@@ F: drivers/input/mouse/alps.
  ALTERA I2C CONTROLLER DRIVER
  M:    Thor Thayer <thor.thayer@linux.intel.com>
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-altera.txt
  F:    drivers/i2c/busses/i2c-altera.c
  
  ALTERA MAILBOX DRIVER
@@@ -917,17 -908,8 +917,17 @@@ S:       Supporte
  F:    drivers/iio/adc/ad7768-1.c
  F:    Documentation/devicetree/bindings/iio/adc/adi,ad7768-1.txt
  
 +ANALOG DEVICES INC AD7780 DRIVER
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
 +M:    Renato Lui Geh <renatogeh@gmail.com>
 +L:    linux-iio@vger.kernel.org
 +W:    http://ez.analog.com/community/linux-device-drivers
 +S:    Supported
 +F:    drivers/iio/adc/ad7780.c
 +F:    Documentation/devicetree/bindings/iio/adc/adi,ad7780.yaml
 +
  ANALOG DEVICES INC AD9389B DRIVER
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    drivers/media/i2c/ad9389b*
@@@ -938,13 -920,6 +938,13 @@@ S:       Supporte
  F:    drivers/mux/adgs1408.c
  F:    Documentation/devicetree/bindings/mux/adi,adgs1408.txt
  
 +ANALOG DEVICES INC ADIS DRIVER LIBRARY
 +M:    Alexandru Ardelean <alexandru.ardelean@analog.com>
 +S:    Supported
 +L:    linux-iio@vger.kernel.org
 +F:    include/linux/iio/imu/adis.h
 +F:    drivers/iio/imu/adis.c
 +
  ANALOG DEVICES INC ADP5061 DRIVER
  M:    Stefan Popa <stefan.popa@analog.com>
  L:    linux-pm@vger.kernel.org
@@@ -966,19 -941,19 +966,19 @@@ S:      Maintaine
  F:    drivers/media/i2c/adv748x/*
  
  ANALOG DEVICES INC ADV7511 DRIVER
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    drivers/media/i2c/adv7511*
  
  ANALOG DEVICES INC ADV7604 DRIVER
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    drivers/media/i2c/adv7604*
  
  ANALOG DEVICES INC ADV7842 DRIVER
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    drivers/media/i2c/adv7842*
@@@ -1164,15 -1139,6 +1164,15 @@@ L:    linux-media@vger.kernel.or
  S:    Maintained
  F:    drivers/media/i2c/aptina-pll.*
  
 +AQUANTIA ETHERNET DRIVER (atlantic)
 +M:    Igor Russkikh <igor.russkikh@aquantia.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +W:    http://www.aquantia.com
 +Q:    http://patchwork.ozlabs.org/project/netdev/list/
 +F:    drivers/net/ethernet/aquantia/atlantic/
 +F:    Documentation/networking/device_drivers/aquantia/atlantic.txt
 +
  ARC FRAMEBUFFER DRIVER
  M:    Jaya Kumar <jayalk@intworks.biz>
  S:    Maintained
@@@ -1208,7 -1174,6 +1208,7 @@@ S:      Maintaine
  F:    Documentation/devicetree/bindings/arm/arm-boards
  F:    Documentation/devicetree/bindings/auxdisplay/arm-charlcd.txt
  F:    Documentation/devicetree/bindings/clock/arm-integrator.txt
 +F:    Documentation/devicetree/bindings/i2c/i2c-versatile.txt
  F:    Documentation/devicetree/bindings/interrupt-controller/arm,versatile-fpga-irq.txt
  F:    Documentation/devicetree/bindings/mtd/arm-versatile.txt
  F:    arch/arm/mach-integrator/
@@@ -1268,7 -1233,7 +1268,7 @@@ F:      arch/arm/lib/floppydma.
  F:    arch/arm/include/asm/floppy.h
  
  ARM PMU PROFILING AND DEBUGGING
 -M:    Will Deacon <will.deacon@arm.com>
 +M:    Will Deacon <will@kernel.org>
  M:    Mark Rutland <mark.rutland@arm.com>
  S:    Maintained
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1323,7 -1288,7 +1323,7 @@@ ARM PRIMECELL SSP PL022 SPI DRIVE
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/spi/spi_pl022.txt
 +F:    Documentation/devicetree/bindings/spi/spi-pl022.yaml
  F:    drivers/spi/spi-pl022.c
  
  ARM PRIMECELL UART PL010 AND PL011 DRIVERS
@@@ -1339,14 -1304,8 +1339,14 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/interrupt-controller/arm,vic.txt
  F:    drivers/irqchip/irq-vic.c
  
 +AMAZON ANNAPURNA LABS FIC DRIVER
 +M:    Talel Shenhar <talel@amazon.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/interrupt-controller/amazon,al-fic.txt
 +F:    drivers/irqchip/irq-al-fic.c
 +
  ARM SMMU DRIVERS
 -M:    Will Deacon <will.deacon@arm.com>
 +M:    Will Deacon <will@kernel.org>
  R:    Robin Murphy <robin.murphy@arm.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -1822,7 -1781,6 +1822,7 @@@ ARM/LPC18XX ARCHITECTUR
  M:    Vladimir Zapolskiy <vz@mleia.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-lpc2k.txt
  F:    arch/arm/boot/dts/lpc43*
  F:    drivers/i2c/busses/i2c-lpc2k.c
  F:    drivers/memory/pl172.c
@@@ -1836,7 -1794,6 +1836,7 @@@ M:      Sylvain Lemieux <slemieux.tyco@gmail
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  T:    git git://github.com/vzapolskiy/linux-lpc32xx.git
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-pnx.txt
  F:    arch/arm/boot/dts/lpc32*
  F:    arch/arm/mach-lpc32xx/
  F:    drivers/i2c/busses/i2c-pnx.c
@@@ -1961,8 -1918,6 +1961,8 @@@ ARM/NOMADIK/U300/Ux500 ARCHITECTURE
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-nomadik.txt
 +F:    Documentation/devicetree/bindings/i2c/i2c-stu300.txt
  F:    arch/arm/mach-nomadik/
  F:    arch/arm/mach-u300/
  F:    arch/arm/mach-ux500/
@@@ -2124,7 -2079,7 +2124,7 @@@ F:      drivers/tty/serial/msm_serial.
  F:    drivers/usb/dwc3/dwc3-qcom.c
  F:    include/dt-bindings/*/qcom*
  F:    include/linux/*/qcom*
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/agross/linux.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
  
  ARM/RADISYS ENP2611 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
@@@ -2140,7 -2095,7 +2140,7 @@@ F:      arch/arm/boot/dts/rda8810pl-
  F:    drivers/clocksource/timer-rda.c
  F:    drivers/irqchip/irq-rda-intc.c
  F:    drivers/tty/serial/rda-uart.c
 -F:    Documentation/devicetree/bindings/arm/rda.txt
 +F:    Documentation/devicetree/bindings/arm/rda.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/rda,8810pl-intc.txt
  F:    Documentation/devicetree/bindings/serial/rda,8810pl-uart.txt
  F:    Documentation/devicetree/bindings/timer/rda,8810pl-timer.txt
@@@ -2185,7 -2140,6 +2185,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  L:    linux-rockchip@lists.infradead.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-rk3x.txt
  F:    arch/arm/boot/dts/rk3*
  F:    arch/arm/boot/dts/rv1108*
  F:    arch/arm/mach-rockchip/
@@@ -2321,7 -2275,6 +2321,7 @@@ M:      Patrice Chotard <patrice.chotard@st.
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.stlinux.com
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-st.txt
  F:    arch/arm/mach-sti/
  F:    arch/arm/boot/dts/sti*
  F:    drivers/char/hw_random/st-rng.c
@@@ -2383,7 -2336,7 +2383,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  
  ARM/TEGRA HDMI CEC SUBSYSTEM SUPPORT
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-tegra@vger.kernel.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
@@@ -2513,7 -2466,6 +2513,7 @@@ ARM/VT8500 ARM ARCHITECTUR
  M:    Tony Prisk <linux@prisktech.co.nz>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-wmt.txt
  F:    arch/arm/mach-vt8500/
  F:    drivers/clocksource/timer-vt8500.c
  F:    drivers/i2c/busses/i2c-wmt.c
@@@ -2579,8 -2531,6 +2579,8 @@@ F:      drivers/cpuidle/cpuidle-zynq.
  F:    drivers/block/xsysace.c
  N:    zynq
  N:    xilinx
 +F:    Documentation/devicetree/bindings/i2c/i2c-cadence.txt
 +F:    Documentation/devicetree/bindings/i2c/i2c-xiic.txt
  F:    drivers/clocksource/timer-cadence-ttc.c
  F:    drivers/i2c/busses/i2c-cadence.c
  F:    drivers/mmc/host/sdhci-of-arasan.c
@@@ -2589,7 -2539,7 +2589,7 @@@ F:      drivers/i2c/busses/i2c-xiic.
  
  ARM64 PORT (AARCH64 ARCHITECTURE)
  M:    Catalin Marinas <catalin.marinas@arm.com>
 -M:    Will Deacon <will.deacon@arm.com>
 +M:    Will Deacon <will@kernel.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git
  S:    Maintained
@@@ -2625,6 -2575,15 +2625,15 @@@ S:    Maintaine
  F:    Documentation/hwmon/asc7621.rst
  F:    drivers/hwmon/asc7621.c
  
+ ASPEED PINCTRL DRIVERS
+ M:    Andrew Jeffery <andrew@aj.id.au>
+ L:    linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
+ L:    openbmc@lists.ozlabs.org (moderated for non-subscribers)
+ L:    linux-gpio@vger.kernel.org
+ S:    Maintained
+ F:    drivers/pinctrl/aspeed/
+ F:    Documentation/devicetree/bindings/pinctrl/aspeed,*
  ASPEED VIDEO ENGINE DRIVER
  M:    Eddie James <eajames@linux.ibm.com>
  L:    linux-media@vger.kernel.org
@@@ -2677,7 -2636,7 +2686,7 @@@ F:      Documentation/devicetree/bindings/ee
  F:    drivers/misc/eeprom/at24.c
  
  ATA OVER ETHERNET (AOE) DRIVER
 -M:    "Ed L. Cashin" <ed.cashin@acm.org>
 +M:    "Justin Sanders" <justin@coraid.com>
  W:    http://www.openaoe.org/
  S:    Supported
  F:    Documentation/aoe/
@@@ -2773,7 -2732,7 +2782,7 @@@ S:      Maintaine
  F:    drivers/net/wireless/atmel/atmel*
  
  ATOMIC INFRASTRUCTURE
 -M:    Will Deacon <will.deacon@arm.com>
 +M:    Will Deacon <will@kernel.org>
  M:    Peter Zijlstra <peterz@infradead.org>
  R:    Boqun Feng <boqun.feng@gmail.com>
  L:    linux-kernel@vger.kernel.org
@@@ -2818,7 -2777,7 +2827,7 @@@ AVIA HX711 ANALOG DIGITAL CONVERTER II
  M:    Andreas Klinger <ak@it-klinger.de>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/iio/adc/avia-hx711.txt
 +F:    Documentation/devicetree/bindings/iio/adc/avia-hx711.yaml
  F:    drivers/iio/adc/hx711.c
  
  AX.25 NETWORK LAYER
@@@ -3099,9 -3058,8 +3108,9 @@@ S:      Maintaine
  F:    arch/riscv/net/
  
  BPF JIT for S390
 -M:    Martin Schwidefsky <schwidefsky@de.ibm.com>
  M:    Heiko Carstens <heiko.carstens@de.ibm.com>
 +M:    Vasily Gorbik <gor@linux.ibm.com>
 +M:    Christian Borntraeger <borntraeger@de.ibm.com>
  L:    netdev@vger.kernel.org
  L:    bpf@vger.kernel.org
  S:    Maintained
@@@ -3160,8 -3118,7 +3169,8 @@@ F:      arch/arm/mach-bcm
  
  BROADCOM BCM2835 ARM ARCHITECTURE
  M:    Eric Anholt <eric@anholt.net>
 -M:    Stefan Wahren <stefan.wahren@i2se.com>
 +M:    Stefan Wahren <wahrenst@gmx.net>
 +L:    bcm-kernel-feedback-list@broadcom.com
  L:    linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  T:    git git://github.com/anholt/linux
@@@ -3191,7 -3148,6 +3200,7 @@@ F:      arch/arm/boot/dts/bcm953012
  
  BROADCOM BCM53573 ARM ARCHITECTURE
  M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
 +L:    bcm-kernel-feedback-list@broadcom.com
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
  F:    arch/arm/boot/dts/bcm53573*
@@@ -3718,7 -3674,7 +3727,7 @@@ F:      drivers/crypto/ccree
  W:    https://developer.arm.com/products/system-ip/trustzone-cryptocell/cryptocell-700-family
  
  CEC FRAMEWORK
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
  W:    http://linuxtv.org
@@@ -3735,7 -3691,7 +3744,7 @@@ F:      Documentation/devicetree/bindings/me
  F:    Documentation/ABI/testing/debugfs-cec-error-inj
  
  CEC GPIO DRIVER
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
  W:    http://linuxtv.org
@@@ -3792,7 -3748,7 +3801,7 @@@ F:      scripts/extract-cert.
  CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM:
  L:    linux-usb@vger.kernel.org
  S:    Orphan
 -F:    Documentation/usb/WUSB-Design-overview.txt
 +F:    Documentation/usb/wusb-design-overview.rst
  F:    Documentation/usb/wusb-cbaf
  F:    drivers/usb/host/hwa-hc.c
  F:    drivers/usb/host/whci/
@@@ -3927,7 -3883,7 +3936,7 @@@ F:      Documentation/devicetree/bindings/hw
  F:    Documentation/devicetree/bindings/pinctrl/cirrus,lochnagar.txt
  F:    Documentation/devicetree/bindings/regulator/cirrus,lochnagar.txt
  F:    Documentation/devicetree/bindings/sound/cirrus,lochnagar.txt
 -F:    Documentation/hwmon/lochnagar
 +F:    Documentation/hwmon/lochnagar.rst
  
  CISCO FCOE HBA DRIVER
  M:    Satish Kharat <satishkh@cisco.com>
@@@ -3968,32 -3924,19 +3977,32 @@@ 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:    Documentation/devicetree/bindings/sound/madera.txt
 +F:    include/dt-bindings/sound/madera*
  F:    include/linux/irqchip/irq-madera*
  F:    include/linux/mfd/madera/*
 +F:    include/sound/madera*
  F:    drivers/gpio/gpio-madera*
  F:    drivers/irqchip/irq-madera*
  F:    drivers/mfd/madera*
  F:    drivers/mfd/cs47l*
  F:    drivers/pinctrl/cirrus/*
 +F:    sound/soc/codecs/cs47l*
 +F:    sound/soc/codecs/madera*
  
  CLANG-FORMAT FILE
  M:    Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
  S:    Maintained
  F:    .clang-format
  
 +CLANG/LLVM BUILD SUPPORT
 +L:    clang-built-linux@googlegroups.com
 +W:    https://clangbuiltlinux.github.io/
 +B:    https://github.com/ClangBuiltLinux/linux/issues
 +C:    irc://chat.freenode.net/clangbuiltlinux
 +S:    Supported
 +K:    \b(?i:clang|llvm)\b
 +
  CLEANCACHE API
  M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
  L:    linux-kernel@vger.kernel.org
@@@ -4024,7 -3967,7 +4033,7 @@@ S:      Supporte
  F:    drivers/platform/x86/classmate-laptop.c
  
  COBALT MEDIA DRIVER
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
  W:    https://linuxtv.org
@@@ -4160,7 -4103,7 +4169,7 @@@ W:      http://www.bullopensource.org/cpuset
  W:    http://oss.sgi.com/projects/cpusets/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
  S:    Maintained
 -F:    Documentation/cgroup-v1/cpusets.txt
 +F:    Documentation/cgroup-v1/cpusets.rst
  F:    include/linux/cpuset.h
  F:    kernel/cgroup/cpuset.c
  
@@@ -4295,7 -4238,6 +4304,7 @@@ F:      crypto
  F:    drivers/crypto/
  F:    include/crypto/
  F:    include/linux/crypto*
 +F:    lib/crypto/
  
  CRYPTOGRAPHIC RANDOM NUMBER GENERATOR
  M:    Neil Horman <nhorman@tuxdriver.com>
@@@ -4752,7 -4694,6 +4761,7 @@@ F:      Documentation/devicetree/bindings/mf
  F:    Documentation/devicetree/bindings/input/da90??-onkey.txt
  F:    Documentation/devicetree/bindings/thermal/da90??-thermal.txt
  F:    Documentation/devicetree/bindings/regulator/da92*.txt
 +F:    Documentation/devicetree/bindings/regulator/slg51000.txt
  F:    Documentation/devicetree/bindings/watchdog/da90??-wdt.txt
  F:    Documentation/devicetree/bindings/sound/da[79]*.txt
  F:    drivers/gpio/gpio-da90??.c
@@@ -4768,7 -4709,6 +4777,7 @@@ F:      drivers/power/supply/da9052-battery.
  F:    drivers/power/supply/da91??-*.c
  F:    drivers/regulator/da903x.c
  F:    drivers/regulator/da9???-regulator.[ch]
 +F:    drivers/regulator/slg51000-regulator.[ch]
  F:    drivers/thermal/da90??-thermal.c
  F:    drivers/rtc/rtc-da90??.c
  F:    drivers/video/backlight/da90??_bl.c
@@@ -4846,7 -4786,7 +4855,7 @@@ S:      Maintaine
  W:    http://plugable.com/category/projects/udlfb/
  F:    drivers/video/fbdev/udlfb.c
  F:    include/video/udlfb.h
 -F:    Documentation/fb/udlfb.txt
 +F:    Documentation/fb/udlfb.rst
  
  DISTRIBUTED LOCK MANAGER (DLM)
  M:    Christine Caulfield <ccaulfie@redhat.com>
@@@ -4919,7 -4859,7 +4928,7 @@@ S:      Maintaine
  F:    Documentation/
  F:    scripts/kernel-doc
  X:    Documentation/ABI/
 -X:    Documentation/acpi/
 +X:    Documentation/firmware-guide/acpi/
  X:    Documentation/devicetree/
  X:    Documentation/i2c/
  X:    Documentation/media/
@@@ -4979,6 -4919,13 +4988,6 @@@ L:     linux-kernel@vger.kernel.or
  S:    Maintained
  F:    drivers/staging/fsl-dpaa2/ethsw
  
 -DPAA2 PTP CLOCK DRIVER
 -M:    Yangbo Lu <yangbo.lu@nxp.com>
 -L:    netdev@vger.kernel.org
 -S:    Maintained
 -F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp*
 -F:    drivers/net/ethernet/freescale/dpaa2/dprtc*
 -
  DPT_I2O SCSI RAID DRIVER
  M:    Adaptec OEM Raid Solutions <aacraid@microsemi.com>
  L:    linux-scsi@vger.kernel.org
@@@ -5650,8 -5597,7 +5659,8 @@@ F:      include/linux/dynamic_debug.
  DYNAMIC INTERRUPT MODERATION
  M:    Tal Gilboa <talgi@mellanox.com>
  S:    Maintained
 -F:    include/linux/net_dim.h
 +F:    include/linux/dim.h
 +F:    lib/dim/
  
  DZ DECSTATION DZ11 SERIAL DRIVER
  M:    "Maciej W. Rozycki" <macro@linux-mips.org>
@@@ -5860,12 -5806,6 +5869,12 @@@ L:    linux-edac@vger.kernel.or
  S:    Maintained
  F:    drivers/edac/sb_edac.c
  
 +EDAC-SIFIVE
 +M:    Yash Shah <yash.shah@sifive.com>
 +L:    linux-edac@vger.kernel.org
 +S:    Supported
 +F:    drivers/edac/sifive_edac.c
 +
  EDAC-SKYLAKE
  M:    Tony Luck <tony.luck@intel.com>
  L:    linux-edac@vger.kernel.org
@@@ -6025,7 -5965,6 +6034,7 @@@ M:      Heiner Kallweit <hkallweit1@gmail.co
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-bus-mdio
 +F:    Documentation/devicetree/bindings/net/ethernet-phy.yaml
  F:    Documentation/devicetree/bindings/net/mdio*
  F:    Documentation/networking/phy.rst
  F:    drivers/net/phy/
@@@ -6090,7 -6029,7 +6099,7 @@@ S:      Maintaine
  F:    drivers/extcon/
  F:    include/linux/extcon/
  F:    include/linux/extcon.h
 -F:    Documentation/extcon/
 +F:    Documentation/firmware-guide/acpi/extcon-intel-int3496.rst
  F:    Documentation/devicetree/bindings/extcon/
  
  EXYNOS DP DRIVER
@@@ -6276,14 -6215,6 +6285,14 @@@ M:    Philip Kelleher <pjk1939@linux.ibm.c
  S:    Maintained
  F:    drivers/block/rsxx/
  
 +FLEXTIMER FTM-QUADDEC DRIVER
 +M:    Patrick Havelange <patrick.havelange@essensium.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-counter-ftm-quadddec
 +F:    Documentation/devicetree/bindings/counter/ftm-quaddec.txt
 +F:    drivers/counter/ftm-quaddec.c
 +
  FLOPPY DRIVER
  M:    Jiri Kosina <jikos@kernel.org>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/floppy.git
@@@ -6300,6 -6231,7 +6309,6 @@@ F:      include/linux/ipmi-fru.
  K:    fmc_d.*register
  
  FPGA MANAGER FRAMEWORK
 -M:    Alan Tull <atull@kernel.org>
  M:    Moritz Fischer <mdf@kernel.org>
  L:    linux-fpga@vger.kernel.org
  S:    Maintained
@@@ -6316,7 -6248,7 +6325,7 @@@ FPGA DFL DRIVER
  M:    Wu Hao <hao.wu@intel.com>
  L:    linux-fpga@vger.kernel.org
  S:    Maintained
 -F:    Documentation/fpga/dfl.txt
 +F:    Documentation/fpga/dfl.rst
  F:    include/uapi/linux/fpga-dfl.h
  F:    drivers/fpga/dfl*
  
@@@ -6393,13 -6325,6 +6402,13 @@@ L:    linux-i2c@vger.kernel.or
  S:    Maintained
  F:    drivers/i2c/busses/i2c-cpm.c
  
 +FREESCALE IMX DDR PMU DRIVER
 +M:    Frank Li <Frank.li@nxp.com>
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    drivers/perf/fsl_imx8_ddr_perf.c
 +F:    Documentation/devicetree/bindings/perf/fsl-imx-ddr.txt
 +
  FREESCALE IMX LPI2C DRIVER
  M:    Dong Aisheng <aisheng.dong@nxp.com>
  L:    linux-i2c@vger.kernel.org
@@@ -6443,8 -6368,6 +6452,8 @@@ FREESCALE QORIQ PTP CLOCK DRIVE
  M:    Yangbo Lu <yangbo.lu@nxp.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 +F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp*
 +F:    drivers/net/ethernet/freescale/dpaa2/dprtc*
  F:    drivers/net/ethernet/freescale/enetc/enetc_ptp.c
  F:    drivers/ptp/ptp_qoriq.c
  F:    drivers/ptp/ptp_qoriq_debugfs.c
@@@ -6563,19 -6486,6 +6572,19 @@@ F:    fs/crypto
  F:    include/linux/fscrypt*.h
  F:    Documentation/filesystems/fscrypt.rst
  
 +FSI SUBSYSTEM
 +M:    Jeremy Kerr <jk@ozlabs.org>
 +M:    Joel Stanley <joel@jms.id.au>
 +R:    Alistar Popple <alistair@popple.id.au>
 +R:    Eddie James <eajames@linux.ibm.com>
 +L:    linux-fsi@lists.ozlabs.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi.git
 +Q:    http://patchwork.ozlabs.org/project/linux-fsi/list/
 +S:    Supported
 +F:    drivers/fsi/
 +F:    include/linux/fsi*.h
 +F:    include/trace/events/fsi*.h
 +
  FSI-ATTACHED I2C DRIVER
  M:    Eddie James <eajames@linux.ibm.com>
  L:    linux-i2c@vger.kernel.org
@@@ -6752,18 -6662,6 +6761,18 @@@ L:    kvm@vger.kernel.or
  S:    Supported
  F:    drivers/uio/uio_pci_generic.c
  
 +GENERIC VDSO LIBRARY:
 +M:    Andy Lutomirski <luto@kernel.org>
 +M:    Thomas Gleixner <tglx@linutronix.de>
 +M:    Vincenzo Frascino <vincenzo.frascino@arm.com>
 +L:    linux-kernel@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/vdso
 +S:    Maintained
 +F:    lib/vdso/
 +F:    kernel/time/vsyscall.c
 +F:    include/vdso/
 +F:    include/asm-generic/vdso/vsyscall.h
 +
  GENWQE (IBM Generic Workqueue Card)
  M:    Frank Haverkamp <haver@linux.ibm.com>
  S:    Supported
@@@ -6790,7 -6688,9 +6799,7 @@@ M:      Paul Bolle <pebolle@tiscali.nl
  L:    gigaset307x-common@lists.sourceforge.net
  W:    http://gigaset307x.sourceforge.net/
  S:    Odd Fixes
 -F:    Documentation/isdn/README.gigaset
 -F:    drivers/isdn/gigaset/
 -F:    include/uapi/linux/gigaset_dev.h
 +F:    drivers/staging/isdn/gigaset/
  
  GNSS SUBSYSTEM
  M:    Johan Hovold <johan@kernel.org>
@@@ -6802,7 -6702,7 +6811,7 @@@ F:      drivers/gnss
  F:    include/linux/gnss.h
  
  GO7007 MPEG CODEC
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    drivers/media/usb/go7007/
@@@ -6813,15 -6713,6 +6822,15 @@@ L:    linux-input@vger.kernel.or
  S:    Maintained
  F:    drivers/input/touchscreen/goodix.c
  
 +GOOGLE ETHERNET DRIVERS
 +M:    Catherine Sullivan <csully@google.com>
 +R:    Sagi Shahar <sagis@google.com>
 +R:    Jon Olson <jonolson@google.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    Documentation/networking/device_drivers/google/gve.txt
 +F:    drivers/net/ethernet/google
 +
  GPD POCKET FAN DRIVER
  M:    Hans de Goede <hdegoede@redhat.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -7115,7 -7006,7 +7124,7 @@@ F:      drivers/media/usb/hdpvr
  HEWLETT PACKARD ENTERPRISE ILO NMI WATCHDOG DRIVER
  M:    Jerry Hoemann <jerry.hoemann@hpe.com>
  S:    Supported
 -F:    Documentation/watchdog/hpwdt.txt
 +F:    Documentation/watchdog/hpwdt.rst
  F:    drivers/watchdog/hpwdt.c
  
  HEWLETT-PACKARD SMART ARRAY RAID DRIVER (hpsa)
@@@ -7298,7 -7189,7 +7307,7 @@@ F:      drivers/net/ethernet/hp/hp100.
  HPET: High Precision Event Timers driver
  M:    Clemens Ladisch <clemens@ladisch.de>
  S:    Maintained
 -F:    Documentation/timers/hpet.txt
 +F:    Documentation/timers/hpet.rst
  F:    drivers/char/hpet.c
  F:    include/linux/hpet.h
  F:    include/uapi/linux/hpet.h
@@@ -7408,7 -7299,6 +7417,7 @@@ F:      arch/x86/include/asm/trace/hyperv.
  F:    arch/x86/include/asm/hyperv-tlfs.h
  F:    arch/x86/kernel/cpu/mshyperv.c
  F:    arch/x86/hyperv
 +F:    drivers/clocksource/hyperv_timer.c
  F:    drivers/hid/hid-hyperv.c
  F:    drivers/hv/
  F:    drivers/input/serio/hyperv-keyboard.c
@@@ -7419,10 -7309,8 +7428,10 @@@ F:    drivers/uio/uio_hv_generic.
  F:    drivers/video/fbdev/hyperv_fb.c
  F:    drivers/iommu/hyperv_iommu.c
  F:    net/vmw_vsock/hyperv_transport.c
 +F:    include/clocksource/hyperv_timer.h
  F:    include/linux/hyperv.h
  F:    include/uapi/linux/hyperv.h
 +F:    include/asm-generic/mshyperv.h
  F:    tools/hv/
  F:    Documentation/ABI/stable/sysfs-bus-vmbus
  
@@@ -7462,7 -7350,6 +7471,7 @@@ I2C MV64XXX MARVELL AND ALLWINNER DRIVE
  M:    Gregory CLEMENT <gregory.clement@bootlin.com>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
  F:    drivers/i2c/busses/i2c-mv64xxx.c
  
  I2C OVER PARALLEL PORT
@@@ -7719,7 -7606,7 +7728,7 @@@ IDE/ATAPI DRIVER
  M:    Borislav Petkov <bp@alien8.de>
  L:    linux-ide@vger.kernel.org
  S:    Maintained
 -F:    Documentation/cdrom/ide-cd
 +F:    Documentation/cdrom/ide-cd.rst
  F:    drivers/ide/ide-cd*
  
  IDEAPAD LAPTOP EXTRAS DRIVER
@@@ -7882,12 -7769,6 +7891,12 @@@ W:    http://industrypack.sourceforge.ne
  S:    Maintained
  F:    drivers/ipack/
  
 +INFINEON DPS310 Driver
 +M:    Eddie James <eajames@linux.ibm.com>
 +L:    linux-iio@vger.kernel.org
 +F:    drivers/iio/pressure/dps310.c
 +S:    Maintained
 +
  INFINIBAND SUBSYSTEM
  M:    Doug Ledford <dledford@redhat.com>
  M:    Jason Gunthorpe <jgg@mellanox.com>
@@@ -7916,7 -7797,7 +7925,7 @@@ INGENIC JZ4780 NAND DRIVE
  M:    Harvey Hunt <harveyhuntnexus@gmail.com>
  L:    linux-mtd@lists.infradead.org
  S:    Maintained
 -F:    drivers/mtd/nand/raw/jz4780_*
 +F:    drivers/mtd/nand/raw/ingenic/
  
  INOTIFY
  M:    Jan Kara <jack@suse.cz>
@@@ -8038,7 -7919,7 +8047,7 @@@ INTEL FRAMEBUFFER DRIVER (excluding 81
  M:    Maik Broemme <mbroemme@libmpq.org>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/fb/intelfb.txt
 +F:    Documentation/fb/intelfb.rst
  F:    drivers/video/fbdev/intelfb/
  
  INTEL GPIO DRIVERS
@@@ -8149,7 -8030,7 +8158,7 @@@ F:      include/uapi/linux/mei.
  F:    include/linux/mei_cl_bus.h
  F:    drivers/misc/mei/*
  F:    drivers/watchdog/mei_wdt.c
 -F:    Documentation/misc-devices/mei/*
 +F:    Documentation/driver-api/mei/*
  F:    samples/mei/*
  
  INTEL MENLOW THERMAL DRIVER
@@@ -8490,26 -8371,18 +8499,26 @@@ S:   Supporte
  W:    http://www.linux-iscsi.org
  F:    drivers/infiniband/ulp/isert
  
 -ISDN SUBSYSTEM
 +ISDN/mISDN SUBSYSTEM
  M:    Karsten Keil <isdn@linux-pingi.de>
  L:    isdn4linux@listserv.isdn4linux.de (subscribers-only)
  L:    netdev@vger.kernel.org
  W:    http://www.isdn4linux.de
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kkeil/isdn-2.6.git
  S:    Maintained
 +F:    drivers/isdn/mISDN
 +F:    drivers/isdn/hardware
 +
 +ISDN/CAPI SUBSYSTEM
 +M:    Karsten Keil <isdn@linux-pingi.de>
 +L:    isdn4linux@listserv.isdn4linux.de (subscribers-only)
 +L:    netdev@vger.kernel.org
 +W:    http://www.isdn4linux.de
 +S:    Odd Fixes
  F:    Documentation/isdn/
 -F:    drivers/isdn/
 -F:    include/linux/isdn.h
 +F:    drivers/isdn/capi/
 +F:    drivers/staging/isdn/
 +F:    net/bluetooth/cmtp/
  F:    include/linux/isdn/
 -F:    include/uapi/linux/isdn.h
  F:    include/uapi/linux/isdn/
  
  IT87 HARDWARE MONITORING DRIVER
@@@ -8689,7 -8562,7 +8698,7 @@@ S:      Odd Fixe
  
  KERNEL NFSD, SUNRPC, AND LOCKD SERVERS
  M:    "J. Bruce Fields" <bfields@fieldses.org>
 -M:    Jeff Layton <jlayton@kernel.org>
 +M:    Chuck Lever <chuck.lever@oracle.com>
  L:    linux-nfs@vger.kernel.org
  W:    http://nfs.sourceforge.net/
  T:    git git://linux-nfs.org/~bfields/linux.git
@@@ -8747,12 -8620,14 +8756,12 @@@ F:   arch/x86/include/asm/svm.
  F:    arch/x86/kvm/svm.c
  
  KERNEL VIRTUAL MACHINE FOR ARM/ARM64 (KVM/arm, KVM/arm64)
 -M:    Christoffer Dall <christoffer.dall@arm.com>
  M:    Marc Zyngier <marc.zyngier@arm.com>
  R:    James Morse <james.morse@arm.com>
  R:    Julien Thierry <julien.thierry@arm.com>
  R:    Suzuki K Pouloze <suzuki.poulose@arm.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    kvmarm@lists.cs.columbia.edu
 -W:    http://systems.cs.columbia.edu/projects/kvm-arm
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git
  S:    Maintained
  F:    arch/arm/include/uapi/asm/kvm*
@@@ -8982,7 -8857,7 +8991,7 @@@ F:      include/linux/leds.
  LEGACY EEPROM DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
  S:    Maintained
 -F:    Documentation/misc-devices/eeprom
 +F:    Documentation/misc-devices/eeprom.rst
  F:    drivers/misc/eeprom/eeprom.c
  
  LEGO MINDSTORMS EV3
@@@ -9244,7 -9119,7 +9253,7 @@@ F:      drivers/misc/lkdtm/
  LINUX KERNEL MEMORY CONSISTENCY MODEL (LKMM)
  M:    Alan Stern <stern@rowland.harvard.edu>
  M:    Andrea Parri <andrea.parri@amarulasolutions.com>
 -M:    Will Deacon <will.deacon@arm.com>
 +M:    Will Deacon <will@kernel.org>
  M:    Peter Zijlstra <peterz@infradead.org>
  M:    Boqun Feng <boqun.feng@gmail.com>
  M:    Nicholas Piggin <npiggin@gmail.com>
@@@ -9268,7 -9143,7 +9277,7 @@@ F:      Documentation/memory-barriers.tx
  LIS3LV02D ACCELEROMETER DRIVER
  M:    Eric Piel <eric.piel@tremplin-utc.net>
  S:    Maintained
 -F:    Documentation/misc-devices/lis3lv02d
 +F:    Documentation/misc-devices/lis3lv02d.rst
  F:    drivers/misc/lis3lv02d/
  F:    drivers/platform/x86/hp_accel.c
  
@@@ -9352,7 -9227,7 +9361,7 @@@ F:      Documentation/admin-guide/LSM/LoadPi
  LOCKING PRIMITIVES
  M:    Peter Zijlstra <peterz@infradead.org>
  M:    Ingo Molnar <mingo@redhat.com>
 -M:    Will Deacon <will.deacon@arm.com>
 +M:    Will Deacon <will@kernel.org>
  L:    linux-kernel@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
  S:    Maintained
@@@ -9759,17 -9634,6 +9768,17 @@@ L:    linux-iio@vger.kernel.or
  S:    Maintained
  F:    drivers/iio/dac/cio-dac.c
  
 +MEDIA CONTROLLER FRAMEWORK
 +M:    Sakari Ailus <sakari.ailus@linux.intel.com>
 +M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 +L:    linux-media@vger.kernel.org
 +W:    https://www.linuxtv.org
 +T:    git git://linuxtv.org/media_tree.git
 +S:    Supported
 +F:    drivers/media/mc/
 +F:    include/media/media-*.h
 +F:    include/uapi/linux/media.h
 +
  MEDIA DRIVERS FOR ASCOT2E
  M:    Sergey Kozlov <serjk@netup.ru>
  M:    Abylay Ospan <aospan@netup.ru>
@@@ -10236,7 -10100,6 +10245,7 @@@ Q:   http://patchwork.ozlabs.org/project/
  S:    Supported
  F:    drivers/net/ethernet/mellanox/mlx5/core/
  F:    include/linux/mlx5/
 +F:    Documentation/networking/device_drivers/mellanox/
  
  MELLANOX MLX5 IB driver
  M:    Leon Romanovsky <leonro@mellanox.com>
@@@ -10263,7 -10126,7 +10272,7 @@@ L:   linux-leds@vger.kernel.or
  S:    Supported
  F:    drivers/leds/leds-mlxcpld.c
  F:    drivers/leds/leds-mlxreg.c
 -F:    Documentation/leds/leds-mlxcpld.txt
 +F:    Documentation/leds/leds-mlxcpld.rst
  
  MELLANOX PLATFORM DRIVER
  M:    Vadim Pasternak <vadimp@mellanox.com>
@@@ -10347,7 -10210,7 +10356,7 @@@ F:   drivers/watchdog/menz69_wdt.
  
  MESON AO CEC DRIVER FOR AMLOGIC SOCS
  M:    Neil Armstrong <narmstrong@baylibre.com>
 -L:    linux-media@lists.freedesktop.org
 +L:    linux-media@vger.kernel.org
  L:    linux-amlogic@lists.infradead.org
  W:    http://linux-meson.com/
  S:    Supported
@@@ -10363,14 -10226,6 +10372,14 @@@ S: Maintaine
  F:    drivers/mtd/nand/raw/meson_*
  F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.txt
  
 +MESON VIDEO DECODER DRIVER FOR AMLOGIC SOCS
 +M:    Maxime Jourdan <mjourdan@baylibre.com>
 +L:    linux-media@vger.kernel.org
 +L:    linux-amlogic@lists.infradead.org
 +S:    Supported
 +F:    drivers/staging/media/meson/vdec/
 +T:    git git://linuxtv.org/media_tree.git
 +
  METHODE UDPU SUPPORT
  M:    Vladimir Vid <vladimir.vid@sartura.hr>
  S:    Maintained
@@@ -10424,9 -10279,7 +10433,9 @@@ MICROCHIP ISC DRIVE
  M:    Eugen Hristev <eugen.hristev@microchip.com>
  L:    linux-media@vger.kernel.org
  S:    Supported
 -F:    drivers/media/platform/atmel/atmel-isc.c
 +F:    drivers/media/platform/atmel/atmel-sama5d2-isc.c
 +F:    drivers/media/platform/atmel/atmel-isc.h
 +F:    drivers/media/platform/atmel/atmel-isc-base.c
  F:    drivers/media/platform/atmel/atmel-isc-regs.h
  F:    Documentation/devicetree/bindings/media/atmel-isc.txt
  
@@@ -10695,7 -10548,7 +10704,7 @@@ F:   arch/arm/boot/dts/mmp
  F:    arch/arm/mach-mmp/
  
  MMU GATHER AND TLB INVALIDATION
 -M:    Will Deacon <will.deacon@arm.com>
 +M:    Will Deacon <will@kernel.org>
  M:    "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
  M:    Andrew Morton <akpm@linux-foundation.org>
  M:    Nick Piggin <npiggin@gmail.com>
@@@ -11010,7 -10863,7 +11019,7 @@@ F:   drivers/net/ethernet/neterion
  
  NETFILTER
  M:    Pablo Neira Ayuso <pablo@netfilter.org>
 -M:    Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
 +M:    Jozsef Kadlecsik <kadlec@netfilter.org>
  M:    Florian Westphal <fw@strlen.de>
  L:    netfilter-devel@vger.kernel.org
  L:    coreteam@netfilter.org
@@@ -11223,18 -11076,11 +11232,18 @@@ L:        netdev@vger.kernel.or
  S:    Supported
  F:    drivers/net/ethernet/qlogic/netxen/
  
 +NEXTHOP
 +M:    David Ahern <dsahern@kernel.org>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    include/net/nexthop.h
 +F:    include/uapi/linux/nexthop.h
 +F:    include/net/netns/nexthop.h
 +F:    net/ipv4/nexthop.c
 +
  NFC SUBSYSTEM
 -M:    Samuel Ortiz <sameo@linux.intel.com>
 -L:    linux-wireless@vger.kernel.org
 -L:    linux-nfc@lists.01.org (subscribers-only)
 -S:    Supported
 +L:    netdev@vger.kernel.org
 +S:    Orphan
  F:    net/nfc/
  F:    include/net/nfc/
  F:    include/uapi/linux/nfc.h
@@@ -11261,7 -11107,7 +11270,7 @@@ F:   include/uapi/linux/nfs
  F:    include/uapi/linux/sunrpc/
  
  NILFS2 FILESYSTEM
 -M:    Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
 +M:    Ryusuke Konishi <konishi.ryusuke@gmail.com>
  L:    linux-nilfs@vger.kernel.org
  W:    https://nilfs.sourceforge.io/
  W:    https://nilfs.osdn.jp/
@@@ -11391,7 -11237,7 +11400,7 @@@ F:   drivers/video/fbdev/riva
  F:    drivers/video/fbdev/nvidia/
  
  NVM EXPRESS DRIVER
 -M:    Keith Busch <keith.busch@intel.com>
 +M:    Keith Busch <kbusch@kernel.org>
  M:    Jens Axboe <axboe@fb.com>
  M:    Christoph Hellwig <hch@lst.de>
  M:    Sagi Grimberg <sagi@grimberg.me>
@@@ -11435,7 -11281,7 +11444,7 @@@ NXP FXAS21002C DRIVE
  M:    Rui Miguel Silva <rmfrfs@gmail.com>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/iio/gyroscope/fxas21002c.txt
 +F:    Documentation/devicetree/bindings/iio/gyroscope/nxp,fxas21002c.txt
  F:    drivers/iio/gyro/fxas21002c_core.c
  F:    drivers/iio/gyro/fxas21002c.h
  F:    drivers/iio/gyro/fxas21002c_i2c.c
@@@ -11825,6 -11671,16 +11834,6 @@@ S:  Maintaine
  F:    drivers/mtd/nand/onenand/
  F:    include/linux/mtd/onenand*.h
  
 -ONSTREAM SCSI TAPE DRIVER
 -M:    Willem Riede <osst@riede.org>
 -L:    osst-users@lists.sourceforge.net
 -L:    linux-scsi@vger.kernel.org
 -S:    Maintained
 -F:    Documentation/scsi/osst.txt
 -F:    drivers/scsi/osst.*
 -F:    drivers/scsi/osst_*.h
 -F:    drivers/scsi/st.h
 -
  OP-TEE DRIVER
  M:    Jens Wiklander <jens.wiklander@linaro.org>
  S:    Maintained
@@@ -11881,7 -11737,6 +11890,7 @@@ M:   Peter Korsgaard <peter@korsgaard.com
  M:    Andrew Lunn <andrew@lunn.ch>
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/i2c/i2c-ocores.txt
  F:    Documentation/i2c/busses/i2c-ocores
  F:    drivers/i2c/busses/i2c-ocores.c
  F:    include/linux/platform_data/i2c-ocores.h
@@@ -12015,14 -11870,6 +12024,14 @@@ F: kernel/padata.
  F:    include/linux/padata.h
  F:    Documentation/padata.txt
  
 +PAGE POOL
 +M:    Jesper Dangaard Brouer <hawk@kernel.org>
 +M:    Ilias Apalodimas <ilias.apalodimas@linaro.org>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    net/core/page_pool.c
 +F:    include/net/page_pool.h
 +
  PANASONIC LAPTOP ACPI EXTRAS DRIVER
  M:    Harald Welte <laforge@gnumonks.org>
  L:    platform-driver-x86@vger.kernel.org
@@@ -12191,7 -12038,7 +12200,7 @@@ S:   Maintaine
  F:    drivers/pci/controller/dwc/*layerscape*
  
  PCI DRIVER FOR GENERIC OF HOSTS
 -M:    Will Deacon <will.deacon@arm.com>
 +M:    Will Deacon <will@kernel.org>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -12716,7 -12563,8 +12725,7 @@@ S:   Orpha
  F:    drivers/scsi/pmcraid.*
  
  PMC SIERRA PM8001 DRIVER
 -M:    Jack Wang <jinpu.wang@profitbricks.com>
 -M:    lindar_liu@usish.com
 +M:    Jack Wang <jinpu.wang@cloud.ionos.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/pm8001/
@@@ -12810,7 -12658,7 +12819,7 @@@ M:   Rodolfo Giometti <giometti@enneenne.
  W:    http://wiki.enneenne.com/index.php/LinuxPPS_support
  L:    linuxpps@ml.enneenne.com (subscribers-only)
  S:    Maintained
 -F:    Documentation/pps/
 +F:    Documentation/driver-api/pps.rst
  F:    Documentation/devicetree/bindings/pps/pps-gpio.txt
  F:    Documentation/ABI/testing/sysfs-pps
  F:    drivers/pps/
@@@ -12916,7 -12764,7 +12925,7 @@@ L:   netdev@vger.kernel.or
  S:    Maintained
  W:    http://linuxptp.sourceforge.net/
  F:    Documentation/ABI/testing/sysfs-ptp
 -F:    Documentation/ptp/*
 +F:    Documentation/driver-api/ptp.rst
  F:    drivers/net/phy/dp83640*
  F:    drivers/ptp/*
  F:    include/linux/ptp_cl*
@@@ -12930,6 -12778,7 +12939,6 @@@ F:   include/linux/regset.
  F:    include/linux/tracehook.h
  F:    include/uapi/linux/ptrace.h
  F:    include/uapi/linux/ptrace.h
 -F:    include/asm-generic/ptrace.h
  F:    kernel/ptrace.c
  F:    arch/*/ptrace*.c
  F:    arch/*/*/ptrace*.c
@@@ -13207,6 -13056,7 +13216,6 @@@ F:   Documentation/devicetree/bindings/ne
  
  QUALCOMM GENERIC INTERFACE I2C DRIVER
  M:    Alok Chauhan <alokc@codeaurora.org>
 -M:    Karthikeyan Ramasubramanian <kramasub@codeaurora.org>
  L:    linux-i2c@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Supported
@@@ -13526,7 -13376,6 +13535,7 @@@ F:   drivers/clk/renesas
  RENESAS EMEV2 I2C DRIVER
  M:    Wolfram Sang <wsa+renesas@sang-engineering.com>
  S:    Supported
 +F:    Documentation/devicetree/bindings/i2c/i2c-emev2.txt
  F:    drivers/i2c/busses/i2c-emev2.c
  
  RENESAS ETHERNET DRIVERS
@@@ -13548,8 -13397,6 +13557,8 @@@ F:   drivers/iio/adc/rcar-gyroadc.
  RENESAS R-CAR I2C DRIVERS
  M:    Wolfram Sang <wsa+renesas@sang-engineering.com>
  S:    Supported
 +F:    Documentation/devicetree/bindings/i2c/i2c-rcar.txt
 +F:    Documentation/devicetree/bindings/i2c/i2c-sh_mobile.txt
  F:    drivers/i2c/busses/i2c-rcar.c
  F:    drivers/i2c/busses/i2c-sh_mobile.c
  
@@@ -13647,11 -13494,11 +13656,11 @@@ S:        Maintaine
  F:    drivers/media/platform/rockchip/rga/
  F:    Documentation/devicetree/bindings/media/rockchip-rga.txt
  
 -ROCKCHIP VPU CODEC DRIVER
 +HANTRO 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:    drivers/staging/media/platform/hantro/
  F:    Documentation/devicetree/bindings/media/rockchip-vpu.txt
  
  ROCKER DRIVER
@@@ -13780,9 -13627,8 +13789,9 @@@ S:   Maintaine
  F:    drivers/video/fbdev/savage/
  
  S390
 -M:    Martin Schwidefsky <schwidefsky@de.ibm.com>
  M:    Heiko Carstens <heiko.carstens@de.ibm.com>
 +M:    Vasily Gorbik <gor@linux.ibm.com>
 +M:    Christian Borntraeger <borntraeger@de.ibm.com>
  L:    linux-s390@vger.kernel.org
  W:    http://www.ibm.com/developerworks/linux/linux390/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
@@@ -13852,7 -13698,7 +13861,7 @@@ L:   linux-s390@vger.kernel.or
  L:    kvm@vger.kernel.org
  S:    Supported
  F:    drivers/s390/cio/vfio_ccw*
 -F:    Documentation/s390/vfio-ccw.txt
 +F:    Documentation/s390/vfio-ccw.rst
  F:    include/uapi/linux/vfio_ccw.h
  
  S390 ZCRYPT DRIVER
@@@ -13872,7 -13718,7 +13881,7 @@@ S:   Supporte
  F:    drivers/s390/crypto/vfio_ap_drv.c
  F:    drivers/s390/crypto/vfio_ap_private.h
  F:    drivers/s390/crypto/vfio_ap_ops.c
 -F:    Documentation/s390/vfio-ap.txt
 +F:    Documentation/s390/vfio-ap.rst
  
  S390 ZFCP DRIVER
  M:    Steffen Maier <maier@linux.ibm.com>
@@@ -14311,12 -14157,6 +14320,12 @@@ S: Maintaine
  F:    drivers/misc/phantom.c
  F:    include/uapi/linux/phantom.h
  
 +SENSIRION SPS30 AIR POLLUTION SENSOR DRIVER
 +M:    Tomasz Duszynski <tduszyns@gmail.com>
 +S:    Maintained
 +F:    drivers/iio/chemical/sps30.c
 +F:    Documentation/devicetree/bindings/iio/chemical/sensirion,sps30.yaml
 +
  SERIAL DEVICE BUS
  M:    Rob Herring <robh@kernel.org>
  L:    linux-serial@vger.kernel.org
@@@ -14491,15 -14331,6 +14500,15 @@@ S: Supporte
  K:    sifive
  N:    sifive
  
 +SIFIVE FU540 SYSTEM-ON-CHIP
 +M:    Paul Walmsley <paul.walmsley@sifive.com>
 +M:    Palmer Dabbelt <palmer@sifive.com>
 +L:    linux-riscv@lists.infradead.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pjw/sifive.git
 +S:    Supported
 +K:    fu540
 +N:    fu540
 +
  SILEAD TOUCHSCREEN DRIVER
  M:    Hans de Goede <hdegoede@redhat.com>
  L:    linux-input@vger.kernel.org
@@@ -14515,7 -14346,7 +14524,7 @@@ M:   Sudip Mukherjee <sudip.mukherjee@cod
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
  F:    drivers/video/fbdev/sm712*
 -F:    Documentation/fb/sm712fb.txt
 +F:    Documentation/fb/sm712fb.rst
  
  SIMPLE FIRMWARE INTERFACE (SFI)
  M:    Len Brown <lenb@kernel.org>
@@@ -14531,7 -14362,7 +14540,7 @@@ SIMPLEFB FB DRIVE
  M:    Hans de Goede <hdegoede@redhat.com>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/display/simple-framebuffer.txt
 +F:    Documentation/devicetree/bindings/display/simple-framebuffer.yaml
  F:    drivers/video/fbdev/simplefb.c
  F:    include/linux/platform_data/simplefb.h
  
@@@ -14560,7 -14391,7 +14569,7 @@@ F:   lib/test_siphash.
  F:    include/linux/siphash.h
  
  SIOX
 -M:    Gavin Schenk <g.schenk@eckelmann.de>
 +M:    Thorsten Scherer <t.scherer@eckelmann.de>
  M:    Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
  R:    Pengutronix Kernel Team <kernel@pengutronix.de>
  S:    Supported
@@@ -14585,7 -14416,7 +14594,7 @@@ SIS FRAMEBUFFER DRIVE
  M:    Thomas Winischhofer <thomas@winischhofer.net>
  W:    http://www.winischhofer.net/linuxsisvga.shtml
  S:    Maintained
 -F:    Documentation/fb/sisfb.txt
 +F:    Documentation/fb/sisfb.rst
  F:    drivers/video/fbdev/sis/
  F:    include/video/sisfb.h
  
@@@ -14777,14 -14608,6 +14786,14 @@@ S: Maintaine
  F:    drivers/net/ethernet/socionext/netsec.c
  F:    Documentation/devicetree/bindings/net/socionext-netsec.txt
  
 +SOCIONEXT (SNI) Synquacer SPI DRIVER
 +M:    Masahisa Kojima <masahisa.kojima@linaro.org>
 +M:    Jassi Brar <jaswinder.singh@linaro.org>
 +L:    linux-spi@vger.kernel.org
 +S:    Maintained
 +F:    drivers/spi/spi-synquacer.c
 +F:    Documentation/devicetree/bindings/spi/spi-synquacer.txt
 +
  SOLIDRUN CLEARFOG SUPPORT
  M:    Russell King <linux@armlinux.org.uk>
  S:    Maintained
@@@ -15091,17 -14914,6 +15100,17 @@@ L: linux-erofs@lists.ozlabs.or
  S:    Maintained
  F:    drivers/staging/erofs/
  
 +STAGING - FIELDBUS SUBSYSTEM
 +M:    Sven Van Asbroeck <TheSven73@gmail.com>
 +S:    Maintained
 +F:    drivers/staging/fieldbus/*
 +F:    drivers/staging/fieldbus/Documentation/
 +
 +STAGING - HMS ANYBUS-S BUS
 +M:    Sven Van Asbroeck <TheSven73@gmail.com>
 +S:    Maintained
 +F:    drivers/staging/fieldbus/anybuss/
 +
  STAGING - INDUSTRIAL IO
  M:    Jonathan Cameron <jic23@kernel.org>
  L:    linux-iio@vger.kernel.org
@@@ -15178,7 -14990,7 +15187,7 @@@ S:   Odd Fixe
  F:    drivers/net/ethernet/adaptec/starfire*
  
  STEC S1220 SKD DRIVER
 -M:    Bart Van Assche <bart.vanassche@wdc.com>
 +M:    Damien Le Moal <Damien.LeMoal@wdc.com>
  L:    linux-block@vger.kernel.org
  S:    Maintained
  F:    drivers/block/skd*[ch]
@@@ -15669,7 -15481,6 +15678,7 @@@ F:   drivers/dma/tegra
  
  TEGRA I2C DRIVER
  M:    Laxman Dewangan <ldewangan@nvidia.com>
 +R:    Dmitry Osipenko <digetx@gmail.com>
  S:    Supported
  F:    drivers/i2c/busses/i2c-tegra.c
  
@@@ -15874,7 -15685,6 +15883,7 @@@ R:   Bartosz Golaszewski <bgolaszewski@ba
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci.git
  S:    Supported
 +F:    Documentation/devicetree/bindings/i2c/i2c-davinci.txt
  F:    arch/arm/mach-davinci/
  F:    drivers/i2c/busses/i2c-davinci.c
  F:    arch/arm/boot/dts/da850*
@@@ -16423,7 -16233,7 +16432,7 @@@ USB ACM DRIVE
  M:    Oliver Neukum <oneukum@suse.com>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
 -F:    Documentation/usb/acm.txt
 +F:    Documentation/usb/acm.rst
  F:    drivers/usb/class/cdc-acm.*
  
  USB AR5523 WIRELESS DRIVER
@@@ -16476,7 -16286,7 +16485,7 @@@ USB EHCI DRIVE
  M:    Alan Stern <stern@rowland.harvard.edu>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
 -F:    Documentation/usb/ehci.txt
 +F:    Documentation/usb/ehci.rst
  F:    drivers/usb/host/ehci*
  
  USB GADGET/PERIPHERAL SUBSYSTEM
@@@ -16494,7 -16304,7 +16503,7 @@@ M:   Benjamin Tissoires <benjamin.tissoir
  L:    linux-usb@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
  S:    Maintained
 -F:    Documentation/hid/hiddev.txt
 +F:    Documentation/hid/hiddev.rst
  F:    drivers/hid/usbhid/
  
  USB INTEL XHCI ROLE MUX DRIVER
@@@ -16550,7 -16360,7 +16559,7 @@@ USB OHCI DRIVE
  M:    Alan Stern <stern@rowland.harvard.edu>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
 -F:    Documentation/usb/ohci.txt
 +F:    Documentation/usb/ohci.rst
  F:    drivers/usb/host/ohci*
  
  USB OTG FSM (Finite State Machine)
@@@ -16566,7 -16376,7 +16575,7 @@@ M:   Shuah Khan <shuah@kernel.org
  M:    Shuah Khan <skhan@linuxfoundation.org>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
 -F:    Documentation/usb/usbip_protocol.txt
 +F:    Documentation/usb/usbip_protocol.rst
  F:    drivers/usb/usbip/
  F:    tools/usb/usbip/
  F:    tools/testing/selftests/drivers/usb/usbip/
@@@ -16614,7 -16424,7 +16623,7 @@@ M:   Johan Hovold <johan@kernel.org
  L:    linux-usb@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial.git
  S:    Maintained
 -F:    Documentation/usb/usb-serial.txt
 +F:    Documentation/usb/usb-serial.rst
  F:    drivers/usb/serial/
  F:    include/linux/usb/serial.h
  
@@@ -16793,7 -16603,7 +16802,7 @@@ M:   Michal Januszewski <spock@gentoo.org
  L:    linux-fbdev@vger.kernel.org
  W:    https://github.com/mjanusz/v86d
  S:    Maintained
 -F:    Documentation/fb/uvesafb.txt
 +F:    Documentation/fb/uvesafb.rst
  F:    drivers/video/fbdev/uvesafb.*
  
  VF610 NAND DRIVER
@@@ -16868,7 -16678,7 +16877,7 @@@ S:   Maintaine
  F:    drivers/net/ethernet/via/via-velocity.*
  
  VICODEC VIRTUAL CODEC DRIVER
 -M:    Hans Verkuil <hans.verkuil@cisco.com>
 +M:    Hans Verkuil <hverkuil-cisco@xs4all.nl>
  L:    linux-media@vger.kernel.org
  T:    git git://linuxtv.org/media_tree.git
  W:    https://linuxtv.org
@@@ -16891,7 -16701,6 +16900,7 @@@ VIDEOBUF2 FRAMEWOR
  M:    Pawel Osciak <pawel@osciak.com>
  M:    Marek Szyprowski <m.szyprowski@samsung.com>
  M:    Kyungmin Park <kyungmin.park@samsung.com>
 +R:    Tomasz Figa <tfiga@chromium.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  F:    drivers/media/common/videobuf2/*
@@@ -17450,7 -17259,6 +17459,7 @@@ N:   xd
  XDP SOCKETS (AF_XDP)
  M:    Björn Töpel <bjorn.topel@intel.com>
  M:    Magnus Karlsson <magnus.karlsson@intel.com>
 +R:    Jonathan Lemon <jonathan.lemon@gmail.com>
  L:    netdev@vger.kernel.org
  L:    bpf@vger.kernel.org
  S:    Maintained
@@@ -17498,7 -17306,7 +17507,7 @@@ F:   Documentation/ABI/stable/sysfs-hyper
  F:    Documentation/ABI/testing/sysfs-hypervisor-xen
  
  XEN NETWORK BACKEND DRIVER
 -M:    Wei Liu <wei.liu2@citrix.com>
 +M:    Wei Liu <wei.liu@kernel.org>
  M:    Paul Durrant <paul.durrant@citrix.com>
  L:    xen-devel@lists.xenproject.org (moderated for non-subscribers)
  L:    netdev@vger.kernel.org
@@@ -17544,13 -17352,7 +17553,13 @@@ W: http://xfs.org
  T:    git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git
  S:    Supported
  F:    Documentation/filesystems/xfs.txt
 +F:    Documentation/ABI/testing/sysfs-fs-xfs
 +F:    Documentation/filesystems/xfs.txt
 +F:    Documentation/filesystems/xfs-delayed-logging-design.txt
 +F:    Documentation/filesystems/xfs-self-describing-metadata.txt
  F:    fs/xfs/
 +F:    include/uapi/linux/dqblk_xfs.h
 +F:    include/uapi/linux/fsmap.h
  
  XILINX AXI ETHERNET DRIVER
  M:    Anirudha Sarangi <anirudh@xilinx.com>
@@@ -17586,7 -17388,6 +17595,7 @@@ M:   Jan Glauber <jglauber@cavium.com
  L:    linux-i2c@vger.kernel.org
  W:    http://www.cavium.com
  S:    Supported
 +F:    Documentation/devicetree/bindings/i2c/i2c-xlp9xx.txt
  F:    drivers/i2c/busses/i2c-xlp9xx.c
  
  XRA1403 GPIO EXPANDER
@@@ -17670,12 -17471,6 +17679,12 @@@ Q: https://patchwork.linuxtv.org/projec
  S:    Maintained
  F:    drivers/media/dvb-frontends/zd1301_demod*
  
 +ZHAOXIN PROCESSOR SUPPORT
 +M:    Tony W Wang-oc <TonyWWang-oc@zhaoxin.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    arch/x86/kernel/cpu/zhaoxin.c
 +
  ZPOOL COMPRESSED PAGE STORAGE API
  M:    Dan Streetman <ddstreet@ieee.org>
  L:    linux-mm@kvack.org
index 068729bf4f8657be05618c4aab58de8d2e4419de,3a94e4db0c8eb829513f9b3f1767a8baf55f37ab..ea8962645e49c0f53347fcfd592886896fb6a1ac
@@@ -1,7 -1,6 +1,7 @@@
 +# SPDX-License-Identifier: GPL-2.0-only
  # Aspeed pinctrl support
  
  ccflags-y += $(call cc-option,-Woverride-init)
- obj-$(CONFIG_PINCTRL_ASPEED)  += pinctrl-aspeed.o
+ obj-$(CONFIG_PINCTRL_ASPEED)  += pinctrl-aspeed.o pinmux-aspeed.o
  obj-$(CONFIG_PINCTRL_ASPEED_G4)       += pinctrl-aspeed-g4.o
  obj-$(CONFIG_PINCTRL_ASPEED_G5)       += pinctrl-aspeed-g5.o
index 73e2c9c0e5496e9bf0d873adc30c9325a978a909,37f325fb5d7c83a6b56d0d3206839d58b2dedb21..384396cbb22d21a00bf6f71f6fe7881bbfabf475
@@@ -1,6 -1,10 +1,6 @@@
 +// SPDX-License-Identifier: GPL-2.0-or-later
  /*
   * Copyright (C) 2016 IBM Corp.
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License as published by
 - * the Free Software Foundation; either version 2 of the License, or
 - * (at your option) any later version.
   */
  #include <linux/bitops.h>
  #include <linux/init.h>
  
  #include "../core.h"
  #include "../pinctrl-utils.h"
+ #include "pinmux-aspeed.h"
  #include "pinctrl-aspeed.h"
  
+ /*
+  * The "Multi-function Pins Mapping and Control" table in the SoC datasheet
+  * references registers by the device/offset mnemonic. The register macros
+  * below are named the same way to ease transcription and verification (as
+  * opposed to naming them e.g. PINMUX_CTRL_[0-9]). Further, signal expressions
+  * reference registers beyond those dedicated to pinmux, such as the system
+  * reset control and MAC clock configuration registers.
+  */
+ #define SCU2C           0x2C /* Misc. Control Register */
+ #define SCU3C           0x3C /* System Reset Control/Status Register */
+ #define SCU48           0x48 /* MAC Interface Clock Delay Setting */
+ #define HW_STRAP1       0x70 /* AST2400 strapping is 33 bits, is split */
+ #define HW_REVISION_ID  0x7C /* Silicon revision ID register */
+ #define SCU80           0x80 /* Multi-function Pin Control #1 */
+ #define SCU84           0x84 /* Multi-function Pin Control #2 */
+ #define SCU88           0x88 /* Multi-function Pin Control #3 */
+ #define SCU8C           0x8C /* Multi-function Pin Control #4 */
+ #define SCU90           0x90 /* Multi-function Pin Control #5 */
+ #define SCU94           0x94 /* Multi-function Pin Control #6 */
+ #define SCUA0           0xA0 /* Multi-function Pin Control #7 */
+ #define SCUA4           0xA4 /* Multi-function Pin Control #8 */
+ #define SCUA8           0xA8 /* Multi-function Pin Control #9 */
+ #define SCUAC           0xAC /* Multi-function Pin Control #10 */
+ #define HW_STRAP2       0xD0 /* Strapping */
  /*
   * Uses undefined macros for symbol naming and references, eg GPIOA0, MAC1LINK,
   * TIMER3 etc.
@@@ -2386,13 -2416,73 +2412,73 @@@ static const struct aspeed_pin_config a
        { PIN_CONFIG_INPUT_DEBOUNCE, { C14, B14 }, SCUA8, 27 },
  };
  
+ static int aspeed_g4_sig_expr_set(const struct aspeed_pinmux_data *ctx,
+                                 const struct aspeed_sig_expr *expr,
+                                 bool enable)
+ {
+       int ret;
+       int i;
+       for (i = 0; i < expr->ndescs; i++) {
+               const struct aspeed_sig_desc *desc = &expr->descs[i];
+               u32 pattern = enable ? desc->enable : desc->disable;
+               u32 val = (pattern << __ffs(desc->mask));
+               if (!ctx->maps[desc->ip])
+                       return -ENODEV;
+               /*
+                * Strap registers are configured in hardware or by early-boot
+                * firmware. Treat them as read-only despite that we can write
+                * them. This may mean that certain functions cannot be
+                * deconfigured and is the reason we re-evaluate after writing
+                * all descriptor bits.
+                *
+                * Port D and port E GPIO loopback modes are the only exception
+                * as those are commonly used with front-panel buttons to allow
+                * normal operation of the host when the BMC is powered off or
+                * fails to boot. Once the BMC has booted, the loopback mode
+                * must be disabled for the BMC to control host power-on and
+                * reset.
+                */
+               if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP1 &&
+                   !(desc->mask & (BIT(21) | BIT(22))))
+                       continue;
+               if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP2)
+                       continue;
+               ret = regmap_update_bits(ctx->maps[desc->ip], desc->reg,
+                                        desc->mask, val);
+               if (ret)
+                       return ret;
+       }
+       ret = aspeed_sig_expr_eval(ctx, expr, enable);
+       if (ret < 0)
+               return ret;
+       if (!ret)
+               return -EPERM;
+       return 0;
+ }
+ static const struct aspeed_pinmux_ops aspeed_g4_ops = {
+       .set = aspeed_g4_sig_expr_set,
+ };
  static struct aspeed_pinctrl_data aspeed_g4_pinctrl_data = {
        .pins = aspeed_g4_pins,
        .npins = ARRAY_SIZE(aspeed_g4_pins),
-       .groups = aspeed_g4_groups,
-       .ngroups = ARRAY_SIZE(aspeed_g4_groups),
-       .functions = aspeed_g4_functions,
-       .nfunctions = ARRAY_SIZE(aspeed_g4_functions),
+       .pinmux = {
+               .ops = &aspeed_g4_ops,
+               .groups = aspeed_g4_groups,
+               .ngroups = ARRAY_SIZE(aspeed_g4_groups),
+               .functions = aspeed_g4_functions,
+               .nfunctions = ARRAY_SIZE(aspeed_g4_functions),
+       },
        .configs = aspeed_g4_configs,
        .nconfigs = ARRAY_SIZE(aspeed_g4_configs),
  };
index aa7e148b38bb04faea3cfbd971f5f3d8a1d22f14,ec48c59e84aebfd3272902760849276392221c27..053101f795a29938ec059a395fcee3b498cbf757
@@@ -1,6 -1,10 +1,6 @@@
 +// SPDX-License-Identifier: GPL-2.0-or-later
  /*
   * Copyright (C) 2016 IBM Corp.
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License as published by
 - * the Free Software Foundation; either version 2 of the License, or
 - * (at your option) any later version.
   */
  #include <linux/bitops.h>
  #include <linux/init.h>
  #include "../pinctrl-utils.h"
  #include "pinctrl-aspeed.h"
  
+ /*
+  * The "Multi-function Pins Mapping and Control" table in the SoC datasheet
+  * references registers by the device/offset mnemonic. The register macros
+  * below are named the same way to ease transcription and verification (as
+  * opposed to naming them e.g. PINMUX_CTRL_[0-9]). Further, signal expressions
+  * reference registers beyond those dedicated to pinmux, such as the system
+  * reset control and MAC clock configuration registers. The AST2500 goes a step
+  * further and references registers in the graphics IP block.
+  */
+ #define SCU2C           0x2C /* Misc. Control Register */
+ #define SCU3C           0x3C /* System Reset Control/Status Register */
+ #define SCU48           0x48 /* MAC Interface Clock Delay Setting */
+ #define HW_STRAP1       0x70 /* AST2400 strapping is 33 bits, is split */
+ #define HW_REVISION_ID  0x7C /* Silicon revision ID register */
+ #define SCU80           0x80 /* Multi-function Pin Control #1 */
+ #define SCU84           0x84 /* Multi-function Pin Control #2 */
+ #define SCU88           0x88 /* Multi-function Pin Control #3 */
+ #define SCU8C           0x8C /* Multi-function Pin Control #4 */
+ #define SCU90           0x90 /* Multi-function Pin Control #5 */
+ #define SCU94           0x94 /* Multi-function Pin Control #6 */
+ #define SCUA0           0xA0 /* Multi-function Pin Control #7 */
+ #define SCUA4           0xA4 /* Multi-function Pin Control #8 */
+ #define SCUA8           0xA8 /* Multi-function Pin Control #9 */
+ #define SCUAC           0xAC /* Multi-function Pin Control #10 */
+ #define HW_STRAP2       0xD0 /* Strapping */
  #define ASPEED_G5_NR_PINS 236
  
  #define COND1         { ASPEED_IP_SCU, SCU90, BIT(6), 0, 0 }
@@@ -573,6 -603,8 +599,8 @@@ SS_PIN_DECL(N3, GPIOJ2, SGPMO)
  SIG_EXPR_LIST_DECL_SINGLE(SGPMI, SGPM, SIG_DESC_SET(SCU84, 11));
  SS_PIN_DECL(N4, GPIOJ3, SGPMI);
  
+ FUNC_GROUP_DECL(SGPM, R2, L2, N3, N4);
  #define N5 76
  SIG_EXPR_LIST_DECL_SINGLE(VGAHS, VGAHS, SIG_DESC_SET(SCU84, 12));
  SIG_EXPR_LIST_DECL_SINGLE(DASHN5, DASHN5, SIG_DESC_SET(SCU94, 8));
@@@ -2123,6 -2155,7 +2151,7 @@@ static const struct aspeed_pin_group as
        ASPEED_PINCTRL_GROUP(SD2),
        ASPEED_PINCTRL_GROUP(SDA1),
        ASPEED_PINCTRL_GROUP(SDA2),
+       ASPEED_PINCTRL_GROUP(SGPM),
        ASPEED_PINCTRL_GROUP(SGPS1),
        ASPEED_PINCTRL_GROUP(SGPS2),
        ASPEED_PINCTRL_GROUP(SIOONCTRL),
@@@ -2292,6 -2325,7 +2321,7 @@@ static const struct aspeed_pin_functio
        ASPEED_PINCTRL_FUNC(SD2),
        ASPEED_PINCTRL_FUNC(SDA1),
        ASPEED_PINCTRL_FUNC(SDA2),
+       ASPEED_PINCTRL_FUNC(SGPM),
        ASPEED_PINCTRL_FUNC(SGPS1),
        ASPEED_PINCTRL_FUNC(SGPS2),
        ASPEED_PINCTRL_FUNC(SIOONCTRL),
@@@ -2477,13 -2511,98 +2507,98 @@@ static struct aspeed_pin_config aspeed_
        { PIN_CONFIG_INPUT_DEBOUNCE, { A20, B19 }, SCUA8, 27 },
  };
  
+ /**
+  * Configure a pin's signal by applying an expression's descriptor state for
+  * all descriptors in the expression.
+  *
+  * @ctx: The pinmux context
+  * @expr: The expression associated with the function whose signal is to be
+  *        configured
+  * @enable: true to enable an function's signal through a pin's signal
+  *          expression, false to disable the function's signal
+  *
+  * Return: 0 if the expression is configured as requested and a negative error
+  * code otherwise
+  */
+ static int aspeed_g5_sig_expr_set(const struct aspeed_pinmux_data *ctx,
+                                 const struct aspeed_sig_expr *expr,
+                                 bool enable)
+ {
+       int ret;
+       int i;
+       for (i = 0; i < expr->ndescs; i++) {
+               const struct aspeed_sig_desc *desc = &expr->descs[i];
+               u32 pattern = enable ? desc->enable : desc->disable;
+               u32 val = (pattern << __ffs(desc->mask));
+               if (!ctx->maps[desc->ip])
+                       return -ENODEV;
+               /*
+                * Strap registers are configured in hardware or by early-boot
+                * firmware. Treat them as read-only despite that we can write
+                * them. This may mean that certain functions cannot be
+                * deconfigured and is the reason we re-evaluate after writing
+                * all descriptor bits.
+                *
+                * Port D and port E GPIO loopback modes are the only exception
+                * as those are commonly used with front-panel buttons to allow
+                * normal operation of the host when the BMC is powered off or
+                * fails to boot. Once the BMC has booted, the loopback mode
+                * must be disabled for the BMC to control host power-on and
+                * reset.
+                */
+               if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP1 &&
+                   !(desc->mask & (BIT(21) | BIT(22))))
+                       continue;
+               if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP2)
+                       continue;
+               /* On AST2500, Set bits in SCU70 are cleared from SCU7C */
+               if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP1) {
+                       u32 value = ~val & desc->mask;
+                       if (value) {
+                               ret = regmap_write(ctx->maps[desc->ip],
+                                                  HW_REVISION_ID, value);
+                               if (ret < 0)
+                                       return ret;
+                       }
+               }
+               ret = regmap_update_bits(ctx->maps[desc->ip], desc->reg,
+                                        desc->mask, val);
+               if (ret)
+                       return ret;
+       }
+       ret = aspeed_sig_expr_eval(ctx, expr, enable);
+       if (ret < 0)
+               return ret;
+       if (!ret)
+               return -EPERM;
+       return 0;
+ }
+ static const struct aspeed_pinmux_ops aspeed_g5_ops = {
+       .set = aspeed_g5_sig_expr_set,
+ };
  static struct aspeed_pinctrl_data aspeed_g5_pinctrl_data = {
        .pins = aspeed_g5_pins,
        .npins = ARRAY_SIZE(aspeed_g5_pins),
-       .groups = aspeed_g5_groups,
-       .ngroups = ARRAY_SIZE(aspeed_g5_groups),
-       .functions = aspeed_g5_functions,
-       .nfunctions = ARRAY_SIZE(aspeed_g5_functions),
+       .pinmux = {
+               .ops = &aspeed_g5_ops,
+               .groups = aspeed_g5_groups,
+               .ngroups = ARRAY_SIZE(aspeed_g5_groups),
+               .functions = aspeed_g5_functions,
+               .nfunctions = ARRAY_SIZE(aspeed_g5_functions),
+       },
        .configs = aspeed_g5_configs,
        .nconfigs = ARRAY_SIZE(aspeed_g5_configs),
  };
@@@ -2539,7 -2658,7 +2654,7 @@@ static int aspeed_g5_pinctrl_probe(stru
                dev_warn(&pdev->dev, "No GFX phandle found, some mux configurations may fail\n");
                map = NULL;
        }
-       aspeed_g5_pinctrl_data.maps[ASPEED_IP_GFX] = map;
+       aspeed_g5_pinctrl_data.pinmux.maps[ASPEED_IP_GFX] = map;
  
        node = of_parse_phandle(pdev->dev.of_node, "aspeed,external-nodes", 1);
        if (node) {
                map = NULL;
        }
        of_node_put(node);
-       aspeed_g5_pinctrl_data.maps[ASPEED_IP_LPC] = map;
+       aspeed_g5_pinctrl_data.pinmux.maps[ASPEED_IP_LPC] = map;
  
        return aspeed_pinctrl_probe(pdev, &aspeed_g5_pinctrl_desc,
                        &aspeed_g5_pinctrl_data);
index 4c775b8ffdc4eb582a17df9387148f5d4f3f0b0b,0a162ca24b9a278a70a5f50f898bc89f691126e5..535db3de490b73adbc122402ab6dc3da77be42d4
@@@ -1,6 -1,10 +1,6 @@@
 +// SPDX-License-Identifier: GPL-2.0-or-later
  /*
   * Copyright (C) 2016 IBM Corp.
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License as published by
 - * the Free Software Foundation; either version 2 of the License, or
 - * (at your option) any later version.
   */
  
  #include <linux/mfd/syscon.h>
  #include "../core.h"
  #include "pinctrl-aspeed.h"
  
- static const char *const aspeed_pinmux_ips[] = {
-       [ASPEED_IP_SCU] = "SCU",
-       [ASPEED_IP_GFX] = "GFX",
-       [ASPEED_IP_LPC] = "LPC",
- };
  int aspeed_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
  {
        struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  
-       return pdata->ngroups;
+       return pdata->pinmux.ngroups;
  }
  
  const char *aspeed_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
@@@ -28,7 -26,7 +22,7 @@@
  {
        struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  
-       return pdata->groups[group].name;
+       return pdata->pinmux.groups[group].name;
  }
  
  int aspeed_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
@@@ -37,8 -35,8 +31,8 @@@
  {
        struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  
-       *pins = &pdata->groups[group].pins[0];
-       *npins = pdata->groups[group].npins;
+       *pins = &pdata->pinmux.groups[group].pins[0];
+       *npins = pdata->pinmux.groups[group].npins;
  
        return 0;
  }
@@@ -53,7 -51,7 +47,7 @@@ int aspeed_pinmux_get_fn_count(struct p
  {
        struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  
-       return pdata->nfunctions;
+       return pdata->pinmux.nfunctions;
  }
  
  const char *aspeed_pinmux_get_fn_name(struct pinctrl_dev *pctldev,
@@@ -61,7 -59,7 +55,7 @@@
  {
        struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  
-       return pdata->functions[function].name;
+       return pdata->pinmux.functions[function].name;
  }
  
  int aspeed_pinmux_get_fn_groups(struct pinctrl_dev *pctldev,
  {
        struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  
-       *groups = pdata->functions[function].groups;
-       *num_groups = pdata->functions[function].ngroups;
+       *groups = pdata->pinmux.functions[function].groups;
+       *num_groups = pdata->pinmux.functions[function].ngroups;
  
        return 0;
  }
  
- static inline void aspeed_sig_desc_print_val(
-               const struct aspeed_sig_desc *desc, bool enable, u32 rv)
- {
-       pr_debug("Want %s%X[0x%08X]=0x%X, got 0x%X from 0x%08X\n",
-                       aspeed_pinmux_ips[desc->ip], desc->reg,
-                       desc->mask, enable ? desc->enable : desc->disable,
-                       (rv & desc->mask) >> __ffs(desc->mask), rv);
- }
- /**
-  * Query the enabled or disabled state of a signal descriptor
-  *
-  * @desc: The signal descriptor of interest
-  * @enabled: True to query the enabled state, false to query disabled state
-  * @map: The IP block's regmap instance
-  *
-  * Return: 1 if the descriptor's bitfield is configured to the state
-  * selected by @enabled, 0 if not, and less than zero if an unrecoverable
-  * failure occurred
-  *
-  * Evaluation of descriptor state is non-trivial in that it is not a binary
-  * outcome: The bitfields can be greater than one bit in size and thus can take
-  * a value that is neither the enabled nor disabled state recorded in the
-  * descriptor (typically this means a different function to the one of interest
-  * is enabled). Thus we must explicitly test for either condition as required.
-  */
- static int aspeed_sig_desc_eval(const struct aspeed_sig_desc *desc,
-                                bool enabled, struct regmap *map)
+ static int aspeed_sig_expr_enable(const struct aspeed_pinmux_data *ctx,
+                                 const struct aspeed_sig_expr *expr)
  {
        int ret;
-       unsigned int raw;
-       u32 want;
  
-       if (!map)
-               return -ENODEV;
-       ret = regmap_read(map, desc->reg, &raw);
-       if (ret)
-               return ret;
-       aspeed_sig_desc_print_val(desc, enabled, raw);
-       want = enabled ? desc->enable : desc->disable;
-       return ((raw & desc->mask) >> __ffs(desc->mask)) == want;
- }
- /**
-  * Query the enabled or disabled state for a mux function's signal on a pin
-  *
-  * @expr: An expression controlling the signal for a mux function on a pin
-  * @enabled: True to query the enabled state, false to query disabled state
-  * @maps: The list of regmap instances
-  *
-  * Return: 1 if the expression composed by @enabled evaluates true, 0 if not,
-  * and less than zero if an unrecoverable failure occurred.
-  *
-  * A mux function is enabled or disabled if the function's signal expression
-  * for each pin in the function's pin group evaluates true for the desired
-  * state. An signal expression evaluates true if all of its associated signal
-  * descriptors evaluate true for the desired state.
-  *
-  * If an expression's state is described by more than one bit, either through
-  * multi-bit bitfields in a single signal descriptor or through multiple signal
-  * descriptors of a single bit then it is possible for the expression to be in
-  * neither the enabled nor disabled state. Thus we must explicitly test for
-  * either condition as required.
-  */
- static int aspeed_sig_expr_eval(const struct aspeed_sig_expr *expr,
-                                bool enabled, struct regmap * const *maps)
- {
-       int i;
-       int ret;
-       for (i = 0; i < expr->ndescs; i++) {
-               const struct aspeed_sig_desc *desc = &expr->descs[i];
-               ret = aspeed_sig_desc_eval(desc, enabled, maps[desc->ip]);
-               if (ret <= 0)
-                       return ret;
-       }
-       return 1;
- }
- /**
-  * Configure a pin's signal by applying an expression's descriptor state for
-  * all descriptors in the expression.
-  *
-  * @expr: The expression associated with the function whose signal is to be
-  *        configured
-  * @enable: true to enable an function's signal through a pin's signal
-  *          expression, false to disable the function's signal
-  * @maps: The list of regmap instances for pinmux register access.
-  *
-  * Return: 0 if the expression is configured as requested and a negative error
-  * code otherwise
-  */
- static int aspeed_sig_expr_set(const struct aspeed_sig_expr *expr,
-                               bool enable, struct regmap * const *maps)
- {
-       int ret;
-       int i;
-       for (i = 0; i < expr->ndescs; i++) {
-               const struct aspeed_sig_desc *desc = &expr->descs[i];
-               u32 pattern = enable ? desc->enable : desc->disable;
-               u32 val = (pattern << __ffs(desc->mask));
-               if (!maps[desc->ip])
-                       return -ENODEV;
-               /*
-                * Strap registers are configured in hardware or by early-boot
-                * firmware. Treat them as read-only despite that we can write
-                * them. This may mean that certain functions cannot be
-                * deconfigured and is the reason we re-evaluate after writing
-                * all descriptor bits.
-                *
-                * Port D and port E GPIO loopback modes are the only exception
-                * as those are commonly used with front-panel buttons to allow
-                * normal operation of the host when the BMC is powered off or
-                * fails to boot. Once the BMC has booted, the loopback mode
-                * must be disabled for the BMC to control host power-on and
-                * reset.
-                */
-               if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP1 &&
-                   !(desc->mask & (BIT(21) | BIT(22))))
-                       continue;
-               if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP2)
-                       continue;
-               /* On AST2500, Set bits in SCU7C are cleared from SCU70 */
-               if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP1) {
-                       unsigned int rev_id;
-                       ret = regmap_read(maps[ASPEED_IP_SCU],
-                               HW_REVISION_ID, &rev_id);
-                       if (ret < 0)
-                               return ret;
-                       if (0x04 == (rev_id >> 24)) {
-                               u32 value = ~val & desc->mask;
-                               if (value) {
-                                       ret = regmap_write(maps[desc->ip],
-                                               HW_REVISION_ID, value);
-                                       if (ret < 0)
-                                               return ret;
-                               }
-                       }
-               }
-               ret = regmap_update_bits(maps[desc->ip], desc->reg,
-                                        desc->mask, val);
-               if (ret)
-                       return ret;
-       }
-       ret = aspeed_sig_expr_eval(expr, enable, maps);
-       if (ret < 0)
-               return ret;
-       if (!ret)
-               return -EPERM;
-       return 0;
- }
- static int aspeed_sig_expr_enable(const struct aspeed_sig_expr *expr,
-                                  struct regmap * const *maps)
- {
-       int ret;
-       ret = aspeed_sig_expr_eval(expr, true, maps);
+       ret = aspeed_sig_expr_eval(ctx, expr, true);
        if (ret < 0)
                return ret;
  
        if (!ret)
-               return aspeed_sig_expr_set(expr, true, maps);
+               return aspeed_sig_expr_set(ctx, expr, true);
  
        return 0;
  }
  
- static int aspeed_sig_expr_disable(const struct aspeed_sig_expr *expr,
-                                   struct regmap * const *maps)
+ static int aspeed_sig_expr_disable(const struct aspeed_pinmux_data *ctx,
+                                  const struct aspeed_sig_expr *expr)
  {
        int ret;
  
-       ret = aspeed_sig_expr_eval(expr, true, maps);
+       ret = aspeed_sig_expr_eval(ctx, expr, true);
        if (ret < 0)
                return ret;
  
        if (ret)
-               return aspeed_sig_expr_set(expr, false, maps);
+               return aspeed_sig_expr_set(ctx, expr, false);
  
        return 0;
  }
  /**
   * Disable a signal on a pin by disabling all provided signal expressions.
   *
+  * @ctx: The pinmux context
   * @exprs: The list of signal expressions (from a priority level on a pin)
-  * @maps: The list of regmap instances for pinmux register access.
   *
   * Return: 0 if all expressions are disabled, otherwise a negative error code
   */
- static int aspeed_disable_sig(const struct aspeed_sig_expr **exprs,
-                              struct regmap * const *maps)
+ static int aspeed_disable_sig(const struct aspeed_pinmux_data *ctx,
+                             const struct aspeed_sig_expr **exprs)
  {
        int ret = 0;
  
                return true;
  
        while (*exprs && !ret) {
-               ret = aspeed_sig_expr_disable(*exprs, maps);
+               ret = aspeed_sig_expr_disable(ctx, *exprs);
                exprs++;
        }
  
@@@ -395,9 -223,9 +219,9 @@@ int aspeed_pinmux_set_mux(struct pinctr
        int ret;
        const struct aspeed_pinctrl_data *pdata =
                pinctrl_dev_get_drvdata(pctldev);
-       const struct aspeed_pin_group *pgroup = &pdata->groups[group];
+       const struct aspeed_pin_group *pgroup = &pdata->pinmux.groups[group];
        const struct aspeed_pin_function *pfunc =
-               &pdata->functions[function];
+               &pdata->pinmux.functions[function];
  
        for (i = 0; i < pgroup->npins; i++) {
                int pin = pgroup->pins[i];
                        if (expr)
                                break;
  
-                       ret = aspeed_disable_sig(funcs, pdata->maps);
+                       ret = aspeed_disable_sig(&pdata->pinmux, funcs);
                        if (ret)
                                return ret;
  
                        return -ENXIO;
                }
  
-               ret = aspeed_sig_expr_enable(expr, pdata->maps);
+               ret = aspeed_sig_expr_enable(&pdata->pinmux, expr);
                if (ret)
                        return ret;
        }
@@@ -500,7 -328,7 +324,7 @@@ int aspeed_gpio_request_enable(struct p
                if (aspeed_gpio_in_exprs(funcs))
                        break;
  
-               ret = aspeed_disable_sig(funcs, pdata->maps);
+               ret = aspeed_disable_sig(&pdata->pinmux, funcs);
                if (ret)
                        return ret;
  
         * If GPIO is not the lowest priority signal type, assume there is only
         * one expression defined to enable the GPIO function
         */
-       return aspeed_sig_expr_enable(expr, pdata->maps);
+       return aspeed_sig_expr_enable(&pdata->pinmux, expr);
  }
  
  int aspeed_pinctrl_probe(struct platform_device *pdev,
                return -ENODEV;
        }
  
-       pdata->maps[ASPEED_IP_SCU] = syscon_node_to_regmap(parent->of_node);
-       if (IS_ERR(pdata->maps[ASPEED_IP_SCU])) {
+       pdata->scu = syscon_node_to_regmap(parent->of_node);
+       if (IS_ERR(pdata->scu)) {
                dev_err(&pdev->dev, "No regmap for syscon pincontroller parent\n");
-               return PTR_ERR(pdata->maps[ASPEED_IP_SCU]);
+               return PTR_ERR(pdata->scu);
        }
  
+       pdata->pinmux.maps[ASPEED_IP_SCU] = pdata->scu;
        pctl = pinctrl_register(pdesc, &pdev->dev, pdata);
  
        if (IS_ERR(pctl)) {
@@@ -587,7 -417,9 +413,9 @@@ static inline const struct aspeed_pin_c
        return NULL;
  }
  
- /**
+ /*
+  * Aspeed pin configuration description.
+  *
   * @param: pinconf configuration parameter
   * @arg: The supported argument for @param, or -1 if any value is supported
   * @val: The register value to write to configure @arg for @param
@@@ -661,7 -493,7 +489,7 @@@ int aspeed_pin_config_get(struct pinctr
        if (!pconf)
                return -ENOTSUPP;
  
-       rc = regmap_read(pdata->maps[ASPEED_IP_SCU], pconf->reg, &val);
+       rc = regmap_read(pdata->scu, pconf->reg, &val);
        if (rc < 0)
                return rc;
  
@@@ -716,8 -548,8 +544,8 @@@ int aspeed_pin_config_set(struct pinctr
  
                val = pmap->val << pconf->bit;
  
-               rc = regmap_update_bits(pdata->maps[ASPEED_IP_SCU], pconf->reg,
-                               BIT(pconf->bit), val);
+               rc = regmap_update_bits(pdata->scu, pconf->reg,
+                                       BIT(pconf->bit), val);
  
                if (rc < 0)
                        return rc;
index 4b06ddbc6aec9cdb31cab11b09e3e74f1912ba96,7fcfc5004b44f98058990431ab4c81d2c5e84bb3..a5d83986f32e7cb8719ad3be858a50ce0abb57d5
@@@ -1,6 -1,10 +1,6 @@@
 +/* SPDX-License-Identifier: GPL-2.0-or-later */
  /*
   * Copyright (C) 2016 IBM Corp.
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License as published by
 - * the Free Software Foundation; either version 2 of the License, or
 - * (at your option) any later version.
   */
  
  #ifndef PINCTRL_ASPEED
  #include <linux/pinctrl/pinconf-generic.h>
  #include <linux/regmap.h>
  
- /*
-  * The ASPEED SoCs provide typically more than 200 pins for GPIO and other
-  * functions. The SoC function enabled on a pin is determined on a priority
-  * basis where a given pin can provide a number of different signal types.
-  *
-  * The signal active on a pin is described by both a priority level and
-  * compound logical expressions involving multiple operators, registers and
-  * bits. Some difficulty arises as the pin's function bit masks for each
-  * priority level are frequently not the same (i.e. cannot just flip a bit to
-  * change from a high to low priority signal), or even in the same register.
-  * Further, not all signals can be unmuxed, as some expressions depend on
-  * values in the hardware strapping register (which is treated as read-only).
-  *
-  * SoC Multi-function Pin Expression Examples
-  * ------------------------------------------
-  *
-  * Here are some sample mux configurations from the AST2400 and AST2500
-  * datasheets to illustrate the corner cases, roughly in order of least to most
-  * corner. The signal priorities are in decending order from P0 (highest).
-  *
-  * D6 is a pin with a single function (beside GPIO); a high priority signal
-  * that participates in one function:
-  *
-  * Ball | Default | P0 Signal | P0 Expression               | P1 Signal | P1 Expression | Other
-  * -----+---------+-----------+-----------------------------+-----------+---------------+----------
-  *  D6    GPIOA0    MAC1LINK    SCU80[0]=1                                                GPIOA0
-  * -----+---------+-----------+-----------------------------+-----------+---------------+----------
-  *
-  * C5 is a multi-signal pin (high and low priority signals). Here we touch
-  * different registers for the different functions that enable each signal:
-  *
-  * -----+---------+-----------+-----------------------------+-----------+---------------+----------
-  *  C5    GPIOA4    SCL9        SCU90[22]=1                   TIMER5      SCU80[4]=1      GPIOA4
-  * -----+---------+-----------+-----------------------------+-----------+---------------+----------
-  *
-  * E19 is a single-signal pin with two functions that influence the active
-  * signal. In this case both bits have the same meaning - enable a dedicated
-  * LPC reset pin. However it's not always the case that the bits in the
-  * OR-relationship have the same meaning.
-  *
-  * -----+---------+-----------+-----------------------------+-----------+---------------+----------
-  *  E19   GPIOB4    LPCRST#     SCU80[12]=1 | Strap[14]=1                                 GPIOB4
-  * -----+---------+-----------+-----------------------------+-----------+---------------+----------
-  *
-  * For example, pin B19 has a low-priority signal that's enabled by two
-  * distinct SoC functions: A specific SIOPBI bit in register SCUA4, and an ACPI
-  * bit in the STRAP register. The ACPI bit configures signals on pins in
-  * addition to B19. Both of the low priority functions as well as the high
-  * priority function must be disabled for GPIOF1 to be used.
-  *
-  * Ball | Default | P0 Signal | P0 Expression                           | P1 Signal | P1 Expression                          | Other
-  * -----+---------+-----------+-----------------------------------------+-----------+----------------------------------------+----------
-  *  B19   GPIOF1    NDCD4       SCU80[25]=1                               SIOPBI#     SCUA4[12]=1 | Strap[19]=0                GPIOF1
-  * -----+---------+-----------+-----------------------------------------+-----------+----------------------------------------+----------
-  *
-  * For pin E18, the SoC ANDs the expected state of three bits to determine the
-  * pin's active signal:
-  *
-  * * SCU3C[3]: Enable external SOC reset function
-  * * SCU80[15]: Enable SPICS1# or EXTRST# function pin
-  * * SCU90[31]: Select SPI interface CS# output
-  *
-  * -----+---------+-----------+-----------------------------------------+-----------+----------------------------------------+----------
-  *  E18   GPIOB7    EXTRST#     SCU3C[3]=1 & SCU80[15]=1 & SCU90[31]=0    SPICS1#     SCU3C[3]=1 & SCU80[15]=1 & SCU90[31]=1   GPIOB7
-  * -----+---------+-----------+-----------------------------------------+-----------+----------------------------------------+----------
-  *
-  * (Bits SCU3C[3] and SCU80[15] appear to only be used in the expressions for
-  * selecting the signals on pin E18)
-  *
-  * Pin T5 is a multi-signal pin with a more complex configuration:
-  *
-  * Ball | Default | P0 Signal | P0 Expression                | P1 Signal | P1 Expression | Other
-  * -----+---------+-----------+------------------------------+-----------+---------------+----------
-  *  T5    GPIOL1    VPIDE       SCU90[5:4]!=0 & SCU84[17]=1    NDCD1       SCU84[17]=1     GPIOL1
-  * -----+---------+-----------+------------------------------+-----------+---------------+----------
-  *
-  * The high priority signal configuration is best thought of in terms of its
-  * exploded form, with reference to the SCU90[5:4] bits:
-  *
-  * * SCU90[5:4]=00: disable
-  * * SCU90[5:4]=01: 18 bits (R6/G6/B6) video mode.
-  * * SCU90[5:4]=10: 24 bits (R8/G8/B8) video mode.
-  * * SCU90[5:4]=11: 30 bits (R10/G10/B10) video mode.
-  *
-  * Re-writing:
-  *
-  * -----+---------+-----------+------------------------------+-----------+---------------+----------
-  *  T5    GPIOL1    VPIDE      (SCU90[5:4]=1 & SCU84[17]=1)    NDCD1       SCU84[17]=1     GPIOL1
-  *                             | (SCU90[5:4]=2 & SCU84[17]=1)
-  *                             | (SCU90[5:4]=3 & SCU84[17]=1)
-  * -----+---------+-----------+------------------------------+-----------+---------------+----------
-  *
-  * For reference the SCU84[17] bit configure the "UART1 NDCD1 or Video VPIDE
-  * function pin", where the signal itself is determined by whether SCU94[5:4]
-  * is disabled or in one of the 18, 24 or 30bit video modes.
-  *
-  * Other video-input-related pins require an explicit state in SCU90[5:4], e.g.
-  * W1 and U5:
-  *
-  * -----+---------+-----------+------------------------------+-----------+---------------+----------
-  *  W1    GPIOL6    VPIB0       SCU90[5:4]=3 & SCU84[22]=1     TXD1        SCU84[22]=1     GPIOL6
-  *  U5    GPIOL7    VPIB1       SCU90[5:4]=3 & SCU84[23]=1     RXD1        SCU84[23]=1     GPIOL7
-  * -----+---------+-----------+------------------------------+-----------+---------------+----------
-  *
-  * The examples of T5 and W1 are particularly fertile, as they also demonstrate
-  * that despite operating as part of the video input bus each signal needs to
-  * be enabled individually via it's own SCU84 (in the cases of T5 and W1)
-  * register bit. This is a little crazy if the bus doesn't have optional
-  * signals, but is used to decent effect with some of the UARTs where not all
-  * signals are required. However, this isn't done consistently - UART1 is
-  * enabled on a per-pin basis, and by contrast, all signals for UART6 are
-  * enabled by a single bit.
-  *
-  * Further, the high and low priority signals listed in the table above share
-  * a configuration bit. The VPI signals should operate in concert in a single
-  * function, but the UART signals should retain the ability to be configured
-  * independently. This pushes the implementation down the path of tagging a
-  * signal's expressions with the function they participate in, rather than
-  * defining masks affecting multiple signals per function. The latter approach
-  * fails in this instance where applying the configuration for the UART pin of
-  * interest will stomp on the state of other UART signals when disabling the
-  * VPI functions on the current pin.
-  *
-  * Ball |  Default   | P0 Signal | P0 Expression             | P1 Signal | P1 Expression | Other
-  * -----+------------+-----------+---------------------------+-----------+---------------+------------
-  *  A12   RGMII1TXCK   GPIOT0      SCUA0[0]=1                  RMII1TXEN   Strap[6]=0      RGMII1TXCK
-  *  B12   RGMII1TXCTL  GPIOT1      SCUA0[1]=1                  â€“           Strap[6]=0      RGMII1TXCTL
-  * -----+------------+-----------+---------------------------+-----------+---------------+------------
-  *
-  * A12 demonstrates that the "Other" signal isn't always GPIO - in this case
-  * GPIOT0 is a high-priority signal and RGMII1TXCK is Other. Thus, GPIO
-  * should be treated like any other signal type with full function expression
-  * requirements, and not assumed to be the default case. Separately, GPIOT0 and
-  * GPIOT1's signal descriptor bits are distinct, therefore we must iterate all
-  * pins in the function's group to disable the higher-priority signals such
-  * that the signal for the function of interest is correctly enabled.
-  *
-  * Finally, three priority levels aren't always enough; the AST2500 brings with
-  * it 18 pins of five priority levels, however the 18 pins only use three of
-  * the five priority levels.
-  *
-  * Ultimately the requirement to control pins in the examples above drive the
-  * design:
-  *
-  * * Pins provide signals according to functions activated in the mux
-  *   configuration
-  *
-  * * Pins provide up to five signal types in a priority order
-  *
-  * * For priorities levels defined on a pin, each priority provides one signal
-  *
-  * * Enabling lower priority signals requires higher priority signals be
-  *   disabled
-  *
-  * * A function represents a set of signals; functions are distinct if their
-  *   sets of signals are not equal
-  *
-  * * Signals participate in one or more functions
-  *
-  * * A function is described by an expression of one or more signal
-  *   descriptors, which compare bit values in a register
-  *
-  * * A signal expression is the smallest set of signal descriptors whose
-  *   comparisons must evaluate 'true' for a signal to be enabled on a pin.
-  *
-  * * A function's signal is active on a pin if evaluating all signal
-  *   descriptors in the pin's signal expression for the function yields a 'true'
-  *   result
-  *
-  * * A signal at a given priority on a given pin is active if any of the
-  *   functions in which the signal participates are active, and no higher
-  *   priority signal on the pin is active
-  *
-  * * GPIO is configured per-pin
-  *
-  * And so:
-  *
-  * * To disable a signal, any function(s) activating the signal must be
-  *   disabled
-  *
-  * * Each pin must know the signal expressions of functions in which it
-  *   participates, for the purpose of enabling the Other function. This is done
-  *   by deactivating all functions that activate higher priority signals on the
-  *   pin.
-  *
-  * As a concrete example:
-  *
-  * * T5 provides three signals types: VPIDE, NDCD1 and GPIO
-  *
-  * * The VPIDE signal participates in 3 functions: VPI18, VPI24 and VPI30
-  *
-  * * The NDCD1 signal participates in just its own NDCD1 function
-  *
-  * * VPIDE is high priority, NDCD1 is low priority, and GPIOL1 is the least
-  *   prioritised
-  *
-  * * The prerequisit for activating the NDCD1 signal is that the VPI18, VPI24
-  *   and VPI30 functions all be disabled
-  *
-  * * Similarly, all of VPI18, VPI24, VPI30 and NDCD1 functions must be disabled
-  *   to provide GPIOL6
-  *
-  * Considerations
-  * --------------
-  *
-  * If pinctrl allows us to allocate a pin we can configure a function without
-  * concern for the function of already allocated pins, if pin groups are
-  * created with respect to the SoC functions in which they participate. This is
-  * intuitive, but it did not feel obvious from the bit/pin relationships.
-  *
-  * Conversely, failing to allocate all pins in a group indicates some bits (as
-  * well as pins) required for the group's configuration will already be in use,
-  * likely in a way that's inconsistent with the requirements of the failed
-  * group.
-  */
- #define ASPEED_IP_SCU         0
- #define ASPEED_IP_GFX         1
- #define ASPEED_IP_LPC         2
- #define ASPEED_NR_PINMUX_IPS  3
- /*
-  * The "Multi-function Pins Mapping and Control" table in the SoC datasheet
-  * references registers by the device/offset mnemonic. The register macros
-  * below are named the same way to ease transcription and verification (as
-  * opposed to naming them e.g. PINMUX_CTRL_[0-9]). Further, signal expressions
-  * reference registers beyond those dedicated to pinmux, such as the system
-  * reset control and MAC clock configuration registers. The AST2500 goes a step
-  * further and references registers in the graphics IP block, but that isn't
-  * handled yet.
-  */
- #define SCU2C           0x2C /* Misc. Control Register */
- #define SCU3C           0x3C /* System Reset Control/Status Register */
- #define SCU48           0x48 /* MAC Interface Clock Delay Setting */
- #define HW_STRAP1       0x70 /* AST2400 strapping is 33 bits, is split */
- #define HW_REVISION_ID  0x7C /* Silicon revision ID register */
- #define SCU80           0x80 /* Multi-function Pin Control #1 */
- #define SCU84           0x84 /* Multi-function Pin Control #2 */
- #define SCU88           0x88 /* Multi-function Pin Control #3 */
- #define SCU8C           0x8C /* Multi-function Pin Control #4 */
- #define SCU90           0x90 /* Multi-function Pin Control #5 */
- #define SCU94           0x94 /* Multi-function Pin Control #6 */
- #define SCUA0           0xA0 /* Multi-function Pin Control #7 */
- #define SCUA4           0xA4 /* Multi-function Pin Control #8 */
- #define SCUA8           0xA8 /* Multi-function Pin Control #9 */
- #define SCUAC           0xAC /* Multi-function Pin Control #10 */
- #define HW_STRAP2       0xD0 /* Strapping */
-  /**
-   * A signal descriptor, which describes the register, bits and the
-   * enable/disable values that should be compared or written.
-   *
-   * @ip: The IP block identifier, used as an index into the regmap array in
-   *      struct aspeed_pinctrl_data
-   * @reg: The register offset with respect to the base address of the IP block
-   * @mask: The mask to apply to the register. The lowest set bit of the mask is
-   *        used to derive the shift value.
-   * @enable: The value that enables the function. Value should be in the LSBs,
-   *          not at the position of the mask.
-   * @disable: The value that disables the function. Value should be in the
-   *           LSBs, not at the position of the mask.
-   */
- struct aspeed_sig_desc {
-       unsigned int ip;
-       unsigned int reg;
-       u32 mask;
-       u32 enable;
-       u32 disable;
- };
- /**
-  * Describes a signal expression. The expression is evaluated by ANDing the
-  * evaluation of the descriptors.
-  *
-  * @signal: The signal name for the priority level on the pin. If the signal
-  *          type is GPIO, then the signal name must begin with the string
-  *          "GPIO", e.g. GPIOA0, GPIOT4 etc.
-  * @function: The name of the function the signal participates in for the
-  *            associated expression
-  * @ndescs: The number of signal descriptors in the expression
-  * @descs: Pointer to an array of signal descriptors that comprise the
-  *         function expression
-  */
- struct aspeed_sig_expr {
-       const char *signal;
-       const char *function;
-       int ndescs;
-       const struct aspeed_sig_desc *descs;
- };
- /**
-  * A struct capturing the list of expressions enabling signals at each priority
-  * for a given pin. The signal configuration for a priority level is evaluated
-  * by ORing the evaluation of the signal expressions in the respective
-  * priority's list.
-  *
-  * @name: A name for the pin
-  * @prios: A pointer to an array of expression list pointers
-  *
-  */
- struct aspeed_pin_desc {
-       const char *name;
-       const struct aspeed_sig_expr ***prios;
- };
- /* Macro hell */
- #define SIG_DESC_IP_BIT(ip, reg, idx, val) \
-       { ip, reg, BIT_MASK(idx), val, (((val) + 1) & 1) }
- /**
-  * Short-hand macro for describing an SCU descriptor enabled by the state of
-  * one bit. The disable value is derived.
-  *
-  * @reg: The signal's associated register, offset from base
-  * @idx: The signal's bit index in the register
-  * @val: The value (0 or 1) that enables the function
-  */
- #define SIG_DESC_BIT(reg, idx, val) \
-       SIG_DESC_IP_BIT(ASPEED_IP_SCU, reg, idx, val)
- #define SIG_DESC_IP_SET(ip, reg, idx) SIG_DESC_IP_BIT(ip, reg, idx, 1)
- /**
-  * A further short-hand macro expanding to an SCU descriptor enabled by a set
-  * bit.
-  *
-  * @reg: The register, offset from base
-  * @idx: The bit index in the register
-  */
- #define SIG_DESC_SET(reg, idx) SIG_DESC_IP_BIT(ASPEED_IP_SCU, reg, idx, 1)
- #define SIG_DESC_LIST_SYM(sig, func) sig_descs_ ## sig ## _ ## func
- #define SIG_DESC_LIST_DECL(sig, func, ...) \
-       static const struct aspeed_sig_desc SIG_DESC_LIST_SYM(sig, func)[] = \
-               { __VA_ARGS__ }
- #define SIG_EXPR_SYM(sig, func) sig_expr_ ## sig ## _ ## func
- #define SIG_EXPR_DECL_(sig, func) \
-       static const struct aspeed_sig_expr SIG_EXPR_SYM(sig, func) = \
-       { \
-               .signal = #sig, \
-               .function = #func, \
-               .ndescs = ARRAY_SIZE(SIG_DESC_LIST_SYM(sig, func)), \
-               .descs = &(SIG_DESC_LIST_SYM(sig, func))[0], \
-       }
- /**
-  * Declare a signal expression.
-  *
-  * @sig: A macro symbol name for the signal (is subjected to stringification
-  *        and token pasting)
-  * @func: The function in which the signal is participating
-  * @...: Signal descriptors that define the signal expression
-  *
-  * For example, the following declares the ROMD8 signal for the ROM16 function:
-  *
-  *     SIG_EXPR_DECL(ROMD8, ROM16, SIG_DESC_SET(SCU90, 6));
-  *
-  * And with multiple signal descriptors:
-  *
-  *     SIG_EXPR_DECL(ROMD8, ROM16S, SIG_DESC_SET(HW_STRAP1, 4),
-  *              { HW_STRAP1, GENMASK(1, 0), 0, 0 });
-  */
- #define SIG_EXPR_DECL(sig, func, ...) \
-       SIG_DESC_LIST_DECL(sig, func, __VA_ARGS__); \
-       SIG_EXPR_DECL_(sig, func)
- /**
-  * Declare a pointer to a signal expression
-  *
-  * @sig: The macro symbol name for the signal (subjected to token pasting)
-  * @func: The macro symbol name for the function (subjected to token pasting)
-  */
- #define SIG_EXPR_PTR(sig, func) (&SIG_EXPR_SYM(sig, func))
- #define SIG_EXPR_LIST_SYM(sig) sig_exprs_ ## sig
- /**
-  * Declare a signal expression list for reference in a struct aspeed_pin_prio.
-  *
-  * @sig: A macro symbol name for the signal (is subjected to token pasting)
-  * @...: Signal expression structure pointers (use SIG_EXPR_PTR())
-  *
-  * For example, the 16-bit ROM bus can be enabled by one of two possible signal
-  * expressions:
-  *
-  *     SIG_EXPR_DECL(ROMD8, ROM16, SIG_DESC_SET(SCU90, 6));
-  *     SIG_EXPR_DECL(ROMD8, ROM16S, SIG_DESC_SET(HW_STRAP1, 4),
-  *              { HW_STRAP1, GENMASK(1, 0), 0, 0 });
-  *     SIG_EXPR_LIST_DECL(ROMD8, SIG_EXPR_PTR(ROMD8, ROM16),
-  *              SIG_EXPR_PTR(ROMD8, ROM16S));
-  */
- #define SIG_EXPR_LIST_DECL(sig, ...) \
-       static const struct aspeed_sig_expr *SIG_EXPR_LIST_SYM(sig)[] = \
-               { __VA_ARGS__, NULL }
- /**
-  * A short-hand macro for declaring a function expression and an expression
-  * list with a single function.
-  *
-  * @func: A macro symbol name for the function (is subjected to token pasting)
-  * @...: Function descriptors that define the function expression
-  *
-  * For example, signal NCTS6 participates in its own function with one group:
-  *
-  *     SIG_EXPR_LIST_DECL_SINGLE(NCTS6, NCTS6, SIG_DESC_SET(SCU90, 7));
-  */
- #define SIG_EXPR_LIST_DECL_SINGLE(sig, func, ...) \
-       SIG_DESC_LIST_DECL(sig, func, __VA_ARGS__); \
-       SIG_EXPR_DECL_(sig, func); \
-       SIG_EXPR_LIST_DECL(sig, SIG_EXPR_PTR(sig, func))
- #define SIG_EXPR_LIST_DECL_DUAL(sig, f0, f1) \
-       SIG_EXPR_LIST_DECL(sig, SIG_EXPR_PTR(sig, f0), SIG_EXPR_PTR(sig, f1))
- #define SIG_EXPR_LIST_PTR(sig) (&SIG_EXPR_LIST_SYM(sig)[0])
- #define PIN_EXPRS_SYM(pin) pin_exprs_ ## pin
- #define PIN_EXPRS_PTR(pin) (&PIN_EXPRS_SYM(pin)[0])
- #define PIN_SYM(pin) pin_ ## pin
- #define MS_PIN_DECL_(pin, ...) \
-       static const struct aspeed_sig_expr **PIN_EXPRS_SYM(pin)[] = \
-               { __VA_ARGS__, NULL }; \
-       static const struct aspeed_pin_desc PIN_SYM(pin) = \
-               { #pin, PIN_EXPRS_PTR(pin) }
- /**
-  * Declare a multi-signal pin
-  *
-  * @pin: The pin number
-  * @other: Macro name for "other" functionality (subjected to stringification)
-  * @high: Macro name for the highest priority signal functions
-  * @low: Macro name for the low signal functions
-  *
-  * For example:
-  *
-  *     #define A8 56
-  *     SIG_EXPR_DECL(ROMD8, ROM16, SIG_DESC_SET(SCU90, 6));
-  *     SIG_EXPR_DECL(ROMD8, ROM16S, SIG_DESC_SET(HW_STRAP1, 4),
-  *              { HW_STRAP1, GENMASK(1, 0), 0, 0 });
-  *     SIG_EXPR_LIST_DECL(ROMD8, SIG_EXPR_PTR(ROMD8, ROM16),
-  *              SIG_EXPR_PTR(ROMD8, ROM16S));
-  *     SIG_EXPR_LIST_DECL_SINGLE(NCTS6, NCTS6, SIG_DESC_SET(SCU90, 7));
-  *     MS_PIN_DECL(A8, GPIOH0, ROMD8, NCTS6);
-  */
- #define MS_PIN_DECL(pin, other, high, low) \
-       SIG_EXPR_LIST_DECL_SINGLE(other, other); \
-       MS_PIN_DECL_(pin, \
-                       SIG_EXPR_LIST_PTR(high), \
-                       SIG_EXPR_LIST_PTR(low), \
-                       SIG_EXPR_LIST_PTR(other))
- #define PIN_GROUP_SYM(func) pins_ ## func
- #define FUNC_GROUP_SYM(func) groups_ ## func
- #define FUNC_GROUP_DECL(func, ...) \
-       static const int PIN_GROUP_SYM(func)[] = { __VA_ARGS__ }; \
-       static const char *FUNC_GROUP_SYM(func)[] = { #func }
- /**
-  * Declare a single signal pin
-  *
-  * @pin: The pin number
-  * @other: Macro name for "other" functionality (subjected to stringification)
-  * @sig: Macro name for the signal (subjected to stringification)
-  *
-  * For example:
-  *
-  *     #define E3 80
-  *     SIG_EXPR_LIST_DECL_SINGLE(SCL5, I2C5, I2C5_DESC);
-  *     SS_PIN_DECL(E3, GPIOK0, SCL5);
-  */
- #define SS_PIN_DECL(pin, other, sig) \
-       SIG_EXPR_LIST_DECL_SINGLE(other, other); \
-       MS_PIN_DECL_(pin, SIG_EXPR_LIST_PTR(sig), SIG_EXPR_LIST_PTR(other))
- /**
-  * Single signal, single function pin declaration
-  *
-  * @pin: The pin number
-  * @other: Macro name for "other" functionality (subjected to stringification)
-  * @sig: Macro name for the signal (subjected to stringification)
-  * @...: Signal descriptors that define the function expression
-  *
-  * For example:
-  *
-  *    SSSF_PIN_DECL(A4, GPIOA2, TIMER3, SIG_DESC_SET(SCU80, 2));
-  */
- #define SSSF_PIN_DECL(pin, other, sig, ...) \
-       SIG_EXPR_LIST_DECL_SINGLE(sig, sig, __VA_ARGS__); \
-       SIG_EXPR_LIST_DECL_SINGLE(other, other); \
-       MS_PIN_DECL_(pin, SIG_EXPR_LIST_PTR(sig), SIG_EXPR_LIST_PTR(other)); \
-       FUNC_GROUP_DECL(sig, pin)
- #define GPIO_PIN_DECL(pin, gpio) \
-       SIG_EXPR_LIST_DECL_SINGLE(gpio, gpio); \
-       MS_PIN_DECL_(pin, SIG_EXPR_LIST_PTR(gpio))
+ #include "pinmux-aspeed.h"
  
  /**
   * @param The pinconf parameter type
@@@ -525,22 -32,6 +28,6 @@@ struct aspeed_pin_config 
        u8 value;
  };
  
- struct aspeed_pinctrl_data {
-       struct regmap *maps[ASPEED_NR_PINMUX_IPS];
-       const struct pinctrl_pin_desc *pins;
-       const unsigned int npins;
-       const struct aspeed_pin_group *groups;
-       const unsigned int ngroups;
-       const struct aspeed_pin_function *functions;
-       const unsigned int nfunctions;
-       const struct aspeed_pin_config *configs;
-       const unsigned int nconfigs;
- };
  #define ASPEED_PINCTRL_PIN(name_) \
        [name_] = { \
                .number = name_, \
                .drv_data = (void *) &(PIN_SYM(name_)) \
        }
  
- struct aspeed_pin_group {
-       const char *name;
-       const unsigned int *pins;
+ struct aspeed_pinctrl_data {
+       struct regmap *scu;
+       const struct pinctrl_pin_desc *pins;
        const unsigned int npins;
- };
  
- #define ASPEED_PINCTRL_GROUP(name_) { \
-       .name = #name_, \
-       .pins = &(PIN_GROUP_SYM(name_))[0], \
-       .npins = ARRAY_SIZE(PIN_GROUP_SYM(name_)), \
- }
+       const struct aspeed_pin_config *configs;
+       const unsigned int nconfigs;
  
- struct aspeed_pin_function {
-       const char *name;
-       const char *const *groups;
-       unsigned int ngroups;
+       struct aspeed_pinmux_data pinmux;
  };
  
- #define ASPEED_PINCTRL_FUNC(name_, ...) { \
-       .name = #name_, \
-       .groups = &FUNC_GROUP_SYM(name_)[0], \
-       .ngroups = ARRAY_SIZE(FUNC_GROUP_SYM(name_)), \
- }
+ /* Aspeed pinctrl helpers */
  int aspeed_pinctrl_get_groups_count(struct pinctrl_dev *pctldev);
  const char *aspeed_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
                unsigned int group);
index 97284c3f9e8369c66d4751ed0d6922623f4b83f9,331106274509254ca8d818a670a85724ce8ff13b..dcf7df797af75a66a15612ab5423f9aa503ea22a
@@@ -1,4 -1,3 +1,4 @@@
 +# SPDX-License-Identifier: GPL-2.0-only
  #
  # Broadcom pinctrl drivers
  #
@@@ -18,11 -17,15 +18,15 @@@ config PINCTRL_BCM281X
          framework.  GPIO is provided by a separate GPIO driver.
  
  config PINCTRL_BCM2835
-       bool
+       bool "Broadcom BCM2835 GPIO (with PINCONF) driver"
+       depends on OF && (ARCH_BCM2835 || ARCH_BRCMSTB || COMPILE_TEST)
        select PINMUX
        select PINCONF
        select GENERIC_PINCONF
        select GPIOLIB_IRQCHIP
+       default ARCH_BCM2835 || ARCH_BRCMSTB
+       help
+          Say Y here to enable the Broadcom BCM2835 GPIO driver.
  
  config PINCTRL_IPROC_GPIO
        bool "Broadcom iProc GPIO (with PINCONF) driver"
diff --combined drivers/pinctrl/core.c
index a64849a9d1b0e462829dacf67404a7d12c7ec1f4,e745788fa36fca8db323ffcb35b6906f0361f9e6..b70df27874d1ddedfb2f16dd43d2721c8a65d772
@@@ -1,4 -1,3 +1,4 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Core driver for the pin control subsystem
   *
@@@ -9,6 -8,8 +9,6 @@@
   * Author: Linus Walleij <linus.walleij@linaro.org>
   *
   * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
 - *
 - * License terms: GNU General Public License (GPL) version 2
   */
  #define pr_fmt(fmt) "pinctrl core: " fmt
  
@@@ -98,7 -99,7 +98,7 @@@ EXPORT_SYMBOL_GPL(pinctrl_dev_get_drvda
   */
  struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *devname)
  {
-       struct pinctrl_dev *pctldev = NULL;
+       struct pinctrl_dev *pctldev;
  
        if (!devname)
                return NULL;
@@@ -177,29 -178,6 +177,6 @@@ const char *pin_get_name(struct pinctrl
        return desc->name;
  }
  
- /**
-  * pin_is_valid() - check if pin exists on controller
-  * @pctldev: the pin control device to check the pin on
-  * @pin: pin to check, use the local pin controller index number
-  *
-  * This tells us whether a certain pin exist on a certain pin controller or
-  * not. Pin lists may be sparse, so some pins may not exist.
-  */
- bool pin_is_valid(struct pinctrl_dev *pctldev, int pin)
- {
-       struct pin_desc *pindesc;
-       if (pin < 0)
-               return false;
-       mutex_lock(&pctldev->mutex);
-       pindesc = pin_desc_get(pctldev, pin);
-       mutex_unlock(&pctldev->mutex);
-       return pindesc != NULL;
- }
- EXPORT_SYMBOL_GPL(pin_is_valid);
  /* Deletes a range of pin descriptors */
  static void pinctrl_free_pindescs(struct pinctrl_dev *pctldev,
                                  const struct pinctrl_pin_desc *pins,
@@@ -311,7 -289,7 +288,7 @@@ static inline int gpio_to_pin(struct pi
  static struct pinctrl_gpio_range *
  pinctrl_match_gpio_range(struct pinctrl_dev *pctldev, unsigned gpio)
  {
-       struct pinctrl_gpio_range *range = NULL;
+       struct pinctrl_gpio_range *range;
  
        mutex_lock(&pctldev->mutex);
        /* Loop over the ranges */
@@@ -391,7 -369,7 +368,7 @@@ static int pinctrl_get_device_gpio_rang
                                         struct pinctrl_dev **outdev,
                                         struct pinctrl_gpio_range **outrange)
  {
-       struct pinctrl_dev *pctldev = NULL;
+       struct pinctrl_dev *pctldev;
  
        mutex_lock(&pinctrldev_list_mutex);
  
@@@ -1215,6 -1193,15 +1192,15 @@@ struct pinctrl_state *pinctrl_lookup_st
  }
  EXPORT_SYMBOL_GPL(pinctrl_lookup_state);
  
+ static void pinctrl_link_add(struct pinctrl_dev *pctldev,
+                            struct device *consumer)
+ {
+       if (pctldev->desc->link_consumers)
+               device_link_add(consumer, pctldev->dev,
+                               DL_FLAG_PM_RUNTIME |
+                               DL_FLAG_AUTOREMOVE_CONSUMER);
+ }
  /**
   * pinctrl_commit_state() - select/activate/program a pinctrl state to HW
   * @p: the pinctrl handle for the device that requests configuration
@@@ -1260,6 -1247,10 +1246,10 @@@ static int pinctrl_commit_state(struct 
                if (ret < 0) {
                        goto unapply_new_state;
                }
+               /* Do not link hogs (circular dependency) */
+               if (p != setting->pctldev->p)
+                       pinctrl_link_add(setting->pctldev, p->dev);
        }
  
        p->state = state;
@@@ -1665,7 -1656,7 +1655,7 @@@ DEFINE_SHOW_ATTRIBUTE(pinctrl_groups)
  static int pinctrl_gpioranges_show(struct seq_file *s, void *what)
  {
        struct pinctrl_dev *pctldev = s->private;
-       struct pinctrl_gpio_range *range = NULL;
+       struct pinctrl_gpio_range *range;
  
        seq_puts(s, "GPIO ranges handled:\n");
  
index aeab0d9af23e75f559b2eebb91a719004ee7c0ed,508b58ab37549e6bb20b30489c9436e4834f4f8f..5f4058033ec6a9d496d9e632434495ed4eeced0c
@@@ -1,4 -1,3 +1,4 @@@
 +# SPDX-License-Identifier: GPL-2.0-only
  config PINCTRL_IMX
        bool
        select GENERIC_PINCTRL_GROUPS
@@@ -130,6 -129,13 +130,13 @@@ config PINCTRL_IMX8M
        help
          Say Y here to enable the imx8mm pinctrl driver
  
+ config PINCTRL_IMX8MN
+       bool "IMX8MN pinctrl driver"
+       depends on ARCH_MXC && ARM64
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx8mn pinctrl driver
  config PINCTRL_IMX8MQ
        bool "IMX8MQ pinctrl driver"
        depends on ARCH_MXC && ARM64
index 077de592578350ba8cc7f7ac001b33a3016d1c0c,df77a3e86a771d31767afa1b8a87d04469ca3ee4..59678692620986316faad33a6b231d8a30067f4f
@@@ -1,4 -1,4 +1,4 @@@
 -// SPDX-License-Identifier: GPL-2.0
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Pin controller and GPIO driver for Amlogic Meson SoCs
   *
@@@ -168,68 -168,223 +168,223 @@@ int meson_pmx_get_groups(struct pinctrl
        return 0;
  }
  
- static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
-                            unsigned long *configs, unsigned num_configs)
+ static int meson_pinconf_set_gpio_bit(struct meson_pinctrl *pc,
+                                     unsigned int pin,
+                                     unsigned int reg_type,
+                                     bool arg)
  {
-       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
        struct meson_bank *bank;
-       enum pin_config_param param;
        unsigned int reg, bit;
-       int i, ret;
+       int ret;
+       ret = meson_get_bank(pc, pin, &bank);
+       if (ret)
+               return ret;
+       meson_calc_reg_and_bit(bank, pin, reg_type, &reg, &bit);
+       return regmap_update_bits(pc->reg_gpio, reg, BIT(bit),
+                                 arg ? BIT(bit) : 0);
+ }
+ static int meson_pinconf_get_gpio_bit(struct meson_pinctrl *pc,
+                                     unsigned int pin,
+                                     unsigned int reg_type)
+ {
+       struct meson_bank *bank;
+       unsigned int reg, bit, val;
+       int ret;
+       ret = meson_get_bank(pc, pin, &bank);
+       if (ret)
+               return ret;
+       meson_calc_reg_and_bit(bank, pin, reg_type, &reg, &bit);
+       ret = regmap_read(pc->reg_gpio, reg, &val);
+       if (ret)
+               return ret;
+       return BIT(bit) & val ? 1 : 0;
+ }
+ static int meson_pinconf_set_output(struct meson_pinctrl *pc,
+                                   unsigned int pin,
+                                   bool out)
+ {
+       return meson_pinconf_set_gpio_bit(pc, pin, REG_DIR, !out);
+ }
+ static int meson_pinconf_get_output(struct meson_pinctrl *pc,
+                                   unsigned int pin)
+ {
+       int ret = meson_pinconf_get_gpio_bit(pc, pin, REG_DIR);
+       if (ret < 0)
+               return ret;
+       return !ret;
+ }
+ static int meson_pinconf_set_drive(struct meson_pinctrl *pc,
+                                  unsigned int pin,
+                                  bool high)
+ {
+       return meson_pinconf_set_gpio_bit(pc, pin, REG_OUT, high);
+ }
+ static int meson_pinconf_get_drive(struct meson_pinctrl *pc,
+                                  unsigned int pin)
+ {
+       return meson_pinconf_get_gpio_bit(pc, pin, REG_OUT);
+ }
+ static int meson_pinconf_set_output_drive(struct meson_pinctrl *pc,
+                                         unsigned int pin,
+                                         bool high)
+ {
+       int ret;
+       ret = meson_pinconf_set_output(pc, pin, true);
+       if (ret)
+               return ret;
+       return meson_pinconf_set_drive(pc, pin, high);
+ }
+ static int meson_pinconf_disable_bias(struct meson_pinctrl *pc,
+                                     unsigned int pin)
+ {
+       struct meson_bank *bank;
+       unsigned int reg, bit = 0;
+       int ret;
+       ret = meson_get_bank(pc, pin, &bank);
+       if (ret)
+               return ret;
+       meson_calc_reg_and_bit(bank, pin, REG_PULLEN, &reg, &bit);
+       ret = regmap_update_bits(pc->reg_pullen, reg, BIT(bit), 0);
+       if (ret)
+               return ret;
+       return 0;
+ }
+ static int meson_pinconf_enable_bias(struct meson_pinctrl *pc, unsigned int pin,
+                                    bool pull_up)
+ {
+       struct meson_bank *bank;
+       unsigned int reg, bit, val = 0;
+       int ret;
  
        ret = meson_get_bank(pc, pin, &bank);
        if (ret)
                return ret;
  
+       meson_calc_reg_and_bit(bank, pin, REG_PULL, &reg, &bit);
+       if (pull_up)
+               val = BIT(bit);
+       ret = regmap_update_bits(pc->reg_pull, reg, BIT(bit), val);
+       if (ret)
+               return ret;
+       meson_calc_reg_and_bit(bank, pin, REG_PULLEN, &reg, &bit);
+       ret = regmap_update_bits(pc->reg_pullen, reg, BIT(bit), BIT(bit));
+       if (ret)
+               return ret;
+       return 0;
+ }
+ static int meson_pinconf_set_drive_strength(struct meson_pinctrl *pc,
+                                           unsigned int pin,
+                                           u16 drive_strength_ua)
+ {
+       struct meson_bank *bank;
+       unsigned int reg, bit, ds_val;
+       int ret;
+       if (!pc->reg_ds) {
+               dev_err(pc->dev, "drive-strength not supported\n");
+               return -ENOTSUPP;
+       }
+       ret = meson_get_bank(pc, pin, &bank);
+       if (ret)
+               return ret;
+       meson_calc_reg_and_bit(bank, pin, REG_DS, &reg, &bit);
+       bit = bit << 1;
+       if (drive_strength_ua <= 500) {
+               ds_val = MESON_PINCONF_DRV_500UA;
+       } else if (drive_strength_ua <= 2500) {
+               ds_val = MESON_PINCONF_DRV_2500UA;
+       } else if (drive_strength_ua <= 3000) {
+               ds_val = MESON_PINCONF_DRV_3000UA;
+       } else if (drive_strength_ua <= 4000) {
+               ds_val = MESON_PINCONF_DRV_4000UA;
+       } else {
+               dev_warn_once(pc->dev,
+                             "pin %u: invalid drive-strength : %d , default to 4mA\n",
+                             pin, drive_strength_ua);
+               ds_val = MESON_PINCONF_DRV_4000UA;
+       }
+       ret = regmap_update_bits(pc->reg_ds, reg, 0x3 << bit, ds_val << bit);
+       if (ret)
+               return ret;
+       return 0;
+ }
+ static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
+                            unsigned long *configs, unsigned num_configs)
+ {
+       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
+       enum pin_config_param param;
+       unsigned int arg = 0;
+       int i, ret;
        for (i = 0; i < num_configs; i++) {
                param = pinconf_to_config_param(configs[i]);
  
+               switch (param) {
+               case PIN_CONFIG_DRIVE_STRENGTH_UA:
+               case PIN_CONFIG_OUTPUT_ENABLE:
+               case PIN_CONFIG_OUTPUT:
+                       arg = pinconf_to_config_argument(configs[i]);
+                       break;
+               default:
+                       break;
+               }
                switch (param) {
                case PIN_CONFIG_BIAS_DISABLE:
-                       dev_dbg(pc->dev, "pin %u: disable bias\n", pin);
-                       meson_calc_reg_and_bit(bank, pin, REG_PULLEN, &reg,
-                                              &bit);
-                       ret = regmap_update_bits(pc->reg_pullen, reg,
-                                                BIT(bit), 0);
-                       if (ret)
-                               return ret;
+                       ret = meson_pinconf_disable_bias(pc, pin);
                        break;
                case PIN_CONFIG_BIAS_PULL_UP:
-                       dev_dbg(pc->dev, "pin %u: enable pull-up\n", pin);
-                       meson_calc_reg_and_bit(bank, pin, REG_PULLEN,
-                                              &reg, &bit);
-                       ret = regmap_update_bits(pc->reg_pullen, reg,
-                                                BIT(bit), BIT(bit));
-                       if (ret)
-                               return ret;
-                       meson_calc_reg_and_bit(bank, pin, REG_PULL, &reg, &bit);
-                       ret = regmap_update_bits(pc->reg_pull, reg,
-                                                BIT(bit), BIT(bit));
-                       if (ret)
-                               return ret;
+                       ret = meson_pinconf_enable_bias(pc, pin, true);
                        break;
                case PIN_CONFIG_BIAS_PULL_DOWN:
-                       dev_dbg(pc->dev, "pin %u: enable pull-down\n", pin);
-                       meson_calc_reg_and_bit(bank, pin, REG_PULLEN,
-                                              &reg, &bit);
-                       ret = regmap_update_bits(pc->reg_pullen, reg,
-                                                BIT(bit), BIT(bit));
-                       if (ret)
-                               return ret;
-                       meson_calc_reg_and_bit(bank, pin, REG_PULL, &reg, &bit);
-                       ret = regmap_update_bits(pc->reg_pull, reg,
-                                                BIT(bit), 0);
-                       if (ret)
-                               return ret;
+                       ret = meson_pinconf_enable_bias(pc, pin, false);
+                       break;
+               case PIN_CONFIG_DRIVE_STRENGTH_UA:
+                       ret = meson_pinconf_set_drive_strength(pc, pin, arg);
+                       break;
+               case PIN_CONFIG_OUTPUT_ENABLE:
+                       ret = meson_pinconf_set_output(pc, pin, arg);
+                       break;
+               case PIN_CONFIG_OUTPUT:
+                       ret = meson_pinconf_set_output_drive(pc, pin, arg);
                        break;
                default:
-                       return -ENOTSUPP;
+                       ret = -ENOTSUPP;
                }
+               if (ret)
+                       return ret;
        }
  
        return 0;
@@@ -269,12 -424,55 +424,55 @@@ static int meson_pinconf_get_pull(struc
        return conf;
  }
  
+ static int meson_pinconf_get_drive_strength(struct meson_pinctrl *pc,
+                                           unsigned int pin,
+                                           u16 *drive_strength_ua)
+ {
+       struct meson_bank *bank;
+       unsigned int reg, bit;
+       unsigned int val;
+       int ret;
+       if (!pc->reg_ds)
+               return -ENOTSUPP;
+       ret = meson_get_bank(pc, pin, &bank);
+       if (ret)
+               return ret;
+       meson_calc_reg_and_bit(bank, pin, REG_DS, &reg, &bit);
+       ret = regmap_read(pc->reg_ds, reg, &val);
+       if (ret)
+               return ret;
+       switch ((val >> bit) & 0x3) {
+       case MESON_PINCONF_DRV_500UA:
+               *drive_strength_ua = 500;
+               break;
+       case MESON_PINCONF_DRV_2500UA:
+               *drive_strength_ua = 2500;
+               break;
+       case MESON_PINCONF_DRV_3000UA:
+               *drive_strength_ua = 3000;
+               break;
+       case MESON_PINCONF_DRV_4000UA:
+               *drive_strength_ua = 4000;
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+ }
  static int meson_pinconf_get(struct pinctrl_dev *pcdev, unsigned int pin,
                             unsigned long *config)
  {
        struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
        enum pin_config_param param = pinconf_to_config_param(*config);
        u16 arg;
+       int ret;
  
        switch (param) {
        case PIN_CONFIG_BIAS_DISABLE:
                else
                        return -EINVAL;
                break;
+       case PIN_CONFIG_DRIVE_STRENGTH_UA:
+               ret = meson_pinconf_get_drive_strength(pc, pin, &arg);
+               if (ret)
+                       return ret;
+               break;
+       case PIN_CONFIG_OUTPUT_ENABLE:
+               ret = meson_pinconf_get_output(pc, pin);
+               if (ret <= 0)
+                       return -EINVAL;
+               arg = 1;
+               break;
+       case PIN_CONFIG_OUTPUT:
+               ret = meson_pinconf_get_output(pc, pin);
+               if (ret <= 0)
+                       return -EINVAL;
+               ret = meson_pinconf_get_drive(pc, pin);
+               if (ret < 0)
+                       return -EINVAL;
+               arg = ret;
+               break;
        default:
                return -ENOTSUPP;
        }
@@@ -329,56 -550,19 +550,19 @@@ static const struct pinconf_ops meson_p
  
  static int meson_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
  {
-       struct meson_pinctrl *pc = gpiochip_get_data(chip);
-       unsigned int reg, bit;
-       struct meson_bank *bank;
-       int ret;
-       ret = meson_get_bank(pc, gpio, &bank);
-       if (ret)
-               return ret;
-       meson_calc_reg_and_bit(bank, gpio, REG_DIR, &reg, &bit);
-       return regmap_update_bits(pc->reg_gpio, reg, BIT(bit), BIT(bit));
+       return meson_pinconf_set_output(gpiochip_get_data(chip), gpio, false);
  }
  
  static int meson_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,
                                       int value)
  {
-       struct meson_pinctrl *pc = gpiochip_get_data(chip);
-       unsigned int reg, bit;
-       struct meson_bank *bank;
-       int ret;
-       ret = meson_get_bank(pc, gpio, &bank);
-       if (ret)
-               return ret;
-       meson_calc_reg_and_bit(bank, gpio, REG_DIR, &reg, &bit);
-       ret = regmap_update_bits(pc->reg_gpio, reg, BIT(bit), 0);
-       if (ret)
-               return ret;
-       meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
-       return regmap_update_bits(pc->reg_gpio, reg, BIT(bit),
-                                 value ? BIT(bit) : 0);
+       return meson_pinconf_set_output_drive(gpiochip_get_data(chip),
+                                             gpio, value);
  }
  
  static void meson_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
  {
-       struct meson_pinctrl *pc = gpiochip_get_data(chip);
-       unsigned int reg, bit;
-       struct meson_bank *bank;
-       int ret;
-       ret = meson_get_bank(pc, gpio, &bank);
-       if (ret)
-               return;
-       meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
-       regmap_update_bits(pc->reg_gpio, reg, BIT(bit),
-                          value ? BIT(bit) : 0);
+       meson_pinconf_set_drive(gpiochip_get_data(chip), gpio, value);
  }
  
  static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
index adab4ea078f9835f1f2a500481474bcb6c82fcff,b9abb493a6d979862be6bb847efa51378a94acac..c696f3241a361ccb4efb387ff9e5f608f67b8c8f
@@@ -1,4 -1,4 +1,4 @@@
 -/* SPDX-License-Identifier: GPL-2.0 */
 +/* SPDX-License-Identifier: GPL-2.0-only */
  /*
   * Pin controller and GPIO driver for Amlogic Meson SoCs
   *
@@@ -65,9 -65,20 +65,20 @@@ enum meson_reg_type 
        REG_DIR,
        REG_OUT,
        REG_IN,
+       REG_DS,
        NUM_REG,
  };
  
+ /**
+  * enum meson_pinconf_drv - value of drive-strength supported
+  */
+ enum meson_pinconf_drv {
+       MESON_PINCONF_DRV_500UA,
+       MESON_PINCONF_DRV_2500UA,
+       MESON_PINCONF_DRV_3000UA,
+       MESON_PINCONF_DRV_4000UA,
+ };
  /**
   * struct meson bank
   *
@@@ -126,7 -137,8 +137,8 @@@ struct meson_pinctrl 
                .num_groups = ARRAY_SIZE(fn ## _groups),                \
        }
  
- #define BANK(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib)       \
+ #define BANK_DS(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib,     \
+               dsr, dsb)                                                      \
        {                                                               \
                .name           = n,                                    \
                .first          = f,                                    \
                        [REG_DIR]       = { dr, db },                   \
                        [REG_OUT]       = { or, ob },                   \
                        [REG_IN]        = { ir, ib },                   \
+                       [REG_DS]        = { dsr, dsb },                 \
                },                                                      \
         }
  
+ #define BANK(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib) \
+       BANK_DS(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib, 0, 0)
  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
  
  /* Common pmx functions */
index 19e69701747dc1bad7e3cce2f276eb0e0bf75aee,f661cd471263f411c82b69a92f441b22ac2874c2..d45c31f281c85647fe8cf96139f1a8ccd3c6eae2
@@@ -1,8 -1,12 +1,8 @@@
 +// SPDX-License-Identifier: GPL-2.0-or-later
  /*
   * Marvell Kirkwood pinctrl driver based on mvebu pinctrl core
   *
   * Author: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License as published by
 - * the Free Software Foundation; either version 2 of the License, or
 - * (at your option) any later version.
   */
  
  #include <linux/err.h>
  
  #include "pinctrl-mvebu.h"
  
- #define V(f6180, f6190, f6192, f6281, f6282, dx4122)  \
+ #define V(f6180, f6190, f6192, f6281, f6282, dx4122, dx1135)  \
        ((f6180 << 0) | (f6190 << 1) | (f6192 << 2) |   \
-        (f6281 << 3) | (f6282 << 4) | (dx4122 << 5))
+        (f6281 << 3) | (f6282 << 4) | (dx4122 << 5) |  \
+        (dx1135 << 6))
  
  enum kirkwood_variant {
-       VARIANT_MV88F6180       = V(1, 0, 0, 0, 0, 0),
-       VARIANT_MV88F6190       = V(0, 1, 0, 0, 0, 0),
-       VARIANT_MV88F6192       = V(0, 0, 1, 0, 0, 0),
-       VARIANT_MV88F6281       = V(0, 0, 0, 1, 0, 0),
-       VARIANT_MV88F6282       = V(0, 0, 0, 0, 1, 0),
-       VARIANT_MV98DX4122      = V(0, 0, 0, 0, 0, 1),
+       VARIANT_MV88F6180       = V(1, 0, 0, 0, 0, 0, 0),
+       VARIANT_MV88F6190       = V(0, 1, 0, 0, 0, 0, 0),
+       VARIANT_MV88F6192       = V(0, 0, 1, 0, 0, 0, 0),
+       VARIANT_MV88F6281       = V(0, 0, 0, 1, 0, 0, 0),
+       VARIANT_MV88F6282       = V(0, 0, 0, 0, 1, 0, 0),
+       VARIANT_MV98DX4122      = V(0, 0, 0, 0, 0, 1, 0),
+       VARIANT_MV98DX1135      = V(0, 0, 0, 0, 0, 0, 1),
  };
  
  static struct mvebu_mpp_mode mv88f6xxx_mpp_modes[] = {
        MPP_MODE(0,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "nand", "io2",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "spi", "cs",       V(1, 1, 1, 1, 1, 1))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "nand", "io2",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "spi", "cs",       V(1, 1, 1, 1, 1, 1, 1))),
        MPP_MODE(1,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "nand", "io3",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "spi", "mosi",     V(1, 1, 1, 1, 1, 1))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "nand", "io3",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "spi", "mosi",     V(1, 1, 1, 1, 1, 1, 1))),
        MPP_MODE(2,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "nand", "io4",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "spi", "sck",      V(1, 1, 1, 1, 1, 1))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "nand", "io4",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "spi", "sck",      V(1, 1, 1, 1, 1, 1, 1))),
        MPP_MODE(3,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "nand", "io5",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "spi", "miso",     V(1, 1, 1, 1, 1, 1))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "nand", "io5",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "spi", "miso",     V(1, 1, 1, 1, 1, 1, 1))),
        MPP_MODE(4,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "nand", "io6",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "uart0", "rxd",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x5, "sata1", "act",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "hsync",    V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xd, "ptp", "clk",      V(1, 1, 1, 1, 0, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "nand", "io6",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "uart0", "rxd",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x5, "sata1", "act",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "hsync",    V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xd, "ptp", "clk",      V(1, 1, 1, 1, 0, 0, 0))),
        MPP_MODE(5,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "nand", "io7",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "uart0", "txd",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x4, "ptp", "trig",     V(1, 1, 1, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata0", "act",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "vsync",    V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "nand", "io7",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "uart0", "txd",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x4, "ptp", "trig",     V(1, 1, 1, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata0", "act",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "vsync",    V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(6,
-               MPP_VAR_FUNCTION(0x1, "sysrst", "out",   V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "spi", "mosi",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x3, "ptp", "trig",     V(1, 1, 1, 1, 0, 0))),
+               MPP_VAR_FUNCTION(0x1, "sysrst", "out",   V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "spi", "mosi",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x3, "ptp", "trig",     V(1, 1, 1, 1, 0, 0, 0))),
        MPP_MODE(7,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "pex", "rsto",     V(1, 1, 1, 1, 0, 1)),
-               MPP_VAR_FUNCTION(0x2, "spi", "cs",       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x3, "ptp", "trig",     V(1, 1, 1, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "pwm",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "pex", "rsto",     V(1, 1, 1, 1, 0, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "spi", "cs",       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x3, "ptp", "trig",     V(1, 1, 1, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "pwm",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(8,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "twsi0", "sda",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "uart0", "rts",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x3, "uart1", "rts",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x4, "mii-1", "rxerr",  V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata1", "prsnt",  V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xc, "ptp", "clk",      V(1, 1, 1, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0xd, "mii", "col",      V(1, 1, 1, 1, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "twsi0", "sda",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "uart0", "rts",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x3, "uart1", "rts",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x4, "mii-1", "rxerr",  V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata1", "prsnt",  V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xc, "ptp", "clk",      V(1, 1, 1, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0xd, "mii", "col",      V(1, 1, 1, 1, 1, 0, 0))),
        MPP_MODE(9,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "twsi0", "sck",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "uart0", "cts",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x3, "uart1", "cts",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x5, "sata0", "prsnt",  V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xc, "ptp", "evreq",    V(1, 1, 1, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0xd, "mii", "crs",      V(1, 1, 1, 1, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "twsi0", "sck",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "uart0", "cts",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x3, "uart1", "cts",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x5, "sata0", "prsnt",  V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xc, "ptp", "evreq",    V(1, 1, 1, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0xd, "mii", "crs",      V(1, 1, 1, 1, 1, 0, 0))),
        MPP_MODE(10,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "spi", "sck",      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0X3, "uart0", "txd",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x5, "sata1", "act",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xc, "ptp", "trig",     V(1, 1, 1, 1, 0, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "spi", "sck",      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0X3, "uart0", "txd",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x5, "sata1", "act",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xc, "ptp", "trig",     V(1, 1, 1, 1, 0, 0, 0))),
        MPP_MODE(11,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "spi", "miso",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x3, "uart0", "rxd",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x4, "ptp-1", "evreq",  V(1, 1, 1, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0xc, "ptp-2", "trig",   V(1, 1, 1, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0xd, "ptp", "clk",      V(1, 1, 1, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata0", "act",    V(0, 1, 1, 1, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "spi", "miso",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x3, "uart0", "rxd",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x4, "ptp-1", "evreq",  V(1, 1, 1, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0xc, "ptp-2", "trig",   V(1, 1, 1, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0xd, "ptp", "clk",      V(1, 1, 1, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata0", "act",    V(0, 1, 1, 1, 1, 0, 0))),
        MPP_MODE(12,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0x1, "sdio", "clk",     V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xa, "audio", "spdifo", V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "spi", "mosi",     V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xd, "twsi1", "sda",    V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "sdio", "clk",     V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xa, "audio", "spdifo", V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "spi", "mosi",     V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xd, "twsi1", "sda",    V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(13,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "sdio", "cmd",     V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "uart1", "txd",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0xa, "audio", "rmclk",  V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "pwm",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "sdio", "cmd",     V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "uart1", "txd",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0xa, "audio", "rmclk",  V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "pwm",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(14,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "sdio", "d0",      V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "uart1", "rxd",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x4, "sata1", "prsnt",  V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xa, "audio", "spdifi", V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "audio-1", "sdi",  V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xd, "mii", "col",      V(1, 1, 1, 1, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "sdio", "d0",      V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "uart1", "rxd",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x4, "sata1", "prsnt",  V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xa, "audio", "spdifi", V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "audio-1", "sdi",  V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xd, "mii", "col",      V(1, 1, 1, 1, 1, 0, 0))),
        MPP_MODE(15,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "sdio", "d1",      V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "uart0", "rts",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x3, "uart1", "txd",    V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "sata0", "act",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "spi", "cs",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "sdio", "d1",      V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "uart0", "rts",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x3, "uart1", "txd",    V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "sata0", "act",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "spi", "cs",       V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(16,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "sdio", "d2",      V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "uart0", "cts",    V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x3, "uart1", "rxd",    V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "sata1", "act",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "extclk",   V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xd, "mii", "crs",      V(1, 1, 1, 1, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "sdio", "d2",      V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "uart0", "cts",    V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x3, "uart1", "rxd",    V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "sata1", "act",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "extclk",   V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xd, "mii", "crs",      V(1, 1, 1, 1, 1, 0, 0))),
        MPP_MODE(17,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "sdio", "d3",      V(1, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "sata0", "prsnt",  V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xa, "sata1", "act",    V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xd, "twsi1", "sck",    V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "sdio", "d3",      V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "sata0", "prsnt",  V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xa, "sata1", "act",    V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xd, "twsi1", "sck",    V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(18,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "nand", "io0",     V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "pex", "clkreq",   V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "nand", "io0",     V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "pex", "clkreq",   V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(19,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "nand", "io1",     V(1, 1, 1, 1, 1, 1))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "nand", "io1",     V(1, 1, 1, 1, 1, 1, 1))),
        MPP_MODE(20,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp0",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "tx0ql",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "txd0",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata1", "act",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d0",       V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xc, "mii", "rxerr",    V(0, 0, 0, 0, 0, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp0",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "tx0ql",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "txd0",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata1", "act",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d0",       V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xc, "mii", "rxerr",    V(0, 0, 0, 0, 0, 0, 0))),
        MPP_MODE(21,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp1",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "rx0ql",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "txd1",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata0", "act",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d1",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp1",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "rx0ql",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "txd1",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata0", "act",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d1",       V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(22,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp2",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "tx2ql",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "txd2",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "rmclk",  V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata1", "prsnt",  V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d2",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp2",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "tx2ql",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "txd2",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "rmclk",  V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata1", "prsnt",  V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d2",       V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(23,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp3",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "rx2ql",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "txd3",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "rmclk",  V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "bclk",   V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata0", "prsnt",  V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d3",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp3",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "rx2ql",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "txd3",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "rmclk",  V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "bclk",   V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata0", "prsnt",  V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d3",       V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(24,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp4",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs0",  V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "rxd0",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "bclk",   V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "sdo",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d4",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp4",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs0",  V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "rxd0",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "bclk",   V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "sdo",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d4",       V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(25,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp5",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-sck",  V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "rxd1",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "sdo",    V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "lrclk",  V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d5",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp5",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-sck",  V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "rxd1",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "sdo",    V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "lrclk",  V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d5",       V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(26,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp6",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-miso", V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "rxd2",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "lrclk",  V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "mclk",   V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d6",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp6",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-miso", V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "rxd2",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "lrclk",  V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "mclk",   V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d6",       V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(27,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp7",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-mosi", V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "rxd3",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "mclk",   V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "sdi",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d7",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp7",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-mosi", V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "rxd3",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "mclk",   V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "sdi",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d7",       V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(28,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp8",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "int",      V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "col",      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "sdi",    V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d8",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp8",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "int",      V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "col",      V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "sdi",    V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d8",       V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "nand", "ren",     V(0, 0, 0, 0, 0, 0, 1))),
        MPP_MODE(29,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp9",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "rst",      V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "txclk",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(0, 0, 0, 0, 0, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d9",       V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp9",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "rst",      V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "txclk",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(0, 0, 0, 0, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d9",       V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "nand", "wen",     V(0, 0, 0, 0, 0, 0, 1))),
        MPP_MODE(30,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp10",      V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "pclk",     V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "rxctl",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d10",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp10",      V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "pclk",     V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "rxctl",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d10",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(31,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp11",      V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "fs",       V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "rxclk",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d11",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp11",      V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "fs",       V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "rxclk",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d11",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(32,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp12",      V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "drx",      V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "txclko",   V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d12",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp12",      V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "drx",      V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "txclko",   V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d12",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(33,
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "dtx",      V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "txctl",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d13",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(0, 1, 1, 1, 1, 0, 1)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "dtx",      V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "txctl",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d13",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(34,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs1",  V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "txen",     V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata1", "act",    V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d14",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs1",  V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "txen",     V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata1", "act",    V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d14",      V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "nand", "ale",     V(0, 0, 0, 0, 0, 0, 1))),
        MPP_MODE(35,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "tx0ql",    V(0, 0, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x3, "ge1", "rxerr",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x5, "sata0", "act",    V(0, 1, 1, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d15",      V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xc, "mii", "rxerr",    V(1, 1, 1, 1, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 1, 1, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "tx0ql",    V(0, 0, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x3, "ge1", "rxerr",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "sata0", "act",    V(0, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d15",      V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xc, "mii", "rxerr",    V(1, 1, 1, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "nand", "cen",     V(0, 0, 0, 0, 0, 0, 1))),
        MPP_MODE(36,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp0",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs1",  V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "twsi1", "sda",    V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp0",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs1",  V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "spdifi", V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "twsi1", "sda",    V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(37,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp1",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "tx2ql",    V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "twsi1", "sck",    V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp1",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "tx2ql",    V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "spdifo", V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "twsi1", "sck",    V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(38,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp2",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "rx2ql",    V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "rmclk",  V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d18",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp2",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "rx2ql",    V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "rmclk",  V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d18",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(39,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp3",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs0",  V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "bclk",   V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d19",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp3",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-cs0",  V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "bclk",   V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d19",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(40,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp4",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-sck",  V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "sdo",    V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d20",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp4",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-sck",  V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "sdo",    V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d20",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(41,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp5",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-miso", V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "lrclk",  V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d21",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp5",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-miso", V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "lrclk",  V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d21",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(42,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp6",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "spi-mosi", V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "mclk",   V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d22",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp6",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "spi-mosi", V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "mclk",   V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d22",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(43,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp7",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "int",      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "sdi",    V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d23",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp7",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "int",      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "sdi",    V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d23",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(44,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp8",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "rst",      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(1, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "clk",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(1, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp8",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "rst",      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x4, "audio", "extclk", V(1, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "clk",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(45,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 1, 1)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp9",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "pclk",     V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "e",        V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 1, 1, 1)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp9",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "pclk",     V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "e",        V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(46,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp10",      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "fs",       V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "hsync",    V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp10",      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "fs",       V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "hsync",    V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(47,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp11",      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "drx",      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "vsync",    V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp11",      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "drx",      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "vsync",    V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(48,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp12",      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "dtx",      V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d16",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp12",      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "dtx",      V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d16",      V(0, 0, 0, 0, 1, 0, 0))),
        MPP_MODE(49,
-               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 0, 1)),
-               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0x1, "ts", "mp9",       V(0, 0, 0, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0x2, "tdm", "rx0ql",    V(0, 0, 0, 1, 1, 0)),
-               MPP_VAR_FUNCTION(0x5, "ptp", "clk",      V(0, 0, 0, 1, 0, 0)),
-               MPP_VAR_FUNCTION(0xa, "pex", "clkreq",   V(0, 0, 0, 0, 1, 0)),
-               MPP_VAR_FUNCTION(0xb, "lcd", "d17",      V(0, 0, 0, 0, 1, 0))),
+               MPP_VAR_FUNCTION(0x0, "gpio", NULL,      V(0, 0, 0, 1, 0, 1, 1)),
+               MPP_VAR_FUNCTION(0x0, "gpo", NULL,       V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x1, "ts", "mp9",       V(0, 0, 0, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0x2, "tdm", "rx0ql",    V(0, 0, 0, 1, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0x5, "ptp", "clk",      V(0, 0, 0, 1, 0, 0, 0)),
+               MPP_VAR_FUNCTION(0xa, "pex", "clkreq",   V(0, 0, 0, 0, 1, 0, 0)),
+               MPP_VAR_FUNCTION(0xb, "lcd", "d17",      V(0, 0, 0, 0, 1, 0, 0))),
  };
  
  static const struct mvebu_mpp_ctrl mv88f6180_mpp_controls[] = {
@@@ -440,6 -450,17 +446,17 @@@ static struct mvebu_pinctrl_soc_info mv
        .ngpioranges = ARRAY_SIZE(mv88f628x_gpio_ranges),
  };
  
+ static struct mvebu_pinctrl_soc_info mv98dx1135_info = {
+       .variant = VARIANT_MV98DX1135,
+       .controls = mv88f628x_mpp_controls,
+       .ncontrols = ARRAY_SIZE(mv88f628x_mpp_controls),
+       .modes = mv88f6xxx_mpp_modes,
+       .nmodes = ARRAY_SIZE(mv88f6xxx_mpp_modes),
+       .gpioranges = mv88f628x_gpio_ranges,
+       .ngpioranges = ARRAY_SIZE(mv88f628x_gpio_ranges),
+ };
  static const struct of_device_id kirkwood_pinctrl_of_match[] = {
        { .compatible = "marvell,88f6180-pinctrl", .data = &mv88f6180_info },
        { .compatible = "marvell,88f6190-pinctrl", .data = &mv88f6190_info },
        { .compatible = "marvell,88f6281-pinctrl", .data = &mv88f6281_info },
        { .compatible = "marvell,88f6282-pinctrl", .data = &mv88f6282_info },
        { .compatible = "marvell,98dx4122-pinctrl", .data = &mv98dx4122_info },
+       { .compatible = "marvell,98dx1135-pinctrl", .data = &mv98dx1135_info },
        { }
  };
  
index 4ccd71bbc72a2164db5378f54e2a193d3d9269a4,d0cbdb1ad76a99702016e633beb4243ffec316d7..9eb86309c70bf78a4279df5b5d62585552fae4b2
@@@ -1,4 -1,3 +1,4 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Core driver for the generic pin config portions of the pin control subsystem
   *
@@@ -6,6 -5,8 +6,6 @@@
   * Written on behalf of Linaro for ST-Ericsson
   *
   * Author: Linus Walleij <linus.walleij@linaro.org>
 - *
 - * License terms: GNU General Public License (GPL) version 2
   */
  
  #define pr_fmt(fmt) "generic pinconfig core: " fmt
@@@ -38,6 -39,7 +38,7 @@@ static const struct pin_config_item con
        PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_SOURCE, "output drive open source", NULL, false),
        PCONFDUMP(PIN_CONFIG_DRIVE_PUSH_PULL, "output drive push pull", NULL, false),
        PCONFDUMP(PIN_CONFIG_DRIVE_STRENGTH, "output drive strength", "mA", true),
+       PCONFDUMP(PIN_CONFIG_DRIVE_STRENGTH_UA, "output drive strength", "uA", true),
        PCONFDUMP(PIN_CONFIG_INPUT_DEBOUNCE, "input debounce", "usec", true),
        PCONFDUMP(PIN_CONFIG_INPUT_ENABLE, "input enabled", NULL, false),
        PCONFDUMP(PIN_CONFIG_INPUT_SCHMITT, "input schmitt trigger", NULL, false),
@@@ -166,6 -168,7 +167,7 @@@ static const struct pinconf_generic_par
        { "drive-open-source", PIN_CONFIG_DRIVE_OPEN_SOURCE, 0 },
        { "drive-push-pull", PIN_CONFIG_DRIVE_PUSH_PULL, 0 },
        { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
+       { "drive-strength-microamp", PIN_CONFIG_DRIVE_STRENGTH_UA, 0 },
        { "input-debounce", PIN_CONFIG_INPUT_DEBOUNCE, 0 },
        { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
        { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
index 807a3263d84971167e67dd609c616e14663e5a4f,64363363fe27d52c1311b36ce835b7c245e85e6f..62a622159006683dfeeb7f2e021765808a3b397c
@@@ -1,4 -1,3 +1,4 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Pinctrl driver for Rockchip SoCs
   *
   *
   * and pinctrl-at91:
   * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License version 2 as published
 - * by the Free Software Foundation.
 - *
 - * This program is distributed in the hope that it will be useful,
 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - * GNU General Public License for more details.
   */
  
  #include <linux/init.h>
@@@ -3204,6 -3212,7 +3204,7 @@@ static int rockchip_get_bank_data(struc
                                                    base,
                                                    &rockchip_regmap_config);
                }
+               of_node_put(node);
        }
  
        bank->irq = irq_of_parse_and_map(bank->of_node, 0);
index 02b43f559e83405501122c2f1838486eda1d4f9d,a32badf3f118810389f9ce28afd6eea7f086224c..1f64e2e7efd9628a3f2118eb65d92fc7cdc117e3
@@@ -1,10 -1,22 +1,10 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Abilis Systems TB10x pin control driver
   *
   * Copyright (C) Abilis Systems 2012
   *
   * Author: Christian Ruppert <christian.ruppert@abilis.com>
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License version 2 as
 - * published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope that it will be useful,
 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - * GNU General Public License for more details.
 - *
 - * You should have received a copy of the GNU General Public License
 - * along with this program; if not, write to the Free Software
 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
   */
  
  #include <linux/stringify.h>
@@@ -471,22 -483,22 +471,22 @@@ struct tb10x_port 
   * @base: register set base address.
   * @pingroups: pointer to an array of the pin groups this driver manages.
   * @pinfuncgrpcnt: number of pingroups in @pingroups.
-  * @pinfuncs: pointer to an array of pin functions this driver manages.
   * @pinfuncnt: number of pin functions in @pinfuncs.
   * @mutex: mutex for exclusive access to a pin controller's state.
   * @ports: current state of each port.
   * @gpios: Indicates if a given pin is currently used as GPIO (1) or not (0).
+  * @pinfuncs: flexible array of pin functions this driver manages.
   */
  struct tb10x_pinctrl {
        struct pinctrl_dev *pctl;
        void *base;
        const struct tb10x_pinfuncgrp *pingroups;
        unsigned int pinfuncgrpcnt;
-       struct tb10x_of_pinfunc *pinfuncs;
        unsigned int pinfuncnt;
        struct mutex mutex;
        struct tb10x_port ports[TB10X_PORTS];
        DECLARE_BITMAP(gpios, MAX_PIN + 1);
+       struct tb10x_of_pinfunc pinfuncs[];
  };
  
  static inline void tb10x_pinctrl_set_config(struct tb10x_pinctrl *state,
@@@ -759,15 -771,13 +759,13 @@@ static int tb10x_pinctrl_probe(struct p
                return -EINVAL;
        }
  
-       state = devm_kzalloc(dev, sizeof(struct tb10x_pinctrl) +
-                                       of_get_child_count(of_node)
-                                       * sizeof(struct tb10x_of_pinfunc),
-                               GFP_KERNEL);
+       state = devm_kzalloc(dev, struct_size(state, pinfuncs,
+                                             of_get_child_count(of_node)),
+                            GFP_KERNEL);
        if (!state)
                return -ENOMEM;
  
        platform_set_drvdata(pdev, state);
-       state->pinfuncs = (struct tb10x_of_pinfunc *)(state + 1);
        mutex_init(&state->mutex);
  
        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
index 890d0a3a790bb010091ef87a766928e4543bedd4,03102c45fa0738371e7d1314e0cfe2a0b5980862..8e14a5f2e97000ee873ba8778ec7d3c363228cdb
@@@ -1,4 -1,3 +1,4 @@@
 +# SPDX-License-Identifier: GPL-2.0-only
  if (ARCH_QCOM || COMPILE_TEST)
  
  config PINCTRL_MSM
@@@ -169,11 -168,20 +169,20 @@@ config PINCTRL_SDM66
  
  config PINCTRL_SDM845
         tristate "Qualcomm Technologies Inc SDM845 pin controller driver"
-        depends on GPIOLIB && OF
+        depends on GPIOLIB && (OF || ACPI)
         select PINCTRL_MSM
         help
           This is the pinctrl, pinmux, pinconf and gpiolib driver for the
           Qualcomm Technologies Inc TLMM block found on the Qualcomm
           Technologies Inc SDM845 platform.
  
+ config PINCTRL_SM8150
+        tristate "Qualcomm Technologies Inc SM8150 pin controller driver"
+        depends on GPIOLIB && OF
+        select PINCTRL_MSM
+        help
+          This is the pinctrl, pinmux, pinconf and gpiolib driver for the
+          Qualcomm Technologies Inc TLMM block found on the Qualcomm
+          Technologies Inc SM8150 platform.
  endif
index 6e319bcc2326107962f020bf7e9d2f0028692298,c58a5643da6041b1871b0892de9e61035ef01527..7f35c196bb3e866500282d9aadb56ee7c48796ff
@@@ -1,7 -1,15 +1,7 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Copyright (c) 2013, Sony Mobile Communications AB.
   * Copyright (c) 2013, The Linux Foundation. All rights reserved.
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License version 2 and
 - * only version 2 as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope that it will be useful,
 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - * GNU General Public License for more details.
   */
  
  #include <linux/delay.h>
@@@ -599,8 -607,23 +599,23 @@@ static int msm_gpio_init_valid_mask(str
        int ret;
        unsigned int len, i;
        unsigned int max_gpios = pctrl->soc->ngpios;
+       const int *reserved = pctrl->soc->reserved_gpios;
        u16 *tmp;
  
+       /* Driver provided reserved list overrides DT and ACPI */
+       if (reserved) {
+               bitmap_fill(chip->valid_mask, max_gpios);
+               for (i = 0; reserved[i] >= 0; i++) {
+                       if (i >= max_gpios || reserved[i] >= max_gpios) {
+                               dev_err(pctrl->dev, "invalid list of reserved GPIOs\n");
+                               return -EINVAL;
+                       }
+                       clear_bit(reserved[i], chip->valid_mask);
+               }
+               return 0;
+       }
        /* The number of GPIOs in the ACPI tables */
        len = ret = device_property_read_u16_array(pctrl->dev, "gpios", NULL,
                                                   0);
@@@ -729,7 -752,7 +744,7 @@@ static void msm_gpio_irq_mask(struct ir
        raw_spin_unlock_irqrestore(&pctrl->lock, flags);
  }
  
- static void msm_gpio_irq_unmask(struct irq_data *d)
+ static void msm_gpio_irq_clear_unmask(struct irq_data *d, bool status_clear)
  {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
  
        raw_spin_lock_irqsave(&pctrl->lock, flags);
  
+       if (status_clear) {
+               /*
+                * clear the interrupt status bit before unmask to avoid
+                * any erroneous interrupts that would have got latched
+                * when the interrupt is not in use.
+                */
+               val = msm_readl_intr_status(pctrl, g);
+               val &= ~BIT(g->intr_status_bit);
+               msm_writel_intr_status(val, pctrl, g);
+       }
        val = msm_readl_intr_cfg(pctrl, g);
        val |= BIT(g->intr_raw_status_bit);
        val |= BIT(g->intr_enable_bit);
        raw_spin_unlock_irqrestore(&pctrl->lock, flags);
  }
  
+ static void msm_gpio_irq_enable(struct irq_data *d)
+ {
+       msm_gpio_irq_clear_unmask(d, true);
+ }
+ static void msm_gpio_irq_unmask(struct irq_data *d)
+ {
+       msm_gpio_irq_clear_unmask(d, false);
+ }
  static void msm_gpio_irq_ack(struct irq_data *d)
  {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
@@@ -956,6 -1001,9 +993,9 @@@ static void msm_gpio_irq_handler(struc
  
  static bool msm_gpio_needs_valid_mask(struct msm_pinctrl *pctrl)
  {
+       if (pctrl->soc->reserved_gpios)
+               return true;
        return device_property_read_u16_array(pctrl->dev, "gpios", NULL, 0) > 0;
  }
  
@@@ -978,6 -1026,7 +1018,7 @@@ static int msm_gpio_init(struct msm_pin
        chip->need_valid_mask = msm_gpio_needs_valid_mask(pctrl);
  
        pctrl->irq_chip.name = "msmgpio";
+       pctrl->irq_chip.irq_enable = msm_gpio_irq_enable;
        pctrl->irq_chip.irq_mask = msm_gpio_irq_mask;
        pctrl->irq_chip.irq_unmask = msm_gpio_irq_unmask;
        pctrl->irq_chip.irq_ack = msm_gpio_irq_ack;
index b724581c605ca519a6a934957cca4be9bbf3f943,23b93ae922696173f537edaf3f865577571e1509..48569cda847113743045ec9134659c0d2a3c981e
@@@ -1,6 -1,14 +1,6 @@@
 +/* SPDX-License-Identifier: GPL-2.0-only */
  /*
   * Copyright (c) 2013, Sony Mobile Communications AB.
 - *
 - * This program is free software; you can redistribute it and/or modify
 - * it under the terms of the GNU General Public License version 2 and
 - * only version 2 as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope that it will be useful,
 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - * GNU General Public License for more details.
   */
  #ifndef __PINCTRL_MSM_H__
  #define __PINCTRL_MSM_H__
@@@ -113,6 -121,7 +113,7 @@@ struct msm_pinctrl_soc_data 
        bool pull_no_keeper;
        const char *const *tiles;
        unsigned int ntiles;
+       const int *reserved_gpios;
  };
  
  extern const struct dev_pm_ops msm_pinctrl_dev_pm_ops;
index 9ed4ead2dafb3ead2ae486c085940bee651db31a,9d7eb6aca0f4bb1e4d6ba4c5a23307645cc6b2bd..14fe4032a52da774abbf22a0c303b0087d62f4ea
@@@ -1,4 -1,4 +1,4 @@@
 -// SPDX-Lincense-Identifier: GPL 2.0
 +// SPDX-License-Identifier: GPL-2.0
  /*
   * R8A77980 processor support - PFC hardware block.
   *
@@@ -19,7 -19,7 +19,7 @@@
  #include "core.h"
  #include "sh_pfc.h"
  
- #define CPU_ALL_PORT(fn, sfx) \
+ #define CPU_ALL_GP(fn, sfx)   \
        PORT_GP_CFG_22(0, fn, sfx, SH_PFC_PIN_CFG_IO_VOLTAGE),  \
        PORT_GP_28(1, fn, sfx), \
        PORT_GP_CFG_30(2, fn, sfx, SH_PFC_PIN_CFG_IO_VOLTAGE),  \
index 5906a856be386ffc38d42f440ecce47ef083d189,6f79f1f392c10c89152a427fdeff5d2880b8cced..a67d0d9ae8cd29fca810d9bc2fe51d392b5afc82
@@@ -1,4 -1,3 +1,4 @@@
 +# SPDX-License-Identifier: GPL-2.0-only
  config PINCTRL_TEGRA
        bool
        select PINMUX
@@@ -24,6 -23,10 +24,10 @@@ config PINCTRL_TEGRA21
        bool
        select PINCTRL_TEGRA
  
+ config PINCTRL_TEGRA194
+       bool
+       select PINCTRL_TEGRA
  config PINCTRL_TEGRA_XUSB
        def_bool y if ARCH_TEGRA
        select GENERIC_PHY
index abcfbad94f00ef5e241156a66a8fba145ce0aaad,c7fc8ecca5b4019d48909f422db74c1a9dc82519..186ef98e7b2b88bb88b0c70eb6e5ed3b6dd5be28
@@@ -1,4 -1,3 +1,4 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Driver for the NVIDIA Tegra pinmux
   *
@@@ -8,6 -7,15 +8,6 @@@
   * Copyright (C) 2010 Google, Inc.
   * Copyright (C) 2010 NVIDIA Corporation
   * Copyright (C) 2009-2011 ST-Ericsson AB
 - *
 - * This program is free software; you can redistribute it and/or modify it
 - * under the terms and conditions of the GNU General Public License,
 - * version 2, as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope it will be useful, but WITHOUT
 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 - * more details.
   */
  
  #include <linux/err.h>
@@@ -284,7 -292,7 +284,7 @@@ static int tegra_pinconf_reg(struct teg
                             const struct tegra_pingroup *g,
                             enum tegra_pinconf_param param,
                             bool report_err,
-                            s8 *bank, s16 *reg, s8 *bit, s8 *width)
+                            s8 *bank, s32 *reg, s8 *bit, s8 *width)
  {
        switch (param) {
        case TEGRA_PINCONF_PARAM_PULL:
@@@ -443,7 -451,7 +443,7 @@@ static int tegra_pinconf_group_get(stru
        const struct tegra_pingroup *g;
        int ret;
        s8 bank, bit, width;
-       s16 reg;
+       s32 reg;
        u32 val, mask;
  
        g = &pmx->soc->groups[group];
@@@ -472,7 -480,7 +472,7 @@@ static int tegra_pinconf_group_set(stru
        const struct tegra_pingroup *g;
        int ret, i;
        s8 bank, bit, width;
-       s16 reg;
+       s32 reg;
        u32 val, mask;
  
        g = &pmx->soc->groups[group];
@@@ -540,7 -548,7 +540,7 @@@ static void tegra_pinconf_group_dbg_sho
        const struct tegra_pingroup *g;
        int i, ret;
        s8 bank, bit, width;
-       s16 reg;
+       s32 reg;
        u32 val;
  
        g = &pmx->soc->groups[group];
@@@ -613,10 -621,20 +613,20 @@@ static void tegra_pinctrl_clear_parked_
  
        for (i = 0; i < pmx->soc->ngroups; ++i) {
                g = &pmx->soc->groups[i];
-               if (g->parked_bit >= 0) {
-                       val = pmx_readl(pmx, g->mux_bank, g->mux_reg);
-                       val &= ~(1 << g->parked_bit);
-                       pmx_writel(pmx, val, g->mux_bank, g->mux_reg);
+               if (g->parked_bitmask > 0) {
+                       unsigned int bank, reg;
+                       if (g->mux_reg != -1) {
+                               bank = g->mux_bank;
+                               reg = g->mux_reg;
+                       } else {
+                               bank = g->drv_bank;
+                               reg = g->drv_reg;
+                       }
+                       val = pmx_readl(pmx, bank, reg);
+                       val &= ~g->parked_bitmask;
+                       pmx_writel(pmx, val, bank, reg);
                }
        }
  }
index 9b5a71624fd0d361fa1b79666b1a5616c40520aa,719bdcba269e7d643f004c95fc2c9c3e911c336d..105309774079807ac6520a42cdd559914e001d11
@@@ -1,8 -1,16 +1,8 @@@
 +/* SPDX-License-Identifier: GPL-2.0-only */
  /*
   * Driver for the NVIDIA Tegra pinmux
   *
   * Copyright (c) 2011, NVIDIA CORPORATION.  All rights reserved.
 - *
 - * This program is free software; you can redistribute it and/or modify it
 - * under the terms and conditions of the GNU General Public License,
 - * version 2, as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope it will be useful, but WITHOUT
 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 - * more details.
   */
  
  #ifndef __PINMUX_TEGRA_H__
@@@ -96,7 -104,6 +96,6 @@@ struct tegra_function 
   * @tri_reg:          Tri-state register offset.
   * @tri_bank:         Tri-state register bank.
   * @tri_bit:          Tri-state register bit.
-  * @parked_bit:               Parked register bit. -1 if unsupported.
   * @einput_bit:               Enable-input register bit.
   * @odrain_bit:               Open-drain register bit.
   * @lock_bit:         Lock register bit.
   * @slwf_bit:         Slew Falling register bit.
   * @slwf_width:               Slew Falling field width.
   * @drvtype_bit:      Drive type register bit.
+  * @parked_bitmask:   Parked register mask. 0 if unsupported.
   *
   * -1 in a *_reg field means that feature is unsupported for this group.
   * *_bank and *_reg values are irrelevant when *_reg is -1.
@@@ -135,10 -143,10 +135,10 @@@ struct tegra_pingroup 
        const unsigned *pins;
        u8 npins;
        u8 funcs[4];
-       s16 mux_reg;
-       s16 pupd_reg;
-       s16 tri_reg;
-       s16 drv_reg;
+       s32 mux_reg;
+       s32 pupd_reg;
+       s32 tri_reg;
+       s32 drv_reg;
        u32 mux_bank:2;
        u32 pupd_bank:2;
        u32 tri_bank:2;
        s32 mux_bit:6;
        s32 pupd_bit:6;
        s32 tri_bit:6;
-       s32 parked_bit:6;
        s32 einput_bit:6;
        s32 odrain_bit:6;
        s32 lock_bit:6;
        s32 drvup_width:6;
        s32 slwr_width:6;
        s32 slwf_width:6;
+       u32 parked_bitmask;
  };
  
  /**
index 762151f17a883fdf9cd1d7e441d4a0adf97a60ff,09ac945f795b24e8618b1e3f79cc173698231b39..e72ab1eb23983289961c6c913c7d56c1e02d39d0
@@@ -1,10 -1,18 +1,10 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Pinctrl data for the NVIDIA Tegra114 pinmux
   *
   * Author: Pritesh Raithatha <praithatha@nvidia.com>
   *
   * Copyright (c) 2012-2013, NVIDIA CORPORATION.  All rights reserved.
 - *
 - * This program is free software; you can redistribute it and/or modify it
 - * under the terms and conditions of the GNU General Public License,
 - * version 2, as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope it will be useful, but WITHOUT
 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 - * more details.
   */
  
  #include <linux/init.h>
@@@ -1572,8 -1580,8 +1572,8 @@@ static struct tegra_function tegra114_f
                .lock_bit = 7,                                          \
                .ioreset_bit = PINGROUP_BIT_##ior(8),                   \
                .rcv_sel_bit = PINGROUP_BIT_##rcv_sel(9),               \
-               .parked_bit = -1,                                       \
                .drv_reg = -1,                                          \
+               .parked_bitmask = 0,                                    \
        }
  
  #define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b, drvdn_b,   \
                .rcv_sel_bit = -1,                                      \
                .drv_reg = DRV_PINGROUP_REG(r),                         \
                .drv_bank = 0,                                          \
-               .parked_bit = -1,                                       \
                .hsm_bit = hsm_b,                                       \
                .schmitt_bit = schmitt_b,                               \
                .lpmd_bit = lpmd_b,                                     \
                .slwf_bit = slwf_b,                                     \
                .slwf_width = slwf_w,                                   \
                .drvtype_bit = PINGROUP_BIT_##drvtype(6),               \
+               .parked_bitmask = 0,                                    \
        }
  
  static const struct tegra_pingroup tegra114_groups[] = {
  
  static const struct tegra_pinctrl_soc_data tegra114_pinctrl = {
        .ngpios = NUM_GPIOS,
-       .gpio_compatible = "nvidia,tegra30-gpio",
+       .gpio_compatible = "nvidia,tegra114-gpio",
        .pins = tegra114_pins,
        .npins = ARRAY_SIZE(tegra114_pins),
        .functions = tegra114_functions,
index 930c43758c9230bc1d69e8ac1fb6ebb0f9baa9b7,da290787e70390ef94755a42b4bb90c26b124e88..26096c6b967e2f7ff8ac307c30c371adbe2ac35b
@@@ -1,10 -1,18 +1,10 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Pinctrl data for the NVIDIA Tegra124 pinmux
   *
   * Author: Ashwini Ghuge <aghuge@nvidia.com>
   *
   * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
 - *
 - * This program is free software; you can redistribute it and/or modify it
 - * under the terms and conditions of the GNU General Public License,
 - * version 2, as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope it will be useful, but WITHOUT
 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 - * more details.
   */
  
  #include <linux/init.h>
@@@ -1741,8 -1749,8 +1741,8 @@@ static struct tegra_function tegra124_f
                .lock_bit = 7,                                          \
                .ioreset_bit = PINGROUP_BIT_##ior(8),                   \
                .rcv_sel_bit = PINGROUP_BIT_##rcv_sel(9),               \
-               .parked_bit = -1,                                       \
                .drv_reg = -1,                                          \
+               .parked_bitmask = 0,                                    \
        }
  
  #define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b, drvdn_b,   \
                .rcv_sel_bit = -1,                                      \
                .drv_reg = DRV_PINGROUP_REG(r),                         \
                .drv_bank = 0,                                          \
-               .parked_bit = -1,                                       \
                .hsm_bit = hsm_b,                                       \
                .schmitt_bit = schmitt_b,                               \
                .lpmd_bit = lpmd_b,                                     \
                .slwf_bit = slwf_b,                                     \
                .slwf_width = slwf_w,                                   \
                .drvtype_bit = PINGROUP_BIT_##drvtype(6),               \
+               .parked_bitmask = 0,                                    \
        }
  
  #define MIPI_PAD_CTRL_PINGROUP(pg_name, r, b, f0, f1)                 \
@@@ -2043,7 -2051,7 +2043,7 @@@ static const struct tegra_pingroup tegr
  
  static const struct tegra_pinctrl_soc_data tegra124_pinctrl = {
        .ngpios = NUM_GPIOS,
-       .gpio_compatible = "nvidia,tegra30-gpio",
+       .gpio_compatible = "nvidia,tegra124-gpio",
        .pins = tegra124_pins,
        .npins = ARRAY_SIZE(tegra124_pins),
        .functions = tegra124_functions,
index 4b7837e38fb5f7dcb19d4d0ce5cd731470e91fce,9a8df1e431793a0d95f0fe725b9f88308f9a7efa..0dc2cf0d05b1ec83c8907cb25ed0a7c85f21d55a
@@@ -1,4 -1,3 +1,4 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Pinctrl data for the NVIDIA Tegra20 pinmux
   *
@@@ -9,6 -8,15 +9,6 @@@
   * Derived from code:
   * Copyright (C) 2010 Google, Inc.
   * Copyright (C) 2010 NVIDIA Corporation
 - *
 - * This program is free software; you can redistribute it and/or modify it
 - * under the terms and conditions of the GNU General Public License,
 - * version 2, as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope it will be useful, but WITHOUT
 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 - * more details.
   */
  
  #include <linux/clk-provider.h>
@@@ -1989,13 -1997,13 +1989,13 @@@ static struct tegra_function tegra20_fu
                .tri_reg = ((tri_r) - TRISTATE_REG_A),          \
                .tri_bank = 0,                                  \
                .tri_bit = tri_b,                               \
-               .parked_bit = -1,                               \
                .einput_bit = -1,                               \
                .odrain_bit = -1,                               \
                .lock_bit = -1,                                 \
                .ioreset_bit = -1,                              \
                .rcv_sel_bit = -1,                              \
                .drv_reg = -1,                                  \
+               .parked_bitmask = 0,                            \
        }
  
  /* Pin groups with only pull up and pull down control */
                .pupd_bank = 2,                                 \
                .pupd_bit = pupd_b,                             \
                .drv_reg = -1,                                  \
-               .parked_bit = -1,                               \
+               .parked_bitmask = 0,                            \
        }
  
  /* Pin groups for drive strength registers (configurable version) */
                .tri_reg = -1,                                  \
                .drv_reg = ((r) - PINGROUP_REG_A),              \
                .drv_bank = 3,                                  \
-               .parked_bit = -1,                               \
+               .parked_bitmask = 0,                            \
                .hsm_bit = hsm_b,                               \
                .schmitt_bit = schmitt_b,                       \
                .lpmd_bit = lpmd_b,                             \
index 0b56ad5c9c1c08315a8c369544c2630060d6717a,4aeda04fbede7fc711eef7823c085b6391c71515..39ab6480a941e9827b67e12662735271637712b2
@@@ -1,8 -1,16 +1,8 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Pinctrl data for the NVIDIA Tegra210 pinmux
   *
   * Copyright (c) 2015, NVIDIA CORPORATION.  All rights reserved.
 - *
 - * This program is free software; you can redistribute it and/or modify it
 - * under the terms and conditions of the GNU General Public License,
 - * version 2, as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope it will be useful, but WITHOUT
 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 - * more details.
   */
  
  #include <linux/init.h>
@@@ -1302,7 -1310,6 +1302,6 @@@ static struct tegra_function tegra210_f
                .lock_bit = 7,                                          \
                .ioreset_bit = -1,                                      \
                .rcv_sel_bit = PINGROUP_BIT_##e_io_hv(10),              \
-               .parked_bit = 5,                                        \
                .hsm_bit = PINGROUP_BIT_##hsm(9),                       \
                .schmitt_bit = 12,                                      \
                .drvtype_bit = PINGROUP_BIT_##drvtype(13),              \
                .slwr_width = slwr_w,                                   \
                .slwf_bit = slwf_b,                                     \
                .slwf_width = slwf_w,                                   \
+               .parked_bitmask = BIT(5),                               \
        }
  
- #define DRV_PINGROUP(pg_name, r, drvdn_b, drvdn_w, drvup_b, drvup_w,  \
-                    slwr_b, slwr_w, slwf_b, slwf_w)                    \
+ #define DRV_PINGROUP(pg_name, r, prk_mask, drvdn_b, drvdn_w, drvup_b, \
+                    drvup_w, slwr_b, slwr_w, slwf_b, slwf_w)           \
        {                                                               \
                .name = "drive_" #pg_name,                              \
                .pins = drive_##pg_name##_pins,                         \
                .rcv_sel_bit = -1,                                      \
                .drv_reg = DRV_PINGROUP_REG(r),                         \
                .drv_bank = 0,                                          \
-               .parked_bit = -1,                                       \
                .hsm_bit = -1,                                          \
                .schmitt_bit = -1,                                      \
                .lpmd_bit = -1,                                         \
                .slwf_bit = slwf_b,                                     \
                .slwf_width = slwf_w,                                   \
                .drvtype_bit = -1,                                      \
+               .parked_bitmask = prk_mask,                             \
        }
  
  static const struct tegra_pingroup tegra210_groups[] = {
        PINGROUP(pz4,                  SDMMC1,     RSVD1,  RSVD2, RSVD3, 0x328c, N,   N,       N,       -1,    -1,      -1,      -1,      -1,      -1,     -1,     -1,     -1),
        PINGROUP(pz5,                  SOC,        RSVD1,  RSVD2, RSVD3, 0x3290, N,   N,       N,       -1,    -1,      -1,      -1,      -1,      -1,     -1,     -1,     -1),
  
-       /* pg_name, r, drvdn_b, drvdn_w, drvup_b, drvup_w, slwr_b, slwr_w, slwf_b, slwf_w */
-       DRV_PINGROUP(pa6,    0x9c0, 12, 5,  20, 5,  -1, -1, -1, -1),
-       DRV_PINGROUP(pcc7,   0x9c4, 12, 5,  20, 5,  -1, -1, -1, -1),
-       DRV_PINGROUP(pe6,    0x9c8, 12, 5,  20, 5,  -1, -1, -1, -1),
-       DRV_PINGROUP(pe7,    0x9cc, 12, 5,  20, 5,  -1, -1, -1, -1),
-       DRV_PINGROUP(ph6,    0x9d0, 12, 5,  20, 5,  -1, -1, -1, -1),
-       DRV_PINGROUP(pk0,    0x9d4, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pk1,    0x9d8, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pk2,    0x9dc, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pk3,    0x9e0, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pk4,    0x9e4, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pk5,    0x9e8, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pk6,    0x9ec, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pk7,    0x9f0, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pl0,    0x9f4, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pl1,    0x9f8, -1, -1, -1, -1, 28, 2,  30, 2),
-       DRV_PINGROUP(pz0,    0x9fc, 12, 7,  20, 7,  -1, -1, -1, -1),
-       DRV_PINGROUP(pz1,    0xa00, 12, 7,  20, 7,  -1, -1, -1, -1),
-       DRV_PINGROUP(pz2,    0xa04, 12, 7,  20, 7,  -1, -1, -1, -1),
-       DRV_PINGROUP(pz3,    0xa08, 12, 7,  20, 7,  -1, -1, -1, -1),
-       DRV_PINGROUP(pz4,    0xa0c, 12, 7,  20, 7,  -1, -1, -1, -1),
-       DRV_PINGROUP(pz5,    0xa10, 12, 7,  20, 7,  -1, -1, -1, -1),
-       DRV_PINGROUP(sdmmc1, 0xa98, 12, 7,  20, 7,  28, 2,  30, 2),
-       DRV_PINGROUP(sdmmc2, 0xa9c, 2,  6,  8,  6,  28, 2,  30, 2),
-       DRV_PINGROUP(sdmmc3, 0xab0, 12, 7,  20, 7,  28, 2,  30, 2),
-       DRV_PINGROUP(sdmmc4, 0xab4, 2,  6,  8,  6,  28, 2,  30, 2),
+       /* pg_name, r, prk_mask, drvdn_b, drvdn_w, drvup_b, drvup_w, slwr_b, slwr_w, slwf_b, slwf_w */
+       DRV_PINGROUP(pa6,    0x9c0, 0x0,       12, 5,  20, 5,  -1, -1, -1, -1),
+       DRV_PINGROUP(pcc7,   0x9c4, 0x0,       12, 5,  20, 5,  -1, -1, -1, -1),
+       DRV_PINGROUP(pe6,    0x9c8, 0x0,       12, 5,  20, 5,  -1, -1, -1, -1),
+       DRV_PINGROUP(pe7,    0x9cc, 0x0,       12, 5,  20, 5,  -1, -1, -1, -1),
+       DRV_PINGROUP(ph6,    0x9d0, 0x0,       12, 5,  20, 5,  -1, -1, -1, -1),
+       DRV_PINGROUP(pk0,    0x9d4, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pk1,    0x9d8, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pk2,    0x9dc, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pk3,    0x9e0, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pk4,    0x9e4, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pk5,    0x9e8, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pk6,    0x9ec, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pk7,    0x9f0, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pl0,    0x9f4, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pl1,    0x9f8, 0x0,       -1, -1, -1, -1, 28, 2,  30, 2),
+       DRV_PINGROUP(pz0,    0x9fc, 0x0,       12, 7,  20, 7,  -1, -1, -1, -1),
+       DRV_PINGROUP(pz1,    0xa00, 0x0,       12, 7,  20, 7,  -1, -1, -1, -1),
+       DRV_PINGROUP(pz2,    0xa04, 0x0,       12, 7,  20, 7,  -1, -1, -1, -1),
+       DRV_PINGROUP(pz3,    0xa08, 0x0,       12, 7,  20, 7,  -1, -1, -1, -1),
+       DRV_PINGROUP(pz4,    0xa0c, 0x0,       12, 7,  20, 7,  -1, -1, -1, -1),
+       DRV_PINGROUP(pz5,    0xa10, 0x0,       12, 7,  20, 7,  -1, -1, -1, -1),
+       DRV_PINGROUP(sdmmc1, 0xa98, 0x0,       12, 7,  20, 7,  28, 2,  30, 2),
+       DRV_PINGROUP(sdmmc2, 0xa9c, 0x7ffc000, 2,  6,  8,  6,  28, 2,  30, 2),
+       DRV_PINGROUP(sdmmc3, 0xab0, 0x0,       12, 7,  20, 7,  28, 2,  30, 2),
+       DRV_PINGROUP(sdmmc4, 0xab4, 0x7ffc000, 2,  6,  8,  6,  28, 2,  30, 2),
  };
  
  static const struct tegra_pinctrl_soc_data tegra210_pinctrl = {
        .ngpios = NUM_GPIOS,
-       .gpio_compatible = "nvidia,tegra30-gpio",
+       .gpio_compatible = "nvidia,tegra210-gpio",
        .pins = tegra210_pins,
        .npins = ARRAY_SIZE(tegra210_pins),
        .functions = tegra210_functions,
index 610124c3d192bddc7ac6faef98b0398b81f06e64,10e6381981093e7a11c4e4d59099c43576d3697f..7299a371827f1892d8b2be7c6eb8d1b6e50df712
@@@ -1,10 -1,18 +1,10 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * Pinctrl data for the NVIDIA Tegra30 pinmux
   *
   * Author: Stephen Warren <swarren@nvidia.com>
   *
   * Copyright (c) 2011-2012, NVIDIA CORPORATION.  All rights reserved.
 - *
 - * This program is free software; you can redistribute it and/or modify it
 - * under the terms and conditions of the GNU General Public License,
 - * version 2, as published by the Free Software Foundation.
 - *
 - * This program is distributed in the hope it will be useful, but WITHOUT
 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 - * more details.
   */
  
  #include <linux/init.h>
@@@ -2133,8 -2141,8 +2133,8 @@@ static struct tegra_function tegra30_fu
                .lock_bit = 7,                                          \
                .ioreset_bit = PINGROUP_BIT_##ior(8),                   \
                .rcv_sel_bit = -1,                                      \
-               .parked_bit = -1,                                       \
                .drv_reg = -1,                                          \
+               .parked_bitmask = 0,                                    \
        }
  
  #define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b, drvdn_b,   \
                .rcv_sel_bit = -1,                                      \
                .drv_reg = DRV_PINGROUP_REG(r),                         \
                .drv_bank = 0,                                          \
-               .parked_bit = -1,                                       \
                .hsm_bit = hsm_b,                                       \
                .schmitt_bit = schmitt_b,                               \
                .lpmd_bit = lpmd_b,                                     \
                .slwf_bit = slwf_b,                                     \
                .slwf_width = slwf_w,                                   \
                .drvtype_bit = -1,                                      \
+               .parked_bitmask = 0,                                    \
        }
  
  static const struct tegra_pingroup tegra30_groups[] = {
index 8d58386aadd5d1fee3fba1642133b9969cd40c94,b58b27c113552cbcf0d0123ff85d099f031ba2b4..6a0e420915a3cba73fc3cdf31b52eeb33adccd85
@@@ -18,7 -18,6 +18,7 @@@ struct seq_file
  struct gpio_device;
  struct module;
  enum gpiod_flags;
 +enum gpio_lookup_flags;
  
  #ifdef CONFIG_GPIOLIB
  
@@@ -102,6 -101,13 +102,6 @@@ struct gpio_irq_chip 
         */
        unsigned int num_parents;
  
 -      /**
 -       * @parent_irq:
 -       *
 -       * For use by gpiochip_set_cascaded_irqchip()
 -       */
 -      unsigned int parent_irq;
 -
        /**
         * @parents:
         *
         */
        void            (*irq_disable)(struct irq_data *data);
  };
 -#endif
 +#endif /* CONFIG_GPIOLIB_IRQCHIP */
  
  /**
   * struct gpio_chip - abstract a GPIO controller
   * @dbg_show: optional routine to show contents in debugfs; default code
   *    will be used when this is omitted, but custom code can show extra
   *    state (such as pullup/pulldown configuration).
 + * @init_valid_mask: optional routine to initialize @valid_mask, to be used if
 + *    not all GPIOs are valid.
   * @base: identifies the first GPIO number handled by this chip;
   *    or, if negative during registration, requests dynamic ID allocation.
   *    DEPRECATION: providing anything non-negative and nailing the base
@@@ -303,7 -307,7 +303,7 @@@ struct gpio_chip 
        spinlock_t bgpio_lock;
        unsigned long bgpio_data;
        unsigned long bgpio_dir;
 -#endif
 +#endif /* CONFIG_GPIO_GENERIC */
  
  #ifdef CONFIG_GPIOLIB_IRQCHIP
        /*
         * used to handle IRQs for most practical cases.
         */
        struct gpio_irq_chip irq;
 -#endif
 +#endif /* CONFIG_GPIOLIB_IRQCHIP */
  
        /**
         * @need_valid_mask:
         */
        int (*of_xlate)(struct gpio_chip *gc,
                        const struct of_phandle_args *gpiospec, u32 *flags);
 -#endif
 +#endif /* CONFIG_OF_GPIO */
  };
  
  extern const char *gpiochip_is_requested(struct gpio_chip *chip,
@@@ -408,7 -412,7 +408,7 @@@ extern int gpiochip_add_data_with_key(s
        })
  #else
  #define gpiochip_add_data(chip, data) gpiochip_add_data_with_key(chip, data, NULL, NULL)
 -#endif
 +#endif /* CONFIG_LOCKDEP */
  
  static inline int gpiochip_add(struct gpio_chip *chip)
  {
@@@ -463,7 -467,7 +463,7 @@@ int bgpio_init(struct gpio_chip *gc, st
  #define BGPIOF_READ_OUTPUT_REG_SET    BIT(4) /* reg_set stores output value */
  #define BGPIOF_NO_OUTPUT              BIT(5) /* only input */
  
 -#endif
 +#endif /* CONFIG_GPIO_GENERIC */
  
  #ifdef CONFIG_GPIOLIB_IRQCHIP
  
@@@ -533,7 -537,7 +533,7 @@@ static inline int gpiochip_irqchip_add_
                                        handler, type, true,
                                        &lock_key, &request_key);
  }
 -#else
 +#else /* ! CONFIG_LOCKDEP */
  static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
                                       struct irq_chip *irqchip,
                                       unsigned int first_irq,
@@@ -584,8 -588,10 +584,10 @@@ int gpiochip_add_pingroup_range(struct 
                        unsigned int gpio_offset, const char *pin_group);
  void gpiochip_remove_pin_ranges(struct gpio_chip *chip);
  
 -#else
 +#else /* ! CONFIG_PINCTRL */
  
+ struct pinctrl_dev;
  static inline int
  gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
                       unsigned int gpio_offset, unsigned int pin_offset,
@@@ -610,8 -616,7 +612,8 @@@ gpiochip_remove_pin_ranges(struct gpio_
  
  struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
                                            const char *label,
 -                                          enum gpiod_flags flags);
 +                                          enum gpio_lookup_flags lflags,
 +                                          enum gpiod_flags dflags);
  void gpiochip_free_own_desc(struct gpio_desc *desc);
  
  void devprop_gpiochip_set_names(struct gpio_chip *chip,
index 6f260c1d346759cd8ba2e86e4ab74256fe97702d,673828a52294caecbd65cfc020bd13a3e8e4acdd..6aeb711f7cd163837ceec80d20c75211b21a70f0
@@@ -1,4 -1,3 +1,4 @@@
 +/* SPDX-License-Identifier: GPL-2.0-only */
  /*
   * Interface the generic pinconfig portions of the pinctrl subsystem
   *
@@@ -7,10 -6,18 +7,16 @@@
   * This interface is used in the core to keep track of pins.
   *
   * Author: Linus Walleij <linus.walleij@linaro.org>
 - *
 - * License terms: GNU General Public License (GPL) version 2
   */
  #ifndef __LINUX_PINCTRL_PINCONF_GENERIC_H
  #define __LINUX_PINCTRL_PINCONF_GENERIC_H
  
+ #include <linux/device.h>
+ #include <linux/pinctrl/machine.h>
+ struct pinctrl_dev;
+ struct pinctrl_map;
  /**
   * enum pin_config_param - possible pin configuration parameters
   * @PIN_CONFIG_BIAS_BUS_HOLD: the pin will be set to weakly latch so that it
@@@ -54,6 -61,8 +60,8 @@@
   *    push-pull mode, the argument is ignored.
   * @PIN_CONFIG_DRIVE_STRENGTH: the pin will sink or source at most the current
   *    passed as argument. The argument is in mA.
+  * @PIN_CONFIG_DRIVE_STRENGTH_UA: the pin will sink or source at most the current
+  *    passed as argument. The argument is in uA.
   * @PIN_CONFIG_INPUT_DEBOUNCE: this will configure the pin to debounce mode,
   *    which means it will wait for signals to settle when reading inputs. The
   *    argument gives the debounce time in usecs. Setting the
@@@ -111,6 -120,7 +119,7 @@@ enum pin_config_param 
        PIN_CONFIG_DRIVE_OPEN_SOURCE,
        PIN_CONFIG_DRIVE_PUSH_PULL,
        PIN_CONFIG_DRIVE_STRENGTH,
+       PIN_CONFIG_DRIVE_STRENGTH_UA,
        PIN_CONFIG_INPUT_DEBOUNCE,
        PIN_CONFIG_INPUT_ENABLE,
        PIN_CONFIG_INPUT_SCHMITT,
@@@ -155,9 -165,6 +164,6 @@@ static inline unsigned long pinconf_to_
        return PIN_CONF_PACKED(param, argument);
  }
  
- #ifdef CONFIG_GENERIC_PINCONF
- #ifdef CONFIG_DEBUG_FS
  #define PCONFDUMP(a, b, c, d) {                                       \
        .param = a, .display = b, .format = c, .has_arg = d     \
        }
@@@ -168,14 -175,6 +174,6 @@@ struct pin_config_item 
        const char * const format;
        bool has_arg;
  };
- #endif /* CONFIG_DEBUG_FS */
- #ifdef CONFIG_OF
- #include <linux/device.h>
- #include <linux/pinctrl/machine.h>
- struct pinctrl_dev;
- struct pinctrl_map;
  
  struct pinconf_generic_params {
        const char * const property;
@@@ -220,8 -219,5 +218,5 @@@ static inline int pinconf_generic_dt_no
        return pinconf_generic_dt_node_to_map(pctldev, np_config, map, num_maps,
                        PIN_MAP_TYPE_INVALID);
  }
- #endif
- #endif /* CONFIG_GENERIC_PINCONF */
  
  #endif /* __LINUX_PINCTRL_PINCONF_GENERIC_H */
index 514414a5ad01db86351e17f722bde1484d2b9a7d,513883dcc5a92a331df775de9ed874a03ff82060..f8a8215e9021e1364832e1d6441b1e4b299cc9a0
@@@ -1,4 -1,3 +1,4 @@@
 +/* SPDX-License-Identifier: GPL-2.0-only */
  /*
   * Interface the pinconfig portions of the pinctrl subsystem
   *
@@@ -7,11 -6,13 +7,11 @@@
   * This interface is used in the core to keep track of pins.
   *
   * Author: Linus Walleij <linus.walleij@linaro.org>
 - *
 - * License terms: GNU General Public License (GPL) version 2
   */
  #ifndef __LINUX_PINCTRL_PINCONF_H
  #define __LINUX_PINCTRL_PINCONF_H
  
- #ifdef CONFIG_PINCONF
+ #include <linux/types.h>
  
  struct pinctrl_dev;
  struct seq_file;
@@@ -64,6 -65,4 +64,4 @@@ struct pinconf_ops 
                                            unsigned long config);
  };
  
- #endif
  #endif /* __LINUX_PINCTRL_PINCONF_H */
index e429e5d92dd68e15bcb132366101b06f45e466c3,27738164daa7510a44d30cdd560345bb22dcf16d..7ce23450a1cb4ee6ac5ecb0af20b4b7dbea7c2dc
@@@ -1,4 -1,3 +1,4 @@@
 +/* SPDX-License-Identifier: GPL-2.0-only */
  /*
   * Interface the pinctrl subsystem
   *
@@@ -7,12 -6,12 +7,10 @@@
   * This interface is used in the core to keep track of pins.
   *
   * Author: Linus Walleij <linus.walleij@linaro.org>
 - *
 - * License terms: GNU General Public License (GPL) version 2
   */
  #ifndef __LINUX_PINCTRL_PINCTRL_H
  #define __LINUX_PINCTRL_PINCTRL_H
  
- #ifdef CONFIG_PINCTRL
  #include <linux/radix-tree.h>
  #include <linux/list.h>
  #include <linux/seq_file.h>
@@@ -124,6 -123,10 +122,10 @@@ struct pinctrl_ops 
   *    the hardware description
   * @custom_conf_items: Information how to print @params in debugfs, must be
   *    the same size as the @custom_params, i.e. @num_custom_params
+  * @link_consumers: If true create a device link between pinctrl and its
+  *    consumers (i.e. the devices requesting pin control states). This is
+  *    sometimes necessary to ascertain the right suspend/resume order for
+  *    example.
   */
  struct pinctrl_desc {
        const char *name;
        const struct pinconf_generic_params *custom_params;
        const struct pin_config_item *custom_conf_items;
  #endif
+       bool link_consumers;
  };
  
  /* External interface to pin controller */
@@@ -166,7 -170,6 +169,6 @@@ extern struct pinctrl_dev *devm_pinctrl
  extern void devm_pinctrl_unregister(struct device *dev,
                                struct pinctrl_dev *pctldev);
  
- extern bool pin_is_valid(struct pinctrl_dev *pctldev, int pin);
  extern void pinctrl_add_gpio_range(struct pinctrl_dev *pctldev,
                                struct pinctrl_gpio_range *range);
  extern void pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev,
@@@ -197,16 -200,5 +199,5 @@@ struct pinctrl_dev *of_pinctrl_get(stru
  extern const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev);
  extern const char *pinctrl_dev_get_devname(struct pinctrl_dev *pctldev);
  extern void *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev);
- #else
- struct pinctrl_dev;
- /* Sufficiently stupid default functions when pinctrl is not in use */
- static inline bool pin_is_valid(struct pinctrl_dev *pctldev, int pin)
- {
-       return pin >= 0;
- }
- #endif /* !CONFIG_PINCTRL */
  
  #endif /* __LINUX_PINCTRL_PINCTRL_H */
index e873ed97d79e4152367b15ce0ef26f71103fdfca,566a5fe8eab55b6241585e8d802065ad0909dcbd..9a647fa5c8f1f095c66396518f3b2466f68c641c
@@@ -1,4 -1,3 +1,4 @@@
 +/* SPDX-License-Identifier: GPL-2.0-only */
  /*
   * Interface the pinmux subsystem
   *
@@@ -7,6 -6,8 +7,6 @@@
   * Based on bits of regulator core, gpio core and clk core
   *
   * Author: Linus Walleij <linus.walleij@linaro.org>
 - *
 - * License terms: GNU General Public License (GPL) version 2
   */
  #ifndef __LINUX_PINCTRL_PINMUX_H
  #define __LINUX_PINCTRL_PINMUX_H
@@@ -15,8 -16,6 +15,6 @@@
  #include <linux/seq_file.h>
  #include <linux/pinctrl/pinctrl.h>
  
- #ifdef CONFIG_PINMUX
  struct pinctrl_dev;
  
  /**
@@@ -84,6 -83,4 +82,4 @@@ struct pinmux_ops 
        bool strict;
  };
  
- #endif /* CONFIG_PINMUX */
  #endif /* __LINUX_PINCTRL_PINMUX_H */