Merge tag 'pinctrl-v4.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Nov 2017 18:57:11 +0000 (10:57 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Nov 2017 18:57:11 +0000 (10:57 -0800)
Pull pin control updates from Linus Walleij:
 "This is the bulk of pin control changes for the v4.15 kernel cycle:

  Core:

   - The pin control Kconfig entry PINCTRL is now turned into a
     menuconfig option. This obviously has the implication of making the
     subsystem menu visible in menuconfig. This is happening because of
     two things:

      (a) Intel have started to deploy and depend on pin controllers in
          a way that is affecting users directly. This happens on the
          highly integrated laptop chipsets named after geographical
          places: baytrail, broxton, cannonlake, cedarfork, cherryview,
          denverton, geminilake, lewisburg, merrifield, sunrisepoint...
          It started a while back and now it is ever more evident that
          this is crucial infrastructure for x86 laptops and not an
          embedded obscurity anymore. Users need to be aware.

      (b) Pin control expanders on I2C and SPI that are arch-agnostic.
          Currently Semtech SX150X and Microchip MCP28x08 but more are
          expected. Users will have to be able to configure these in
          directly for their set-up.

   - Just go and select GPIOLIB now that we made sure that GPIOLIB is a
     very vanilla subsystem. Do not depend on it, if we need it, select
     it.

   - Exposing the pin control subsystem in menuconfig uncovered a bunch
     of obscure bugs that are now hopefully fixed, all more or less
     pertaining to Blackfin.

   - Unified namespace for cross-calls between pin control and GPIO.

   - New support for clock skew/delay generic DT bindings and generic
     pin config options for this.

   - Minor documentation improvements.

  Various:

   - The Renesas SH-PFC pin controller has evolved a lot. It seems
     Renesas are churning out new SoCs by the minute.

   - A bunch of non-critical fixes for the Rockchip driver.

   - Improve the use of library functions instead of open coding.

   - Support the MCP28018 variant in the MCP28x08 driver.

   - Static constifying"

* tag 'pinctrl-v4.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (91 commits)
  pinctrl: gemini: Fix missing pad descriptions
  pinctrl: Add some depends on HAS_IOMEM
  pinctrl: samsung/s3c24xx: add CONFIG_OF dependency
  pinctrl: gemini: Fix GMAC groups
  pinctrl: qcom: spmi-gpio: Add pmi8994 gpio support
  pinctrl: ti-iodelay: remove redundant unused variable dev
  pinctrl: max77620: Use common error handling code in max77620_pinconf_set()
  pinctrl: gemini: Implement clock skew/delay config
  pinctrl: gemini: Use generic DT parser
  pinctrl: Add skew-delay pin config and bindings
  pinctrl: armada-37xx: Add edge both type gpio irq support
  pinctrl: uniphier: remove eMMC hardware reset pin-mux
  pinctrl: rockchip: Add iomux-route switching support for rk3288
  pinctrl: intel: Add Intel Cedar Fork PCH pin controller support
  pinctrl: intel: Make offset to interrupt status register configurable
  pinctrl: sunxi: Enforce the strict mode by default
  pinctrl: sunxi: Disable strict mode for old pinctrl drivers
  pinctrl: sunxi: Introduce the strict flag
  pinctrl: sh-pfc: Save/restore registers for PSCI system suspend
  pinctrl: sh-pfc: r8a7796: Use generic IOCTRL register description
  ...

96 files changed:
Documentation/devicetree/bindings/pinctrl/cortina,gemini-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt [moved from Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt with 66% similarity]
Documentation/devicetree/bindings/pinctrl/qcom,pmic-gpio.txt
Documentation/devicetree/bindings/pinctrl/renesas,rza1-pinctrl.txt
Documentation/driver-api/pinctl.rst
Documentation/gpio/gpio-legacy.txt
Documentation/translations/zh_CN/gpio.txt
MAINTAINERS
arch/blackfin/Kconfig
arch/blackfin/Kconfig.debug
arch/blackfin/include/asm/gpio.h
arch/blackfin/kernel/bfin_gpio.c
arch/blackfin/kernel/debug-mmrs.c
arch/blackfin/mach-common/ints-priority.c
arch/blackfin/mach-common/pm.c
drivers/gpio/Kconfig
drivers/gpio/gpio-aspeed.c
drivers/gpio/gpio-em.c
drivers/gpio/gpio-pxa.c
drivers/gpio/gpio-rcar.c
drivers/gpio/gpio-tegra.c
drivers/gpio/gpio-tz1090.c
drivers/gpio/gpiolib.c
drivers/pinctrl/Kconfig
drivers/pinctrl/bcm/pinctrl-iproc-gpio.c
drivers/pinctrl/bcm/pinctrl-nsp-gpio.c
drivers/pinctrl/core.c
drivers/pinctrl/core.h
drivers/pinctrl/intel/Kconfig
drivers/pinctrl/intel/Makefile
drivers/pinctrl/intel/pinctrl-cedarfork.c [new file with mode: 0644]
drivers/pinctrl/intel/pinctrl-cherryview.c
drivers/pinctrl/intel/pinctrl-intel.c
drivers/pinctrl/intel/pinctrl-intel.h
drivers/pinctrl/meson/Kconfig [new file with mode: 0644]
drivers/pinctrl/meson/Makefile
drivers/pinctrl/meson/pinctrl-meson-gxbb.c
drivers/pinctrl/meson/pinctrl-meson-gxl.c
drivers/pinctrl/meson/pinctrl-meson.c
drivers/pinctrl/meson/pinctrl-meson.h
drivers/pinctrl/meson/pinctrl-meson8-pmx.c [new file with mode: 0644]
drivers/pinctrl/meson/pinctrl-meson8-pmx.h [new file with mode: 0644]
drivers/pinctrl/meson/pinctrl-meson8.c
drivers/pinctrl/meson/pinctrl-meson8b.c
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
drivers/pinctrl/pinconf-generic.c
drivers/pinctrl/pinctrl-amd.c
drivers/pinctrl/pinctrl-gemini.c
drivers/pinctrl/pinctrl-ingenic.c
drivers/pinctrl/pinctrl-max77620.c
drivers/pinctrl/pinctrl-mcp23s08.c
drivers/pinctrl/pinctrl-rockchip.c
drivers/pinctrl/pinctrl-rza1.c
drivers/pinctrl/pinctrl-single.c
drivers/pinctrl/pinctrl-sx150x.c
drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
drivers/pinctrl/samsung/Kconfig
drivers/pinctrl/sh-pfc/core.c
drivers/pinctrl/sh-pfc/core.h
drivers/pinctrl/sh-pfc/gpio.c
drivers/pinctrl/sh-pfc/pfc-r8a7778.c
drivers/pinctrl/sh-pfc/pfc-r8a7794.c
drivers/pinctrl/sh-pfc/pfc-r8a7795-es1.c
drivers/pinctrl/sh-pfc/pfc-r8a7795.c
drivers/pinctrl/sh-pfc/pfc-r8a7796.c
drivers/pinctrl/sh-pfc/pfc-r8a77995.c
drivers/pinctrl/sh-pfc/pinctrl.c
drivers/pinctrl/sh-pfc/sh_pfc.h
drivers/pinctrl/sirf/pinctrl-atlas7.c
drivers/pinctrl/sirf/pinctrl-sirf.c
drivers/pinctrl/spear/pinctrl-plgpio.c
drivers/pinctrl/stm32/pinctrl-stm32.c
drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c
drivers/pinctrl/sunxi/pinctrl-sun5i.c
drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c
drivers/pinctrl/sunxi/pinctrl-sun6i-a31.c
drivers/pinctrl/sunxi/pinctrl-sun8i-a23-r.c
drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c
drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
drivers/pinctrl/sunxi/pinctrl-sun8i-h3-r.c
drivers/pinctrl/sunxi/pinctrl-sun8i-h3.c
drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c
drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c
drivers/pinctrl/sunxi/pinctrl-sunxi.c
drivers/pinctrl/sunxi/pinctrl-sunxi.h
drivers/pinctrl/ti/pinctrl-ti-iodelay.c
drivers/pinctrl/uniphier/pinctrl-uniphier-core.c
drivers/pinctrl/uniphier/pinctrl-uniphier-ld11.c
drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c
drivers/pinctrl/uniphier/pinctrl-uniphier-pxs3.c
include/dt-bindings/gpio/meson-gxbb-gpio.h
include/dt-bindings/gpio/meson-gxl-gpio.h
include/linux/pinctrl/consumer.h
include/linux/pinctrl/pinconf-generic.h

index 61466c58faae3b0ed384fe08cd7e1604fdd9f2e1..d857b67fab72a61fcf85b8eed6fd389883d4c097 100644 (file)
@@ -9,8 +9,14 @@ The pin controller node must be a subnode of the system controller node.
 Required properties:
 - compatible: "cortina,gemini-pinctrl"
 
-Subnodes of the pin controller contain pin control multiplexing set-up.
-Please refer to pinctrl-bindings.txt for generic pin multiplexing nodes.
+Subnodes of the pin controller contain pin control multiplexing set-up
+and pin configuration of individual pins.
+
+Please refer to pinctrl-bindings.txt for generic pin multiplexing nodes
+and generic pin config nodes.
+
+Supported configurations:
+- skew-delay is supported on the Ethernet pins
 
 Example:
 
index f64060908d5ae173e39ec3440f9bbdd3350065ef..c7c088d2dd503df005904b46a486d75e437e37e9 100644 (file)
@@ -97,8 +97,8 @@ group spi_quad
  - pins 15-16
  - functions spi, gpio
 
-group uart_2
- - pins 9-10
+group uart2
+ - pins 9-10 and 18-19
  - functions uart, gpio
 
 Available groups and functions for the South bridge:
index 4483cc31e5310a234a075d34b879f957596846fc..ad9bbbba36e9d529481f1d9b265b29dbf15d372c 100644 (file)
@@ -271,6 +271,10 @@ output-high                - set the pin to output mode with high level
 sleep-hardware-state   - indicate this is sleep related state which will be programmed
                          into the registers for the sleep state.
 slew-rate              - set the slew rate
+skew-delay             - this affects the expected clock skew on input pins
+                         and the delay before latching a value to an output
+                         pin. Typically indicates how many double-inverters are
+                         used to delay the signal.
 
 For example:
 
similarity index 66%
rename from Documentation/devicetree/bindings/gpio/gpio-mcp23s08.txt
rename to Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
index c934106b10aa2828baf2c71f42c080a02a0b122a..9c451c20dda47c390101024dc247b10f0d7f5c10 100644 (file)
@@ -13,6 +13,7 @@ Required properties:
     - "microchip,mcp23s18" for 16 GPIO SPI version
     - "microchip,mcp23008" for  8 GPIO I2C version or
     - "microchip,mcp23017" for 16 GPIO I2C version of the chip
+    - "microchip,mcp23018" for 16 GPIO I2C version
     NOTE: Do not use the old mcp prefix any more. It is deprecated and will be
     removed.
 - #gpio-cells : Should be two.
@@ -81,3 +82,61 @@ gpiom1: gpio@0 {
         reg = <0>;
         spi-max-frequency = <1000000>;
 };
+
+Pull-up configuration
+=====================
+
+If pins are used as output, they can also be configured with pull-ups. This is
+done with pinctrl.
+
+Please refer file <devicetree/bindings/pinctrl/pinctrl-bindings.txt>
+for details of the common pinctrl bindings used by client devices,
+including the meaning of the phrase "pin configuration node".
+
+Optional Pinmux properties:
+--------------------------
+Following properties are required if default setting of pins are required
+at boot.
+- pinctrl-names: A pinctrl state named per <pinctrl-binding.txt>.
+- pinctrl[0...n]: Properties to contain the phandle for pinctrl states per
+               <pinctrl-binding.txt>.
+
+The pin configurations are defined as child of the pinctrl states node. Each
+sub-node have following properties:
+
+Required properties:
+------------------
+- pins: List of pins. Valid values of pins properties are:
+                     gpio0 ... gpio7 for the devices with 8 GPIO pins and
+                     gpio0 ... gpio15 for the devices with 16 GPIO pins.
+
+Optional properties:
+-------------------
+The following optional property is defined in the pinmux DT binding document
+<pinctrl-bindings.txt>. Absence of this property will leave the configuration
+in its default state.
+       bias-pull-up
+
+Example with pinctrl to pull-up output pins:
+gpio21: gpio@21 {
+       compatible = "microchip,mcp23017";
+       gpio-controller;
+       #gpio-cells = <0x2>;
+       reg = <0x21>;
+       interrupt-parent = <&socgpio>;
+       interrupts = <0x17 0x8>;
+       interrupt-names = "mcp23017@21 irq";
+       interrupt-controller;
+       #interrupt-cells = <0x2>;
+       microchip,irq-mirror;
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2cgpio0irq &gpio21pullups>;
+
+       gpio21pullups: pinmux {
+               pins =  "gpio0", "gpio1", "gpio2", "gpio3",
+                       "gpio4", "gpio5", "gpio6", "gpio7",
+                       "gpio8", "gpio9", "gpio10", "gpio11",
+                       "gpio12", "gpio13", "gpio14", "gpio15";
+               bias-pull-up;
+       };
+};
index 5b12c57e7f022e58ba262191246f23b4852cc7df..5c25fcb29fb5e636685539d50133d14a7c6aebc2 100644 (file)
@@ -15,6 +15,7 @@ PMIC's from Qualcomm.
                    "qcom,pm8921-gpio"
                    "qcom,pm8941-gpio"
                    "qcom,pm8994-gpio"
+                   "qcom,pmi8994-gpio"
                    "qcom,pma8084-gpio"
                    "qcom,pmi8994-gpio"
 
@@ -85,6 +86,7 @@ to specify in a pin configuration subnode:
                    gpio1-gpio44 for pm8921
                    gpio1-gpio36 for pm8941
                    gpio1-gpio22 for pm8994
+                   gpio1-gpio10 for pmi8994
                    gpio1-gpio22 for pma8084
                    gpio1-gpio10 for pmi8994
 
index 43e21474528a4158f77f6b94bddfa57f1a1fa7f5..fd3696eb36bf307e00f061cc8f5329d2afa8594c 100644 (file)
@@ -12,8 +12,10 @@ Pin controller node
 -------------------
 
 Required properties:
-  - compatible
-    this shall be "renesas,r7s72100-ports".
+  - compatible: should be:
+    - "renesas,r7s72100-ports": for RZ/A1H
+    - "renesas,r7s72101-ports", "renesas,r7s72100-ports": for RZ/A1M
+    - "renesas,r7s72102-ports": for RZ/A1L
 
   - reg
     address base and length of the memory area where the pin controller
index 48f15b4f9d3e441da3dbd582e8dbd36fa2687bce..6cb68d67fa75a7cef5eab57125fccac3a86a0139 100644 (file)
@@ -757,8 +757,8 @@ that your datasheet calls "GPIO mode", but actually is just an electrical
 configuration for a certain device. See the section below named
 "GPIO mode pitfalls" for more details on this scenario.
 
-The public pinmux API contains two functions named pinctrl_request_gpio()
-and pinctrl_free_gpio(). These two functions shall *ONLY* be called from
+The public pinmux API contains two functions named pinctrl_gpio_request()
+and pinctrl_gpio_free(). These two functions shall *ONLY* be called from
 gpiolib-based drivers as part of their gpio_request() and
 gpio_free() semantics. Likewise the pinctrl_gpio_direction_[input|output]
 shall only be called from within respective gpio_direction_[input|output]
@@ -790,7 +790,7 @@ gpiolib driver and the affected GPIO range, pin offset and desired direction
 will be passed along to this function.
 
 Alternatively to using these special functions, it is fully allowed to use
-named functions for each GPIO pin, the pinctrl_request_gpio() will attempt to
+named functions for each GPIO pin, the pinctrl_gpio_request() will attempt to
 obtain the function "gpioN" where "N" is the global GPIO pin number if no
 special GPIO-handler is registered.
 
index 5eacc147ea870c80bb06c38d43bd5b662c171194..8356d0e78f679c66bc69af8420eac2c4ace27f41 100644 (file)
@@ -273,8 +273,8 @@ easily, gating off unused clocks.
 
 For GPIOs that use pins known to the pinctrl subsystem, that subsystem should
 be informed of their use; a gpiolib driver's .request() operation may call
-pinctrl_request_gpio(), and a gpiolib driver's .free() operation may call
-pinctrl_free_gpio(). The pinctrl subsystem allows a pinctrl_request_gpio()
+pinctrl_gpio_request(), and a gpiolib driver's .free() operation may call
+pinctrl_gpio_free(). The pinctrl subsystem allows a pinctrl_gpio_request()
 to succeed concurrently with a pin or pingroup being "owned" by a device for
 pin multiplexing.
 
@@ -448,8 +448,8 @@ together with an optional gpio feature. We have already covered the
 case where e.g. a GPIO controller need to reserve a pin or set the
 direction of a pin by calling any of:
 
-pinctrl_request_gpio()
-pinctrl_free_gpio()
+pinctrl_gpio_request()
+pinctrl_gpio_free()
 pinctrl_gpio_direction_input()
 pinctrl_gpio_direction_output()
 
@@ -466,7 +466,7 @@ gpio (under gpiolib) is still maintained by gpio drivers. It may happen
 that different pin ranges in a SoC is managed by different gpio drivers.
 
 This makes it logical to let gpio drivers announce their pin ranges to
-the pin ctrl subsystem before it will call 'pinctrl_request_gpio' in order
+the pin ctrl subsystem before it will call 'pinctrl_gpio_request' in order
 to request the corresponding pin to be prepared by the pinctrl subsystem
 before any gpio usage.
 
index bce9725210659de9a7c1d3c97cb9d8374dc0d581..4f8bf30a41dc59ea52b0a77d5816cb6b1716f105 100644 (file)
@@ -257,9 +257,9 @@ GPIO 值的命令需要等待其信息排到队首才发送命令,再获得其
 简单地关闭未使用时钟)。
 
 对于 GPIO 使用 pinctrl 子系统已知的引脚,子系统应该被告知其使用情况;
-一个 gpiolib 驱动的 .request()操作应调用 pinctrl_request_gpio(),
-而 gpiolib 驱动的 .free()操作应调用 pinctrl_free_gpio()。pinctrl
-子系统允许 pinctrl_request_gpio()在某个引脚或引脚组以复用形式“属于”
+一个 gpiolib 驱动的 .request()操作应调用 pinctrl_gpio_request(),
+而 gpiolib 驱动的 .free()操作应调用 pinctrl_gpio_free()。pinctrl
+子系统允许 pinctrl_gpio_request()在某个引脚或引脚组以复用形式“属于”
 一个设备时都成功返回。
 
 任何须将 GPIO 信号导向适当引脚的引脚复用硬件的编程应该发生在 GPIO
index fa9c49c594a1c5152a5d35a19204c29eee3b51a7..c8dfe6cdc4dd16d9f87b1d33f41071bda483fceb 100644 (file)
@@ -10713,6 +10713,7 @@ PIN CONTROLLER - RENESAS
 M:     Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 M:     Geert Uytterhoeven <geert+renesas@glider.be>
 L:     linux-renesas-soc@vger.kernel.org
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git sh-pfc
 S:     Maintained
 F:     drivers/pinctrl/sh-pfc/
 
index af5369422032b1b81d2304ca0dd5e3abd39ae924..d9c2866ba618cedee6676e63bdd194bc244621fd 100644 (file)
@@ -321,11 +321,14 @@ config BF53x
 
 config GPIO_ADI
        def_bool y
+       depends on !PINCTRL
        depends on (BF51x || BF52x || BF53x || BF538 || BF539 || BF561)
 
-config PINCTRL
+config PINCTRL_BLACKFIN_ADI2
        def_bool y
-       depends on BF54x || BF60x
+       depends on (BF54x || BF60x)
+       select PINCTRL
+       select PINCTRL_ADI2
 
 config MEM_MT48LC64M4A2FB_7E
        bool
index 4ddd1b73ee3e5e0bb962e3576f09fd9a79799b4e..c8d957274cc2026cda7b556ac870a79a5e89ca29 100644 (file)
@@ -18,6 +18,7 @@ config DEBUG_VERBOSE
 
 config DEBUG_MMRS
        tristate "Generate Blackfin MMR tree"
+       depends on !PINCTRL
        select DEBUG_FS
        help
          Create a tree of Blackfin MMRs via the debugfs tree.  If
index 99d338ca2ea420f5874e561fb96122271cf5e37d..a2579321c7f1c56baf98334fbfb7664f45d58d89 100644 (file)
@@ -183,6 +183,26 @@ static inline int irq_to_gpio(unsigned irq)
 {
        return irq - GPIO_IRQ_BASE;
 }
+
+#else /* CONFIG_PINCTRL */
+
+/*
+ * CONFIG_PM is not working with pin control and should probably
+ * avoid being selected when pin control is active, but so far,
+ * these stubs are here to make allyesconfig and allmodconfig
+ * compile properly. These functions are normally backed by the
+ * CONFIG_ADI_GPIO custom GPIO implementation.
+ */
+
+static inline int bfin_pm_standby_setup(void)
+{
+       return 0;
+}
+
+static inline void bfin_pm_standby_restore(void)
+{
+}
+
 #endif /* CONFIG_PINCTRL */
 
 #include <asm/irq.h>
index c5d31287de0153587e9c5cce99f59b7a5d82c0c0..63da80bbadf600d4359ea85afe8098a3c65c9798 100644 (file)
@@ -15,6 +15,9 @@
 /* FIXME: consumer API required for gpio_set_value() etc, get rid of this */
 #include <linux/gpio.h>
 #include <linux/irq.h>
+#include <asm/gpio.h>
+#include <asm/irq_handler.h>
+#include <asm/portmux.h>
 
 #if ANOMALY_05000311 || ANOMALY_05000323
 enum {
index f31ace221392c4d5c2006a1fa18b2f1271838eb3..194773ce109e28c52bd9d5b4ed041e502052ad14 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/fs.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/gpio.h>
 
 #include <asm/blackfin.h>
 #include <asm/gptimers.h>
@@ -20,6 +19,7 @@
 #include <asm/bfin_serial.h>
 #include <asm/bfin5xx_spi.h>
 #include <asm/bfin_twi.h>
+#include <asm/gpio.h>
 
 /* Common code defines PORT_MUX on us, so redirect the MMR back locally */
 #ifdef BFIN_PORT_MUX
index 13e94bf9d8ba5f95d1f89999712a98f26778f581..e81a5b7dabdc318fddb3555f2147284f3ddaf3a5 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/sched.h>
 #include <linux/sched/debug.h>
 #include <linux/syscore_ops.h>
-#include <linux/gpio.h>
 #include <asm/delay.h>
 #ifdef CONFIG_IPIPE
 #include <linux/ipipe.h>
@@ -28,6 +27,7 @@
 #include <asm/irq_handler.h>
 #include <asm/dpmc.h>
 #include <asm/traps.h>
+#include <asm/gpio.h>
 
 /*
  * NOTES:
index 5ece38a5b75803f7a898ec5a68026b4d453d2b8f..f57b5fe5355ebd56c0c72aff7b33420d7992077f 100644 (file)
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/delay.h>
-#include <linux/gpio.h>
 
 #include <asm/cplb.h>
 #include <asm/dma.h>
 #include <asm/dpmc.h>
 #include <asm/pm.h>
+#include <asm/gpio.h>
 
 #ifdef CONFIG_BF60x
 struct bfin_cpu_pm_fns *bfin_cpu_pm;
index 29fc154232995025cbed2dc5251029826600367a..d6a8e851ad13b8e6e5c0761474d26a8725770c83 100644 (file)
@@ -834,15 +834,6 @@ config GPIO_PCF857X
          This driver provides an in-kernel interface to those GPIOs using
          platform-neutral GPIO calls.
 
-config GPIO_SX150X
-       bool "Semtech SX150x I2C GPIO expander (deprecated)"
-       depends on PINCTRL && I2C=y
-       select PINCTRL_SX150X
-       default n
-       help
-         Say yes here to provide support for Semtech SX150x-series I2C
-         GPIO expanders. The GPIO driver was replaced by a Pinctrl version.
-
 config GPIO_TPIC2810
        tristate "TPIC2810 8-Bit I2C GPO expander"
        help
index 8781817d900366f99c29418c0f2631568d2f3fe6..6b3ca6601af2dd8b1a38fa688e913726873fe82d 100644 (file)
@@ -539,12 +539,12 @@ static int aspeed_gpio_request(struct gpio_chip *chip, unsigned int offset)
        if (!have_gpio(gpiochip_get_data(chip), offset))
                return -ENODEV;
 
-       return pinctrl_request_gpio(chip->base + offset);
+       return pinctrl_gpio_request(chip->base + offset);
 }
 
 static void aspeed_gpio_free(struct gpio_chip *chip, unsigned int offset)
 {
-       pinctrl_free_gpio(chip->base + offset);
+       pinctrl_gpio_free(chip->base + offset);
 }
 
 static inline void __iomem *bank_debounce_reg(struct aspeed_gpio *gpio,
index 8d32ccc980d9ecf963a0cd2ef91b4dd5f5debc7d..b86e09e1b13b64c8ee3ac750cda326b3ea290be0 100644 (file)
@@ -239,12 +239,12 @@ static int em_gio_to_irq(struct gpio_chip *chip, unsigned offset)
 
 static int em_gio_request(struct gpio_chip *chip, unsigned offset)
 {
-       return pinctrl_request_gpio(chip->base + offset);
+       return pinctrl_gpio_request(chip->base + offset);
 }
 
 static void em_gio_free(struct gpio_chip *chip, unsigned offset)
 {
-       pinctrl_free_gpio(chip->base + offset);
+       pinctrl_gpio_free(chip->base + offset);
 
        /* Set the GPIO as an input to ensure that the next GPIO request won't
        * drive the GPIO pin as an output.
index 6029899789f3dbcfa51e2227d6b94a115bf0a3e5..f480fb896963a784ec6bb9b1adf545095746b9ad 100644 (file)
@@ -330,16 +330,6 @@ static int pxa_gpio_of_xlate(struct gpio_chip *gc,
 }
 #endif
 
-static int pxa_gpio_request(struct gpio_chip *chip, unsigned int offset)
-{
-       return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void pxa_gpio_free(struct gpio_chip *chip, unsigned int offset)
-{
-       pinctrl_free_gpio(chip->base + offset);
-}
-
 static int pxa_init_gpio_chip(struct pxa_gpio_chip *pchip, int ngpio,
                              struct device_node *np, void __iomem *regbase)
 {
@@ -358,8 +348,8 @@ static int pxa_init_gpio_chip(struct pxa_gpio_chip *pchip, int ngpio,
        pchip->chip.set = pxa_gpio_set;
        pchip->chip.to_irq = pxa_gpio_to_irq;
        pchip->chip.ngpio = ngpio;
-       pchip->chip.request = pxa_gpio_request;
-       pchip->chip.free = pxa_gpio_free;
+       pchip->chip.request = gpiochip_generic_request;
+       pchip->chip.free = gpiochip_generic_free;
 #ifdef CONFIG_OF_GPIO
        pchip->chip.of_node = np;
        pchip->chip.of_xlate = pxa_gpio_of_xlate;
index 0ea998a3e357bf74a9e33ea54b5ba4e6759ebd09..e76de57dd617d7e2c918c057dcc0ced6636be7b2 100644 (file)
@@ -250,7 +250,7 @@ static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset)
        if (error < 0)
                return error;
 
-       error = pinctrl_request_gpio(chip->base + offset);
+       error = pinctrl_gpio_request(chip->base + offset);
        if (error)
                pm_runtime_put(&p->pdev->dev);
 
@@ -261,7 +261,7 @@ static void gpio_rcar_free(struct gpio_chip *chip, unsigned offset)
 {
        struct gpio_rcar_priv *p = gpiochip_get_data(chip);
 
-       pinctrl_free_gpio(chip->base + offset);
+       pinctrl_gpio_free(chip->base + offset);
 
        /*
         * Set the GPIO as an input to ensure that the next GPIO request won't
index fbaf974277dffd9c90e57f03037a4b3fe8fa6da5..8db47f671708752dbaae420478935f1613847dd3 100644 (file)
@@ -141,14 +141,14 @@ static void tegra_gpio_disable(struct tegra_gpio_info *tgi, unsigned int gpio)
 
 static int tegra_gpio_request(struct gpio_chip *chip, unsigned int offset)
 {
-       return pinctrl_request_gpio(offset);
+       return pinctrl_gpio_request(offset);
 }
 
 static void tegra_gpio_free(struct gpio_chip *chip, unsigned int offset)
 {
        struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
 
-       pinctrl_free_gpio(offset);
+       pinctrl_gpio_free(offset);
        tegra_gpio_disable(tgi, offset);
 }
 
index 22c5be65051f2a15cefdb4a8601d5f2ace9ff9ad..0bb9bb58388992967671e5487acd44c626b5d62c 100644 (file)
@@ -232,7 +232,7 @@ static int tz1090_gpio_request(struct gpio_chip *chip, unsigned int offset)
        struct tz1090_gpio_bank *bank = gpiochip_get_data(chip);
        int ret;
 
-       ret = pinctrl_request_gpio(chip->base + offset);
+       ret = pinctrl_gpio_request(chip->base + offset);
        if (ret)
                return ret;
 
@@ -246,7 +246,7 @@ static void tz1090_gpio_free(struct gpio_chip *chip, unsigned int offset)
 {
        struct tz1090_gpio_bank *bank = gpiochip_get_data(chip);
 
-       pinctrl_free_gpio(chip->base + offset);
+       pinctrl_gpio_free(chip->base + offset);
 
        tz1090_gpio_clear_bit(bank, REG_GPIO_BIT_EN, offset);
 }
index 641a5eb552cbe02706fd1f828d773f9a818f2b37..aad84a6306c4e5ddbc3364d58add85fa1b1e2583 100644 (file)
@@ -1962,7 +1962,7 @@ static inline void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gpiochip)
  */
 int gpiochip_generic_request(struct gpio_chip *chip, unsigned offset)
 {
-       return pinctrl_request_gpio(chip->gpiodev->base + offset);
+       return pinctrl_gpio_request(chip->gpiodev->base + offset);
 }
 EXPORT_SYMBOL_GPL(gpiochip_generic_request);
 
@@ -1973,7 +1973,7 @@ EXPORT_SYMBOL_GPL(gpiochip_generic_request);
  */
 void gpiochip_generic_free(struct gpio_chip *chip, unsigned offset)
 {
-       pinctrl_free_gpio(chip->gpiodev->base + offset);
+       pinctrl_gpio_free(chip->gpiodev->base + offset);
 }
 EXPORT_SYMBOL_GPL(gpiochip_generic_free);
 
index 82cd8b08d71f5247c0595d1ba2be199e4fe6ecec..4571cc098b7628961c6b27682e1fdf238a8bcb82 100644 (file)
@@ -2,11 +2,10 @@
 # PINCTRL infrastructure and drivers
 #
 
-config PINCTRL
-       bool
+menuconfig PINCTRL
+       bool "Pin controllers"
 
-menu "Pin controllers"
-       depends on PINCTRL
+if PINCTRL
 
 config GENERIC_PINCTRL_GROUPS
        bool
@@ -33,7 +32,8 @@ config DEBUG_PINCTRL
 
 config PINCTRL_ADI2
        bool "ADI pin controller driver"
-       depends on BLACKFIN
+       depends on (BF54x || BF60x)
+       depends on !GPIO_ADI
        select PINMUX
        select IRQ_DOMAIN
        help
@@ -98,7 +98,8 @@ config PINCTRL_AT91PIO4
 
 config PINCTRL_AMD
        tristate "AMD GPIO pin control"
-       depends on GPIOLIB
+       depends on HAS_IOMEM
+       select GPIOLIB
        select GPIOLIB_IRQCHIP
        select PINMUX
        select PINCONF
@@ -152,12 +153,14 @@ config PINCTRL_GEMINI
        depends on ARCH_GEMINI
        default ARCH_GEMINI
        select PINMUX
+       select GENERIC_PINCONF
        select MFD_SYSCON
 
 config PINCTRL_MCP23S08
        tristate "Microchip MCP23xxx I/O expander"
        depends on SPI_MASTER || I2C
        depends on I2C || I2C=n
+       select GPIOLIB
        select GPIOLIB_IRQCHIP
        select REGMAP_I2C if I2C
        select REGMAP_SPI if SPI_MASTER
@@ -168,16 +171,6 @@ config PINCTRL_MCP23S08
          This provides a GPIO interface supporting inputs and outputs.
          The I2C versions of the chips can be used as interrupt-controller.
 
-config PINCTRL_MESON
-       bool
-       depends on OF
-       select PINMUX
-       select PINCONF
-       select GENERIC_PINCONF
-       select GPIOLIB
-       select OF_GPIO
-       select REGMAP_MMIO
-
 config PINCTRL_OXNAS
        bool
        depends on OF
@@ -210,6 +203,7 @@ config PINCTRL_RZA1
 config PINCTRL_SINGLE
        tristate "One-register-per-pin type device tree based pinctrl driver"
        depends on OF
+       depends on HAS_IOMEM
        select GENERIC_PINCTRL_GROUPS
        select GENERIC_PINMUX_FUNCTIONS
        select GENERIC_PINCONF
@@ -226,10 +220,11 @@ config PINCTRL_SIRF
 
 config PINCTRL_SX150X
        bool "Semtech SX150x I2C GPIO expander pinctrl driver"
-       depends on GPIOLIB && I2C=y
+       depends on I2C=y
        select PINMUX
        select PINCONF
        select GENERIC_PINCONF
+       select GPIOLIB
        select GPIOLIB_IRQCHIP
        select REGMAP
        help
@@ -369,6 +364,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
 source "drivers/pinctrl/vt8500/Kconfig"
 source "drivers/pinctrl/mediatek/Kconfig"
 source "drivers/pinctrl/zte/Kconfig"
+source "drivers/pinctrl/meson/Kconfig"
 
 config PINCTRL_XWAY
        bool
@@ -380,4 +376,4 @@ config PINCTRL_TB10X
        depends on OF && ARC_PLAT_TB10X
        select GPIOLIB
 
-endmenu
+endif
index b93f62dc87333f242489e591cb721eac7fe8a011..b70058caee5049845633717ba6d54fdb892ef56b 100644 (file)
@@ -311,7 +311,7 @@ static int iproc_gpio_request(struct gpio_chip *gc, unsigned offset)
        if (!chip->pinmux_is_supported)
                return 0;
 
-       return pinctrl_request_gpio(gpio);
+       return pinctrl_gpio_request(gpio);
 }
 
 static void iproc_gpio_free(struct gpio_chip *gc, unsigned offset)
@@ -322,7 +322,7 @@ static void iproc_gpio_free(struct gpio_chip *gc, unsigned offset)
        if (!chip->pinmux_is_supported)
                return;
 
-       pinctrl_free_gpio(gpio);
+       pinctrl_gpio_free(gpio);
 }
 
 static int iproc_gpio_direction_input(struct gpio_chip *gc, unsigned gpio)
index 1cfe45fd391f495df80818a7d7ae09e80ed757b9..e67ae52023adfdb88d422b7a27b1e5ca28967ab8 100644 (file)
@@ -275,23 +275,6 @@ static struct irq_chip nsp_gpio_irq_chip = {
        .irq_set_type = nsp_gpio_irq_set_type,
 };
 
-/*
- * Request the nsp IOMUX pinmux controller to mux individual pins to GPIO
- */
-static int nsp_gpio_request(struct gpio_chip *gc, unsigned offset)
-{
-       unsigned gpio = gc->base + offset;
-
-       return pinctrl_request_gpio(gpio);
-}
-
-static void nsp_gpio_free(struct gpio_chip *gc, unsigned offset)
-{
-       unsigned gpio = gc->base + offset;
-
-       pinctrl_free_gpio(gpio);
-}
-
 static int nsp_gpio_direction_input(struct gpio_chip *gc, unsigned gpio)
 {
        struct nsp_gpio *chip = gpiochip_get_data(gc);
@@ -670,8 +653,8 @@ static int nsp_gpio_probe(struct platform_device *pdev)
        gc->label = dev_name(dev);
        gc->parent = dev;
        gc->of_node = dev->of_node;
-       gc->request = nsp_gpio_request;
-       gc->free = nsp_gpio_free;
+       gc->request = gpiochip_generic_request;
+       gc->free = gpiochip_generic_free;
        gc->direction_input = nsp_gpio_direction_input;
        gc->direction_output = nsp_gpio_direction_output;
        gc->set = nsp_gpio_set;
index 56fbe4c3e800ef78287d6bbc8433ec6724865654..4c8d5b23e4d046a9931c6a09a6628c4b367512e8 100644 (file)
@@ -733,14 +733,14 @@ int pinctrl_get_group_selector(struct pinctrl_dev *pctldev,
 }
 
 /**
- * pinctrl_request_gpio() - request a single pin to be used as GPIO
+ * pinctrl_gpio_request() - request a single pin to be used as GPIO
  * @gpio: the GPIO pin number from the GPIO subsystem number space
  *
  * This function should *ONLY* be used from gpiolib-based GPIO drivers,
  * as part of their gpio_request() semantics, platforms and individual drivers
  * shall *NOT* request GPIO pins to be muxed in.
  */
-int pinctrl_request_gpio(unsigned gpio)
+int pinctrl_gpio_request(unsigned gpio)
 {
        struct pinctrl_dev *pctldev;
        struct pinctrl_gpio_range *range;
@@ -765,17 +765,17 @@ int pinctrl_request_gpio(unsigned gpio)
 
        return ret;
 }
-EXPORT_SYMBOL_GPL(pinctrl_request_gpio);
+EXPORT_SYMBOL_GPL(pinctrl_gpio_request);
 
 /**
- * pinctrl_free_gpio() - free control on a single pin, currently used as GPIO
+ * pinctrl_gpio_free() - free control on a single pin, currently used as GPIO
  * @gpio: the GPIO pin number from the GPIO subsystem number space
  *
  * This function should *ONLY* be used from gpiolib-based GPIO drivers,
  * as part of their gpio_free() semantics, platforms and individual drivers
  * shall *NOT* request GPIO pins to be muxed out.
  */
-void pinctrl_free_gpio(unsigned gpio)
+void pinctrl_gpio_free(unsigned gpio)
 {
        struct pinctrl_dev *pctldev;
        struct pinctrl_gpio_range *range;
@@ -795,7 +795,7 @@ void pinctrl_free_gpio(unsigned gpio)
 
        mutex_unlock(&pctldev->mutex);
 }
-EXPORT_SYMBOL_GPL(pinctrl_free_gpio);
+EXPORT_SYMBOL_GPL(pinctrl_gpio_free);
 
 static int pinctrl_gpio_direction(unsigned gpio, bool input)
 {
index 7880c3adc450226d193bb9c7f00c363a2b04e704..8cf2eba17c8c9628ea99111dcd4969eafc745788 100644 (file)
@@ -154,7 +154,7 @@ struct pinctrl_setting {
  *     or pin, and each of these will increment the @usecount.
  * @mux_owner: The name of device that called pinctrl_get().
  * @mux_setting: The most recent selected mux setting for this pin, if any.
- * @gpio_owner: If pinctrl_request_gpio() was called for this pin, this is
+ * @gpio_owner: If pinctrl_gpio_request() was called for this pin, this is
  *     the name of the GPIO that "owns" this pin.
  */
 struct pin_desc {
index f30720a752f34b341c8c43359315a47385eb8ae0..4aea1b8504f7a0a385987df049be0e9a57535b15 100644 (file)
@@ -5,7 +5,8 @@ if (X86 || COMPILE_TEST)
 
 config PINCTRL_BAYTRAIL
        bool "Intel Baytrail GPIO pin control"
-       depends on GPIOLIB && ACPI
+       depends on ACPI
+       select GPIOLIB
        select GPIOLIB_IRQCHIP
        select PINMUX
        select PINCONF
@@ -65,6 +66,14 @@ config PINCTRL_CANNONLAKE
          This pinctrl driver provides an interface that allows configuring
          of Intel Cannon Lake PCH pins and using them as GPIOs.
 
+config PINCTRL_CEDARFORK
+       tristate "Intel Cedar Fork pinctrl and GPIO driver"
+       depends on ACPI
+       select PINCTRL_INTEL
+       help
+         This pinctrl driver provides an interface that allows configuring
+         of Intel Cedar Fork PCH pins and using them as GPIOs.
+
 config PINCTRL_DENVERTON
        tristate "Intel Denverton pinctrl and GPIO driver"
        depends on ACPI
index 624d367caa09d0caa77bf873246f8fbcb2795bd9..fadfe3ea2b048aa9a9f2d19d72235e6b32ad1069 100644 (file)
@@ -7,6 +7,7 @@ obj-$(CONFIG_PINCTRL_MERRIFIELD)        += pinctrl-merrifield.o
 obj-$(CONFIG_PINCTRL_INTEL)            += pinctrl-intel.o
 obj-$(CONFIG_PINCTRL_BROXTON)          += pinctrl-broxton.o
 obj-$(CONFIG_PINCTRL_CANNONLAKE)       += pinctrl-cannonlake.o
+obj-$(CONFIG_PINCTRL_CEDARFORK)                += pinctrl-cedarfork.o
 obj-$(CONFIG_PINCTRL_DENVERTON)                += pinctrl-denverton.o
 obj-$(CONFIG_PINCTRL_GEMINILAKE)       += pinctrl-geminilake.o
 obj-$(CONFIG_PINCTRL_LEWISBURG)                += pinctrl-lewisburg.o
diff --git a/drivers/pinctrl/intel/pinctrl-cedarfork.c b/drivers/pinctrl/intel/pinctrl-cedarfork.c
new file mode 100644 (file)
index 0000000..59216b0
--- /dev/null
@@ -0,0 +1,375 @@
+/*
+ * Intel Cedar Fork PCH pinctrl/GPIO driver
+ *
+ * Copyright (C) 2017, Intel Corporation
+ * Author: Mika Westerberg <mika.westerberg@linux.intel.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.
+ */
+
+#include <linux/acpi.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-intel.h"
+
+#define CDF_PAD_OWN    0x020
+#define CDF_PADCFGLOCK 0x0c0
+#define CDF_HOSTSW_OWN 0x120
+#define CDF_GPI_IS     0x200
+#define CDF_GPI_IE     0x230
+
+#define CDF_GPP(r, s, e)                               \
+       {                                               \
+               .reg_num = (r),                         \
+               .base = (s),                            \
+               .size = ((e) - (s) + 1),                \
+       }
+
+#define CDF_COMMUNITY(b, s, e, g)                      \
+       {                                               \
+               .barno = (b),                           \
+               .padown_offset = CDF_PAD_OWN,           \
+               .padcfglock_offset = CDF_PADCFGLOCK,    \
+               .hostown_offset = CDF_HOSTSW_OWN,       \
+               .is_offset = CDF_GPI_IS,                \
+               .ie_offset = CDF_GPI_IE,                \
+               .pin_base = (s),                        \
+               .npins = ((e) - (s) + 1),               \
+               .gpps = (g),                            \
+               .ngpps = ARRAY_SIZE(g),                 \
+       }
+
+/* Cedar Fork PCH */
+static const struct pinctrl_pin_desc cdf_pins[] = {
+       /* WEST2 */
+       PINCTRL_PIN(0, "GBE_SDP_TIMESYNC0_S2N"),
+       PINCTRL_PIN(1, "GBE_SDP_TIMESYNC1_S2N"),
+       PINCTRL_PIN(2, "GBE_SDP_TIMESYNC2_S2N"),
+       PINCTRL_PIN(3, "GBE_SDP_TIMESYNC3_S2N"),
+       PINCTRL_PIN(4, "GBE0_I2C_CLK"),
+       PINCTRL_PIN(5, "GBE0_I2C_DATA"),
+       PINCTRL_PIN(6, "GBE1_I2C_CLK"),
+       PINCTRL_PIN(7, "GBE1_I2C_DATA"),
+       PINCTRL_PIN(8, "GBE2_I2C_CLK"),
+       PINCTRL_PIN(9, "GBE2_I2C_DATA"),
+       PINCTRL_PIN(10, "GBE3_I2C_CLK"),
+       PINCTRL_PIN(11, "GBE3_I2C_DATA"),
+       PINCTRL_PIN(12, "GBE0_LED0"),
+       PINCTRL_PIN(13, "GBE0_LED1"),
+       PINCTRL_PIN(14, "GBE0_LED2"),
+       PINCTRL_PIN(15, "GBE1_LED0"),
+       PINCTRL_PIN(16, "GBE1_LED1"),
+       PINCTRL_PIN(17, "GBE1_LED2"),
+       PINCTRL_PIN(18, "GBE2_LED0"),
+       PINCTRL_PIN(19, "GBE2_LED1"),
+       PINCTRL_PIN(20, "GBE2_LED2"),
+       PINCTRL_PIN(21, "GBE3_LED0"),
+       PINCTRL_PIN(22, "GBE3_LED1"),
+       PINCTRL_PIN(23, "GBE3_LED2"),
+       /* WEST3 */
+       PINCTRL_PIN(24, "NCSI_RXD0"),
+       PINCTRL_PIN(25, "NCSI_CLK_IN"),
+       PINCTRL_PIN(26, "NCSI_RXD1"),
+       PINCTRL_PIN(27, "NCSI_CRS_DV"),
+       PINCTRL_PIN(28, "NCSI_ARB_IN"),
+       PINCTRL_PIN(29, "NCSI_TX_EN"),
+       PINCTRL_PIN(30, "NCSI_TXD0"),
+       PINCTRL_PIN(31, "NCSI_TXD1"),
+       PINCTRL_PIN(32, "NCSI_ARB_OUT"),
+       PINCTRL_PIN(33, "GBE_SMB_CLK"),
+       PINCTRL_PIN(34, "GBE_SMB_DATA"),
+       PINCTRL_PIN(35, "GBE_SMB_ALRT_N"),
+       PINCTRL_PIN(36, "THERMTRIP_N"),
+       PINCTRL_PIN(37, "PCHHOT_N"),
+       PINCTRL_PIN(38, "ERROR0_N"),
+       PINCTRL_PIN(39, "ERROR1_N"),
+       PINCTRL_PIN(40, "ERROR2_N"),
+       PINCTRL_PIN(41, "MSMI_N"),
+       PINCTRL_PIN(42, "CATERR_N"),
+       PINCTRL_PIN(43, "MEMTRIP_N"),
+       PINCTRL_PIN(44, "UART0_RXD"),
+       PINCTRL_PIN(45, "UART0_TXD"),
+       PINCTRL_PIN(46, "UART1_RXD"),
+       PINCTRL_PIN(47, "UART1_TXD"),
+       /* WEST01 */
+       PINCTRL_PIN(48, "GBE_GPIO13"),
+       PINCTRL_PIN(49, "AUX_PWR"),
+       PINCTRL_PIN(50, "CPU_GP_2"),
+       PINCTRL_PIN(51, "CPU_GP_3"),
+       PINCTRL_PIN(52, "FAN_PWM_0"),
+       PINCTRL_PIN(53, "FAN_PWM_1"),
+       PINCTRL_PIN(54, "FAN_PWM_2"),
+       PINCTRL_PIN(55, "FAN_PWM_3"),
+       PINCTRL_PIN(56, "FAN_TACH_0"),
+       PINCTRL_PIN(57, "FAN_TACH_1"),
+       PINCTRL_PIN(58, "FAN_TACH_2"),
+       PINCTRL_PIN(59, "FAN_TACH_3"),
+       PINCTRL_PIN(60, "ME_SMB0_CLK"),
+       PINCTRL_PIN(61, "ME_SMB0_DATA"),
+       PINCTRL_PIN(62, "ME_SMB0_ALRT_N"),
+       PINCTRL_PIN(63, "ME_SMB1_CLK"),
+       PINCTRL_PIN(64, "ME_SMB1_DATA"),
+       PINCTRL_PIN(65, "ME_SMB1_ALRT_N"),
+       PINCTRL_PIN(66, "ME_SMB2_CLK"),
+       PINCTRL_PIN(67, "ME_SMB2_DATA"),
+       PINCTRL_PIN(68, "ME_SMB2_ALRT_N"),
+       PINCTRL_PIN(69, "GBE_MNG_I2C_CLK"),
+       PINCTRL_PIN(70, "GBE_MNG_I2C_DATA"),
+       /* WEST5 */
+       PINCTRL_PIN(71, "IE_UART_RXD"),
+       PINCTRL_PIN(72, "IE_UART_TXD"),
+       PINCTRL_PIN(73, "VPP_SMB_CLK"),
+       PINCTRL_PIN(74, "VPP_SMB_DATA"),
+       PINCTRL_PIN(75, "VPP_SMB_ALRT_N"),
+       PINCTRL_PIN(76, "PCIE_CLKREQ0_N"),
+       PINCTRL_PIN(77, "PCIE_CLKREQ1_N"),
+       PINCTRL_PIN(78, "PCIE_CLKREQ2_N"),
+       PINCTRL_PIN(79, "PCIE_CLKREQ3_N"),
+       PINCTRL_PIN(80, "PCIE_CLKREQ4_N"),
+       PINCTRL_PIN(81, "PCIE_CLKREQ5_N"),
+       PINCTRL_PIN(82, "PCIE_CLKREQ6_N"),
+       PINCTRL_PIN(83, "PCIE_CLKREQ7_N"),
+       PINCTRL_PIN(84, "PCIE_CLKREQ8_N"),
+       PINCTRL_PIN(85, "PCIE_CLKREQ9_N"),
+       PINCTRL_PIN(86, "FLEX_CLK_SE0"),
+       PINCTRL_PIN(87, "FLEX_CLK_SE1"),
+       PINCTRL_PIN(88, "FLEX_CLK1_50"),
+       PINCTRL_PIN(89, "FLEX_CLK2_50"),
+       PINCTRL_PIN(90, "FLEX_CLK_125"),
+       /* WESTC */
+       PINCTRL_PIN(91, "TCK_PCH"),
+       PINCTRL_PIN(92, "JTAGX_PCH"),
+       PINCTRL_PIN(93, "TRST_N_PCH"),
+       PINCTRL_PIN(94, "TMS_PCH"),
+       PINCTRL_PIN(95, "TDI_PCH"),
+       PINCTRL_PIN(96, "TDO_PCH"),
+       /* WESTC_DFX */
+       PINCTRL_PIN(97, "CX_PRDY_N"),
+       PINCTRL_PIN(98, "CX_PREQ_N"),
+       PINCTRL_PIN(99, "CPU_FBREAK_OUT_N"),
+       PINCTRL_PIN(100, "TRIGGER0_N"),
+       PINCTRL_PIN(101, "TRIGGER1_N"),
+       /* WESTA */
+       PINCTRL_PIN(102, "DBG_PTI_CLK0"),
+       PINCTRL_PIN(103, "DBG_PTI_CLK3"),
+       PINCTRL_PIN(104, "DBG_PTI_DATA0"),
+       PINCTRL_PIN(105, "DBG_PTI_DATA1"),
+       PINCTRL_PIN(106, "DBG_PTI_DATA2"),
+       PINCTRL_PIN(107, "DBG_PTI_DATA3"),
+       PINCTRL_PIN(108, "DBG_PTI_DATA4"),
+       PINCTRL_PIN(109, "DBG_PTI_DATA5"),
+       PINCTRL_PIN(110, "DBG_PTI_DATA6"),
+       PINCTRL_PIN(111, "DBG_PTI_DATA7"),
+       /* WESTB */
+       PINCTRL_PIN(112, "DBG_PTI_DATA8"),
+       PINCTRL_PIN(113, "DBG_PTI_DATA9"),
+       PINCTRL_PIN(114, "DBG_PTI_DATA10"),
+       PINCTRL_PIN(115, "DBG_PTI_DATA11"),
+       PINCTRL_PIN(116, "DBG_PTI_DATA12"),
+       PINCTRL_PIN(117, "DBG_PTI_DATA13"),
+       PINCTRL_PIN(118, "DBG_PTI_DATA14"),
+       PINCTRL_PIN(119, "DBG_PTI_DATA15"),
+       PINCTRL_PIN(120, "DBG_SPARE0"),
+       PINCTRL_PIN(121, "DBG_SPARE1"),
+       PINCTRL_PIN(122, "DBG_SPARE2"),
+       PINCTRL_PIN(123, "DBG_SPARE3"),
+       /* WESTD */
+       PINCTRL_PIN(124, "CPU_PWR_GOOD"),
+       PINCTRL_PIN(125, "PLTRST_CPU_N"),
+       PINCTRL_PIN(126, "NAC_RESET_NAC_N"),
+       PINCTRL_PIN(127, "PCH_SBLINK_RX"),
+       PINCTRL_PIN(128, "PCH_SBLINK_TX"),
+       PINCTRL_PIN(129, "PMSYNC_CLK"),
+       PINCTRL_PIN(130, "CPU_ERR0_N"),
+       PINCTRL_PIN(131, "CPU_ERR1_N"),
+       PINCTRL_PIN(132, "CPU_ERR2_N"),
+       PINCTRL_PIN(133, "CPU_THERMTRIP_N"),
+       PINCTRL_PIN(134, "CPU_MSMI_N"),
+       PINCTRL_PIN(135, "CPU_CATERR_N"),
+       PINCTRL_PIN(136, "CPU_MEMTRIP_N"),
+       PINCTRL_PIN(137, "NAC_GR_N"),
+       PINCTRL_PIN(138, "NAC_XTAL_VALID"),
+       PINCTRL_PIN(139, "NAC_WAKE_N"),
+       PINCTRL_PIN(140, "NAC_SBLINK_CLK_S2N"),
+       PINCTRL_PIN(141, "NAC_SBLINK_N2S"),
+       PINCTRL_PIN(142, "NAC_SBLINK_S2N"),
+       PINCTRL_PIN(143, "NAC_SBLINK_CLK_N2S"),
+       /* WESTD_PECI */
+       PINCTRL_PIN(144, "ME_PECI"),
+       /* WESTF */
+       PINCTRL_PIN(145, "NAC_RMII_CLK"),
+       PINCTRL_PIN(146, "NAC_RGMII_CLK"),
+       PINCTRL_PIN(147, "NAC_SPARE0"),
+       PINCTRL_PIN(148, "NAC_SPARE1"),
+       PINCTRL_PIN(149, "NAC_SPARE2"),
+       PINCTRL_PIN(150, "NAC_INIT_SX_WAKE_N"),
+       PINCTRL_PIN(151, "NAC_GBE_GPIO0_S2N"),
+       PINCTRL_PIN(152, "NAC_GBE_GPIO1_S2N"),
+       PINCTRL_PIN(153, "NAC_GBE_GPIO2_S2N"),
+       PINCTRL_PIN(154, "NAC_GBE_GPIO3_S2N"),
+       PINCTRL_PIN(155, "NAC_NCSI_RXD0"),
+       PINCTRL_PIN(156, "NAC_NCSI_CLK_IN"),
+       PINCTRL_PIN(157, "NAC_NCSI_RXD1"),
+       PINCTRL_PIN(158, "NAC_NCSI_CRS_DV"),
+       PINCTRL_PIN(159, "NAC_NCSI_ARB_IN"),
+       PINCTRL_PIN(160, "NAC_NCSI_TX_EN"),
+       PINCTRL_PIN(161, "NAC_NCSI_TXD0"),
+       PINCTRL_PIN(162, "NAC_NCSI_TXD1"),
+       PINCTRL_PIN(163, "NAC_NCSI_ARB_OUT"),
+       PINCTRL_PIN(164, "NAC_NCSI_OE_N"),
+       PINCTRL_PIN(165, "NAC_GBE_SMB_CLK"),
+       PINCTRL_PIN(166, "NAC_GBE_SMB_DATA"),
+       PINCTRL_PIN(167, "NAC_GBE_SMB_ALRT_N"),
+       /* EAST2 */
+       PINCTRL_PIN(168, "USB_OC0_N"),
+       PINCTRL_PIN(169, "GBE_GPIO0"),
+       PINCTRL_PIN(170, "GBE_GPIO1"),
+       PINCTRL_PIN(171, "GBE_GPIO2"),
+       PINCTRL_PIN(172, "GBE_GPIO3"),
+       PINCTRL_PIN(173, "GBE_GPIO4"),
+       PINCTRL_PIN(174, "GBE_GPIO5"),
+       PINCTRL_PIN(175, "GBE_GPIO6"),
+       PINCTRL_PIN(176, "GBE_GPIO7"),
+       PINCTRL_PIN(177, "GBE_GPIO8"),
+       PINCTRL_PIN(178, "GBE_GPIO9"),
+       PINCTRL_PIN(179, "GBE_GPIO10"),
+       PINCTRL_PIN(180, "GBE_GPIO11"),
+       PINCTRL_PIN(181, "GBE_GPIO12"),
+       PINCTRL_PIN(182, "SATA0_LED_N"),
+       PINCTRL_PIN(183, "SATA1_LED_N"),
+       PINCTRL_PIN(184, "SATA_PDETECT0"),
+       PINCTRL_PIN(185, "SATA_PDETECT1"),
+       PINCTRL_PIN(186, "SATA0_SDOUT"),
+       PINCTRL_PIN(187, "SATA1_SDOUT"),
+       PINCTRL_PIN(188, "SATA2_LED_N"),
+       PINCTRL_PIN(189, "SATA_PDETECT2"),
+       PINCTRL_PIN(190, "SATA2_SDOUT"),
+       /* EAST3 */
+       PINCTRL_PIN(191, "ESPI_IO0"),
+       PINCTRL_PIN(192, "ESPI_IO1"),
+       PINCTRL_PIN(193, "ESPI_IO2"),
+       PINCTRL_PIN(194, "ESPI_IO3"),
+       PINCTRL_PIN(195, "ESPI_CLK"),
+       PINCTRL_PIN(196, "ESPI_RST_N"),
+       PINCTRL_PIN(197, "ESPI_CS0_N"),
+       PINCTRL_PIN(198, "ESPI_ALRT0_N"),
+       PINCTRL_PIN(199, "ESPI_CS1_N"),
+       PINCTRL_PIN(200, "ESPI_ALRT1_N"),
+       PINCTRL_PIN(201, "ESPI_CLK_LOOPBK"),
+       /* EAST0 */
+       PINCTRL_PIN(202, "SPI_CS0_N"),
+       PINCTRL_PIN(203, "SPI_CS1_N"),
+       PINCTRL_PIN(204, "SPI_MOSI_IO0"),
+       PINCTRL_PIN(205, "SPI_MISO_IO1"),
+       PINCTRL_PIN(206, "SPI_IO2"),
+       PINCTRL_PIN(207, "SPI_IO3"),
+       PINCTRL_PIN(208, "SPI_CLK"),
+       PINCTRL_PIN(209, "SPI_CLK_LOOPBK"),
+       PINCTRL_PIN(210, "SUSPWRDNACK"),
+       PINCTRL_PIN(211, "PMU_SUSCLK"),
+       PINCTRL_PIN(212, "ADR_COMPLETE"),
+       PINCTRL_PIN(213, "ADR_TRIGGER_N"),
+       PINCTRL_PIN(214, "PMU_SLP_S45_N"),
+       PINCTRL_PIN(215, "PMU_SLP_S3_N"),
+       PINCTRL_PIN(216, "PMU_WAKE_N"),
+       PINCTRL_PIN(217, "PMU_PWRBTN_N"),
+       PINCTRL_PIN(218, "PMU_RESETBUTTON_N"),
+       PINCTRL_PIN(219, "PMU_PLTRST_N"),
+       PINCTRL_PIN(220, "SUS_STAT_N"),
+       PINCTRL_PIN(221, "PMU_I2C_CLK"),
+       PINCTRL_PIN(222, "PMU_I2C_DATA"),
+       PINCTRL_PIN(223, "PECI_SMB_CLK"),
+       PINCTRL_PIN(224, "PECI_SMB_DATA"),
+       PINCTRL_PIN(225, "PECI_SMB_ALRT_N"),
+       /* EMMC */
+       PINCTRL_PIN(226, "EMMC_CMD"),
+       PINCTRL_PIN(227, "EMMC_STROBE"),
+       PINCTRL_PIN(228, "EMMC_CLK"),
+       PINCTRL_PIN(229, "EMMC_D0"),
+       PINCTRL_PIN(230, "EMMC_D1"),
+       PINCTRL_PIN(231, "EMMC_D2"),
+       PINCTRL_PIN(232, "EMMC_D3"),
+       PINCTRL_PIN(233, "EMMC_D4"),
+       PINCTRL_PIN(234, "EMMC_D5"),
+       PINCTRL_PIN(235, "EMMC_D6"),
+       PINCTRL_PIN(236, "EMMC_D7"),
+};
+
+static const struct intel_padgroup cdf_community0_gpps[] = {
+       CDF_GPP(0, 0, 23),      /* WEST2 */
+       CDF_GPP(1, 24, 47),     /* WEST3 */
+       CDF_GPP(2, 48, 70),     /* WEST01 */
+       CDF_GPP(3, 71, 90),     /* WEST5 */
+       CDF_GPP(4, 91, 96),     /* WESTC */
+       CDF_GPP(5, 97, 101),    /* WESTC_DFX */
+       CDF_GPP(6, 102, 111),   /* WESTA */
+       CDF_GPP(7, 112, 123),   /* WESTB */
+       CDF_GPP(8, 124, 143),   /* WESTD */
+       CDF_GPP(9, 144, 144),   /* WESTD_PECI */
+       CDF_GPP(10, 145, 167),  /* WESTF */
+};
+
+static const struct intel_padgroup cdf_community1_gpps[] = {
+       CDF_GPP(0, 168, 190),   /* EAST2 */
+       CDF_GPP(1, 191, 201),   /* EAST3 */
+       CDF_GPP(2, 202, 225),   /* EAST0 */
+       CDF_GPP(3, 226, 236),   /* EMMC */
+};
+
+static const struct intel_community cdf_communities[] = {
+       CDF_COMMUNITY(0, 0, 167, cdf_community0_gpps),          /* West */
+       CDF_COMMUNITY(1, 168, 236, cdf_community1_gpps),        /* East */
+};
+
+static const struct intel_pinctrl_soc_data cdf_soc_data = {
+       .pins = cdf_pins,
+       .npins = ARRAY_SIZE(cdf_pins),
+       .communities = cdf_communities,
+       .ncommunities = ARRAY_SIZE(cdf_communities),
+};
+
+static int cdf_pinctrl_probe(struct platform_device *pdev)
+{
+       return intel_pinctrl_probe(pdev, &cdf_soc_data);
+}
+
+static const struct dev_pm_ops cdf_pinctrl_pm_ops = {
+       SET_LATE_SYSTEM_SLEEP_PM_OPS(intel_pinctrl_suspend,
+                                    intel_pinctrl_resume)
+};
+
+static const struct acpi_device_id cdf_pinctrl_acpi_match[] = {
+       { "INTC3001" },
+       { }
+};
+MODULE_DEVICE_TABLE(acpi, cdf_pinctrl_acpi_match);
+
+static struct platform_driver cdf_pinctrl_driver = {
+       .probe = cdf_pinctrl_probe,
+       .driver = {
+               .name = "cedarfork-pinctrl",
+               .acpi_match_table = cdf_pinctrl_acpi_match,
+               .pm = &cdf_pinctrl_pm_ops,
+       },
+};
+
+static int __init cdf_pinctrl_init(void)
+{
+       return platform_driver_register(&cdf_pinctrl_driver);
+}
+subsys_initcall(cdf_pinctrl_init);
+
+static void __exit cdf_pinctrl_exit(void)
+{
+       platform_driver_unregister(&cdf_pinctrl_driver);
+}
+module_exit(cdf_pinctrl_exit);
+
+MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
+MODULE_DESCRIPTION("Intel Cedar Fork PCH pinctrl/GPIO driver");
+MODULE_LICENSE("GPL v2");
index bc2bb6b328ab440f73c4c499f6d7288d89169201..bdedb6325c72a5fa0966377d53678722d18f07eb 100644 (file)
@@ -491,7 +491,7 @@ static const struct chv_community north_community = {
        .ngpio_ranges = ARRAY_SIZE(north_gpio_ranges),
        .ngpios = ARRAY_SIZE(north_pins),
        /*
-        * North community can benerate GPIO interrupts only for the first
+        * North community can generate GPIO interrupts only for the first
         * 8 interrupts. The upper half (8-15) can only be used to trigger
         * GPEs.
         */
index ffda27bfd133c79fcf0f0d25ab8af46a00336032..12a1af45acb98557de6184e934360dc056fbc01a 100644 (file)
@@ -30,8 +30,6 @@
 
 #define PADBAR                         0x00c
 #define GPI_IS                         0x100
-#define GPI_GPE_STS                    0x140
-#define GPI_GPE_EN                     0x160
 
 #define PADOWN_BITS                    4
 #define PADOWN_SHIFT(p)                        ((p) % 8 * PADOWN_BITS)
@@ -818,7 +816,7 @@ static void intel_gpio_irq_ack(struct irq_data *d)
        community = intel_get_community(pctrl, pin);
        if (community) {
                const struct intel_padgroup *padgrp;
-               unsigned gpp, gpp_offset;
+               unsigned gpp, gpp_offset, is_offset;
 
                padgrp = intel_community_get_padgroup(community, pin);
                if (!padgrp)
@@ -826,9 +824,10 @@ static void intel_gpio_irq_ack(struct irq_data *d)
 
                gpp = padgrp->reg_num;
                gpp_offset = padgroup_offset(padgrp, pin);
+               is_offset = community->is_offset + gpp * 4;
 
                raw_spin_lock(&pctrl->lock);
-               writel(BIT(gpp_offset), community->regs + GPI_IS + gpp * 4);
+               writel(BIT(gpp_offset), community->regs + is_offset);
                raw_spin_unlock(&pctrl->lock);
        }
 }
@@ -843,7 +842,7 @@ static void intel_gpio_irq_enable(struct irq_data *d)
        community = intel_get_community(pctrl, pin);
        if (community) {
                const struct intel_padgroup *padgrp;
-               unsigned gpp, gpp_offset;
+               unsigned gpp, gpp_offset, is_offset;
                unsigned long flags;
                u32 value;
 
@@ -853,10 +852,11 @@ static void intel_gpio_irq_enable(struct irq_data *d)
 
                gpp = padgrp->reg_num;
                gpp_offset = padgroup_offset(padgrp, pin);
+               is_offset = community->is_offset + gpp * 4;
 
                raw_spin_lock_irqsave(&pctrl->lock, flags);
                /* Clear interrupt status first to avoid unexpected interrupt */
-               writel(BIT(gpp_offset), community->regs + GPI_IS + gpp * 4);
+               writel(BIT(gpp_offset), community->regs + is_offset);
 
                value = readl(community->regs + community->ie_offset + gpp * 4);
                value |= BIT(gpp_offset);
@@ -991,7 +991,8 @@ static irqreturn_t intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
                const struct intel_padgroup *padgrp = &community->gpps[gpp];
                unsigned long pending, enabled, gpp_offset;
 
-               pending = readl(community->regs + GPI_IS + padgrp->reg_num * 4);
+               pending = readl(community->regs + community->is_offset +
+                               padgrp->reg_num * 4);
                enabled = readl(community->regs + community->ie_offset +
                                padgrp->reg_num * 4);
 
@@ -1241,6 +1242,9 @@ int intel_pinctrl_probe(struct platform_device *pdev,
                community->regs = regs;
                community->pad_regs = regs + padbar;
 
+               if (!community->is_offset)
+                       community->is_offset = GPI_IS;
+
                ret = intel_pinctrl_add_padgroups(pctrl, community);
                if (ret)
                        return ret;
@@ -1356,7 +1360,7 @@ static void intel_gpio_irq_init(struct intel_pinctrl *pctrl)
                for (gpp = 0; gpp < community->ngpps; gpp++) {
                        /* Mask and clear all interrupts */
                        writel(0, base + community->ie_offset + gpp * 4);
-                       writel(0xffff, base + GPI_IS + gpp * 4);
+                       writel(0xffff, base + community->is_offset + gpp * 4);
                }
        }
 }
index 7fdb07753c2d2821c99c0146c659fc32c3b8441c..13b0bd6eb2a25441b1a29d9ff87931351f1125ce 100644 (file)
@@ -73,6 +73,8 @@ struct intel_padgroup {
  * @hostown_offset: Register offset of HOSTSW_OWN from @regs. If %0 then it
  *                  is assumed that the host owns the pin (rather than
  *                  ACPI).
+ * @is_offset: Register offset of GPI_IS from @regs. If %0 then uses the
+ *             default (%0x100).
  * @ie_offset: Register offset of GPI_IE from @regs.
  * @pin_base: Starting pin of pins in this community
  * @gpp_size: Maximum number of pads in each group, such as PADCFGLOCK,
@@ -98,6 +100,7 @@ struct intel_community {
        unsigned padown_offset;
        unsigned padcfglock_offset;
        unsigned hostown_offset;
+       unsigned is_offset;
        unsigned ie_offset;
        unsigned pin_base;
        unsigned gpp_size;
diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
new file mode 100644 (file)
index 0000000..1a51778
--- /dev/null
@@ -0,0 +1,41 @@
+menuconfig PINCTRL_MESON
+       bool "Amlogic SoC pinctrl drivers"
+       depends on ARCH_MESON
+       depends on OF
+       select PINMUX
+       select PINCONF
+       select GENERIC_PINCONF
+       select GPIOLIB
+       select OF_GPIO
+       select REGMAP_MMIO
+
+if PINCTRL_MESON
+
+config PINCTRL_MESON8
+       bool "Meson 8 SoC pinctrl driver"
+       depends on ARM
+       select PINCTRL_MESON8_PMX
+       default y
+
+config PINCTRL_MESON8B
+       bool "Meson 8b SoC pinctrl driver"
+       depends on ARM
+       select PINCTRL_MESON8_PMX
+       default y
+
+config PINCTRL_MESON_GXBB
+       bool "Meson gxbb SoC pinctrl driver"
+       depends on ARM64
+       select PINCTRL_MESON8_PMX
+       default y
+
+config PINCTRL_MESON_GXL
+       bool "Meson gxl SoC pinctrl driver"
+       depends on ARM64
+       select PINCTRL_MESON8_PMX
+       default y
+
+config PINCTRL_MESON8_PMX
+       bool
+
+endif
index 27c5b5126008b4336175417e1e075f63a6beb957..cbd47bb74549143053b0150b97804596a50202f0 100644 (file)
@@ -1,3 +1,6 @@
-obj-y  += pinctrl-meson8.o pinctrl-meson8b.o
-obj-y  += pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
-obj-y  += pinctrl-meson.o
+obj-$(CONFIG_PINCTRL_MESON) += pinctrl-meson.o
+obj-$(CONFIG_PINCTRL_MESON8_PMX) += pinctrl-meson8-pmx.o
+obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
+obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
+obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
+obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
index 7bbc0d3cddcfa228313457ba6b0bf884e6dfb8e1..9079020259c5a531596a4cc965e28a73d7b468fa 100644 (file)
 
 #include <dt-bindings/gpio/meson-gxbb-gpio.h>
 #include "pinctrl-meson.h"
-
-#define EE_OFF 14
+#include "pinctrl-meson8-pmx.h"
 
 static const struct pinctrl_pin_desc meson_gxbb_periphs_pins[] = {
-       MESON_PIN(GPIOZ_0, EE_OFF),
-       MESON_PIN(GPIOZ_1, EE_OFF),
-       MESON_PIN(GPIOZ_2, EE_OFF),
-       MESON_PIN(GPIOZ_3, EE_OFF),
-       MESON_PIN(GPIOZ_4, EE_OFF),
-       MESON_PIN(GPIOZ_5, EE_OFF),
-       MESON_PIN(GPIOZ_6, EE_OFF),
-       MESON_PIN(GPIOZ_7, EE_OFF),
-       MESON_PIN(GPIOZ_8, EE_OFF),
-       MESON_PIN(GPIOZ_9, EE_OFF),
-       MESON_PIN(GPIOZ_10, EE_OFF),
-       MESON_PIN(GPIOZ_11, EE_OFF),
-       MESON_PIN(GPIOZ_12, EE_OFF),
-       MESON_PIN(GPIOZ_13, EE_OFF),
-       MESON_PIN(GPIOZ_14, EE_OFF),
-       MESON_PIN(GPIOZ_15, EE_OFF),
-
-       MESON_PIN(GPIOH_0, EE_OFF),
-       MESON_PIN(GPIOH_1, EE_OFF),
-       MESON_PIN(GPIOH_2, EE_OFF),
-       MESON_PIN(GPIOH_3, EE_OFF),
-
-       MESON_PIN(BOOT_0, EE_OFF),
-       MESON_PIN(BOOT_1, EE_OFF),
-       MESON_PIN(BOOT_2, EE_OFF),
-       MESON_PIN(BOOT_3, EE_OFF),
-       MESON_PIN(BOOT_4, EE_OFF),
-       MESON_PIN(BOOT_5, EE_OFF),
-       MESON_PIN(BOOT_6, EE_OFF),
-       MESON_PIN(BOOT_7, EE_OFF),
-       MESON_PIN(BOOT_8, EE_OFF),
-       MESON_PIN(BOOT_9, EE_OFF),
-       MESON_PIN(BOOT_10, EE_OFF),
-       MESON_PIN(BOOT_11, EE_OFF),
-       MESON_PIN(BOOT_12, EE_OFF),
-       MESON_PIN(BOOT_13, EE_OFF),
-       MESON_PIN(BOOT_14, EE_OFF),
-       MESON_PIN(BOOT_15, EE_OFF),
-       MESON_PIN(BOOT_16, EE_OFF),
-       MESON_PIN(BOOT_17, EE_OFF),
-
-       MESON_PIN(CARD_0, EE_OFF),
-       MESON_PIN(CARD_1, EE_OFF),
-       MESON_PIN(CARD_2, EE_OFF),
-       MESON_PIN(CARD_3, EE_OFF),
-       MESON_PIN(CARD_4, EE_OFF),
-       MESON_PIN(CARD_5, EE_OFF),
-       MESON_PIN(CARD_6, EE_OFF),
-
-       MESON_PIN(GPIODV_0, EE_OFF),
-       MESON_PIN(GPIODV_1, EE_OFF),
-       MESON_PIN(GPIODV_2, EE_OFF),
-       MESON_PIN(GPIODV_3, EE_OFF),
-       MESON_PIN(GPIODV_4, EE_OFF),
-       MESON_PIN(GPIODV_5, EE_OFF),
-       MESON_PIN(GPIODV_6, EE_OFF),
-       MESON_PIN(GPIODV_7, EE_OFF),
-       MESON_PIN(GPIODV_8, EE_OFF),
-       MESON_PIN(GPIODV_9, EE_OFF),
-       MESON_PIN(GPIODV_10, EE_OFF),
-       MESON_PIN(GPIODV_11, EE_OFF),
-       MESON_PIN(GPIODV_12, EE_OFF),
-       MESON_PIN(GPIODV_13, EE_OFF),
-       MESON_PIN(GPIODV_14, EE_OFF),
-       MESON_PIN(GPIODV_15, EE_OFF),
-       MESON_PIN(GPIODV_16, EE_OFF),
-       MESON_PIN(GPIODV_17, EE_OFF),
-       MESON_PIN(GPIODV_18, EE_OFF),
-       MESON_PIN(GPIODV_19, EE_OFF),
-       MESON_PIN(GPIODV_20, EE_OFF),
-       MESON_PIN(GPIODV_21, EE_OFF),
-       MESON_PIN(GPIODV_22, EE_OFF),
-       MESON_PIN(GPIODV_23, EE_OFF),
-       MESON_PIN(GPIODV_24, EE_OFF),
-       MESON_PIN(GPIODV_25, EE_OFF),
-       MESON_PIN(GPIODV_26, EE_OFF),
-       MESON_PIN(GPIODV_27, EE_OFF),
-       MESON_PIN(GPIODV_28, EE_OFF),
-       MESON_PIN(GPIODV_29, EE_OFF),
-
-       MESON_PIN(GPIOY_0, EE_OFF),
-       MESON_PIN(GPIOY_1, EE_OFF),
-       MESON_PIN(GPIOY_2, EE_OFF),
-       MESON_PIN(GPIOY_3, EE_OFF),
-       MESON_PIN(GPIOY_4, EE_OFF),
-       MESON_PIN(GPIOY_5, EE_OFF),
-       MESON_PIN(GPIOY_6, EE_OFF),
-       MESON_PIN(GPIOY_7, EE_OFF),
-       MESON_PIN(GPIOY_8, EE_OFF),
-       MESON_PIN(GPIOY_9, EE_OFF),
-       MESON_PIN(GPIOY_10, EE_OFF),
-       MESON_PIN(GPIOY_11, EE_OFF),
-       MESON_PIN(GPIOY_12, EE_OFF),
-       MESON_PIN(GPIOY_13, EE_OFF),
-       MESON_PIN(GPIOY_14, EE_OFF),
-       MESON_PIN(GPIOY_15, EE_OFF),
-       MESON_PIN(GPIOY_16, EE_OFF),
-
-       MESON_PIN(GPIOX_0, EE_OFF),
-       MESON_PIN(GPIOX_1, EE_OFF),
-       MESON_PIN(GPIOX_2, EE_OFF),
-       MESON_PIN(GPIOX_3, EE_OFF),
-       MESON_PIN(GPIOX_4, EE_OFF),
-       MESON_PIN(GPIOX_5, EE_OFF),
-       MESON_PIN(GPIOX_6, EE_OFF),
-       MESON_PIN(GPIOX_7, EE_OFF),
-       MESON_PIN(GPIOX_8, EE_OFF),
-       MESON_PIN(GPIOX_9, EE_OFF),
-       MESON_PIN(GPIOX_10, EE_OFF),
-       MESON_PIN(GPIOX_11, EE_OFF),
-       MESON_PIN(GPIOX_12, EE_OFF),
-       MESON_PIN(GPIOX_13, EE_OFF),
-       MESON_PIN(GPIOX_14, EE_OFF),
-       MESON_PIN(GPIOX_15, EE_OFF),
-       MESON_PIN(GPIOX_16, EE_OFF),
-       MESON_PIN(GPIOX_17, EE_OFF),
-       MESON_PIN(GPIOX_18, EE_OFF),
-       MESON_PIN(GPIOX_19, EE_OFF),
-       MESON_PIN(GPIOX_20, EE_OFF),
-       MESON_PIN(GPIOX_21, EE_OFF),
-
-       MESON_PIN(GPIOCLK_0, EE_OFF),
-       MESON_PIN(GPIOCLK_1, EE_OFF),
-       MESON_PIN(GPIOCLK_2, EE_OFF),
-       MESON_PIN(GPIOCLK_3, EE_OFF),
-
-       MESON_PIN(GPIO_TEST_N, EE_OFF),
+       MESON_PIN(GPIOZ_0),
+       MESON_PIN(GPIOZ_1),
+       MESON_PIN(GPIOZ_2),
+       MESON_PIN(GPIOZ_3),
+       MESON_PIN(GPIOZ_4),
+       MESON_PIN(GPIOZ_5),
+       MESON_PIN(GPIOZ_6),
+       MESON_PIN(GPIOZ_7),
+       MESON_PIN(GPIOZ_8),
+       MESON_PIN(GPIOZ_9),
+       MESON_PIN(GPIOZ_10),
+       MESON_PIN(GPIOZ_11),
+       MESON_PIN(GPIOZ_12),
+       MESON_PIN(GPIOZ_13),
+       MESON_PIN(GPIOZ_14),
+       MESON_PIN(GPIOZ_15),
+
+       MESON_PIN(GPIOH_0),
+       MESON_PIN(GPIOH_1),
+       MESON_PIN(GPIOH_2),
+       MESON_PIN(GPIOH_3),
+
+       MESON_PIN(BOOT_0),
+       MESON_PIN(BOOT_1),
+       MESON_PIN(BOOT_2),
+       MESON_PIN(BOOT_3),
+       MESON_PIN(BOOT_4),
+       MESON_PIN(BOOT_5),
+       MESON_PIN(BOOT_6),
+       MESON_PIN(BOOT_7),
+       MESON_PIN(BOOT_8),
+       MESON_PIN(BOOT_9),
+       MESON_PIN(BOOT_10),
+       MESON_PIN(BOOT_11),
+       MESON_PIN(BOOT_12),
+       MESON_PIN(BOOT_13),
+       MESON_PIN(BOOT_14),
+       MESON_PIN(BOOT_15),
+       MESON_PIN(BOOT_16),
+       MESON_PIN(BOOT_17),
+
+       MESON_PIN(CARD_0),
+       MESON_PIN(CARD_1),
+       MESON_PIN(CARD_2),
+       MESON_PIN(CARD_3),
+       MESON_PIN(CARD_4),
+       MESON_PIN(CARD_5),
+       MESON_PIN(CARD_6),
+
+       MESON_PIN(GPIODV_0),
+       MESON_PIN(GPIODV_1),
+       MESON_PIN(GPIODV_2),
+       MESON_PIN(GPIODV_3),
+       MESON_PIN(GPIODV_4),
+       MESON_PIN(GPIODV_5),
+       MESON_PIN(GPIODV_6),
+       MESON_PIN(GPIODV_7),
+       MESON_PIN(GPIODV_8),
+       MESON_PIN(GPIODV_9),
+       MESON_PIN(GPIODV_10),
+       MESON_PIN(GPIODV_11),
+       MESON_PIN(GPIODV_12),
+       MESON_PIN(GPIODV_13),
+       MESON_PIN(GPIODV_14),
+       MESON_PIN(GPIODV_15),
+       MESON_PIN(GPIODV_16),
+       MESON_PIN(GPIODV_17),
+       MESON_PIN(GPIODV_18),
+       MESON_PIN(GPIODV_19),
+       MESON_PIN(GPIODV_20),
+       MESON_PIN(GPIODV_21),
+       MESON_PIN(GPIODV_22),
+       MESON_PIN(GPIODV_23),
+       MESON_PIN(GPIODV_24),
+       MESON_PIN(GPIODV_25),
+       MESON_PIN(GPIODV_26),
+       MESON_PIN(GPIODV_27),
+       MESON_PIN(GPIODV_28),
+       MESON_PIN(GPIODV_29),
+
+       MESON_PIN(GPIOY_0),
+       MESON_PIN(GPIOY_1),
+       MESON_PIN(GPIOY_2),
+       MESON_PIN(GPIOY_3),
+       MESON_PIN(GPIOY_4),
+       MESON_PIN(GPIOY_5),
+       MESON_PIN(GPIOY_6),
+       MESON_PIN(GPIOY_7),
+       MESON_PIN(GPIOY_8),
+       MESON_PIN(GPIOY_9),
+       MESON_PIN(GPIOY_10),
+       MESON_PIN(GPIOY_11),
+       MESON_PIN(GPIOY_12),
+       MESON_PIN(GPIOY_13),
+       MESON_PIN(GPIOY_14),
+       MESON_PIN(GPIOY_15),
+       MESON_PIN(GPIOY_16),
+
+       MESON_PIN(GPIOX_0),
+       MESON_PIN(GPIOX_1),
+       MESON_PIN(GPIOX_2),
+       MESON_PIN(GPIOX_3),
+       MESON_PIN(GPIOX_4),
+       MESON_PIN(GPIOX_5),
+       MESON_PIN(GPIOX_6),
+       MESON_PIN(GPIOX_7),
+       MESON_PIN(GPIOX_8),
+       MESON_PIN(GPIOX_9),
+       MESON_PIN(GPIOX_10),
+       MESON_PIN(GPIOX_11),
+       MESON_PIN(GPIOX_12),
+       MESON_PIN(GPIOX_13),
+       MESON_PIN(GPIOX_14),
+       MESON_PIN(GPIOX_15),
+       MESON_PIN(GPIOX_16),
+       MESON_PIN(GPIOX_17),
+       MESON_PIN(GPIOX_18),
+       MESON_PIN(GPIOX_19),
+       MESON_PIN(GPIOX_20),
+       MESON_PIN(GPIOX_21),
+       MESON_PIN(GPIOX_22),
+
+       MESON_PIN(GPIOCLK_0),
+       MESON_PIN(GPIOCLK_1),
+       MESON_PIN(GPIOCLK_2),
+       MESON_PIN(GPIOCLK_3),
 };
 
 static const unsigned int emmc_nand_d07_pins[] = {
-       PIN(BOOT_0, EE_OFF), PIN(BOOT_1, EE_OFF), PIN(BOOT_2, EE_OFF),
-       PIN(BOOT_3, EE_OFF), PIN(BOOT_4, EE_OFF), PIN(BOOT_5, EE_OFF),
-       PIN(BOOT_6, EE_OFF), PIN(BOOT_7, EE_OFF),
-};
-static const unsigned int emmc_clk_pins[] = { PIN(BOOT_8, EE_OFF) };
-static const unsigned int emmc_cmd_pins[] = { PIN(BOOT_10, EE_OFF) };
-static const unsigned int emmc_ds_pins[] = { PIN(BOOT_15, EE_OFF) };
-
-static const unsigned int nor_d_pins[]         = { PIN(BOOT_11, EE_OFF) };
-static const unsigned int nor_q_pins[]         = { PIN(BOOT_12, EE_OFF) };
-static const unsigned int nor_c_pins[]         = { PIN(BOOT_13, EE_OFF) };
-static const unsigned int nor_cs_pins[]                = { PIN(BOOT_15, EE_OFF) };
-
-static const unsigned int spi_sclk_pins[]      = { PIN(GPIOZ_6, EE_OFF) };
-static const unsigned int spi_ss0_pins[]       = { PIN(GPIOZ_7, EE_OFF) };
-static const unsigned int spi_miso_pins[]      = { PIN(GPIOZ_12, EE_OFF) };
-static const unsigned int spi_mosi_pins[]      = { PIN(GPIOZ_13, EE_OFF) };
-
-static const unsigned int sdcard_d0_pins[] = { PIN(CARD_1, EE_OFF) };
-static const unsigned int sdcard_d1_pins[] = { PIN(CARD_0, EE_OFF) };
-static const unsigned int sdcard_d2_pins[] = { PIN(CARD_5, EE_OFF) };
-static const unsigned int sdcard_d3_pins[] = { PIN(CARD_4, EE_OFF) };
-static const unsigned int sdcard_cmd_pins[] = { PIN(CARD_3, EE_OFF) };
-static const unsigned int sdcard_clk_pins[] = { PIN(CARD_2, EE_OFF) };
-
-static const unsigned int sdio_d0_pins[] = { PIN(GPIOX_0, EE_OFF) };
-static const unsigned int sdio_d1_pins[] = { PIN(GPIOX_1, EE_OFF) };
-static const unsigned int sdio_d2_pins[] = { PIN(GPIOX_2, EE_OFF) };
-static const unsigned int sdio_d3_pins[] = { PIN(GPIOX_3, EE_OFF) };
-static const unsigned int sdio_cmd_pins[] = { PIN(GPIOX_4, EE_OFF) };
-static const unsigned int sdio_clk_pins[] = { PIN(GPIOX_5, EE_OFF) };
-static const unsigned int sdio_irq_pins[] = { PIN(GPIOX_7, EE_OFF) };
-
-static const unsigned int nand_ce0_pins[]      = { PIN(BOOT_8, EE_OFF) };
-static const unsigned int nand_ce1_pins[]      = { PIN(BOOT_9, EE_OFF) };
-static const unsigned int nand_rb0_pins[]      = { PIN(BOOT_10, EE_OFF) };
-static const unsigned int nand_ale_pins[]      = { PIN(BOOT_11, EE_OFF) };
-static const unsigned int nand_cle_pins[]      = { PIN(BOOT_12, EE_OFF) };
-static const unsigned int nand_wen_clk_pins[]  = { PIN(BOOT_13, EE_OFF) };
-static const unsigned int nand_ren_wr_pins[]   = { PIN(BOOT_14, EE_OFF) };
-static const unsigned int nand_dqs_pins[]      = { PIN(BOOT_15, EE_OFF) };
-
-static const unsigned int uart_tx_a_pins[]     = { PIN(GPIOX_12, EE_OFF) };
-static const unsigned int uart_rx_a_pins[]     = { PIN(GPIOX_13, EE_OFF) };
-static const unsigned int uart_cts_a_pins[]    = { PIN(GPIOX_14, EE_OFF) };
-static const unsigned int uart_rts_a_pins[]    = { PIN(GPIOX_15, EE_OFF) };
-
-static const unsigned int uart_tx_b_pins[]     = { PIN(GPIODV_24, EE_OFF) };
-static const unsigned int uart_rx_b_pins[]     = { PIN(GPIODV_25, EE_OFF) };
-static const unsigned int uart_cts_b_pins[]    = { PIN(GPIODV_26, EE_OFF) };
-static const unsigned int uart_rts_b_pins[]    = { PIN(GPIODV_27, EE_OFF) };
-
-static const unsigned int uart_tx_c_pins[]     = { PIN(GPIOY_13, EE_OFF) };
-static const unsigned int uart_rx_c_pins[]     = { PIN(GPIOY_14, EE_OFF) };
-static const unsigned int uart_cts_c_pins[]    = { PIN(GPIOX_11, EE_OFF) };
-static const unsigned int uart_rts_c_pins[]    = { PIN(GPIOX_12, EE_OFF) };
-
-static const unsigned int i2c_sck_a_pins[]     = { PIN(GPIODV_25, EE_OFF) };
-static const unsigned int i2c_sda_a_pins[]     = { PIN(GPIODV_24, EE_OFF) };
-
-static const unsigned int i2c_sck_b_pins[]     = { PIN(GPIODV_27, EE_OFF) };
-static const unsigned int i2c_sda_b_pins[]     = { PIN(GPIODV_26, EE_OFF) };
-
-static const unsigned int i2c_sck_c_pins[]     = { PIN(GPIODV_29, EE_OFF) };
-static const unsigned int i2c_sda_c_pins[]     = { PIN(GPIODV_28, EE_OFF) };
-
-static const unsigned int eth_mdio_pins[]      = { PIN(GPIOZ_0, EE_OFF) };
-static const unsigned int eth_mdc_pins[]       = { PIN(GPIOZ_1, EE_OFF) };
-static const unsigned int eth_clk_rx_clk_pins[]        = { PIN(GPIOZ_2, EE_OFF) };
-static const unsigned int eth_rx_dv_pins[]     = { PIN(GPIOZ_3, EE_OFF) };
-static const unsigned int eth_rxd0_pins[]      = { PIN(GPIOZ_4, EE_OFF) };
-static const unsigned int eth_rxd1_pins[]      = { PIN(GPIOZ_5, EE_OFF) };
-static const unsigned int eth_rxd2_pins[]      = { PIN(GPIOZ_6, EE_OFF) };
-static const unsigned int eth_rxd3_pins[]      = { PIN(GPIOZ_7, EE_OFF) };
-static const unsigned int eth_rgmii_tx_clk_pins[] = { PIN(GPIOZ_8, EE_OFF) };
-static const unsigned int eth_tx_en_pins[]     = { PIN(GPIOZ_9, EE_OFF) };
-static const unsigned int eth_txd0_pins[]      = { PIN(GPIOZ_10, EE_OFF) };
-static const unsigned int eth_txd1_pins[]      = { PIN(GPIOZ_11, EE_OFF) };
-static const unsigned int eth_txd2_pins[]      = { PIN(GPIOZ_12, EE_OFF) };
-static const unsigned int eth_txd3_pins[]      = { PIN(GPIOZ_13, EE_OFF) };
-
-static const unsigned int pwm_a_x_pins[]       = { PIN(GPIOX_6, EE_OFF) };
-static const unsigned int pwm_a_y_pins[]       = { PIN(GPIOY_16, EE_OFF) };
-static const unsigned int pwm_b_pins[]         = { PIN(GPIODV_29, EE_OFF) };
-static const unsigned int pwm_d_pins[]         = { PIN(GPIODV_28, EE_OFF) };
-static const unsigned int pwm_e_pins[]         = { PIN(GPIOX_19, EE_OFF) };
-static const unsigned int pwm_f_x_pins[]       = { PIN(GPIOX_7, EE_OFF) };
-static const unsigned int pwm_f_y_pins[]       = { PIN(GPIOY_15, EE_OFF) };
-
-static const unsigned int hdmi_hpd_pins[]      = { PIN(GPIOH_0, EE_OFF) };
-static const unsigned int hdmi_sda_pins[]      = { PIN(GPIOH_1, EE_OFF) };
-static const unsigned int hdmi_scl_pins[]      = { PIN(GPIOH_2, EE_OFF) };
-
-static const unsigned int i2s_out_ch23_y_pins[]        = { PIN(GPIOY_8, EE_OFF) };
-static const unsigned int i2s_out_ch45_y_pins[]        = { PIN(GPIOY_9, EE_OFF) };
-static const unsigned int i2s_out_ch67_y_pins[]        = { PIN(GPIOY_10, EE_OFF) };
-
-static const unsigned int spdif_out_y_pins[]   = { PIN(GPIOY_12, EE_OFF) };
+       BOOT_0, BOOT_1, BOOT_2, BOOT_3, BOOT_4, BOOT_5, BOOT_6, BOOT_7,
+};
+static const unsigned int emmc_clk_pins[]      = { BOOT_8 };
+static const unsigned int emmc_cmd_pins[]      = { BOOT_10 };
+static const unsigned int emmc_ds_pins[]       = { BOOT_15 };
+
+static const unsigned int nor_d_pins[]         = { BOOT_11 };
+static const unsigned int nor_q_pins[]         = { BOOT_12 };
+static const unsigned int nor_c_pins[]         = { BOOT_13 };
+static const unsigned int nor_cs_pins[]                = { BOOT_15 };
+
+static const unsigned int spi_sclk_pins[]      = { GPIOZ_6 };
+static const unsigned int spi_ss0_pins[]       = { GPIOZ_7 };
+static const unsigned int spi_miso_pins[]      = { GPIOZ_12 };
+static const unsigned int spi_mosi_pins[]      = { GPIOZ_13 };
+
+static const unsigned int sdcard_d0_pins[]     = { CARD_1 };
+static const unsigned int sdcard_d1_pins[]     = { CARD_0 };
+static const unsigned int sdcard_d2_pins[]     = { CARD_5 };
+static const unsigned int sdcard_d3_pins[]     = { CARD_4 };
+static const unsigned int sdcard_cmd_pins[]    = { CARD_3 };
+static const unsigned int sdcard_clk_pins[]    = { CARD_2 };
+
+static const unsigned int sdio_d0_pins[]       = { GPIOX_0 };
+static const unsigned int sdio_d1_pins[]       = { GPIOX_1 };
+static const unsigned int sdio_d2_pins[]       = { GPIOX_2 };
+static const unsigned int sdio_d3_pins[]       = { GPIOX_3 };
+static const unsigned int sdio_cmd_pins[]      = { GPIOX_4 };
+static const unsigned int sdio_clk_pins[]      = { GPIOX_5 };
+static const unsigned int sdio_irq_pins[]      = { GPIOX_7 };
+
+static const unsigned int nand_ce0_pins[]      = { BOOT_8 };
+static const unsigned int nand_ce1_pins[]      = { BOOT_9 };
+static const unsigned int nand_rb0_pins[]      = { BOOT_10 };
+static const unsigned int nand_ale_pins[]      = { BOOT_11 };
+static const unsigned int nand_cle_pins[]      = { BOOT_12 };
+static const unsigned int nand_wen_clk_pins[]  = { BOOT_13 };
+static const unsigned int nand_ren_wr_pins[]   = { BOOT_14 };
+static const unsigned int nand_dqs_pins[]      = { BOOT_15 };
+
+static const unsigned int uart_tx_a_pins[]     = { GPIOX_12 };
+static const unsigned int uart_rx_a_pins[]     = { GPIOX_13 };
+static const unsigned int uart_cts_a_pins[]    = { GPIOX_14 };
+static const unsigned int uart_rts_a_pins[]    = { GPIOX_15 };
+
+static const unsigned int uart_tx_b_pins[]     = { GPIODV_24 };
+static const unsigned int uart_rx_b_pins[]     = { GPIODV_25 };
+static const unsigned int uart_cts_b_pins[]    = { GPIODV_26 };
+static const unsigned int uart_rts_b_pins[]    = { GPIODV_27 };
+
+static const unsigned int uart_tx_c_pins[]     = { GPIOY_13 };
+static const unsigned int uart_rx_c_pins[]     = { GPIOY_14 };
+static const unsigned int uart_cts_c_pins[]    = { GPIOX_11 };
+static const unsigned int uart_rts_c_pins[]    = { GPIOX_12 };
+
+static const unsigned int i2c_sck_a_pins[]     = { GPIODV_25 };
+static const unsigned int i2c_sda_a_pins[]     = { GPIODV_24 };
+
+static const unsigned int i2c_sck_b_pins[]     = { GPIODV_27 };
+static const unsigned int i2c_sda_b_pins[]     = { GPIODV_26 };
+
+static const unsigned int i2c_sck_c_pins[]     = { GPIODV_29 };
+static const unsigned int i2c_sda_c_pins[]     = { GPIODV_28 };
+
+static const unsigned int eth_mdio_pins[]      = { GPIOZ_0 };
+static const unsigned int eth_mdc_pins[]       = { GPIOZ_1 };
+static const unsigned int eth_clk_rx_clk_pins[]        = { GPIOZ_2 };
+static const unsigned int eth_rx_dv_pins[]     = { GPIOZ_3 };
+static const unsigned int eth_rxd0_pins[]      = { GPIOZ_4 };
+static const unsigned int eth_rxd1_pins[]      = { GPIOZ_5 };
+static const unsigned int eth_rxd2_pins[]      = { GPIOZ_6 };
+static const unsigned int eth_rxd3_pins[]      = { GPIOZ_7 };
+static const unsigned int eth_rgmii_tx_clk_pins[] = { GPIOZ_8 };
+static const unsigned int eth_tx_en_pins[]     = { GPIOZ_9 };
+static const unsigned int eth_txd0_pins[]      = { GPIOZ_10 };
+static const unsigned int eth_txd1_pins[]      = { GPIOZ_11 };
+static const unsigned int eth_txd2_pins[]      = { GPIOZ_12 };
+static const unsigned int eth_txd3_pins[]      = { GPIOZ_13 };
+
+static const unsigned int pwm_a_x_pins[]       = { GPIOX_6 };
+static const unsigned int pwm_a_y_pins[]       = { GPIOY_16 };
+static const unsigned int pwm_b_pins[]         = { GPIODV_29 };
+static const unsigned int pwm_d_pins[]         = { GPIODV_28 };
+static const unsigned int pwm_e_pins[]         = { GPIOX_19 };
+static const unsigned int pwm_f_x_pins[]       = { GPIOX_7 };
+static const unsigned int pwm_f_y_pins[]       = { GPIOY_15 };
+
+static const unsigned int hdmi_hpd_pins[]      = { GPIOH_0 };
+static const unsigned int hdmi_sda_pins[]      = { GPIOH_1 };
+static const unsigned int hdmi_scl_pins[]      = { GPIOH_2 };
+
+static const unsigned int i2s_out_ch23_y_pins[]        = { GPIOY_8 };
+static const unsigned int i2s_out_ch45_y_pins[]        = { GPIOY_9 };
+static const unsigned int i2s_out_ch67_y_pins[]        = { GPIOY_10 };
+
+static const unsigned int spdif_out_y_pins[]   = { GPIOY_12 };
 
 static const struct pinctrl_pin_desc meson_gxbb_aobus_pins[] = {
-       MESON_PIN(GPIOAO_0, 0),
-       MESON_PIN(GPIOAO_1, 0),
-       MESON_PIN(GPIOAO_2, 0),
-       MESON_PIN(GPIOAO_3, 0),
-       MESON_PIN(GPIOAO_4, 0),
-       MESON_PIN(GPIOAO_5, 0),
-       MESON_PIN(GPIOAO_6, 0),
-       MESON_PIN(GPIOAO_7, 0),
-       MESON_PIN(GPIOAO_8, 0),
-       MESON_PIN(GPIOAO_9, 0),
-       MESON_PIN(GPIOAO_10, 0),
-       MESON_PIN(GPIOAO_11, 0),
-       MESON_PIN(GPIOAO_12, 0),
-       MESON_PIN(GPIOAO_13, 0),
-};
-
-static const unsigned int uart_tx_ao_a_pins[]  = { PIN(GPIOAO_0, 0) };
-static const unsigned int uart_rx_ao_a_pins[]  = { PIN(GPIOAO_1, 0) };
-static const unsigned int uart_cts_ao_a_pins[] = { PIN(GPIOAO_2, 0) };
-static const unsigned int uart_rts_ao_a_pins[] = { PIN(GPIOAO_3, 0) };
-static const unsigned int uart_tx_ao_b_pins[]  = { PIN(GPIOAO_4, 0) };
-static const unsigned int uart_rx_ao_b_pins[]  = { PIN(GPIOAO_5, 0) };
-static const unsigned int uart_cts_ao_b_pins[] = { PIN(GPIOAO_2, 0) };
-static const unsigned int uart_rts_ao_b_pins[] = { PIN(GPIOAO_3, 0) };
-
-static const unsigned int i2c_sck_ao_pins[] = {PIN(GPIOAO_4, 0) };
-static const unsigned int i2c_sda_ao_pins[] = {PIN(GPIOAO_5, 0) };
-static const unsigned int i2c_slave_sck_ao_pins[] = {PIN(GPIOAO_4, 0) };
-static const unsigned int i2c_slave_sda_ao_pins[] = {PIN(GPIOAO_5, 0) };
-
-static const unsigned int remote_input_ao_pins[] = {PIN(GPIOAO_7, 0) };
-
-static const unsigned int pwm_ao_a_3_pins[]    = { PIN(GPIOAO_3, 0) };
-static const unsigned int pwm_ao_a_6_pins[]    = { PIN(GPIOAO_6, 0) };
-static const unsigned int pwm_ao_a_12_pins[]   = { PIN(GPIOAO_12, 0) };
-static const unsigned int pwm_ao_b_pins[]      = { PIN(GPIOAO_13, 0) };
-
-static const unsigned int i2s_am_clk_pins[]     = { PIN(GPIOAO_8, 0) };
-static const unsigned int i2s_out_ao_clk_pins[]         = { PIN(GPIOAO_9, 0) };
-static const unsigned int i2s_out_lr_clk_pins[]         = { PIN(GPIOAO_10, 0) };
-static const unsigned int i2s_out_ch01_ao_pins[] = { PIN(GPIOAO_11, 0) };
-static const unsigned int i2s_out_ch23_ao_pins[] = { PIN(GPIOAO_12, 0) };
-static const unsigned int i2s_out_ch45_ao_pins[] = { PIN(GPIOAO_13, 0) };
-
-static const unsigned int spdif_out_ao_6_pins[]        = { PIN(GPIOAO_6, 0) };
-static const unsigned int spdif_out_ao_13_pins[] = { PIN(GPIOAO_13, 0) };
-
-static const unsigned int ao_cec_pins[]          = { PIN(GPIOAO_12, 0) };
-static const unsigned int ee_cec_pins[]          = { PIN(GPIOAO_12, 0) };
+       MESON_PIN(GPIOAO_0),
+       MESON_PIN(GPIOAO_1),
+       MESON_PIN(GPIOAO_2),
+       MESON_PIN(GPIOAO_3),
+       MESON_PIN(GPIOAO_4),
+       MESON_PIN(GPIOAO_5),
+       MESON_PIN(GPIOAO_6),
+       MESON_PIN(GPIOAO_7),
+       MESON_PIN(GPIOAO_8),
+       MESON_PIN(GPIOAO_9),
+       MESON_PIN(GPIOAO_10),
+       MESON_PIN(GPIOAO_11),
+       MESON_PIN(GPIOAO_12),
+       MESON_PIN(GPIOAO_13),
+
+       MESON_PIN(GPIO_TEST_N),
+};
+
+static const unsigned int uart_tx_ao_a_pins[]  = { GPIOAO_0 };
+static const unsigned int uart_rx_ao_a_pins[]  = { GPIOAO_1 };
+static const unsigned int uart_cts_ao_a_pins[] = { GPIOAO_2 };
+static const unsigned int uart_rts_ao_a_pins[] = { GPIOAO_3 };
+static const unsigned int uart_tx_ao_b_pins[]  = { GPIOAO_4 };
+static const unsigned int uart_rx_ao_b_pins[]  = { GPIOAO_5 };
+static const unsigned int uart_cts_ao_b_pins[] = { GPIOAO_2 };
+static const unsigned int uart_rts_ao_b_pins[] = { GPIOAO_3 };
+
+static const unsigned int i2c_sck_ao_pins[]    = { GPIOAO_4 };
+static const unsigned int i2c_sda_ao_pins[]    = { GPIOAO_5 };
+static const unsigned int i2c_slave_sck_ao_pins[] = {GPIOAO_4 };
+static const unsigned int i2c_slave_sda_ao_pins[] = {GPIOAO_5 };
+
+static const unsigned int remote_input_ao_pins[] = { GPIOAO_7 };
+
+static const unsigned int pwm_ao_a_3_pins[]    = { GPIOAO_3 };
+static const unsigned int pwm_ao_a_6_pins[]    = { GPIOAO_6 };
+static const unsigned int pwm_ao_a_12_pins[]   = { GPIOAO_12 };
+static const unsigned int pwm_ao_b_pins[]      = { GPIOAO_13 };
+
+static const unsigned int i2s_am_clk_pins[]    = { GPIOAO_8 };
+static const unsigned int i2s_out_ao_clk_pins[]        = { GPIOAO_9 };
+static const unsigned int i2s_out_lr_clk_pins[]        = { GPIOAO_10 };
+static const unsigned int i2s_out_ch01_ao_pins[] = { GPIOAO_11 };
+static const unsigned int i2s_out_ch23_ao_pins[] = { GPIOAO_12 };
+static const unsigned int i2s_out_ch45_ao_pins[] = { GPIOAO_13 };
+static const unsigned int i2s_out_ch67_ao_pins[] = { GPIO_TEST_N };
+
+static const unsigned int spdif_out_ao_6_pins[]        = { GPIOAO_6 };
+static const unsigned int spdif_out_ao_13_pins[] = { GPIOAO_13 };
+
+static const unsigned int ao_cec_pins[]                = { GPIOAO_12 };
+static const unsigned int ee_cec_pins[]                = { GPIOAO_12 };
 
 static struct meson_pmx_group meson_gxbb_periphs_groups[] = {
-       GPIO_GROUP(GPIOZ_0, EE_OFF),
-       GPIO_GROUP(GPIOZ_1, EE_OFF),
-       GPIO_GROUP(GPIOZ_2, EE_OFF),
-       GPIO_GROUP(GPIOZ_3, EE_OFF),
-       GPIO_GROUP(GPIOZ_4, EE_OFF),
-       GPIO_GROUP(GPIOZ_5, EE_OFF),
-       GPIO_GROUP(GPIOZ_6, EE_OFF),
-       GPIO_GROUP(GPIOZ_7, EE_OFF),
-       GPIO_GROUP(GPIOZ_8, EE_OFF),
-       GPIO_GROUP(GPIOZ_9, EE_OFF),
-       GPIO_GROUP(GPIOZ_10, EE_OFF),
-       GPIO_GROUP(GPIOZ_11, EE_OFF),
-       GPIO_GROUP(GPIOZ_12, EE_OFF),
-       GPIO_GROUP(GPIOZ_13, EE_OFF),
-       GPIO_GROUP(GPIOZ_14, EE_OFF),
-       GPIO_GROUP(GPIOZ_15, EE_OFF),
-
-       GPIO_GROUP(GPIOH_0, EE_OFF),
-       GPIO_GROUP(GPIOH_1, EE_OFF),
-       GPIO_GROUP(GPIOH_2, EE_OFF),
-       GPIO_GROUP(GPIOH_3, EE_OFF),
-
-       GPIO_GROUP(BOOT_0, EE_OFF),
-       GPIO_GROUP(BOOT_1, EE_OFF),
-       GPIO_GROUP(BOOT_2, EE_OFF),
-       GPIO_GROUP(BOOT_3, EE_OFF),
-       GPIO_GROUP(BOOT_4, EE_OFF),
-       GPIO_GROUP(BOOT_5, EE_OFF),
-       GPIO_GROUP(BOOT_6, EE_OFF),
-       GPIO_GROUP(BOOT_7, EE_OFF),
-       GPIO_GROUP(BOOT_8, EE_OFF),
-       GPIO_GROUP(BOOT_9, EE_OFF),
-       GPIO_GROUP(BOOT_10, EE_OFF),
-       GPIO_GROUP(BOOT_11, EE_OFF),
-       GPIO_GROUP(BOOT_12, EE_OFF),
-       GPIO_GROUP(BOOT_13, EE_OFF),
-       GPIO_GROUP(BOOT_14, EE_OFF),
-       GPIO_GROUP(BOOT_15, EE_OFF),
-       GPIO_GROUP(BOOT_16, EE_OFF),
-       GPIO_GROUP(BOOT_17, EE_OFF),
-
-       GPIO_GROUP(CARD_0, EE_OFF),
-       GPIO_GROUP(CARD_1, EE_OFF),
-       GPIO_GROUP(CARD_2, EE_OFF),
-       GPIO_GROUP(CARD_3, EE_OFF),
-       GPIO_GROUP(CARD_4, EE_OFF),
-       GPIO_GROUP(CARD_5, EE_OFF),
-       GPIO_GROUP(CARD_6, EE_OFF),
-
-       GPIO_GROUP(GPIODV_0, EE_OFF),
-       GPIO_GROUP(GPIODV_1, EE_OFF),
-       GPIO_GROUP(GPIODV_2, EE_OFF),
-       GPIO_GROUP(GPIODV_3, EE_OFF),
-       GPIO_GROUP(GPIODV_4, EE_OFF),
-       GPIO_GROUP(GPIODV_5, EE_OFF),
-       GPIO_GROUP(GPIODV_6, EE_OFF),
-       GPIO_GROUP(GPIODV_7, EE_OFF),
-       GPIO_GROUP(GPIODV_8, EE_OFF),
-       GPIO_GROUP(GPIODV_9, EE_OFF),
-       GPIO_GROUP(GPIODV_10, EE_OFF),
-       GPIO_GROUP(GPIODV_11, EE_OFF),
-       GPIO_GROUP(GPIODV_12, EE_OFF),
-       GPIO_GROUP(GPIODV_13, EE_OFF),
-       GPIO_GROUP(GPIODV_14, EE_OFF),
-       GPIO_GROUP(GPIODV_15, EE_OFF),
-       GPIO_GROUP(GPIODV_16, EE_OFF),
-       GPIO_GROUP(GPIODV_17, EE_OFF),
-       GPIO_GROUP(GPIODV_19, EE_OFF),
-       GPIO_GROUP(GPIODV_20, EE_OFF),
-       GPIO_GROUP(GPIODV_21, EE_OFF),
-       GPIO_GROUP(GPIODV_22, EE_OFF),
-       GPIO_GROUP(GPIODV_23, EE_OFF),
-       GPIO_GROUP(GPIODV_24, EE_OFF),
-       GPIO_GROUP(GPIODV_25, EE_OFF),
-       GPIO_GROUP(GPIODV_26, EE_OFF),
-       GPIO_GROUP(GPIODV_27, EE_OFF),
-       GPIO_GROUP(GPIODV_28, EE_OFF),
-       GPIO_GROUP(GPIODV_29, EE_OFF),
-
-       GPIO_GROUP(GPIOY_0, EE_OFF),
-       GPIO_GROUP(GPIOY_1, EE_OFF),
-       GPIO_GROUP(GPIOY_2, EE_OFF),
-       GPIO_GROUP(GPIOY_3, EE_OFF),
-       GPIO_GROUP(GPIOY_4, EE_OFF),
-       GPIO_GROUP(GPIOY_5, EE_OFF),
-       GPIO_GROUP(GPIOY_6, EE_OFF),
-       GPIO_GROUP(GPIOY_7, EE_OFF),
-       GPIO_GROUP(GPIOY_8, EE_OFF),
-       GPIO_GROUP(GPIOY_9, EE_OFF),
-       GPIO_GROUP(GPIOY_10, EE_OFF),
-       GPIO_GROUP(GPIOY_11, EE_OFF),
-       GPIO_GROUP(GPIOY_12, EE_OFF),
-       GPIO_GROUP(GPIOY_13, EE_OFF),
-       GPIO_GROUP(GPIOY_14, EE_OFF),
-       GPIO_GROUP(GPIOY_15, EE_OFF),
-       GPIO_GROUP(GPIOY_16, EE_OFF),
-
-       GPIO_GROUP(GPIOX_0, EE_OFF),
-       GPIO_GROUP(GPIOX_1, EE_OFF),
-       GPIO_GROUP(GPIOX_2, EE_OFF),
-       GPIO_GROUP(GPIOX_3, EE_OFF),
-       GPIO_GROUP(GPIOX_4, EE_OFF),
-       GPIO_GROUP(GPIOX_5, EE_OFF),
-       GPIO_GROUP(GPIOX_6, EE_OFF),
-       GPIO_GROUP(GPIOX_7, EE_OFF),
-       GPIO_GROUP(GPIOX_8, EE_OFF),
-       GPIO_GROUP(GPIOX_9, EE_OFF),
-       GPIO_GROUP(GPIOX_10, EE_OFF),
-       GPIO_GROUP(GPIOX_11, EE_OFF),
-       GPIO_GROUP(GPIOX_12, EE_OFF),
-       GPIO_GROUP(GPIOX_13, EE_OFF),
-       GPIO_GROUP(GPIOX_14, EE_OFF),
-       GPIO_GROUP(GPIOX_15, EE_OFF),
-       GPIO_GROUP(GPIOX_16, EE_OFF),
-       GPIO_GROUP(GPIOX_17, EE_OFF),
-       GPIO_GROUP(GPIOX_18, EE_OFF),
-       GPIO_GROUP(GPIOX_19, EE_OFF),
-       GPIO_GROUP(GPIOX_20, EE_OFF),
-       GPIO_GROUP(GPIOX_21, EE_OFF),
-       GPIO_GROUP(GPIOX_22, EE_OFF),
-
-       GPIO_GROUP(GPIOCLK_0, EE_OFF),
-       GPIO_GROUP(GPIOCLK_1, EE_OFF),
-       GPIO_GROUP(GPIOCLK_2, EE_OFF),
-       GPIO_GROUP(GPIOCLK_3, EE_OFF),
-
-       GPIO_GROUP(GPIO_TEST_N, EE_OFF),
+       GPIO_GROUP(GPIOZ_0),
+       GPIO_GROUP(GPIOZ_1),
+       GPIO_GROUP(GPIOZ_2),
+       GPIO_GROUP(GPIOZ_3),
+       GPIO_GROUP(GPIOZ_4),
+       GPIO_GROUP(GPIOZ_5),
+       GPIO_GROUP(GPIOZ_6),
+       GPIO_GROUP(GPIOZ_7),
+       GPIO_GROUP(GPIOZ_8),
+       GPIO_GROUP(GPIOZ_9),
+       GPIO_GROUP(GPIOZ_10),
+       GPIO_GROUP(GPIOZ_11),
+       GPIO_GROUP(GPIOZ_12),
+       GPIO_GROUP(GPIOZ_13),
+       GPIO_GROUP(GPIOZ_14),
+       GPIO_GROUP(GPIOZ_15),
+
+       GPIO_GROUP(GPIOH_0),
+       GPIO_GROUP(GPIOH_1),
+       GPIO_GROUP(GPIOH_2),
+       GPIO_GROUP(GPIOH_3),
+
+       GPIO_GROUP(BOOT_0),
+       GPIO_GROUP(BOOT_1),
+       GPIO_GROUP(BOOT_2),
+       GPIO_GROUP(BOOT_3),
+       GPIO_GROUP(BOOT_4),
+       GPIO_GROUP(BOOT_5),
+       GPIO_GROUP(BOOT_6),
+       GPIO_GROUP(BOOT_7),
+       GPIO_GROUP(BOOT_8),
+       GPIO_GROUP(BOOT_9),
+       GPIO_GROUP(BOOT_10),
+       GPIO_GROUP(BOOT_11),
+       GPIO_GROUP(BOOT_12),
+       GPIO_GROUP(BOOT_13),
+       GPIO_GROUP(BOOT_14),
+       GPIO_GROUP(BOOT_15),
+       GPIO_GROUP(BOOT_16),
+       GPIO_GROUP(BOOT_17),
+
+       GPIO_GROUP(CARD_0),
+       GPIO_GROUP(CARD_1),
+       GPIO_GROUP(CARD_2),
+       GPIO_GROUP(CARD_3),
+       GPIO_GROUP(CARD_4),
+       GPIO_GROUP(CARD_5),
+       GPIO_GROUP(CARD_6),
+
+       GPIO_GROUP(GPIODV_0),
+       GPIO_GROUP(GPIODV_1),
+       GPIO_GROUP(GPIODV_2),
+       GPIO_GROUP(GPIODV_3),
+       GPIO_GROUP(GPIODV_4),
+       GPIO_GROUP(GPIODV_5),
+       GPIO_GROUP(GPIODV_6),
+       GPIO_GROUP(GPIODV_7),
+       GPIO_GROUP(GPIODV_8),
+       GPIO_GROUP(GPIODV_9),
+       GPIO_GROUP(GPIODV_10),
+       GPIO_GROUP(GPIODV_11),
+       GPIO_GROUP(GPIODV_12),
+       GPIO_GROUP(GPIODV_13),
+       GPIO_GROUP(GPIODV_14),
+       GPIO_GROUP(GPIODV_15),
+       GPIO_GROUP(GPIODV_16),
+       GPIO_GROUP(GPIODV_17),
+       GPIO_GROUP(GPIODV_19),
+       GPIO_GROUP(GPIODV_20),
+       GPIO_GROUP(GPIODV_21),
+       GPIO_GROUP(GPIODV_22),
+       GPIO_GROUP(GPIODV_23),
+       GPIO_GROUP(GPIODV_24),
+       GPIO_GROUP(GPIODV_25),
+       GPIO_GROUP(GPIODV_26),
+       GPIO_GROUP(GPIODV_27),
+       GPIO_GROUP(GPIODV_28),
+       GPIO_GROUP(GPIODV_29),
+
+       GPIO_GROUP(GPIOY_0),
+       GPIO_GROUP(GPIOY_1),
+       GPIO_GROUP(GPIOY_2),
+       GPIO_GROUP(GPIOY_3),
+       GPIO_GROUP(GPIOY_4),
+       GPIO_GROUP(GPIOY_5),
+       GPIO_GROUP(GPIOY_6),
+       GPIO_GROUP(GPIOY_7),
+       GPIO_GROUP(GPIOY_8),
+       GPIO_GROUP(GPIOY_9),
+       GPIO_GROUP(GPIOY_10),
+       GPIO_GROUP(GPIOY_11),
+       GPIO_GROUP(GPIOY_12),
+       GPIO_GROUP(GPIOY_13),
+       GPIO_GROUP(GPIOY_14),
+       GPIO_GROUP(GPIOY_15),
+       GPIO_GROUP(GPIOY_16),
+
+       GPIO_GROUP(GPIOX_0),
+       GPIO_GROUP(GPIOX_1),
+       GPIO_GROUP(GPIOX_2),
+       GPIO_GROUP(GPIOX_3),
+       GPIO_GROUP(GPIOX_4),
+       GPIO_GROUP(GPIOX_5),
+       GPIO_GROUP(GPIOX_6),
+       GPIO_GROUP(GPIOX_7),
+       GPIO_GROUP(GPIOX_8),
+       GPIO_GROUP(GPIOX_9),
+       GPIO_GROUP(GPIOX_10),
+       GPIO_GROUP(GPIOX_11),
+       GPIO_GROUP(GPIOX_12),
+       GPIO_GROUP(GPIOX_13),
+       GPIO_GROUP(GPIOX_14),
+       GPIO_GROUP(GPIOX_15),
+       GPIO_GROUP(GPIOX_16),
+       GPIO_GROUP(GPIOX_17),
+       GPIO_GROUP(GPIOX_18),
+       GPIO_GROUP(GPIOX_19),
+       GPIO_GROUP(GPIOX_20),
+       GPIO_GROUP(GPIOX_21),
+       GPIO_GROUP(GPIOX_22),
+
+       GPIO_GROUP(GPIOCLK_0),
+       GPIO_GROUP(GPIOCLK_1),
+       GPIO_GROUP(GPIOCLK_2),
+       GPIO_GROUP(GPIOCLK_3),
+
+       GPIO_GROUP(GPIO_TEST_N),
 
        /* Bank X */
        GROUP(sdio_d0,          8,      5),
@@ -522,20 +521,20 @@ static struct meson_pmx_group meson_gxbb_periphs_groups[] = {
 };
 
 static struct meson_pmx_group meson_gxbb_aobus_groups[] = {
-       GPIO_GROUP(GPIOAO_0, 0),
-       GPIO_GROUP(GPIOAO_1, 0),
-       GPIO_GROUP(GPIOAO_2, 0),
-       GPIO_GROUP(GPIOAO_3, 0),
-       GPIO_GROUP(GPIOAO_4, 0),
-       GPIO_GROUP(GPIOAO_5, 0),
-       GPIO_GROUP(GPIOAO_6, 0),
-       GPIO_GROUP(GPIOAO_7, 0),
-       GPIO_GROUP(GPIOAO_8, 0),
-       GPIO_GROUP(GPIOAO_9, 0),
-       GPIO_GROUP(GPIOAO_10, 0),
-       GPIO_GROUP(GPIOAO_11, 0),
-       GPIO_GROUP(GPIOAO_12, 0),
-       GPIO_GROUP(GPIOAO_13, 0),
+       GPIO_GROUP(GPIOAO_0),
+       GPIO_GROUP(GPIOAO_1),
+       GPIO_GROUP(GPIOAO_2),
+       GPIO_GROUP(GPIOAO_3),
+       GPIO_GROUP(GPIOAO_4),
+       GPIO_GROUP(GPIOAO_5),
+       GPIO_GROUP(GPIOAO_6),
+       GPIO_GROUP(GPIOAO_7),
+       GPIO_GROUP(GPIOAO_8),
+       GPIO_GROUP(GPIOAO_9),
+       GPIO_GROUP(GPIOAO_10),
+       GPIO_GROUP(GPIOAO_11),
+       GPIO_GROUP(GPIOAO_12),
+       GPIO_GROUP(GPIOAO_13),
 
        /* bank AO */
        GROUP(uart_tx_ao_b,     0,      24),
@@ -565,6 +564,9 @@ static struct meson_pmx_group meson_gxbb_aobus_groups[] = {
        GROUP(spdif_out_ao_13,  0,      4),
        GROUP(ao_cec,           0,      15),
        GROUP(ee_cec,           0,      14),
+
+       /* test n pin */
+       GROUP(i2s_out_ch67_ao,  1,      2),
 };
 
 static const char * const gpio_periphs_groups[] = {
@@ -600,8 +602,6 @@ static const char * const gpio_periphs_groups[] = {
        "GPIOX_10", "GPIOX_11", "GPIOX_12", "GPIOX_13", "GPIOX_14",
        "GPIOX_15", "GPIOX_16", "GPIOX_17", "GPIOX_18", "GPIOX_19",
        "GPIOX_20", "GPIOX_21", "GPIOX_22",
-
-       "GPIO_TEST_N",
 };
 
 static const char * const emmc_groups[] = {
@@ -710,6 +710,8 @@ static const char * const gpio_aobus_groups[] = {
        "GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3", "GPIOAO_4",
        "GPIOAO_5", "GPIOAO_6", "GPIOAO_7", "GPIOAO_8", "GPIOAO_9",
        "GPIOAO_10", "GPIOAO_11", "GPIOAO_12", "GPIOAO_13",
+
+       "GPIO_TEST_N",
 };
 
 static const char * const uart_ao_groups[] = {
@@ -751,6 +753,7 @@ static const char * const pwm_ao_b_groups[] = {
 static const char * const i2s_out_ao_groups[] = {
        "i2s_am_clk", "i2s_out_ao_clk", "i2s_out_lr_clk",
        "i2s_out_ch01_ao", "i2s_out_ch23_ao", "i2s_out_ch45_ao",
+       "i2s_out_ch67_ao",
 };
 
 static const char * const spdif_out_ao_groups[] = {
@@ -806,25 +809,24 @@ static struct meson_pmx_func meson_gxbb_aobus_functions[] = {
 };
 
 static struct meson_bank meson_gxbb_periphs_banks[] = {
-       /*   name    first                      last                    irq       pullen  pull    dir     out     in  */
-       BANK("X",    PIN(GPIOX_0, EE_OFF),      PIN(GPIOX_22, EE_OFF),  106, 128, 4,  0,  4,  0,  12, 0,  13, 0,  14, 0),
-       BANK("Y",    PIN(GPIOY_0, EE_OFF),      PIN(GPIOY_16, EE_OFF),   89, 105, 1,  0,  1,  0,  3,  0,  4,  0,  5,  0),
-       BANK("DV",   PIN(GPIODV_0, EE_OFF),     PIN(GPIODV_29, EE_OFF),  59,  88, 0,  0,  0,  0,  0,  0,  1,  0,  2,  0),
-       BANK("H",    PIN(GPIOH_0, EE_OFF),      PIN(GPIOH_3, EE_OFF),    30,  33, 1, 20,  1, 20,  3, 20,  4, 20,  5, 20),
-       BANK("Z",    PIN(GPIOZ_0, EE_OFF),      PIN(GPIOZ_15, EE_OFF),   14,  29, 3,  0,  3,  0,  9,  0,  10, 0, 11,  0),
-       BANK("CARD", PIN(CARD_0, EE_OFF),       PIN(CARD_6, EE_OFF),     52,  58, 2, 20,  2, 20,  6, 20,  7, 20,  8, 20),
-       BANK("BOOT", PIN(BOOT_0, EE_OFF),       PIN(BOOT_17, EE_OFF),    34,  51, 2,  0,  2,  0,  6,  0,  7,  0,  8,  0),
-       BANK("CLK",  PIN(GPIOCLK_0, EE_OFF),    PIN(GPIOCLK_3, EE_OFF), 129, 132, 3, 28,  3, 28,  9, 28, 10, 28, 11, 28),
+       /*   name    first      last       irq       pullen  pull    dir     out     in  */
+       BANK("X",    GPIOX_0,   GPIOX_22,  106, 128, 4,  0,  4,  0,  12, 0,  13, 0,  14, 0),
+       BANK("Y",    GPIOY_0,   GPIOY_16,   89, 105, 1,  0,  1,  0,  3,  0,  4,  0,  5,  0),
+       BANK("DV",   GPIODV_0,  GPIODV_29,  59,  88, 0,  0,  0,  0,  0,  0,  1,  0,  2,  0),
+       BANK("H",    GPIOH_0,   GPIOH_3,    30,  33, 1, 20,  1, 20,  3, 20,  4, 20,  5, 20),
+       BANK("Z",    GPIOZ_0,   GPIOZ_15,   14,  29, 3,  0,  3,  0,  9,  0,  10, 0, 11,  0),
+       BANK("CARD", CARD_0,    CARD_6,     52,  58, 2, 20,  2, 20,  6, 20,  7, 20,  8, 20),
+       BANK("BOOT", BOOT_0,    BOOT_17,    34,  51, 2,  0,  2,  0,  6,  0,  7,  0,  8,  0),
+       BANK("CLK",  GPIOCLK_0, GPIOCLK_3, 129, 132, 3, 28,  3, 28,  9, 28, 10, 28, 11, 28),
 };
 
 static struct meson_bank meson_gxbb_aobus_banks[] = {
-       /*   name    first              last               irq    pullen  pull    dir     out     in  */
-       BANK("AO",   PIN(GPIOAO_0, 0),  PIN(GPIOAO_13, 0), 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
+       /*   name    first      last       irq    pullen  pull    dir     out     in  */
+       BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
        .name           = "periphs-banks",
-       .pin_base       = 14,
        .pins           = meson_gxbb_periphs_pins,
        .groups         = meson_gxbb_periphs_groups,
        .funcs          = meson_gxbb_periphs_functions,
@@ -833,11 +835,11 @@ struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
        .num_groups     = ARRAY_SIZE(meson_gxbb_periphs_groups),
        .num_funcs      = ARRAY_SIZE(meson_gxbb_periphs_functions),
        .num_banks      = ARRAY_SIZE(meson_gxbb_periphs_banks),
+       .pmx_ops        = &meson8_pmx_ops,
 };
 
-struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
        .name           = "aobus-banks",
-       .pin_base       = 0,
        .pins           = meson_gxbb_aobus_pins,
        .groups         = meson_gxbb_aobus_groups,
        .funcs          = meson_gxbb_aobus_functions,
@@ -846,4 +848,26 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
        .num_groups     = ARRAY_SIZE(meson_gxbb_aobus_groups),
        .num_funcs      = ARRAY_SIZE(meson_gxbb_aobus_functions),
        .num_banks      = ARRAY_SIZE(meson_gxbb_aobus_banks),
+       .pmx_ops        = &meson8_pmx_ops,
+};
+
+static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson-gxbb-periphs-pinctrl",
+               .data = &meson_gxbb_periphs_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson-gxbb-aobus-pinctrl",
+               .data = &meson_gxbb_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson_gxbb_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson-gxbb-pinctrl",
+               .of_match_table = meson_gxbb_pinctrl_dt_match,
+       },
 };
+builtin_platform_driver(meson_gxbb_pinctrl_driver);
index 36c14b85fc7cde0caf54330423c38d4092bde04a..b3786cde963d526ea44743421e2162ffe49426bc 100644 (file)
 
 #include <dt-bindings/gpio/meson-gxl-gpio.h>
 #include "pinctrl-meson.h"
-
-#define EE_OFF 10
+#include "pinctrl-meson8-pmx.h"
 
 static const struct pinctrl_pin_desc meson_gxl_periphs_pins[] = {
-       MESON_PIN(GPIOZ_0, EE_OFF),
-       MESON_PIN(GPIOZ_1, EE_OFF),
-       MESON_PIN(GPIOZ_2, EE_OFF),
-       MESON_PIN(GPIOZ_3, EE_OFF),
-       MESON_PIN(GPIOZ_4, EE_OFF),
-       MESON_PIN(GPIOZ_5, EE_OFF),
-       MESON_PIN(GPIOZ_6, EE_OFF),
-       MESON_PIN(GPIOZ_7, EE_OFF),
-       MESON_PIN(GPIOZ_8, EE_OFF),
-       MESON_PIN(GPIOZ_9, EE_OFF),
-       MESON_PIN(GPIOZ_10, EE_OFF),
-       MESON_PIN(GPIOZ_11, EE_OFF),
-       MESON_PIN(GPIOZ_12, EE_OFF),
-       MESON_PIN(GPIOZ_13, EE_OFF),
-       MESON_PIN(GPIOZ_14, EE_OFF),
-       MESON_PIN(GPIOZ_15, EE_OFF),
-
-       MESON_PIN(GPIOH_0, EE_OFF),
-       MESON_PIN(GPIOH_1, EE_OFF),
-       MESON_PIN(GPIOH_2, EE_OFF),
-       MESON_PIN(GPIOH_3, EE_OFF),
-       MESON_PIN(GPIOH_4, EE_OFF),
-       MESON_PIN(GPIOH_5, EE_OFF),
-       MESON_PIN(GPIOH_6, EE_OFF),
-       MESON_PIN(GPIOH_7, EE_OFF),
-       MESON_PIN(GPIOH_8, EE_OFF),
-       MESON_PIN(GPIOH_9, EE_OFF),
-
-       MESON_PIN(BOOT_0, EE_OFF),
-       MESON_PIN(BOOT_1, EE_OFF),
-       MESON_PIN(BOOT_2, EE_OFF),
-       MESON_PIN(BOOT_3, EE_OFF),
-       MESON_PIN(BOOT_4, EE_OFF),
-       MESON_PIN(BOOT_5, EE_OFF),
-       MESON_PIN(BOOT_6, EE_OFF),
-       MESON_PIN(BOOT_7, EE_OFF),
-       MESON_PIN(BOOT_8, EE_OFF),
-       MESON_PIN(BOOT_9, EE_OFF),
-       MESON_PIN(BOOT_10, EE_OFF),
-       MESON_PIN(BOOT_11, EE_OFF),
-       MESON_PIN(BOOT_12, EE_OFF),
-       MESON_PIN(BOOT_13, EE_OFF),
-       MESON_PIN(BOOT_14, EE_OFF),
-       MESON_PIN(BOOT_15, EE_OFF),
-
-       MESON_PIN(CARD_0, EE_OFF),
-       MESON_PIN(CARD_1, EE_OFF),
-       MESON_PIN(CARD_2, EE_OFF),
-       MESON_PIN(CARD_3, EE_OFF),
-       MESON_PIN(CARD_4, EE_OFF),
-       MESON_PIN(CARD_5, EE_OFF),
-       MESON_PIN(CARD_6, EE_OFF),
-
-       MESON_PIN(GPIODV_0, EE_OFF),
-       MESON_PIN(GPIODV_1, EE_OFF),
-       MESON_PIN(GPIODV_2, EE_OFF),
-       MESON_PIN(GPIODV_3, EE_OFF),
-       MESON_PIN(GPIODV_4, EE_OFF),
-       MESON_PIN(GPIODV_5, EE_OFF),
-       MESON_PIN(GPIODV_6, EE_OFF),
-       MESON_PIN(GPIODV_7, EE_OFF),
-       MESON_PIN(GPIODV_8, EE_OFF),
-       MESON_PIN(GPIODV_9, EE_OFF),
-       MESON_PIN(GPIODV_10, EE_OFF),
-       MESON_PIN(GPIODV_11, EE_OFF),
-       MESON_PIN(GPIODV_12, EE_OFF),
-       MESON_PIN(GPIODV_13, EE_OFF),
-       MESON_PIN(GPIODV_14, EE_OFF),
-       MESON_PIN(GPIODV_15, EE_OFF),
-       MESON_PIN(GPIODV_16, EE_OFF),
-       MESON_PIN(GPIODV_17, EE_OFF),
-       MESON_PIN(GPIODV_18, EE_OFF),
-       MESON_PIN(GPIODV_19, EE_OFF),
-       MESON_PIN(GPIODV_20, EE_OFF),
-       MESON_PIN(GPIODV_21, EE_OFF),
-       MESON_PIN(GPIODV_22, EE_OFF),
-       MESON_PIN(GPIODV_23, EE_OFF),
-       MESON_PIN(GPIODV_24, EE_OFF),
-       MESON_PIN(GPIODV_25, EE_OFF),
-       MESON_PIN(GPIODV_26, EE_OFF),
-       MESON_PIN(GPIODV_27, EE_OFF),
-       MESON_PIN(GPIODV_28, EE_OFF),
-       MESON_PIN(GPIODV_29, EE_OFF),
-
-       MESON_PIN(GPIOX_0, EE_OFF),
-       MESON_PIN(GPIOX_1, EE_OFF),
-       MESON_PIN(GPIOX_2, EE_OFF),
-       MESON_PIN(GPIOX_3, EE_OFF),
-       MESON_PIN(GPIOX_4, EE_OFF),
-       MESON_PIN(GPIOX_5, EE_OFF),
-       MESON_PIN(GPIOX_6, EE_OFF),
-       MESON_PIN(GPIOX_7, EE_OFF),
-       MESON_PIN(GPIOX_8, EE_OFF),
-       MESON_PIN(GPIOX_9, EE_OFF),
-       MESON_PIN(GPIOX_10, EE_OFF),
-       MESON_PIN(GPIOX_11, EE_OFF),
-       MESON_PIN(GPIOX_12, EE_OFF),
-       MESON_PIN(GPIOX_13, EE_OFF),
-       MESON_PIN(GPIOX_14, EE_OFF),
-       MESON_PIN(GPIOX_15, EE_OFF),
-       MESON_PIN(GPIOX_16, EE_OFF),
-       MESON_PIN(GPIOX_17, EE_OFF),
-       MESON_PIN(GPIOX_18, EE_OFF),
-
-       MESON_PIN(GPIOCLK_0, EE_OFF),
-       MESON_PIN(GPIOCLK_1, EE_OFF),
-
-       MESON_PIN(GPIO_TEST_N, EE_OFF),
+       MESON_PIN(GPIOZ_0),
+       MESON_PIN(GPIOZ_1),
+       MESON_PIN(GPIOZ_2),
+       MESON_PIN(GPIOZ_3),
+       MESON_PIN(GPIOZ_4),
+       MESON_PIN(GPIOZ_5),
+       MESON_PIN(GPIOZ_6),
+       MESON_PIN(GPIOZ_7),
+       MESON_PIN(GPIOZ_8),
+       MESON_PIN(GPIOZ_9),
+       MESON_PIN(GPIOZ_10),
+       MESON_PIN(GPIOZ_11),
+       MESON_PIN(GPIOZ_12),
+       MESON_PIN(GPIOZ_13),
+       MESON_PIN(GPIOZ_14),
+       MESON_PIN(GPIOZ_15),
+
+       MESON_PIN(GPIOH_0),
+       MESON_PIN(GPIOH_1),
+       MESON_PIN(GPIOH_2),
+       MESON_PIN(GPIOH_3),
+       MESON_PIN(GPIOH_4),
+       MESON_PIN(GPIOH_5),
+       MESON_PIN(GPIOH_6),
+       MESON_PIN(GPIOH_7),
+       MESON_PIN(GPIOH_8),
+       MESON_PIN(GPIOH_9),
+
+       MESON_PIN(BOOT_0),
+       MESON_PIN(BOOT_1),
+       MESON_PIN(BOOT_2),
+       MESON_PIN(BOOT_3),
+       MESON_PIN(BOOT_4),
+       MESON_PIN(BOOT_5),
+       MESON_PIN(BOOT_6),
+       MESON_PIN(BOOT_7),
+       MESON_PIN(BOOT_8),
+       MESON_PIN(BOOT_9),
+       MESON_PIN(BOOT_10),
+       MESON_PIN(BOOT_11),
+       MESON_PIN(BOOT_12),
+       MESON_PIN(BOOT_13),
+       MESON_PIN(BOOT_14),
+       MESON_PIN(BOOT_15),
+
+       MESON_PIN(CARD_0),
+       MESON_PIN(CARD_1),
+       MESON_PIN(CARD_2),
+       MESON_PIN(CARD_3),
+       MESON_PIN(CARD_4),
+       MESON_PIN(CARD_5),
+       MESON_PIN(CARD_6),
+
+       MESON_PIN(GPIODV_0),
+       MESON_PIN(GPIODV_1),
+       MESON_PIN(GPIODV_2),
+       MESON_PIN(GPIODV_3),
+       MESON_PIN(GPIODV_4),
+       MESON_PIN(GPIODV_5),
+       MESON_PIN(GPIODV_6),
+       MESON_PIN(GPIODV_7),
+       MESON_PIN(GPIODV_8),
+       MESON_PIN(GPIODV_9),
+       MESON_PIN(GPIODV_10),
+       MESON_PIN(GPIODV_11),
+       MESON_PIN(GPIODV_12),
+       MESON_PIN(GPIODV_13),
+       MESON_PIN(GPIODV_14),
+       MESON_PIN(GPIODV_15),
+       MESON_PIN(GPIODV_16),
+       MESON_PIN(GPIODV_17),
+       MESON_PIN(GPIODV_18),
+       MESON_PIN(GPIODV_19),
+       MESON_PIN(GPIODV_20),
+       MESON_PIN(GPIODV_21),
+       MESON_PIN(GPIODV_22),
+       MESON_PIN(GPIODV_23),
+       MESON_PIN(GPIODV_24),
+       MESON_PIN(GPIODV_25),
+       MESON_PIN(GPIODV_26),
+       MESON_PIN(GPIODV_27),
+       MESON_PIN(GPIODV_28),
+       MESON_PIN(GPIODV_29),
+
+       MESON_PIN(GPIOX_0),
+       MESON_PIN(GPIOX_1),
+       MESON_PIN(GPIOX_2),
+       MESON_PIN(GPIOX_3),
+       MESON_PIN(GPIOX_4),
+       MESON_PIN(GPIOX_5),
+       MESON_PIN(GPIOX_6),
+       MESON_PIN(GPIOX_7),
+       MESON_PIN(GPIOX_8),
+       MESON_PIN(GPIOX_9),
+       MESON_PIN(GPIOX_10),
+       MESON_PIN(GPIOX_11),
+       MESON_PIN(GPIOX_12),
+       MESON_PIN(GPIOX_13),
+       MESON_PIN(GPIOX_14),
+       MESON_PIN(GPIOX_15),
+       MESON_PIN(GPIOX_16),
+       MESON_PIN(GPIOX_17),
+       MESON_PIN(GPIOX_18),
+
+       MESON_PIN(GPIOCLK_0),
+       MESON_PIN(GPIOCLK_1),
 };
 
 static const unsigned int emmc_nand_d07_pins[] = {
-       PIN(BOOT_0, EE_OFF), PIN(BOOT_1, EE_OFF), PIN(BOOT_2, EE_OFF),
-       PIN(BOOT_3, EE_OFF), PIN(BOOT_4, EE_OFF), PIN(BOOT_5, EE_OFF),
-       PIN(BOOT_6, EE_OFF), PIN(BOOT_7, EE_OFF),
-};
-static const unsigned int emmc_clk_pins[] = { PIN(BOOT_8, EE_OFF) };
-static const unsigned int emmc_cmd_pins[] = { PIN(BOOT_10, EE_OFF) };
-static const unsigned int emmc_ds_pins[] = { PIN(BOOT_15, EE_OFF) };
-
-static const unsigned int nor_d_pins[]         = { PIN(BOOT_11, EE_OFF) };
-static const unsigned int nor_q_pins[]         = { PIN(BOOT_12, EE_OFF) };
-static const unsigned int nor_c_pins[]         = { PIN(BOOT_13, EE_OFF) };
-static const unsigned int nor_cs_pins[]                = { PIN(BOOT_15, EE_OFF) };
-
-static const unsigned int spi_mosi_pins[]      = { PIN(GPIOX_8, EE_OFF) };
-static const unsigned int spi_miso_pins[]      = { PIN(GPIOX_9, EE_OFF) };
-static const unsigned int spi_ss0_pins[]       = { PIN(GPIOX_10, EE_OFF) };
-static const unsigned int spi_sclk_pins[]      = { PIN(GPIOX_11, EE_OFF) };
-
-static const unsigned int sdcard_d0_pins[] = { PIN(CARD_1, EE_OFF) };
-static const unsigned int sdcard_d1_pins[] = { PIN(CARD_0, EE_OFF) };
-static const unsigned int sdcard_d2_pins[] = { PIN(CARD_5, EE_OFF) };
-static const unsigned int sdcard_d3_pins[] = { PIN(CARD_4, EE_OFF) };
-static const unsigned int sdcard_cmd_pins[] = { PIN(CARD_3, EE_OFF) };
-static const unsigned int sdcard_clk_pins[] = { PIN(CARD_2, EE_OFF) };
-
-static const unsigned int sdio_d0_pins[] = { PIN(GPIOX_0, EE_OFF) };
-static const unsigned int sdio_d1_pins[] = { PIN(GPIOX_1, EE_OFF) };
-static const unsigned int sdio_d2_pins[] = { PIN(GPIOX_2, EE_OFF) };
-static const unsigned int sdio_d3_pins[] = { PIN(GPIOX_3, EE_OFF) };
-static const unsigned int sdio_cmd_pins[] = { PIN(GPIOX_4, EE_OFF) };
-static const unsigned int sdio_clk_pins[] = { PIN(GPIOX_5, EE_OFF) };
-static const unsigned int sdio_irq_pins[] = { PIN(GPIOX_7, EE_OFF) };
-
-static const unsigned int nand_ce0_pins[]      = { PIN(BOOT_8, EE_OFF) };
-static const unsigned int nand_ce1_pins[]      = { PIN(BOOT_9, EE_OFF) };
-static const unsigned int nand_rb0_pins[]      = { PIN(BOOT_10, EE_OFF) };
-static const unsigned int nand_ale_pins[]      = { PIN(BOOT_11, EE_OFF) };
-static const unsigned int nand_cle_pins[]      = { PIN(BOOT_12, EE_OFF) };
-static const unsigned int nand_wen_clk_pins[]  = { PIN(BOOT_13, EE_OFF) };
-static const unsigned int nand_ren_wr_pins[]   = { PIN(BOOT_14, EE_OFF) };
-static const unsigned int nand_dqs_pins[]      = { PIN(BOOT_15, EE_OFF) };
-
-static const unsigned int uart_tx_a_pins[]     = { PIN(GPIOX_12, EE_OFF) };
-static const unsigned int uart_rx_a_pins[]     = { PIN(GPIOX_13, EE_OFF) };
-static const unsigned int uart_cts_a_pins[]    = { PIN(GPIOX_14, EE_OFF) };
-static const unsigned int uart_rts_a_pins[]    = { PIN(GPIOX_15, EE_OFF) };
-
-static const unsigned int uart_tx_b_pins[]     = { PIN(GPIODV_24, EE_OFF) };
-static const unsigned int uart_rx_b_pins[]     = { PIN(GPIODV_25, EE_OFF) };
-static const unsigned int uart_cts_b_pins[]    = { PIN(GPIODV_26, EE_OFF) };
-static const unsigned int uart_rts_b_pins[]    = { PIN(GPIODV_27, EE_OFF) };
-
-static const unsigned int uart_tx_c_pins[]     = { PIN(GPIOX_8, EE_OFF) };
-static const unsigned int uart_rx_c_pins[]     = { PIN(GPIOX_9, EE_OFF) };
-static const unsigned int uart_cts_c_pins[]    = { PIN(GPIOX_10, EE_OFF) };
-static const unsigned int uart_rts_c_pins[]    = { PIN(GPIOX_11, EE_OFF) };
-
-static const unsigned int i2c_sck_a_pins[]     = { PIN(GPIODV_25, EE_OFF) };
-static const unsigned int i2c_sda_a_pins[]     = { PIN(GPIODV_24, EE_OFF) };
-
-static const unsigned int i2c_sck_b_pins[]     = { PIN(GPIODV_27, EE_OFF) };
-static const unsigned int i2c_sda_b_pins[]     = { PIN(GPIODV_26, EE_OFF) };
-
-static const unsigned int i2c_sck_c_pins[]     = { PIN(GPIODV_29, EE_OFF) };
-static const unsigned int i2c_sda_c_pins[]     = { PIN(GPIODV_28, EE_OFF) };
-
-static const unsigned int i2c_sck_c_dv19_pins[]        = { PIN(GPIODV_19, EE_OFF) };
-static const unsigned int i2c_sda_c_dv18_pins[]        = { PIN(GPIODV_18, EE_OFF) };
-
-static const unsigned int eth_mdio_pins[]      = { PIN(GPIOZ_0, EE_OFF) };
-static const unsigned int eth_mdc_pins[]       = { PIN(GPIOZ_1, EE_OFF) };
-static const unsigned int eth_clk_rx_clk_pins[]        = { PIN(GPIOZ_2, EE_OFF) };
-static const unsigned int eth_rx_dv_pins[]     = { PIN(GPIOZ_3, EE_OFF) };
-static const unsigned int eth_rxd0_pins[]      = { PIN(GPIOZ_4, EE_OFF) };
-static const unsigned int eth_rxd1_pins[]      = { PIN(GPIOZ_5, EE_OFF) };
-static const unsigned int eth_rxd2_pins[]      = { PIN(GPIOZ_6, EE_OFF) };
-static const unsigned int eth_rxd3_pins[]      = { PIN(GPIOZ_7, EE_OFF) };
-static const unsigned int eth_rgmii_tx_clk_pins[] = { PIN(GPIOZ_8, EE_OFF) };
-static const unsigned int eth_tx_en_pins[]     = { PIN(GPIOZ_9, EE_OFF) };
-static const unsigned int eth_txd0_pins[]      = { PIN(GPIOZ_10, EE_OFF) };
-static const unsigned int eth_txd1_pins[]      = { PIN(GPIOZ_11, EE_OFF) };
-static const unsigned int eth_txd2_pins[]      = { PIN(GPIOZ_12, EE_OFF) };
-static const unsigned int eth_txd3_pins[]      = { PIN(GPIOZ_13, EE_OFF) };
-
-static const unsigned int pwm_a_pins[]         = { PIN(GPIOX_6, EE_OFF) };
-
-static const unsigned int pwm_b_pins[]         = { PIN(GPIODV_29, EE_OFF) };
-
-static const unsigned int pwm_c_pins[]         = { PIN(GPIOZ_15, EE_OFF) };
-
-static const unsigned int pwm_d_pins[]         = { PIN(GPIODV_28, EE_OFF) };
-
-static const unsigned int pwm_e_pins[]         = { PIN(GPIOX_16, EE_OFF) };
-
-static const unsigned int pwm_f_clk_pins[]     = { PIN(GPIOCLK_1, EE_OFF) };
-static const unsigned int pwm_f_x_pins[]       = { PIN(GPIOX_7, EE_OFF) };
-
-static const unsigned int hdmi_hpd_pins[]      = { PIN(GPIOH_0, EE_OFF) };
-static const unsigned int hdmi_sda_pins[]      = { PIN(GPIOH_1, EE_OFF) };
-static const unsigned int hdmi_scl_pins[]      = { PIN(GPIOH_2, EE_OFF) };
-
-static const unsigned int i2s_am_clk_pins[]    = { PIN(GPIOH_6, EE_OFF) };
-static const unsigned int i2s_out_ao_clk_pins[]        = { PIN(GPIOH_7, EE_OFF) };
-static const unsigned int i2s_out_lr_clk_pins[]        = { PIN(GPIOH_8, EE_OFF) };
-static const unsigned int i2s_out_ch01_pins[]  = { PIN(GPIOH_9, EE_OFF) };
-static const unsigned int i2s_out_ch23_z_pins[]        = { PIN(GPIOZ_5, EE_OFF) };
-static const unsigned int i2s_out_ch45_z_pins[]        = { PIN(GPIOZ_6, EE_OFF) };
-static const unsigned int i2s_out_ch67_z_pins[]        = { PIN(GPIOZ_7, EE_OFF) };
-
-static const unsigned int spdif_out_h_pins[]   = { PIN(GPIOH_4, EE_OFF) };
-
-static const unsigned int eth_link_led_pins[]  = { PIN(GPIOZ_14, EE_OFF) };
-static const unsigned int eth_act_led_pins[]   = { PIN(GPIOZ_15, EE_OFF) };
-
-static const unsigned int tsin_a_d0_pins[]     = { PIN(GPIODV_0, EE_OFF) };
-static const unsigned int tsin_a_d0_x_pins[]   = { PIN(GPIOX_10, EE_OFF) };
-static const unsigned int tsin_a_clk_pins[]    = { PIN(GPIODV_8, EE_OFF) };
-static const unsigned int tsin_a_clk_x_pins[]  = { PIN(GPIOX_11, EE_OFF) };
-static const unsigned int tsin_a_sop_pins[]    = { PIN(GPIODV_9, EE_OFF) };
-static const unsigned int tsin_a_sop_x_pins[]  = { PIN(GPIOX_8, EE_OFF) };
-static const unsigned int tsin_a_d_valid_pins[]        = { PIN(GPIODV_10, EE_OFF) };
-static const unsigned int tsin_a_d_valid_x_pins[] = { PIN(GPIOX_9, EE_OFF) };
-static const unsigned int tsin_a_fail_pins[]   = { PIN(GPIODV_11, EE_OFF) };
+       BOOT_0, BOOT_1, BOOT_2, BOOT_3, BOOT_4, BOOT_5, BOOT_6, BOOT_7,
+};
+static const unsigned int emmc_clk_pins[]      = { BOOT_8 };
+static const unsigned int emmc_cmd_pins[]      = { BOOT_10 };
+static const unsigned int emmc_ds_pins[]       = { BOOT_15 };
+
+static const unsigned int nor_d_pins[]         = { BOOT_11 };
+static const unsigned int nor_q_pins[]         = { BOOT_12 };
+static const unsigned int nor_c_pins[]         = { BOOT_13 };
+static const unsigned int nor_cs_pins[]                = { BOOT_15 };
+
+static const unsigned int spi_mosi_pins[]      = { GPIOX_8 };
+static const unsigned int spi_miso_pins[]      = { GPIOX_9 };
+static const unsigned int spi_ss0_pins[]       = { GPIOX_10 };
+static const unsigned int spi_sclk_pins[]      = { GPIOX_11 };
+
+static const unsigned int sdcard_d0_pins[]     = { CARD_1 };
+static const unsigned int sdcard_d1_pins[]     = { CARD_0 };
+static const unsigned int sdcard_d2_pins[]     = { CARD_5 };
+static const unsigned int sdcard_d3_pins[]     = { CARD_4 };
+static const unsigned int sdcard_cmd_pins[]    = { CARD_3 };
+static const unsigned int sdcard_clk_pins[]    = { CARD_2 };
+
+static const unsigned int sdio_d0_pins[]       = { GPIOX_0 };
+static const unsigned int sdio_d1_pins[]       = { GPIOX_1 };
+static const unsigned int sdio_d2_pins[]       = { GPIOX_2 };
+static const unsigned int sdio_d3_pins[]       = { GPIOX_3 };
+static const unsigned int sdio_cmd_pins[]      = { GPIOX_4 };
+static const unsigned int sdio_clk_pins[]      = { GPIOX_5 };
+static const unsigned int sdio_irq_pins[]      = { GPIOX_7 };
+
+static const unsigned int nand_ce0_pins[]      = { BOOT_8 };
+static const unsigned int nand_ce1_pins[]      = { BOOT_9 };
+static const unsigned int nand_rb0_pins[]      = { BOOT_10 };
+static const unsigned int nand_ale_pins[]      = { BOOT_11 };
+static const unsigned int nand_cle_pins[]      = { BOOT_12 };
+static const unsigned int nand_wen_clk_pins[]  = { BOOT_13 };
+static const unsigned int nand_ren_wr_pins[]   = { BOOT_14 };
+static const unsigned int nand_dqs_pins[]      = { BOOT_15 };
+
+static const unsigned int uart_tx_a_pins[]     = { GPIOX_12 };
+static const unsigned int uart_rx_a_pins[]     = { GPIOX_13 };
+static const unsigned int uart_cts_a_pins[]    = { GPIOX_14 };
+static const unsigned int uart_rts_a_pins[]    = { GPIOX_15 };
+
+static const unsigned int uart_tx_b_pins[]     = { GPIODV_24 };
+static const unsigned int uart_rx_b_pins[]     = { GPIODV_25 };
+static const unsigned int uart_cts_b_pins[]    = { GPIODV_26 };
+static const unsigned int uart_rts_b_pins[]    = { GPIODV_27 };
+
+static const unsigned int uart_tx_c_pins[]     = { GPIOX_8 };
+static const unsigned int uart_rx_c_pins[]     = { GPIOX_9 };
+static const unsigned int uart_cts_c_pins[]    = { GPIOX_10 };
+static const unsigned int uart_rts_c_pins[]    = { GPIOX_11 };
+
+static const unsigned int i2c_sck_a_pins[]     = { GPIODV_25 };
+static const unsigned int i2c_sda_a_pins[]     = { GPIODV_24 };
+
+static const unsigned int i2c_sck_b_pins[]     = { GPIODV_27 };
+static const unsigned int i2c_sda_b_pins[]     = { GPIODV_26 };
+
+static const unsigned int i2c_sck_c_pins[]     = { GPIODV_29 };
+static const unsigned int i2c_sda_c_pins[]     = { GPIODV_28 };
+
+static const unsigned int i2c_sck_c_dv19_pins[] = { GPIODV_19 };
+static const unsigned int i2c_sda_c_dv18_pins[] = { GPIODV_18 };
+
+static const unsigned int eth_mdio_pins[]      = { GPIOZ_0 };
+static const unsigned int eth_mdc_pins[]       = { GPIOZ_1 };
+static const unsigned int eth_clk_rx_clk_pins[] = { GPIOZ_2 };
+static const unsigned int eth_rx_dv_pins[]     = { GPIOZ_3 };
+static const unsigned int eth_rxd0_pins[]      = { GPIOZ_4 };
+static const unsigned int eth_rxd1_pins[]      = { GPIOZ_5 };
+static const unsigned int eth_rxd2_pins[]      = { GPIOZ_6 };
+static const unsigned int eth_rxd3_pins[]      = { GPIOZ_7 };
+static const unsigned int eth_rgmii_tx_clk_pins[] = { GPIOZ_8 };
+static const unsigned int eth_tx_en_pins[]     = { GPIOZ_9 };
+static const unsigned int eth_txd0_pins[]      = { GPIOZ_10 };
+static const unsigned int eth_txd1_pins[]      = { GPIOZ_11 };
+static const unsigned int eth_txd2_pins[]      = { GPIOZ_12 };
+static const unsigned int eth_txd3_pins[]      = { GPIOZ_13 };
+
+static const unsigned int pwm_a_pins[]         = { GPIOX_6 };
+
+static const unsigned int pwm_b_pins[]         = { GPIODV_29 };
+
+static const unsigned int pwm_c_pins[]         = { GPIOZ_15 };
+
+static const unsigned int pwm_d_pins[]         = { GPIODV_28 };
+
+static const unsigned int pwm_e_pins[]         = { GPIOX_16 };
+
+static const unsigned int pwm_f_clk_pins[]     = { GPIOCLK_1 };
+static const unsigned int pwm_f_x_pins[]       = { GPIOX_7 };
+
+static const unsigned int hdmi_hpd_pins[]      = { GPIOH_0 };
+static const unsigned int hdmi_sda_pins[]      = { GPIOH_1 };
+static const unsigned int hdmi_scl_pins[]      = { GPIOH_2 };
+
+static const unsigned int i2s_am_clk_pins[]    = { GPIOH_6 };
+static const unsigned int i2s_out_ao_clk_pins[] = { GPIOH_7 };
+static const unsigned int i2s_out_lr_clk_pins[] = { GPIOH_8 };
+static const unsigned int i2s_out_ch01_pins[]  = { GPIOH_9 };
+static const unsigned int i2s_out_ch23_z_pins[] = { GPIOZ_5 };
+static const unsigned int i2s_out_ch45_z_pins[] = { GPIOZ_6 };
+static const unsigned int i2s_out_ch67_z_pins[] = { GPIOZ_7 };
+
+static const unsigned int spdif_out_h_pins[]   = { GPIOH_4 };
+
+static const unsigned int eth_link_led_pins[]  = { GPIOZ_14 };
+static const unsigned int eth_act_led_pins[]   = { GPIOZ_15 };
+
+static const unsigned int tsin_a_d0_pins[]     = { GPIODV_0 };
+static const unsigned int tsin_a_d0_x_pins[]   = { GPIOX_10 };
+static const unsigned int tsin_a_clk_pins[]    = { GPIODV_8 };
+static const unsigned int tsin_a_clk_x_pins[]  = { GPIOX_11 };
+static const unsigned int tsin_a_sop_pins[]    = { GPIODV_9 };
+static const unsigned int tsin_a_sop_x_pins[]  = { GPIOX_8 };
+static const unsigned int tsin_a_d_valid_pins[] = { GPIODV_10 };
+static const unsigned int tsin_a_d_valid_x_pins[] = { GPIOX_9 };
+static const unsigned int tsin_a_fail_pins[]   = { GPIODV_11 };
 static const unsigned int tsin_a_dp_pins[] = {
-       PIN(GPIODV_1, EE_OFF),
-       PIN(GPIODV_2, EE_OFF),
-       PIN(GPIODV_3, EE_OFF),
-       PIN(GPIODV_4, EE_OFF),
-       PIN(GPIODV_5, EE_OFF),
-       PIN(GPIODV_6, EE_OFF),
-       PIN(GPIODV_7, EE_OFF),
+       GPIODV_1, GPIODV_2, GPIODV_3, GPIODV_4, GPIODV_5, GPIODV_6, GPIODV_7,
 };
 
 static const struct pinctrl_pin_desc meson_gxl_aobus_pins[] = {
-       MESON_PIN(GPIOAO_0, 0),
-       MESON_PIN(GPIOAO_1, 0),
-       MESON_PIN(GPIOAO_2, 0),
-       MESON_PIN(GPIOAO_3, 0),
-       MESON_PIN(GPIOAO_4, 0),
-       MESON_PIN(GPIOAO_5, 0),
-       MESON_PIN(GPIOAO_6, 0),
-       MESON_PIN(GPIOAO_7, 0),
-       MESON_PIN(GPIOAO_8, 0),
-       MESON_PIN(GPIOAO_9, 0),
-};
-
-static const unsigned int uart_tx_ao_a_pins[]  = { PIN(GPIOAO_0, 0) };
-static const unsigned int uart_rx_ao_a_pins[]  = { PIN(GPIOAO_1, 0) };
-static const unsigned int uart_tx_ao_b_0_pins[]        = { PIN(GPIOAO_0, 0) };
-static const unsigned int uart_rx_ao_b_1_pins[]        = { PIN(GPIOAO_1, 0) };
-static const unsigned int uart_cts_ao_a_pins[] = { PIN(GPIOAO_2, 0) };
-static const unsigned int uart_rts_ao_a_pins[] = { PIN(GPIOAO_3, 0) };
-static const unsigned int uart_tx_ao_b_pins[]  = { PIN(GPIOAO_4, 0) };
-static const unsigned int uart_rx_ao_b_pins[]  = { PIN(GPIOAO_5, 0) };
-static const unsigned int uart_cts_ao_b_pins[] = { PIN(GPIOAO_2, 0) };
-static const unsigned int uart_rts_ao_b_pins[] = { PIN(GPIOAO_3, 0) };
-
-static const unsigned int i2c_sck_ao_pins[] = {PIN(GPIOAO_4, 0) };
-static const unsigned int i2c_sda_ao_pins[] = {PIN(GPIOAO_5, 0) };
-static const unsigned int i2c_slave_sck_ao_pins[] = {PIN(GPIOAO_4, 0) };
-static const unsigned int i2c_slave_sda_ao_pins[] = {PIN(GPIOAO_5, 0) };
-
-static const unsigned int remote_input_ao_pins[] = {PIN(GPIOAO_7, 0) };
-
-static const unsigned int pwm_ao_a_3_pins[]    = { PIN(GPIOAO_3, 0) };
-static const unsigned int pwm_ao_a_8_pins[]    = { PIN(GPIOAO_8, 0) };
-
-static const unsigned int pwm_ao_b_pins[]      = { PIN(GPIOAO_9, 0) };
-static const unsigned int pwm_ao_b_6_pins[]    = { PIN(GPIOAO_6, 0) };
-
-static const unsigned int i2s_out_ch23_ao_pins[] = { PIN(GPIOAO_8, 0) };
-static const unsigned int i2s_out_ch45_ao_pins[] = { PIN(GPIOAO_9, 0) };
-
-static const unsigned int spdif_out_ao_6_pins[]        = { PIN(GPIOAO_6, 0) };
-static const unsigned int spdif_out_ao_9_pins[]        = { PIN(GPIOAO_9, 0) };
-
-static const unsigned int ao_cec_pins[]                = { PIN(GPIOAO_8, 0) };
-static const unsigned int ee_cec_pins[]                = { PIN(GPIOAO_8, 0) };
+       MESON_PIN(GPIOAO_0),
+       MESON_PIN(GPIOAO_1),
+       MESON_PIN(GPIOAO_2),
+       MESON_PIN(GPIOAO_3),
+       MESON_PIN(GPIOAO_4),
+       MESON_PIN(GPIOAO_5),
+       MESON_PIN(GPIOAO_6),
+       MESON_PIN(GPIOAO_7),
+       MESON_PIN(GPIOAO_8),
+       MESON_PIN(GPIOAO_9),
+
+       MESON_PIN(GPIO_TEST_N),
+};
+
+static const unsigned int uart_tx_ao_a_pins[]  = { GPIOAO_0 };
+static const unsigned int uart_rx_ao_a_pins[]  = { GPIOAO_1 };
+static const unsigned int uart_tx_ao_b_0_pins[] = { GPIOAO_0 };
+static const unsigned int uart_rx_ao_b_1_pins[] = { GPIOAO_1 };
+static const unsigned int uart_cts_ao_a_pins[] = { GPIOAO_2 };
+static const unsigned int uart_rts_ao_a_pins[] = { GPIOAO_3 };
+static const unsigned int uart_tx_ao_b_pins[]  = { GPIOAO_4 };
+static const unsigned int uart_rx_ao_b_pins[]  = { GPIOAO_5 };
+static const unsigned int uart_cts_ao_b_pins[] = { GPIOAO_2 };
+static const unsigned int uart_rts_ao_b_pins[] = { GPIOAO_3 };
+
+static const unsigned int i2c_sck_ao_pins[]    = {GPIOAO_4 };
+static const unsigned int i2c_sda_ao_pins[]    = {GPIOAO_5 };
+static const unsigned int i2c_slave_sck_ao_pins[] = {GPIOAO_4 };
+static const unsigned int i2c_slave_sda_ao_pins[] = {GPIOAO_5 };
+
+static const unsigned int remote_input_ao_pins[] = {GPIOAO_7 };
+
+static const unsigned int pwm_ao_a_3_pins[]    = { GPIOAO_3 };
+static const unsigned int pwm_ao_a_8_pins[]    = { GPIOAO_8 };
+
+static const unsigned int pwm_ao_b_pins[]      = { GPIOAO_9 };
+static const unsigned int pwm_ao_b_6_pins[]    = { GPIOAO_6 };
+
+static const unsigned int i2s_out_ch23_ao_pins[] = { GPIOAO_8 };
+static const unsigned int i2s_out_ch45_ao_pins[] = { GPIOAO_9 };
+static const unsigned int i2s_out_ch67_ao_pins[] = { GPIO_TEST_N };
+
+static const unsigned int spdif_out_ao_6_pins[] = { GPIOAO_6 };
+static const unsigned int spdif_out_ao_9_pins[] = { GPIOAO_9 };
+
+static const unsigned int ao_cec_pins[]                = { GPIOAO_8 };
+static const unsigned int ee_cec_pins[]                = { GPIOAO_8 };
 
 static struct meson_pmx_group meson_gxl_periphs_groups[] = {
-       GPIO_GROUP(GPIOZ_0, EE_OFF),
-       GPIO_GROUP(GPIOZ_1, EE_OFF),
-       GPIO_GROUP(GPIOZ_2, EE_OFF),
-       GPIO_GROUP(GPIOZ_3, EE_OFF),
-       GPIO_GROUP(GPIOZ_4, EE_OFF),
-       GPIO_GROUP(GPIOZ_5, EE_OFF),
-       GPIO_GROUP(GPIOZ_6, EE_OFF),
-       GPIO_GROUP(GPIOZ_7, EE_OFF),
-       GPIO_GROUP(GPIOZ_8, EE_OFF),
-       GPIO_GROUP(GPIOZ_9, EE_OFF),
-       GPIO_GROUP(GPIOZ_10, EE_OFF),
-       GPIO_GROUP(GPIOZ_11, EE_OFF),
-       GPIO_GROUP(GPIOZ_12, EE_OFF),
-       GPIO_GROUP(GPIOZ_13, EE_OFF),
-       GPIO_GROUP(GPIOZ_14, EE_OFF),
-       GPIO_GROUP(GPIOZ_15, EE_OFF),
-
-       GPIO_GROUP(GPIOH_0, EE_OFF),
-       GPIO_GROUP(GPIOH_1, EE_OFF),
-       GPIO_GROUP(GPIOH_2, EE_OFF),
-       GPIO_GROUP(GPIOH_3, EE_OFF),
-       GPIO_GROUP(GPIOH_4, EE_OFF),
-       GPIO_GROUP(GPIOH_5, EE_OFF),
-       GPIO_GROUP(GPIOH_6, EE_OFF),
-       GPIO_GROUP(GPIOH_7, EE_OFF),
-       GPIO_GROUP(GPIOH_8, EE_OFF),
-       GPIO_GROUP(GPIOH_9, EE_OFF),
-
-       GPIO_GROUP(BOOT_0, EE_OFF),
-       GPIO_GROUP(BOOT_1, EE_OFF),
-       GPIO_GROUP(BOOT_2, EE_OFF),
-       GPIO_GROUP(BOOT_3, EE_OFF),
-       GPIO_GROUP(BOOT_4, EE_OFF),
-       GPIO_GROUP(BOOT_5, EE_OFF),
-       GPIO_GROUP(BOOT_6, EE_OFF),
-       GPIO_GROUP(BOOT_7, EE_OFF),
-       GPIO_GROUP(BOOT_8, EE_OFF),
-       GPIO_GROUP(BOOT_9, EE_OFF),
-       GPIO_GROUP(BOOT_10, EE_OFF),
-       GPIO_GROUP(BOOT_11, EE_OFF),
-       GPIO_GROUP(BOOT_12, EE_OFF),
-       GPIO_GROUP(BOOT_13, EE_OFF),
-       GPIO_GROUP(BOOT_14, EE_OFF),
-       GPIO_GROUP(BOOT_15, EE_OFF),
-
-       GPIO_GROUP(CARD_0, EE_OFF),
-       GPIO_GROUP(CARD_1, EE_OFF),
-       GPIO_GROUP(CARD_2, EE_OFF),
-       GPIO_GROUP(CARD_3, EE_OFF),
-       GPIO_GROUP(CARD_4, EE_OFF),
-       GPIO_GROUP(CARD_5, EE_OFF),
-       GPIO_GROUP(CARD_6, EE_OFF),
-
-       GPIO_GROUP(GPIODV_0, EE_OFF),
-       GPIO_GROUP(GPIODV_1, EE_OFF),
-       GPIO_GROUP(GPIODV_2, EE_OFF),
-       GPIO_GROUP(GPIODV_3, EE_OFF),
-       GPIO_GROUP(GPIODV_4, EE_OFF),
-       GPIO_GROUP(GPIODV_5, EE_OFF),
-       GPIO_GROUP(GPIODV_6, EE_OFF),
-       GPIO_GROUP(GPIODV_7, EE_OFF),
-       GPIO_GROUP(GPIODV_8, EE_OFF),
-       GPIO_GROUP(GPIODV_9, EE_OFF),
-       GPIO_GROUP(GPIODV_10, EE_OFF),
-       GPIO_GROUP(GPIODV_11, EE_OFF),
-       GPIO_GROUP(GPIODV_12, EE_OFF),
-       GPIO_GROUP(GPIODV_13, EE_OFF),
-       GPIO_GROUP(GPIODV_14, EE_OFF),
-       GPIO_GROUP(GPIODV_15, EE_OFF),
-       GPIO_GROUP(GPIODV_16, EE_OFF),
-       GPIO_GROUP(GPIODV_17, EE_OFF),
-       GPIO_GROUP(GPIODV_19, EE_OFF),
-       GPIO_GROUP(GPIODV_20, EE_OFF),
-       GPIO_GROUP(GPIODV_21, EE_OFF),
-       GPIO_GROUP(GPIODV_22, EE_OFF),
-       GPIO_GROUP(GPIODV_23, EE_OFF),
-       GPIO_GROUP(GPIODV_24, EE_OFF),
-       GPIO_GROUP(GPIODV_25, EE_OFF),
-       GPIO_GROUP(GPIODV_26, EE_OFF),
-       GPIO_GROUP(GPIODV_27, EE_OFF),
-       GPIO_GROUP(GPIODV_28, EE_OFF),
-       GPIO_GROUP(GPIODV_29, EE_OFF),
-
-       GPIO_GROUP(GPIOX_0, EE_OFF),
-       GPIO_GROUP(GPIOX_1, EE_OFF),
-       GPIO_GROUP(GPIOX_2, EE_OFF),
-       GPIO_GROUP(GPIOX_3, EE_OFF),
-       GPIO_GROUP(GPIOX_4, EE_OFF),
-       GPIO_GROUP(GPIOX_5, EE_OFF),
-       GPIO_GROUP(GPIOX_6, EE_OFF),
-       GPIO_GROUP(GPIOX_7, EE_OFF),
-       GPIO_GROUP(GPIOX_8, EE_OFF),
-       GPIO_GROUP(GPIOX_9, EE_OFF),
-       GPIO_GROUP(GPIOX_10, EE_OFF),
-       GPIO_GROUP(GPIOX_11, EE_OFF),
-       GPIO_GROUP(GPIOX_12, EE_OFF),
-       GPIO_GROUP(GPIOX_13, EE_OFF),
-       GPIO_GROUP(GPIOX_14, EE_OFF),
-       GPIO_GROUP(GPIOX_15, EE_OFF),
-       GPIO_GROUP(GPIOX_16, EE_OFF),
-       GPIO_GROUP(GPIOX_17, EE_OFF),
-       GPIO_GROUP(GPIOX_18, EE_OFF),
-
-       GPIO_GROUP(GPIOCLK_0, EE_OFF),
-       GPIO_GROUP(GPIOCLK_1, EE_OFF),
-
-       GPIO_GROUP(GPIO_TEST_N, EE_OFF),
+       GPIO_GROUP(GPIOZ_0),
+       GPIO_GROUP(GPIOZ_1),
+       GPIO_GROUP(GPIOZ_2),
+       GPIO_GROUP(GPIOZ_3),
+       GPIO_GROUP(GPIOZ_4),
+       GPIO_GROUP(GPIOZ_5),
+       GPIO_GROUP(GPIOZ_6),
+       GPIO_GROUP(GPIOZ_7),
+       GPIO_GROUP(GPIOZ_8),
+       GPIO_GROUP(GPIOZ_9),
+       GPIO_GROUP(GPIOZ_10),
+       GPIO_GROUP(GPIOZ_11),
+       GPIO_GROUP(GPIOZ_12),
+       GPIO_GROUP(GPIOZ_13),
+       GPIO_GROUP(GPIOZ_14),
+       GPIO_GROUP(GPIOZ_15),
+
+       GPIO_GROUP(GPIOH_0),
+       GPIO_GROUP(GPIOH_1),
+       GPIO_GROUP(GPIOH_2),
+       GPIO_GROUP(GPIOH_3),
+       GPIO_GROUP(GPIOH_4),
+       GPIO_GROUP(GPIOH_5),
+       GPIO_GROUP(GPIOH_6),
+       GPIO_GROUP(GPIOH_7),
+       GPIO_GROUP(GPIOH_8),
+       GPIO_GROUP(GPIOH_9),
+
+       GPIO_GROUP(BOOT_0),
+       GPIO_GROUP(BOOT_1),
+       GPIO_GROUP(BOOT_2),
+       GPIO_GROUP(BOOT_3),
+       GPIO_GROUP(BOOT_4),
+       GPIO_GROUP(BOOT_5),
+       GPIO_GROUP(BOOT_6),
+       GPIO_GROUP(BOOT_7),
+       GPIO_GROUP(BOOT_8),
+       GPIO_GROUP(BOOT_9),
+       GPIO_GROUP(BOOT_10),
+       GPIO_GROUP(BOOT_11),
+       GPIO_GROUP(BOOT_12),
+       GPIO_GROUP(BOOT_13),
+       GPIO_GROUP(BOOT_14),
+       GPIO_GROUP(BOOT_15),
+
+       GPIO_GROUP(CARD_0),
+       GPIO_GROUP(CARD_1),
+       GPIO_GROUP(CARD_2),
+       GPIO_GROUP(CARD_3),
+       GPIO_GROUP(CARD_4),
+       GPIO_GROUP(CARD_5),
+       GPIO_GROUP(CARD_6),
+
+       GPIO_GROUP(GPIODV_0),
+       GPIO_GROUP(GPIODV_1),
+       GPIO_GROUP(GPIODV_2),
+       GPIO_GROUP(GPIODV_3),
+       GPIO_GROUP(GPIODV_4),
+       GPIO_GROUP(GPIODV_5),
+       GPIO_GROUP(GPIODV_6),
+       GPIO_GROUP(GPIODV_7),
+       GPIO_GROUP(GPIODV_8),
+       GPIO_GROUP(GPIODV_9),
+       GPIO_GROUP(GPIODV_10),
+       GPIO_GROUP(GPIODV_11),
+       GPIO_GROUP(GPIODV_12),
+       GPIO_GROUP(GPIODV_13),
+       GPIO_GROUP(GPIODV_14),
+       GPIO_GROUP(GPIODV_15),
+       GPIO_GROUP(GPIODV_16),
+       GPIO_GROUP(GPIODV_17),
+       GPIO_GROUP(GPIODV_19),
+       GPIO_GROUP(GPIODV_20),
+       GPIO_GROUP(GPIODV_21),
+       GPIO_GROUP(GPIODV_22),
+       GPIO_GROUP(GPIODV_23),
+       GPIO_GROUP(GPIODV_24),
+       GPIO_GROUP(GPIODV_25),
+       GPIO_GROUP(GPIODV_26),
+       GPIO_GROUP(GPIODV_27),
+       GPIO_GROUP(GPIODV_28),
+       GPIO_GROUP(GPIODV_29),
+
+       GPIO_GROUP(GPIOX_0),
+       GPIO_GROUP(GPIOX_1),
+       GPIO_GROUP(GPIOX_2),
+       GPIO_GROUP(GPIOX_3),
+       GPIO_GROUP(GPIOX_4),
+       GPIO_GROUP(GPIOX_5),
+       GPIO_GROUP(GPIOX_6),
+       GPIO_GROUP(GPIOX_7),
+       GPIO_GROUP(GPIOX_8),
+       GPIO_GROUP(GPIOX_9),
+       GPIO_GROUP(GPIOX_10),
+       GPIO_GROUP(GPIOX_11),
+       GPIO_GROUP(GPIOX_12),
+       GPIO_GROUP(GPIOX_13),
+       GPIO_GROUP(GPIOX_14),
+       GPIO_GROUP(GPIOX_15),
+       GPIO_GROUP(GPIOX_16),
+       GPIO_GROUP(GPIOX_17),
+       GPIO_GROUP(GPIOX_18),
+
+       GPIO_GROUP(GPIOCLK_0),
+       GPIO_GROUP(GPIOCLK_1),
+
+       GPIO_GROUP(GPIO_TEST_N),
 
        /* Bank X */
        GROUP(sdio_d0,          5,      31),
@@ -530,16 +522,16 @@ static struct meson_pmx_group meson_gxl_periphs_groups[] = {
 };
 
 static struct meson_pmx_group meson_gxl_aobus_groups[] = {
-       GPIO_GROUP(GPIOAO_0, 0),
-       GPIO_GROUP(GPIOAO_1, 0),
-       GPIO_GROUP(GPIOAO_2, 0),
-       GPIO_GROUP(GPIOAO_3, 0),
-       GPIO_GROUP(GPIOAO_4, 0),
-       GPIO_GROUP(GPIOAO_5, 0),
-       GPIO_GROUP(GPIOAO_6, 0),
-       GPIO_GROUP(GPIOAO_7, 0),
-       GPIO_GROUP(GPIOAO_8, 0),
-       GPIO_GROUP(GPIOAO_9, 0),
+       GPIO_GROUP(GPIOAO_0),
+       GPIO_GROUP(GPIOAO_1),
+       GPIO_GROUP(GPIOAO_2),
+       GPIO_GROUP(GPIOAO_3),
+       GPIO_GROUP(GPIOAO_4),
+       GPIO_GROUP(GPIOAO_5),
+       GPIO_GROUP(GPIOAO_6),
+       GPIO_GROUP(GPIOAO_7),
+       GPIO_GROUP(GPIOAO_8),
+       GPIO_GROUP(GPIOAO_9),
 
        /* bank AO */
        GROUP(uart_tx_ao_b_0,   0,      26),
@@ -567,6 +559,9 @@ static struct meson_pmx_group meson_gxl_aobus_groups[] = {
        GROUP(spdif_out_ao_9,   0,      4),
        GROUP(ao_cec,           0,      15),
        GROUP(ee_cec,           0,      14),
+
+       /* test n pin */
+       GROUP(i2s_out_ch67_ao,  1,      2),
 };
 
 static const char * const gpio_periphs_groups[] = {
@@ -597,8 +592,6 @@ static const char * const gpio_periphs_groups[] = {
        "GPIOX_5", "GPIOX_6", "GPIOX_7", "GPIOX_8", "GPIOX_9",
        "GPIOX_10", "GPIOX_11", "GPIOX_12", "GPIOX_13", "GPIOX_14",
        "GPIOX_15", "GPIOX_16", "GPIOX_17", "GPIOX_18",
-
-       "GPIO_TEST_N",
 };
 
 static const char * const emmc_groups[] = {
@@ -713,6 +706,8 @@ static const char * const tsin_a_groups[] = {
 static const char * const gpio_aobus_groups[] = {
        "GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3", "GPIOAO_4",
        "GPIOAO_5", "GPIOAO_6", "GPIOAO_7", "GPIOAO_8", "GPIOAO_9",
+
+       "GPIO_TEST_N",
 };
 
 static const char * const uart_ao_groups[] = {
@@ -745,7 +740,7 @@ static const char * const pwm_ao_b_groups[] = {
 };
 
 static const char * const i2s_out_ao_groups[] = {
-       "i2s_out_ch23_ao", "i2s_out_ch45_ao",
+       "i2s_out_ch23_ao", "i2s_out_ch45_ao", "i2s_out_ch67_ao",
 };
 
 static const char * const spdif_out_ao_groups[] = {
@@ -800,24 +795,23 @@ static struct meson_pmx_func meson_gxl_aobus_functions[] = {
 };
 
 static struct meson_bank meson_gxl_periphs_banks[] = {
-       /*   name    first                      last                    irq       pullen  pull    dir     out     in  */
-       BANK("X",    PIN(GPIOX_0, EE_OFF),      PIN(GPIOX_18, EE_OFF),   89, 107, 4,  0,  4,  0,  12, 0,  13, 0,  14, 0),
-       BANK("DV",   PIN(GPIODV_0, EE_OFF),     PIN(GPIODV_29, EE_OFF),  83,  88, 0,  0,  0,  0,  0,  0,  1,  0,  2,  0),
-       BANK("H",    PIN(GPIOH_0, EE_OFF),      PIN(GPIOH_9, EE_OFF),    26,  35, 1, 20,  1, 20,  3, 20,  4, 20,  5, 20),
-       BANK("Z",    PIN(GPIOZ_0, EE_OFF),      PIN(GPIOZ_15, EE_OFF),   10,  25, 3,  0,  3,  0,  9,  0,  10, 0, 11,  0),
-       BANK("CARD", PIN(CARD_0, EE_OFF),       PIN(CARD_6, EE_OFF),     52,  58, 2, 20,  2, 20,  6, 20,  7, 20,  8, 20),
-       BANK("BOOT", PIN(BOOT_0, EE_OFF),       PIN(BOOT_15, EE_OFF),    36,  51, 2,  0,  2,  0,  6,  0,  7,  0,  8,  0),
-       BANK("CLK",  PIN(GPIOCLK_0, EE_OFF),    PIN(GPIOCLK_1, EE_OFF), 108, 109, 3, 28,  3, 28,  9, 28, 10, 28, 11, 28),
+       /*   name    first      last       irq       pullen  pull    dir     out     in  */
+       BANK("X",    GPIOX_0,   GPIOX_18,   89, 107, 4,  0,  4,  0,  12, 0,  13, 0,  14, 0),
+       BANK("DV",   GPIODV_0,  GPIODV_29,  83,  88, 0,  0,  0,  0,  0,  0,  1,  0,  2,  0),
+       BANK("H",    GPIOH_0,   GPIOH_9,    26,  35, 1, 20,  1, 20,  3, 20,  4, 20,  5, 20),
+       BANK("Z",    GPIOZ_0,   GPIOZ_15,   10,  25, 3,  0,  3,  0,  9,  0,  10, 0, 11,  0),
+       BANK("CARD", CARD_0,    CARD_6,     52,  58, 2, 20,  2, 20,  6, 20,  7, 20,  8, 20),
+       BANK("BOOT", BOOT_0,    BOOT_15,    36,  51, 2,  0,  2,  0,  6,  0,  7,  0,  8,  0),
+       BANK("CLK",  GPIOCLK_0, GPIOCLK_1, 108, 109, 3, 28,  3, 28,  9, 28, 10, 28, 11, 28),
 };
 
 static struct meson_bank meson_gxl_aobus_banks[] = {
-       /*   name    first              last              irq   pullen  pull    dir     out     in  */
-       BANK("AO",   PIN(GPIOAO_0, 0),  PIN(GPIOAO_9, 0), 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
+       /*   name    first      last      irq   pullen  pull    dir     out     in  */
+       BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
        .name           = "periphs-banks",
-       .pin_base       = 10,
        .pins           = meson_gxl_periphs_pins,
        .groups         = meson_gxl_periphs_groups,
        .funcs          = meson_gxl_periphs_functions,
@@ -826,11 +820,11 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
        .num_groups     = ARRAY_SIZE(meson_gxl_periphs_groups),
        .num_funcs      = ARRAY_SIZE(meson_gxl_periphs_functions),
        .num_banks      = ARRAY_SIZE(meson_gxl_periphs_banks),
+       .pmx_ops        = &meson8_pmx_ops,
 };
 
-struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
        .name           = "aobus-banks",
-       .pin_base       = 0,
        .pins           = meson_gxl_aobus_pins,
        .groups         = meson_gxl_aobus_groups,
        .funcs          = meson_gxl_aobus_functions,
@@ -839,4 +833,26 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
        .num_groups     = ARRAY_SIZE(meson_gxl_aobus_groups),
        .num_funcs      = ARRAY_SIZE(meson_gxl_aobus_functions),
        .num_banks      = ARRAY_SIZE(meson_gxl_aobus_banks),
+       .pmx_ops        = &meson8_pmx_ops,
+};
+
+static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson-gxl-periphs-pinctrl",
+               .data = &meson_gxl_periphs_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson-gxl-aobus-pinctrl",
+               .data = &meson_gxl_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson_gxl_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson-gxl-pinctrl",
+               .of_match_table = meson_gxl_pinctrl_dt_match,
+       },
 };
+builtin_platform_driver(meson_gxl_pinctrl_driver);
index 66ed70c1273312fbd30befcfc65a5d08ce0e7453..29a458da78db15bf26d5245f3fd29c2eaa1e1fa0 100644 (file)
  * In some cases the register ranges for pull enable and pull
  * direction are the same and thus there are only 3 register ranges.
  *
- * Every pinmux group can be enabled by a specific bit in the first
- * register range; when all groups for a given pin are disabled the
- * pin acts as a GPIO.
- *
  * For the pull and GPIO configuration every bank uses a contiguous
  * set of bits in the register sets described above; the same register
  * can be shared by more banks with different offsets.
@@ -50,6 +46,7 @@
 #include <linux/io.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/pinctrl/pinconf-generic.h>
 #include <linux/pinctrl/pinconf.h>
 #include <linux/pinctrl/pinctrl.h>
@@ -147,94 +144,24 @@ static const struct pinctrl_ops meson_pctrl_ops = {
        .pin_dbg_show           = meson_pin_dbg_show,
 };
 
-/**
- * meson_pmx_disable_other_groups() - disable other groups using a given pin
- *
- * @pc:                meson pin controller device
- * @pin:       number of the pin
- * @sel_group: index of the selected group, or -1 if none
- *
- * The function disables all pinmux groups using a pin except the
- * selected one. If @sel_group is -1 all groups are disabled, leaving
- * the pin in GPIO mode.
- */
-static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
-                                          unsigned int pin, int sel_group)
-{
-       struct meson_pmx_group *group;
-       int i, j;
-
-       for (i = 0; i < pc->data->num_groups; i++) {
-               group = &pc->data->groups[i];
-               if (group->is_gpio || i == sel_group)
-                       continue;
-
-               for (j = 0; j < group->num_pins; j++) {
-                       if (group->pins[j] == pin) {
-                               /* We have found a group using the pin */
-                               regmap_update_bits(pc->reg_mux,
-                                                  group->reg * 4,
-                                                  BIT(group->bit), 0);
-                       }
-               }
-       }
-}
-
-static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
-                            unsigned group_num)
-{
-       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
-       struct meson_pmx_func *func = &pc->data->funcs[func_num];
-       struct meson_pmx_group *group = &pc->data->groups[group_num];
-       int i, ret = 0;
-
-       dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
-               group->name);
-
-       /*
-        * Disable groups using the same pin.
-        * The selected group is not disabled to avoid glitches.
-        */
-       for (i = 0; i < group->num_pins; i++)
-               meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
-
-       /* Function 0 (GPIO) doesn't need any additional setting */
-       if (func_num)
-               ret = regmap_update_bits(pc->reg_mux, group->reg * 4,
-                                        BIT(group->bit), BIT(group->bit));
-
-       return ret;
-}
-
-static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
-                                 struct pinctrl_gpio_range *range,
-                                 unsigned offset)
-{
-       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
-
-       meson_pmx_disable_other_groups(pc, offset, -1);
-
-       return 0;
-}
-
-static int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
+int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
 {
        struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
        return pc->data->num_funcs;
 }
 
-static const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
-                                          unsigned selector)
+const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
+                                   unsigned selector)
 {
        struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
        return pc->data->funcs[selector].name;
 }
 
-static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
-                               const char * const **groups,
-                               unsigned * const num_groups)
+int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
+                        const char * const **groups,
+                        unsigned * const num_groups)
 {
        struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
@@ -244,14 +171,6 @@ static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
        return 0;
 }
 
-static const struct pinmux_ops meson_pmx_ops = {
-       .set_mux = meson_pmx_set_mux,
-       .get_functions_count = meson_pmx_get_funcs_count,
-       .get_function_name = meson_pmx_get_func_name,
-       .get_function_groups = meson_pmx_get_groups,
-       .gpio_request_enable = meson_pmx_request_gpio,
-};
-
 static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
                             unsigned long *configs, unsigned num_configs)
 {
@@ -399,7 +318,7 @@ static int meson_pinconf_group_set(struct pinctrl_dev *pcdev,
 static int meson_pinconf_group_get(struct pinctrl_dev *pcdev,
                                   unsigned int group, unsigned long *config)
 {
-       return -ENOSYS;
+       return -ENOTSUPP;
 }
 
 static const struct pinconf_ops meson_pinconf_ops = {
@@ -410,31 +329,18 @@ static const struct pinconf_ops meson_pinconf_ops = {
        .is_generic             = true,
 };
 
-static int meson_gpio_request(struct gpio_chip *chip, unsigned gpio)
-{
-       return pinctrl_request_gpio(chip->base + gpio);
-}
-
-static void meson_gpio_free(struct gpio_chip *chip, unsigned gpio)
-{
-       struct meson_pinctrl *pc = gpiochip_get_data(chip);
-
-       pinctrl_free_gpio(pc->data->pin_base + gpio);
-}
-
 static int meson_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
 {
        struct meson_pinctrl *pc = gpiochip_get_data(chip);
-       unsigned int reg, bit, pin;
+       unsigned int reg, bit;
        struct meson_bank *bank;
        int ret;
 
-       pin = pc->data->pin_base + gpio;
-       ret = meson_get_bank(pc, pin, &bank);
+       ret = meson_get_bank(pc, gpio, &bank);
        if (ret)
                return ret;
 
-       meson_calc_reg_and_bit(bank, pin, REG_DIR, &reg, &bit);
+       meson_calc_reg_and_bit(bank, gpio, REG_DIR, &reg, &bit);
 
        return regmap_update_bits(pc->reg_gpio, reg, BIT(bit), BIT(bit));
 }
@@ -443,21 +349,20 @@ 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, pin;
+       unsigned int reg, bit;
        struct meson_bank *bank;
        int ret;
 
-       pin = pc->data->pin_base + gpio;
-       ret = meson_get_bank(pc, pin, &bank);
+       ret = meson_get_bank(pc, gpio, &bank);
        if (ret)
                return ret;
 
-       meson_calc_reg_and_bit(bank, pin, REG_DIR, &reg, &bit);
+       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, pin, REG_OUT, &reg, &bit);
+       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);
 }
@@ -465,16 +370,15 @@ static int meson_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,
 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, pin;
+       unsigned int reg, bit;
        struct meson_bank *bank;
        int ret;
 
-       pin = pc->data->pin_base + gpio;
-       ret = meson_get_bank(pc, pin, &bank);
+       ret = meson_get_bank(pc, gpio, &bank);
        if (ret)
                return;
 
-       meson_calc_reg_and_bit(bank, pin, REG_OUT, &reg, &bit);
+       meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
        regmap_update_bits(pc->reg_gpio, reg, BIT(bit),
                           value ? BIT(bit) : 0);
 }
@@ -482,70 +386,33 @@ static void meson_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
 static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
 {
        struct meson_pinctrl *pc = gpiochip_get_data(chip);
-       unsigned int reg, bit, val, pin;
+       unsigned int reg, bit, val;
        struct meson_bank *bank;
        int ret;
 
-       pin = pc->data->pin_base + gpio;
-       ret = meson_get_bank(pc, pin, &bank);
+       ret = meson_get_bank(pc, gpio, &bank);
        if (ret)
                return ret;
 
-       meson_calc_reg_and_bit(bank, pin, REG_IN, &reg, &bit);
+       meson_calc_reg_and_bit(bank, gpio, REG_IN, &reg, &bit);
        regmap_read(pc->reg_gpio, reg, &val);
 
        return !!(val & BIT(bit));
 }
 
-static const struct of_device_id meson_pinctrl_dt_match[] = {
-       {
-               .compatible = "amlogic,meson8-cbus-pinctrl",
-               .data = &meson8_cbus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson8b-cbus-pinctrl",
-               .data = &meson8b_cbus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson8-aobus-pinctrl",
-               .data = &meson8_aobus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson8b-aobus-pinctrl",
-               .data = &meson8b_aobus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson-gxbb-periphs-pinctrl",
-               .data = &meson_gxbb_periphs_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson-gxbb-aobus-pinctrl",
-               .data = &meson_gxbb_aobus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson-gxl-periphs-pinctrl",
-               .data = &meson_gxl_periphs_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson-gxl-aobus-pinctrl",
-               .data = &meson_gxl_aobus_pinctrl_data,
-       },
-       { },
-};
-
 static int meson_gpiolib_register(struct meson_pinctrl *pc)
 {
        int ret;
 
        pc->chip.label = pc->data->name;
        pc->chip.parent = pc->dev;
-       pc->chip.request = meson_gpio_request;
-       pc->chip.free = meson_gpio_free;
+       pc->chip.request = gpiochip_generic_request;
+       pc->chip.free = gpiochip_generic_free;
        pc->chip.direction_input = meson_gpio_direction_input;
        pc->chip.direction_output = meson_gpio_direction_output;
        pc->chip.get = meson_gpio_get;
        pc->chip.set = meson_gpio_set;
-       pc->chip.base = pc->data->pin_base;
+       pc->chip.base = -1;
        pc->chip.ngpio = pc->data->num_pins;
        pc->chip.can_sleep = false;
        pc->chip.of_node = pc->of_node;
@@ -640,9 +507,8 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc,
        return 0;
 }
 
-static int meson_pinctrl_probe(struct platform_device *pdev)
+int meson_pinctrl_probe(struct platform_device *pdev)
 {
-       const struct of_device_id *match;
        struct device *dev = &pdev->dev;
        struct meson_pinctrl *pc;
        int ret;
@@ -652,17 +518,16 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        pc->dev = dev;
-       match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
-       pc->data = (struct meson_pinctrl_data *) match->data;
+       pc->data = (struct meson_pinctrl_data *) of_device_get_match_data(dev);
 
-       ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
+       ret = meson_pinctrl_parse_dt(pc, dev->of_node);
        if (ret)
                return ret;
 
        pc->desc.name           = "pinctrl-meson";
        pc->desc.owner          = THIS_MODULE;
        pc->desc.pctlops        = &meson_pctrl_ops;
-       pc->desc.pmxops         = &meson_pmx_ops;
+       pc->desc.pmxops         = pc->data->pmx_ops;
        pc->desc.confops        = &meson_pinconf_ops;
        pc->desc.pins           = pc->data->pins;
        pc->desc.npins          = pc->data->num_pins;
@@ -675,12 +540,3 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
 
        return meson_gpiolib_register(pc);
 }
-
-static struct platform_driver meson_pinctrl_driver = {
-       .probe          = meson_pinctrl_probe,
-       .driver = {
-               .name   = "meson-pinctrl",
-               .of_match_table = meson_pinctrl_dt_match,
-       },
-};
-builtin_platform_driver(meson_pinctrl_driver);
index 890f296f58400298b2fa9115d1d242e9cbb1f0b4..183b6e471635f2d14cd38a9418ad6718a7ba9d13 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/gpio.h>
 #include <linux/pinctrl/pinctrl.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/types.h>
 
@@ -31,9 +32,7 @@ struct meson_pmx_group {
        const char *name;
        const unsigned int *pins;
        unsigned int num_pins;
-       bool is_gpio;
-       unsigned int reg;
-       unsigned int bit;
+       const void *data;
 };
 
 /**
@@ -103,12 +102,12 @@ struct meson_pinctrl_data {
        const struct pinctrl_pin_desc *pins;
        struct meson_pmx_group *groups;
        struct meson_pmx_func *funcs;
-       unsigned int pin_base;
        unsigned int num_pins;
        unsigned int num_groups;
        unsigned int num_funcs;
        struct meson_bank *banks;
        unsigned int num_banks;
+       const struct pinmux_ops *pmx_ops;
 };
 
 struct meson_pinctrl {
@@ -124,25 +123,6 @@ struct meson_pinctrl {
        struct device_node *of_node;
 };
 
-#define PIN(x, b)      (b + x)
-
-#define GROUP(grp, r, b)                                               \
-       {                                                               \
-               .name = #grp,                                           \
-               .pins = grp ## _pins,                                   \
-               .num_pins = ARRAY_SIZE(grp ## _pins),                   \
-               .reg = r,                                               \
-               .bit = b,                                               \
-        }
-
-#define GPIO_GROUP(gpio, b)                                            \
-       {                                                               \
-               .name = #gpio,                                          \
-               .pins = (const unsigned int[]){ PIN(gpio, b) },         \
-               .num_pins = 1,                                          \
-               .is_gpio = true,                                        \
-        }
-
 #define FUNCTION(fn)                                                   \
        {                                                               \
                .name = #fn,                                            \
@@ -166,13 +146,16 @@ struct meson_pinctrl {
                },                                                      \
         }
 
-#define MESON_PIN(x, b) PINCTRL_PIN(PIN(x, b), #x)
+#define MESON_PIN(x) PINCTRL_PIN(x, #x)
+
+/* Common pmx functions */
+int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev);
+const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
+                                   unsigned selector);
+int meson_pmx_get_groups(struct pinctrl_dev *pcdev,
+                        unsigned selector,
+                        const char * const **groups,
+                        unsigned * const num_groups);
 
-extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
-extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
-extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
+/* Common probe function */
+int meson_pinctrl_probe(struct platform_device *pdev);
diff --git a/drivers/pinctrl/meson/pinctrl-meson8-pmx.c b/drivers/pinctrl/meson/pinctrl-meson8-pmx.c
new file mode 100644 (file)
index 0000000..b93b058
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * First generation of pinmux driver for Amlogic Meson SoCs
+ *
+ * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
+ * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* For this first generation of pinctrl driver every pinmux group can be
+ * enabled by a specific bit in the first register range. When all groups for
+ * a given pin are disabled the pin acts as a GPIO.
+ */
+#include <linux/device.h>
+#include <linux/regmap.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+
+#include "pinctrl-meson.h"
+#include "pinctrl-meson8-pmx.h"
+
+/**
+ * meson8_pmx_disable_other_groups() - disable other groups using a given pin
+ *
+ * @pc:                meson pin controller device
+ * @pin:       number of the pin
+ * @sel_group: index of the selected group, or -1 if none
+ *
+ * The function disables all pinmux groups using a pin except the
+ * selected one. If @sel_group is -1 all groups are disabled, leaving
+ * the pin in GPIO mode.
+ */
+static void meson8_pmx_disable_other_groups(struct meson_pinctrl *pc,
+                                           unsigned int pin, int sel_group)
+{
+       struct meson_pmx_group *group;
+       struct meson8_pmx_data *pmx_data;
+       int i, j;
+
+       for (i = 0; i < pc->data->num_groups; i++) {
+               group = &pc->data->groups[i];
+               pmx_data = (struct meson8_pmx_data *)group->data;
+               if (pmx_data->is_gpio || i == sel_group)
+                       continue;
+
+               for (j = 0; j < group->num_pins; j++) {
+                       if (group->pins[j] == pin) {
+                               /* We have found a group using the pin */
+                               regmap_update_bits(pc->reg_mux,
+                                                  pmx_data->reg * 4,
+                                                  BIT(pmx_data->bit), 0);
+                       }
+               }
+       }
+}
+
+static int meson8_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
+                             unsigned group_num)
+{
+       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
+       struct meson_pmx_func *func = &pc->data->funcs[func_num];
+       struct meson_pmx_group *group = &pc->data->groups[group_num];
+       struct meson8_pmx_data *pmx_data =
+               (struct meson8_pmx_data *)group->data;
+       int i, ret = 0;
+
+       dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
+               group->name);
+
+       /*
+        * Disable groups using the same pin.
+        * The selected group is not disabled to avoid glitches.
+        */
+       for (i = 0; i < group->num_pins; i++)
+               meson8_pmx_disable_other_groups(pc, group->pins[i], group_num);
+
+       /* Function 0 (GPIO) doesn't need any additional setting */
+       if (func_num)
+               ret = regmap_update_bits(pc->reg_mux, pmx_data->reg * 4,
+                                        BIT(pmx_data->bit),
+                                        BIT(pmx_data->bit));
+
+       return ret;
+}
+
+static int meson8_pmx_request_gpio(struct pinctrl_dev *pcdev,
+                                  struct pinctrl_gpio_range *range,
+                                  unsigned offset)
+{
+       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
+
+       meson8_pmx_disable_other_groups(pc, offset, -1);
+
+       return 0;
+}
+
+const struct pinmux_ops meson8_pmx_ops = {
+       .set_mux = meson8_pmx_set_mux,
+       .get_functions_count = meson_pmx_get_funcs_count,
+       .get_function_name = meson_pmx_get_func_name,
+       .get_function_groups = meson_pmx_get_groups,
+       .gpio_request_enable = meson8_pmx_request_gpio,
+};
diff --git a/drivers/pinctrl/meson/pinctrl-meson8-pmx.h b/drivers/pinctrl/meson/pinctrl-meson8-pmx.h
new file mode 100644 (file)
index 0000000..47293c2
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * First generation of pinmux driver for Amlogic Meson SoCs
+ *
+ * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
+ * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+struct meson8_pmx_data {
+       bool is_gpio;
+       unsigned int reg;
+       unsigned int bit;
+};
+
+#define PMX_DATA(r, b, g)                                              \
+       {                                                               \
+               .reg = r,                                               \
+               .bit = b,                                               \
+               .is_gpio = g,                                           \
+       }
+
+#define GROUP(grp, r, b)                                               \
+       {                                                               \
+               .name = #grp,                                           \
+               .pins = grp ## _pins,                                   \
+               .num_pins = ARRAY_SIZE(grp ## _pins),                   \
+               .data = (const struct meson8_pmx_data[]){               \
+                       PMX_DATA(r, b, false),                          \
+               },                                                      \
+        }
+
+#define GPIO_GROUP(gpio)                                               \
+       {                                                               \
+               .name = #gpio,                                          \
+               .pins = (const unsigned int[]){ gpio },                 \
+               .num_pins = 1,                                          \
+               .data = (const struct meson8_pmx_data[]){               \
+                       PMX_DATA(0, 0, true),                           \
+               },                                                      \
+       }
+
+extern const struct pinmux_ops meson8_pmx_ops;
index 970f6f14502ca1487ace52009eb83af307da07be..49c7ce03547bf065eecc9f1b3f19072497f0710e 100644 (file)
 
 #include <dt-bindings/gpio/meson8-gpio.h>
 #include "pinctrl-meson.h"
-
-#define AO_OFF 120
+#include "pinctrl-meson8-pmx.h"
 
 static const struct pinctrl_pin_desc meson8_cbus_pins[] = {
-       MESON_PIN(GPIOX_0, 0),
-       MESON_PIN(GPIOX_1, 0),
-       MESON_PIN(GPIOX_2, 0),
-       MESON_PIN(GPIOX_3, 0),
-       MESON_PIN(GPIOX_4, 0),
-       MESON_PIN(GPIOX_5, 0),
-       MESON_PIN(GPIOX_6, 0),
-       MESON_PIN(GPIOX_7, 0),
-       MESON_PIN(GPIOX_8, 0),
-       MESON_PIN(GPIOX_9, 0),
-       MESON_PIN(GPIOX_10, 0),
-       MESON_PIN(GPIOX_11, 0),
-       MESON_PIN(GPIOX_12, 0),
-       MESON_PIN(GPIOX_13, 0),
-       MESON_PIN(GPIOX_14, 0),
-       MESON_PIN(GPIOX_15, 0),
-       MESON_PIN(GPIOX_16, 0),
-       MESON_PIN(GPIOX_17, 0),
-       MESON_PIN(GPIOX_18, 0),
-       MESON_PIN(GPIOX_19, 0),
-       MESON_PIN(GPIOX_20, 0),
-       MESON_PIN(GPIOX_21, 0),
-       MESON_PIN(GPIOY_0, 0),
-       MESON_PIN(GPIOY_1, 0),
-       MESON_PIN(GPIOY_2, 0),
-       MESON_PIN(GPIOY_3, 0),
-       MESON_PIN(GPIOY_4, 0),
-       MESON_PIN(GPIOY_5, 0),
-       MESON_PIN(GPIOY_6, 0),
-       MESON_PIN(GPIOY_7, 0),
-       MESON_PIN(GPIOY_8, 0),
-       MESON_PIN(GPIOY_9, 0),
-       MESON_PIN(GPIOY_10, 0),
-       MESON_PIN(GPIOY_11, 0),
-       MESON_PIN(GPIOY_12, 0),
-       MESON_PIN(GPIOY_13, 0),
-       MESON_PIN(GPIOY_14, 0),
-       MESON_PIN(GPIOY_15, 0),
-       MESON_PIN(GPIOY_16, 0),
-       MESON_PIN(GPIODV_0, 0),
-       MESON_PIN(GPIODV_1, 0),
-       MESON_PIN(GPIODV_2, 0),
-       MESON_PIN(GPIODV_3, 0),
-       MESON_PIN(GPIODV_4, 0),
-       MESON_PIN(GPIODV_5, 0),
-       MESON_PIN(GPIODV_6, 0),
-       MESON_PIN(GPIODV_7, 0),
-       MESON_PIN(GPIODV_8, 0),
-       MESON_PIN(GPIODV_9, 0),
-       MESON_PIN(GPIODV_10, 0),
-       MESON_PIN(GPIODV_11, 0),
-       MESON_PIN(GPIODV_12, 0),
-       MESON_PIN(GPIODV_13, 0),
-       MESON_PIN(GPIODV_14, 0),
-       MESON_PIN(GPIODV_15, 0),
-       MESON_PIN(GPIODV_16, 0),
-       MESON_PIN(GPIODV_17, 0),
-       MESON_PIN(GPIODV_18, 0),
-       MESON_PIN(GPIODV_19, 0),
-       MESON_PIN(GPIODV_20, 0),
-       MESON_PIN(GPIODV_21, 0),
-       MESON_PIN(GPIODV_22, 0),
-       MESON_PIN(GPIODV_23, 0),
-       MESON_PIN(GPIODV_24, 0),
-       MESON_PIN(GPIODV_25, 0),
-       MESON_PIN(GPIODV_26, 0),
-       MESON_PIN(GPIODV_27, 0),
-       MESON_PIN(GPIODV_28, 0),
-       MESON_PIN(GPIODV_29, 0),
-       MESON_PIN(GPIOH_0, 0),
-       MESON_PIN(GPIOH_1, 0),
-       MESON_PIN(GPIOH_2, 0),
-       MESON_PIN(GPIOH_3, 0),
-       MESON_PIN(GPIOH_4, 0),
-       MESON_PIN(GPIOH_5, 0),
-       MESON_PIN(GPIOH_6, 0),
-       MESON_PIN(GPIOH_7, 0),
-       MESON_PIN(GPIOH_8, 0),
-       MESON_PIN(GPIOH_9, 0),
-       MESON_PIN(GPIOZ_0, 0),
-       MESON_PIN(GPIOZ_1, 0),
-       MESON_PIN(GPIOZ_2, 0),
-       MESON_PIN(GPIOZ_3, 0),
-       MESON_PIN(GPIOZ_4, 0),
-       MESON_PIN(GPIOZ_5, 0),
-       MESON_PIN(GPIOZ_6, 0),
-       MESON_PIN(GPIOZ_7, 0),
-       MESON_PIN(GPIOZ_8, 0),
-       MESON_PIN(GPIOZ_9, 0),
-       MESON_PIN(GPIOZ_10, 0),
-       MESON_PIN(GPIOZ_11, 0),
-       MESON_PIN(GPIOZ_12, 0),
-       MESON_PIN(GPIOZ_13, 0),
-       MESON_PIN(GPIOZ_14, 0),
-       MESON_PIN(CARD_0, 0),
-       MESON_PIN(CARD_1, 0),
-       MESON_PIN(CARD_2, 0),
-       MESON_PIN(CARD_3, 0),
-       MESON_PIN(CARD_4, 0),
-       MESON_PIN(CARD_5, 0),
-       MESON_PIN(CARD_6, 0),
-       MESON_PIN(BOOT_0, 0),
-       MESON_PIN(BOOT_1, 0),
-       MESON_PIN(BOOT_2, 0),
-       MESON_PIN(BOOT_3, 0),
-       MESON_PIN(BOOT_4, 0),
-       MESON_PIN(BOOT_5, 0),
-       MESON_PIN(BOOT_6, 0),
-       MESON_PIN(BOOT_7, 0),
-       MESON_PIN(BOOT_8, 0),
-       MESON_PIN(BOOT_9, 0),
-       MESON_PIN(BOOT_10, 0),
-       MESON_PIN(BOOT_11, 0),
-       MESON_PIN(BOOT_12, 0),
-       MESON_PIN(BOOT_13, 0),
-       MESON_PIN(BOOT_14, 0),
-       MESON_PIN(BOOT_15, 0),
-       MESON_PIN(BOOT_16, 0),
-       MESON_PIN(BOOT_17, 0),
-       MESON_PIN(BOOT_18, 0),
+       MESON_PIN(GPIOX_0),
+       MESON_PIN(GPIOX_1),
+       MESON_PIN(GPIOX_2),
+       MESON_PIN(GPIOX_3),
+       MESON_PIN(GPIOX_4),
+       MESON_PIN(GPIOX_5),
+       MESON_PIN(GPIOX_6),
+       MESON_PIN(GPIOX_7),
+       MESON_PIN(GPIOX_8),
+       MESON_PIN(GPIOX_9),
+       MESON_PIN(GPIOX_10),
+       MESON_PIN(GPIOX_11),
+       MESON_PIN(GPIOX_12),
+       MESON_PIN(GPIOX_13),
+       MESON_PIN(GPIOX_14),
+       MESON_PIN(GPIOX_15),
+       MESON_PIN(GPIOX_16),
+       MESON_PIN(GPIOX_17),
+       MESON_PIN(GPIOX_18),
+       MESON_PIN(GPIOX_19),
+       MESON_PIN(GPIOX_20),
+       MESON_PIN(GPIOX_21),
+       MESON_PIN(GPIOY_0),
+       MESON_PIN(GPIOY_1),
+       MESON_PIN(GPIOY_2),
+       MESON_PIN(GPIOY_3),
+       MESON_PIN(GPIOY_4),
+       MESON_PIN(GPIOY_5),
+       MESON_PIN(GPIOY_6),
+       MESON_PIN(GPIOY_7),
+       MESON_PIN(GPIOY_8),
+       MESON_PIN(GPIOY_9),
+       MESON_PIN(GPIOY_10),
+       MESON_PIN(GPIOY_11),
+       MESON_PIN(GPIOY_12),
+       MESON_PIN(GPIOY_13),
+       MESON_PIN(GPIOY_14),
+       MESON_PIN(GPIOY_15),
+       MESON_PIN(GPIOY_16),
+       MESON_PIN(GPIODV_0),
+       MESON_PIN(GPIODV_1),
+       MESON_PIN(GPIODV_2),
+       MESON_PIN(GPIODV_3),
+       MESON_PIN(GPIODV_4),
+       MESON_PIN(GPIODV_5),
+       MESON_PIN(GPIODV_6),
+       MESON_PIN(GPIODV_7),
+       MESON_PIN(GPIODV_8),
+       MESON_PIN(GPIODV_9),
+       MESON_PIN(GPIODV_10),
+       MESON_PIN(GPIODV_11),
+       MESON_PIN(GPIODV_12),
+       MESON_PIN(GPIODV_13),
+       MESON_PIN(GPIODV_14),
+       MESON_PIN(GPIODV_15),
+       MESON_PIN(GPIODV_16),
+       MESON_PIN(GPIODV_17),
+       MESON_PIN(GPIODV_18),
+       MESON_PIN(GPIODV_19),
+       MESON_PIN(GPIODV_20),
+       MESON_PIN(GPIODV_21),
+       MESON_PIN(GPIODV_22),
+       MESON_PIN(GPIODV_23),
+       MESON_PIN(GPIODV_24),
+       MESON_PIN(GPIODV_25),
+       MESON_PIN(GPIODV_26),
+       MESON_PIN(GPIODV_27),
+       MESON_PIN(GPIODV_28),
+       MESON_PIN(GPIODV_29),
+       MESON_PIN(GPIOH_0),
+       MESON_PIN(GPIOH_1),
+       MESON_PIN(GPIOH_2),
+       MESON_PIN(GPIOH_3),
+       MESON_PIN(GPIOH_4),
+       MESON_PIN(GPIOH_5),
+       MESON_PIN(GPIOH_6),
+       MESON_PIN(GPIOH_7),
+       MESON_PIN(GPIOH_8),
+       MESON_PIN(GPIOH_9),
+       MESON_PIN(GPIOZ_0),
+       MESON_PIN(GPIOZ_1),
+       MESON_PIN(GPIOZ_2),
+       MESON_PIN(GPIOZ_3),
+       MESON_PIN(GPIOZ_4),
+       MESON_PIN(GPIOZ_5),
+       MESON_PIN(GPIOZ_6),
+       MESON_PIN(GPIOZ_7),
+       MESON_PIN(GPIOZ_8),
+       MESON_PIN(GPIOZ_9),
+       MESON_PIN(GPIOZ_10),
+       MESON_PIN(GPIOZ_11),
+       MESON_PIN(GPIOZ_12),
+       MESON_PIN(GPIOZ_13),
+       MESON_PIN(GPIOZ_14),
+       MESON_PIN(CARD_0),
+       MESON_PIN(CARD_1),
+       MESON_PIN(CARD_2),
+       MESON_PIN(CARD_3),
+       MESON_PIN(CARD_4),
+       MESON_PIN(CARD_5),
+       MESON_PIN(CARD_6),
+       MESON_PIN(BOOT_0),
+       MESON_PIN(BOOT_1),
+       MESON_PIN(BOOT_2),
+       MESON_PIN(BOOT_3),
+       MESON_PIN(BOOT_4),
+       MESON_PIN(BOOT_5),
+       MESON_PIN(BOOT_6),
+       MESON_PIN(BOOT_7),
+       MESON_PIN(BOOT_8),
+       MESON_PIN(BOOT_9),
+       MESON_PIN(BOOT_10),
+       MESON_PIN(BOOT_11),
+       MESON_PIN(BOOT_12),
+       MESON_PIN(BOOT_13),
+       MESON_PIN(BOOT_14),
+       MESON_PIN(BOOT_15),
+       MESON_PIN(BOOT_16),
+       MESON_PIN(BOOT_17),
+       MESON_PIN(BOOT_18),
 };
 
 static const struct pinctrl_pin_desc meson8_aobus_pins[] = {
-       MESON_PIN(GPIOAO_0, AO_OFF),
-       MESON_PIN(GPIOAO_1, AO_OFF),
-       MESON_PIN(GPIOAO_2, AO_OFF),
-       MESON_PIN(GPIOAO_3, AO_OFF),
-       MESON_PIN(GPIOAO_4, AO_OFF),
-       MESON_PIN(GPIOAO_5, AO_OFF),
-       MESON_PIN(GPIOAO_6, AO_OFF),
-       MESON_PIN(GPIOAO_7, AO_OFF),
-       MESON_PIN(GPIOAO_8, AO_OFF),
-       MESON_PIN(GPIOAO_9, AO_OFF),
-       MESON_PIN(GPIOAO_10, AO_OFF),
-       MESON_PIN(GPIOAO_11, AO_OFF),
-       MESON_PIN(GPIOAO_12, AO_OFF),
-       MESON_PIN(GPIOAO_13, AO_OFF),
-       MESON_PIN(GPIO_BSD_EN, AO_OFF),
-       MESON_PIN(GPIO_TEST_N, AO_OFF),
+       MESON_PIN(GPIOAO_0),
+       MESON_PIN(GPIOAO_1),
+       MESON_PIN(GPIOAO_2),
+       MESON_PIN(GPIOAO_3),
+       MESON_PIN(GPIOAO_4),
+       MESON_PIN(GPIOAO_5),
+       MESON_PIN(GPIOAO_6),
+       MESON_PIN(GPIOAO_7),
+       MESON_PIN(GPIOAO_8),
+       MESON_PIN(GPIOAO_9),
+       MESON_PIN(GPIOAO_10),
+       MESON_PIN(GPIOAO_11),
+       MESON_PIN(GPIOAO_12),
+       MESON_PIN(GPIOAO_13),
+       MESON_PIN(GPIO_BSD_EN),
+       MESON_PIN(GPIO_TEST_N),
 };
 
 /* bank X */
-static const unsigned int sd_d0_a_pins[] = { PIN(GPIOX_0, 0) };
-static const unsigned int sd_d1_a_pins[] = { PIN(GPIOX_1, 0) };
-static const unsigned int sd_d2_a_pins[] = { PIN(GPIOX_2, 0) };
-static const unsigned int sd_d3_a_pins[] = { PIN(GPIOX_3, 0) };
-static const unsigned int sd_clk_a_pins[] = { PIN(GPIOX_8, 0) };
-static const unsigned int sd_cmd_a_pins[] = { PIN(GPIOX_9, 0) };
-
-static const unsigned int sdxc_d0_a_pins[] = { PIN(GPIOX_0, 0) };
-static const unsigned int sdxc_d13_a_pins[] = { PIN(GPIOX_1, 0), PIN(GPIOX_2, 0),
-                                               PIN(GPIOX_3, 0) };
-static const unsigned int sdxc_d47_a_pins[] = { PIN(GPIOX_4, 0), PIN(GPIOX_5, 0),
-                                               PIN(GPIOX_6, 0), PIN(GPIOX_7, 0) };
-static const unsigned int sdxc_clk_a_pins[] = { PIN(GPIOX_8, 0) };
-static const unsigned int sdxc_cmd_a_pins[] = { PIN(GPIOX_9, 0) };
-
-static const unsigned int pcm_out_a_pins[] = { PIN(GPIOX_4, 0) };
-static const unsigned int pcm_in_a_pins[] = { PIN(GPIOX_5, 0) };
-static const unsigned int pcm_fs_a_pins[] = { PIN(GPIOX_6, 0) };
-static const unsigned int pcm_clk_a_pins[] = { PIN(GPIOX_7, 0) };
-
-static const unsigned int uart_tx_a0_pins[] = { PIN(GPIOX_4, 0) };
-static const unsigned int uart_rx_a0_pins[] = { PIN(GPIOX_5, 0) };
-static const unsigned int uart_cts_a0_pins[] = { PIN(GPIOX_6, 0) };
-static const unsigned int uart_rts_a0_pins[] = { PIN(GPIOX_7, 0) };
-
-static const unsigned int uart_tx_a1_pins[] = { PIN(GPIOX_12, 0) };
-static const unsigned int uart_rx_a1_pins[] = { PIN(GPIOX_13, 0) };
-static const unsigned int uart_cts_a1_pins[] = { PIN(GPIOX_14, 0) };
-static const unsigned int uart_rts_a1_pins[] = { PIN(GPIOX_15, 0) };
-
-static const unsigned int uart_tx_b0_pins[] = { PIN(GPIOX_16, 0) };
-static const unsigned int uart_rx_b0_pins[] = { PIN(GPIOX_17, 0) };
-static const unsigned int uart_cts_b0_pins[] = { PIN(GPIOX_18, 0) };
-static const unsigned int uart_rts_b0_pins[] = { PIN(GPIOX_19, 0) };
-
-static const unsigned int iso7816_det_pins[] = { PIN(GPIOX_16, 0) };
-static const unsigned int iso7816_reset_pins[] = { PIN(GPIOX_17, 0) };
-static const unsigned int iso7816_clk_pins[] = { PIN(GPIOX_18, 0) };
-static const unsigned int iso7816_data_pins[] = { PIN(GPIOX_19, 0) };
-
-static const unsigned int i2c_sda_d0_pins[] = { PIN(GPIOX_16, 0) };
-static const unsigned int i2c_sck_d0_pins[] = { PIN(GPIOX_17, 0) };
-
-static const unsigned int xtal_32k_out_pins[] = { PIN(GPIOX_10, 0) };
-static const unsigned int xtal_24m_out_pins[] = { PIN(GPIOX_11, 0) };
-
-static const unsigned int pwm_e_pins[] = { PIN(GPIOX_10, 0) };
-static const unsigned int pwm_b_x_pins[] = { PIN(GPIOX_11, 0) };
+static const unsigned int sd_d0_a_pins[]       = { GPIOX_0 };
+static const unsigned int sd_d1_a_pins[]       = { GPIOX_1 };
+static const unsigned int sd_d2_a_pins[]       = { GPIOX_2 };
+static const unsigned int sd_d3_a_pins[]       = { GPIOX_3 };
+static const unsigned int sd_clk_a_pins[]      = { GPIOX_8 };
+static const unsigned int sd_cmd_a_pins[]      = { GPIOX_9 };
+
+static const unsigned int sdxc_d0_a_pins[]     = { GPIOX_0 };
+static const unsigned int sdxc_d13_a_pins[]    = { GPIOX_1, GPIOX_2, GPIOX_3 };
+static const unsigned int sdxc_d47_a_pins[]    = { GPIOX_4, GPIOX_5, GPIOX_6,
+                                                   GPIOX_7 };
+static const unsigned int sdxc_clk_a_pins[]    = { GPIOX_8 };
+static const unsigned int sdxc_cmd_a_pins[]    = { GPIOX_9 };
+
+static const unsigned int pcm_out_a_pins[]     = { GPIOX_4 };
+static const unsigned int pcm_in_a_pins[]      = { GPIOX_5 };
+static const unsigned int pcm_fs_a_pins[]      = { GPIOX_6 };
+static const unsigned int pcm_clk_a_pins[]     = { GPIOX_7 };
+
+static const unsigned int uart_tx_a0_pins[]    = { GPIOX_4 };
+static const unsigned int uart_rx_a0_pins[]    = { GPIOX_5 };
+static const unsigned int uart_cts_a0_pins[]   = { GPIOX_6 };
+static const unsigned int uart_rts_a0_pins[]   = { GPIOX_7 };
+
+static const unsigned int uart_tx_a1_pins[]    = { GPIOX_12 };
+static const unsigned int uart_rx_a1_pins[]    = { GPIOX_13 };
+static const unsigned int uart_cts_a1_pins[]   = { GPIOX_14 };
+static const unsigned int uart_rts_a1_pins[]   = { GPIOX_15 };
+
+static const unsigned int uart_tx_b0_pins[]    = { GPIOX_16 };
+static const unsigned int uart_rx_b0_pins[]    = { GPIOX_17 };
+static const unsigned int uart_cts_b0_pins[]   = { GPIOX_18 };
+static const unsigned int uart_rts_b0_pins[]   = { GPIOX_19 };
+
+static const unsigned int iso7816_det_pins[]   = { GPIOX_16 };
+static const unsigned int iso7816_reset_pins[] = { GPIOX_17 };
+static const unsigned int iso7816_clk_pins[]   = { GPIOX_18 };
+static const unsigned int iso7816_data_pins[]  = { GPIOX_19 };
+
+static const unsigned int i2c_sda_d0_pins[]    = { GPIOX_16 };
+static const unsigned int i2c_sck_d0_pins[]    = { GPIOX_17 };
+
+static const unsigned int xtal_32k_out_pins[]  = { GPIOX_10 };
+static const unsigned int xtal_24m_out_pins[]  = { GPIOX_11 };
+
+static const unsigned int pwm_e_pins[]         = { GPIOX_10 };
+static const unsigned int pwm_b_x_pins[]       = { GPIOX_11 };
 
 /* bank Y */
-static const unsigned int uart_tx_c_pins[] = { PIN(GPIOY_0, 0) };
-static const unsigned int uart_rx_c_pins[] = { PIN(GPIOY_1, 0) };
-static const unsigned int uart_cts_c_pins[] = { PIN(GPIOY_2, 0) };
-static const unsigned int uart_rts_c_pins[] = { PIN(GPIOY_3, 0) };
+static const unsigned int uart_tx_c_pins[]     = { GPIOY_0 };
+static const unsigned int uart_rx_c_pins[]     = { GPIOY_1 };
+static const unsigned int uart_cts_c_pins[]    = { GPIOY_2 };
+static const unsigned int uart_rts_c_pins[]    = { GPIOY_3 };
 
-static const unsigned int pcm_out_b_pins[] = { PIN(GPIOY_4, 0) };
-static const unsigned int pcm_in_b_pins[] = { PIN(GPIOY_5, 0) };
-static const unsigned int pcm_fs_b_pins[] = { PIN(GPIOY_6, 0) };
-static const unsigned int pcm_clk_b_pins[] = { PIN(GPIOY_7, 0) };
+static const unsigned int pcm_out_b_pins[]     = { GPIOY_4 };
+static const unsigned int pcm_in_b_pins[]      = { GPIOY_5 };
+static const unsigned int pcm_fs_b_pins[]      = { GPIOY_6 };
+static const unsigned int pcm_clk_b_pins[]     = { GPIOY_7 };
 
-static const unsigned int i2c_sda_c0_pins[] = { PIN(GPIOY_0, 0) };
-static const unsigned int i2c_sck_c0_pins[] = { PIN(GPIOY_1, 0) };
+static const unsigned int i2c_sda_c0_pins[]    = { GPIOY_0 };
+static const unsigned int i2c_sck_c0_pins[]    = { GPIOY_1 };
 
-static const unsigned int pwm_a_y_pins[] = { PIN(GPIOY_16, 0) };
+static const unsigned int pwm_a_y_pins[]       = { GPIOY_16 };
 
-static const unsigned int i2s_out_ch45_pins[] = { PIN(GPIOY_0, 0) };
-static const unsigned int i2s_out_ch23_pins[] = { PIN(GPIOY_1, 0) };
-static const unsigned int i2s_out_ch01_pins[] = { PIN(GPIOY_4, 0) };
-static const unsigned int i2s_in_ch01_pins[] = { PIN(GPIOY_5, 0) };
-static const unsigned int i2s_lr_clk_in_pins[] = { PIN(GPIOY_6, 0) };
-static const unsigned int i2s_ao_clk_in_pins[] = { PIN(GPIOY_7, 0) };
-static const unsigned int i2s_am_clk_pins[] = { PIN(GPIOY_8, 0) };
-static const unsigned int i2s_out_ch78_pins[] = { PIN(GPIOY_9, 0) };
+static const unsigned int i2s_out_ch45_pins[]  = { GPIOY_0 };
+static const unsigned int i2s_out_ch23_pins[]  = { GPIOY_1 };
+static const unsigned int i2s_out_ch01_pins[]  = { GPIOY_4 };
+static const unsigned int i2s_in_ch01_pins[]   = { GPIOY_5 };
+static const unsigned int i2s_lr_clk_in_pins[] = { GPIOY_6 };
+static const unsigned int i2s_ao_clk_in_pins[] = { GPIOY_7 };
+static const unsigned int i2s_am_clk_pins[]    = { GPIOY_8 };
+static const unsigned int i2s_out_ch78_pins[]  = { GPIOY_9 };
 
-static const unsigned int spdif_in_pins[] = { PIN(GPIOY_2, 0) };
-static const unsigned int spdif_out_pins[] = { PIN(GPIOY_3, 0) };
+static const unsigned int spdif_in_pins[]      = { GPIOY_2 };
+static const unsigned int spdif_out_pins[]     = { GPIOY_3 };
 
 /* bank DV */
-static const unsigned int dvin_rgb_pins[] = { PIN(GPIODV_0, 0), PIN(GPIODV_1, 0),
-                                             PIN(GPIODV_2, 0), PIN(GPIODV_3, 0),
-                                             PIN(GPIODV_4, 0), PIN(GPIODV_5, 0),
-                                             PIN(GPIODV_6, 0), PIN(GPIODV_7, 0),
-                                             PIN(GPIODV_8, 0), PIN(GPIODV_9, 0),
-                                             PIN(GPIODV_10, 0), PIN(GPIODV_11, 0),
-                                             PIN(GPIODV_12, 0), PIN(GPIODV_13, 0),
-                                             PIN(GPIODV_14, 0), PIN(GPIODV_15, 0),
-                                             PIN(GPIODV_16, 0), PIN(GPIODV_17, 0),
-                                             PIN(GPIODV_18, 0), PIN(GPIODV_19, 0),
-                                             PIN(GPIODV_20, 0), PIN(GPIODV_21, 0),
-                                             PIN(GPIODV_22, 0), PIN(GPIODV_23, 0) };
-static const unsigned int dvin_vs_pins[] = { PIN(GPIODV_24, 0) };
-static const unsigned int dvin_hs_pins[] = { PIN(GPIODV_25, 0) };
-static const unsigned int dvin_clk_pins[] = { PIN(GPIODV_26, 0) };
-static const unsigned int dvin_de_pins[] = { PIN(GPIODV_27, 0) };
-
-static const unsigned int enc_0_pins[] = { PIN(GPIODV_0, 0) };
-static const unsigned int enc_1_pins[] = { PIN(GPIODV_1, 0) };
-static const unsigned int enc_2_pins[] = { PIN(GPIODV_2, 0) };
-static const unsigned int enc_3_pins[] = { PIN(GPIODV_3, 0) };
-static const unsigned int enc_4_pins[] = { PIN(GPIODV_4, 0) };
-static const unsigned int enc_5_pins[] = { PIN(GPIODV_5, 0) };
-static const unsigned int enc_6_pins[] = { PIN(GPIODV_6, 0) };
-static const unsigned int enc_7_pins[] = { PIN(GPIODV_7, 0) };
-static const unsigned int enc_8_pins[] = { PIN(GPIODV_8, 0) };
-static const unsigned int enc_9_pins[] = { PIN(GPIODV_9, 0) };
-static const unsigned int enc_10_pins[] = { PIN(GPIODV_10, 0) };
-static const unsigned int enc_11_pins[] = { PIN(GPIODV_11, 0) };
-static const unsigned int enc_12_pins[] = { PIN(GPIODV_12, 0) };
-static const unsigned int enc_13_pins[] = { PIN(GPIODV_13, 0) };
-static const unsigned int enc_14_pins[] = { PIN(GPIODV_14, 0) };
-static const unsigned int enc_15_pins[] = { PIN(GPIODV_15, 0) };
-static const unsigned int enc_16_pins[] = { PIN(GPIODV_16, 0) };
-static const unsigned int enc_17_pins[] = { PIN(GPIODV_17, 0) };
-
-static const unsigned int uart_tx_b1_pins[] = { PIN(GPIODV_24, 0) };
-static const unsigned int uart_rx_b1_pins[] = { PIN(GPIODV_25, 0) };
-static const unsigned int uart_cts_b1_pins[] = { PIN(GPIODV_26, 0) };
-static const unsigned int uart_rts_b1_pins[] = { PIN(GPIODV_27, 0) };
-
-static const unsigned int vga_vs_pins[] = { PIN(GPIODV_24, 0) };
-static const unsigned int vga_hs_pins[] = { PIN(GPIODV_25, 0) };
-
-static const unsigned int pwm_c_dv9_pins[] = { PIN(GPIODV_9, 0) };
-static const unsigned int pwm_c_dv29_pins[] = { PIN(GPIODV_29, 0) };
-static const unsigned int pwm_d_pins[] = { PIN(GPIODV_28, 0) };
+static const unsigned int dvin_rgb_pins[] = {
+       GPIODV_0, GPIODV_1, GPIODV_2, GPIODV_3, GPIODV_4, GPIODV_5,
+       GPIODV_6, GPIODV_7, GPIODV_8, GPIODV_9, GPIODV_10, GPIODV_11,
+       GPIODV_12, GPIODV_13, GPIODV_14, GPIODV_15, GPIODV_16, GPIODV_17,
+       GPIODV_18, GPIODV_19, GPIODV_20, GPIODV_21, GPIODV_22, GPIODV_23
+};
+static const unsigned int dvin_vs_pins[]       = { GPIODV_24 };
+static const unsigned int dvin_hs_pins[]       = { GPIODV_25 };
+static const unsigned int dvin_clk_pins[]      = { GPIODV_26 };
+static const unsigned int dvin_de_pins[]       = { GPIODV_27 };
+
+static const unsigned int enc_0_pins[]         = { GPIODV_0 };
+static const unsigned int enc_1_pins[]         = { GPIODV_1 };
+static const unsigned int enc_2_pins[]         = { GPIODV_2 };
+static const unsigned int enc_3_pins[]         = { GPIODV_3 };
+static const unsigned int enc_4_pins[]         = { GPIODV_4 };
+static const unsigned int enc_5_pins[]         = { GPIODV_5 };
+static const unsigned int enc_6_pins[]         = { GPIODV_6 };
+static const unsigned int enc_7_pins[]         = { GPIODV_7 };
+static const unsigned int enc_8_pins[]         = { GPIODV_8 };
+static const unsigned int enc_9_pins[]         = { GPIODV_9 };
+static const unsigned int enc_10_pins[]                = { GPIODV_10 };
+static const unsigned int enc_11_pins[]                = { GPIODV_11 };
+static const unsigned int enc_12_pins[]                = { GPIODV_12 };
+static const unsigned int enc_13_pins[]                = { GPIODV_13 };
+static const unsigned int enc_14_pins[]                = { GPIODV_14 };
+static const unsigned int enc_15_pins[]                = { GPIODV_15 };
+static const unsigned int enc_16_pins[]                = { GPIODV_16 };
+static const unsigned int enc_17_pins[]                = { GPIODV_17 };
+
+static const unsigned int uart_tx_b1_pins[]    = { GPIODV_24 };
+static const unsigned int uart_rx_b1_pins[]    = { GPIODV_25 };
+static const unsigned int uart_cts_b1_pins[]   = { GPIODV_26 };
+static const unsigned int uart_rts_b1_pins[]   = { GPIODV_27 };
+
+static const unsigned int vga_vs_pins[]                = { GPIODV_24 };
+static const unsigned int vga_hs_pins[]                = { GPIODV_25 };
+
+static const unsigned int pwm_c_dv9_pins[]     = { GPIODV_9 };
+static const unsigned int pwm_c_dv29_pins[]    = { GPIODV_29 };
+static const unsigned int pwm_d_pins[]         = { GPIODV_28 };
 
 /* bank H */
-static const unsigned int hdmi_hpd_pins[] = { PIN(GPIOH_0, 0) };
-static const unsigned int hdmi_sda_pins[] = { PIN(GPIOH_1, 0) };
-static const unsigned int hdmi_scl_pins[] = { PIN(GPIOH_2, 0) };
-static const unsigned int hdmi_cec_pins[] = { PIN(GPIOH_3, 0) };
+static const unsigned int hdmi_hpd_pins[]      = { GPIOH_0 };
+static const unsigned int hdmi_sda_pins[]      = { GPIOH_1 };
+static const unsigned int hdmi_scl_pins[]      = { GPIOH_2 };
+static const unsigned int hdmi_cec_pins[]      = { GPIOH_3 };
 
-static const unsigned int spi_ss0_0_pins[] = { PIN(GPIOH_3, 0) };
-static const unsigned int spi_miso_0_pins[] = { PIN(GPIOH_4, 0) };
-static const unsigned int spi_mosi_0_pins[] = { PIN(GPIOH_5, 0) };
-static const unsigned int spi_sclk_0_pins[] = { PIN(GPIOH_6, 0) };
+static const unsigned int spi_ss0_0_pins[]     = { GPIOH_3 };
+static const unsigned int spi_miso_0_pins[]    = { GPIOH_4 };
+static const unsigned int spi_mosi_0_pins[]    = { GPIOH_5 };
+static const unsigned int spi_sclk_0_pins[]    = { GPIOH_6 };
 
-static const unsigned int i2c_sda_d1_pins[] = { PIN(GPIOH_7, 0) };
-static const unsigned int i2c_sck_d1_pins[] = { PIN(GPIOH_8, 0) };
+static const unsigned int i2c_sda_d1_pins[]    = { GPIOH_7 };
+static const unsigned int i2c_sck_d1_pins[]    = { GPIOH_8 };
 
 /* bank Z */
-static const unsigned int spi_ss0_1_pins[] = { PIN(GPIOZ_9, 0) };
-static const unsigned int spi_ss1_1_pins[] = { PIN(GPIOZ_10, 0) };
-static const unsigned int spi_sclk_1_pins[] = { PIN(GPIOZ_11, 0) };
-static const unsigned int spi_mosi_1_pins[] = { PIN(GPIOZ_12, 0) };
-static const unsigned int spi_miso_1_pins[] = { PIN(GPIOZ_13, 0) };
-static const unsigned int spi_ss2_1_pins[] = { PIN(GPIOZ_14, 0) };
-
-static const unsigned int eth_tx_clk_50m_pins[] = { PIN(GPIOZ_4, 0) };
-static const unsigned int eth_tx_en_pins[] = { PIN(GPIOZ_5, 0) };
-static const unsigned int eth_txd1_pins[] = { PIN(GPIOZ_6, 0) };
-static const unsigned int eth_txd0_pins[] = { PIN(GPIOZ_7, 0) };
-static const unsigned int eth_rx_clk_in_pins[] = { PIN(GPIOZ_8, 0) };
-static const unsigned int eth_rx_dv_pins[] = { PIN(GPIOZ_9, 0) };
-static const unsigned int eth_rxd1_pins[] = { PIN(GPIOZ_10, 0) };
-static const unsigned int eth_rxd0_pins[] = { PIN(GPIOZ_11, 0) };
-static const unsigned int eth_mdio_pins[] = { PIN(GPIOZ_12, 0) };
-static const unsigned int eth_mdc_pins[] = { PIN(GPIOZ_13, 0) };
-
-static const unsigned int i2c_sda_a0_pins[] = { PIN(GPIOZ_0, 0) };
-static const unsigned int i2c_sck_a0_pins[] = { PIN(GPIOZ_1, 0) };
-
-static const unsigned int i2c_sda_b_pins[] = { PIN(GPIOZ_2, 0) };
-static const unsigned int i2c_sck_b_pins[] = { PIN(GPIOZ_3, 0) };
-
-static const unsigned int i2c_sda_c1_pins[] = { PIN(GPIOZ_4, 0) };
-static const unsigned int i2c_sck_c1_pins[] = { PIN(GPIOZ_5, 0) };
-
-static const unsigned int i2c_sda_a1_pins[] = { PIN(GPIOZ_0, 0) };
-static const unsigned int i2c_sck_a1_pins[] = { PIN(GPIOZ_1, 0) };
-
-static const unsigned int i2c_sda_a2_pins[] = { PIN(GPIOZ_0, 0) };
-static const unsigned int i2c_sck_a2_pins[] = { PIN(GPIOZ_1, 0) };
-
-static const unsigned int pwm_a_z0_pins[] = { PIN(GPIOZ_0, 0) };
-static const unsigned int pwm_a_z7_pins[] = { PIN(GPIOZ_7, 0) };
-static const unsigned int pwm_b_z_pins[] = { PIN(GPIOZ_1, 0) };
-static const unsigned int pwm_c_z_pins[] = { PIN(GPIOZ_8, 0) };
+static const unsigned int spi_ss0_1_pins[]     = { GPIOZ_9 };
+static const unsigned int spi_ss1_1_pins[]     = { GPIOZ_10 };
+static const unsigned int spi_sclk_1_pins[]    = { GPIOZ_11 };
+static const unsigned int spi_mosi_1_pins[]    = { GPIOZ_12 };
+static const unsigned int spi_miso_1_pins[]    = { GPIOZ_13 };
+static const unsigned int spi_ss2_1_pins[]     = { GPIOZ_14 };
+
+static const unsigned int eth_tx_clk_50m_pins[]        = { GPIOZ_4 };
+static const unsigned int eth_tx_en_pins[]     = { GPIOZ_5 };
+static const unsigned int eth_txd1_pins[]      = { GPIOZ_6 };
+static const unsigned int eth_txd0_pins[]      = { GPIOZ_7 };
+static const unsigned int eth_rx_clk_in_pins[] = { GPIOZ_8 };
+static const unsigned int eth_rx_dv_pins[]     = { GPIOZ_9 };
+static const unsigned int eth_rxd1_pins[]      = { GPIOZ_10 };
+static const unsigned int eth_rxd0_pins[]      = { GPIOZ_11 };
+static const unsigned int eth_mdio_pins[]      = { GPIOZ_12 };
+static const unsigned int eth_mdc_pins[]       = { GPIOZ_13 };
+
+static const unsigned int i2c_sda_a0_pins[]    = { GPIOZ_0 };
+static const unsigned int i2c_sck_a0_pins[]    = { GPIOZ_1 };
+
+static const unsigned int i2c_sda_b_pins[]     = { GPIOZ_2 };
+static const unsigned int i2c_sck_b_pins[]     = { GPIOZ_3 };
+
+static const unsigned int i2c_sda_c1_pins[]    = { GPIOZ_4 };
+static const unsigned int i2c_sck_c1_pins[]    = { GPIOZ_5 };
+
+static const unsigned int i2c_sda_a1_pins[]    = { GPIOZ_0 };
+static const unsigned int i2c_sck_a1_pins[]    = { GPIOZ_1 };
+
+static const unsigned int i2c_sda_a2_pins[]    = { GPIOZ_0 };
+static const unsigned int i2c_sck_a2_pins[]    = { GPIOZ_1 };
+
+static const unsigned int pwm_a_z0_pins[]      = { GPIOZ_0 };
+static const unsigned int pwm_a_z7_pins[]      = { GPIOZ_7 };
+static const unsigned int pwm_b_z_pins[]       = { GPIOZ_1 };
+static const unsigned int pwm_c_z_pins[]       = { GPIOZ_8 };
 
 /* bank BOOT */
-static const unsigned int sd_d0_c_pins[] = { PIN(BOOT_0, 0) };
-static const unsigned int sd_d1_c_pins[] = { PIN(BOOT_1, 0) };
-static const unsigned int sd_d2_c_pins[] = { PIN(BOOT_2, 0) };
-static const unsigned int sd_d3_c_pins[] = { PIN(BOOT_3, 0) };
-static const unsigned int sd_cmd_c_pins[] = { PIN(BOOT_16, 0) };
-static const unsigned int sd_clk_c_pins[] = { PIN(BOOT_17, 0) };
-
-static const unsigned int sdxc_d0_c_pins[] = { PIN(BOOT_0, 0)};
-static const unsigned int sdxc_d13_c_pins[] = { PIN(BOOT_1, 0), PIN(BOOT_2, 0),
-                                               PIN(BOOT_3, 0) };
-static const unsigned int sdxc_d47_c_pins[] = { PIN(BOOT_4, 0), PIN(BOOT_5, 0),
-                                               PIN(BOOT_6, 0), PIN(BOOT_7, 0) };
-static const unsigned int sdxc_cmd_c_pins[] = { PIN(BOOT_16, 0) };
-static const unsigned int sdxc_clk_c_pins[] = { PIN(BOOT_17, 0) };
-
-static const unsigned int nand_io_pins[] = { PIN(BOOT_0, 0), PIN(BOOT_1, 0),
-                                            PIN(BOOT_2, 0), PIN(BOOT_3, 0),
-                                            PIN(BOOT_4, 0), PIN(BOOT_5, 0),
-                                            PIN(BOOT_6, 0), PIN(BOOT_7, 0) };
-static const unsigned int nand_io_ce0_pins[] = { PIN(BOOT_8, 0) };
-static const unsigned int nand_io_ce1_pins[] = { PIN(BOOT_9, 0) };
-static const unsigned int nand_io_rb0_pins[] = { PIN(BOOT_10, 0) };
-static const unsigned int nand_ale_pins[] = { PIN(BOOT_11, 0) };
-static const unsigned int nand_cle_pins[] = { PIN(BOOT_12, 0) };
-static const unsigned int nand_wen_clk_pins[] = { PIN(BOOT_13, 0) };
-static const unsigned int nand_ren_clk_pins[] = { PIN(BOOT_14, 0) };
-static const unsigned int nand_dqs_pins[] = { PIN(BOOT_15, 0) };
-static const unsigned int nand_ce2_pins[] = { PIN(BOOT_16, 0) };
-static const unsigned int nand_ce3_pins[] = { PIN(BOOT_17, 0) };
-
-static const unsigned int nor_d_pins[] = { PIN(BOOT_11, 0) };
-static const unsigned int nor_q_pins[] = { PIN(BOOT_12, 0) };
-static const unsigned int nor_c_pins[] = { PIN(BOOT_13, 0) };
-static const unsigned int nor_cs_pins[] = { PIN(BOOT_18, 0) };
+static const unsigned int sd_d0_c_pins[]       = { BOOT_0 };
+static const unsigned int sd_d1_c_pins[]       = { BOOT_1 };
+static const unsigned int sd_d2_c_pins[]       = { BOOT_2 };
+static const unsigned int sd_d3_c_pins[]       = { BOOT_3 };
+static const unsigned int sd_cmd_c_pins[]      = { BOOT_16 };
+static const unsigned int sd_clk_c_pins[]      = { BOOT_17 };
+
+static const unsigned int sdxc_d0_c_pins[]     = { BOOT_0};
+static const unsigned int sdxc_d13_c_pins[]    = { BOOT_1, BOOT_2, BOOT_3 };
+static const unsigned int sdxc_d47_c_pins[]    = { BOOT_4, BOOT_5, BOOT_6,
+                                                   BOOT_7 };
+static const unsigned int sdxc_cmd_c_pins[]    = { BOOT_16 };
+static const unsigned int sdxc_clk_c_pins[]    = { BOOT_17 };
+
+static const unsigned int nand_io_pins[] = {
+       BOOT_0, BOOT_1, BOOT_2, BOOT_3, BOOT_4, BOOT_5, BOOT_6, BOOT_7
+};
+static const unsigned int nand_io_ce0_pins[]   = { BOOT_8 };
+static const unsigned int nand_io_ce1_pins[]   = { BOOT_9 };
+static const unsigned int nand_io_rb0_pins[]   = { BOOT_10 };
+static const unsigned int nand_ale_pins[]      = { BOOT_11 };
+static const unsigned int nand_cle_pins[]      = { BOOT_12 };
+static const unsigned int nand_wen_clk_pins[]  = { BOOT_13 };
+static const unsigned int nand_ren_clk_pins[]  = { BOOT_14 };
+static const unsigned int nand_dqs_pins[]      = { BOOT_15 };
+static const unsigned int nand_ce2_pins[]      = { BOOT_16 };
+static const unsigned int nand_ce3_pins[]      = { BOOT_17 };
+
+static const unsigned int nor_d_pins[]         = { BOOT_11 };
+static const unsigned int nor_q_pins[]         = { BOOT_12 };
+static const unsigned int nor_c_pins[]         = { BOOT_13 };
+static const unsigned int nor_cs_pins[]                = { BOOT_18 };
 
 /* bank CARD */
-static const unsigned int sd_d1_b_pins[] = { PIN(CARD_0, 0) };
-static const unsigned int sd_d0_b_pins[] = { PIN(CARD_1, 0) };
-static const unsigned int sd_clk_b_pins[] = { PIN(CARD_2, 0) };
-static const unsigned int sd_cmd_b_pins[] = { PIN(CARD_3, 0) };
-static const unsigned int sd_d3_b_pins[] = { PIN(CARD_4, 0) };
-static const unsigned int sd_d2_b_pins[] = { PIN(CARD_5, 0) };
-
-static const unsigned int sdxc_d13_b_pins[] = { PIN(CARD_0, 0), PIN(CARD_4, 0),
-                                               PIN(CARD_5, 0) };
-static const unsigned int sdxc_d0_b_pins[] = { PIN(CARD_1, 0) };
-static const unsigned int sdxc_clk_b_pins[] = { PIN(CARD_2, 0) };
-static const unsigned int sdxc_cmd_b_pins[] = { PIN(CARD_3, 0) };
+static const unsigned int sd_d1_b_pins[]       = { CARD_0 };
+static const unsigned int sd_d0_b_pins[]       = { CARD_1 };
+static const unsigned int sd_clk_b_pins[]      = { CARD_2 };
+static const unsigned int sd_cmd_b_pins[]      = { CARD_3 };
+static const unsigned int sd_d3_b_pins[]       = { CARD_4 };
+static const unsigned int sd_d2_b_pins[]       = { CARD_5 };
+
+static const unsigned int sdxc_d13_b_pins[]    = { CARD_0, CARD_4, CARD_5 };
+static const unsigned int sdxc_d0_b_pins[]     = { CARD_1 };
+static const unsigned int sdxc_clk_b_pins[]    = { CARD_2 };
+static const unsigned int sdxc_cmd_b_pins[]    = { CARD_3 };
 
 /* bank AO */
-static const unsigned int uart_tx_ao_a_pins[] = { PIN(GPIOAO_0, AO_OFF) };
-static const unsigned int uart_rx_ao_a_pins[] = { PIN(GPIOAO_1, AO_OFF) };
-static const unsigned int uart_cts_ao_a_pins[] = { PIN(GPIOAO_2, AO_OFF) };
-static const unsigned int uart_rts_ao_a_pins[] = { PIN(GPIOAO_3, AO_OFF) };
+static const unsigned int uart_tx_ao_a_pins[]  = { GPIOAO_0 };
+static const unsigned int uart_rx_ao_a_pins[]  = { GPIOAO_1 };
+static const unsigned int uart_cts_ao_a_pins[] = { GPIOAO_2 };
+static const unsigned int uart_rts_ao_a_pins[] = { GPIOAO_3 };
 
-static const unsigned int remote_input_pins[] = { PIN(GPIOAO_7, AO_OFF) };
-static const unsigned int remote_output_ao_pins[] = { PIN(GPIOAO_13, AO_OFF) };
+static const unsigned int remote_input_pins[]  = { GPIOAO_7 };
+static const unsigned int remote_output_ao_pins[] = { GPIOAO_13 };
 
-static const unsigned int i2c_slave_sck_ao_pins[] = { PIN(GPIOAO_4, AO_OFF) };
-static const unsigned int i2c_slave_sda_ao_pins[] = { PIN(GPIOAO_5, AO_OFF) };
+static const unsigned int i2c_slave_sck_ao_pins[] = { GPIOAO_4 };
+static const unsigned int i2c_slave_sda_ao_pins[] = { GPIOAO_5 };
 
-static const unsigned int uart_tx_ao_b0_pins[] = { PIN(GPIOAO_0, AO_OFF) };
-static const unsigned int uart_rx_ao_b0_pins[] = { PIN(GPIOAO_1, AO_OFF) };
+static const unsigned int uart_tx_ao_b0_pins[] = { GPIOAO_0 };
+static const unsigned int uart_rx_ao_b0_pins[] = { GPIOAO_1 };
 
-static const unsigned int uart_tx_ao_b1_pins[] = { PIN(GPIOAO_4, AO_OFF) };
-static const unsigned int uart_rx_ao_b1_pins[] = { PIN(GPIOAO_5, AO_OFF) };
+static const unsigned int uart_tx_ao_b1_pins[] = { GPIOAO_4 };
+static const unsigned int uart_rx_ao_b1_pins[] = { GPIOAO_5 };
 
-static const unsigned int i2c_mst_sck_ao_pins[] = { PIN(GPIOAO_4, AO_OFF) };
-static const unsigned int i2c_mst_sda_ao_pins[] = { PIN(GPIOAO_5, AO_OFF) };
+static const unsigned int i2c_mst_sck_ao_pins[]        = { GPIOAO_4 };
+static const unsigned int i2c_mst_sda_ao_pins[]        = { GPIOAO_5 };
 
-static const unsigned int pwm_f_ao_pins[] = { PIN(GPIO_TEST_N, AO_OFF) };
+static const unsigned int pwm_f_ao_pins[]      = { GPIO_TEST_N };
 
-static const unsigned int i2s_am_clk_out_ao_pins[] = { PIN(GPIOAO_8, AO_OFF) };
-static const unsigned int i2s_ao_clk_out_ao_pins[] = { PIN(GPIOAO_9, AO_OFF) };
-static const unsigned int i2s_lr_clk_out_ao_pins[] = { PIN(GPIOAO_10, AO_OFF) };
-static const unsigned int i2s_out_ch01_ao_pins[] = { PIN(GPIOAO_11, AO_OFF) };
+static const unsigned int i2s_am_clk_out_ao_pins[] = { GPIOAO_8 };
+static const unsigned int i2s_ao_clk_out_ao_pins[] = { GPIOAO_9 };
+static const unsigned int i2s_lr_clk_out_ao_pins[] = { GPIOAO_10 };
+static const unsigned int i2s_out_ch01_ao_pins[] = { GPIOAO_11 };
 
-static const unsigned int hdmi_cec_ao_pins[] = { PIN(GPIOAO_12, AO_OFF) };
+static const unsigned int hdmi_cec_ao_pins[]   = { GPIOAO_12 };
 
 static struct meson_pmx_group meson8_cbus_groups[] = {
-       GPIO_GROUP(GPIOX_0, 0),
-       GPIO_GROUP(GPIOX_1, 0),
-       GPIO_GROUP(GPIOX_2, 0),
-       GPIO_GROUP(GPIOX_3, 0),
-       GPIO_GROUP(GPIOX_4, 0),
-       GPIO_GROUP(GPIOX_5, 0),
-       GPIO_GROUP(GPIOX_6, 0),
-       GPIO_GROUP(GPIOX_7, 0),
-       GPIO_GROUP(GPIOX_8, 0),
-       GPIO_GROUP(GPIOX_9, 0),
-       GPIO_GROUP(GPIOX_10, 0),
-       GPIO_GROUP(GPIOX_11, 0),
-       GPIO_GROUP(GPIOX_12, 0),
-       GPIO_GROUP(GPIOX_13, 0),
-       GPIO_GROUP(GPIOX_14, 0),
-       GPIO_GROUP(GPIOX_15, 0),
-       GPIO_GROUP(GPIOX_16, 0),
-       GPIO_GROUP(GPIOX_17, 0),
-       GPIO_GROUP(GPIOX_18, 0),
-       GPIO_GROUP(GPIOX_19, 0),
-       GPIO_GROUP(GPIOX_20, 0),
-       GPIO_GROUP(GPIOX_21, 0),
-       GPIO_GROUP(GPIOY_0, 0),
-       GPIO_GROUP(GPIOY_1, 0),
-       GPIO_GROUP(GPIOY_2, 0),
-       GPIO_GROUP(GPIOY_3, 0),
-       GPIO_GROUP(GPIOY_4, 0),
-       GPIO_GROUP(GPIOY_5, 0),
-       GPIO_GROUP(GPIOY_6, 0),
-       GPIO_GROUP(GPIOY_7, 0),
-       GPIO_GROUP(GPIOY_8, 0),
-       GPIO_GROUP(GPIOY_9, 0),
-       GPIO_GROUP(GPIOY_10, 0),
-       GPIO_GROUP(GPIOY_11, 0),
-       GPIO_GROUP(GPIOY_12, 0),
-       GPIO_GROUP(GPIOY_13, 0),
-       GPIO_GROUP(GPIOY_14, 0),
-       GPIO_GROUP(GPIOY_15, 0),
-       GPIO_GROUP(GPIOY_16, 0),
-       GPIO_GROUP(GPIODV_0, 0),
-       GPIO_GROUP(GPIODV_1, 0),
-       GPIO_GROUP(GPIODV_2, 0),
-       GPIO_GROUP(GPIODV_3, 0),
-       GPIO_GROUP(GPIODV_4, 0),
-       GPIO_GROUP(GPIODV_5, 0),
-       GPIO_GROUP(GPIODV_6, 0),
-       GPIO_GROUP(GPIODV_7, 0),
-       GPIO_GROUP(GPIODV_8, 0),
-       GPIO_GROUP(GPIODV_9, 0),
-       GPIO_GROUP(GPIODV_10, 0),
-       GPIO_GROUP(GPIODV_11, 0),
-       GPIO_GROUP(GPIODV_12, 0),
-       GPIO_GROUP(GPIODV_13, 0),
-       GPIO_GROUP(GPIODV_14, 0),
-       GPIO_GROUP(GPIODV_15, 0),
-       GPIO_GROUP(GPIODV_16, 0),
-       GPIO_GROUP(GPIODV_17, 0),
-       GPIO_GROUP(GPIODV_18, 0),
-       GPIO_GROUP(GPIODV_19, 0),
-       GPIO_GROUP(GPIODV_20, 0),
-       GPIO_GROUP(GPIODV_21, 0),
-       GPIO_GROUP(GPIODV_22, 0),
-       GPIO_GROUP(GPIODV_23, 0),
-       GPIO_GROUP(GPIODV_24, 0),
-       GPIO_GROUP(GPIODV_25, 0),
-       GPIO_GROUP(GPIODV_26, 0),
-       GPIO_GROUP(GPIODV_27, 0),
-       GPIO_GROUP(GPIODV_28, 0),
-       GPIO_GROUP(GPIODV_29, 0),
-       GPIO_GROUP(GPIOH_0, 0),
-       GPIO_GROUP(GPIOH_1, 0),
-       GPIO_GROUP(GPIOH_2, 0),
-       GPIO_GROUP(GPIOH_3, 0),
-       GPIO_GROUP(GPIOH_4, 0),
-       GPIO_GROUP(GPIOH_5, 0),
-       GPIO_GROUP(GPIOH_6, 0),
-       GPIO_GROUP(GPIOH_7, 0),
-       GPIO_GROUP(GPIOH_8, 0),
-       GPIO_GROUP(GPIOH_9, 0),
-       GPIO_GROUP(GPIOZ_0, 0),
-       GPIO_GROUP(GPIOZ_1, 0),
-       GPIO_GROUP(GPIOZ_2, 0),
-       GPIO_GROUP(GPIOZ_3, 0),
-       GPIO_GROUP(GPIOZ_4, 0),
-       GPIO_GROUP(GPIOZ_5, 0),
-       GPIO_GROUP(GPIOZ_6, 0),
-       GPIO_GROUP(GPIOZ_7, 0),
-       GPIO_GROUP(GPIOZ_8, 0),
-       GPIO_GROUP(GPIOZ_9, 0),
-       GPIO_GROUP(GPIOZ_10, 0),
-       GPIO_GROUP(GPIOZ_11, 0),
-       GPIO_GROUP(GPIOZ_12, 0),
-       GPIO_GROUP(GPIOZ_13, 0),
-       GPIO_GROUP(GPIOZ_14, 0),
+       GPIO_GROUP(GPIOX_0),
+       GPIO_GROUP(GPIOX_1),
+       GPIO_GROUP(GPIOX_2),
+       GPIO_GROUP(GPIOX_3),
+       GPIO_GROUP(GPIOX_4),
+       GPIO_GROUP(GPIOX_5),
+       GPIO_GROUP(GPIOX_6),
+       GPIO_GROUP(GPIOX_7),
+       GPIO_GROUP(GPIOX_8),
+       GPIO_GROUP(GPIOX_9),
+       GPIO_GROUP(GPIOX_10),
+       GPIO_GROUP(GPIOX_11),
+       GPIO_GROUP(GPIOX_12),
+       GPIO_GROUP(GPIOX_13),
+       GPIO_GROUP(GPIOX_14),
+       GPIO_GROUP(GPIOX_15),
+       GPIO_GROUP(GPIOX_16),
+       GPIO_GROUP(GPIOX_17),
+       GPIO_GROUP(GPIOX_18),
+       GPIO_GROUP(GPIOX_19),
+       GPIO_GROUP(GPIOX_20),
+       GPIO_GROUP(GPIOX_21),
+       GPIO_GROUP(GPIOY_0),
+       GPIO_GROUP(GPIOY_1),
+       GPIO_GROUP(GPIOY_2),
+       GPIO_GROUP(GPIOY_3),
+       GPIO_GROUP(GPIOY_4),
+       GPIO_GROUP(GPIOY_5),
+       GPIO_GROUP(GPIOY_6),
+       GPIO_GROUP(GPIOY_7),
+       GPIO_GROUP(GPIOY_8),
+       GPIO_GROUP(GPIOY_9),
+       GPIO_GROUP(GPIOY_10),
+       GPIO_GROUP(GPIOY_11),
+       GPIO_GROUP(GPIOY_12),
+       GPIO_GROUP(GPIOY_13),
+       GPIO_GROUP(GPIOY_14),
+       GPIO_GROUP(GPIOY_15),
+       GPIO_GROUP(GPIOY_16),
+       GPIO_GROUP(GPIODV_0),
+       GPIO_GROUP(GPIODV_1),
+       GPIO_GROUP(GPIODV_2),
+       GPIO_GROUP(GPIODV_3),
+       GPIO_GROUP(GPIODV_4),
+       GPIO_GROUP(GPIODV_5),
+       GPIO_GROUP(GPIODV_6),
+       GPIO_GROUP(GPIODV_7),
+       GPIO_GROUP(GPIODV_8),
+       GPIO_GROUP(GPIODV_9),
+       GPIO_GROUP(GPIODV_10),
+       GPIO_GROUP(GPIODV_11),
+       GPIO_GROUP(GPIODV_12),
+       GPIO_GROUP(GPIODV_13),
+       GPIO_GROUP(GPIODV_14),
+       GPIO_GROUP(GPIODV_15),
+       GPIO_GROUP(GPIODV_16),
+       GPIO_GROUP(GPIODV_17),
+       GPIO_GROUP(GPIODV_18),
+       GPIO_GROUP(GPIODV_19),
+       GPIO_GROUP(GPIODV_20),
+       GPIO_GROUP(GPIODV_21),
+       GPIO_GROUP(GPIODV_22),
+       GPIO_GROUP(GPIODV_23),
+       GPIO_GROUP(GPIODV_24),
+       GPIO_GROUP(GPIODV_25),
+       GPIO_GROUP(GPIODV_26),
+       GPIO_GROUP(GPIODV_27),
+       GPIO_GROUP(GPIODV_28),
+       GPIO_GROUP(GPIODV_29),
+       GPIO_GROUP(GPIOH_0),
+       GPIO_GROUP(GPIOH_1),
+       GPIO_GROUP(GPIOH_2),
+       GPIO_GROUP(GPIOH_3),
+       GPIO_GROUP(GPIOH_4),
+       GPIO_GROUP(GPIOH_5),
+       GPIO_GROUP(GPIOH_6),
+       GPIO_GROUP(GPIOH_7),
+       GPIO_GROUP(GPIOH_8),
+       GPIO_GROUP(GPIOH_9),
+       GPIO_GROUP(GPIOZ_0),
+       GPIO_GROUP(GPIOZ_1),
+       GPIO_GROUP(GPIOZ_2),
+       GPIO_GROUP(GPIOZ_3),
+       GPIO_GROUP(GPIOZ_4),
+       GPIO_GROUP(GPIOZ_5),
+       GPIO_GROUP(GPIOZ_6),
+       GPIO_GROUP(GPIOZ_7),
+       GPIO_GROUP(GPIOZ_8),
+       GPIO_GROUP(GPIOZ_9),
+       GPIO_GROUP(GPIOZ_10),
+       GPIO_GROUP(GPIOZ_11),
+       GPIO_GROUP(GPIOZ_12),
+       GPIO_GROUP(GPIOZ_13),
+       GPIO_GROUP(GPIOZ_14),
 
        /* bank X */
        GROUP(sd_d0_a,          8,      5),
@@ -727,22 +716,22 @@ static struct meson_pmx_group meson8_cbus_groups[] = {
 };
 
 static struct meson_pmx_group meson8_aobus_groups[] = {
-       GPIO_GROUP(GPIOAO_0, AO_OFF),
-       GPIO_GROUP(GPIOAO_1, AO_OFF),
-       GPIO_GROUP(GPIOAO_2, AO_OFF),
-       GPIO_GROUP(GPIOAO_3, AO_OFF),
-       GPIO_GROUP(GPIOAO_4, AO_OFF),
-       GPIO_GROUP(GPIOAO_5, AO_OFF),
-       GPIO_GROUP(GPIOAO_6, AO_OFF),
-       GPIO_GROUP(GPIOAO_7, AO_OFF),
-       GPIO_GROUP(GPIOAO_8, AO_OFF),
-       GPIO_GROUP(GPIOAO_9, AO_OFF),
-       GPIO_GROUP(GPIOAO_10, AO_OFF),
-       GPIO_GROUP(GPIOAO_11, AO_OFF),
-       GPIO_GROUP(GPIOAO_12, AO_OFF),
-       GPIO_GROUP(GPIOAO_13, AO_OFF),
-       GPIO_GROUP(GPIO_BSD_EN, AO_OFF),
-       GPIO_GROUP(GPIO_TEST_N, AO_OFF),
+       GPIO_GROUP(GPIOAO_0),
+       GPIO_GROUP(GPIOAO_1),
+       GPIO_GROUP(GPIOAO_2),
+       GPIO_GROUP(GPIOAO_3),
+       GPIO_GROUP(GPIOAO_4),
+       GPIO_GROUP(GPIOAO_5),
+       GPIO_GROUP(GPIOAO_6),
+       GPIO_GROUP(GPIOAO_7),
+       GPIO_GROUP(GPIOAO_8),
+       GPIO_GROUP(GPIOAO_9),
+       GPIO_GROUP(GPIOAO_10),
+       GPIO_GROUP(GPIOAO_11),
+       GPIO_GROUP(GPIOAO_12),
+       GPIO_GROUP(GPIOAO_13),
+       GPIO_GROUP(GPIO_BSD_EN),
+       GPIO_GROUP(GPIO_TEST_N),
 
        /* bank AO */
        GROUP(uart_tx_ao_a,             0,      12),
@@ -1041,24 +1030,23 @@ static struct meson_pmx_func meson8_aobus_functions[] = {
 };
 
 static struct meson_bank meson8_cbus_banks[] = {
-       /*   name    first             last                 irq       pullen  pull    dir     out     in  */
-       BANK("X",    PIN(GPIOX_0, 0),  PIN(GPIOX_21, 0),    112, 133, 4,  0,  4,  0,  0,  0,  1,  0,  2,  0),
-       BANK("Y",    PIN(GPIOY_0, 0),  PIN(GPIOY_16, 0),    95,  111, 3,  0,  3,  0,  3,  0,  4,  0,  5,  0),
-       BANK("DV",   PIN(GPIODV_0, 0), PIN(GPIODV_29, 0),   65,   94, 0,  0,  0,  0,  7,  0,  8,  0,  9,  0),
-       BANK("H",    PIN(GPIOH_0, 0),  PIN(GPIOH_9, 0),     29,   38, 1, 16,  1, 16,  9, 19, 10, 19, 11, 19),
-       BANK("Z",    PIN(GPIOZ_0, 0),  PIN(GPIOZ_14, 0),    14,   28, 1,  0,  1,  0,  3, 17,  4, 17,  5, 17),
-       BANK("CARD", PIN(CARD_0, 0),   PIN(CARD_6, 0),      58,   64, 2, 20,  2, 20,  0, 22,  1, 22,  2, 22),
-       BANK("BOOT", PIN(BOOT_0, 0),   PIN(BOOT_18, 0),     39,   57, 2,  0,  2,  0,  9,  0, 10,  0, 11,  0),
+       /*   name    first     last         irq       pullen  pull    dir     out     in  */
+       BANK("X",    GPIOX_0,  GPIOX_21,    112, 133, 4,  0,  4,  0,  0,  0,  1,  0,  2,  0),
+       BANK("Y",    GPIOY_0,  GPIOY_16,    95,  111, 3,  0,  3,  0,  3,  0,  4,  0,  5,  0),
+       BANK("DV",   GPIODV_0, GPIODV_29,   65,   94, 0,  0,  0,  0,  7,  0,  8,  0,  9,  0),
+       BANK("H",    GPIOH_0,  GPIOH_9,     29,   38, 1, 16,  1, 16,  9, 19, 10, 19, 11, 19),
+       BANK("Z",    GPIOZ_0,  GPIOZ_14,    14,   28, 1,  0,  1,  0,  3, 17,  4, 17,  5, 17),
+       BANK("CARD", CARD_0,   CARD_6,      58,   64, 2, 20,  2, 20,  0, 22,  1, 22,  2, 22),
+       BANK("BOOT", BOOT_0,   BOOT_18,     39,   57, 2,  0,  2,  0,  9,  0, 10,  0, 11,  0),
 };
 
 static struct meson_bank meson8_aobus_banks[] = {
-       /*   name    first                  last                      irq    pullen  pull    dir     out     in  */
-       BANK("AO",   PIN(GPIOAO_0, AO_OFF), PIN(GPIO_TEST_N, AO_OFF), 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
+       /*   name    first     last         irq    pullen  pull    dir     out     in  */
+       BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
+static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
        .name           = "cbus-banks",
-       .pin_base       = 0,
        .pins           = meson8_cbus_pins,
        .groups         = meson8_cbus_groups,
        .funcs          = meson8_cbus_functions,
@@ -1067,11 +1055,11 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
        .num_groups     = ARRAY_SIZE(meson8_cbus_groups),
        .num_funcs      = ARRAY_SIZE(meson8_cbus_functions),
        .num_banks      = ARRAY_SIZE(meson8_cbus_banks),
+       .pmx_ops        = &meson8_pmx_ops,
 };
 
-struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
        .name           = "ao-bank",
-       .pin_base       = 120,
        .pins           = meson8_aobus_pins,
        .groups         = meson8_aobus_groups,
        .funcs          = meson8_aobus_functions,
@@ -1080,4 +1068,26 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
        .num_groups     = ARRAY_SIZE(meson8_aobus_groups),
        .num_funcs      = ARRAY_SIZE(meson8_aobus_functions),
        .num_banks      = ARRAY_SIZE(meson8_aobus_banks),
+       .pmx_ops        = &meson8_pmx_ops,
+};
+
+static const struct of_device_id meson8_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson8-cbus-pinctrl",
+               .data = &meson8_cbus_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson8-aobus-pinctrl",
+               .data = &meson8_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson8_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson8-pinctrl",
+               .of_match_table = meson8_pinctrl_dt_match,
+       },
 };
+builtin_platform_driver(meson8_pinctrl_driver);
index 71f216b5b0b9a0c956f9f9a5f6459f865665ad20..5bd808dc81e1aa95637d4be7ebd83b93aa5720af 100644 (file)
 
 #include <dt-bindings/gpio/meson8b-gpio.h>
 #include "pinctrl-meson.h"
-
-#define AO_OFF 130
+#include "pinctrl-meson8-pmx.h"
 
 static const struct pinctrl_pin_desc meson8b_cbus_pins[] = {
-       MESON_PIN(GPIOX_0, 0),
-       MESON_PIN(GPIOX_1, 0),
-       MESON_PIN(GPIOX_2, 0),
-       MESON_PIN(GPIOX_3, 0),
-       MESON_PIN(GPIOX_4, 0),
-       MESON_PIN(GPIOX_5, 0),
-       MESON_PIN(GPIOX_6, 0),
-       MESON_PIN(GPIOX_7, 0),
-       MESON_PIN(GPIOX_8, 0),
-       MESON_PIN(GPIOX_9, 0),
-       MESON_PIN(GPIOX_10, 0),
-       MESON_PIN(GPIOX_11, 0),
-       MESON_PIN(GPIOX_16, 0),
-       MESON_PIN(GPIOX_17, 0),
-       MESON_PIN(GPIOX_18, 0),
-       MESON_PIN(GPIOX_19, 0),
-       MESON_PIN(GPIOX_20, 0),
-       MESON_PIN(GPIOX_21, 0),
-
-       MESON_PIN(GPIOY_0, 0),
-       MESON_PIN(GPIOY_1, 0),
-       MESON_PIN(GPIOY_3, 0),
-       MESON_PIN(GPIOY_6, 0),
-       MESON_PIN(GPIOY_7, 0),
-       MESON_PIN(GPIOY_8, 0),
-       MESON_PIN(GPIOY_9, 0),
-       MESON_PIN(GPIOY_10, 0),
-       MESON_PIN(GPIOY_11, 0),
-       MESON_PIN(GPIOY_12, 0),
-       MESON_PIN(GPIOY_13, 0),
-       MESON_PIN(GPIOY_14, 0),
-
-       MESON_PIN(GPIODV_9, 0),
-       MESON_PIN(GPIODV_24, 0),
-       MESON_PIN(GPIODV_25, 0),
-       MESON_PIN(GPIODV_26, 0),
-       MESON_PIN(GPIODV_27, 0),
-       MESON_PIN(GPIODV_28, 0),
-       MESON_PIN(GPIODV_29, 0),
-
-       MESON_PIN(GPIOH_0, 0),
-       MESON_PIN(GPIOH_1, 0),
-       MESON_PIN(GPIOH_2, 0),
-       MESON_PIN(GPIOH_3, 0),
-       MESON_PIN(GPIOH_4, 0),
-       MESON_PIN(GPIOH_5, 0),
-       MESON_PIN(GPIOH_6, 0),
-       MESON_PIN(GPIOH_7, 0),
-       MESON_PIN(GPIOH_8, 0),
-       MESON_PIN(GPIOH_9, 0),
-
-       MESON_PIN(CARD_0, 0),
-       MESON_PIN(CARD_1, 0),
-       MESON_PIN(CARD_2, 0),
-       MESON_PIN(CARD_3, 0),
-       MESON_PIN(CARD_4, 0),
-       MESON_PIN(CARD_5, 0),
-       MESON_PIN(CARD_6, 0),
-
-       MESON_PIN(BOOT_0, 0),
-       MESON_PIN(BOOT_1, 0),
-       MESON_PIN(BOOT_2, 0),
-       MESON_PIN(BOOT_3, 0),
-       MESON_PIN(BOOT_4, 0),
-       MESON_PIN(BOOT_5, 0),
-       MESON_PIN(BOOT_6, 0),
-       MESON_PIN(BOOT_7, 0),
-       MESON_PIN(BOOT_8, 0),
-       MESON_PIN(BOOT_9, 0),
-       MESON_PIN(BOOT_10, 0),
-       MESON_PIN(BOOT_11, 0),
-       MESON_PIN(BOOT_12, 0),
-       MESON_PIN(BOOT_13, 0),
-       MESON_PIN(BOOT_14, 0),
-       MESON_PIN(BOOT_15, 0),
-       MESON_PIN(BOOT_16, 0),
-       MESON_PIN(BOOT_17, 0),
-       MESON_PIN(BOOT_18, 0),
-
-       MESON_PIN(DIF_0_P, 0),
-       MESON_PIN(DIF_0_N, 0),
-       MESON_PIN(DIF_1_P, 0),
-       MESON_PIN(DIF_1_N, 0),
-       MESON_PIN(DIF_2_P, 0),
-       MESON_PIN(DIF_2_N, 0),
-       MESON_PIN(DIF_3_P, 0),
-       MESON_PIN(DIF_3_N, 0),
-       MESON_PIN(DIF_4_P, 0),
-       MESON_PIN(DIF_4_N, 0),
+       MESON_PIN(GPIOX_0),
+       MESON_PIN(GPIOX_1),
+       MESON_PIN(GPIOX_2),
+       MESON_PIN(GPIOX_3),
+       MESON_PIN(GPIOX_4),
+       MESON_PIN(GPIOX_5),
+       MESON_PIN(GPIOX_6),
+       MESON_PIN(GPIOX_7),
+       MESON_PIN(GPIOX_8),
+       MESON_PIN(GPIOX_9),
+       MESON_PIN(GPIOX_10),
+       MESON_PIN(GPIOX_11),
+       MESON_PIN(GPIOX_16),
+       MESON_PIN(GPIOX_17),
+       MESON_PIN(GPIOX_18),
+       MESON_PIN(GPIOX_19),
+       MESON_PIN(GPIOX_20),
+       MESON_PIN(GPIOX_21),
+
+       MESON_PIN(GPIOY_0),
+       MESON_PIN(GPIOY_1),
+       MESON_PIN(GPIOY_3),
+       MESON_PIN(GPIOY_6),
+       MESON_PIN(GPIOY_7),
+       MESON_PIN(GPIOY_8),
+       MESON_PIN(GPIOY_9),
+       MESON_PIN(GPIOY_10),
+       MESON_PIN(GPIOY_11),
+       MESON_PIN(GPIOY_12),
+       MESON_PIN(GPIOY_13),
+       MESON_PIN(GPIOY_14),
+
+       MESON_PIN(GPIODV_9),
+       MESON_PIN(GPIODV_24),
+       MESON_PIN(GPIODV_25),
+       MESON_PIN(GPIODV_26),
+       MESON_PIN(GPIODV_27),
+       MESON_PIN(GPIODV_28),
+       MESON_PIN(GPIODV_29),
+
+       MESON_PIN(GPIOH_0),
+       MESON_PIN(GPIOH_1),
+       MESON_PIN(GPIOH_2),
+       MESON_PIN(GPIOH_3),
+       MESON_PIN(GPIOH_4),
+       MESON_PIN(GPIOH_5),
+       MESON_PIN(GPIOH_6),
+       MESON_PIN(GPIOH_7),
+       MESON_PIN(GPIOH_8),
+       MESON_PIN(GPIOH_9),
+
+       MESON_PIN(CARD_0),
+       MESON_PIN(CARD_1),
+       MESON_PIN(CARD_2),
+       MESON_PIN(CARD_3),
+       MESON_PIN(CARD_4),
+       MESON_PIN(CARD_5),
+       MESON_PIN(CARD_6),
+
+       MESON_PIN(BOOT_0),
+       MESON_PIN(BOOT_1),
+       MESON_PIN(BOOT_2),
+       MESON_PIN(BOOT_3),
+       MESON_PIN(BOOT_4),
+       MESON_PIN(BOOT_5),
+       MESON_PIN(BOOT_6),
+       MESON_PIN(BOOT_7),
+       MESON_PIN(BOOT_8),
+       MESON_PIN(BOOT_9),
+       MESON_PIN(BOOT_10),
+       MESON_PIN(BOOT_11),
+       MESON_PIN(BOOT_12),
+       MESON_PIN(BOOT_13),
+       MESON_PIN(BOOT_14),
+       MESON_PIN(BOOT_15),
+       MESON_PIN(BOOT_16),
+       MESON_PIN(BOOT_17),
+       MESON_PIN(BOOT_18),
+
+       MESON_PIN(DIF_0_P),
+       MESON_PIN(DIF_0_N),
+       MESON_PIN(DIF_1_P),
+       MESON_PIN(DIF_1_N),
+       MESON_PIN(DIF_2_P),
+       MESON_PIN(DIF_2_N),
+       MESON_PIN(DIF_3_P),
+       MESON_PIN(DIF_3_N),
+       MESON_PIN(DIF_4_P),
+       MESON_PIN(DIF_4_N),
 };
 
 static const struct pinctrl_pin_desc meson8b_aobus_pins[] = {
-       MESON_PIN(GPIOAO_0, AO_OFF),
-       MESON_PIN(GPIOAO_1, AO_OFF),
-       MESON_PIN(GPIOAO_2, AO_OFF),
-       MESON_PIN(GPIOAO_3, AO_OFF),
-       MESON_PIN(GPIOAO_4, AO_OFF),
-       MESON_PIN(GPIOAO_5, AO_OFF),
-       MESON_PIN(GPIOAO_6, AO_OFF),
-       MESON_PIN(GPIOAO_7, AO_OFF),
-       MESON_PIN(GPIOAO_8, AO_OFF),
-       MESON_PIN(GPIOAO_9, AO_OFF),
-       MESON_PIN(GPIOAO_10, AO_OFF),
-       MESON_PIN(GPIOAO_11, AO_OFF),
-       MESON_PIN(GPIOAO_12, AO_OFF),
-       MESON_PIN(GPIOAO_13, AO_OFF),
+       MESON_PIN(GPIOAO_0),
+       MESON_PIN(GPIOAO_1),
+       MESON_PIN(GPIOAO_2),
+       MESON_PIN(GPIOAO_3),
+       MESON_PIN(GPIOAO_4),
+       MESON_PIN(GPIOAO_5),
+       MESON_PIN(GPIOAO_6),
+       MESON_PIN(GPIOAO_7),
+       MESON_PIN(GPIOAO_8),
+       MESON_PIN(GPIOAO_9),
+       MESON_PIN(GPIOAO_10),
+       MESON_PIN(GPIOAO_11),
+       MESON_PIN(GPIOAO_12),
+       MESON_PIN(GPIOAO_13),
 
        /*
         * The following 2 pins are not mentionned in the public datasheet
         * According to this datasheet, they can't be used with the gpio
         * interrupt controller
         */
-       MESON_PIN(GPIO_BSD_EN, AO_OFF),
-       MESON_PIN(GPIO_TEST_N, AO_OFF),
+       MESON_PIN(GPIO_BSD_EN),
+       MESON_PIN(GPIO_TEST_N),
 };
 
 /* bank X */
-static const unsigned int sd_d0_a_pins[]       = { PIN(GPIOX_0, 0) };
-static const unsigned int sd_d1_a_pins[]       = { PIN(GPIOX_1, 0) };
-static const unsigned int sd_d2_a_pins[]       = { PIN(GPIOX_2, 0) };
-static const unsigned int sd_d3_a_pins[]       = { PIN(GPIOX_3, 0) };
-static const unsigned int sdxc_d0_0_a_pins[]   = { PIN(GPIOX_4, 0) };
-static const unsigned int sdxc_d47_a_pins[]    = { PIN(GPIOX_4, 0), PIN(GPIOX_5, 0),
-                                                   PIN(GPIOX_6, 0), PIN(GPIOX_7, 0) };
-static const unsigned int sdxc_d13_0_a_pins[]  = { PIN(GPIOX_5, 0), PIN(GPIOX_6, 0),
-                                                   PIN(GPIOX_7, 0) };
-static const unsigned int sd_clk_a_pins[]      = { PIN(GPIOX_8, 0) };
-static const unsigned int sd_cmd_a_pins[]      = { PIN(GPIOX_9, 0) };
-static const unsigned int xtal_32k_out_pins[]  = { PIN(GPIOX_10, 0) };
-static const unsigned int xtal_24m_out_pins[]  = { PIN(GPIOX_11, 0) };
-static const unsigned int uart_tx_b0_pins[]    = { PIN(GPIOX_16, 0) };
-static const unsigned int uart_rx_b0_pins[]    = { PIN(GPIOX_17, 0) };
-static const unsigned int uart_cts_b0_pins[]   = { PIN(GPIOX_18, 0) };
-static const unsigned int uart_rts_b0_pins[]   = { PIN(GPIOX_19, 0) };
-
-static const unsigned int sdxc_d0_1_a_pins[]   = { PIN(GPIOX_0, 0) };
-static const unsigned int sdxc_d13_1_a_pins[]  = { PIN(GPIOX_1, 0), PIN(GPIOX_2, 0),
-                                                   PIN(GPIOX_3, 0) };
-static const unsigned int pcm_out_a_pins[]     = { PIN(GPIOX_4, 0) };
-static const unsigned int pcm_in_a_pins[]      = { PIN(GPIOX_5, 0) };
-static const unsigned int pcm_fs_a_pins[]      = { PIN(GPIOX_6, 0) };
-static const unsigned int pcm_clk_a_pins[]     = { PIN(GPIOX_7, 0) };
-static const unsigned int sdxc_clk_a_pins[]    = { PIN(GPIOX_8, 0) };
-static const unsigned int sdxc_cmd_a_pins[]    = { PIN(GPIOX_9, 0) };
-static const unsigned int pwm_vs_0_pins[]      = { PIN(GPIOX_10, 0) };
-static const unsigned int pwm_e_pins[]         = { PIN(GPIOX_10, 0) };
-static const unsigned int pwm_vs_1_pins[]      = { PIN(GPIOX_11, 0) };
-
-static const unsigned int uart_tx_a_pins[]     = { PIN(GPIOX_4, 0) };
-static const unsigned int uart_rx_a_pins[]     = { PIN(GPIOX_5, 0) };
-static const unsigned int uart_cts_a_pins[]    = { PIN(GPIOX_6, 0) };
-static const unsigned int uart_rts_a_pins[]    = { PIN(GPIOX_7, 0) };
-static const unsigned int uart_tx_b1_pins[]    = { PIN(GPIOX_8, 0) };
-static const unsigned int uart_rx_b1_pins[]    = { PIN(GPIOX_9, 0) };
-static const unsigned int uart_cts_b1_pins[]   = { PIN(GPIOX_10, 0) };
-static const unsigned int uart_rts_b1_pins[]   = { PIN(GPIOX_20, 0) };
-
-static const unsigned int iso7816_0_clk_pins[] = { PIN(GPIOX_6, 0) };
-static const unsigned int iso7816_0_data_pins[]        = { PIN(GPIOX_7, 0) };
-static const unsigned int spi_sclk_0_pins[]    = { PIN(GPIOX_8, 0) };
-static const unsigned int spi_miso_0_pins[]    = { PIN(GPIOX_9, 0) };
-static const unsigned int spi_mosi_0_pins[]    = { PIN(GPIOX_10, 0) };
-static const unsigned int iso7816_det_pins[]   = { PIN(GPIOX_16, 0) };
-static const unsigned int iso7816_reset_pins[] = { PIN(GPIOX_17, 0) };
-static const unsigned int iso7816_1_clk_pins[] = { PIN(GPIOX_18, 0) };
-static const unsigned int iso7816_1_data_pins[]        = { PIN(GPIOX_19, 0) };
-static const unsigned int spi_ss0_0_pins[]     = { PIN(GPIOX_20, 0) };
-
-static const unsigned int tsin_clk_b_pins[]    = { PIN(GPIOX_8, 0) };
-static const unsigned int tsin_sop_b_pins[]    = { PIN(GPIOX_9, 0) };
-static const unsigned int tsin_d0_b_pins[]     = { PIN(GPIOX_10, 0) };
-static const unsigned int pwm_b_pins[]         = { PIN(GPIOX_11, 0) };
-static const unsigned int i2c_sda_d0_pins[]    = { PIN(GPIOX_16, 0) };
-static const unsigned int i2c_sck_d0_pins[]    = { PIN(GPIOX_17, 0) };
-static const unsigned int tsin_d_valid_b_pins[] = { PIN(GPIOX_20, 0) };
+static const unsigned int sd_d0_a_pins[]       = { GPIOX_0 };
+static const unsigned int sd_d1_a_pins[]       = { GPIOX_1 };
+static const unsigned int sd_d2_a_pins[]       = { GPIOX_2 };
+static const unsigned int sd_d3_a_pins[]       = { GPIOX_3 };
+static const unsigned int sdxc_d0_0_a_pins[]   = { GPIOX_4 };
+static const unsigned int sdxc_d47_a_pins[]    = { GPIOX_4, GPIOX_5,
+                                                   GPIOX_6, GPIOX_7 };
+static const unsigned int sdxc_d13_0_a_pins[]  = { GPIOX_5, GPIOX_6,
+                                                   GPIOX_7 };
+static const unsigned int sd_clk_a_pins[]      = { GPIOX_8 };
+static const unsigned int sd_cmd_a_pins[]      = { GPIOX_9 };
+static const unsigned int xtal_32k_out_pins[]  = { GPIOX_10 };
+static const unsigned int xtal_24m_out_pins[]  = { GPIOX_11 };
+static const unsigned int uart_tx_b0_pins[]    = { GPIOX_16 };
+static const unsigned int uart_rx_b0_pins[]    = { GPIOX_17 };
+static const unsigned int uart_cts_b0_pins[]   = { GPIOX_18 };
+static const unsigned int uart_rts_b0_pins[]   = { GPIOX_19 };
+
+static const unsigned int sdxc_d0_1_a_pins[]   = { GPIOX_0 };
+static const unsigned int sdxc_d13_1_a_pins[]  = { GPIOX_1, GPIOX_2,
+                                                   GPIOX_3 };
+static const unsigned int pcm_out_a_pins[]     = { GPIOX_4 };
+static const unsigned int pcm_in_a_pins[]      = { GPIOX_5 };
+static const unsigned int pcm_fs_a_pins[]      = { GPIOX_6 };
+static const unsigned int pcm_clk_a_pins[]     = { GPIOX_7 };
+static const unsigned int sdxc_clk_a_pins[]    = { GPIOX_8 };
+static const unsigned int sdxc_cmd_a_pins[]    = { GPIOX_9 };
+static const unsigned int pwm_vs_0_pins[]      = { GPIOX_10 };
+static const unsigned int pwm_e_pins[]         = { GPIOX_10 };
+static const unsigned int pwm_vs_1_pins[]      = { GPIOX_11 };
+
+static const unsigned int uart_tx_a_pins[]     = { GPIOX_4 };
+static const unsigned int uart_rx_a_pins[]     = { GPIOX_5 };
+static const unsigned int uart_cts_a_pins[]    = { GPIOX_6 };
+static const unsigned int uart_rts_a_pins[]    = { GPIOX_7 };
+static const unsigned int uart_tx_b1_pins[]    = { GPIOX_8 };
+static const unsigned int uart_rx_b1_pins[]    = { GPIOX_9 };
+static const unsigned int uart_cts_b1_pins[]   = { GPIOX_10 };
+static const unsigned int uart_rts_b1_pins[]   = { GPIOX_20 };
+
+static const unsigned int iso7816_0_clk_pins[] = { GPIOX_6 };
+static const unsigned int iso7816_0_data_pins[]        = { GPIOX_7 };
+static const unsigned int spi_sclk_0_pins[]    = { GPIOX_8 };
+static const unsigned int spi_miso_0_pins[]    = { GPIOX_9 };
+static const unsigned int spi_mosi_0_pins[]    = { GPIOX_10 };
+static const unsigned int iso7816_det_pins[]   = { GPIOX_16 };
+static const unsigned int iso7816_reset_pins[] = { GPIOX_17 };
+static const unsigned int iso7816_1_clk_pins[] = { GPIOX_18 };
+static const unsigned int iso7816_1_data_pins[]        = { GPIOX_19 };
+static const unsigned int spi_ss0_0_pins[]     = { GPIOX_20 };
+
+static const unsigned int tsin_clk_b_pins[]    = { GPIOX_8 };
+static const unsigned int tsin_sop_b_pins[]    = { GPIOX_9 };
+static const unsigned int tsin_d0_b_pins[]     = { GPIOX_10 };
+static const unsigned int pwm_b_pins[]         = { GPIOX_11 };
+static const unsigned int i2c_sda_d0_pins[]    = { GPIOX_16 };
+static const unsigned int i2c_sck_d0_pins[]    = { GPIOX_17 };
+static const unsigned int tsin_d_valid_b_pins[] = { GPIOX_20 };
 
 /* bank Y */
-static const unsigned int tsin_d_valid_a_pins[] = { PIN(GPIOY_0, 0) };
-static const unsigned int tsin_sop_a_pins[]    = { PIN(GPIOY_1, 0) };
-static const unsigned int tsin_d17_a_pins[]    = { PIN(GPIOY_6, 0), PIN(GPIOY_7, 0),
-                                                   PIN(GPIOY_10, 0), PIN(GPIOY_11, 0),
-                                                   PIN(GPIOY_12, 0), PIN(GPIOY_13, 0),
-                                                   PIN(GPIOY_14, 0) };
-static const unsigned int tsin_clk_a_pins[]    = { PIN(GPIOY_8, 0) };
-static const unsigned int tsin_d0_a_pins[]     = { PIN(GPIOY_9, 0) };
+static const unsigned int tsin_d_valid_a_pins[] = { GPIOY_0 };
+static const unsigned int tsin_sop_a_pins[]    = { GPIOY_1 };
+static const unsigned int tsin_d17_a_pins[] = {
+       GPIOY_6, GPIOY_7, GPIOY_10, GPIOY_11, GPIOY_12, GPIOY_13, GPIOY_14,
+};
+static const unsigned int tsin_clk_a_pins[]    = { GPIOY_8 };
+static const unsigned int tsin_d0_a_pins[]     = { GPIOY_9 };
 
-static const unsigned int spdif_out_0_pins[]   = { PIN(GPIOY_3, 0) };
+static const unsigned int spdif_out_0_pins[]   = { GPIOY_3 };
 
-static const unsigned int xtal_24m_pins[]      = { PIN(GPIOY_3, 0) };
-static const unsigned int iso7816_2_clk_pins[] = { PIN(GPIOY_13, 0) };
-static const unsigned int iso7816_2_data_pins[] = { PIN(GPIOY_14, 0) };
+static const unsigned int xtal_24m_pins[]      = { GPIOY_3 };
+static const unsigned int iso7816_2_clk_pins[] = { GPIOY_13 };
+static const unsigned int iso7816_2_data_pins[] = { GPIOY_14 };
 
 /* bank DV */
-static const unsigned int pwm_d_pins[]         = { PIN(GPIODV_28, 0) };
-static const unsigned int pwm_c0_pins[]                = { PIN(GPIODV_29, 0) };
+static const unsigned int pwm_d_pins[]         = { GPIODV_28 };
+static const unsigned int pwm_c0_pins[]                = { GPIODV_29 };
 
-static const unsigned int pwm_vs_2_pins[]      = { PIN(GPIODV_9, 0) };
-static const unsigned int pwm_vs_3_pins[]      = { PIN(GPIODV_28, 0) };
-static const unsigned int pwm_vs_4_pins[]      = { PIN(GPIODV_29, 0) };
+static const unsigned int pwm_vs_2_pins[]      = { GPIODV_9 };
+static const unsigned int pwm_vs_3_pins[]      = { GPIODV_28 };
+static const unsigned int pwm_vs_4_pins[]      = { GPIODV_29 };
 
-static const unsigned int xtal24_out_pins[]    = { PIN(GPIODV_29, 0) };
+static const unsigned int xtal24_out_pins[]    = { GPIODV_29 };
 
-static const unsigned int uart_tx_c_pins[]     = { PIN(GPIODV_24, 0) };
-static const unsigned int uart_rx_c_pins[]     = { PIN(GPIODV_25, 0) };
-static const unsigned int uart_cts_c_pins[]    = { PIN(GPIODV_26, 0) };
-static const unsigned int uart_rts_c_pins[]    = { PIN(GPIODV_27, 0) };
+static const unsigned int uart_tx_c_pins[]     = { GPIODV_24 };
+static const unsigned int uart_rx_c_pins[]     = { GPIODV_25 };
+static const unsigned int uart_cts_c_pins[]    = { GPIODV_26 };
+static const unsigned int uart_rts_c_pins[]    = { GPIODV_27 };
 
-static const unsigned int pwm_c1_pins[]                = { PIN(GPIODV_9, 0) };
+static const unsigned int pwm_c1_pins[]                = { GPIODV_9 };
 
-static const unsigned int i2c_sda_a_pins[]     = { PIN(GPIODV_24, 0) };
-static const unsigned int i2c_sck_a_pins[]     = { PIN(GPIODV_25, 0) };
-static const unsigned int i2c_sda_b0_pins[]    = { PIN(GPIODV_26, 0) };
-static const unsigned int i2c_sck_b0_pins[]    = { PIN(GPIODV_27, 0) };
-static const unsigned int i2c_sda_c0_pins[]    = { PIN(GPIODV_28, 0) };
-static const unsigned int i2c_sck_c0_pins[]    = { PIN(GPIODV_29, 0) };
+static const unsigned int i2c_sda_a_pins[]     = { GPIODV_24 };
+static const unsigned int i2c_sck_a_pins[]     = { GPIODV_25 };
+static const unsigned int i2c_sda_b0_pins[]    = { GPIODV_26 };
+static const unsigned int i2c_sck_b0_pins[]    = { GPIODV_27 };
+static const unsigned int i2c_sda_c0_pins[]    = { GPIODV_28 };
+static const unsigned int i2c_sck_c0_pins[]    = { GPIODV_29 };
 
 /* bank H */
-static const unsigned int hdmi_hpd_pins[]      = { PIN(GPIOH_0, 0) };
-static const unsigned int hdmi_sda_pins[]      = { PIN(GPIOH_1, 0) };
-static const unsigned int hdmi_scl_pins[]      = { PIN(GPIOH_2, 0) };
-static const unsigned int hdmi_cec_0_pins[]    = { PIN(GPIOH_3, 0) };
-static const unsigned int eth_txd1_0_pins[]    = { PIN(GPIOH_5, 0) };
-static const unsigned int eth_txd0_0_pins[]    = { PIN(GPIOH_6, 0) };
-static const unsigned int clk_24m_out_pins[]   = { PIN(GPIOH_9, 0) };
-
-static const unsigned int spi_ss1_pins[]       = { PIN(GPIOH_0, 0) };
-static const unsigned int spi_ss2_pins[]       = { PIN(GPIOH_1, 0) };
-static const unsigned int spi_ss0_1_pins[]     = { PIN(GPIOH_3, 0) };
-static const unsigned int spi_miso_1_pins[]    = { PIN(GPIOH_4, 0) };
-static const unsigned int spi_mosi_1_pins[]    = { PIN(GPIOH_5, 0) };
-static const unsigned int spi_sclk_1_pins[]    = { PIN(GPIOH_6, 0) };
-
-static const unsigned int eth_txd3_pins[]      = { PIN(GPIOH_7, 0) };
-static const unsigned int eth_txd2_pins[]      = { PIN(GPIOH_8, 0) };
-static const unsigned int eth_tx_clk_pins[]    = { PIN(GPIOH_9, 0) };
-
-static const unsigned int i2c_sda_b1_pins[]    = { PIN(GPIOH_3, 0) };
-static const unsigned int i2c_sck_b1_pins[]    = { PIN(GPIOH_4, 0) };
-static const unsigned int i2c_sda_c1_pins[]    = { PIN(GPIOH_5, 0) };
-static const unsigned int i2c_sck_c1_pins[]    = { PIN(GPIOH_6, 0) };
-static const unsigned int i2c_sda_d1_pins[]    = { PIN(GPIOH_7, 0) };
-static const unsigned int i2c_sck_d1_pins[]    = { PIN(GPIOH_8, 0) };
+static const unsigned int hdmi_hpd_pins[]      = { GPIOH_0 };
+static const unsigned int hdmi_sda_pins[]      = { GPIOH_1 };
+static const unsigned int hdmi_scl_pins[]      = { GPIOH_2 };
+static const unsigned int hdmi_cec_0_pins[]    = { GPIOH_3 };
+static const unsigned int eth_txd1_0_pins[]    = { GPIOH_5 };
+static const unsigned int eth_txd0_0_pins[]    = { GPIOH_6 };
+static const unsigned int clk_24m_out_pins[]   = { GPIOH_9 };
+
+static const unsigned int spi_ss1_pins[]       = { GPIOH_0 };
+static const unsigned int spi_ss2_pins[]       = { GPIOH_1 };
+static const unsigned int spi_ss0_1_pins[]     = { GPIOH_3 };
+static const unsigned int spi_miso_1_pins[]    = { GPIOH_4 };
+static const unsigned int spi_mosi_1_pins[]    = { GPIOH_5 };
+static const unsigned int spi_sclk_1_pins[]    = { GPIOH_6 };
+
+static const unsigned int eth_txd3_pins[]      = { GPIOH_7 };
+static const unsigned int eth_txd2_pins[]      = { GPIOH_8 };
+static const unsigned int eth_tx_clk_pins[]    = { GPIOH_9 };
+
+static const unsigned int i2c_sda_b1_pins[]    = { GPIOH_3 };
+static const unsigned int i2c_sck_b1_pins[]    = { GPIOH_4 };
+static const unsigned int i2c_sda_c1_pins[]    = { GPIOH_5 };
+static const unsigned int i2c_sck_c1_pins[]    = { GPIOH_6 };
+static const unsigned int i2c_sda_d1_pins[]    = { GPIOH_7 };
+static const unsigned int i2c_sck_d1_pins[]    = { GPIOH_8 };
 
 /* bank BOOT */
-static const unsigned int nand_io_pins[]       = { PIN(BOOT_0, 0), PIN(BOOT_1, 0),
-                                                   PIN(BOOT_2, 0), PIN(BOOT_3, 0),
-                                                   PIN(BOOT_4, 0), PIN(BOOT_5, 0),
-                                                   PIN(BOOT_6, 0), PIN(BOOT_7, 0) };
-static const unsigned int nand_io_ce0_pins[]   = { PIN(BOOT_8, 0) };
-static const unsigned int nand_io_ce1_pins[]   = { PIN(BOOT_9, 0) };
-static const unsigned int nand_io_rb0_pins[]   = { PIN(BOOT_10, 0) };
-static const unsigned int nand_ale_pins[]      = { PIN(BOOT_11, 0) };
-static const unsigned int nand_cle_pins[]      = { PIN(BOOT_12, 0) };
-static const unsigned int nand_wen_clk_pins[]  = { PIN(BOOT_13, 0) };
-static const unsigned int nand_ren_clk_pins[]  = { PIN(BOOT_14, 0) };
-static const unsigned int nand_dqs_15_pins[]   = { PIN(BOOT_15, 0) };
-static const unsigned int nand_dqs_18_pins[]   = { PIN(BOOT_18, 0) };
-
-static const unsigned int sdxc_d0_c_pins[]     = { PIN(BOOT_0, 0)};
-static const unsigned int sdxc_d13_c_pins[]    = { PIN(BOOT_1, 0), PIN(BOOT_2, 0),
-                                                   PIN(BOOT_3, 0) };
-static const unsigned int sdxc_d47_c_pins[]    = { PIN(BOOT_4, 0), PIN(BOOT_5, 0),
-                                                   PIN(BOOT_6, 0), PIN(BOOT_7, 0) };
-static const unsigned int sdxc_clk_c_pins[]    = { PIN(BOOT_8, 0) };
-static const unsigned int sdxc_cmd_c_pins[]    = { PIN(BOOT_10, 0) };
-static const unsigned int nor_d_pins[]         = { PIN(BOOT_11, 0) };
-static const unsigned int nor_q_pins[]         = { PIN(BOOT_12, 0) };
-static const unsigned int nor_c_pins[]         = { PIN(BOOT_13, 0) };
-static const unsigned int nor_cs_pins[]                = { PIN(BOOT_18, 0) };
-
-static const unsigned int sd_d0_c_pins[]       = { PIN(BOOT_0, 0) };
-static const unsigned int sd_d1_c_pins[]       = { PIN(BOOT_1, 0) };
-static const unsigned int sd_d2_c_pins[]       = { PIN(BOOT_2, 0) };
-static const unsigned int sd_d3_c_pins[]       = { PIN(BOOT_3, 0) };
-static const unsigned int sd_cmd_c_pins[]      = { PIN(BOOT_8, 0) };
-static const unsigned int sd_clk_c_pins[]      = { PIN(BOOT_10, 0) };
+static const unsigned int nand_io_pins[] = {
+       BOOT_0, BOOT_1, BOOT_2, BOOT_3, BOOT_4, BOOT_5, BOOT_6, BOOT_7
+};
+static const unsigned int nand_io_ce0_pins[]   = { BOOT_8 };
+static const unsigned int nand_io_ce1_pins[]   = { BOOT_9 };
+static const unsigned int nand_io_rb0_pins[]   = { BOOT_10 };
+static const unsigned int nand_ale_pins[]      = { BOOT_11 };
+static const unsigned int nand_cle_pins[]      = { BOOT_12 };
+static const unsigned int nand_wen_clk_pins[]  = { BOOT_13 };
+static const unsigned int nand_ren_clk_pins[]  = { BOOT_14 };
+static const unsigned int nand_dqs_15_pins[]   = { BOOT_15 };
+static const unsigned int nand_dqs_18_pins[]   = { BOOT_18 };
+
+static const unsigned int sdxc_d0_c_pins[]     = { BOOT_0};
+static const unsigned int sdxc_d13_c_pins[]    = { BOOT_1, BOOT_2,
+                                                   BOOT_3 };
+static const unsigned int sdxc_d47_c_pins[]    = { BOOT_4, BOOT_5,
+                                                   BOOT_6, BOOT_7 };
+static const unsigned int sdxc_clk_c_pins[]    = { BOOT_8 };
+static const unsigned int sdxc_cmd_c_pins[]    = { BOOT_10 };
+static const unsigned int nor_d_pins[]         = { BOOT_11 };
+static const unsigned int nor_q_pins[]         = { BOOT_12 };
+static const unsigned int nor_c_pins[]         = { BOOT_13 };
+static const unsigned int nor_cs_pins[]                = { BOOT_18 };
+
+static const unsigned int sd_d0_c_pins[]       = { BOOT_0 };
+static const unsigned int sd_d1_c_pins[]       = { BOOT_1 };
+static const unsigned int sd_d2_c_pins[]       = { BOOT_2 };
+static const unsigned int sd_d3_c_pins[]       = { BOOT_3 };
+static const unsigned int sd_cmd_c_pins[]      = { BOOT_8 };
+static const unsigned int sd_clk_c_pins[]      = { BOOT_10 };
 
 /* bank CARD */
-static const unsigned int sd_d1_b_pins[]       = { PIN(CARD_0, 0) };
-static const unsigned int sd_d0_b_pins[]       = { PIN(CARD_1, 0) };
-static const unsigned int sd_clk_b_pins[]      = { PIN(CARD_2, 0) };
-static const unsigned int sd_cmd_b_pins[]      = { PIN(CARD_3, 0) };
-static const unsigned int sd_d3_b_pins[]       = { PIN(CARD_4, 0) };
-static const unsigned int sd_d2_b_pins[]       = { PIN(CARD_5, 0) };
-
-static const unsigned int sdxc_d13_b_pins[]    = { PIN(CARD_0, 0), PIN(CARD_4, 0),
-                                                   PIN(CARD_5, 0) };
-static const unsigned int sdxc_d0_b_pins[]     = { PIN(CARD_1, 0) };
-static const unsigned int sdxc_clk_b_pins[]    = { PIN(CARD_2, 0) };
-static const unsigned int sdxc_cmd_b_pins[]    = { PIN(CARD_3, 0) };
+static const unsigned int sd_d1_b_pins[]       = { CARD_0 };
+static const unsigned int sd_d0_b_pins[]       = { CARD_1 };
+static const unsigned int sd_clk_b_pins[]      = { CARD_2 };
+static const unsigned int sd_cmd_b_pins[]      = { CARD_3 };
+static const unsigned int sd_d3_b_pins[]       = { CARD_4 };
+static const unsigned int sd_d2_b_pins[]       = { CARD_5 };
+
+static const unsigned int sdxc_d13_b_pins[]    = { CARD_0,  CARD_4,
+                                                   CARD_5 };
+static const unsigned int sdxc_d0_b_pins[]     = { CARD_1 };
+static const unsigned int sdxc_clk_b_pins[]    = { CARD_2 };
+static const unsigned int sdxc_cmd_b_pins[]    = { CARD_3 };
 
 /* bank AO */
-static const unsigned int uart_tx_ao_a_pins[]  = { PIN(GPIOAO_0, AO_OFF) };
-static const unsigned int uart_rx_ao_a_pins[]  = { PIN(GPIOAO_1, AO_OFF) };
-static const unsigned int uart_cts_ao_a_pins[] = { PIN(GPIOAO_2, AO_OFF) };
-static const unsigned int uart_rts_ao_a_pins[] = { PIN(GPIOAO_3, AO_OFF) };
-static const unsigned int i2c_mst_sck_ao_pins[] = { PIN(GPIOAO_4, AO_OFF) };
-static const unsigned int i2c_mst_sda_ao_pins[] = { PIN(GPIOAO_5, AO_OFF) };
-static const unsigned int clk_32k_in_out_pins[]        = { PIN(GPIOAO_6, AO_OFF) };
-static const unsigned int remote_input_pins[]  = { PIN(GPIOAO_7, AO_OFF) };
-static const unsigned int hdmi_cec_1_pins[]    = { PIN(GPIOAO_12, AO_OFF) };
-static const unsigned int ir_blaster_pins[]    = { PIN(GPIOAO_13, AO_OFF) };
-
-static const unsigned int pwm_c2_pins[]                = { PIN(GPIOAO_3, AO_OFF) };
-static const unsigned int i2c_sck_ao_pins[]    = { PIN(GPIOAO_4, AO_OFF) };
-static const unsigned int i2c_sda_ao_pins[]    = { PIN(GPIOAO_5, AO_OFF) };
-static const unsigned int ir_remote_out_pins[] = { PIN(GPIOAO_7, AO_OFF) };
-static const unsigned int i2s_am_clk_out_pins[]        = { PIN(GPIOAO_8, AO_OFF) };
-static const unsigned int i2s_ao_clk_out_pins[]        = { PIN(GPIOAO_9, AO_OFF) };
-static const unsigned int i2s_lr_clk_out_pins[]        = { PIN(GPIOAO_10, AO_OFF) };
-static const unsigned int i2s_out_01_pins[]    = { PIN(GPIOAO_11, AO_OFF) };
-
-static const unsigned int uart_tx_ao_b0_pins[] = { PIN(GPIOAO_0, AO_OFF) };
-static const unsigned int uart_rx_ao_b0_pins[] = { PIN(GPIOAO_1, AO_OFF) };
-static const unsigned int uart_cts_ao_b_pins[] = { PIN(GPIOAO_2, AO_OFF) };
-static const unsigned int uart_rts_ao_b_pins[] = { PIN(GPIOAO_3, AO_OFF) };
-static const unsigned int uart_tx_ao_b1_pins[] = { PIN(GPIOAO_4, AO_OFF) };
-static const unsigned int uart_rx_ao_b1_pins[] = { PIN(GPIOAO_5, AO_OFF) };
-static const unsigned int spdif_out_1_pins[]   = { PIN(GPIOAO_6, AO_OFF) };
-
-static const unsigned int i2s_in_ch01_pins[]   = { PIN(GPIOAO_6, AO_OFF) };
-static const unsigned int i2s_ao_clk_in_pins[] = { PIN(GPIOAO_9, AO_OFF) };
-static const unsigned int i2s_lr_clk_in_pins[] = { PIN(GPIOAO_10, AO_OFF) };
+static const unsigned int uart_tx_ao_a_pins[]  = { GPIOAO_0 };
+static const unsigned int uart_rx_ao_a_pins[]  = { GPIOAO_1 };
+static const unsigned int uart_cts_ao_a_pins[] = { GPIOAO_2 };
+static const unsigned int uart_rts_ao_a_pins[] = { GPIOAO_3 };
+static const unsigned int i2c_mst_sck_ao_pins[] = { GPIOAO_4 };
+static const unsigned int i2c_mst_sda_ao_pins[] = { GPIOAO_5 };
+static const unsigned int clk_32k_in_out_pins[]        = { GPIOAO_6 };
+static const unsigned int remote_input_pins[]  = { GPIOAO_7 };
+static const unsigned int hdmi_cec_1_pins[]    = { GPIOAO_12 };
+static const unsigned int ir_blaster_pins[]    = { GPIOAO_13 };
+
+static const unsigned int pwm_c2_pins[]                = { GPIOAO_3 };
+static const unsigned int i2c_sck_ao_pins[]    = { GPIOAO_4 };
+static const unsigned int i2c_sda_ao_pins[]    = { GPIOAO_5 };
+static const unsigned int ir_remote_out_pins[] = { GPIOAO_7 };
+static const unsigned int i2s_am_clk_out_pins[]        = { GPIOAO_8 };
+static const unsigned int i2s_ao_clk_out_pins[]        = { GPIOAO_9 };
+static const unsigned int i2s_lr_clk_out_pins[]        = { GPIOAO_10 };
+static const unsigned int i2s_out_01_pins[]    = { GPIOAO_11 };
+
+static const unsigned int uart_tx_ao_b0_pins[] = { GPIOAO_0 };
+static const unsigned int uart_rx_ao_b0_pins[] = { GPIOAO_1 };
+static const unsigned int uart_cts_ao_b_pins[] = { GPIOAO_2 };
+static const unsigned int uart_rts_ao_b_pins[] = { GPIOAO_3 };
+static const unsigned int uart_tx_ao_b1_pins[] = { GPIOAO_4 };
+static const unsigned int uart_rx_ao_b1_pins[] = { GPIOAO_5 };
+static const unsigned int spdif_out_1_pins[]   = { GPIOAO_6 };
+
+static const unsigned int i2s_in_ch01_pins[]   = { GPIOAO_6 };
+static const unsigned int i2s_ao_clk_in_pins[] = { GPIOAO_9 };
+static const unsigned int i2s_lr_clk_in_pins[] = { GPIOAO_10 };
 
 /* bank DIF */
-static const unsigned int eth_rxd1_pins[]      = { PIN(DIF_0_P, 0) };
-static const unsigned int eth_rxd0_pins[]      = { PIN(DIF_0_N, 0) };
-static const unsigned int eth_rx_dv_pins[]     = { PIN(DIF_1_P, 0) };
-static const unsigned int eth_rx_clk_pins[]    = { PIN(DIF_1_N, 0) };
-static const unsigned int eth_txd0_1_pins[]    = { PIN(DIF_2_P, 0) };
-static const unsigned int eth_txd1_1_pins[]    = { PIN(DIF_2_N, 0) };
-static const unsigned int eth_tx_en_pins[]     = { PIN(DIF_3_P, 0) };
-static const unsigned int eth_ref_clk_pins[]   = { PIN(DIF_3_N, 0) };
-static const unsigned int eth_mdc_pins[]       = { PIN(DIF_4_P, 0) };
-static const unsigned int eth_mdio_en_pins[]   = { PIN(DIF_4_N, 0) };
+static const unsigned int eth_rxd1_pins[]      = { DIF_0_P };
+static const unsigned int eth_rxd0_pins[]      = { DIF_0_N };
+static const unsigned int eth_rx_dv_pins[]     = { DIF_1_P };
+static const unsigned int eth_rx_clk_pins[]    = { DIF_1_N };
+static const unsigned int eth_txd0_1_pins[]    = { DIF_2_P };
+static const unsigned int eth_txd1_1_pins[]    = { DIF_2_N };
+static const unsigned int eth_tx_en_pins[]     = { DIF_3_P };
+static const unsigned int eth_ref_clk_pins[]   = { DIF_3_N };
+static const unsigned int eth_mdc_pins[]       = { DIF_4_P };
+static const unsigned int eth_mdio_en_pins[]   = { DIF_4_N };
 
 static struct meson_pmx_group meson8b_cbus_groups[] = {
-       GPIO_GROUP(GPIOX_0, 0),
-       GPIO_GROUP(GPIOX_1, 0),
-       GPIO_GROUP(GPIOX_2, 0),
-       GPIO_GROUP(GPIOX_3, 0),
-       GPIO_GROUP(GPIOX_4, 0),
-       GPIO_GROUP(GPIOX_5, 0),
-       GPIO_GROUP(GPIOX_6, 0),
-       GPIO_GROUP(GPIOX_7, 0),
-       GPIO_GROUP(GPIOX_8, 0),
-       GPIO_GROUP(GPIOX_9, 0),
-       GPIO_GROUP(GPIOX_10, 0),
-       GPIO_GROUP(GPIOX_11, 0),
-       GPIO_GROUP(GPIOX_16, 0),
-       GPIO_GROUP(GPIOX_17, 0),
-       GPIO_GROUP(GPIOX_18, 0),
-       GPIO_GROUP(GPIOX_19, 0),
-       GPIO_GROUP(GPIOX_20, 0),
-       GPIO_GROUP(GPIOX_21, 0),
-
-       GPIO_GROUP(GPIOY_0, 0),
-       GPIO_GROUP(GPIOY_1, 0),
-       GPIO_GROUP(GPIOY_3, 0),
-       GPIO_GROUP(GPIOY_6, 0),
-       GPIO_GROUP(GPIOY_7, 0),
-       GPIO_GROUP(GPIOY_8, 0),
-       GPIO_GROUP(GPIOY_9, 0),
-       GPIO_GROUP(GPIOY_10, 0),
-       GPIO_GROUP(GPIOY_11, 0),
-       GPIO_GROUP(GPIOY_12, 0),
-       GPIO_GROUP(GPIOY_13, 0),
-       GPIO_GROUP(GPIOY_14, 0),
-
-       GPIO_GROUP(GPIODV_9, 0),
-       GPIO_GROUP(GPIODV_24, 0),
-       GPIO_GROUP(GPIODV_25, 0),
-       GPIO_GROUP(GPIODV_26, 0),
-       GPIO_GROUP(GPIODV_27, 0),
-       GPIO_GROUP(GPIODV_28, 0),
-       GPIO_GROUP(GPIODV_29, 0),
-
-       GPIO_GROUP(GPIOH_0, 0),
-       GPIO_GROUP(GPIOH_1, 0),
-       GPIO_GROUP(GPIOH_2, 0),
-       GPIO_GROUP(GPIOH_3, 0),
-       GPIO_GROUP(GPIOH_4, 0),
-       GPIO_GROUP(GPIOH_5, 0),
-       GPIO_GROUP(GPIOH_6, 0),
-       GPIO_GROUP(GPIOH_7, 0),
-       GPIO_GROUP(GPIOH_8, 0),
-       GPIO_GROUP(GPIOH_9, 0),
-
-       GPIO_GROUP(DIF_0_P, 0),
-       GPIO_GROUP(DIF_0_N, 0),
-       GPIO_GROUP(DIF_1_P, 0),
-       GPIO_GROUP(DIF_1_N, 0),
-       GPIO_GROUP(DIF_2_P, 0),
-       GPIO_GROUP(DIF_2_N, 0),
-       GPIO_GROUP(DIF_3_P, 0),
-       GPIO_GROUP(DIF_3_N, 0),
-       GPIO_GROUP(DIF_4_P, 0),
-       GPIO_GROUP(DIF_4_N, 0),
+       GPIO_GROUP(GPIOX_0),
+       GPIO_GROUP(GPIOX_1),
+       GPIO_GROUP(GPIOX_2),
+       GPIO_GROUP(GPIOX_3),
+       GPIO_GROUP(GPIOX_4),
+       GPIO_GROUP(GPIOX_5),
+       GPIO_GROUP(GPIOX_6),
+       GPIO_GROUP(GPIOX_7),
+       GPIO_GROUP(GPIOX_8),
+       GPIO_GROUP(GPIOX_9),
+       GPIO_GROUP(GPIOX_10),
+       GPIO_GROUP(GPIOX_11),
+       GPIO_GROUP(GPIOX_16),
+       GPIO_GROUP(GPIOX_17),
+       GPIO_GROUP(GPIOX_18),
+       GPIO_GROUP(GPIOX_19),
+       GPIO_GROUP(GPIOX_20),
+       GPIO_GROUP(GPIOX_21),
+
+       GPIO_GROUP(GPIOY_0),
+       GPIO_GROUP(GPIOY_1),
+       GPIO_GROUP(GPIOY_3),
+       GPIO_GROUP(GPIOY_6),
+       GPIO_GROUP(GPIOY_7),
+       GPIO_GROUP(GPIOY_8),
+       GPIO_GROUP(GPIOY_9),
+       GPIO_GROUP(GPIOY_10),
+       GPIO_GROUP(GPIOY_11),
+       GPIO_GROUP(GPIOY_12),
+       GPIO_GROUP(GPIOY_13),
+       GPIO_GROUP(GPIOY_14),
+
+       GPIO_GROUP(GPIODV_9),
+       GPIO_GROUP(GPIODV_24),
+       GPIO_GROUP(GPIODV_25),
+       GPIO_GROUP(GPIODV_26),
+       GPIO_GROUP(GPIODV_27),
+       GPIO_GROUP(GPIODV_28),
+       GPIO_GROUP(GPIODV_29),
+
+       GPIO_GROUP(GPIOH_0),
+       GPIO_GROUP(GPIOH_1),
+       GPIO_GROUP(GPIOH_2),
+       GPIO_GROUP(GPIOH_3),
+       GPIO_GROUP(GPIOH_4),
+       GPIO_GROUP(GPIOH_5),
+       GPIO_GROUP(GPIOH_6),
+       GPIO_GROUP(GPIOH_7),
+       GPIO_GROUP(GPIOH_8),
+       GPIO_GROUP(GPIOH_9),
+
+       GPIO_GROUP(DIF_0_P),
+       GPIO_GROUP(DIF_0_N),
+       GPIO_GROUP(DIF_1_P),
+       GPIO_GROUP(DIF_1_N),
+       GPIO_GROUP(DIF_2_P),
+       GPIO_GROUP(DIF_2_N),
+       GPIO_GROUP(DIF_3_P),
+       GPIO_GROUP(DIF_3_N),
+       GPIO_GROUP(DIF_4_P),
+       GPIO_GROUP(DIF_4_N),
 
        /* bank X */
        GROUP(sd_d0_a,          8,      5),
@@ -577,22 +574,22 @@ static struct meson_pmx_group meson8b_cbus_groups[] = {
 };
 
 static struct meson_pmx_group meson8b_aobus_groups[] = {
-       GPIO_GROUP(GPIOAO_0, AO_OFF),
-       GPIO_GROUP(GPIOAO_1, AO_OFF),
-       GPIO_GROUP(GPIOAO_2, AO_OFF),
-       GPIO_GROUP(GPIOAO_3, AO_OFF),
-       GPIO_GROUP(GPIOAO_4, AO_OFF),
-       GPIO_GROUP(GPIOAO_5, AO_OFF),
-       GPIO_GROUP(GPIOAO_6, AO_OFF),
-       GPIO_GROUP(GPIOAO_7, AO_OFF),
-       GPIO_GROUP(GPIOAO_8, AO_OFF),
-       GPIO_GROUP(GPIOAO_9, AO_OFF),
-       GPIO_GROUP(GPIOAO_10, AO_OFF),
-       GPIO_GROUP(GPIOAO_11, AO_OFF),
-       GPIO_GROUP(GPIOAO_12, AO_OFF),
-       GPIO_GROUP(GPIOAO_13, AO_OFF),
-       GPIO_GROUP(GPIO_BSD_EN, AO_OFF),
-       GPIO_GROUP(GPIO_TEST_N, AO_OFF),
+       GPIO_GROUP(GPIOAO_0),
+       GPIO_GROUP(GPIOAO_1),
+       GPIO_GROUP(GPIOAO_2),
+       GPIO_GROUP(GPIOAO_3),
+       GPIO_GROUP(GPIOAO_4),
+       GPIO_GROUP(GPIOAO_5),
+       GPIO_GROUP(GPIOAO_6),
+       GPIO_GROUP(GPIOAO_7),
+       GPIO_GROUP(GPIOAO_8),
+       GPIO_GROUP(GPIOAO_9),
+       GPIO_GROUP(GPIOAO_10),
+       GPIO_GROUP(GPIOAO_11),
+       GPIO_GROUP(GPIOAO_12),
+       GPIO_GROUP(GPIOAO_13),
+       GPIO_GROUP(GPIO_BSD_EN),
+       GPIO_GROUP(GPIO_TEST_N),
 
        /* bank AO */
        GROUP(uart_tx_ao_a,     0,      12),
@@ -887,30 +884,29 @@ static struct meson_pmx_func meson8b_aobus_functions[] = {
 };
 
 static struct meson_bank meson8b_cbus_banks[] = {
-       /*   name    first                      last                irq      pullen  pull    dir     out     in  */
-       BANK("X",    PIN(GPIOX_0, 0),           PIN(GPIOX_21, 0),   97, 118, 4,  0,  4,  0,  0,  0,  1,  0,  2,  0),
-       BANK("Y",    PIN(GPIOY_0, 0),           PIN(GPIOY_14, 0),   80,  96, 3,  0,  3,  0,  3,  0,  4,  0,  5,  0),
-       BANK("DV",   PIN(GPIODV_9, 0),          PIN(GPIODV_29, 0),  59,  79, 0,  0,  0,  0,  7,  0,  8,  0,  9,  0),
-       BANK("H",    PIN(GPIOH_0, 0),           PIN(GPIOH_9, 0),    14,  23, 1, 16,  1, 16,  9, 19, 10, 19, 11, 19),
-       BANK("CARD", PIN(CARD_0, 0),            PIN(CARD_6, 0),     43,  49, 2, 20,  2, 20,  0, 22,  1, 22,  2, 22),
-       BANK("BOOT", PIN(BOOT_0, 0),            PIN(BOOT_18, 0),    24,  42, 2,  0,  2,  0,  9,  0, 10,  0, 11,  0),
+       /*   name    first              last        irq      pullen  pull    dir     out     in  */
+       BANK("X",    GPIOX_0,           GPIOX_21,   97, 118, 4,  0,  4,  0,  0,  0,  1,  0,  2,  0),
+       BANK("Y",    GPIOY_0,           GPIOY_14,   80,  96, 3,  0,  3,  0,  3,  0,  4,  0,  5,  0),
+       BANK("DV",   GPIODV_9,          GPIODV_29,  59,  79, 0,  0,  0,  0,  7,  0,  8,  0,  9,  0),
+       BANK("H",    GPIOH_0,           GPIOH_9,    14,  23, 1, 16,  1, 16,  9, 19, 10, 19, 11, 19),
+       BANK("CARD", CARD_0,            CARD_6,     43,  49, 2, 20,  2, 20,  0, 22,  1, 22,  2, 22),
+       BANK("BOOT", BOOT_0,            BOOT_18,    24,  42, 2,  0,  2,  0,  9,  0, 10,  0, 11,  0),
 
        /*
         * The following bank is not mentionned in the public datasheet
         * There is no information whether it can be used with the gpio
         * interrupt controller
         */
-       BANK("DIF",  PIN(DIF_0_P, 0),           PIN(DIF_4_N, 0),    -1,  -1, 5,  8,  5,  8, 12, 12, 13, 12, 14, 12),
+       BANK("DIF",  DIF_0_P,           DIF_4_N,    -1,  -1, 5,  8,  5,  8, 12, 12, 13, 12, 14, 12),
 };
 
 static struct meson_bank meson8b_aobus_banks[] = {
-       /*   name    first                  last                      irq    pullen  pull    dir     out     in  */
-       BANK("AO",   PIN(GPIOAO_0, AO_OFF), PIN(GPIO_TEST_N, AO_OFF), 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
+       /*   name    first     lastc        irq    pullen  pull    dir     out     in  */
+       BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
+static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
        .name           = "cbus-banks",
-       .pin_base       = 0,
        .pins           = meson8b_cbus_pins,
        .groups         = meson8b_cbus_groups,
        .funcs          = meson8b_cbus_functions,
@@ -919,11 +915,11 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
        .num_groups     = ARRAY_SIZE(meson8b_cbus_groups),
        .num_funcs      = ARRAY_SIZE(meson8b_cbus_functions),
        .num_banks      = ARRAY_SIZE(meson8b_cbus_banks),
+       .pmx_ops        = &meson8_pmx_ops,
 };
 
-struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
        .name           = "aobus-banks",
-       .pin_base       = 130,
        .pins           = meson8b_aobus_pins,
        .groups         = meson8b_aobus_groups,
        .funcs          = meson8b_aobus_functions,
@@ -932,4 +928,26 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
        .num_groups     = ARRAY_SIZE(meson8b_aobus_groups),
        .num_funcs      = ARRAY_SIZE(meson8b_aobus_functions),
        .num_banks      = ARRAY_SIZE(meson8b_aobus_banks),
+       .pmx_ops        = &meson8_pmx_ops,
+};
+
+static const struct of_device_id meson8b_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson8b-cbus-pinctrl",
+               .data = &meson8b_cbus_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson8b-aobus-pinctrl",
+               .data = &meson8b_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson8b_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson8b-pinctrl",
+               .of_match_table = meson8b_pinctrl_dt_match,
+       },
 };
+builtin_platform_driver(meson8b_pinctrl_driver);
index d754a9b10e19de2b82e8cce78117e19d88827c95..d45af31b86b41ef6c85591a040fe2dd46c60de3e 100644 (file)
@@ -576,6 +576,19 @@ static int armada_37xx_irq_set_type(struct irq_data *d, unsigned int type)
        case IRQ_TYPE_EDGE_FALLING:
                val |= (BIT(d->hwirq % GPIO_PER_REG));
                break;
+       case IRQ_TYPE_EDGE_BOTH: {
+               u32 in_val, in_reg = INPUT_VAL;
+
+               armada_37xx_irq_update_reg(&in_reg, d);
+               regmap_read(info->regmap, in_reg, &in_val);
+
+               /* Set initial polarity based on current input level. */
+               if (in_val & d->mask)
+                       val |= d->mask;         /* falling */
+               else
+                       val &= ~d->mask;        /* rising */
+               break;
+       }
        default:
                spin_unlock_irqrestore(&info->irq_lock, flags);
                return -EINVAL;
@@ -586,6 +599,40 @@ static int armada_37xx_irq_set_type(struct irq_data *d, unsigned int type)
        return 0;
 }
 
+static int armada_37xx_edge_both_irq_swap_pol(struct armada_37xx_pinctrl *info,
+                                            u32 pin_idx)
+{
+       u32 reg_idx = pin_idx / GPIO_PER_REG;
+       u32 bit_num = pin_idx % GPIO_PER_REG;
+       u32 p, l, ret;
+       unsigned long flags;
+
+       regmap_read(info->regmap, INPUT_VAL + 4*reg_idx, &l);
+
+       spin_lock_irqsave(&info->irq_lock, flags);
+       p = readl(info->base + IRQ_POL + 4 * reg_idx);
+       if ((p ^ l) & (1 << bit_num)) {
+               /*
+                * For the gpios which are used for both-edge irqs, when their
+                * interrupts happen, their input levels are changed,
+                * yet their interrupt polarities are kept in old values, we
+                * should synchronize their interrupt polarities; for example,
+                * at first a gpio's input level is low and its interrupt
+                * polarity control is "Detect rising edge", then the gpio has
+                * a interrupt , its level turns to high, we should change its
+                * polarity control to "Detect falling edge" correspondingly.
+                */
+               p ^= 1 << bit_num;
+               writel(p, info->base + IRQ_POL + 4 * reg_idx);
+               ret = 0;
+       } else {
+               /* Spurious irq */
+               ret = -1;
+       }
+
+       spin_unlock_irqrestore(&info->irq_lock, flags);
+       return ret;
+}
 
 static void armada_37xx_irq_handler(struct irq_desc *desc)
 {
@@ -609,6 +656,23 @@ static void armada_37xx_irq_handler(struct irq_desc *desc)
                        u32 hwirq = ffs(status) - 1;
                        u32 virq = irq_find_mapping(d, hwirq +
                                                     i * GPIO_PER_REG);
+                       u32 t = irq_get_trigger_type(virq);
+
+                       if ((t & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) {
+                               /* Swap polarity (race with GPIO line) */
+                               if (armada_37xx_edge_both_irq_swap_pol(info,
+                                       hwirq + i * GPIO_PER_REG)) {
+                                       /*
+                                        * For spurious irq, which gpio level
+                                        * is not as expected after incoming
+                                        * edge, just ack the gpio irq.
+                                        */
+                                       writel(1 << hwirq,
+                                              info->base +
+                                              IRQ_STATUS + 4 * i);
+                                       continue;
+                               }
+                       }
 
                        generic_handle_irq(virq);
 
index 8eaa25c3384f013db376df686670cbefb89f8e1c..b4f7f8a458eaf0fe9d8c6afc15ce3b70bb6822ad 100644 (file)
@@ -49,6 +49,7 @@ static const struct pin_config_item conf_items[] = {
        PCONFDUMP(PIN_CONFIG_POWER_SOURCE, "pin power source", "selector", true),
        PCONFDUMP(PIN_CONFIG_SLEEP_HARDWARE_STATE, "sleep hardware state", NULL, false),
        PCONFDUMP(PIN_CONFIG_SLEW_RATE, "slew rate", NULL, true),
+       PCONFDUMP(PIN_CONFIG_SKEW_DELAY, "skew delay", NULL, true),
 };
 
 static void pinconf_generic_dump_one(struct pinctrl_dev *pctldev,
@@ -181,6 +182,7 @@ static const struct pinconf_generic_params dt_params[] = {
        { "power-source", PIN_CONFIG_POWER_SOURCE, 0 },
        { "sleep-hardware-state", PIN_CONFIG_SLEEP_HARDWARE_STATE, 0 },
        { "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
+       { "skew-delay", PIN_CONFIG_SKEW_DELAY, 0 },
 };
 
 /**
index 8ed2a90a8d4452118fd671c4d7358bf49808dbb7..61d830c2bc17d94b4b2caadd70699a914275da68 100644 (file)
@@ -753,7 +753,7 @@ static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)
        return false;
 }
 
-int amd_gpio_suspend(struct device *dev)
+static int amd_gpio_suspend(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct amd_gpio *gpio_dev = platform_get_drvdata(pdev);
@@ -772,7 +772,7 @@ int amd_gpio_suspend(struct device *dev)
        return 0;
 }
 
-int amd_gpio_resume(struct device *dev)
+static int amd_gpio_resume(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct amd_gpio *gpio_dev = platform_get_drvdata(pdev);
index 39e6221e71000e735dfe35f71a1596865904246f..e9b83e291edf43e02e757625ffb4f8d251f6227e 100644 (file)
@@ -13,6 +13,8 @@
 #include <linux/pinctrl/machine.h>
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/pinctrl/pinmux.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/pinctrl/pinconf-generic.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/regmap.h>
 #define DRIVER_NAME "pinctrl-gemini"
 
 /**
+ * struct gemini_pin_conf - information about configuring a pin
+ * @pin: the pin number
+ * @reg: config register
+ * @mask: the bits affecting the configuration of the pin
+ */
+struct gemini_pin_conf {
+       unsigned int pin;
+       u32 reg;
+       u32 mask;
+};
+
+/**
+ * struct gemini_pmx - state holder for the gemini pin controller
  * @dev: a pointer back to containing device
  * @virtbase: the offset to the controller in virtual memory
  * @map: regmap to access registers
@@ -29,6 +44,8 @@
  * @is_3516: whether the SoC/package is the 3516 variant
  * @flash_pin: whether the flash pin (extended pins for parallel
  * flash) is set
+ * @confs: pin config information
+ * @nconfs: number of pin config information items
  */
 struct gemini_pmx {
        struct device *dev;
@@ -37,6 +54,8 @@ struct gemini_pmx {
        bool is_3512;
        bool is_3516;
        bool flash_pin;
+       const struct gemini_pin_conf *confs;
+       unsigned int nconfs;
 };
 
 /**
@@ -57,6 +76,13 @@ struct gemini_pin_group {
        u32 value;
 };
 
+/* Some straight-forward control registers */
+#define GLOBAL_WORD_ID         0x00
+#define GLOBAL_STATUS          0x04
+#define GLOBAL_STATUS_FLPIN    BIT(20)
+#define GLOBAL_GMAC_CTRL_SKEW  0x1c
+#define GLOBAL_GMAC0_DATA_SKEW 0x20
+#define GLOBAL_GMAC1_DATA_SKEW 0x24
 /*
  * Global Miscellaneous Control Register
  * This register controls all Gemini pad/pin multiplexing
@@ -69,10 +95,14 @@ struct gemini_pin_group {
  *   DISABLED again. So you select a flash configuration once, and then
  *   you are stuck with it.
  */
-#define GLOBAL_WORD_ID         0x00
-#define GLOBAL_STATUS          0x04
-#define GLOBAL_STATUS_FLPIN    BIT(20)
 #define GLOBAL_MISC_CTRL       0x30
+#define GEMINI_GMAC_IOSEL_MASK GENMASK(28, 27)
+/* Not really used */
+#define GEMINI_GMAC_IOSEL_GMAC0_GMII   BIT(28)
+/* Activated with GMAC1 */
+#define GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII BIT(27)
+/* This will be the default */
+#define GEMINI_GMAC_IOSEL_GMAC0_RGMII_GMAC1_GPIO2 0
 #define TVC_CLK_PAD_ENABLE     BIT(20)
 #define PCI_CLK_PAD_ENABLE     BIT(17)
 #define LPC_CLK_PAD_ENABLE     BIT(16)
@@ -86,8 +116,8 @@ struct gemini_pin_group {
 #define NAND_PADS_DISABLE      BIT(2)
 #define PFLASH_PADS_DISABLE    BIT(1)
 #define SFLASH_PADS_DISABLE    BIT(0)
-#define PADS_MASK              (GENMASK(9, 0) | BIT(16) | BIT(17) | BIT(20))
-#define PADS_MAXBIT            20
+#define PADS_MASK              (GENMASK(9, 0) | BIT(16) | BIT(17) | BIT(20) | BIT(27))
+#define PADS_MAXBIT            27
 
 /* Ordered by bit index */
 static const char * const gemini_padgroups[] = {
@@ -106,6 +136,8 @@ static const char * const gemini_padgroups[] = {
        "PCI CLK",
        NULL, NULL,
        "TVC CLK",
+       NULL, NULL, NULL, NULL, NULL,
+       "GMAC1",
 };
 
 static const struct pinctrl_pin_desc gemini_3512_pins[] = {
@@ -493,9 +525,12 @@ static const unsigned int usb_3512_pins[] = {
 };
 
 /* GMII, ethernet pins */
-static const unsigned int gmii_3512_pins[] = {
-       311, 240, 258, 276, 294, 312, 241, 259, 277, 295, 313, 242, 260, 278, 296,
-       315, 297, 279, 261, 243, 316, 298, 280, 262, 244, 317, 299, 281
+static const unsigned int gmii_gmac0_3512_pins[] = {
+       240, 241, 242, 258, 259, 260, 276, 277, 278, 294, 295, 311, 312, 313
+};
+
+static const unsigned int gmii_gmac1_3512_pins[] = {
+       243, 244, 261, 262, 279, 280, 281, 296, 297, 298, 299, 315, 316, 317
 };
 
 static const unsigned int pci_3512_pins[] = {
@@ -645,10 +680,10 @@ static const unsigned int gpio1c_3512_pins[] = {
 /* The GPIO1D (28-31) pins overlap with LCD and TVC */
 static const unsigned int gpio1d_3512_pins[] = { 246, 319, 301, 283 };
 
-/* The GPIO2A (0-3) pins overlap with GMII and extended parallel flash */
+/* The GPIO2A (0-3) pins overlap with GMII GMAC1 and extended parallel flash */
 static const unsigned int gpio2a_3512_pins[] = { 315, 297, 279, 261 };
 
-/* The GPIO2B (4-7) pins overlap with GMII, extended parallel flash and LCD */
+/* The GPIO2B (4-7) pins overlap with GMII GMAC1, extended parallel flash and LCD */
 static const unsigned int gpio2b_3512_pins[] = { 262, 244, 317, 299 };
 
 /* The GPIO2C (8-31) pins overlap with PCI */
@@ -715,9 +750,16 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
                .num_pins = ARRAY_SIZE(usb_3512_pins),
        },
        {
-               .name = "gmiigrp",
-               .pins = gmii_3512_pins,
-               .num_pins = ARRAY_SIZE(gmii_3512_pins),
+               .name = "gmii_gmac0_grp",
+               .pins = gmii_gmac0_3512_pins,
+               .num_pins = ARRAY_SIZE(gmii_gmac0_3512_pins),
+       },
+       {
+               .name = "gmii_gmac1_grp",
+               .pins = gmii_gmac1_3512_pins,
+               .num_pins = ARRAY_SIZE(gmii_gmac1_3512_pins),
+               /* Bring out RGMII on the GMAC1 pins */
+               .value = GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
        },
        {
                .name = "pcigrp",
@@ -931,14 +973,15 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
                .name = "gpio2agrp",
                .pins = gpio2a_3512_pins,
                .num_pins = ARRAY_SIZE(gpio2a_3512_pins),
-               /* Conflict with GMII and extended parallel flash */
+               .mask = GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
+               /* Conflict with GMII GMAC1 and extended parallel flash */
        },
        {
                .name = "gpio2bgrp",
                .pins = gpio2b_3512_pins,
                .num_pins = ARRAY_SIZE(gpio2b_3512_pins),
-               /* Conflict with GMII, extended parallel flash and LCD */
-               .mask = LCD_PADS_ENABLE,
+               /* Conflict with GMII GMAC1, extended parallel flash and LCD */
+               .mask = LCD_PADS_ENABLE | GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
        },
        {
                .name = "gpio2cgrp",
@@ -1418,9 +1461,12 @@ static const unsigned int usb_3516_pins[] = {
 };
 
 /* GMII, ethernet pins */
-static const unsigned int gmii_3516_pins[] = {
-       306, 307, 308, 309, 310, 325, 326, 327, 328, 329, 330, 345, 346, 347,
-       348, 349, 350, 351, 367, 368, 369, 370, 371, 386, 387, 389, 390, 391
+static const unsigned int gmii_gmac0_3516_pins[] = {
+       306, 307, 325, 326, 327, 328, 345, 346, 347, 348, 367, 368, 386, 387
+};
+
+static const unsigned int gmii_gmac1_3516_pins[] = {
+       308, 309, 310, 329, 330, 349, 350, 351, 369, 370, 371, 389, 390, 391
 };
 
 static const unsigned int pci_3516_pins[] = {
@@ -1562,10 +1608,10 @@ static const unsigned int gpio1c_3516_pins[] = {
 /* The GPIO1D (28-31) pins overlap with TVC */
 static const unsigned int gpio1d_3516_pins[] = { 353, 311, 394, 374 };
 
-/* The GPIO2A (0-3) pins overlap with GMII and extended parallel flash */
+/* The GPIO2A (0-3) pins overlap with GMII GMAC1 and extended parallel flash */
 static const unsigned int gpio2a_3516_pins[] = { 308, 369, 389, 329 };
 
-/* The GPIO2B (4-7) pins overlap with GMII, extended parallel flash and LCD */
+/* The GPIO2B (4-7) pins overlap with GMII GMAC1, extended parallel flash and LCD */
 static const unsigned int gpio2b_3516_pins[] = { 391, 351, 310, 371 };
 
 /* The GPIO2C (8-31) pins overlap with PCI */
@@ -1637,9 +1683,16 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
                .num_pins = ARRAY_SIZE(usb_3516_pins),
        },
        {
-               .name = "gmiigrp",
-               .pins = gmii_3516_pins,
-               .num_pins = ARRAY_SIZE(gmii_3516_pins),
+               .name = "gmii_gmac0_grp",
+               .pins = gmii_gmac0_3516_pins,
+               .num_pins = ARRAY_SIZE(gmii_gmac0_3516_pins),
+       },
+       {
+               .name = "gmii_gmac1_grp",
+               .pins = gmii_gmac1_3516_pins,
+               .num_pins = ARRAY_SIZE(gmii_gmac1_3516_pins),
+               /* Bring out RGMII on the GMAC1 pins */
+               .value = GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
        },
        {
                .name = "pcigrp",
@@ -1838,14 +1891,15 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
                .name = "gpio2agrp",
                .pins = gpio2a_3516_pins,
                .num_pins = ARRAY_SIZE(gpio2a_3516_pins),
-               /* Conflict with GMII and extended parallel flash */
+               .mask = GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
+               /* Conflict with GMII GMAC1 and extended parallel flash */
        },
        {
                .name = "gpio2bgrp",
                .pins = gpio2b_3516_pins,
                .num_pins = ARRAY_SIZE(gpio2b_3516_pins),
-               /* Conflict with GMII, extended parallel flash and LCD */
-               .mask = LCD_PADS_ENABLE,
+               /* Conflict with GMII GMAC1, extended parallel flash and LCD */
+               .mask = LCD_PADS_ENABLE | GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
        },
        {
                .name = "gpio2cgrp",
@@ -1918,73 +1972,13 @@ static void gemini_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
        seq_printf(s, " " DRIVER_NAME);
 }
 
-static int gemini_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
-                                           struct device_node *np,
-                                           struct pinctrl_map **map,
-                                           unsigned int *reserved_maps,
-                                           unsigned int *num_maps)
-{
-       int ret;
-       const char *function = NULL;
-       const char *group;
-       struct property *prop;
-
-       ret = of_property_read_string(np, "function", &function);
-       if (ret < 0)
-               return ret;
-
-       ret = of_property_count_strings(np, "groups");
-       if (ret < 0)
-               return ret;
-
-       ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps,
-                                       num_maps, ret);
-       if (ret < 0)
-               return ret;
-
-       of_property_for_each_string(np, "groups", prop, group) {
-               ret = pinctrl_utils_add_map_mux(pctldev, map, reserved_maps,
-                                               num_maps, group, function);
-               if (ret < 0)
-                       return ret;
-               pr_debug("ADDED FUNCTION %s <-> GROUP %s\n",
-                        function, group);
-       }
-
-       return 0;
-}
-
-static int gemini_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
-                               struct device_node *np_config,
-                               struct pinctrl_map **map,
-                               unsigned int *num_maps)
-{
-       unsigned int reserved_maps = 0;
-       struct device_node *np;
-       int ret;
-
-       *map = NULL;
-       *num_maps = 0;
-
-       for_each_child_of_node(np_config, np) {
-               ret = gemini_pinctrl_dt_subnode_to_map(pctldev, np, map,
-                                       &reserved_maps, num_maps);
-               if (ret < 0) {
-                       pinctrl_utils_free_map(pctldev, *map, *num_maps);
-                       return ret;
-               }
-       }
-
-       return 0;
-};
-
 static const struct pinctrl_ops gemini_pctrl_ops = {
        .get_groups_count = gemini_get_groups_count,
        .get_group_name = gemini_get_group_name,
        .get_group_pins = gemini_get_group_pins,
        .pin_dbg_show = gemini_pin_dbg_show,
-       .dt_node_to_map = gemini_pinctrl_dt_node_to_map,
-       .dt_free_map = pinctrl_utils_free_map,
+       .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
+       .dt_free_map = pinconf_generic_dt_free_map,
 };
 
 /**
@@ -2008,7 +2002,7 @@ static const char * const icegrps[] = { "icegrp" };
 static const char * const idegrps[] = { "idegrp" };
 static const char * const satagrps[] = { "satagrp" };
 static const char * const usbgrps[] = { "usbgrp" };
-static const char * const gmiigrps[] = { "gmiigrp" };
+static const char * const gmiigrps[] = { "gmii_gmac0_grp", "gmii_gmac1_grp" };
 static const char * const pcigrps[] = { "pcigrp" };
 static const char * const lpcgrps[] = { "lpcgrp" };
 static const char * const lcdgrps[] = { "lcdgrp" };
@@ -2073,6 +2067,16 @@ static const struct gemini_pmx_func gemini_pmx_functions[] = {
                .groups = satagrps,
                .num_groups = ARRAY_SIZE(satagrps),
        },
+       {
+               .name = "usb",
+               .groups = usbgrps,
+               .num_groups = ARRAY_SIZE(usbgrps),
+       },
+       {
+               .name = "gmii",
+               .groups = gmiigrps,
+               .num_groups = ARRAY_SIZE(gmiigrps),
+       },
        {
                .name = "pci",
                .groups = pcigrps,
@@ -2251,10 +2255,155 @@ static const struct pinmux_ops gemini_pmx_ops = {
        .set_mux = gemini_pmx_set_mux,
 };
 
+#define GEMINI_CFGPIN(_n, _r, _lb, _hb) {      \
+       .pin = _n,                              \
+       .reg = _r,                              \
+       .mask = GENMASK(_hb, _lb)               \
+}
+
+static const struct gemini_pin_conf gemini_confs_3512[] = {
+       GEMINI_CFGPIN(259, GLOBAL_GMAC_CTRL_SKEW, 0, 3), /* GMAC0 RXDV */
+       GEMINI_CFGPIN(277, GLOBAL_GMAC_CTRL_SKEW, 4, 7), /* GMAC0 RXC */
+       GEMINI_CFGPIN(241, GLOBAL_GMAC_CTRL_SKEW, 8, 11), /* GMAC0 TXEN */
+       GEMINI_CFGPIN(312, GLOBAL_GMAC_CTRL_SKEW, 12, 15), /* GMAC0 TXC */
+       GEMINI_CFGPIN(298, GLOBAL_GMAC_CTRL_SKEW, 16, 19), /* GMAC1 RXDV */
+       GEMINI_CFGPIN(280, GLOBAL_GMAC_CTRL_SKEW, 20, 23), /* GMAC1 RXC */
+       GEMINI_CFGPIN(316, GLOBAL_GMAC_CTRL_SKEW, 24, 27), /* GMAC1 TXEN */
+       GEMINI_CFGPIN(243, GLOBAL_GMAC_CTRL_SKEW, 28, 31), /* GMAC1 TXC */
+       GEMINI_CFGPIN(295, GLOBAL_GMAC0_DATA_SKEW, 0, 3), /* GMAC0 RXD0 */
+       GEMINI_CFGPIN(313, GLOBAL_GMAC0_DATA_SKEW, 4, 7), /* GMAC0 RXD1 */
+       GEMINI_CFGPIN(242, GLOBAL_GMAC0_DATA_SKEW, 8, 11), /* GMAC0 RXD2 */
+       GEMINI_CFGPIN(260, GLOBAL_GMAC0_DATA_SKEW, 12, 15), /* GMAC0 RXD3 */
+       GEMINI_CFGPIN(294, GLOBAL_GMAC0_DATA_SKEW, 16, 19), /* GMAC0 TXD0 */
+       GEMINI_CFGPIN(276, GLOBAL_GMAC0_DATA_SKEW, 20, 23), /* GMAC0 TXD1 */
+       GEMINI_CFGPIN(258, GLOBAL_GMAC0_DATA_SKEW, 24, 27), /* GMAC0 TXD2 */
+       GEMINI_CFGPIN(240, GLOBAL_GMAC0_DATA_SKEW, 28, 31), /* GMAC0 TXD3 */
+       GEMINI_CFGPIN(262, GLOBAL_GMAC1_DATA_SKEW, 0, 3), /* GMAC1 RXD0 */
+       GEMINI_CFGPIN(244, GLOBAL_GMAC1_DATA_SKEW, 4, 7), /* GMAC1 RXD1 */
+       GEMINI_CFGPIN(317, GLOBAL_GMAC1_DATA_SKEW, 8, 11), /* GMAC1 RXD2 */
+       GEMINI_CFGPIN(299, GLOBAL_GMAC1_DATA_SKEW, 12, 15), /* GMAC1 RXD3 */
+       GEMINI_CFGPIN(261, GLOBAL_GMAC1_DATA_SKEW, 16, 19), /* GMAC1 TXD0 */
+       GEMINI_CFGPIN(279, GLOBAL_GMAC1_DATA_SKEW, 20, 23), /* GMAC1 TXD1 */
+       GEMINI_CFGPIN(297, GLOBAL_GMAC1_DATA_SKEW, 24, 27), /* GMAC1 TXD2 */
+       GEMINI_CFGPIN(315, GLOBAL_GMAC1_DATA_SKEW, 28, 31), /* GMAC1 TXD3 */
+};
+
+static const struct gemini_pin_conf gemini_confs_3516[] = {
+       GEMINI_CFGPIN(347, GLOBAL_GMAC_CTRL_SKEW, 0, 3), /* GMAC0 RXDV */
+       GEMINI_CFGPIN(386, GLOBAL_GMAC_CTRL_SKEW, 4, 7), /* GMAC0 RXC */
+       GEMINI_CFGPIN(307, GLOBAL_GMAC_CTRL_SKEW, 8, 11), /* GMAC0 TXEN */
+       GEMINI_CFGPIN(327, GLOBAL_GMAC_CTRL_SKEW, 12, 15), /* GMAC0 TXC */
+       GEMINI_CFGPIN(309, GLOBAL_GMAC_CTRL_SKEW, 16, 19), /* GMAC1 RXDV */
+       GEMINI_CFGPIN(390, GLOBAL_GMAC_CTRL_SKEW, 20, 23), /* GMAC1 RXC */
+       GEMINI_CFGPIN(370, GLOBAL_GMAC_CTRL_SKEW, 24, 27), /* GMAC1 TXEN */
+       GEMINI_CFGPIN(350, GLOBAL_GMAC_CTRL_SKEW, 28, 31), /* GMAC1 TXC */
+       GEMINI_CFGPIN(367, GLOBAL_GMAC0_DATA_SKEW, 0, 3), /* GMAC0 RXD0 */
+       GEMINI_CFGPIN(348, GLOBAL_GMAC0_DATA_SKEW, 4, 7), /* GMAC0 RXD1 */
+       GEMINI_CFGPIN(387, GLOBAL_GMAC0_DATA_SKEW, 8, 11), /* GMAC0 RXD2 */
+       GEMINI_CFGPIN(328, GLOBAL_GMAC0_DATA_SKEW, 12, 15), /* GMAC0 RXD3 */
+       GEMINI_CFGPIN(306, GLOBAL_GMAC0_DATA_SKEW, 16, 19), /* GMAC0 TXD0 */
+       GEMINI_CFGPIN(325, GLOBAL_GMAC0_DATA_SKEW, 20, 23), /* GMAC0 TXD1 */
+       GEMINI_CFGPIN(346, GLOBAL_GMAC0_DATA_SKEW, 24, 27), /* GMAC0 TXD2 */
+       GEMINI_CFGPIN(326, GLOBAL_GMAC0_DATA_SKEW, 28, 31), /* GMAC0 TXD3 */
+       GEMINI_CFGPIN(391, GLOBAL_GMAC1_DATA_SKEW, 0, 3), /* GMAC1 RXD0 */
+       GEMINI_CFGPIN(351, GLOBAL_GMAC1_DATA_SKEW, 4, 7), /* GMAC1 RXD1 */
+       GEMINI_CFGPIN(310, GLOBAL_GMAC1_DATA_SKEW, 8, 11), /* GMAC1 RXD2 */
+       GEMINI_CFGPIN(371, GLOBAL_GMAC1_DATA_SKEW, 12, 15), /* GMAC1 RXD3 */
+       GEMINI_CFGPIN(329, GLOBAL_GMAC1_DATA_SKEW, 16, 19), /* GMAC1 TXD0 */
+       GEMINI_CFGPIN(389, GLOBAL_GMAC1_DATA_SKEW, 20, 23), /* GMAC1 TXD1 */
+       GEMINI_CFGPIN(369, GLOBAL_GMAC1_DATA_SKEW, 24, 27), /* GMAC1 TXD2 */
+       GEMINI_CFGPIN(308, GLOBAL_GMAC1_DATA_SKEW, 28, 31), /* GMAC1 TXD3 */
+};
+
+static const struct gemini_pin_conf *gemini_get_pin_conf(struct gemini_pmx *pmx,
+                                                        unsigned int pin)
+{
+       const struct gemini_pin_conf *retconf;
+       int i;
+
+       for (i = 0; i < pmx->nconfs; i++) {
+               retconf = &gemini_confs_3516[i];
+               if (retconf->pin == pin)
+                       return retconf;
+       }
+       return NULL;
+}
+
+static int gemini_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
+                             unsigned long *config)
+{
+       struct gemini_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
+       enum pin_config_param param = pinconf_to_config_param(*config);
+       const struct gemini_pin_conf *conf;
+       u32 val;
+
+       switch (param) {
+       case PIN_CONFIG_SKEW_DELAY:
+               conf = gemini_get_pin_conf(pmx, pin);
+               if (!conf)
+                       return -ENOTSUPP;
+               regmap_read(pmx->map, conf->reg, &val);
+               val &= conf->mask;
+               val >>= (ffs(conf->mask) - 1);
+               *config = pinconf_to_config_packed(PIN_CONFIG_SKEW_DELAY, val);
+               break;
+       default:
+               return -ENOTSUPP;
+       }
+
+       return 0;
+}
+
+static int gemini_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
+                             unsigned long *configs, unsigned int num_configs)
+{
+       struct gemini_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
+       const struct gemini_pin_conf *conf;
+       enum pin_config_param param;
+       u32 arg;
+       int ret = 0;
+       int i;
+
+       for (i = 0; i < num_configs; i++) {
+               param = pinconf_to_config_param(configs[i]);
+               arg = pinconf_to_config_argument(configs[i]);
+
+               switch (param) {
+               case PIN_CONFIG_SKEW_DELAY:
+                       if (arg > 0xf)
+                               return -EINVAL;
+                       conf = gemini_get_pin_conf(pmx, pin);
+                       if (!conf) {
+                               dev_err(pmx->dev,
+                                       "invalid pin for skew delay %d\n", pin);
+                               return -ENOTSUPP;
+                       }
+                       arg <<= (ffs(conf->mask) - 1);
+                       dev_dbg(pmx->dev,
+                               "set pin %d to skew delay mask %08x, val %08x\n",
+                               pin, conf->mask, arg);
+                       regmap_update_bits(pmx->map, conf->reg, conf->mask, arg);
+                       break;
+               default:
+                       dev_err(pmx->dev, "Invalid config param %04x\n", param);
+                       return -ENOTSUPP;
+               }
+       }
+
+       return ret;
+}
+
+static const struct pinconf_ops gemini_pinconf_ops = {
+       .pin_config_get = gemini_pinconf_get,
+       .pin_config_set = gemini_pinconf_set,
+       .is_generic = true,
+};
+
 static struct pinctrl_desc gemini_pmx_desc = {
        .name = DRIVER_NAME,
        .pctlops = &gemini_pctrl_ops,
        .pmxops = &gemini_pmx_ops,
+       .confops = &gemini_pinconf_ops,
        .owner = THIS_MODULE,
 };
 
@@ -2297,11 +2446,15 @@ static int gemini_pmx_probe(struct platform_device *pdev)
        val &= 0xffff;
        if (val == 0x3512) {
                pmx->is_3512 = true;
+               pmx->confs = gemini_confs_3512;
+               pmx->nconfs = ARRAY_SIZE(gemini_confs_3512);
                gemini_pmx_desc.pins = gemini_3512_pins;
                gemini_pmx_desc.npins = ARRAY_SIZE(gemini_3512_pins);
                dev_info(dev, "detected 3512 chip variant\n");
        } else if (val == 0x3516) {
                pmx->is_3516 = true;
+               pmx->confs = gemini_confs_3516;
+               pmx->nconfs = ARRAY_SIZE(gemini_confs_3516);
                gemini_pmx_desc.pins = gemini_3516_pins;
                gemini_pmx_desc.npins = ARRAY_SIZE(gemini_3516_pins);
                dev_info(dev, "detected 3516 chip variant\n");
index d84761822243ec4fb8716e0ecfed2859564ae291..372ddf386bdb9ebfab7b65b0210eedad463fdf4f 100644 (file)
@@ -717,7 +717,7 @@ static const struct of_device_id ingenic_pinctrl_of_match[] = {
        {},
 };
 
-int ingenic_pinctrl_probe(struct platform_device *pdev)
+static int ingenic_pinctrl_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct ingenic_pinctrl *jzpc;
index b8d2180a2bea44426b940745c5030f60073e214e..a7f37063518ec3217633e2fffdac2f38d2ddce57 100644 (file)
@@ -420,11 +420,9 @@ static int max77620_pinconf_set(struct pinctrl_dev *pctldev,
                                                 MAX77620_REG_GPIO0 + pin,
                                                 MAX77620_CNFG_GPIO_DRV_MASK,
                                                 val);
-                       if (ret < 0) {
-                               dev_err(dev, "Reg 0x%02x update failed %d\n",
-                                       MAX77620_REG_GPIO0 + pin, ret);
-                               return ret;
-                       }
+                       if (ret)
+                               goto report_update_failure;
+
                        mpci->pin_info[pin].drv_type = val ?
                                MAX77620_PIN_PP_DRV : MAX77620_PIN_OD_DRV;
                        break;
@@ -435,11 +433,9 @@ static int max77620_pinconf_set(struct pinctrl_dev *pctldev,
                                                 MAX77620_REG_GPIO0 + pin,
                                                 MAX77620_CNFG_GPIO_DRV_MASK,
                                                 val);
-                       if (ret < 0) {
-                               dev_err(dev, "Reg 0x%02x update failed %d\n",
-                                       MAX77620_REG_GPIO0 + pin, ret);
-                               return ret;
-                       }
+                       if (ret)
+                               goto report_update_failure;
+
                        mpci->pin_info[pin].drv_type = val ?
                                MAX77620_PIN_PP_DRV : MAX77620_PIN_OD_DRV;
                        break;
@@ -536,6 +532,11 @@ static int max77620_pinconf_set(struct pinctrl_dev *pctldev,
        }
 
        return 0;
+
+report_update_failure:
+       dev_err(dev, "Reg 0x%02x update failed %d\n",
+               MAX77620_REG_GPIO0 + pin, ret);
+       return ret;
 }
 
 static const struct pinconf_ops max77620_pinconf_ops = {
index 59c899c205fb7b5bbfc20f415d44efdfc09c48a6..4a6ea159c65de4c6365ebfffb698b214fa2ae937 100644 (file)
@@ -25,6 +25,7 @@
 #define MCP_TYPE_008   2
 #define MCP_TYPE_017   3
 #define MCP_TYPE_S18    4
+#define MCP_TYPE_018    5
 
 #define MCP_MAX_DEV_PER_CS     8
 
@@ -278,8 +279,7 @@ static int mcp_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
 {
        struct mcp23s08 *mcp = pinctrl_dev_get_drvdata(pctldev);
        enum pin_config_param param;
-       u32 arg, mask;
-       u16 val;
+       u32 arg;
        int ret = 0;
        int i;
 
@@ -289,8 +289,6 @@ static int mcp_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
 
                switch (param) {
                case PIN_CONFIG_BIAS_PULL_UP:
-                       val = arg ? 0xFFFF : 0x0000;
-                       mask = BIT(pin);
                        ret = mcp_set_bit(mcp, MCP_GPPU, pin, arg);
                        break;
                default:
@@ -837,6 +835,13 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
                mcp->chip.ngpio = 16;
                mcp->chip.label = "mcp23017";
                break;
+
+       case MCP_TYPE_018:
+               mcp->regmap = devm_regmap_init_i2c(data, &mcp23x17_regmap);
+               mcp->reg_shift = 1;
+               mcp->chip.ngpio = 16;
+               mcp->chip.label = "mcp23018";
+               break;
 #endif /* CONFIG_I2C */
 
        default:
@@ -883,7 +888,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
                if (mirror)
                        status |= IOCON_MIRROR | (IOCON_MIRROR << 8);
 
-               if (type == MCP_TYPE_S18)
+               if (type == MCP_TYPE_S18 || type == MCP_TYPE_018)
                        status |= IOCON_INTCC | (IOCON_INTCC << 8);
 
                ret = mcp_write(mcp, MCP_IOCON, status);
@@ -964,6 +969,10 @@ static const struct of_device_id mcp23s08_i2c_of_match[] = {
                .compatible = "microchip,mcp23017",
                .data = (void *) MCP_TYPE_017,
        },
+       {
+               .compatible = "microchip,mcp23018",
+               .data = (void *) MCP_TYPE_018,
+       },
 /* NOTE: The use of the mcp prefix is deprecated and will be removed. */
        {
                .compatible = "mcp,mcp23008",
@@ -1013,6 +1022,7 @@ static int mcp230xx_probe(struct i2c_client *client,
 static const struct i2c_device_id mcp230xx_id[] = {
        { "mcp23008", MCP_TYPE_008 },
        { "mcp23017", MCP_TYPE_017 },
+       { "mcp23018", MCP_TYPE_018 },
        { },
 };
 MODULE_DEVICE_TABLE(i2c, mcp230xx_id);
index b5cb7858ffdcdf43bd399c61af2fc36d4b0c039b..2ba17548ad5b5132789fb3b1ed15a89fbf3c4e6a 100644 (file)
@@ -884,6 +884,24 @@ static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
        },
 };
 
+static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
+       {
+               /* edphdmi_cecinoutt1 */
+               .bank_num = 7,
+               .pin = 16,
+               .func = 2,
+               .route_offset = 0x264,
+               .route_val = BIT(16 + 12) | BIT(12),
+       }, {
+               /* edphdmi_cecinout */
+               .bank_num = 7,
+               .pin = 23,
+               .func = 4,
+               .route_offset = 0x264,
+               .route_val = BIT(16 + 12),
+       },
+};
+
 static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
        {
                /* uart2dbg_rxm0 */
@@ -900,12 +918,19 @@ static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
                .route_offset = 0x50,
                .route_val = BIT(16) | BIT(16 + 1) | BIT(0),
        }, {
-               /* gmac-m1-optimized_rxd0 */
+               /* gmac-m1_rxd0 */
                .bank_num = 1,
                .pin = 11,
                .func = 2,
                .route_offset = 0x50,
-               .route_val = BIT(16 + 2) | BIT(16 + 10) | BIT(2) | BIT(10),
+               .route_val = BIT(16 + 2) | BIT(2),
+       }, {
+               /* gmac-m1-optimized_rxd3 */
+               .bank_num = 1,
+               .pin = 14,
+               .func = 2,
+               .route_offset = 0x50,
+               .route_val = BIT(16 + 10) | BIT(10),
        }, {
                /* pdm_sdi0m0 */
                .bank_num = 2,
@@ -3391,6 +3416,8 @@ static struct rockchip_pin_ctrl rk3288_pin_ctrl = {
                .type                   = RK3288,
                .grf_mux_offset         = 0x0,
                .pmu_mux_offset         = 0x84,
+               .iomux_routes           = rk3288_mux_route_data,
+               .niomux_routes          = ARRAY_SIZE(rk3288_mux_route_data),
                .pull_calc_reg          = rk3288_calc_pull_reg_and_bit,
                .drv_calc_reg           = rk3288_calc_drv_reg_and_bit,
 };
@@ -3456,8 +3483,8 @@ static struct rockchip_pin_bank rk3399_pin_banks[] = {
                                                         DRV_TYPE_IO_1V8_ONLY,
                                                         DRV_TYPE_IO_DEFAULT,
                                                         DRV_TYPE_IO_DEFAULT,
-                                                        0x0,
-                                                        0x8,
+                                                        0x80,
+                                                        0x88,
                                                         -1,
                                                         -1,
                                                         PULL_TYPE_IO_1V8_ONLY,