Merge tag 'pinctrl-v4.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 2 Feb 2018 22:22:53 +0000 (14:22 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 2 Feb 2018 22:22:53 +0000 (14:22 -0800)
Pull pin control updates from Linus Walleij:
 "This is the bulk of pin control changes for the v4.16 kernel cycle.
  Like with GPIO it is actually a bit calm this time.

  Core changes:

   - After lengthy discussions and partly due to my ignorance, we have
     merged a patch making pinctrl_force_default() and
     pinctrl_force_sleep() reprogram the states into the hardware of any
     hogged pins, even if they are already in the desired state.

     This only apply to hogged pins since groups of pins owned by
     drivers need to be managed by each driver, lest they could not do
     things like runtime PM and put pins to sleeping state even if the
     system as a whole is not in sleep.

  New drivers:

   - New driver for the Microsemi Ocelot SoC. This is used in ethernet
     switches.

   - The X-Powers AXP209 GPIO driver was extended to also deal with pin
     control and moved over from the GPIO subsystem. This circuit is a
     mixed-mode integrated circuit which is part of AllWinner designs.

   - New subdriver for the Qualcomm MSM8998 SoC, core of a high end
     mobile devices (phones) chipset.

   - New subdriver for the ST Microelectronics STM32MP157 MPU and
     STM32F769 MCU from the STM32 family.

   - New subdriver for the MediaTek MT7622 SoC. This is used for
     routers, repeater, gateways and such network infrastructure.

   - New subdriver for the NXP (former Freescale) i.MX 6ULL. This SoC
     has multimedia features and target "smart devices", I guess in-car
     entertainment, in-flight entertainment, industrial control panels
     etc.

  General improvements:

   - Incremental improvements on the SH-PFC subdrivers for things like
     the CAN bus.

   - Enable the glitch filter on Baytrail GPIOs used for interrupts.

   - Proper handling of pins to GPIO ranges on the Semtec SX150X

   - An IRQ setup ordering fix on MCP23S08.

   - A good set of janitorial coding style fixes"

* tag 'pinctrl-v4.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (102 commits)
  pinctrl: mcp23s08: fix irq setup order
  pinctrl: Forward declare struct device
  pinctrl: sunxi: Use of_clk_get_parent_count() instead of open coding
  pinctrl: stm32: add STM32F769 MCU support
  pinctrl: sx150x: Add a static gpio/pinctrl pin range mapping
  pinctrl: sx150x: Register pinctrl before adding the gpiochip
  pinctrl: sx150x: Unregister the pinctrl on release
  pinctrl: ingenic: Remove redundant dev_err call in ingenic_pinctrl_probe()
  pinctrl: sprd: Use seq_putc() in sprd_pinconf_group_dbg_show()
  pinctrl: pinmux: Use seq_putc() in pinmux_pins_show()
  pinctrl: abx500: Use seq_putc() in abx500_gpio_dbg_show()
  pinctrl: mediatek: mt7622: align error handling of mtk_hw_get_value call
  pinctrl: mediatek: mt7622: fix potential uninitialized value being returned
  pinctrl: uniphier: refactor drive strength get/set functions
  pinctrl: imx7ulp: constify struct imx_cfg_params_decode
  pinctrl: imx: constify struct imx_pinctrl_soc_info
  pinctrl: imx7d: simplify imx7d_pinctrl_probe
  pinctrl: imx: use struct imx_pinctrl_soc_info as a const
  pinctrl: sunxi-pinctrl: fix pin funtion can not be match correctly.
  pinctrl: qcom: Add msm8998 pinctrl driver
  ...

115 files changed:
Documentation/devicetree/bindings/pinctrl/cortina,gemini-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/fsl,imx6ul-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/mscc,ocelot-pinctrl.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pinctrl/pinctrl-mt7622.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pinctrl/qcom,msm8998-pinctrl.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/socionext,uniphier-pinctrl.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.txt
MAINTAINERS
drivers/gpio/gpio-uniphier.c
drivers/gpio/gpiolib-acpi.c
drivers/pinctrl/Kconfig
drivers/pinctrl/Makefile
drivers/pinctrl/core.c
drivers/pinctrl/freescale/pinctrl-imx.c
drivers/pinctrl/freescale/pinctrl-imx.h
drivers/pinctrl/freescale/pinctrl-imx25.c
drivers/pinctrl/freescale/pinctrl-imx35.c
drivers/pinctrl/freescale/pinctrl-imx50.c
drivers/pinctrl/freescale/pinctrl-imx51.c
drivers/pinctrl/freescale/pinctrl-imx53.c
drivers/pinctrl/freescale/pinctrl-imx6dl.c
drivers/pinctrl/freescale/pinctrl-imx6q.c
drivers/pinctrl/freescale/pinctrl-imx6sl.c
drivers/pinctrl/freescale/pinctrl-imx6sx.c
drivers/pinctrl/freescale/pinctrl-imx6ul.c
drivers/pinctrl/freescale/pinctrl-imx7d.c
drivers/pinctrl/freescale/pinctrl-imx7ulp.c
drivers/pinctrl/freescale/pinctrl-vf610.c
drivers/pinctrl/intel/pinctrl-baytrail.c
drivers/pinctrl/intel/pinctrl-cannonlake.c
drivers/pinctrl/intel/pinctrl-cherryview.c
drivers/pinctrl/intel/pinctrl-intel.c
drivers/pinctrl/intel/pinctrl-intel.h
drivers/pinctrl/intel/pinctrl-merrifield.c
drivers/pinctrl/mediatek/Kconfig
drivers/pinctrl/mediatek/Makefile
drivers/pinctrl/mediatek/pinctrl-mt7622.c [new file with mode: 0644]
drivers/pinctrl/meson/Kconfig
drivers/pinctrl/meson/Makefile
drivers/pinctrl/meson/pinctrl-meson-axg-pmx.c [new file with mode: 0644]
drivers/pinctrl/meson/pinctrl-meson-axg-pmx.h [new file with mode: 0644]
drivers/pinctrl/meson/pinctrl-meson-axg.c [new file with mode: 0644]
drivers/pinctrl/meson/pinctrl-meson.h
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
drivers/pinctrl/mvebu/pinctrl-mvebu.c
drivers/pinctrl/nomadik/pinctrl-abx500.c
drivers/pinctrl/pinctrl-adi2.c
drivers/pinctrl/pinctrl-at91-pio4.c
drivers/pinctrl/pinctrl-at91.c
drivers/pinctrl/pinctrl-axp209.c
drivers/pinctrl/pinctrl-gemini.c
drivers/pinctrl/pinctrl-ingenic.c
drivers/pinctrl/pinctrl-mcp23s08.c
drivers/pinctrl/pinctrl-ocelot.c [new file with mode: 0644]
drivers/pinctrl/pinctrl-palmas.c
drivers/pinctrl/pinctrl-rockchip.c
drivers/pinctrl/pinctrl-single.c
drivers/pinctrl/pinctrl-sx150x.c
drivers/pinctrl/pinctrl-tz1090-pdc.c
drivers/pinctrl/pinctrl-tz1090.c
drivers/pinctrl/pinctrl-utils.c
drivers/pinctrl/pinctrl-xway.c
drivers/pinctrl/pinmux.c
drivers/pinctrl/pxa/pinctrl-pxa2xx.c
drivers/pinctrl/qcom/Kconfig
drivers/pinctrl/qcom/Makefile
drivers/pinctrl/qcom/pinctrl-msm.c
drivers/pinctrl/qcom/pinctrl-msm8998.c [new file with mode: 0644]
drivers/pinctrl/samsung/Kconfig
drivers/pinctrl/samsung/pinctrl-exynos-arm.c
drivers/pinctrl/samsung/pinctrl-exynos-arm64.c
drivers/pinctrl/samsung/pinctrl-exynos.c
drivers/pinctrl/samsung/pinctrl-exynos.h
drivers/pinctrl/samsung/pinctrl-exynos5440.c
drivers/pinctrl/samsung/pinctrl-s3c24xx.c
drivers/pinctrl/samsung/pinctrl-s3c64xx.c
drivers/pinctrl/samsung/pinctrl-samsung.c
drivers/pinctrl/samsung/pinctrl-samsung.h
drivers/pinctrl/sh-pfc/Kconfig
drivers/pinctrl/sh-pfc/Makefile
drivers/pinctrl/sh-pfc/core.c
drivers/pinctrl/sh-pfc/pfc-r8a7791.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-r8a77970.c [new file with mode: 0644]
drivers/pinctrl/sh-pfc/pfc-r8a77995.c
drivers/pinctrl/sh-pfc/sh_pfc.h
drivers/pinctrl/spear/pinctrl-plgpio.c
drivers/pinctrl/spear/pinctrl-spear.c
drivers/pinctrl/sprd/pinctrl-sprd.c
drivers/pinctrl/stm32/Kconfig
drivers/pinctrl/stm32/Makefile
drivers/pinctrl/stm32/pinctrl-stm32.c
drivers/pinctrl/stm32/pinctrl-stm32.h
drivers/pinctrl/stm32/pinctrl-stm32f429.c
drivers/pinctrl/stm32/pinctrl-stm32f469.c
drivers/pinctrl/stm32/pinctrl-stm32f746.c
drivers/pinctrl/stm32/pinctrl-stm32f769.c [new file with mode: 0644]
drivers/pinctrl/stm32/pinctrl-stm32h743.c
drivers/pinctrl/stm32/pinctrl-stm32mp157.c [new file with mode: 0644]
drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c
drivers/pinctrl/sunxi/pinctrl-sunxi.c
drivers/pinctrl/tegra/pinctrl-tegra.c
drivers/pinctrl/uniphier/pinctrl-uniphier-core.c
drivers/pinctrl/vt8500/pinctrl-vt8500.c
drivers/pinctrl/vt8500/pinctrl-wm8505.c
drivers/pinctrl/vt8500/pinctrl-wm8650.c
drivers/pinctrl/vt8500/pinctrl-wm8750.c
drivers/pinctrl/vt8500/pinctrl-wm8850.c
include/dt-bindings/gpio/meson-axg-gpio.h [new file with mode: 0644]
include/dt-bindings/pinctrl/stm32-pinfunc.h
include/linux/pinctrl/devinfo.h

index d857b67fab72a61fcf85b8eed6fd389883d4c097..4346ff2dd8e680353557f4861671f096cbec6890 100644 (file)
@@ -17,6 +17,9 @@ and generic pin config nodes.
 
 Supported configurations:
 - skew-delay is supported on the Ethernet pins
+- drive-strength with 4, 8, 12 or 16 mA as argument is supported for
+  entire groups on the groups "idegrp", "gmii_gmac0_grp", "gmii_gmac1_grp"
+  and "pcigrp".
 
 Example:
 
index a81bbf37ed66979b1b22ee371aa666676c5181f6..7ca4f6118d9a07ff296739f0f4b23147a15d99c3 100644 (file)
@@ -4,7 +4,8 @@ Please refer to fsl,imx-pinctrl.txt in this directory for common binding part
 and usage.
 
 Required properties:
-- compatible: "fsl,imx6ul-iomuxc"
+- compatible: "fsl,imx6ul-iomuxc" for main IOMUX controller or
+  "fsl,imx6ull-iomuxc-snvs" for i.MX 6ULL's SNVS IOMUX controller.
 - fsl,pins: each entry consists of 6 integers and represents the mux and config
   setting for one pin.  The first 5 integers <mux_reg conf_reg input_reg mux_val
   input_val> are specified using a PIN_FUNC_ID macro, which can be found in
diff --git a/Documentation/devicetree/bindings/pinctrl/mscc,ocelot-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/mscc,ocelot-pinctrl.txt
new file mode 100644 (file)
index 0000000..24a210e
--- /dev/null
@@ -0,0 +1,39 @@
+Microsemi Ocelot pin controller Device Tree Bindings
+----------------------------------------------------
+
+Required properties:
+ - compatible          : Should be "mscc,ocelot-pinctrl"
+ - reg                 : Address and length of the register set for the device
+ - gpio-controller     : Indicates this device is a GPIO controller
+ - #gpio-cells         : Must be 2.
+                         The first cell is the pin number and the
+                         second cell specifies GPIO flags, as defined in
+                         <dt-bindings/gpio/gpio.h>.
+ - gpio-ranges         : Range of pins managed by the GPIO controller.
+
+
+The ocelot-pinctrl driver uses the generic pin multiplexing and generic pin
+configuration documented in pinctrl-bindings.txt.
+
+The following generic properties are supported:
+ - function
+ - pins
+
+Example:
+       gpio: pinctrl@71070034 {
+               compatible = "mscc,ocelot-pinctrl";
+               reg = <0x71070034 0x28>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               gpio-ranges = <&gpio 0 0 22>;
+
+               uart_pins: uart-pins {
+                               pins = "GPIO_6", "GPIO_7";
+                               function = "uart";
+               };
+
+               uart2_pins: uart2-pins {
+                               pins = "GPIO_12", "GPIO_13";
+                               function = "uart2";
+               };
+       };
diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-mt7622.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-mt7622.txt
new file mode 100644 (file)
index 0000000..f18ed99
--- /dev/null
@@ -0,0 +1,351 @@
+== MediaTek MT7622 pinctrl controller ==
+
+Required properties for the root node:
+ - compatible: Should be one of the following
+              "mediatek,mt7622-pinctrl" for MT7622 SoC
+ - reg: offset and length of the pinctrl space
+
+ - gpio-controller: Marks the device node as a GPIO controller.
+ - #gpio-cells: Should be two. The first cell is the pin number and the
+   second is the GPIO flags.
+
+Please refer to pinctrl-bindings.txt in this directory for details of the
+common pinctrl bindings used by client devices, including the meaning of the
+phrase "pin configuration node".
+
+MT7622 pin configuration nodes act as a container for an arbitrary number of
+subnodes. Each of these subnodes represents some desired configuration for a
+pin, a group, or a list of pins or groups. This configuration can include the
+mux function to select on those pin(s)/group(s), and various pin configuration
+parameters, such as pull-up, slew rate, etc.
+
+We support 2 types of configuration nodes. Those nodes can be either pinmux
+nodes or pinconf nodes. Each configuration node can consist of multiple nodes
+describing the pinmux and pinconf options.
+
+The name of each subnode doesn't matter as long as it is unique; all subnodes
+should be enumerated and processed purely based on their content.
+
+== pinmux nodes content ==
+
+The following generic properties as defined in pinctrl-bindings.txt are valid
+to specify in a pinmux subnode:
+
+Required properties are:
+ - groups: An array of strings. Each string contains the name of a group.
+  Valid values for these names are listed below.
+ - function: A string containing the name of the function to mux to the
+  group. Valid values for function names are listed below.
+
+== pinconf nodes content ==
+
+The following generic properties as defined in pinctrl-bindings.txt are valid
+to specify in a pinconf subnode:
+
+Required properties are:
+ - pins: An array of strings. Each string contains the name of a pin.
+  Valid values for these names are listed below.
+ - groups: An array of strings. Each string contains the name of a group.
+  Valid values for these names are listed below.
+
+Optional properies are:
+ bias-disable, bias-pull, bias-pull-down, input-enable,
+ input-schmitt-enable, input-schmitt-disable, output-enable
+ output-low, output-high, drive-strength, slew-rate
+
+ Valid arguments for 'slew-rate' are '0' for no slew rate controlled and '1' for
+ slower slew rate respectively.
+ Valid arguments for 'drive-strength', 4, 8, 12, or 16 in mA.
+
+The following specific properties as defined are valid to specify in a pinconf
+subnode:
+
+Optional properties are:
+ - mediatek,tdsel: An integer describing the steps for output level shifter duty
+   cycle when asserted (high pulse width adjustment). Valid arguments are from 0
+   to 15.
+ - mediatek,rdsel: An integer describing the steps for input level shifter duty
+   cycle when asserted (high pulse width adjustment). Valid arguments are from 0
+   to 63.
+
+== Valid values for pins, function and groups on MT7622 ==
+
+Valid values for pins are:
+pins can be referenced via the pin names as the below table shown and the
+related physical number is also put ahead of those names which helps cross
+references to pins between groups to know whether pins assignment conflict
+happens among devices try to acquire those available pins.
+
+       Pin #:  Valid values for pins
+       -----------------------------
+       PIN 0: "GPIO_A"
+       PIN 1: "I2S1_IN"
+       PIN 2: "I2S1_OUT"
+       PIN 3: "I2S_BCLK"
+       PIN 4: "I2S_WS"
+       PIN 5: "I2S_MCLK"
+       PIN 6: "TXD0"
+       PIN 7: "RXD0"
+       PIN 8: "SPI_WP"
+       PIN 9: "SPI_HOLD"
+       PIN 10: "SPI_CLK"
+       PIN 11: "SPI_MOSI"
+       PIN 12: "SPI_MISO"
+       PIN 13: "SPI_CS"
+       PIN 14: "I2C_SDA"
+       PIN 15: "I2C_SCL"
+       PIN 16: "I2S2_IN"
+       PIN 17: "I2S3_IN"
+       PIN 18: "I2S4_IN"
+       PIN 19: "I2S2_OUT"
+       PIN 20: "I2S3_OUT"
+       PIN 21: "I2S4_OUT"
+       PIN 22: "GPIO_B"
+       PIN 23: "MDC"
+       PIN 24: "MDIO"
+       PIN 25: "G2_TXD0"
+       PIN 26: "G2_TXD1"
+       PIN 27: "G2_TXD2"
+       PIN 28: "G2_TXD3"
+       PIN 29: "G2_TXEN"
+       PIN 30: "G2_TXC"
+       PIN 31: "G2_RXD0"
+       PIN 32: "G2_RXD1"
+       PIN 33: "G2_RXD2"
+       PIN 34: "G2_RXD3"
+       PIN 35: "G2_RXDV"
+       PIN 36: "G2_RXC"
+       PIN 37: "NCEB"
+       PIN 38: "NWEB"
+       PIN 39: "NREB"
+       PIN 40: "NDL4"
+       PIN 41: "NDL5"
+       PIN 42: "NDL6"
+       PIN 43: "NDL7"
+       PIN 44: "NRB"
+       PIN 45: "NCLE"
+       PIN 46: "NALE"
+       PIN 47: "NDL0"
+       PIN 48: "NDL1"
+       PIN 49: "NDL2"
+       PIN 50: "NDL3"
+       PIN 51: "MDI_TP_P0"
+       PIN 52: "MDI_TN_P0"
+       PIN 53: "MDI_RP_P0"
+       PIN 54: "MDI_RN_P0"
+       PIN 55: "MDI_TP_P1"
+       PIN 56: "MDI_TN_P1"
+       PIN 57: "MDI_RP_P1"
+       PIN 58: "MDI_RN_P1"
+       PIN 59: "MDI_RP_P2"
+       PIN 60: "MDI_RN_P2"
+       PIN 61: "MDI_TP_P2"
+       PIN 62: "MDI_TN_P2"
+       PIN 63: "MDI_TP_P3"
+       PIN 64: "MDI_TN_P3"
+       PIN 65: "MDI_RP_P3"
+       PIN 66: "MDI_RN_P3"
+       PIN 67: "MDI_RP_P4"
+       PIN 68: "MDI_RN_P4"
+       PIN 69: "MDI_TP_P4"
+       PIN 70: "MDI_TN_P4"
+       PIN 71: "PMIC_SCL"
+       PIN 72: "PMIC_SDA"
+       PIN 73: "SPIC1_CLK"
+       PIN 74: "SPIC1_MOSI"
+       PIN 75: "SPIC1_MISO"
+       PIN 76: "SPIC1_CS"
+       PIN 77: "GPIO_D"
+       PIN 78: "WATCHDOG"
+       PIN 79: "RTS3_N"
+       PIN 80: "CTS3_N"
+       PIN 81: "TXD3"
+       PIN 82: "RXD3"
+       PIN 83: "PERST0_N"
+       PIN 84: "PERST1_N"
+       PIN 85: "WLED_N"
+       PIN 86: "EPHY_LED0_N"
+       PIN 87: "AUXIN0"
+       PIN 88: "AUXIN1"
+       PIN 89: "AUXIN2"
+       PIN 90: "AUXIN3"
+       PIN 91: "TXD4"
+       PIN 92: "RXD4"
+       PIN 93: "RTS4_N"
+       PIN 94: "CST4_N"
+       PIN 95: "PWM1"
+       PIN 96: "PWM2"
+       PIN 97: "PWM3"
+       PIN 98: "PWM4"
+       PIN 99: "PWM5"
+       PIN 100: "PWM6"
+       PIN 101: "PWM7"
+       PIN 102: "GPIO_E"
+
+Valid values for function are:
+       "emmc", "eth", "i2c", "i2s", "ir", "led", "flash", "pcie",
+       "pmic", "pwm", "sd", "spi", "tdm", "uart", "watchdog"
+
+Valid values for groups are:
+additional data is put followingly with valid value allowing us to know which
+applicable function and which relevant pins (in pin#) are able applied for that
+group.
+
+       Valid value                     function        pins (in pin#)
+       -------------------------------------------------------------------------
+       "emmc"                          "emmc"          40, 41, 42, 43, 44, 45,
+                                                       47, 48, 49, 50
+       "emmc_rst"                      "emmc"          37
+       "esw"                           "eth"           51, 52, 53, 54, 55, 56,
+                                                       57, 58, 59, 60, 61, 62,
+                                                       63, 64, 65, 66, 67, 68,
+                                                       69, 70
+       "esw_p0_p1"                     "eth"           51, 52, 53, 54, 55, 56,
+                                                       57, 58
+       "esw_p2_p3_p4"                  "eth"           59, 60, 61, 62, 63, 64,
+                                                       65, 66, 67, 68, 69, 70
+       "rgmii_via_esw"                 "eth"           59, 60, 61, 62, 63, 64,
+                                                       65, 66, 67, 68, 69, 70
+       "rgmii_via_gmac1"               "eth"           59, 60, 61, 62, 63, 64,
+                                                       65, 66, 67, 68, 69, 70
+       "rgmii_via_gmac2"               "eth"           25, 26, 27, 28, 29, 30,
+                                                       31, 32, 33, 34, 35, 36
+       "mdc_mdio"                      "eth"           23, 24
+       "i2c0"                          "i2c"           14, 15
+       "i2c1_0"                        "i2c"           55, 56
+       "i2c1_1"                        "i2c"           73, 74
+       "i2c1_2"                        "i2c"           87, 88
+       "i2c2_0"                        "i2c"           57, 58
+       "i2c2_1"                        "i2c"           75, 76
+       "i2c2_2"                        "i2c"           89, 90
+       "i2s_in_mclk_bclk_ws"           "i2s"           3, 4, 5
+       "i2s1_in_data"                  "i2s"           1
+       "i2s2_in_data"                  "i2s"           16
+       "i2s3_in_data"                  "i2s"           17
+       "i2s4_in_data"                  "i2s"           18
+       "i2s_out_mclk_bclk_ws"          "i2s"           3, 4, 5
+       "i2s1_out_data"                 "i2s"           2
+       "i2s2_out_data"                 "i2s"           19
+       "i2s3_out_data"                 "i2s"           20
+       "i2s4_out_data"                 "i2s"           21
+       "ir_0_tx"                       "ir"            16
+       "ir_1_tx"                       "ir"            59
+       "ir_2_tx"                       "ir"            99
+       "ir_0_rx"                       "ir"            17
+       "ir_1_rx"                       "ir"            60
+       "ir_2_rx"                       "ir"            100
+       "ephy_leds"                     "led"           86, 91, 92, 93, 94
+       "ephy0_led"                     "led"           86
+       "ephy1_led"                     "led"           91
+       "ephy2_led"                     "led"           92
+       "ephy3_led"                     "led"           93
+       "ephy4_led"                     "led"           94
+       "wled"                          "led"           85
+       "par_nand"                      "flash"         37, 38, 39, 40, 41, 42,
+                                                       43, 44, 45, 46, 47, 48,
+                                                       49, 50
+       "snfi"                          "flash"         8, 9, 10, 11, 12, 13
+       "spi_nor"                       "flash"         8, 9, 10, 11, 12, 13
+       "pcie0_0_waken"                 "pcie"          14
+       "pcie0_1_waken"                 "pcie"          79
+       "pcie1_0_waken"                 "pcie"          14
+       "pcie0_0_clkreq"                "pcie"          15
+       "pcie0_1_clkreq"                "pcie"          80
+       "pcie1_0_clkreq"                "pcie"          15
+       "pcie0_pad_perst"               "pcie"          83
+       "pcie1_pad_perst"               "pcie"          84
+       "pmic_bus"                      "pmic"          71, 72
+       "pwm_ch1_0"                     "pwm"           51
+       "pwm_ch1_1"                     "pwm"           73
+       "pwm_ch1_2"                     "pwm"           95
+       "pwm_ch2_0"                     "pwm"           52
+       "pwm_ch2_1"                     "pwm"           74
+       "pwm_ch2_2"                     "pwm"           96
+       "pwm_ch3_0"                     "pwm"           53
+       "pwm_ch3_1"                     "pwm"           75
+       "pwm_ch3_2"                     "pwm"           97
+       "pwm_ch4_0"                     "pwm"           54
+       "pwm_ch4_1"                     "pwm"           67
+       "pwm_ch4_2"                     "pwm"           76
+       "pwm_ch4_3"                     "pwm"           98
+       "pwm_ch5_0"                     "pwm"           68
+       "pwm_ch5_1"                     "pwm"           77
+       "pwm_ch5_2"                     "pwm"           99
+       "pwm_ch6_0"                     "pwm"           69
+       "pwm_ch6_1"                     "pwm"           78
+       "pwm_ch6_2"                     "pwm"           81
+       "pwm_ch6_3"                     "pwm"           100
+       "pwm_ch7_0"                     "pwm"           70
+       "pwm_ch7_1"                     "pwm"           82
+       "pwm_ch7_2"                     "pwm"           101
+       "sd_0"                          "sd"            16, 17, 18, 19, 20, 21
+       "sd_1"                          "sd"            25, 26, 27, 28, 29, 30
+       "spic0_0"                       "spi"           63, 64, 65, 66
+       "spic0_1"                       "spi"           79, 80, 81, 82
+       "spic1_0"                       "spi"           67, 68, 69, 70
+       "spic1_1"                       "spi"           73, 74, 75, 76
+       "spic2_0_wp_hold"               "spi"           8, 9
+       "spic2_0"                       "spi"           10, 11, 12, 13
+       "tdm_0_out_mclk_bclk_ws"        "tdm"           8, 9, 10
+       "tdm_0_in_mclk_bclk_ws"         "tdm"           11, 12, 13
+       "tdm_0_out_data"                "tdm"           20
+       "tdm_0_in_data"                 "tdm"           21
+       "tdm_1_out_mclk_bclk_ws"        "tdm"           57, 58, 59
+       "tdm_1_in_mclk_bclk_ws"         "tdm"           60, 61, 62
+       "tdm_1_out_data"                "tdm"           55
+       "tdm_1_in_data"                 "tdm"           56
+       "uart0_0_tx_rx"                 "uart"          6, 7
+       "uart1_0_tx_rx"                 "uart"          55, 56
+       "uart1_0_rts_cts"               "uart"          57, 58
+       "uart1_1_tx_rx"                 "uart"          73, 74
+       "uart1_1_rts_cts"               "uart"          75, 76
+       "uart2_0_tx_rx"                 "uart"          3, 4
+       "uart2_0_rts_cts"               "uart"          1, 2
+       "uart2_1_tx_rx"                 "uart"          51, 52
+       "uart2_1_rts_cts"               "uart"          53, 54
+       "uart2_2_tx_rx"                 "uart"          59, 60
+       "uart2_2_rts_cts"               "uart"          61, 62
+       "uart2_3_tx_rx"                 "uart"          95, 96
+       "uart3_0_tx_rx"                 "uart"          57, 58
+       "uart3_1_tx_rx"                 "uart"          81, 82
+       "uart3_1_rts_cts"               "uart"          79, 80
+       "uart4_0_tx_rx"                 "uart"          61, 62
+       "uart4_1_tx_rx"                 "uart"          91, 92
+       "uart4_1_rts_cts"               "uart"          93, 94
+       "uart4_2_tx_rx"                 "uart"          97, 98
+       "uart4_2_rts_cts"               "uart"          95, 96
+       "watchdog"                      "watchdog"      78
+
+Example:
+
+       pio: pinctrl@10211000 {
+               compatible = "mediatek,mt7622-pinctrl";
+               reg = <0 0x10211000 0 0x1000>;
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               pinctrl_eth_default: eth-default {
+                       mux-mdio {
+                               groups = "mdc_mdio";
+                               function = "eth";
+                               drive-strength = <12>;
+                       };
+
+                       mux-gmac2 {
+                               groups = "gmac2";
+                               function = "eth";
+                               drive-strength = <12>;
+                       };
+
+                       mux-esw {
+                               groups = "esw";
+                               function = "eth";
+                               drive-strength = <8>;
+                       };
+
+                       conf-mdio {
+                               pins = "MDC";
+                               bias-pull-up;
+                       };
+               };
+       };
diff --git a/Documentation/devicetree/bindings/pinctrl/qcom,msm8998-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/qcom,msm8998-pinctrl.txt
new file mode 100644 (file)
index 0000000..e70c79b
--- /dev/null
@@ -0,0 +1,193 @@
+Qualcomm MSM8998 TLMM block
+
+This binding describes the Top Level Mode Multiplexer block found in the
+MSM8998 platform.
+
+- compatible:
+       Usage: required
+       Value type: <string>
+       Definition: must be "qcom,msm8998-pinctrl"
+
+- reg:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: the base address and size of the TLMM register space.
+
+- interrupts:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: should specify the TLMM summary IRQ.
+
+- interrupt-controller:
+       Usage: required
+       Value type: <none>
+       Definition: identifies this node as an interrupt controller
+
+- #interrupt-cells:
+       Usage: required
+       Value type: <u32>
+       Definition: must be 2. Specifying the pin number and flags, as defined
+                   in <dt-bindings/interrupt-controller/irq.h>
+
+- gpio-controller:
+       Usage: required
+       Value type: <none>
+       Definition: identifies this node as a gpio controller
+
+- #gpio-cells:
+       Usage: required
+       Value type: <u32>
+       Definition: must be 2. Specifying the pin number and flags, as defined
+                   in <dt-bindings/gpio/gpio.h>
+
+Please refer to ../gpio/gpio.txt and ../interrupt-controller/interrupts.txt for
+a general description of GPIO and interrupt bindings.
+
+Please refer to pinctrl-bindings.txt in this directory for details of the
+common pinctrl bindings used by client devices, including the meaning of the
+phrase "pin configuration node".
+
+The pin configuration nodes act as a container for an arbitrary number of
+subnodes. Each of these subnodes represents some desired configuration for a
+pin, a group, or a list of pins or groups. This configuration can include the
+mux function to select on those pin(s)/group(s), and various pin configuration
+parameters, such as pull-up, drive strength, etc.
+
+
+PIN CONFIGURATION NODES:
+
+The name of each subnode is not important; all subnodes should be enumerated
+and processed purely based on their content.
+
+Each subnode only affects those parameters that are explicitly listed. In
+other words, a subnode that lists a mux function but no pin configuration
+parameters implies no information about any pin configuration parameters.
+Similarly, a pin subnode that describes a pullup parameter implies no
+information about e.g. the mux function.
+
+
+The following generic properties as defined in pinctrl-bindings.txt are valid
+to specify in a pin configuration subnode:
+
+- pins:
+       Usage: required
+       Value type: <string-array>
+       Definition: List of gpio pins affected by the properties specified in
+                   this subnode.
+
+                   Valid pins are:
+                     gpio0-gpio149
+                       Supports mux, bias and drive-strength
+
+                     sdc2_clk, sdc2_cmd, sdc2_data
+                       Supports bias and drive-strength
+
+                     ufs_reset
+                       Supports bias and drive-strength
+
+- function:
+       Usage: required
+       Value type: <string>
+       Definition: Specify the alternative function to be configured for the
+                   specified pins. Functions are only valid for gpio pins.
+                   Valid values are:
+
+                   gpio, adsp_ext, agera_pll, atest_char, atest_gpsadc0,
+                   atest_gpsadc1, atest_tsens, atest_tsens2, atest_usb1,
+                   atest_usb10, atest_usb11, atest_usb12, atest_usb13,
+                   audio_ref, bimc_dte0, bimc_dte1, blsp10_spi, blsp10_spi_a,
+                   blsp10_spi_b, blsp11_i2c, blsp1_spi, blsp1_spi_a,
+                   blsp1_spi_b, blsp2_spi, blsp9_spi, blsp_i2c1, blsp_i2c2,
+                   blsp_i2c3, blsp_i2c4, blsp_i2c5, blsp_i2c6, blsp_i2c7,
+                   blsp_i2c8, blsp_i2c9, blsp_i2c10, blsp_i2c11, blsp_i2c12,
+                   blsp_spi1, blsp_spi2, blsp_spi3, blsp_spi4, blsp_spi5,
+                   blsp_spi6, blsp_spi7, blsp_spi8, blsp_spi9, blsp_spi10,
+                   blsp_spi11, blsp_spi12, blsp_uart1_a, blsp_uart1_b,
+                   blsp_uart2_a, blsp_uart2_b, blsp_uart3_a, blsp_uart3_b,
+                   blsp_uart7_a, blsp_uart7_b, blsp_uart8, blsp_uart8_a,
+                   blsp_uart8_b, blsp_uart9_a, blsp_uart9_b, blsp_uim1_a,
+                   blsp_uim1_b, blsp_uim2_a, blsp_uim2_b, blsp_uim3_a,
+                   blsp_uim3_b, blsp_uim7_a, blsp_uim7_b, blsp_uim8_a,
+                   blsp_uim8_b, blsp_uim9_a, blsp_uim9_b, bt_reset,
+                   btfm_slimbus, cam_mclk, cci_async, cci_i2c, cci_timer0,
+                   cci_timer1, cci_timer2, cci_timer3, cci_timer4, cri_trng,
+                   cri_trng0, cri_trng1, dbg_out, ddr_bist, edp_hot, edp_lcd,
+                   gcc_gp1_a, gcc_gp1_b, gcc_gp2_a, gcc_gp2_b, gcc_gp3_a,
+                   gcc_gp3_b, hdmi_cec, hdmi_ddc, hdmi_hot, hdmi_rcv,
+                   isense_dbg, jitter_bist, ldo_en, ldo_update, lpass_slimbus,
+                   m_voc, mdp_vsync, mdp_vsync0, mdp_vsync1, mdp_vsync2,
+                   mdp_vsync3, mdp_vsync_a, mdp_vsync_b, modem_tsync, mss_lte,
+                   nav_dr, nav_pps, pa_indicator, pci_e0, phase_flag,
+                   pll_bypassnl, pll_reset, pri_mi2s, pri_mi2s_ws, prng_rosc,
+                   pwr_crypto, pwr_modem, pwr_nav, qdss_cti0_a, qdss_cti0_b,
+                   qdss_cti1_a, qdss_cti1_b, qdss, qlink_enable,
+                   qlink_request, qua_mi2s, sd_card, sd_write, sdc40, sdc41,
+                   sdc42, sdc43, sdc4_clk, sdc4_cmd, sec_mi2s, sp_cmu,
+                   spkr_i2s, ssbi1, ssc_irq, ter_mi2s, tgu_ch0, tgu_ch1,
+                   tsense_pwm1, tsense_pwm2, tsif1_clk, tsif1_data, tsif1_en,
+                   tsif1_error, tsif1_sync, tsif2_clk, tsif2_data, tsif2_en,
+                   tsif2_error, tsif2_sync, uim1_clk, uim1_data, uim1_present,
+                   uim1_reset, uim2_clk, uim2_data, uim2_present, uim2_reset,
+                   uim_batt, usb_phy, vfr_1, vsense_clkout, vsense_data0,
+                   vsense_data1, vsense_mode, wlan1_adc0, wlan1_adc1,
+                   wlan2_adc0, wlan2_adc1,
+
+- bias-disable:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as no pull.
+
+- bias-pull-down:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as pull down.
+
+- bias-pull-up:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as pull up.
+
+- output-high:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins are configured in output mode, driven
+                   high.
+                   Not valid for sdc pins.
+
+- output-low:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins are configured in output mode, driven
+                   low.
+                   Not valid for sdc pins.
+
+- drive-strength:
+       Usage: optional
+       Value type: <u32>
+       Definition: Selects the drive strength for the specified pins, in mA.
+                   Valid values are: 2, 4, 6, 8, 10, 12, 14 and 16
+
+Example:
+
+       tlmm: pinctrl@03400000 {
+               compatible = "qcom,msm8998-pinctrl";
+               reg = <0x03400000 0xc00000>;
+               interrupts = <0 208 0>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+
+               uart_console_active: uart_console_active {
+                       mux {
+                               pins = "gpio4", "gpio5";
+                               function = "blsp_uart8_a";
+                       };
+
+                       config {
+                               pins = "gpio4", "gpio5";
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+               };
+       };
index 9b4f8041c36a62e7cdb4ddd77935e49c20dd8859..bb1790e0b17652e657e1c913a939f695c8368c9f 100644 (file)
@@ -24,6 +24,7 @@ Required Properties:
     - "renesas,pfc-r8a7794": for R8A7794 (R-Car E2) compatible pin-controller.
     - "renesas,pfc-r8a7795": for R8A7795 (R-Car H3) compatible pin-controller.
     - "renesas,pfc-r8a7796": for R8A7796 (R-Car M3-W) compatible pin-controller.
+    - "renesas,pfc-r8a77970": for R8A77970 (R-Car V3M) compatible pin-controller.
     - "renesas,pfc-r8a77995": for R8A77995 (R-Car D3) compatible pin-controller.
     - "renesas,pfc-sh73a0": for SH73A0 (SH-Mobile AG5) compatible pin-controller.
 
diff --git a/Documentation/devicetree/bindings/pinctrl/socionext,uniphier-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/socionext,uniphier-pinctrl.txt
new file mode 100644 (file)
index 0000000..8173b12
--- /dev/null
@@ -0,0 +1,27 @@
+UniPhier SoCs pin controller
+
+Required properties:
+- compatible: should be one of the following:
+    "socionext,uniphier-ld4-pinctrl"  - for LD4 SoC
+    "socionext,uniphier-pro4-pinctrl" - for Pro4 SoC
+    "socionext,uniphier-sld8-pinctrl" - for sLD8 SoC
+    "socionext,uniphier-pro5-pinctrl" - for Pro5 SoC
+    "socionext,uniphier-pxs2-pinctrl" - for PXs2 SoC
+    "socionext,uniphier-ld6b-pinctrl" - for LD6b SoC
+    "socionext,uniphier-ld11-pinctrl" - for LD11 SoC
+    "socionext,uniphier-ld20-pinctrl" - for LD20 SoC
+    "socionext,uniphier-pxs3-pinctrl" - for PXs3 SoC
+
+Note:
+The UniPhier pinctrl should be a subnode of a "syscon" compatible node.
+
+Example:
+       soc-glue@5f800000 {
+               compatible = "socionext,uniphier-pro4-soc-glue",
+                            "simple-mfd", "syscon";
+               reg = <0x5f800000 0x2000>;
+
+               pinctrl: pinctrl {
+                       compatible = "socionext,uniphier-pro4-pinctrl";
+               };
+       };
index 58c2a4c229db18db99c09bbd88eb6d015183421e..2c46f30b62c513b5bd5db47cab22fa827ebcc1ce 100644 (file)
@@ -12,6 +12,8 @@ Required properies:
    "st,stm32f469-pinctrl"
    "st,stm32f746-pinctrl"
    "st,stm32h743-pinctrl"
+   "st,stm32mp157-pinctrl"
+   "st,stm32mp157-z-pinctrl"
  - #address-cells: The value of this property must be 1
  - #size-cells : The value of this property must be 1
  - ranges      : defines mapping between pin controller node (parent) to
index 1dc846d0add689ba6c94d14c14c238da5e5549c2..cd0e9c763bd8e94cc1d128c2da590fa34faf9ccd 100644 (file)
@@ -2086,6 +2086,7 @@ L:        linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-uniphier.git
 S:     Maintained
 F:     Documentation/devicetree/bindings/gpio/gpio-uniphier.txt
+F:     Documentation/devicetree/bindings/pinctrl/socionext,uniphier-pinctrl.txt
 F:     arch/arm/boot/dts/uniphier*
 F:     arch/arm/include/asm/hardware/cache-uniphier.h
 F:     arch/arm/mach-uniphier/
@@ -10875,6 +10876,16 @@ M:     Heikki Krogerus <heikki.krogerus@linux.intel.com>
 S:     Maintained
 F:     drivers/pinctrl/intel/
 
+PIN CONTROLLER - MEDIATEK
+M:     Sean Wang <sean.wang@mediatek.com>
+L:     linux-mediatek@lists.infradead.org (moderated for non-subscribers)
+S:     Maintained
+F:     Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
+F:     Documentation/devicetree/bindings/pinctrl/pinctrl-mt7622.txt
+F:     drivers/pinctrl/mediatek/pinctrl-mtk-common.*
+F:     drivers/pinctrl/mediatek/pinctrl-mt2701.c
+F:     drivers/pinctrl/mediatek/pinctrl-mt7622.c
+
 PIN CONTROLLER - QUALCOMM
 M:     Bjorn Andersson <bjorn.andersson@linaro.org>
 S:     Maintained
index 016d7427ebfac16afee833a60959c2fe87f5a75d..761d8279abca20b4cad83a54c8ace87ee38de8e8 100644 (file)
@@ -505,4 +505,4 @@ module_platform_driver(uniphier_gpio_driver);
 
 MODULE_AUTHOR("Masahiro Yamada <yamada.masahiro@socionext.com>");
 MODULE_DESCRIPTION("UniPhier GPIO driver");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");
index 0ecffd172a80045722aa9a0fa2b6facdc0292e38..e2232cbcec8bbe6276e8e9d02e8c0f9e36d34030 100644 (file)
@@ -58,58 +58,6 @@ static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
        return ACPI_HANDLE(gc->parent) == data;
 }
 
-#ifdef CONFIG_PINCTRL
-/**
- * acpi_gpiochip_pin_to_gpio_offset() - translates ACPI GPIO to Linux GPIO
- * @gdev: GPIO device
- * @pin: ACPI GPIO pin number from GpioIo/GpioInt resource
- *
- * Function takes ACPI GpioIo/GpioInt pin number as a parameter and
- * translates it to a corresponding offset suitable to be passed to a
- * GPIO controller driver.
- *
- * Typically the returned offset is same as @pin, but if the GPIO
- * controller uses pin controller and the mapping is not contiguous the
- * offset might be different.
- */
-static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev, int pin)
-{
-       struct gpio_pin_range *pin_range;
-
-       /* If there are no ranges in this chip, use 1:1 mapping */
-       if (list_empty(&gdev->pin_ranges))
-               return pin;
-
-       list_for_each_entry(pin_range, &gdev->pin_ranges, node) {
-               const struct pinctrl_gpio_range *range = &pin_range->range;
-               int i;
-
-               if (range->pins) {
-                       for (i = 0; i < range->npins; i++) {
-                               if (range->pins[i] == pin)
-                                       return range->base + i - gdev->base;
-                       }
-               } else {
-                       if (pin >= range->pin_base &&
-                           pin < range->pin_base + range->npins) {
-                               unsigned gpio_base;
-
-                               gpio_base = range->base - gdev->base;
-                               return gpio_base + pin - range->pin_base;
-                       }
-               }
-       }
-
-       return -EINVAL;
-}
-#else
-static inline int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev,
-                                                  int pin)
-{
-       return pin;
-}
-#endif
-
 /**
  * acpi_get_gpiod() - Translate ACPI GPIO pin to GPIO descriptor usable with GPIO API
  * @path:      ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1")
@@ -125,7 +73,6 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
        struct gpio_chip *chip;
        acpi_handle handle;
        acpi_status status;
-       int offset;
 
        status = acpi_get_handle(NULL, path, &handle);
        if (ACPI_FAILURE(status))
@@ -135,11 +82,7 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
        if (!chip)
                return ERR_PTR(-EPROBE_DEFER);
 
-       offset = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
-       if (offset < 0)
-               return ERR_PTR(offset);
-
-       return gpiochip_get_desc(chip, offset);
+       return gpiochip_get_desc(chip, pin);
 }
 
 static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
@@ -216,10 +159,6 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
        if (!handler)
                return AE_OK;
 
-       pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
-       if (pin < 0)
-               return AE_BAD_PARAMETER;
-
        desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
        if (IS_ERR(desc)) {
                dev_err(chip->parent, "Failed to request GPIO\n");
@@ -871,12 +810,6 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
                struct gpio_desc *desc;
                bool found;
 
-               pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
-               if (pin < 0) {
-                       status = AE_BAD_PARAMETER;
-                       goto out;
-               }
-
                mutex_lock(&achip->conn_lock);
 
                found = false;
@@ -1009,11 +942,7 @@ static struct gpio_desc *acpi_gpiochip_parse_own_gpio(
        if (ret < 0)
                return ERR_PTR(ret);
 
-       ret = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, gpios[0]);
-       if (ret < 0)
-               return ERR_PTR(ret);
-
-       desc = gpiochip_get_desc(chip, ret);
+       desc = gpiochip_get_desc(chip, gpios[0]);
        if (IS_ERR(desc))
                return desc;
 
index ce126955212ccbe716d4990f2d540f68a9d8524c..0f254b35c378ec0a70d67a89b10433f6535f78d9 100644 (file)
@@ -66,6 +66,10 @@ config PINCTRL_AS3722
 config PINCTRL_AXP209
        tristate "X-Powers AXP209 PMIC pinctrl and GPIO Support"
        depends on MFD_AXP20X
+       depends on OF
+       select PINMUX
+       select GENERIC_PINCONF
+       select GPIOLIB
        help
          AXP PMICs provides multiple GPIOs that can be muxed for different
          functions. This driver bundles a pinctrl driver to select the function
@@ -353,6 +357,17 @@ config PINCTRL_RK805
        help
          This selects the pinctrl driver for RK805.
 
+config PINCTRL_OCELOT
+       bool "Pinctrl driver for the Microsemi Ocelot SoCs"
+       default y
+       depends on OF
+       depends on MSCC_OCELOT || COMPILE_TEST
+       select GPIOLIB
+       select GENERIC_PINCONF
+       select GENERIC_PINCTRL_GROUPS
+       select GENERIC_PINMUX_FUNCTIONS
+       select REGMAP_MMIO
+
 source "drivers/pinctrl/aspeed/Kconfig"
 source "drivers/pinctrl/bcm/Kconfig"
 source "drivers/pinctrl/berlin/Kconfig"
index 4777f1595ce203681cb466c828dcf760d21971f0..d3692633e9ed5a4fd2741a2daffb6fad84d91ac5 100644 (file)
@@ -46,6 +46,7 @@ obj-$(CONFIG_PINCTRL_ST)      += pinctrl-st.o
 obj-$(CONFIG_PINCTRL_ZYNQ)     += pinctrl-zynq.o
 obj-$(CONFIG_PINCTRL_INGENIC)  += pinctrl-ingenic.o
 obj-$(CONFIG_PINCTRL_RK805)    += pinctrl-rk805.o
+obj-$(CONFIG_PINCTRL_OCELOT)   += pinctrl-ocelot.o
 
 obj-$(CONFIG_ARCH_ASPEED)      += aspeed/
 obj-y                          += bcm/
@@ -65,5 +66,5 @@ obj-$(CONFIG_PINCTRL_SUNXI)   += sunxi/
 obj-y                          += ti/
 obj-$(CONFIG_PINCTRL_UNIPHIER) += uniphier/
 obj-$(CONFIG_ARCH_VT8500)      += vt8500/
-obj-$(CONFIG_PINCTRL_MTK)      += mediatek/
+obj-y                          += mediatek/
 obj-$(CONFIG_PINCTRL_ZX)       += zte/
index 4c8d5b23e4d046a9931c6a09a6628c4b367512e8..2c0dbfcff3e6c7aeca93f3db3b3ceb4387a6f478 100644 (file)
@@ -1189,19 +1189,16 @@ struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p,
 EXPORT_SYMBOL_GPL(pinctrl_lookup_state);
 
 /**
- * pinctrl_select_state() - select/activate/program a pinctrl state to HW
+ * pinctrl_commit_state() - select/activate/program a pinctrl state to HW
  * @p: the pinctrl handle for the device that requests configuration
  * @state: the state handle to select/activate/program
  */
-int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
+static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
 {
        struct pinctrl_setting *setting, *setting2;
        struct pinctrl_state *old_state = p->state;
        int ret;
 
-       if (p->state == state)
-               return 0;
-
        if (p->state) {
                /*
                 * For each pinmux setting in the old state, forget SW's record
@@ -1265,6 +1262,19 @@ unapply_new_state:
 
        return ret;
 }
+
+/**
+ * pinctrl_select_state() - select/activate/program a pinctrl state to HW
+ * @p: the pinctrl handle for the device that requests configuration
+ * @state: the state handle to select/activate/program
+ */
+int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
+{
+       if (p->state == state)
+               return 0;
+
+       return pinctrl_commit_state(p, state);
+}
 EXPORT_SYMBOL_GPL(pinctrl_select_state);
 
 static void devm_pinctrl_release(struct device *dev, void *res)
@@ -1430,7 +1440,7 @@ void pinctrl_unregister_map(const struct pinctrl_map *map)
 int pinctrl_force_sleep(struct pinctrl_dev *pctldev)
 {
        if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_sleep))
-               return pinctrl_select_state(pctldev->p, pctldev->hog_sleep);
+               return pinctrl_commit_state(pctldev->p, pctldev->hog_sleep);
        return 0;
 }
 EXPORT_SYMBOL_GPL(pinctrl_force_sleep);
@@ -1442,7 +1452,7 @@ EXPORT_SYMBOL_GPL(pinctrl_force_sleep);
 int pinctrl_force_default(struct pinctrl_dev *pctldev)
 {
        if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_default))
-               return pinctrl_select_state(pctldev->p, pctldev->hog_default);
+               return pinctrl_commit_state(pctldev->p, pctldev->hog_default);
        return 0;
 }
 EXPORT_SYMBOL_GPL(pinctrl_force_default);
index 6e472691d8eed6f0d3a71d20fe8e6e7e939d5b7d..24aaddd760a08d3c562da937fd895d037a2a4b51 100644 (file)
@@ -62,7 +62,6 @@ static int imx_dt_node_to_map(struct pinctrl_dev *pctldev,
                        struct pinctrl_map **map, unsigned *num_maps)
 {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
-       struct imx_pinctrl_soc_info *info = ipctl->info;
        const struct group_desc *grp;
        struct pinctrl_map *new_map;
        struct device_node *parent;
@@ -75,7 +74,7 @@ static int imx_dt_node_to_map(struct pinctrl_dev *pctldev,
         */
        grp = imx_pinctrl_find_group_by_name(pctldev, np->name);
        if (!grp) {
-               dev_err(info->dev, "unable to find group for node %s\n",
+               dev_err(ipctl->dev, "unable to find group for node %s\n",
                        np->name);
                return -EINVAL;
        }
@@ -146,7 +145,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
                       unsigned group)
 {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
-       struct imx_pinctrl_soc_info *info = ipctl->info;
+       const struct imx_pinctrl_soc_info *info = ipctl->info;
        const struct imx_pin_reg *pin_reg;
        unsigned int npins, pin_id;
        int i;
@@ -174,7 +173,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
                struct imx_pin *pin = &((struct imx_pin *)(grp->data))[i];
 
                pin_id = pin->pin;
-               pin_reg = &info->pin_regs[pin_id];
+               pin_reg = &ipctl->pin_regs[pin_id];
 
                if (pin_reg->mux_reg == -1) {
                        dev_dbg(ipctl->dev, "Pin(%s) does not support mux function\n",
@@ -255,8 +254,8 @@ static u32 imx_pinconf_decode_generic_config(struct imx_pinctrl *ipctl,
                                              unsigned long *configs,
                                              unsigned int num_configs)
 {
-       struct imx_pinctrl_soc_info *info = ipctl->info;
-       struct imx_cfg_params_decode *decode;
+       const struct imx_pinctrl_soc_info *info = ipctl->info;
+       const struct imx_cfg_params_decode *decode;
        enum pin_config_param param;
        u32 raw_config = 0;
        u32 param_val;
@@ -289,7 +288,7 @@ static u32 imx_pinconf_decode_generic_config(struct imx_pinctrl *ipctl,
 static u32 imx_pinconf_parse_generic_config(struct device_node *np,
                                            struct imx_pinctrl *ipctl)
 {
-       struct imx_pinctrl_soc_info *info = ipctl->info;
+       const struct imx_pinctrl_soc_info *info = ipctl->info;
        struct pinctrl_dev *pctl = ipctl->pctl;
        unsigned int num_configs;
        unsigned long *configs;
@@ -310,11 +309,11 @@ static int imx_pinconf_get(struct pinctrl_dev *pctldev,
                             unsigned pin_id, unsigned long *config)
 {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
-       struct imx_pinctrl_soc_info *info = ipctl->info;
-       const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
+       const struct imx_pinctrl_soc_info *info = ipctl->info;
+       const struct imx_pin_reg *pin_reg = &ipctl->pin_regs[pin_id];
 
        if (pin_reg->conf_reg == -1) {
-               dev_err(info->dev, "Pin(%s) does not support config function\n",
+               dev_err(ipctl->dev, "Pin(%s) does not support config function\n",
                        info->pins[pin_id].name);
                return -EINVAL;
        }
@@ -332,12 +331,12 @@ static int imx_pinconf_set(struct pinctrl_dev *pctldev,
                             unsigned num_configs)
 {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
-       struct imx_pinctrl_soc_info *info = ipctl->info;
-       const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
+       const struct imx_pinctrl_soc_info *info = ipctl->info;
+       const struct imx_pin_reg *pin_reg = &ipctl->pin_regs[pin_id];
        int i;
 
        if (pin_reg->conf_reg == -1) {
-               dev_err(info->dev, "Pin(%s) does not support config function\n",
+               dev_err(ipctl->dev, "Pin(%s) does not support config function\n",
                        info->pins[pin_id].name);
                return -EINVAL;
        }
@@ -368,8 +367,7 @@ static void imx_pinconf_dbg_show(struct pinctrl_dev *pctldev,
                                   struct seq_file *s, unsigned pin_id)
 {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
-       struct imx_pinctrl_soc_info *info = ipctl->info;
-       const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
+       const struct imx_pin_reg *pin_reg = &ipctl->pin_regs[pin_id];
        unsigned long config;
 
        if (!pin_reg || pin_reg->conf_reg == -1) {
@@ -427,13 +425,13 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
                                    struct imx_pinctrl *ipctl,
                                    u32 index)
 {
-       struct imx_pinctrl_soc_info *info = ipctl->info;
+       const struct imx_pinctrl_soc_info *info = ipctl->info;
        int size, pin_size;
        const __be32 *list;
        int i;
        u32 config;
 
-       dev_dbg(info->dev, "group(%d): %s\n", index, np->name);
+       dev_dbg(ipctl->dev, "group(%d): %s\n", index, np->name);
 
        if (info->flags & SHARE_MUX_CONF_REG)
                pin_size = SHARE_FSL_PIN_SIZE;
@@ -460,7 +458,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
        if (!list) {
                list = of_get_property(np, "pinmux", &size);
                if (!list) {
-                       dev_err(info->dev,
+                       dev_err(ipctl->dev,
                                "no fsl,pins and pins property in node %pOF\n", np);
                        return -EINVAL;
                }
@@ -468,7 +466,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
 
        /* we do not check return since it's safe node passed down */
        if (!size || size % pin_size) {
-               dev_err(info->dev, "Invalid fsl,pins or pins property in node %pOF\n", np);
+               dev_err(ipctl->dev, "Invalid fsl,pins or pins property in node %pOF\n", np);
                return -EINVAL;
        }
 
@@ -476,9 +474,9 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
        config = imx_pinconf_parse_generic_config(np, ipctl);
 
        grp->num_pins = size / pin_size;
-       grp->data = devm_kzalloc(info->dev, grp->num_pins *
+       grp->data = devm_kzalloc(ipctl->dev, grp->num_pins *
                                 sizeof(struct imx_pin), GFP_KERNEL);
-       grp->pins = devm_kzalloc(info->dev, grp->num_pins *
+       grp->pins = devm_kzalloc(ipctl->dev, grp->num_pins *
                                 sizeof(unsigned int), GFP_KERNEL);
        if (!grp->pins || !grp->data)
                return -ENOMEM;
@@ -502,7 +500,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
                }
 
                pin_id = (mux_reg != -1) ? mux_reg / 4 : conf_reg / 4;
-               pin_reg = &info->pin_regs[pin_id];
+               pin_reg = &ipctl->pin_regs[pin_id];
                pin->pin = pin_id;
                grp->pins[i] = pin_id;
                pin_reg->mux_reg = mux_reg;
@@ -524,7 +522,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
                        pin->config = config & ~IMX_PAD_SION;
                }
 
-               dev_dbg(info->dev, "%s: 0x%x 0x%08lx", info->pins[pin_id].name,
+               dev_dbg(ipctl->dev, "%s: 0x%x 0x%08lx", info->pins[pin_id].name,
                                pin->mux_mode, pin->config);
        }
 
@@ -536,13 +534,12 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
                                       u32 index)
 {
        struct pinctrl_dev *pctl = ipctl->pctl;
-       struct imx_pinctrl_soc_info *info = ipctl->info;
        struct device_node *child;
        struct function_desc *func;
        struct group_desc *grp;
        u32 i = 0;
 
-       dev_dbg(info->dev, "parse function(%d): %s\n", index, np->name);
+       dev_dbg(pctl->dev, "parse function(%d): %s\n", index, np->name);
 
        func = pinmux_generic_get_function(pctl, index);
        if (!func)
@@ -552,10 +549,10 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
        func->name = np->name;
        func->num_group_names = of_get_child_count(np);
        if (func->num_group_names == 0) {
-               dev_err(info->dev, "no groups defined in %pOF\n", np);
+               dev_err(ipctl->dev, "no groups defined in %pOF\n", np);
                return -EINVAL;
        }
-       func->group_names = devm_kcalloc(info->dev, func->num_group_names,
+       func->group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
                                         sizeof(char *), GFP_KERNEL);
        if (!func->group_names)
                return -ENOMEM;
@@ -563,15 +560,15 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
        for_each_child_of_node(np, child) {
                func->group_names[i] = child->name;
 
-               grp = devm_kzalloc(info->dev, sizeof(struct group_desc),
+               grp = devm_kzalloc(ipctl->dev, sizeof(struct group_desc),
                                   GFP_KERNEL);
                if (!grp)
                        return -ENOMEM;
 
-               mutex_lock(&info->mutex);
+               mutex_lock(&ipctl->mutex);
                radix_tree_insert(&pctl->pin_group_tree,
-                                 info->group_index++, grp);
-               mutex_unlock(&info->mutex);
+                                 ipctl->group_index++, grp);
+               mutex_unlock(&ipctl->mutex);
 
                imx_pinctrl_parse_groups(child, grp, ipctl, i++);
        }
@@ -608,7 +605,6 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev,
        struct device_node *np = pdev->dev.of_node;
        struct device_node *child;
        struct pinctrl_dev *pctl = ipctl->pctl;
-       struct imx_pinctrl_soc_info *info = ipctl->info;
        u32 nfuncs = 0;
        u32 i = 0;
        bool flat_funcs;
@@ -635,13 +631,13 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev,
                if (!function)
                        return -ENOMEM;
 
-               mutex_lock(&info->mutex);
+               mutex_lock(&ipctl->mutex);
                radix_tree_insert(&pctl->pin_function_tree, i, function);
-               mutex_unlock(&info->mutex);
+               mutex_unlock(&ipctl->mutex);
        }
        pctl->num_functions = nfuncs;
 
-       info->group_index = 0;
+       ipctl->group_index = 0;
        if (flat_funcs) {
                pctl->num_groups = of_get_child_count(np);
        } else {
@@ -672,7 +668,7 @@ static void imx_free_resources(struct imx_pinctrl *ipctl)
 }
 
 int imx_pinctrl_probe(struct platform_device *pdev,
-                     struct imx_pinctrl_soc_info *info)
+                     const struct imx_pinctrl_soc_info *info)
 {
        struct regmap_config config = { .name = "gpr" };
        struct device_node *dev_np = pdev->dev.of_node;
@@ -687,7 +683,6 @@ int imx_pinctrl_probe(struct platform_device *pdev,
                dev_err(&pdev->dev, "wrong pinctrl info\n");
                return -EINVAL;
        }
-       info->dev = &pdev->dev;
 
        if (info->gpr_compatible) {
                gpr = syscon_regmap_lookup_by_compatible(info->gpr_compatible);
@@ -700,14 +695,14 @@ int imx_pinctrl_probe(struct platform_device *pdev,
        if (!ipctl)
                return -ENOMEM;
 
-       info->pin_regs = devm_kmalloc(&pdev->dev, sizeof(*info->pin_regs) *
+       ipctl->pin_regs = devm_kmalloc(&pdev->dev, sizeof(*ipctl->pin_regs) *
                                      info->npins, GFP_KERNEL);
-       if (!info->pin_regs)
+       if (!ipctl->pin_regs)
                return -ENOMEM;
 
        for (i = 0; i < info->npins; i++) {
-               info->pin_regs[i].mux_reg = -1;
-               info->pin_regs[i].conf_reg = -1;
+               ipctl->pin_regs[i].mux_reg = -1;
+               ipctl->pin_regs[i].conf_reg = -1;
        }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -751,10 +746,10 @@ int imx_pinctrl_probe(struct platform_device *pdev,
        /* platform specific callback */
        imx_pmx_ops.gpio_set_direction = info->gpio_set_direction;
 
-       mutex_init(&info->mutex);
+       mutex_init(&ipctl->mutex);
 
        ipctl->info = info;
-       ipctl->dev = info->dev;
+       ipctl->dev = &pdev->dev;
        platform_set_drvdata(pdev, ipctl);
        ret = devm_pinctrl_register_and_init(&pdev->dev,
                                             imx_pinctrl_desc, ipctl,
index 5aa22b52c1d4ac2d878a779ff2e3c94e10b5e88c..038e8c0e5b969a11fa2bd1d3aec62c5c319e4438 100644 (file)
@@ -58,14 +58,10 @@ struct imx_cfg_params_decode {
 };
 
 struct imx_pinctrl_soc_info {
-       struct device *dev;
        const struct pinctrl_pin_desc *pins;
        unsigned int npins;
-       struct imx_pin_reg *pin_regs;
-       unsigned int group_index;
        unsigned int flags;
        const char *gpr_compatible;
-       struct mutex mutex;
 
        /* MUX_MODE shift and mask in case SHARE_MUX_CONF_REG */
        unsigned int mux_mask;
@@ -75,7 +71,7 @@ struct imx_pinctrl_soc_info {
        bool generic_pinconf;
        const struct pinconf_generic_params *custom_params;
        unsigned int num_custom_params;
-       struct imx_cfg_params_decode *decodes;
+       const struct imx_cfg_params_decode *decodes;
        unsigned int num_decodes;
        void (*fixup)(unsigned long *configs, unsigned int num_configs,
                      u32 *raw_config);
@@ -95,7 +91,10 @@ struct imx_pinctrl {
        struct pinctrl_dev *pctl;
        void __iomem *base;
        void __iomem *input_sel_base;
-       struct imx_pinctrl_soc_info *info;
+       const struct imx_pinctrl_soc_info *info;
+       struct imx_pin_reg *pin_regs;
+       unsigned int group_index;
+       struct mutex mutex;
 };
 
 #define IMX_CFG_PARAMS_DECODE(p, m, o) \
@@ -117,5 +116,5 @@ struct imx_pinctrl {
 #define IOMUXC_CONFIG_SION     (0x1 << 4)
 
 int imx_pinctrl_probe(struct platform_device *pdev,
-                       struct imx_pinctrl_soc_info *info);
+                       const struct imx_pinctrl_soc_info *info);
 #endif /* __DRIVERS_PINCTRL_IMX_H */
index d7367fabe7123063564d474521453498f8288d83..db6d9d1382f979a624665b39f0cf8b6ab971e41c 100644 (file)
@@ -309,7 +309,7 @@ static const struct pinctrl_pin_desc imx25_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX25_PAD_BOOT_MODE1),
 };
 
-static struct imx_pinctrl_soc_info imx25_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx25_pinctrl_info = {
        .pins = imx25_pinctrl_pads,
        .npins = ARRAY_SIZE(imx25_pinctrl_pads),
 };
index 6315ba6af431dc4cf208e921b6b75107b51a5442..6927946ae4b59b39daa2b95212c3c6518ac7ee3a 100644 (file)
@@ -999,7 +999,7 @@ static const struct pinctrl_pin_desc imx35_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX35_PAD_TEST_MODE),
 };
 
-static struct imx_pinctrl_soc_info imx35_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx35_pinctrl_info = {
        .pins = imx35_pinctrl_pads,
        .npins = ARRAY_SIZE(imx35_pinctrl_pads),
 };
index 8e3a17df5c5da2a8220ae0cec87d81d1e162f400..eb349b97290f9a6dcdd6fedcd1d53dd133f44f65 100644 (file)
@@ -385,7 +385,7 @@ static const struct pinctrl_pin_desc imx50_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX50_PAD_EIM_CRE),
 };
 
-static struct imx_pinctrl_soc_info imx50_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx50_pinctrl_info = {
        .pins = imx50_pinctrl_pads,
        .npins = ARRAY_SIZE(imx50_pinctrl_pads),
        .gpr_compatible = "fsl,imx50-iomuxc-gpr",
index eeac64ba270934feb727702555477fefc0784f49..49acd991b5fb3037323bedb3f72485139d98fd6a 100644 (file)
@@ -762,7 +762,7 @@ static const struct pinctrl_pin_desc imx51_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX51_PAD_CSI1_MCLK),
 };
 
-static struct imx_pinctrl_soc_info imx51_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx51_pinctrl_info = {
        .pins = imx51_pinctrl_pads,
        .npins = ARRAY_SIZE(imx51_pinctrl_pads),
 };
index 46a9572f3473a763e5c7f3fcd06af22301effedb..6dd0c60eaea4dc83158e30100c13b4bb64b2e619 100644 (file)
@@ -448,7 +448,7 @@ static const struct pinctrl_pin_desc imx53_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX53_PAD_GPIO_18),
 };
 
-static struct imx_pinctrl_soc_info imx53_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx53_pinctrl_info = {
        .pins = imx53_pinctrl_pads,
        .npins = ARRAY_SIZE(imx53_pinctrl_pads),
        .gpr_compatible = "fsl,imx53-iomuxc-gpr",
index 3f25ca5867cc60c9fcad2342210001de35a1a7d1..91b85fc01de8be3f2bf894c0d6422195bbda49fb 100644 (file)
@@ -457,7 +457,7 @@ static const struct pinctrl_pin_desc imx6dl_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX6DL_PAD_SD4_DAT7),
 };
 
-static struct imx_pinctrl_soc_info imx6dl_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx6dl_pinctrl_info = {
        .pins = imx6dl_pinctrl_pads,
        .npins = ARRAY_SIZE(imx6dl_pinctrl_pads),
        .gpr_compatible = "fsl,imx6q-iomuxc-gpr",
index d61651c40458b8bbf1adc76285921918f9ab93df..5f653d69d0f51843f7406b267d42f26ac0a5dc5d 100644 (file)
@@ -460,7 +460,7 @@ static const struct pinctrl_pin_desc imx6q_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX6Q_PAD_SD2_DAT3),
 };
 
-static struct imx_pinctrl_soc_info imx6q_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx6q_pinctrl_info = {
        .pins = imx6q_pinctrl_pads,
        .npins = ARRAY_SIZE(imx6q_pinctrl_pads),
        .gpr_compatible = "fsl,imx6q-iomuxc-gpr",
index d023f6b006235ec2ffc803acc8158611b5b9de2b..1167dc273c045793247bed823ad1452b2a2a215f 100644 (file)
@@ -363,7 +363,7 @@ static const struct pinctrl_pin_desc imx6sl_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX6SL_PAD_WDOG_B),
 };
 
-static struct imx_pinctrl_soc_info imx6sl_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx6sl_pinctrl_info = {
        .pins = imx6sl_pinctrl_pads,
        .npins = ARRAY_SIZE(imx6sl_pinctrl_pads),
        .gpr_compatible = "fsl,imx6sl-iomuxc-gpr",
index 898b781701e64162e6d7bbe300dc2473aba7ea5d..15ea56c75f687daddb5d1265d67e7cb308363725 100644 (file)
@@ -367,7 +367,7 @@ static const struct pinctrl_pin_desc imx6sx_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX6SX_PAD_USB_H_STROBE),
 };
 
-static struct imx_pinctrl_soc_info imx6sx_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx6sx_pinctrl_info = {
        .pins = imx6sx_pinctrl_pads,
        .npins = ARRAY_SIZE(imx6sx_pinctrl_pads),
        .gpr_compatible = "fsl,imx6sx-iomuxc-gpr",
index 1aeb840aae1d88a4ec8a6ced72f51459d9cff955..4580717ade19f8f527a7ee294972f7a144c3ba22 100644 (file)
@@ -150,6 +150,21 @@ enum imx6ul_pads {
        MX6UL_PAD_CSI_DATA07 = 128,
 };
 
+enum imx6ull_lpsr_pads {
+       MX6ULL_PAD_BOOT_MODE0 = 0,
+       MX6ULL_PAD_BOOT_MODE1 = 1,
+       MX6ULL_PAD_SNVS_TAMPER0 = 2,
+       MX6ULL_PAD_SNVS_TAMPER1 = 3,
+       MX6ULL_PAD_SNVS_TAMPER2 = 4,
+       MX6ULL_PAD_SNVS_TAMPER3 = 5,
+       MX6ULL_PAD_SNVS_TAMPER4 = 6,
+       MX6ULL_PAD_SNVS_TAMPER5 = 7,
+       MX6ULL_PAD_SNVS_TAMPER6 = 8,
+       MX6ULL_PAD_SNVS_TAMPER7 = 9,
+       MX6ULL_PAD_SNVS_TAMPER8 = 10,
+       MX6ULL_PAD_SNVS_TAMPER9 = 11,
+};
+
 /* Pad names for the pinmux subsystem */
 static const struct pinctrl_pin_desc imx6ul_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX6UL_PAD_RESERVE0),
@@ -283,20 +298,49 @@ static const struct pinctrl_pin_desc imx6ul_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX6UL_PAD_CSI_DATA07),
 };
 
-static struct imx_pinctrl_soc_info imx6ul_pinctrl_info = {
+/* pad for i.MX6ULL lpsr pinmux */
+static const struct pinctrl_pin_desc imx6ull_snvs_pinctrl_pads[] = {
+       IMX_PINCTRL_PIN(MX6ULL_PAD_BOOT_MODE0),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_BOOT_MODE1),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER0),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER1),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER2),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER3),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER4),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER5),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER6),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER7),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER8),
+       IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER9),
+};
+
+static const struct imx_pinctrl_soc_info imx6ul_pinctrl_info = {
        .pins = imx6ul_pinctrl_pads,
        .npins = ARRAY_SIZE(imx6ul_pinctrl_pads),
        .gpr_compatible = "fsl,imx6ul-iomuxc-gpr",
 };
 
-static struct of_device_id imx6ul_pinctrl_of_match[] = {
-       { .compatible = "fsl,imx6ul-iomuxc", },
+static const struct imx_pinctrl_soc_info imx6ull_snvs_pinctrl_info = {
+       .pins = imx6ull_snvs_pinctrl_pads,
+       .npins = ARRAY_SIZE(imx6ull_snvs_pinctrl_pads),
+       .flags = ZERO_OFFSET_VALID,
+};
+
+static const struct of_device_id imx6ul_pinctrl_of_match[] = {
+       { .compatible = "fsl,imx6ul-iomuxc", .data = &imx6ul_pinctrl_info, },
+       { .compatible = "fsl,imx6ull-iomuxc-snvs", .data = &imx6ull_snvs_pinctrl_info, },
        { /* sentinel */ }
 };
 
 static int imx6ul_pinctrl_probe(struct platform_device *pdev)
 {
-       return imx_pinctrl_probe(pdev, &imx6ul_pinctrl_info);
+       const struct imx_pinctrl_soc_info *pinctrl_info;
+
+       pinctrl_info = of_device_get_match_data(&pdev->dev);
+       if (!pinctrl_info)
+               return -ENODEV;
+
+       return imx_pinctrl_probe(pdev, pinctrl_info);
 }
 
 static struct platform_driver imx6ul_pinctrl_driver = {
index 754159ee7b1e60bed5151858ccaa837123b1a8e5..0b0a2f33b06a969ff132236bb7afed0e6f8e337e 100644 (file)
@@ -378,16 +378,12 @@ static const struct of_device_id imx7d_pinctrl_of_match[] = {
 
 static int imx7d_pinctrl_probe(struct platform_device *pdev)
 {
-       const struct of_device_id *match;
-       struct imx_pinctrl_soc_info *pinctrl_info;
+       const struct imx_pinctrl_soc_info *pinctrl_info;
 
-       match = of_match_device(imx7d_pinctrl_of_match, &pdev->dev);
-
-       if (!match)
+       pinctrl_info = of_device_get_match_data(&pdev->dev);
+       if (!pinctrl_info)
                return -ENODEV;
 
-       pinctrl_info = (struct imx_pinctrl_soc_info *) match->data;
-
        return imx_pinctrl_probe(pdev, pinctrl_info);
 }
 
index b7bebb292f3757f9234ab631bc5f13ff0abdbabc..f363e45fd2465f6add5b57cb36178e7a8f80cff1 100644 (file)
@@ -266,7 +266,7 @@ static const struct pinctrl_pin_desc imx7ulp_pinctrl_pads[] = {
 #define BP_MUX_MODE            8
 #define BM_PULL_ENABLED                BIT(1)
 
-struct imx_cfg_params_decode imx7ulp_cfg_decodes[] = {
+static const struct imx_cfg_params_decode imx7ulp_cfg_decodes[] = {
        IMX_CFG_PARAMS_DECODE(PIN_CONFIG_DRIVE_STRENGTH,                BIT(6), 6),
        IMX_CFG_PARAMS_DECODE(PIN_CONFIG_DRIVE_PUSH_PULL,               BIT(5), 5),
        IMX_CFG_PARAMS_DECODE(PIN_CONFIG_SLEW_RATE,                     BIT(2), 2),
@@ -307,11 +307,10 @@ static int imx7ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
                                          unsigned offset, bool input)
 {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
-       struct imx_pinctrl_soc_info *info = ipctl->info;
        const struct imx_pin_reg *pin_reg;
        u32 reg;
 
-       pin_reg = &info->pin_regs[offset];
+       pin_reg = &ipctl->pin_regs[offset];
        if (pin_reg->mux_reg == -1)
                return -EINVAL;
 
@@ -325,7 +324,7 @@ static int imx7ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static struct imx_pinctrl_soc_info imx7ulp_pinctrl_info = {
+static const struct imx_pinctrl_soc_info imx7ulp_pinctrl_info = {
        .pins = imx7ulp_pinctrl_pads,
        .npins = ARRAY_SIZE(imx7ulp_pinctrl_pads),
        .flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG,
index ac18bb6d6d5ee60031d60090e79307fde441bf0d..c078f859ae15e7dcca2f93edce91672d96cb20f2 100644 (file)
@@ -300,11 +300,10 @@ static int vf610_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
                                        unsigned offset, bool input)
 {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
-       struct imx_pinctrl_soc_info *info = ipctl->info;
        const struct imx_pin_reg *pin_reg;
        u32 reg;
 
-       pin_reg = &info->pin_regs[offset];
+       pin_reg = &ipctl->pin_regs[offset];
        if (pin_reg->mux_reg == -1)
                return -EINVAL;
 
@@ -319,7 +318,7 @@ static int vf610_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static struct imx_pinctrl_soc_info vf610_pinctrl_info = {
+static const struct imx_pinctrl_soc_info vf610_pinctrl_info = {
        .pins = vf610_pinctrl_pads,
        .npins = ARRAY_SIZE(vf610_pinctrl_pads),
        .flags = SHARE_MUX_CONF_REG | ZERO_OFFSET_VALID,
index 9c1ca29c60b758c3f5273514b00786c468775128..6b52ea1440a6a09c163d8e2c79a8f592516b148a 100644 (file)
@@ -46,6 +46,9 @@
 #define BYT_TRIG_POS           BIT(25)
 #define BYT_TRIG_LVL           BIT(24)
 #define BYT_DEBOUNCE_EN                BIT(20)
+#define BYT_GLITCH_FILTER_EN   BIT(19)
+#define BYT_GLITCH_F_SLOW_CLK  BIT(17)
+#define BYT_GLITCH_F_FAST_CLK  BIT(16)
 #define BYT_PULL_STR_SHIFT     9
 #define BYT_PULL_STR_MASK      (3 << BYT_PULL_STR_SHIFT)
 #define BYT_PULL_STR_2K                (0 << BYT_PULL_STR_SHIFT)
@@ -1579,6 +1582,9 @@ static int byt_irq_type(struct irq_data *d, unsigned int type)
         */
        value &= ~(BYT_DIRECT_IRQ_EN | BYT_TRIG_POS | BYT_TRIG_NEG |
                   BYT_TRIG_LVL);
+       /* Enable glitch filtering */
+       value |= BYT_GLITCH_FILTER_EN | BYT_GLITCH_F_SLOW_CLK |
+                BYT_GLITCH_F_FAST_CLK;
 
        writel(value, reg);
 
index e130599be571d6a714f59fd138153a5b528367eb..6243e7d95e7e513b622d64dca95b20f360536b5b 100644 (file)
 #define CNL_HOSTSW_OWN 0x0b0
 #define CNL_GPI_IE     0x120
 
-#define CNL_GPP(r, s, e)                               \
+#define CNL_GPP(r, s, e, g)                            \
        {                                               \
                .reg_num = (r),                         \
                .base = (s),                            \
                .size = ((e) - (s) + 1),                \
+               .gpio_base = (g),                       \
        }
 
+#define CNL_NO_GPIO    -1
+
 #define CNL_COMMUNITY(b, s, e, g)                      \
        {                                               \
                .barno = (b),                           \
@@ -363,32 +366,32 @@ static const struct pinctrl_pin_desc cnlh_pins[] = {
 };
 
 static const struct intel_padgroup cnlh_community0_gpps[] = {
-       CNL_GPP(0, 0, 24),      /* GPP_A */
-       CNL_GPP(1, 25, 50),     /* GPP_B */
+       CNL_GPP(0, 0, 24, 0),                   /* GPP_A */
+       CNL_GPP(1, 25, 50, 32),                 /* GPP_B */
 };
 
 static const struct intel_padgroup cnlh_community1_gpps[] = {
-       CNL_GPP(0, 51, 74),     /* GPP_C */
-       CNL_GPP(1, 75, 98),     /* GPP_D */
-       CNL_GPP(2, 99, 106),    /* GPP_G */
-       CNL_GPP(3, 107, 114),   /* AZA */
-       CNL_GPP(4, 115, 146),   /* vGPIO_0 */
-       CNL_GPP(5, 147, 154),   /* vGPIO_1 */
+       CNL_GPP(0, 51, 74, 64),                 /* GPP_C */
+       CNL_GPP(1, 75, 98, 96),                 /* GPP_D */
+       CNL_GPP(2, 99, 106, 128),               /* GPP_G */
+       CNL_GPP(3, 107, 114, CNL_NO_GPIO),      /* AZA */
+       CNL_GPP(4, 115, 146, 160),              /* vGPIO_0 */
+       CNL_GPP(5, 147, 154, CNL_NO_GPIO),      /* vGPIO_1 */
 };
 
 static const struct intel_padgroup cnlh_community3_gpps[] = {
-       CNL_GPP(0, 155, 178),   /* GPP_K */
-       CNL_GPP(1, 179, 202),   /* GPP_H */
-       CNL_GPP(2, 203, 215),   /* GPP_E */
-       CNL_GPP(3, 216, 239),   /* GPP_F */
-       CNL_GPP(4, 240, 248),   /* SPI */
+       CNL_GPP(0, 155, 178, 192),              /* GPP_K */
+       CNL_GPP(1, 179, 202, 224),              /* GPP_H */
+       CNL_GPP(2, 203, 215, 258),              /* GPP_E */
+       CNL_GPP(3, 216, 239, 288),              /* GPP_F */
+       CNL_GPP(4, 240, 248, CNL_NO_GPIO),      /* SPI */
 };
 
 static const struct intel_padgroup cnlh_community4_gpps[] = {
-       CNL_GPP(0, 249, 259),   /* CPU */
-       CNL_GPP(1, 260, 268),   /* JTAG */
-       CNL_GPP(2, 269, 286),   /* GPP_I */
-       CNL_GPP(3, 287, 298),   /* GPP_J */
+       CNL_GPP(0, 249, 259, CNL_NO_GPIO),      /* CPU */
+       CNL_GPP(1, 260, 268, CNL_NO_GPIO),      /* JTAG */
+       CNL_GPP(2, 269, 286, 320),              /* GPP_I */
+       CNL_GPP(3, 287, 298, 352),              /* GPP_J */
 };
 
 static const unsigned int cnlh_spi0_pins[] = { 40, 41, 42, 43 };
@@ -785,25 +788,25 @@ static const struct intel_function cnllp_functions[] = {
 };
 
 static const struct intel_padgroup cnllp_community0_gpps[] = {
-       CNL_GPP(0, 0, 24),      /* GPP_A */
-       CNL_GPP(1, 25, 50),     /* GPP_B */
-       CNL_GPP(2, 51, 58),     /* GPP_G */
-       CNL_GPP(3, 59, 67),     /* SPI */
+       CNL_GPP(0, 0, 24, 0),                   /* GPP_A */
+       CNL_GPP(1, 25, 50, 32),                 /* GPP_B */
+       CNL_GPP(2, 51, 58, 64),                 /* GPP_G */
+       CNL_GPP(3, 59, 67, CNL_NO_GPIO),        /* SPI */
 };
 
 static const struct intel_padgroup cnllp_community1_gpps[] = {
-       CNL_GPP(0, 68, 92),     /* GPP_D */
-       CNL_GPP(1, 93, 116),    /* GPP_F */
-       CNL_GPP(2, 117, 140),   /* GPP_H */
-       CNL_GPP(3, 141, 172),   /* vGPIO */
-       CNL_GPP(4, 173, 180),   /* vGPIO */
+       CNL_GPP(0, 68, 92, 96),                 /* GPP_D */
+       CNL_GPP(1, 93, 116, 128),               /* GPP_F */
+       CNL_GPP(2, 117, 140, 160),              /* GPP_H */
+       CNL_GPP(3, 141, 172, 192),              /* vGPIO */
+       CNL_GPP(4, 173, 180, 224),              /* vGPIO */
 };
 
 static const struct intel_padgroup cnllp_community4_gpps[] = {
-       CNL_GPP(0, 181, 204),   /* GPP_C */
-       CNL_GPP(1, 205, 228),   /* GPP_E */
-       CNL_GPP(2, 229, 237),   /* JTAG */
-       CNL_GPP(3, 238, 243),   /* HVCMOS */
+       CNL_GPP(0, 181, 204, 256),              /* GPP_C */
+       CNL_GPP(1, 205, 228, 288),              /* GPP_E */
+       CNL_GPP(2, 229, 237, CNL_NO_GPIO),      /* JTAG */
+       CNL_GPP(3, 238, 243, CNL_NO_GPIO),      /* HVCMOS */
 };
 
 static const struct intel_community cnllp_communities[] = {
index 4471fd94e1fe1f48b953360ad76e638e88f1a7ff..b1ae1618fefea7cd14811b71e05823b70e4c614d 100644 (file)
@@ -131,10 +131,8 @@ struct chv_gpio_pinrange {
  * @ngroups: Number of groups
  * @functions: All functions in this community
  * @nfunctions: Number of functions
- * @ngpios: Number of GPIOs in this community
  * @gpio_ranges: An array of GPIO ranges in this community
  * @ngpio_ranges: Number of GPIO ranges
- * @ngpios: Total number of GPIOs in this community
  * @nirqs: Total number of IRQs this community can generate
  */
 struct chv_community {
@@ -147,7 +145,6 @@ struct chv_community {
        size_t nfunctions;
        const struct chv_gpio_pinrange *gpio_ranges;
        size_t ngpio_ranges;
-       size_t ngpios;
        size_t nirqs;
        acpi_adr_space_type acpi_space_id;
 };
@@ -399,7 +396,6 @@ static const struct chv_community southwest_community = {
        .nfunctions = ARRAY_SIZE(southwest_functions),
        .gpio_ranges = southwest_gpio_ranges,
        .ngpio_ranges = ARRAY_SIZE(southwest_gpio_ranges),
-       .ngpios = ARRAY_SIZE(southwest_pins),
        /*
         * Southwest community can benerate GPIO interrupts only for the
         * first 8 interrupts. The upper half (8-15) can only be used to
@@ -489,7 +485,6 @@ static const struct chv_community north_community = {
        .npins = ARRAY_SIZE(north_pins),
        .gpio_ranges = north_gpio_ranges,
        .ngpio_ranges = ARRAY_SIZE(north_gpio_ranges),
-       .ngpios = ARRAY_SIZE(north_pins),
        /*
         * North community can generate GPIO interrupts only for the first
         * 8 interrupts. The upper half (8-15) can only be used to trigger
@@ -538,7 +533,6 @@ static const struct chv_community east_community = {
        .npins = ARRAY_SIZE(east_pins),
        .gpio_ranges = east_gpio_ranges,
        .ngpio_ranges = ARRAY_SIZE(east_gpio_ranges),
-       .ngpios = ARRAY_SIZE(east_pins),
        .nirqs = 16,
        .acpi_space_id = 0x93,
 };
@@ -665,7 +659,6 @@ static const struct chv_community southeast_community = {
        .nfunctions = ARRAY_SIZE(southeast_functions),
        .gpio_ranges = southeast_gpio_ranges,
        .ngpio_ranges = ARRAY_SIZE(southeast_gpio_ranges),
-       .ngpios = ARRAY_SIZE(southeast_pins),
        .nirqs = 16,
        .acpi_space_id = 0x94,
 };
@@ -1253,21 +1246,14 @@ static struct pinctrl_desc chv_pinctrl_desc = {
        .owner = THIS_MODULE,
 };
 
-static unsigned chv_gpio_offset_to_pin(struct chv_pinctrl *pctrl,
-                                      unsigned offset)
-{
-       return pctrl->community->pins[offset].number;
-}
-
 static int chv_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
        struct chv_pinctrl *pctrl = gpiochip_get_data(chip);
-       int pin = chv_gpio_offset_to_pin(pctrl, offset);
        unsigned long flags;
        u32 ctrl0, cfg;
 
        raw_spin_lock_irqsave(&chv_lock, flags);
-       ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0));
+       ctrl0 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0));
        raw_spin_unlock_irqrestore(&chv_lock, flags);
 
        cfg = ctrl0 & CHV_PADCTRL0_GPIOCFG_MASK;
@@ -1281,14 +1267,13 @@ static int chv_gpio_get(struct gpio_chip *chip, unsigned offset)
 static void chv_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 {
        struct chv_pinctrl *pctrl = gpiochip_get_data(chip);
-       unsigned pin = chv_gpio_offset_to_pin(pctrl, offset);
        unsigned long flags;
        void __iomem *reg;
        u32 ctrl0;
 
        raw_spin_lock_irqsave(&chv_lock, flags);
 
-       reg = chv_padreg(pctrl, pin, CHV_PADCTRL0);
+       reg = chv_padreg(pctrl, offset, CHV_PADCTRL0);
        ctrl0 = readl(reg);
 
        if (value)
@@ -1304,12 +1289,11 @@ static void chv_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 static int chv_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 {
        struct chv_pinctrl *pctrl = gpiochip_get_data(chip);
-       unsigned pin = chv_gpio_offset_to_pin(pctrl, offset);
        u32 ctrl0, direction;
        unsigned long flags;
 
        raw_spin_lock_irqsave(&chv_lock, flags);
-       ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0));
+       ctrl0 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0));
        raw_spin_unlock_irqrestore(&chv_lock, flags);
 
        direction = ctrl0 & CHV_PADCTRL0_GPIOCFG_MASK;
@@ -1345,7 +1329,7 @@ static void chv_gpio_irq_ack(struct irq_data *d)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
-       int pin = chv_gpio_offset_to_pin(pctrl, irqd_to_hwirq(d));
+       int pin = irqd_to_hwirq(d);
        u32 intr_line;
 
        raw_spin_lock(&chv_lock);
@@ -1362,7 +1346,7 @@ static void chv_gpio_irq_mask_unmask(struct irq_data *d, bool mask)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
-       int pin = chv_gpio_offset_to_pin(pctrl, irqd_to_hwirq(d));
+       int pin = irqd_to_hwirq(d);
        u32 value, intr_line;
        unsigned long flags;
 
@@ -1407,8 +1391,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d)
        if (irqd_get_trigger_type(d) == IRQ_TYPE_NONE) {
                struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
                struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
-               unsigned offset = irqd_to_hwirq(d);
-               int pin = chv_gpio_offset_to_pin(pctrl, offset);
+               unsigned pin = irqd_to_hwirq(d);
                irq_flow_handler_t handler;
                unsigned long flags;
                u32 intsel, value;
@@ -1426,7 +1409,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d)
 
                if (!pctrl->intr_lines[intsel]) {
                        irq_set_handler_locked(d, handler);
-                       pctrl->intr_lines[intsel] = offset;
+                       pctrl->intr_lines[intsel] = pin;
                }
                raw_spin_unlock_irqrestore(&chv_lock, flags);
        }
@@ -1439,8 +1422,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
-       unsigned offset = irqd_to_hwirq(d);
-       int pin = chv_gpio_offset_to_pin(pctrl, offset);
+       unsigned pin = irqd_to_hwirq(d);
        unsigned long flags;
        u32 value;
 
@@ -1486,7 +1468,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type)
        value &= CHV_PADCTRL0_INTSEL_MASK;
        value >>= CHV_PADCTRL0_INTSEL_SHIFT;
 
-       pctrl->intr_lines[value] = offset;
+       pctrl->intr_lines[value] = pin;
 
        if (type & IRQ_TYPE_EDGE_BOTH)
                irq_set_handler_locked(d, handle_edge_irq);
@@ -1576,12 +1558,12 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq)
        const struct chv_gpio_pinrange *range;
        struct gpio_chip *chip = &pctrl->chip;
        bool need_valid_mask = !dmi_check_system(chv_no_valid_mask);
-       int ret, i, offset;
-       int irq_base;
+       const struct chv_community *community = pctrl->community;
+       int ret, i, irq_base;
 
        *chip = chv_gpio_chip;
 
-       chip->ngpio = pctrl->community->ngpios;
+       chip->ngpio = community->pins[community->npins - 1].number + 1;
        chip->label = dev_name(pctrl->dev);
        chip->parent = pctrl->dev;
        chip->base = -1;
@@ -1593,30 +1575,29 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq)
                return ret;
        }
 
-       for (i = 0, offset = 0; i < pctrl->community->ngpio_ranges; i++) {
-               range = &pctrl->community->gpio_ranges[i];
-               ret = gpiochip_add_pin_range(chip, dev_name(pctrl->dev), offset,
-                                            range->base, range->npins);
+       for (i = 0; i < community->ngpio_ranges; i++) {
+               range = &community->gpio_ranges[i];
+               ret = gpiochip_add_pin_range(chip, dev_name(pctrl->dev),
+                                            range->base, range->base,
+                                            range->npins);
                if (ret) {
                        dev_err(pctrl->dev, "failed to add GPIO pin range\n");
                        return ret;
                }
-
-               offset += range->npins;
        }
 
        /* Do not add GPIOs that can only generate GPEs to the IRQ domain */
-       for (i = 0; i < pctrl->community->npins; i++) {
+       for (i = 0; i < community->npins; i++) {
                const struct pinctrl_pin_desc *desc;
                u32 intsel;
 
-               desc = &pctrl->community->pins[i];
+               desc = &community->pins[i];
 
                intsel = readl(chv_padreg(pctrl, desc->number, CHV_PADCTRL0));
                intsel &= CHV_PADCTRL0_INTSEL_MASK;
                intsel >>= CHV_PADCTRL0_INTSEL_SHIFT;
 
-               if (need_valid_mask && intsel >= pctrl->community->nirqs)
+               if (need_valid_mask && intsel >= community->nirqs)
                        clear_bit(i, chip->irq.valid_mask);
        }
 
index 12a1af45acb98557de6184e934360dc056fbc01a..96e73e30204ee12eca4028055e2c8415f72fa301 100644 (file)
@@ -425,6 +425,18 @@ static void __intel_gpio_set_direction(void __iomem *padcfg0, bool input)
        writel(value, padcfg0);
 }
 
+static void intel_gpio_set_gpio_mode(void __iomem *padcfg0)
+{
+       u32 value;
+
+       /* Put the pad into GPIO mode */
+       value = readl(padcfg0) & ~PADCFG0_PMODE_MASK;
+       /* Disable SCI/SMI/NMI generation */
+       value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI);
+       value &= ~(PADCFG0_GPIROUTSMI | PADCFG0_GPIROUTNMI);
+       writel(value, padcfg0);
+}
+
 static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
                                     struct pinctrl_gpio_range *range,
                                     unsigned pin)
@@ -432,7 +444,6 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
        struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
        void __iomem *padcfg0;
        unsigned long flags;
-       u32 value;
 
        raw_spin_lock_irqsave(&pctrl->lock, flags);
 
@@ -442,13 +453,7 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
        }
 
        padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
-       /* Put the pad into GPIO mode */
-       value = readl(padcfg0) & ~PADCFG0_PMODE_MASK;
-       /* Disable SCI/SMI/NMI generation */
-       value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI);
-       value &= ~(PADCFG0_GPIROUTSMI | PADCFG0_GPIROUTNMI);
-       writel(value, padcfg0);
-
+       intel_gpio_set_gpio_mode(padcfg0);
        /* Disable TX buffer and enable RX (this will be input) */
        __intel_gpio_set_direction(padcfg0, true);
 
@@ -806,22 +811,63 @@ static const struct gpio_chip intel_gpio_chip = {
        .set_config = gpiochip_generic_config,
 };
 
+/**
+ * intel_gpio_to_pin() - Translate from GPIO offset to pin number
+ * @pctrl: Pinctrl structure
+ * @offset: GPIO offset from gpiolib
+ * @commmunity: Community is filled here if not %NULL
+ * @padgrp: Pad group is filled here if not %NULL
+ *
+ * When coming through gpiolib irqchip, the GPIO offset is not
+ * automatically translated to pinctrl pin number. This function can be
+ * used to find out the corresponding pinctrl pin.
+ */
+static int intel_gpio_to_pin(struct intel_pinctrl *pctrl, unsigned offset,
+                            const struct intel_community **community,
+                            const struct intel_padgroup **padgrp)
+{
+       int i;
+
+       for (i = 0; i < pctrl->ncommunities; i++) {
+               const struct intel_community *comm = &pctrl->communities[i];
+               int j;
+
+               for (j = 0; j < comm->ngpps; j++) {
+                       const struct intel_padgroup *pgrp = &comm->gpps[j];
+
+                       if (pgrp->gpio_base < 0)
+                               continue;
+
+                       if (offset >= pgrp->gpio_base &&
+                           offset < pgrp->gpio_base + pgrp->size) {
+                               int pin;
+
+                               pin = pgrp->base + offset - pgrp->gpio_base;
+                               if (community)
+                                       *community = comm;
+                               if (padgrp)
+                                       *padgrp = pgrp;
+
+                               return pin;
+                       }
+               }
+       }
+
+       return -EINVAL;
+}
+
 static void intel_gpio_irq_ack(struct irq_data *d)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
        const struct intel_community *community;
-       unsigned pin = irqd_to_hwirq(d);
+       const struct intel_padgroup *padgrp;
+       int pin;
 
-       community = intel_get_community(pctrl, pin);
-       if (community) {
-               const struct intel_padgroup *padgrp;
+       pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), &community, &padgrp);
+       if (pin >= 0) {
                unsigned gpp, gpp_offset, is_offset;
 
-               padgrp = intel_community_get_padgroup(community, pin);
-               if (!padgrp)
-                       return;
-
                gpp = padgrp->reg_num;
                gpp_offset = padgroup_offset(padgrp, pin);
                is_offset = community->is_offset + gpp * 4;
@@ -837,19 +883,15 @@ static void intel_gpio_irq_enable(struct irq_data *d)
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
        const struct intel_community *community;
-       unsigned pin = irqd_to_hwirq(d);
+       const struct intel_padgroup *padgrp;
+       int pin;
 
-       community = intel_get_community(pctrl, pin);
-       if (community) {
-               const struct intel_padgroup *padgrp;
+       pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), &community, &padgrp);
+       if (pin >= 0) {
                unsigned gpp, gpp_offset, is_offset;
                unsigned long flags;
                u32 value;
 
-               padgrp = intel_community_get_padgroup(community, pin);
-               if (!padgrp)
-                       return;
-
                gpp = padgrp->reg_num;
                gpp_offset = padgroup_offset(padgrp, pin);
                is_offset = community->is_offset + gpp * 4;
@@ -870,20 +912,16 @@ static void intel_gpio_irq_mask_unmask(struct irq_data *d, bool mask)
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
        const struct intel_community *community;
-       unsigned pin = irqd_to_hwirq(d);
+       const struct intel_padgroup *padgrp;
+       int pin;
 
-       community = intel_get_community(pctrl, pin);
-       if (community) {
-               const struct intel_padgroup *padgrp;
+       pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), &community, &padgrp);
+       if (pin >= 0) {
                unsigned gpp, gpp_offset;
                unsigned long flags;
                void __iomem *reg;
                u32 value;
 
-               padgrp = intel_community_get_padgroup(community, pin);
-               if (!padgrp)
-                       return;
-
                gpp = padgrp->reg_num;
                gpp_offset = padgroup_offset(padgrp, pin);
 
@@ -914,7 +952,7 @@ static int intel_gpio_irq_type(struct irq_data *d, unsigned type)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
-       unsigned pin = irqd_to_hwirq(d);
+       unsigned pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), NULL, NULL);
        unsigned long flags;
        void __iomem *reg;
        u32 value;
@@ -935,6 +973,8 @@ static int intel_gpio_irq_type(struct irq_data *d, unsigned type)
 
        raw_spin_lock_irqsave(&pctrl->lock, flags);
 
+       intel_gpio_set_gpio_mode(reg);
+
        value = readl(reg);
 
        value &= ~(PADCFG0_RXEVCFG_MASK | PADCFG0_RXINV);
@@ -969,7 +1009,7 @@ static int intel_gpio_irq_wake(struct irq_data *d, unsigned int on)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
-       unsigned pin = irqd_to_hwirq(d);
+       unsigned pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), NULL, NULL);
 
        if (on)
                enable_irq_wake(pctrl->irq);
@@ -1000,14 +1040,10 @@ static irqreturn_t intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
                pending &= enabled;
 
                for_each_set_bit(gpp_offset, &pending, padgrp->size) {
-                       unsigned padno, irq;
-
-                       padno = padgrp->base - community->pin_base + gpp_offset;
-                       if (padno >= community->npins)
-                               break;
+                       unsigned irq;
 
                        irq = irq_find_mapping(gc->irq.domain,
-                                              community->pin_base + padno);
+                                              padgrp->gpio_base + gpp_offset);
                        generic_handle_irq(irq);
 
                        ret |= IRQ_HANDLED;
@@ -1044,13 +1080,56 @@ static struct irq_chip intel_gpio_irqchip = {
        .flags = IRQCHIP_MASK_ON_SUSPEND,
 };
 
+static int intel_gpio_add_pin_ranges(struct intel_pinctrl *pctrl,
+                                    const struct intel_community *community)
+{
+       int ret = 0, i;
+
+       for (i = 0; i < community->ngpps; i++) {
+               const struct intel_padgroup *gpp = &community->gpps[i];
+
+               if (gpp->gpio_base < 0)
+                       continue;
+
+               ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
+                                            gpp->gpio_base, gpp->base,
+                                            gpp->size);
+               if (ret)
+                       return ret;
+       }
+
+       return ret;
+}
+
+static unsigned intel_gpio_ngpio(const struct intel_pinctrl *pctrl)
+{
+       const struct intel_community *community;
+       unsigned ngpio = 0;
+       int i, j;
+
+       for (i = 0; i < pctrl->ncommunities; i++) {
+               community = &pctrl->communities[i];
+               for (j = 0; j < community->ngpps; j++) {
+                       const struct intel_padgroup *gpp = &community->gpps[j];
+
+                       if (gpp->gpio_base < 0)
+                               continue;
+
+                       if (gpp->gpio_base + gpp->size > ngpio)
+                               ngpio = gpp->gpio_base + gpp->size;
+               }
+       }
+
+       return ngpio;
+}
+
 static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
 {
-       int ret;
+       int ret, i;
 
        pctrl->chip = intel_gpio_chip;
 
-       pctrl->chip.ngpio = pctrl->soc->npins;
+       pctrl->chip.ngpio = intel_gpio_ngpio(pctrl);
        pctrl->chip.label = dev_name(pctrl->dev);
        pctrl->chip.parent = pctrl->dev;
        pctrl->chip.base = -1;
@@ -1062,11 +1141,14 @@ static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
                return ret;
        }
 
-       ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
-                                    0, 0, pctrl->soc->npins);
-       if (ret) {
-               dev_err(pctrl->dev, "failed to add GPIO pin range\n");
-               return ret;
+       for (i = 0; i < pctrl->ncommunities; i++) {
+               struct intel_community *community = &pctrl->communities[i];
+
+               ret = intel_gpio_add_pin_ranges(pctrl, community);
+               if (ret) {
+                       dev_err(pctrl->dev, "failed to add GPIO pin range\n");
+                       return ret;
+               }
        }
 
        /*
@@ -1126,6 +1208,9 @@ static int intel_pinctrl_add_padgroups(struct intel_pinctrl *pctrl,
                if (gpps[i].size > 32)
                        return -EINVAL;
 
+               if (!gpps[i].gpio_base)
+                       gpps[i].gpio_base = gpps[i].base;
+
                gpps[i].padown_num = padown_num;
 
                /*
index 13b0bd6eb2a25441b1a29d9ff87931351f1125ce..98fdf9adf6236a1fcdebf1f24c26ced8aec65700 100644 (file)
@@ -51,6 +51,8 @@ struct intel_function {
  * @reg_num: GPI_IS register number
  * @base: Starting pin of this group
  * @size: Size of this group (maximum is 32).
+ * @gpio_base: Starting GPIO base of this group (%0 if matches with @base,
+ *            and %-1 if no GPIO mapping should be created)
  * @padown_num: PAD_OWN register number (assigned by the core driver)
  *
  * If pad groups of a community are not the same size, use this structure
@@ -60,6 +62,7 @@ struct intel_padgroup {
        unsigned reg_num;
        unsigned base;
        unsigned size;
+       int gpio_base;
        unsigned padown_num;
 };
 
index 86c4b3fab7b0ea8f0abfdf36e5a2b035e024ec66..d9357054d41d691c2b09924d727aab5ec524c687 100644 (file)
@@ -931,10 +931,17 @@ static int mrfld_pinctrl_probe(struct platform_device *pdev)
        return 0;
 }
 
+static const struct acpi_device_id mrfld_acpi_table[] = {
+       { "INTC1002" },
+       { }
+};
+MODULE_DEVICE_TABLE(acpi, mrfld_acpi_table);
+
 static struct platform_driver mrfld_pinctrl_driver = {
        .probe = mrfld_pinctrl_probe,
        .driver = {
                .name = "pinctrl-merrifield",
+               .acpi_match_table = mrfld_acpi_table,
        },
 };
 
index fac9866311f3c8f865e3528bae9d607473d5ba52..3e598740b3795bdbbe63d512d504dd6bd4e9c913 100644 (file)
@@ -1,4 +1,5 @@
-if ARCH_MEDIATEK || COMPILE_TEST
+menu "MediaTek pinctrl drivers"
+       depends on ARCH_MEDIATEK || COMPILE_TEST
 
 config PINCTRL_MTK
        bool
@@ -31,6 +32,16 @@ config PINCTRL_MT8127
        select PINCTRL_MTK
 
 # For ARMv8 SoCs
+config PINCTRL_MT7622
+       bool "MediaTek MT7622 pin control"
+       depends on OF
+       depends on ARM64 || COMPILE_TEST
+       select GENERIC_PINCONF
+       select GENERIC_PINCTRL_GROUPS
+       select GENERIC_PINMUX_FUNCTIONS
+       select GPIOLIB
+       select OF_GPIO
+
 config PINCTRL_MT8173
        bool "Mediatek MT8173 pin control"
        depends on OF
@@ -46,4 +57,4 @@ config PINCTRL_MT6397
        default MFD_MT6397
        select PINCTRL_MTK
 
-endif
+endmenu
index 10d90140a38a780d69e3f07d79e81c192e11a1cc..ed7d2b2cc6e952b94bca0969761485941254b8aa 100644 (file)
@@ -1,10 +1,11 @@
 # SPDX-License-Identifier: GPL-2.0
 # Core
-obj-y                          += pinctrl-mtk-common.o
+obj-$(CONFIG_PINCTRL_MTK)      += pinctrl-mtk-common.o
 
 # SoC Drivers
 obj-$(CONFIG_PINCTRL_MT2701)   += pinctrl-mt2701.o
 obj-$(CONFIG_PINCTRL_MT8135)   += pinctrl-mt8135.o
 obj-$(CONFIG_PINCTRL_MT8127)   += pinctrl-mt8127.o
+obj-$(CONFIG_PINCTRL_MT7622)   += pinctrl-mt7622.o
 obj-$(CONFIG_PINCTRL_MT8173)   += pinctrl-mt8173.o
 obj-$(CONFIG_PINCTRL_MT6397)   += pinctrl-mt6397.o
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7622.c b/drivers/pinctrl/mediatek/pinctrl-mt7622.c
new file mode 100644 (file)
index 0000000..06e8406
--- /dev/null
@@ -0,0 +1,1597 @@
+/*
+ * MediaTek MT7622 Pinctrl Driver
+ *
+ * Copyright (C) 2017 Sean Wang <sean.wang@mediatek.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/gpio.h>
+#include <linux/gpio/driver.h>
+#include <linux/io.h>
+#include <linux/init.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/pinctrl/pinconf-generic.h>
+#include <linux/regmap.h>
+
+#include "../core.h"
+#include "../pinconf.h"
+#include "../pinmux.h"
+
+#define PINCTRL_PINCTRL_DEV            KBUILD_MODNAME
+#define MTK_RANGE(_a)          { .range = (_a), .nranges = ARRAY_SIZE(_a), }
+#define PINCTRL_PIN_GROUP(name, id)                    \
+       {                                               \
+               name,                                   \
+               id##_pins,                              \
+               ARRAY_SIZE(id##_pins),                  \
+               id##_funcs,                             \
+       }
+
+#define MTK_GPIO_MODE  1
+#define MTK_INPUT      0
+#define MTK_OUTPUT     1
+#define MTK_DISABLE    0
+#define MTK_ENABLE     1
+
+/* Custom pinconf parameters */
+#define MTK_PIN_CONFIG_TDSEL   (PIN_CONFIG_END + 1)
+#define MTK_PIN_CONFIG_RDSEL   (PIN_CONFIG_END + 2)
+
+/* List these attributes which could be modified for the pin */
+enum {
+       PINCTRL_PIN_REG_MODE,
+       PINCTRL_PIN_REG_DIR,
+       PINCTRL_PIN_REG_DI,
+       PINCTRL_PIN_REG_DO,
+       PINCTRL_PIN_REG_SR,
+       PINCTRL_PIN_REG_SMT,
+       PINCTRL_PIN_REG_PD,
+       PINCTRL_PIN_REG_PU,
+       PINCTRL_PIN_REG_E4,
+       PINCTRL_PIN_REG_E8,
+       PINCTRL_PIN_REG_TDSEL,
+       PINCTRL_PIN_REG_RDSEL,
+       PINCTRL_PIN_REG_MAX,
+};
+
+/* struct mtk_pin_field - the structure that holds the information of the field
+ *                       used to describe the attribute for the pin
+ * @offset:            the register offset relative to the base address
+ * @mask:              the mask used to filter out the field from the register
+ * @bitpos:            the start bit relative to the register
+ * @next:              the indication that the field would be extended to the
+                       next register
+ */
+struct mtk_pin_field {
+       u32 offset;
+       u32 mask;
+       u8  bitpos;
+       u8  next;
+};
+
+/* struct mtk_pin_field_calc - the structure that holds the range providing
+ *                            the guide used to look up the relevant field
+ * @s_pin:             the start pin within the range
+ * @e_pin:             the end pin within the range
+ * @s_addr:            the start address for the range
+ * @x_addrs:           the address distance between two consecutive registers
+ *                     within the range
+ * @s_bit:             the start bit for the first register within the range
+ * @x_bits:            the bit distance between two consecutive pins within
+ *                     the range
+ */
+struct mtk_pin_field_calc {
+       u16 s_pin;
+       u16 e_pin;
+       u32 s_addr;
+       u8  x_addrs;
+       u8  s_bit;
+       u8  x_bits;
+};
+
+/* struct mtk_pin_reg_calc - the structure that holds all ranges used to
+ *                          determine which register the pin would make use of
+ *                          for certain pin attribute.
+ * @range:                  the start address for the range
+ * @nranges:                the number of items in the range
+ */
+struct mtk_pin_reg_calc {
+       const struct mtk_pin_field_calc *range;
+       unsigned int nranges;
+};
+
+/* struct mtk_pin_soc - the structure that holds SoC-specific data */
+struct mtk_pin_soc {
+       const struct mtk_pin_reg_calc   *reg_cal;
+       const struct pinctrl_pin_desc   *pins;
+       unsigned int                    npins;
+       const struct group_desc         *grps;
+       unsigned int                    ngrps;
+       const struct function_desc      *funcs;
+       unsigned int                    nfuncs;
+};
+
+struct mtk_pinctrl {
+       struct pinctrl_dev              *pctrl;
+       void __iomem                    *base;
+       struct device                   *dev;
+       struct gpio_chip                chip;
+       const struct mtk_pin_soc        *soc;
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_mode_range[] = {
+       {0, 0, 0x320, 0x10, 16, 4},
+       {1, 4, 0x3a0, 0x10,  16, 4},
+       {5, 5, 0x320, 0x10,  0, 4},
+       {6, 6, 0x300, 0x10,  4, 4},
+       {7, 7, 0x300, 0x10,  4, 4},
+       {8, 9, 0x350, 0x10,  20, 4},
+       {10, 10, 0x300, 0x10, 8, 4},
+       {11, 11, 0x300, 0x10, 8, 4},
+       {12, 12, 0x300, 0x10, 8, 4},
+       {13, 13, 0x300, 0x10, 8, 4},
+       {14, 15, 0x320, 0x10, 4, 4},
+       {16, 17, 0x320, 0x10, 20, 4},
+       {18, 21, 0x310, 0x10, 16, 4},
+       {22, 22, 0x380, 0x10, 16, 4},
+       {23, 23, 0x300, 0x10, 24, 4},
+       {24, 24, 0x300, 0x10, 24, 4},
+       {25, 25, 0x300, 0x10, 12, 4},
+       {25, 25, 0x300, 0x10, 12, 4},
+       {26, 26, 0x300, 0x10, 12, 4},
+       {27, 27, 0x300, 0x10, 12, 4},
+       {28, 28, 0x300, 0x10, 12, 4},
+       {29, 29, 0x300, 0x10, 12, 4},
+       {30, 30, 0x300, 0x10, 12, 4},
+       {31, 31, 0x300, 0x10, 12, 4},
+       {32, 32, 0x300, 0x10, 12, 4},
+       {33, 33, 0x300, 0x10, 12, 4},
+       {34, 34, 0x300, 0x10, 12, 4},
+       {35, 35, 0x300, 0x10, 12, 4},
+       {36, 36, 0x300, 0x10, 12, 4},
+       {37, 37, 0x300, 0x10, 20, 4},
+       {38, 38, 0x300, 0x10, 20, 4},
+       {39, 39, 0x300, 0x10, 20, 4},
+       {40, 40, 0x300, 0x10, 20, 4},
+       {41, 41, 0x300, 0x10, 20, 4},
+       {42, 42, 0x300, 0x10, 20, 4},
+       {43, 43, 0x300, 0x10, 20, 4},
+       {44, 44, 0x300, 0x10, 20, 4},
+       {45, 46, 0x300, 0x10, 20, 4},
+       {47, 47, 0x300, 0x10, 20, 4},
+       {48, 48, 0x300, 0x10, 20, 4},
+       {49, 49, 0x300, 0x10, 20, 4},
+       {50, 50, 0x300, 0x10, 20, 4},
+       {51, 70, 0x330, 0x10, 4, 4},
+       {71, 71, 0x300, 0x10, 16, 4},
+       {72, 72, 0x300, 0x10, 16, 4},
+       {73, 76, 0x310, 0x10, 0, 4},
+       {77, 77, 0x320, 0x10, 28, 4},
+       {78, 78, 0x320, 0x10, 12, 4},
+       {79, 82, 0x3a0, 0x10, 0, 4},
+       {83, 83, 0x350, 0x10, 28, 4},
+       {84, 84, 0x330, 0x10, 0, 4},
+       {85, 90, 0x360, 0x10, 4, 4},
+       {91, 94, 0x390, 0x10, 16, 4},
+       {95, 97, 0x380, 0x10, 20, 4},
+       {98, 101, 0x390, 0x10, 0, 4},
+       {102, 102, 0x360, 0x10, 0, 4},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_dir_range[] = {
+       {0, 102, 0x0, 0x10, 0, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_di_range[] = {
+       {0, 102, 0x200, 0x10, 0, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_do_range[] = {
+       {0, 102, 0x100, 0x10, 0, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_sr_range[] = {
+       {0, 31, 0x910, 0x10, 0, 1},
+       {32, 50, 0xa10, 0x10, 0, 1},
+       {51, 70, 0x810, 0x10, 0, 1},
+       {71, 72, 0xb10, 0x10, 0, 1},
+       {73, 86, 0xb10, 0x10, 4, 1},
+       {87, 90, 0xc10, 0x10, 0, 1},
+       {91, 102, 0xb10, 0x10, 18, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_smt_range[] = {
+       {0, 31, 0x920, 0x10, 0, 1},
+       {32, 50, 0xa20, 0x10, 0, 1},
+       {51, 70, 0x820, 0x10, 0, 1},
+       {71, 72, 0xb20, 0x10, 0, 1},
+       {73, 86, 0xb20, 0x10, 4, 1},
+       {87, 90, 0xc20, 0x10, 0, 1},
+       {91, 102, 0xb20, 0x10, 18, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_pu_range[] = {
+       {0, 31, 0x930, 0x10, 0, 1},
+       {32, 50, 0xa30, 0x10, 0, 1},
+       {51, 70, 0x830, 0x10, 0, 1},
+       {71, 72, 0xb30, 0x10, 0, 1},
+       {73, 86, 0xb30, 0x10, 4, 1},
+       {87, 90, 0xc30, 0x10, 0, 1},
+       {91, 102, 0xb30, 0x10, 18, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_pd_range[] = {
+       {0, 31, 0x940, 0x10, 0, 1},
+       {32, 50, 0xa40, 0x10, 0, 1},
+       {51, 70, 0x840, 0x10, 0, 1},
+       {71, 72, 0xb40, 0x10, 0, 1},
+       {73, 86, 0xb40, 0x10, 4, 1},
+       {87, 90, 0xc40, 0x10, 0, 1},
+       {91, 102, 0xb40, 0x10, 18, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_e4_range[] = {
+       {0, 31, 0x960, 0x10, 0, 1},
+       {32, 50, 0xa60, 0x10, 0, 1},
+       {51, 70, 0x860, 0x10, 0, 1},
+       {71, 72, 0xb60, 0x10, 0, 1},
+       {73, 86, 0xb60, 0x10, 4, 1},
+       {87, 90, 0xc60, 0x10, 0, 1},
+       {91, 102, 0xb60, 0x10, 18, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_e8_range[] = {
+       {0, 31, 0x970, 0x10, 0, 1},
+       {32, 50, 0xa70, 0x10, 0, 1},
+       {51, 70, 0x870, 0x10, 0, 1},
+       {71, 72, 0xb70, 0x10, 0, 1},
+       {73, 86, 0xb70, 0x10, 4, 1},
+       {87, 90, 0xc70, 0x10, 0, 1},
+       {91, 102, 0xb70, 0x10, 18, 1},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_tdsel_range[] = {
+       {0, 31, 0x980, 0x4, 0, 4},
+       {32, 50, 0xa80, 0x4, 0, 4},
+       {51, 70, 0x880, 0x4, 0, 4},
+       {71, 72, 0xb80, 0x4, 0, 4},
+       {73, 86, 0xb80, 0x4, 16, 4},
+       {87, 90, 0xc80, 0x4, 0, 4},
+       {91, 102, 0xb88, 0x4, 8, 4},
+};
+
+static const struct mtk_pin_field_calc mt7622_pin_rdsel_range[] = {
+       {0, 31, 0x990, 0x4, 0, 6},
+       {32, 50, 0xa90, 0x4, 0, 6},
+       {51, 58, 0x890, 0x4, 0, 6},
+       {59, 60, 0x894, 0x4, 28, 6},
+       {61, 62, 0x894, 0x4, 16, 6},
+       {63, 66, 0x898, 0x4, 8, 6},
+       {67, 68, 0x89c, 0x4, 12, 6},
+       {69, 70, 0x89c, 0x4, 0, 6},
+       {71, 72, 0xb90, 0x4, 0, 6},
+       {73, 86, 0xb90, 0x4, 24, 6},
+       {87, 90, 0xc90, 0x4, 0, 6},
+       {91, 102, 0xb9c, 0x4, 12, 6},
+};
+
+static const struct mtk_pin_reg_calc mt7622_reg_cals[PINCTRL_PIN_REG_MAX] = {
+       [PINCTRL_PIN_REG_MODE] = MTK_RANGE(mt7622_pin_mode_range),
+       [PINCTRL_PIN_REG_DIR] = MTK_RANGE(mt7622_pin_dir_range),
+       [PINCTRL_PIN_REG_DI] = MTK_RANGE(mt7622_pin_di_range),
+       [PINCTRL_PIN_REG_DO] = MTK_RANGE(mt7622_pin_do_range),
+       [PINCTRL_PIN_REG_SR] = MTK_RANGE(mt7622_pin_sr_range),
+       [PINCTRL_PIN_REG_SMT] = MTK_RANGE(mt7622_pin_smt_range),
+       [PINCTRL_PIN_REG_PU] = MTK_RANGE(mt7622_pin_pu_range),
+       [PINCTRL_PIN_REG_PD] = MTK_RANGE(mt7622_pin_pd_range),
+       [PINCTRL_PIN_REG_E4] = MTK_RANGE(mt7622_pin_e4_range),
+       [PINCTRL_PIN_REG_E8] = MTK_RANGE(mt7622_pin_e8_range),
+       [PINCTRL_PIN_REG_TDSEL] = MTK_RANGE(mt7622_pin_tdsel_range),
+       [PINCTRL_PIN_REG_RDSEL] = MTK_RANGE(mt7622_pin_rdsel_range),
+};
+
+static const struct pinctrl_pin_desc mt7622_pins[] = {
+       PINCTRL_PIN(0, "GPIO_A"),
+       PINCTRL_PIN(1, "I2S1_IN"),
+       PINCTRL_PIN(2, "I2S1_OUT"),
+       PINCTRL_PIN(3, "I2S_BCLK"),
+       PINCTRL_PIN(4, "I2S_WS"),
+       PINCTRL_PIN(5, "I2S_MCLK"),
+       PINCTRL_PIN(6, "TXD0"),
+       PINCTRL_PIN(7, "RXD0"),
+       PINCTRL_PIN(8, "SPI_WP"),
+       PINCTRL_PIN(9, "SPI_HOLD"),
+       PINCTRL_PIN(10, "SPI_CLK"),
+       PINCTRL_PIN(11, "SPI_MOSI"),
+       PINCTRL_PIN(12, "SPI_MISO"),
+       PINCTRL_PIN(13, "SPI_CS"),
+       PINCTRL_PIN(14, "I2C_SDA"),
+       PINCTRL_PIN(15, "I2C_SCL"),
+       PINCTRL_PIN(16, "I2S2_IN"),
+       PINCTRL_PIN(17, "I2S3_IN"),
+       PINCTRL_PIN(18, "I2S4_IN"),
+       PINCTRL_PIN(19, "I2S2_OUT"),
+       PINCTRL_PIN(20, "I2S3_OUT"),
+       PINCTRL_PIN(21, "I2S4_OUT"),
+       PINCTRL_PIN(22, "GPIO_B"),
+       PINCTRL_PIN(23, "MDC"),
+       PINCTRL_PIN(24, "MDIO"),
+       PINCTRL_PIN(25, "G2_TXD0"),
+       PINCTRL_PIN(26, "G2_TXD1"),
+       PINCTRL_PIN(27, "G2_TXD2"),
+       PINCTRL_PIN(28, "G2_TXD3"),
+       PINCTRL_PIN(29, "G2_TXEN"),
+       PINCTRL_PIN(30, "G2_TXC"),
+       PINCTRL_PIN(31, "G2_RXD0"),
+       PINCTRL_PIN(32, "G2_RXD1"),
+       PINCTRL_PIN(33, "G2_RXD2"),
+       PINCTRL_PIN(34, "G2_RXD3"),
+       PINCTRL_PIN(35, "G2_RXDV"),
+       PINCTRL_PIN(36, "G2_RXC"),
+       PINCTRL_PIN(37, "NCEB"),
+       PINCTRL_PIN(38, "NWEB"),
+       PINCTRL_PIN(39, "NREB"),
+       PINCTRL_PIN(40, "NDL4"),
+       PINCTRL_PIN(41, "NDL5"),
+       PINCTRL_PIN(42, "NDL6"),
+       PINCTRL_PIN(43, "NDL7"),
+       PINCTRL_PIN(44, "NRB"),
+       PINCTRL_PIN(45, "NCLE"),
+       PINCTRL_PIN(46, "NALE"),
+       PINCTRL_PIN(47, "NDL0"),
+       PINCTRL_PIN(48, "NDL1"),
+       PINCTRL_PIN(49, "NDL2"),
+       PINCTRL_PIN(50, "NDL3"),
+       PINCTRL_PIN(51, "MDI_TP_P0"),
+       PINCTRL_PIN(52, "MDI_TN_P0"),
+       PINCTRL_PIN(53, "MDI_RP_P0"),
+       PINCTRL_PIN(54, "MDI_RN_P0"),
+       PINCTRL_PIN(55, "MDI_TP_P1"),
+       PINCTRL_PIN(56, "MDI_TN_P1"),
+       PINCTRL_PIN(57, "MDI_RP_P1"),
+       PINCTRL_PIN(58, "MDI_RN_P1"),
+       PINCTRL_PIN(59, "MDI_RP_P2"),
+       PINCTRL_PIN(60, "MDI_RN_P2"),
+       PINCTRL_PIN(61, "MDI_TP_P2"),
+       PINCTRL_PIN(62, "MDI_TN_P2"),
+       PINCTRL_PIN(63, "MDI_TP_P3"),
+       PINCTRL_PIN(64, "MDI_TN_P3"),
+       PINCTRL_PIN(65, "MDI_RP_P3"),
+       PINCTRL_PIN(66, "MDI_RN_P3"),
+       PINCTRL_PIN(67, "MDI_RP_P4"),
+       PINCTRL_PIN(68, "MDI_RN_P4"),
+       PINCTRL_PIN(69, "MDI_TP_P4"),
+       PINCTRL_PIN(70, "MDI_TN_P4"),
+       PINCTRL_PIN(71, "PMIC_SCL"),
+       PINCTRL_PIN(72, "PMIC_SDA"),
+       PINCTRL_PIN(73, "SPIC1_CLK"),
+       PINCTRL_PIN(74, "SPIC1_MOSI"),
+       PINCTRL_PIN(75, "SPIC1_MISO"),
+       PINCTRL_PIN(76, "SPIC1_CS"),
+       PINCTRL_PIN(77, "GPIO_D"),
+       PINCTRL_PIN(78, "WATCHDOG"),
+       PINCTRL_PIN(79, "RTS3_N"),
+       PINCTRL_PIN(80, "CTS3_N"),
+       PINCTRL_PIN(81, "TXD3"),
+       PINCTRL_PIN(82, "RXD3"),
+       PINCTRL_PIN(83, "PERST0_N"),
+       PINCTRL_PIN(84, "PERST1_N"),
+       PINCTRL_PIN(85, "WLED_N"),
+       PINCTRL_PIN(86, "EPHY_LED0_N"),
+       PINCTRL_PIN(87, "AUXIN0"),
+       PINCTRL_PIN(88, "AUXIN1"),
+       PINCTRL_PIN(89, "AUXIN2"),
+       PINCTRL_PIN(90, "AUXIN3"),
+       PINCTRL_PIN(91, "TXD4"),
+       PINCTRL_PIN(92, "RXD4"),
+       PINCTRL_PIN(93, "RTS4_N"),
+       PINCTRL_PIN(94, "CTS4_N"),
+       PINCTRL_PIN(95, "PWM1"),
+       PINCTRL_PIN(96, "PWM2"),
+       PINCTRL_PIN(97, "PWM3"),
+       PINCTRL_PIN(98, "PWM4"),
+       PINCTRL_PIN(99, "PWM5"),
+       PINCTRL_PIN(100, "PWM6"),
+       PINCTRL_PIN(101, "PWM7"),
+       PINCTRL_PIN(102, "GPIO_E"),
+};
+
+/* List all groups consisting of these pins dedicated to the enablement of
+ * certain hardware block and the corresponding mode for all of the pins. The
+ * hardware probably has multiple combinations of these pinouts.
+ */
+
+/* EMMC */
+static int mt7622_emmc_pins[] = { 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, };
+static int mt7622_emmc_funcs[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, };
+
+static int mt7622_emmc_rst_pins[] = { 37, };
+static int mt7622_emmc_rst_funcs[] = { 1, };
+
+/* LED for EPHY */
+static int mt7622_ephy_leds_pins[] = { 86, 91, 92, 93, 94, };
+static int mt7622_ephy_leds_funcs[] = { 0, 0, 0, 0, 0, };
+static int mt7622_ephy0_led_pins[] = { 86, };
+static int mt7622_ephy0_led_funcs[] = { 0, };
+static int mt7622_ephy1_led_pins[] = { 91, };
+static int mt7622_ephy1_led_funcs[] = { 2, };
+static int mt7622_ephy2_led_pins[] = { 92, };
+static int mt7622_ephy2_led_funcs[] = { 2, };
+static int mt7622_ephy3_led_pins[] = { 93, };
+static int mt7622_ephy3_led_funcs[] = { 2, };
+static int mt7622_ephy4_led_pins[] = { 94, };
+static int mt7622_ephy4_led_funcs[] = { 2, };
+
+/* Embedded Switch */
+static int mt7622_esw_pins[] = { 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+                                62, 63, 64, 65, 66, 67, 68, 69, 70, };
+static int mt7622_esw_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                                 0, 0, 0, 0, 0, 0, 0, 0, 0, };
+static int mt7622_esw_p0_p1_pins[] = { 51, 52, 53, 54, 55, 56, 57, 58, };
+static int mt7622_esw_p0_p1_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
+static int mt7622_esw_p2_p3_p4_pins[] = { 59, 60, 61, 62, 63, 64, 65, 66, 67,
+                                         68, 69, 70, };
+static int mt7622_esw_p2_p3_p4_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                                          0, 0, 0, };
+/* RGMII via ESW */
+static int mt7622_rgmii_via_esw_pins[] = { 59, 60, 61, 62, 63, 64, 65, 66,
+                                          67, 68, 69, 70, };
+static int mt7622_rgmii_via_esw_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                                           0, };
+
+/* RGMII via GMAC1 */
+static int mt7622_rgmii_via_gmac1_pins[] = { 59, 60, 61, 62, 63, 64, 65, 66,
+                                            67, 68, 69, 70, };
+static int mt7622_rgmii_via_gmac1_funcs[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+                                             2, };
+
+/* RGMII via GMAC2 */
+static int mt7622_rgmii_via_gmac2_pins[] = { 25, 26, 27, 28, 29, 30, 31, 32,
+                                            33, 34, 35, 36, };
+static int mt7622_rgmii_via_gmac2_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                                             0, };
+
+/* I2C */
+static int mt7622_i2c0_pins[] = { 14, 15, };
+static int mt7622_i2c0_funcs[] = { 0, 0, };
+static int mt7622_i2c1_0_pins[] = { 55, 56, };
+static int mt7622_i2c1_0_funcs[] = { 0, 0, };
+static int mt7622_i2c1_1_pins[] = { 73, 74, };
+static int mt7622_i2c1_1_funcs[] = { 3, 3, };
+static int mt7622_i2c1_2_pins[] = { 87, 88, };
+static int mt7622_i2c1_2_funcs[] = { 0, 0, };
+static int mt7622_i2c2_0_pins[] = { 57, 58, };
+static int mt7622_i2c2_0_funcs[] = { 0, 0, };
+static int mt7622_i2c2_1_pins[] = { 75, 76, };
+static int mt7622_i2c2_1_funcs[] = { 3, 3, };
+static int mt7622_i2c2_2_pins[] = { 89, 90, };
+static int mt7622_i2c2_2_funcs[] = { 0, 0, };
+
+/* I2S */
+static int mt7622_i2s_in_mclk_bclk_ws_pins[] = { 3, 4, 5, };
+static int mt7622_i2s_in_mclk_bclk_ws_funcs[] = { 3, 3, 0, };
+static int mt7622_i2s1_in_data_pins[] = { 1, };
+static int mt7622_i2s1_in_data_funcs[] = { 0, };
+static int mt7622_i2s2_in_data_pins[] = { 16, };
+static int mt7622_i2s2_in_data_funcs[] = { 0, };
+static int mt7622_i2s3_in_data_pins[] = { 17, };
+static int mt7622_i2s3_in_data_funcs[] = { 0, };
+static int mt7622_i2s4_in_data_pins[] = { 18, };
+static int mt7622_i2s4_in_data_funcs[] = { 0, };
+static int mt7622_i2s_out_mclk_bclk_ws_pins[] = { 3, 4, 5, };
+static int mt7622_i2s_out_mclk_bclk_ws_funcs[] = { 0, 0, 0, };
+static int mt7622_i2s1_out_data_pins[] = { 2, };
+static int mt7622_i2s1_out_data_funcs[] = { 0, };
+static int mt7622_i2s2_out_data_pins[] = { 19, };
+static int mt7622_i2s2_out_data_funcs[] = { 0, };
+static int mt7622_i2s3_out_data_pins[] = { 20, };
+static int mt7622_i2s3_out_data_funcs[] = { 0, };
+static int mt7622_i2s4_out_data_pins[] = { 21, };
+static int mt7622_i2s4_out_data_funcs[] = { 0, };
+
+/* IR */
+static int mt7622_ir_0_tx_pins[] = { 16, };
+static int mt7622_ir_0_tx_funcs[] = { 4, };
+static int mt7622_ir_1_tx_pins[] = { 59, };
+static int mt7622_ir_1_tx_funcs[] = { 5, };
+static int mt7622_ir_2_tx_pins[] = { 99, };
+static int mt7622_ir_2_tx_funcs[] = { 3, };
+static int mt7622_ir_0_rx_pins[] = { 17, };
+static int mt7622_ir_0_rx_funcs[] = { 4, };
+static int mt7622_ir_1_rx_pins[] = { 60, };
+static int mt7622_ir_1_rx_funcs[] = { 5, };
+static int mt7622_ir_2_rx_pins[] = { 100, };
+static int mt7622_ir_2_rx_funcs[] = { 3, };
+
+/* MDIO */
+static int mt7622_mdc_mdio_pins[] = { 23, 24, };
+static int mt7622_mdc_mdio_funcs[] = { 0, 0, };
+
+/* PCIE */
+static int mt7622_pcie0_0_waken_pins[] = { 14, };
+static int mt7622_pcie0_0_waken_funcs[] = { 2, };
+static int mt7622_pcie0_0_clkreq_pins[] = { 15, };
+static int mt7622_pcie0_0_clkreq_funcs[] = { 2, };
+static int mt7622_pcie0_1_waken_pins[] = { 79, };
+static int mt7622_pcie0_1_waken_funcs[] = { 4, };
+static int mt7622_pcie0_1_clkreq_pins[] = { 80, };
+static int mt7622_pcie0_1_clkreq_funcs[] = { 4, };
+static int mt7622_pcie1_0_waken_pins[] = { 14, };
+static int mt7622_pcie1_0_waken_funcs[] = { 3, };
+static int mt7622_pcie1_0_clkreq_pins[] = { 15, };
+static int mt7622_pcie1_0_clkreq_funcs[] = { 3, };
+
+static int mt7622_pcie0_pad_perst_pins[] = { 83, };
+static int mt7622_pcie0_pad_perst_funcs[] = { 0, };
+static int mt7622_pcie1_pad_perst_pins[] = { 84, };
+static int mt7622_pcie1_pad_perst_funcs[] = { 0, };
+
+/* PMIC bus */
+static int mt7622_pmic_bus_pins[] = { 71, 72, };
+static int mt7622_pmic_bus_funcs[] = { 0, 0, };
+
+/* Parallel NAND */
+static int mt7622_pnand_pins[] = { 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+                                  48, 49, 50, };
+static int mt7622_pnand_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                                   0, };
+
+/* PWM */
+static int mt7622_pwm_ch1_0_pins[] = { 51, };
+static int mt7622_pwm_ch1_0_funcs[] = { 3, };
+static int mt7622_pwm_ch1_1_pins[] = { 73, };
+static int mt7622_pwm_ch1_1_funcs[] = { 4, };
+static int mt7622_pwm_ch1_2_pins[] = { 95, };
+static int mt7622_pwm_ch1_2_funcs[] = { 0, };
+static int mt7622_pwm_ch2_0_pins[] = { 52, };
+static int mt7622_pwm_ch2_0_funcs[] = { 3, };
+static int mt7622_pwm_ch2_1_pins[] = { 74, };
+static int mt7622_pwm_ch2_1_funcs[] = { 4, };
+static int mt7622_pwm_ch2_2_pins[] = { 96, };
+static int mt7622_pwm_ch2_2_funcs[] = { 0, };
+static int mt7622_pwm_ch3_0_pins[] = { 53, };
+static int mt7622_pwm_ch3_0_funcs[] = { 3, };
+static int mt7622_pwm_ch3_1_pins[] = { 75, };
+static int mt7622_pwm_ch3_1_funcs[] = { 4, };
+static int mt7622_pwm_ch3_2_pins[] = { 97, };
+static int mt7622_pwm_ch3_2_funcs[] = { 0, };
+static int mt7622_pwm_ch4_0_pins[] = { 54, };
+static int mt7622_pwm_ch4_0_funcs[] = { 3, };
+static int mt7622_pwm_ch4_1_pins[] = { 67, };
+static int mt7622_pwm_ch4_1_funcs[] = { 3, };
+static int mt7622_pwm_ch4_2_pins[] = { 76, };
+static int mt7622_pwm_ch4_2_funcs[] = { 4, };
+static int mt7622_pwm_ch4_3_pins[] = { 98, };
+static int mt7622_pwm_ch4_3_funcs[] = { 0, };
+static int mt7622_pwm_ch5_0_pins[] = { 68, };
+static int mt7622_pwm_ch5_0_funcs[] = { 3, };
+static int mt7622_pwm_ch5_1_pins[] = { 77, };
+static int mt7622_pwm_ch5_1_funcs[] = { 4, };
+static int mt7622_pwm_ch5_2_pins[] = { 99, };
+static int mt7622_pwm_ch5_2_funcs[] = { 0, };
+static int mt7622_pwm_ch6_0_pins[] = { 69, };
+static int mt7622_pwm_ch6_0_funcs[] = { 3, };
+static int mt7622_pwm_ch6_1_pins[] = { 78, };
+static int mt7622_pwm_ch6_1_funcs[] = { 4, };
+static int mt7622_pwm_ch6_2_pins[] = { 81, };
+static int mt7622_pwm_ch6_2_funcs[] = { 4, };
+static int mt7622_pwm_ch6_3_pins[] = { 100, };
+static int mt7622_pwm_ch6_3_funcs[] = { 0, };
+static int mt7622_pwm_ch7_0_pins[] = { 70, };
+static int mt7622_pwm_ch7_0_funcs[] = { 3, };
+static int mt7622_pwm_ch7_1_pins[] = { 82, };
+static int mt7622_pwm_ch7_1_funcs[] = { 4, };
+static int mt7622_pwm_ch7_2_pins[] = { 101, };
+static int mt7622_pwm_ch7_2_funcs[] = { 0, };
+
+/* SD */
+static int mt7622_sd_0_pins[] = { 16, 17, 18, 19, 20, 21, };
+static int mt7622_sd_0_funcs[] = { 2, 2, 2, 2, 2, 2, };
+static int mt7622_sd_1_pins[] = { 25, 26, 27, 28, 29, 30, };
+static int mt7622_sd_1_funcs[] = { 2, 2, 2, 2, 2, 2, };
+
+/* Serial NAND */
+static int mt7622_snfi_pins[] = { 8, 9, 10, 11, 12, 13, };
+static int mt7622_snfi_funcs[] = { 2, 2, 2, 2, 2, 2, };
+
+/* SPI NOR */
+static int mt7622_spi_pins[] = { 8, 9, 10, 11, 12, 13 };
+static int mt7622_spi_funcs[] = { 0, 0, 0, 0, 0, 0, };
+
+/* SPIC */
+static int mt7622_spic0_0_pins[] = { 63, 64, 65, 66, };
+static int mt7622_spic0_0_funcs[] = { 4, 4, 4, 4, };
+static int mt7622_spic0_1_pins[] = { 79, 80, 81, 82, };
+static int mt7622_spic0_1_funcs[] = { 3, 3, 3, 3, };
+static int mt7622_spic1_0_pins[] = { 67, 68, 69, 70, };
+static int mt7622_spic1_0_funcs[] = { 4, 4, 4, 4, };
+static int mt7622_spic1_1_pins[] = { 73, 74, 75, 76, };
+static int mt7622_spic1_1_funcs[] = { 0, 0, 0, 0, };
+static int mt7622_spic2_0_pins[] = { 10, 11, 12, 13, };
+static int mt7622_spic2_0_funcs[] = { 0, 0, 0, 0, };
+static int mt7622_spic2_0_wp_hold_pins[] = { 8, 9, };
+static int mt7622_spic2_0_wp_hold_funcs[] = { 0, 0, };
+
+/* TDM */
+static int mt7622_tdm_0_out_mclk_bclk_ws_pins[] = { 8, 9, 10, };
+static int mt7622_tdm_0_out_mclk_bclk_ws_funcs[] = { 3, 3, 3, };
+static int mt7622_tdm_0_in_mclk_bclk_ws_pins[] = { 11, 12, 13, };
+static int mt7622_tdm_0_in_mclk_bclk_ws_funcs[] = { 3, 3, 3, };
+static int mt7622_tdm_0_out_data_pins[] = { 20, };
+static int mt7622_tdm_0_out_data_funcs[] = { 3, };
+static int mt7622_tdm_0_in_data_pins[] = { 21, };
+static int mt7622_tdm_0_in_data_funcs[] = { 3, };
+static int mt7622_tdm_1_out_mclk_bclk_ws_pins[] = { 57, 58, 59, };
+static int mt7622_tdm_1_out_mclk_bclk_ws_funcs[] = { 3, 3, 3, };
+static int mt7622_tdm_1_in_mclk_bclk_ws_pins[] = { 60, 61, 62, };
+static int mt7622_tdm_1_in_mclk_bclk_ws_funcs[] = { 3, 3, 3, };
+static int mt7622_tdm_1_out_data_pins[] = { 55, };
+static int mt7622_tdm_1_out_data_funcs[] = { 3, };
+static int mt7622_tdm_1_in_data_pins[] = { 56, };
+static int mt7622_tdm_1_in_data_funcs[] = { 3, };
+
+/* UART */
+static int mt7622_uart0_0_tx_rx_pins[] = { 6, 7, };
+static int mt7622_uart0_0_tx_rx_funcs[] = { 0, 0, };
+static int mt7622_uart1_0_tx_rx_pins[] = { 55, 56, };
+static int mt7622_uart1_0_tx_rx_funcs[] = { 2, 2, };
+static int mt7622_uart1_0_rts_cts_pins[] = { 57, 58, };
+static int mt7622_uart1_0_rts_cts_funcs[] = { 2, 2, };
+static int mt7622_uart1_1_tx_rx_pins[] = { 73, 74, };
+static int mt7622_uart1_1_tx_rx_funcs[] = { 2, 2, };
+static int mt7622_uart1_1_rts_cts_pins[] = { 75, 76, };
+static int mt7622_uart1_1_rts_cts_funcs[] = { 2, 2, };
+static int mt7622_uart2_0_tx_rx_pins[] = { 3, 4, };
+static int mt7622_uart2_0_tx_rx_funcs[] = { 2, 2, };
+static int mt7622_uart2_0_rts_cts_pins[] = { 1, 2, };
+static int mt7622_uart2_0_rts_cts_funcs[] = { 2, 2, };
+static int mt7622_uart2_1_tx_rx_pins[] = { 51, 52, };
+static int mt7622_uart2_1_tx_rx_funcs[] = { 0, 0, };
+static int mt7622_uart2_1_rts_cts_pins[] = { 53, 54, };
+static int mt7622_uart2_1_rts_cts_funcs[] = { 0, 0, };
+static int mt7622_uart2_2_tx_rx_pins[] = { 59, 60, };
+static int mt7622_uart2_2_tx_rx_funcs[] = { 4, 4, };
+static int mt7622_uart2_2_rts_cts_pins[] = { 61, 62, };
+static int mt7622_uart2_2_rts_cts_funcs[] = { 4, 4, };
+static int mt7622_uart2_3_tx_rx_pins[] = { 95, 96, };
+static int mt7622_uart2_3_tx_rx_funcs[] = { 3, 3, };
+static int mt7622_uart3_0_tx_rx_pins[] = { 57, 58, };
+static int mt7622_uart3_0_tx_rx_funcs[] = { 5, 5, };
+static int mt7622_uart3_1_tx_rx_pins[] = { 81, 82, };
+static int mt7622_uart3_1_tx_rx_funcs[] = { 0, 0, };
+static int mt7622_uart3_1_rts_cts_pins[] = { 79, 80, };
+static int mt7622_uart3_1_rts_cts_funcs[] = { 0, 0, };
+static int mt7622_uart4_0_tx_rx_pins[] = { 61, 62, };
+static int mt7622_uart4_0_tx_rx_funcs[] = { 5, 5, };
+static int mt7622_uart4_1_tx_rx_pins[] = { 91, 92, };
+static int mt7622_uart4_1_tx_rx_funcs[] = { 0, 0, };
+static int mt7622_uart4_1_rts_cts_pins[] = { 93, 94 };
+static int mt7622_uart4_1_rts_cts_funcs[] = { 0, 0, };
+static int mt7622_uart4_2_tx_rx_pins[] = { 97, 98, };
+static int mt7622_uart4_2_tx_rx_funcs[] = { 2, 2, };
+static int mt7622_uart4_2_rts_cts_pins[] = { 95, 96 };
+static int mt7622_uart4_2_rts_cts_funcs[] = { 2, 2, };
+
+/* Watchdog */
+static int mt7622_watchdog_pins[] = { 78, };
+static int mt7622_watchdog_funcs[] = { 0, };
+
+/* WLAN LED */
+static int mt7622_wled_pins[] = { 85, };
+static int mt7622_wled_funcs[] = { 0, };
+
+static const struct group_desc mt7622_groups[] = {
+       PINCTRL_PIN_GROUP("emmc", mt7622_emmc),
+       PINCTRL_PIN_GROUP("emmc_rst", mt7622_emmc_rst),
+       PINCTRL_PIN_GROUP("ephy_leds", mt7622_ephy_leds),
+       PINCTRL_PIN_GROUP("ephy0_led", mt7622_ephy0_led),
+       PINCTRL_PIN_GROUP("ephy1_led", mt7622_ephy1_led),
+       PINCTRL_PIN_GROUP("ephy2_led", mt7622_ephy2_led),
+       PINCTRL_PIN_GROUP("ephy3_led", mt7622_ephy3_led),
+       PINCTRL_PIN_GROUP("ephy4_led", mt7622_ephy4_led),
+       PINCTRL_PIN_GROUP("esw", mt7622_esw),
+       PINCTRL_PIN_GROUP("esw_p0_p1", mt7622_esw_p0_p1),
+       PINCTRL_PIN_GROUP("esw_p2_p3_p4", mt7622_esw_p2_p3_p4),
+       PINCTRL_PIN_GROUP("rgmii_via_esw", mt7622_rgmii_via_esw),
+       PINCTRL_PIN_GROUP("rgmii_via_gmac1", mt7622_rgmii_via_gmac1),
+       PINCTRL_PIN_GROUP("rgmii_via_gmac2", mt7622_rgmii_via_gmac2),
+       PINCTRL_PIN_GROUP("i2c0", mt7622_i2c0),
+       PINCTRL_PIN_GROUP("i2c1_0", mt7622_i2c1_0),
+       PINCTRL_PIN_GROUP("i2c1_1", mt7622_i2c1_1),
+       PINCTRL_PIN_GROUP("i2c1_2", mt7622_i2c1_2),
+       PINCTRL_PIN_GROUP("i2c2_0", mt7622_i2c2_0),
+       PINCTRL_PIN_GROUP("i2c2_1", mt7622_i2c2_1),
+       PINCTRL_PIN_GROUP("i2c2_2", mt7622_i2c2_2),
+       PINCTRL_PIN_GROUP("i2s_out_mclk_bclk_ws", mt7622_i2s_out_mclk_bclk_ws),
+       PINCTRL_PIN_GROUP("i2s_in_mclk_bclk_ws", mt7622_i2s_in_mclk_bclk_ws),
+       PINCTRL_PIN_GROUP("i2s1_in_data", mt7622_i2s1_in_data),
+       PINCTRL_PIN_GROUP("i2s2_in_data", mt7622_i2s2_in_data),
+       PINCTRL_PIN_GROUP("i2s3_in_data", mt7622_i2s3_in_data),
+       PINCTRL_PIN_GROUP("i2s4_in_data", mt7622_i2s4_in_data),
+       PINCTRL_PIN_GROUP("i2s1_out_data", mt7622_i2s1_out_data),
+       PINCTRL_PIN_GROUP("i2s2_out_data", mt7622_i2s2_out_data),
+       PINCTRL_PIN_GROUP("i2s3_out_data", mt7622_i2s3_out_data),
+       PINCTRL_PIN_GROUP("i2s4_out_data", mt7622_i2s4_out_data),
+       PINCTRL_PIN_GROUP("ir_0_tx", mt7622_ir_0_tx),
+       PINCTRL_PIN_GROUP("ir_1_tx", mt7622_ir_1_tx),
+       PINCTRL_PIN_GROUP("ir_2_tx", mt7622_ir_2_tx),
+       PINCTRL_PIN_GROUP("ir_0_rx", mt7622_ir_0_rx),
+       PINCTRL_PIN_GROUP("ir_1_rx", mt7622_ir_1_rx),
+       PINCTRL_PIN_GROUP("ir_2_rx", mt7622_ir_2_rx),
+       PINCTRL_PIN_GROUP("mdc_mdio", mt7622_mdc_mdio),
+       PINCTRL_PIN_GROUP("pcie0_0_waken", mt7622_pcie0_0_waken),
+       PINCTRL_PIN_GROUP("pcie0_0_clkreq", mt7622_pcie0_0_clkreq),
+       PINCTRL_PIN_GROUP("pcie0_1_waken", mt7622_pcie0_1_waken),
+       PINCTRL_PIN_GROUP("pcie0_1_clkreq", mt7622_pcie0_1_clkreq),
+       PINCTRL_PIN_GROUP("pcie1_0_waken", mt7622_pcie1_0_waken),
+       PINCTRL_PIN_GROUP("pcie1_0_clkreq", mt7622_pcie1_0_clkreq),
+       PINCTRL_PIN_GROUP("pcie0_pad_perst", mt7622_pcie0_pad_perst),
+       PINCTRL_PIN_GROUP("pcie1_pad_perst", mt7622_pcie1_pad_perst),
+       PINCTRL_PIN_GROUP("par_nand", mt7622_pnand),
+       PINCTRL_PIN_GROUP("pmic_bus", mt7622_pmic_bus),
+       PINCTRL_PIN_GROUP("pwm_ch1_0", mt7622_pwm_ch1_0),
+       PINCTRL_PIN_GROUP("pwm_ch1_1", mt7622_pwm_ch1_1),
+       PINCTRL_PIN_GROUP("pwm_ch1_2", mt7622_pwm_ch1_2),
+       PINCTRL_PIN_GROUP("pwm_ch2_0", mt7622_pwm_ch2_0),
+       PINCTRL_PIN_GROUP("pwm_ch2_1", mt7622_pwm_ch2_1),
+       PINCTRL_PIN_GROUP("pwm_ch2_2", mt7622_pwm_ch2_2),
+       PINCTRL_PIN_GROUP("pwm_ch3_0", mt7622_pwm_ch3_0),
+       PINCTRL_PIN_GROUP("pwm_ch3_1", mt7622_pwm_ch3_1),
+       PINCTRL_PIN_GROUP("pwm_ch3_2", mt7622_pwm_ch3_2),
+       PINCTRL_PIN_GROUP("pwm_ch4_0", mt7622_pwm_ch4_0),
+       PINCTRL_PIN_GROUP("pwm_ch4_1", mt7622_pwm_ch4_1),
+       PINCTRL_PIN_GROUP("pwm_ch4_2", mt7622_pwm_ch4_2),
+       PINCTRL_PIN_GROUP("pwm_ch4_3", mt7622_pwm_ch4_3),
+       PINCTRL_PIN_GROUP("pwm_ch5_0", mt7622_pwm_ch5_0),
+       PINCTRL_PIN_GROUP("pwm_ch5_1", mt7622_pwm_ch5_1),
+       PINCTRL_PIN_GROUP("pwm_ch5_2", mt7622_pwm_ch5_2),
+       PINCTRL_PIN_GROUP("pwm_ch6_0", mt7622_pwm_ch6_0),
+       PINCTRL_PIN_GROUP("pwm_ch6_1", mt7622_pwm_ch6_1),
+       PINCTRL_PIN_GROUP("pwm_ch6_2", mt7622_pwm_ch6_2),
+       PINCTRL_PIN_GROUP("pwm_ch6_3", mt7622_pwm_ch6_3),
+       PINCTRL_PIN_GROUP("pwm_ch7_0", mt7622_pwm_ch7_0),
+       PINCTRL_PIN_GROUP("pwm_ch7_1", mt7622_pwm_ch7_1),
+       PINCTRL_PIN_GROUP("pwm_ch7_2", mt7622_pwm_ch7_2),
+       PINCTRL_PIN_GROUP("sd_0", mt7622_sd_0),
+       PINCTRL_PIN_GROUP("sd_1", mt7622_sd_1),
+       PINCTRL_PIN_GROUP("snfi", mt7622_snfi),
+       PINCTRL_PIN_GROUP("spi_nor", mt7622_spi),
+       PINCTRL_PIN_GROUP("spic0_0", mt7622_spic0_0),
+       PINCTRL_PIN_GROUP("spic0_1", mt7622_spic0_1),
+       PINCTRL_PIN_GROUP("spic1_0", mt7622_spic1_0),
+       PINCTRL_PIN_GROUP("spic1_1", mt7622_spic1_1),
+       PINCTRL_PIN_GROUP("spic2_0", mt7622_spic2_0),
+       PINCTRL_PIN_GROUP("spic2_0_wp_hold", mt7622_spic2_0_wp_hold),
+       PINCTRL_PIN_GROUP("tdm_0_out_mclk_bclk_ws",
+                         mt7622_tdm_0_out_mclk_bclk_ws),
+       PINCTRL_PIN_GROUP("tdm_0_in_mclk_bclk_ws",
+                         mt7622_tdm_0_in_mclk_bclk_ws),
+       PINCTRL_PIN_GROUP("tdm_0_out_data",  mt7622_tdm_0_out_data),
+       PINCTRL_PIN_GROUP("tdm_0_in_data", mt7622_tdm_0_in_data),
+       PINCTRL_PIN_GROUP("tdm_1_out_mclk_bclk_ws",
+                         mt7622_tdm_1_out_mclk_bclk_ws),
+       PINCTRL_PIN_GROUP("tdm_1_in_mclk_bclk_ws",
+                         mt7622_tdm_1_in_mclk_bclk_ws),
+       PINCTRL_PIN_GROUP("tdm_1_out_data",  mt7622_tdm_1_out_data),
+       PINCTRL_PIN_GROUP("tdm_1_in_data", mt7622_tdm_1_in_data),
+       PINCTRL_PIN_GROUP("uart0_0_tx_rx", mt7622_uart0_0_tx_rx),
+       PINCTRL_PIN_GROUP("uart1_0_tx_rx", mt7622_uart1_0_tx_rx),
+       PINCTRL_PIN_GROUP("uart1_0_rts_cts", mt7622_uart1_0_rts_cts),
+       PINCTRL_PIN_GROUP("uart1_1_tx_rx", mt7622_uart1_1_tx_rx),
+       PINCTRL_PIN_GROUP("uart1_1_rts_cts", mt7622_uart1_1_rts_cts),
+       PINCTRL_PIN_GROUP("uart2_0_tx_rx", mt7622_uart2_0_tx_rx),
+       PINCTRL_PIN_GROUP("uart2_0_rts_cts", mt7622_uart2_0_rts_cts),
+       PINCTRL_PIN_GROUP("uart2_1_tx_rx", mt7622_uart2_1_tx_rx),
+       PINCTRL_PIN_GROUP("uart2_1_rts_cts", mt7622_uart2_1_rts_cts),
+       PINCTRL_PIN_GROUP("uart2_2_tx_rx", mt7622_uart2_2_tx_rx),
+       PINCTRL_PIN_GROUP("uart2_2_rts_cts", mt7622_uart2_2_rts_cts),
+       PINCTRL_PIN_GROUP("uart2_3_tx_rx", mt7622_uart2_3_tx_rx),
+       PINCTRL_PIN_GROUP("uart3_0_tx_rx", mt7622_uart3_0_tx_rx),
+       PINCTRL_PIN_GROUP("uart3_1_tx_rx", mt7622_uart3_1_tx_rx),
+       PINCTRL_PIN_GROUP("uart3_1_rts_cts", mt7622_uart3_1_rts_cts),
+       PINCTRL_PIN_GROUP("uart4_0_tx_rx", mt7622_uart4_0_tx_rx),
+       PINCTRL_PIN_GROUP("uart4_1_tx_rx", mt7622_uart4_1_tx_rx),
+       PINCTRL_PIN_GROUP("uart4_1_rts_cts", mt7622_uart4_1_rts_cts),
+       PINCTRL_PIN_GROUP("uart4_2_tx_rx", mt7622_uart4_2_tx_rx),
+       PINCTRL_PIN_GROUP("uart4_2_rts_cts", mt7622_uart4_2_rts_cts),
+       PINCTRL_PIN_GROUP("watchdog", mt7622_watchdog),
+       PINCTRL_PIN_GROUP("wled", mt7622_wled),
+};
+
+/* Joint those groups owning the same capability in user point of view which
+ * allows that people tend to use through the device tree.
+ */
+static const char *mt7622_emmc_groups[] = { "emmc", "emmc_rst", };
+static const char *mt7622_ethernet_groups[] = { "esw", "esw_p0_p1",
+                                               "esw_p2_p3_p4", "mdc_mdio",
+                                               "rgmii_via_gmac1",
+                                               "rgmii_via_gmac2",
+                                               "rgmii_via_esw", };
+static const char *mt7622_i2c_groups[] = { "i2c0", "i2c1_0", "i2c1_1",
+                                          "i2c1_2", "i2c2_0", "i2c2_1",
+                                          "i2c2_2", };
+static const char *mt7622_i2s_groups[] = { "i2s_out_mclk_bclk_ws",
+                                          "i2s_in_mclk_bclk_ws",
+                                          "i2s1_in_data", "i2s2_in_data",
+                                          "i2s3_in_data", "i2s4_in_data",
+                                          "i2s1_out_data", "i2s2_out_data",
+                                          "i2s3_out_data", "i2s4_out_data", };
+static const char *mt7622_ir_groups[] = { "ir_0_tx", "ir_1_tx", "ir_2_tx",
+                                         "ir_0_rx", "ir_1_rx", "ir_2_rx"};
+static const char *mt7622_led_groups[] = { "ephy_leds", "ephy0_led",
+                                          "ephy1_led", "ephy2_led",
+                                          "ephy3_led", "ephy4_led",
+                                          "wled", };
+static const char *mt7622_flash_groups[] = { "par_nand", "snfi", "spi_nor"};
+static const char *mt7622_pcie_groups[] = { "pcie0_0_waken", "pcie0_0_clkreq",
+                                           "pcie0_1_waken", "pcie0_1_clkreq",
+                                           "pcie1_0_waken", "pcie1_0_clkreq",
+                                           "pcie0_pad_perst",
+                                           "pcie1_pad_perst", };
+static const char *mt7622_pmic_bus_groups[] = { "pmic_bus", };
+static const char *mt7622_pwm_groups[] = { "pwm_ch1_0", "pwm_ch1_1",
+                                          "pwm_ch1_2", "pwm_ch2_0",
+                                          "pwm_ch2_1", "pwm_ch2_2",
+                                          "pwm_ch3_0", "pwm_ch3_1",
+                                          "pwm_ch3_2", "pwm_ch4_0",
+                                          "pwm_ch4_1", "pwm_ch4_2",
+                                          "pwm_ch4_3", "pwm_ch5_0",
+                                          "pwm_ch5_1", "pwm_ch5_2",
+                                          "pwm_ch6_0", "pwm_ch6_1",
+                                          "pwm_ch6_2", "pwm_ch6_3",
+                                          "pwm_ch7_0", "pwm_ch7_1",
+                                          "pwm_ch7_2", };
+static const char *mt7622_sd_groups[] = { "sd_0", "sd_1", };
+static const char *mt7622_spic_groups[] = { "spic0_0", "spic0_1", "spic1_0",
+                                           "spic1_1", "spic2_0",
+                                           "spic2_0_wp_hold", };
+static const char *mt7622_tdm_groups[] = { "tdm_0_out_mclk_bclk_ws",
+                                          "tdm_0_in_mclk_bclk_ws",
+                                          "tdm_0_out_data",
+                                          "tdm_0_in_data",
+                                          "tdm_1_out_mclk_bclk_ws",
+                                          "tdm_1_in_mclk_bclk_ws",
+                                          "tdm_1_out_data",
+                                          "tdm_1_in_data", };
+
+static const char *mt7622_uart_groups[] = { "uart0_0_tx_rx",
+                                           "uart1_0_tx_rx", "uart1_0_rts_cts",
+                                           "uart1_1_tx_rx", "uart1_1_rts_cts",
+                                           "uart2_0_tx_rx", "uart2_0_rts_cts",
+                                           "uart2_1_tx_rx", "uart2_1_rts_cts",
+                                           "uart2_2_tx_rx", "uart2_2_rts_cts",
+                                           "uart2_3_tx_rx",
+                                           "uart3_0_tx_rx",
+                                           "uart3_1_tx_rx", "uart3_1_rts_cts",
+                                           "uart4_0_tx_rx",
+                                           "uart4_1_tx_rx", "uart4_1_rts_cts",
+                                           "uart4_2_tx_rx",
+                                           "uart4_2_rts_cts",};
+static const char *mt7622_wdt_groups[] = { "watchdog", };
+
+static const struct function_desc mt7622_functions[] = {
+       {"emmc", mt7622_emmc_groups, ARRAY_SIZE(mt7622_emmc_groups)},
+       {"eth", mt7622_ethernet_groups, ARRAY_SIZE(mt7622_ethernet_groups)},
+       {"i2c", mt7622_i2c_groups, ARRAY_SIZE(mt7622_i2c_groups)},
+       {"i2s", mt7622_i2s_groups, ARRAY_SIZE(mt7622_i2s_groups)},
+       {"ir", mt7622_ir_groups, ARRAY_SIZE(mt7622_ir_groups)},
+       {"led", mt7622_led_groups, ARRAY_SIZE(mt7622_led_groups)},
+       {"flash", mt7622_flash_groups, ARRAY_SIZE(mt7622_flash_groups)},
+       {"pcie", mt7622_pcie_groups, ARRAY_SIZE(mt7622_pcie_groups)},
+       {"pmic", mt7622_pmic_bus_groups, ARRAY_SIZE(mt7622_pmic_bus_groups)},
+       {"pwm", mt7622_pwm_groups, ARRAY_SIZE(mt7622_pwm_groups)},
+       {"sd", mt7622_sd_groups, ARRAY_SIZE(mt7622_sd_groups)},
+       {"spi", mt7622_spic_groups, ARRAY_SIZE(mt7622_spic_groups)},
+       {"tdm", mt7622_tdm_groups, ARRAY_SIZE(mt7622_tdm_groups)},
+       {"uart", mt7622_uart_groups, ARRAY_SIZE(mt7622_uart_groups)},
+       {"watchdog", mt7622_wdt_groups, ARRAY_SIZE(mt7622_wdt_groups)},
+};
+
+static const struct pinconf_generic_params mtk_custom_bindings[] = {
+       {"mediatek,tdsel",      MTK_PIN_CONFIG_TDSEL,           0},
+       {"mediatek,rdsel",      MTK_PIN_CONFIG_RDSEL,           0},
+};
+
+#ifdef CONFIG_DEBUG_FS
+static const struct pin_config_item mtk_conf_items[] = {
+       PCONFDUMP(MTK_PIN_CONFIG_TDSEL, "tdsel", NULL, true),
+       PCONFDUMP(MTK_PIN_CONFIG_RDSEL, "rdsel", NULL, true),
+};
+#endif
+
+static const struct mtk_pin_soc mt7622_data = {
+       .reg_cal = mt7622_reg_cals,
+       .pins = mt7622_pins,
+       .npins = ARRAY_SIZE(mt7622_pins),
+       .grps = mt7622_groups,
+       .ngrps = ARRAY_SIZE(mt7622_groups),
+       .funcs = mt7622_functions,
+       .nfuncs = ARRAY_SIZE(mt7622_functions),
+};
+
+static void mtk_w32(struct mtk_pinctrl *pctl, u32 reg, u32 val)
+{
+       writel_relaxed(val, pctl->base + reg);
+}
+
+static u32 mtk_r32(struct mtk_pinctrl *pctl, u32 reg)
+{
+       return readl_relaxed(pctl->base + reg);
+}
+
+static void mtk_rmw(struct mtk_pinctrl *pctl, u32 reg, u32 mask, u32 set)
+{
+       u32 val;
+
+       val = mtk_r32(pctl, reg);
+       val &= ~mask;
+       val |= set;
+       mtk_w32(pctl, reg, val);
+}
+
+static int mtk_hw_pin_field_lookup(struct mtk_pinctrl *hw, int pin,
+                                  const struct mtk_pin_reg_calc *rc,
+                                  struct mtk_pin_field *pfd)
+{
+       const struct mtk_pin_field_calc *c, *e;
+       u32 bits;
+
+       c = rc->range;
+       e = c + rc->nranges;
+
+       while (c < e) {
+               if (pin >= c->s_pin && pin <= c->e_pin)
+                       break;
+               c++;
+       }
+
+       if (c >= e) {
+               dev_err(hw->dev, "Out of range for pin = %d\n", pin);
+               return -EINVAL;
+       }
+
+       /* Caculated bits as the overall offset the pin is located at */
+       bits = c->s_bit + (pin - c->s_pin) * (c->x_bits);
+
+       /* Fill pfd from bits and 32-bit register applied is assumed */
+       pfd->offset = c->s_addr + c->x_addrs * (bits / 32);
+       pfd->bitpos = bits % 32;
+       pfd->mask = (1 << c->x_bits) - 1;
+
+       /* pfd->next is used for indicating that bit wrapping-around happens
+        * which requires the manipulation for bit 0 starting in the next
+        * register to form the complete field read/write.
+        */
+       pfd->next = pfd->bitpos + c->x_bits - 1 > 31 ? c->x_addrs : 0;
+
+       return 0;
+}
+
+static int mtk_hw_pin_field_get(struct mtk_pinctrl *hw, int pin,
+                               int field, struct mtk_pin_field *pfd)
+{
+       const struct mtk_pin_reg_calc *rc;
+
+       if (field < 0 || field >= PINCTRL_PIN_REG_MAX) {
+               dev_err(hw->dev, "Invalid Field %d\n", field);
+               return -EINVAL;
+       }
+
+       if (hw->soc->reg_cal && hw->soc->reg_cal[field].range) {
+               rc = &hw->soc->reg_cal[field];
+       } else {
+               dev_err(hw->dev, "Undefined range for field %d\n", field);
+               return -EINVAL;
+       }
+
+       return mtk_hw_pin_field_lookup(hw, pin, rc, pfd);
+}
+
+static void mtk_hw_bits_part(struct mtk_pin_field *pf, int *h, int *l)
+{
+       *l = 32 - pf->bitpos;
+       *h = get_count_order(pf->mask) - *l;
+}
+
+static void mtk_hw_write_cross_field(struct mtk_pinctrl *hw,
+                                    struct mtk_pin_field *pf, int value)
+{
+       int nbits_l, nbits_h;
+
+       mtk_hw_bits_part(pf, &nbits_h, &nbits_l);
+
+       mtk_rmw(hw, pf->offset, pf->mask << pf->bitpos,
+               (value & pf->mask) << pf->bitpos);
+
+       mtk_rmw(hw, pf->offset + pf->next, BIT(nbits_h) - 1,
+               (value & pf->mask) >> nbits_l);
+}
+
+static void mtk_hw_read_cross_field(struct mtk_pinctrl *hw,
+                                   struct mtk_pin_field *pf, int *value)
+{
+       int nbits_l, nbits_h, h, l;
+
+       mtk_hw_bits_part(pf, &nbits_h, &nbits_l);
+
+       l  = (mtk_r32(hw, pf->offset) >> pf->bitpos) & (BIT(nbits_l) - 1);
+       h  = (mtk_r32(hw, pf->offset + pf->next)) & (BIT(nbits_h) - 1);
+
+       *value = (h << nbits_l) | l;
+}
+
+static int mtk_hw_set_value(struct mtk_pinctrl *hw, int pin, int field,
+                           int value)
+{
+       struct mtk_pin_field pf;
+       int err;
+
+       err = mtk_hw_pin_field_get(hw, pin, field, &pf);
+       if (err)
+               return err;
+
+       if (!pf.next)
+               mtk_rmw(hw, pf.offset, pf.mask << pf.bitpos,
+                       (value & pf.mask) << pf.bitpos);
+       else
+               mtk_hw_write_cross_field(hw, &pf, value);
+
+       return 0;
+}
+
+static int mtk_hw_get_value(struct mtk_pinctrl *hw, int pin, int field,
+                           int *value)
+{
+       struct mtk_pin_field pf;
+       int err;
+
+       err = mtk_hw_pin_field_get(hw, pin, field, &pf);
+       if (err)
+               return err;
+
+       if (!pf.next)
+               *value = (mtk_r32(hw, pf.offset) >> pf.bitpos) & pf.mask;
+       else
+               mtk_hw_read_cross_field(hw, &pf, value);
+
+       return 0;
+}
+
+static int mtk_pinmux_set_mux(struct pinctrl_dev *pctldev,
+                             unsigned int selector, unsigned int group)
+{
+       struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
+       struct function_desc *func;
+       struct group_desc *grp;
+       int i;
+
+       func = pinmux_generic_get_function(pctldev, selector);
+       if (!func)
+               return -EINVAL;
+
+       grp = pinctrl_generic_get_group(pctldev, group);
+       if (!grp)
+               return -EINVAL;
+
+       dev_dbg(pctldev->dev, "enable function %s group %s\n",
+               func->name, grp->name);
+
+       for (i = 0; i < grp->num_pins; i++) {
+               int *pin_modes = grp->data;
+
+               mtk_hw_set_value(hw, grp->pins[i], PINCTRL_PIN_REG_MODE,
+                                pin_modes[i]);
+       }
+
+       return 0;
+}
+
+static int mtk_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
+                                         struct pinctrl_gpio_range *range,
+                                         unsigned int pin)
+{
+       struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
+
+       return mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_MODE, MTK_GPIO_MODE);
+}
+
+static int mtk_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
+                                        struct pinctrl_gpio_range *range,
+                                        unsigned int pin, bool input)
+{
+       struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
+
+       /* hardware would take 0 as input direction */
+       return mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_DIR, !input);
+}
+
+static int mtk_pinconf_get(struct pinctrl_dev *pctldev,
+                          unsigned int pin, unsigned long *config)
+{
+       struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
+       u32 param = pinconf_to_config_param(*config);
+       int val, val2, err, reg, ret = 1;
+
+       switch (param) {
+       case PIN_CONFIG_BIAS_DISABLE:
+               err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_PU, &val);
+               if (err)
+                       return err;
+
+               err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_PD, &val2);
+               if (err)
+                       return err;
+
+               if (val || val2)
+                       return -EINVAL;
+
+               break;
+       case PIN_CONFIG_BIAS_PULL_UP:
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+       case PIN_CONFIG_SLEW_RATE:
+               reg = (param == PIN_CONFIG_BIAS_PULL_UP) ?
+                     PINCTRL_PIN_REG_PU :
+                     (param == PIN_CONFIG_BIAS_PULL_DOWN) ?
+                     PINCTRL_PIN_REG_PD : PINCTRL_PIN_REG_SR;
+
+               err = mtk_hw_get_value(hw, pin, reg, &val);
+               if (err)
+                       return err;
+
+               if (!val)
+                       return -EINVAL;
+
+               break;
+       case PIN_CONFIG_INPUT_ENABLE:
+       case PIN_CONFIG_OUTPUT_ENABLE:
+               err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_DIR, &val);
+               if (err)
+                       return err;
+
+               /* HW takes input mode as zero; output mode as non-zero */
+               if ((val && param == PIN_CONFIG_INPUT_ENABLE) ||
+                   (!val && param == PIN_CONFIG_OUTPUT_ENABLE))
+                       return -EINVAL;
+
+               break;
+       case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
+               err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_DIR, &val);
+               if (err)
+                       return err;
+
+               err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_SMT, &val2);
+               if (err)
+                       return err;
+
+               if (val || !val2)
+                       return -EINVAL;
+
+               break;
+       case PIN_CONFIG_DRIVE_STRENGTH:
+               err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_E4, &val);
+               if (err)
+                       return err;
+
+               err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_E8, &val2);
+               if (err)
+                       return err;
+
+               /* 4mA when (e8, e4) = (0, 0); 8mA when (e8, e4) = (0, 1)
+                * 12mA when (e8, e4) = (1, 0); 16mA when (e8, e4) = (1, 1)
+                */
+               ret = ((val2 << 1) + val + 1) * 4;
+
+               break;
+       case MTK_PIN_CONFIG_TDSEL:
+       case MTK_PIN_CONFIG_RDSEL:
+               reg = (param == MTK_PIN_CONFIG_TDSEL) ?
+                      PINCTRL_PIN_REG_TDSEL : PINCTRL_PIN_REG_RDSEL;
+
+               err = mtk_hw_get_value(hw, pin, reg, &val);
+               if (err)
+                       return err;
+
+               ret = val;
+
+               break;
+       default:
+               return -ENOTSUPP;
+       }
+
+       *config = pinconf_to_config_packed(param, ret);
+
+       return 0;
+}
+
+static int mtk_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
+                          unsigned long *configs, unsigned int num_configs)
+{
+       struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
+       u32 reg, param, arg;
+       int cfg, err = 0;
+
+       for (cfg = 0; cfg < num_configs; cfg++) {
+               param = pinconf_to_config_param(configs[cfg]);
+               arg = pinconf_to_config_argument(configs[cfg]);
+
+               switch (param) {
+               case PIN_CONFIG_BIAS_DISABLE:
+               case PIN_CONFIG_BIAS_PULL_UP:
+               case PIN_CONFIG_BIAS_PULL_DOWN:
+                       arg = (param == PIN_CONFIG_BIAS_DISABLE) ? 0 :
+                              (param == PIN_CONFIG_BIAS_PULL_UP) ? 1 : 2;
+
+                       err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_PU,
+                                              arg & 1);
+                       if (err)
+                               goto err;
+
+                       err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_PD,
+                                              !!(arg & 2));
+                       if (err)
+                               goto err;
+                       break;
+               case PIN_CONFIG_OUTPUT_ENABLE:
+                       err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_SMT,
+                                              MTK_DISABLE);
+                       if (err)
+                               goto err;
+               case PIN_CONFIG_INPUT_ENABLE:
+               case PIN_CONFIG_SLEW_RATE:
+                       reg = (param == PIN_CONFIG_SLEW_RATE) ?
+                              PINCTRL_PIN_REG_SR : PINCTRL_PIN_REG_DIR;
+
+                       arg = (param == PIN_CONFIG_INPUT_ENABLE) ? 0 :
+                             (param == PIN_CONFIG_OUTPUT_ENABLE) ? 1 : arg;
+                       err = mtk_hw_set_value(hw, pin, reg, arg);
+                       if (err)
+                               goto err;
+
+                       break;
+               case PIN_CONFIG_OUTPUT:
+                       err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_DIR,
+                                              MTK_OUTPUT);
+                       if (err)
+                               goto err;
+
+                       err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_DO,
+                                              arg);
+                       if (err)
+                               goto err;
+                       break;
+               case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
+                       /* arg = 1: Input mode & SMT enable ;
+                        * arg = 0: Output mode & SMT disable
+                        */
+                       arg = arg ? 2 : 1;
+                       err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_DIR,
+                                              arg & 1);
+                       if (err)
+                               goto err;
+
+                       err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_SMT,
+                                              !!(arg & 2));
+                       if (err)
+                               goto err;
+                       break;
+               case PIN_CONFIG_DRIVE_STRENGTH:
+                       /* 4mA when (e8, e4) = (0, 0);
+                        * 8mA when (e8, e4) = (0, 1);
+                        * 12mA when (e8, e4) = (1, 0);
+                        * 16mA when (e8, e4) = (1, 1)
+                        */
+                       if (!(arg % 4) && (arg >= 4 && arg <= 16)) {
+                               arg = arg / 4 - 1;
+                               err = mtk_hw_set_value(hw, pin,
+                                                      PINCTRL_PIN_REG_E4,
+                                                      arg & 0x1);
+                               if (err)
+                                       goto err;
+
+                               err = mtk_hw_set_value(hw, pin,
+                                                      PINCTRL_PIN_REG_E8,
+                                                      (arg & 0x2) >> 1);
+                               if (err)
+                                       goto err;
+                       } else {
+                               err = -ENOTSUPP;
+                       }
+                       break;
+               case MTK_PIN_CONFIG_TDSEL:
+               case MTK_PIN_CONFIG_RDSEL:
+                       reg = (param == MTK_PIN_CONFIG_TDSEL) ?
+                              PINCTRL_PIN_REG_TDSEL : PINCTRL_PIN_REG_RDSEL;
+
+                       err = mtk_hw_set_value(hw, pin, reg, arg);
+                       if (err)
+                               goto err;
+                       break;
+               default:
+                       err = -ENOTSUPP;
+               }
+       }
+err:
+       return err;
+}
+
+static int mtk_pinconf_group_get(struct pinctrl_dev *pctldev,
+                                unsigned int group, unsigned long *config)
+{
+       const unsigned int *pins;
+       unsigned int i, npins, old = 0;
+       int ret;
+
+       ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
+       if (ret)
+               return ret;
+
+       for (i = 0; i < npins; i++) {
+               if (mtk_pinconf_get(pctldev, pins[i], config))
+                       return -ENOTSUPP;
+
+               /* configs do not match between two pins */
+               if (i && old != *config)
+                       return -ENOTSUPP;
+
+               old = *config;
+       }
+
+       return 0;
+}
+
+static int mtk_pinconf_group_set(struct pinctrl_dev *pctldev,
+                                unsigned int group, unsigned long *configs,
+                                unsigned int num_configs)
+{
+       const unsigned int *pins;
+       unsigned int i, npins;
+       int ret;
+
+       ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
+       if (ret)
+               return ret;
+
+       for (i = 0; i < npins; i++) {
+               ret = mtk_pinconf_set(pctldev, pins[i], configs, num_configs);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+static const struct pinctrl_ops mtk_pctlops = {
+       .get_groups_count = pinctrl_generic_get_group_count,
+       .get_group_name = pinctrl_generic_get_group_name,
+       .get_group_pins = pinctrl_generic_get_group_pins,
+       .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
+       .dt_free_map = pinconf_generic_dt_free_map,
+};
+
+static const struct pinmux_ops mtk_pmxops = {
+       .get_functions_count = pinmux_generic_get_function_count,
+       .get_function_name = pinmux_generic_get_function_name,
+       .get_function_groups = pinmux_generic_get_function_groups,
+       .set_mux = mtk_pinmux_set_mux,
+       .gpio_request_enable = mtk_pinmux_gpio_request_enable,
+       .gpio_set_direction = mtk_pinmux_gpio_set_direction,
+       .strict = true,
+};
+
+static const struct pinconf_ops mtk_confops = {
+       .is_generic = true,
+       .pin_config_get = mtk_pinconf_get,
+       .pin_config_set = mtk_pinconf_set,
+       .pin_config_group_get = mtk_pinconf_group_get,
+       .pin_config_group_set = mtk_pinconf_group_set,
+       .pin_config_config_dbg_show = pinconf_generic_dump_config,
+};
+
+static struct pinctrl_desc mtk_desc = {
+       .name = PINCTRL_PINCTRL_DEV,
+       .pctlops = &mtk_pctlops,
+       .pmxops = &mtk_pmxops,
+       .confops = &mtk_confops,
+       .owner = THIS_MODULE,
+};
+
+static int mtk_gpio_get(struct gpio_chip *chip, unsigned int gpio)
+{
+       struct mtk_pinctrl *hw = dev_get_drvdata(chip->parent);
+       int value, err;
+
+       err = mtk_hw_get_value(hw, gpio, PINCTRL_PIN_REG_DI, &value);
+       if (err)
+               return err;
+
+       return !!value;
+}
+
+static void mtk_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value)
+{
+       struct mtk_pinctrl *hw = dev_get_drvdata(chip->parent);
+
+       mtk_hw_set_value(hw, gpio, PINCTRL_PIN_REG_DO, !!value);
+}
+
+static int mtk_gpio_direction_input(struct gpio_chip *chip, unsigned int gpio)
+{
+       return pinctrl_gpio_direction_input(chip->base + gpio);
+}
+
+static int mtk_gpio_direction_output(struct gpio_chip *chip, unsigned int gpio,
+                                    int value)
+{
+       mtk_gpio_set(chip, gpio, value);
+
+       return pinctrl_gpio_direction_output(chip->base + gpio);
+}
+
+static int mtk_build_gpiochip(struct mtk_pinctrl *hw, struct device_node *np)
+{
+       struct gpio_chip *chip = &hw->chip;
+       int ret;
+
+       chip->label             = PINCTRL_PINCTRL_DEV;
+       chip->parent            = hw->dev;
+       chip->request           = gpiochip_generic_request;
+       chip->free              = gpiochip_generic_free;
+       chip->direction_input   = mtk_gpio_direction_input;
+       chip->direction_output  = mtk_gpio_direction_output;
+       chip->get               = mtk_gpio_get;
+       chip->set               = mtk_gpio_set;
+       chip->base              = -1;
+       chip->ngpio             = hw->soc->npins;
+       chip->of_node           = np;
+       chip->of_gpio_n_cells   = 2;
+
+       ret = gpiochip_add_data(chip, hw);
+       if (ret < 0)
+               return ret;
+
+       ret = gpiochip_add_pin_range(chip, dev_name(hw->dev), 0, 0,
+                                    chip->ngpio);
+       if (ret < 0) {
+               gpiochip_remove(chip);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int mtk_build_groups(struct mtk_pinctrl *hw)
+{
+       int err, i;
+
+       for (i = 0; i < hw->soc->ngrps; i++) {
+               const struct group_desc *group = hw->soc->grps + i;
+
+               err = pinctrl_generic_add_group(hw->pctrl, group->name,
+                                               group->pins, group->num_pins,
+                                               group->data);
+               if (err) {
+                       dev_err(hw->dev, "Failed to register group %s\n",
+                               group->name);
+                       return err;
+               }
+       }
+
+       return 0;
+}
+
+static int mtk_build_functions(struct mtk_pinctrl *hw)
+{
+       int i, err;
+
+       for (i = 0; i < hw->soc->nfuncs ; i++) {
+               const struct function_desc *func = hw->soc->funcs + i;
+
+               err = pinmux_generic_add_function(hw->pctrl, func->name,
+                                                 func->group_names,
+                                                 func->num_group_names,
+                                                 func->data);
+               if (err) {
+                       dev_err(hw->dev, "Failed to register function %s\n",
+                               func->name);
+                       return err;
+               }
+       }
+
+       return 0;
+}
+
+static const struct of_device_id mtk_pinctrl_of_match[] = {
+       { .compatible = "mediatek,mt7622-pinctrl", .data = &mt7622_data},
+       { }
+};
+
+static int mtk_pinctrl_probe(struct platform_device *pdev)
+{
+       struct resource *res;
+       struct mtk_pinctrl *hw;
+       const struct of_device_id *of_id =
+               of_match_device(mtk_pinctrl_of_match, &pdev->dev);
+       int err;
+
+       hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL);
+       if (!hw)
+               return -ENOMEM;
+
+       hw->soc = of_id->data;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "missing IO resource\n");
+               return -ENXIO;
+       }
+
+       hw->dev = &pdev->dev;
+       hw->base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(hw->base))
+               return PTR_ERR(hw->base);
+
+       /* Setup pins descriptions per SoC types */
+       mtk_desc.pins = hw->soc->pins;
+       mtk_desc.npins = hw->soc->npins;
+       mtk_desc.num_custom_params = ARRAY_SIZE(mtk_custom_bindings);
+       mtk_desc.custom_params = mtk_custom_bindings;
+#ifdef CONFIG_DEBUG_FS
+       mtk_desc.custom_conf_items = mtk_conf_items;
+#endif
+
+       hw->pctrl = devm_pinctrl_register(&pdev->dev, &mtk_desc, hw);
+       if (IS_ERR(hw->pctrl))
+               return PTR_ERR(hw->pctrl);
+
+       /* Setup groups descriptions per SoC types */
+       err = mtk_build_groups(hw);
+       if (err) {
+               dev_err(&pdev->dev, "Failed to build groups\n");
+               return 0;
+       }
+
+       /* Setup functions descriptions per SoC types */
+       err = mtk_build_functions(hw);
+       if (err) {
+               dev_err(&pdev->dev, "Failed to build functions\n");
+               return err;
+       }
+
+       err = mtk_build_gpiochip(hw, pdev->dev.of_node);
+       if (err) {
+               dev_err(&pdev->dev, "Failed to add gpio_chip\n");
+               return err;
+       }
+
+       platform_set_drvdata(pdev, hw);
+
+       return 0;
+}
+
+static struct platform_driver mtk_pinctrl_driver = {
+       .driver = {
+               .name = "mtk-pinctrl",
+               .of_match_table = mtk_pinctrl_of_match,
+       },
+       .probe = mtk_pinctrl_probe,
+};
+
+static int __init mtk_pinctrl_init(void)
+{
+       return platform_driver_register(&mtk_pinctrl_driver);
+}
+arch_initcall(mtk_pinctrl_init);
index 1a51778759eae6c9969815f2cc88b8d88c88d1c7..c80951d6caff9625a735baf61cb89d6f3ab1e058 100644 (file)
@@ -38,4 +38,13 @@ config PINCTRL_MESON_GXL
 config PINCTRL_MESON8_PMX
        bool
 
+config PINCTRL_MESON_AXG
+       bool "Meson axg Soc pinctrl driver"
+       depends on ARM64
+       select PINCTRL_MESON_AXG_PMX
+       default y
+
+config PINCTRL_MESON_AXG_PMX
+       bool
+
 endif
index cbd47bb74549143053b0150b97804596a50202f0..3c6580c2d9d7729bae9a7f3b7562464fa1b0b08d 100644 (file)
@@ -4,3 +4,5 @@ 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
+obj-$(CONFIG_PINCTRL_MESON_AXG_PMX) += pinctrl-meson-axg-pmx.o
+obj-$(CONFIG_PINCTRL_MESON_AXG) += pinctrl-meson-axg.o
diff --git a/drivers/pinctrl/meson/pinctrl-meson-axg-pmx.c b/drivers/pinctrl/meson/pinctrl-meson-axg-pmx.c
new file mode 100644 (file)
index 0000000..e8931d9
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Second generation of pinmux driver for Amlogic Meson-AXG SoC.
+ *
+ * Copyright (c) 2017 Baylibre SAS.
+ * Author:  Jerome Brunet  <jbrunet@baylibre.com>
+ *
+ * Copyright (c) 2017 Amlogic, Inc. All rights reserved.
+ * Author: Xingyu Chen <xingyu.chen@amlogic.com>
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ or MIT)
+ */
+
+/*
+ * This new generation of pinctrl IP is mainly adopted by the
+ * Meson-AXG SoC and later series, which use 4-width continuous
+ * register bit to select the function for each pin.
+ *
+ * The value 0 is always selecting the GPIO mode, while other
+ * values (start from 1) for selecting the function mode.
+ */
+#include <linux/device.h>
+#include <linux/regmap.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+
+#include "pinctrl-meson.h"
+#include "pinctrl-meson-axg-pmx.h"
+
+static int meson_axg_pmx_get_bank(struct meson_pinctrl *pc,
+                       unsigned int pin,
+                       struct meson_pmx_bank **bank)
+{
+       int i;
+       struct meson_axg_pmx_data *pmx = pc->data->pmx_data;
+
+       for (i = 0; i < pmx->num_pmx_banks; i++)
+               if (pin >= pmx->pmx_banks[i].first &&
+                               pin <= pmx->pmx_banks[i].last) {
+                       *bank = &pmx->pmx_banks[i];
+                       return 0;
+               }
+
+       return -EINVAL;
+}
+
+static int meson_pmx_calc_reg_and_offset(struct meson_pmx_bank *bank,
+                       unsigned int pin, unsigned int *reg,
+                       unsigned int *offset)
+{
+       int shift;
+
+       shift = pin - bank->first;
+
+       *reg = bank->reg + (bank->offset + (shift << 2)) / 32;
+       *offset = (bank->offset + (shift << 2)) % 32;
+
+       return 0;
+}
+
+static int meson_axg_pmx_update_function(struct meson_pinctrl *pc,
+                       unsigned int pin, unsigned int func)
+{
+       int ret;
+       int reg;
+       int offset;
+       struct meson_pmx_bank *bank;
+
+       ret = meson_axg_pmx_get_bank(pc, pin, &bank);
+       if (ret)
+               return ret;
+
+       meson_pmx_calc_reg_and_offset(bank, pin, &reg, &offset);
+
+       ret = regmap_update_bits(pc->reg_mux, reg << 2,
+               0xf << offset, (func & 0xf) << offset);
+
+       return ret;
+}
+
+static int meson_axg_pmx_set_mux(struct pinctrl_dev *pcdev,
+                       unsigned int func_num, unsigned int group_num)
+{
+       int i;
+       int ret;
+       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 meson_pmx_axg_data *pmx_data =
+               (struct meson_pmx_axg_data *)group->data;
+
+       dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
+               group->name);
+
+       for (i = 0; i < group->num_pins; i++) {
+               ret = meson_axg_pmx_update_function(pc, group->pins[i],
+                       pmx_data->func);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+static int meson_axg_pmx_request_gpio(struct pinctrl_dev *pcdev,
+                       struct pinctrl_gpio_range *range, unsigned int offset)
+{
+       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
+
+       return meson_axg_pmx_update_function(pc, offset, 0);
+}
+
+const struct pinmux_ops meson_axg_pmx_ops = {
+       .set_mux = meson_axg_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_axg_pmx_request_gpio,
+};
diff --git a/drivers/pinctrl/meson/pinctrl-meson-axg-pmx.h b/drivers/pinctrl/meson/pinctrl-meson-axg-pmx.h
new file mode 100644 (file)
index 0000000..8ff88bf
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2017 Baylibre SAS.
+ * Author:  Jerome Brunet  <jbrunet@baylibre.com>
+ *
+ * Copyright (c) 2017 Amlogic, Inc. All rights reserved.
+ * Author: Xingyu Chen <xingyu.chen@amlogic.com>
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ or MIT)
+ */
+
+struct meson_pmx_bank {
+       const char *name;
+       unsigned int first;
+       unsigned int last;
+       unsigned int reg;
+       unsigned int offset;
+};
+
+struct meson_axg_pmx_data {
+       struct meson_pmx_bank *pmx_banks;
+       unsigned int num_pmx_banks;
+};
+
+#define BANK_PMX(n, f, l, r, o)                                \
+       {                                                       \
+               .name   = n,                                    \
+               .first  = f,                                    \
+               .last   = l,                                    \
+               .reg    = r,                                    \
+               .offset = o,                                    \
+       }
+
+struct meson_pmx_axg_data {
+        unsigned int func;
+};
+
+#define PMX_DATA(f)                                                    \
+       {                                                               \
+               .func = f,                                              \
+       }
+
+#define GROUP(grp, f)                                                  \
+       {                                                               \
+               .name = #grp,                                           \
+               .pins = grp ## _pins,                                   \
+               .num_pins = ARRAY_SIZE(grp ## _pins),                   \
+               .data = (const struct meson_pmx_axg_data[]){            \
+                       PMX_DATA(f),                                    \
+               },                                                      \
+       }
+
+#define GPIO_GROUP(gpio)                                               \
+       {                                                               \
+               .name = #gpio,                                          \
+               .pins = (const unsigned int[]){ gpio },                 \
+               .num_pins = 1,                                          \
+               .data = (const struct meson_pmx_axg_data[]){            \
+                       PMX_DATA(0),                                    \
+               },                                                      \
+       }
+
+extern const struct pinmux_ops meson_axg_pmx_ops;
diff --git a/drivers/pinctrl/meson/pinctrl-meson-axg.c b/drivers/pinctrl/meson/pinctrl-meson-axg.c
new file mode 100644 (file)
index 0000000..1fda9d6
--- /dev/null
@@ -0,0 +1,975 @@
+/*
+ * Pin controller and GPIO driver for Amlogic Meson AXG SoC.
+ *
+ * Copyright (c) 2017 Amlogic, Inc. All rights reserved.
+ * Author: Xingyu Chen <xingyu.chen@amlogic.com>
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ or MIT)
+ */
+
+#include <dt-bindings/gpio/meson-axg-gpio.h>
+#include "pinctrl-meson.h"
+#include "pinctrl-meson-axg-pmx.h"
+
+static const struct pinctrl_pin_desc meson_axg_periphs_pins[] = {
+       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(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(GPIOA_0),
+       MESON_PIN(GPIOA_1),
+       MESON_PIN(GPIOA_2),
+       MESON_PIN(GPIOA_3),
+       MESON_PIN(GPIOA_4),
+       MESON_PIN(GPIOA_5),
+       MESON_PIN(GPIOA_6),
+       MESON_PIN(GPIOA_7),
+       MESON_PIN(GPIOA_8),
+       MESON_PIN(GPIOA_9),
+       MESON_PIN(GPIOA_10),
+       MESON_PIN(GPIOA_11),
+       MESON_PIN(GPIOA_12),
+       MESON_PIN(GPIOA_13),
+       MESON_PIN(GPIOA_14),
+       MESON_PIN(GPIOA_15),
+       MESON_PIN(GPIOA_16),
+       MESON_PIN(GPIOA_17),
+       MESON_PIN(GPIOA_18),
+       MESON_PIN(GPIOA_19),
+       MESON_PIN(GPIOA_20),
+       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(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),
+};
+
+static const struct pinctrl_pin_desc meson_axg_aobus_pins[] = {
+       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),
+};
+
+/* emmc */
+static const unsigned int emmc_nand_d0_pins[] = {BOOT_0};
+static const unsigned int emmc_nand_d1_pins[] = {BOOT_1};
+static const unsigned int emmc_nand_d2_pins[] = {BOOT_2};
+static const unsigned int emmc_nand_d3_pins[] = {BOOT_3};
+static const unsigned int emmc_nand_d4_pins[] = {BOOT_4};
+static const unsigned int emmc_nand_d5_pins[] = {BOOT_5};
+static const unsigned int emmc_nand_d6_pins[] = {BOOT_6};
+static const unsigned int emmc_nand_d7_pins[] = {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_13};
+
+/* nand */
+static const unsigned int nand_ce0_pins[] = {BOOT_8};
+static const unsigned int nand_ale_pins[] = {BOOT_9};
+static const unsigned int nand_cle_pins[] = {BOOT_10};
+static const unsigned int nand_wen_clk_pins[] = {BOOT_11};
+static const unsigned int nand_ren_wr_pins[] = {BOOT_12};
+static const unsigned int nand_rb0_pins[] = {BOOT_13};
+
+/* nor */
+static const unsigned int nor_hold_pins[] = {BOOT_3};
+static const unsigned int nor_d_pins[] = {BOOT_4};
+static const unsigned int nor_q_pins[] = {BOOT_5};
+static const unsigned int nor_c_pins[] = {BOOT_6};
+static const unsigned int nor_wp_pins[] = {BOOT_9};
+static const unsigned int nor_cs_pins[] = {BOOT_14};
+
+/* sdio */
+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_clk_pins[] = {GPIOX_4};
+static const unsigned int sdio_cmd_pins[] = {GPIOX_5};
+
+/* spi0 */
+static const unsigned int spi0_clk_pins[] = {GPIOZ_0};
+static const unsigned int spi0_mosi_pins[] = {GPIOZ_1};
+static const unsigned int spi0_miso_pins[] = {GPIOZ_2};
+static const unsigned int spi0_ss0_pins[] = {GPIOZ_3};
+static const unsigned int spi0_ss1_pins[] = {GPIOZ_4};
+static const unsigned int spi0_ss2_pins[] = {GPIOZ_5};
+
+/* spi1 */
+static const unsigned int spi1_clk_x_pins[] = {GPIOX_19};
+static const unsigned int spi1_mosi_x_pins[] = {GPIOX_17};
+static const unsigned int spi1_miso_x_pins[] = {GPIOX_18};
+static const unsigned int spi1_ss0_x_pins[] = {GPIOX_16};
+
+static const unsigned int spi1_clk_a_pins[] = {GPIOA_4};
+static const unsigned int spi1_mosi_a_pins[] = {GPIOA_2};
+static const unsigned int spi1_miso_a_pins[] = {GPIOA_3};
+static const unsigned int spi1_ss0_a_pins[] = {GPIOA_5};
+static const unsigned int spi1_ss1_pins[] = {GPIOA_6};
+
+/* i2c0 */
+static const unsigned int i2c0_sck_pins[] = {GPIOZ_6};
+static const unsigned int i2c0_sda_pins[] = {GPIOZ_7};
+
+/* i2c1 */
+static const unsigned int i2c1_sck_z_pins[] = {GPIOZ_8};
+static const unsigned int i2c1_sda_z_pins[] = {GPIOZ_9};
+
+static const unsigned int i2c1_sck_x_pins[] = {GPIOX_16};
+static const unsigned int i2c1_sda_x_pins[] = {GPIOX_17};
+
+/* i2c2 */
+static const unsigned int i2c2_sck_x_pins[] = {GPIOX_18};
+static const unsigned int i2c2_sda_x_pins[] = {GPIOX_19};
+
+static const unsigned int i2c2_sda_a_pins[] = {GPIOA_17};
+static const unsigned int i2c2_sck_a_pins[] = {GPIOA_18};
+
+/* i2c3 */
+static const unsigned int i2c3_sda_a6_pins[] = {GPIOA_6};
+static const unsigned int i2c3_sck_a7_pins[] = {GPIOA_7};
+
+static const unsigned int i2c3_sda_a12_pins[] = {GPIOA_12};
+static const unsigned int i2c3_sck_a13_pins[] = {GPIOA_13};
+
+static const unsigned int i2c3_sda_a19_pins[] = {GPIOA_19};
+static const unsigned int i2c3_sck_a20_pins[] = {GPIOA_20};
+
+/* uart_a */
+static const unsigned int uart_rts_a_pins[] = {GPIOX_11};
+static const unsigned int uart_cts_a_pins[] = {GPIOX_10};
+static const unsigned int uart_tx_a_pins[] = {GPIOX_8};
+static const unsigned int uart_rx_a_pins[] = {GPIOX_9};
+
+/* uart_b */
+static const unsigned int uart_rts_b_z_pins[] = {GPIOZ_0};
+static const unsigned int uart_cts_b_z_pins[] = {GPIOZ_1};
+static const unsigned int uart_tx_b_z_pins[] = {GPIOZ_2};
+static const unsigned int uart_rx_b_z_pins[] = {GPIOZ_3};
+
+static const unsigned int uart_rts_b_x_pins[] = {GPIOX_18};
+static const unsigned int uart_cts_b_x_pins[] = {GPIOX_19};
+static const unsigned int uart_tx_b_x_pins[] = {GPIOX_16};
+static const unsigned int uart_rx_b_x_pins[] = {GPIOX_17};
+
+/* uart_ao_b */
+static const unsigned int uart_ao_tx_b_z_pins[] = {GPIOZ_8};
+static const unsigned int uart_ao_rx_b_z_pins[] = {GPIOZ_9};
+static const unsigned int uart_ao_cts_b_z_pins[] = {GPIOZ_6};
+static const unsigned int uart_ao_rts_b_z_pins[] = {GPIOZ_7};
+
+/* pwm_a */
+static const unsigned int pwm_a_z_pins[] = {GPIOZ_5};
+
+static const unsigned int pwm_a_x18_pins[] = {GPIOX_18};
+static const unsigned int pwm_a_x20_pins[] = {GPIOX_20};
+
+static const unsigned int pwm_a_a_pins[] = {GPIOA_14};
+
+/* pwm_b */
+static const unsigned int pwm_b_z_pins[] = {GPIOZ_4};
+
+static const unsigned int pwm_b_x_pins[] = {GPIOX_19};
+
+static const unsigned int pwm_b_a_pins[] = {GPIOA_15};
+
+/* pwm_c */
+static const unsigned int pwm_c_x10_pins[] = {GPIOX_10};
+static const unsigned int pwm_c_x17_pins[] = {GPIOX_17};
+
+static const unsigned int pwm_c_a_pins[] = {GPIOA_16};
+
+/* pwm_d */
+static const unsigned int pwm_d_x11_pins[] = {GPIOX_11};
+static const unsigned int pwm_d_x16_pins[] = {GPIOX_16};
+
+/* pwm_vs */
+static const unsigned int pwm_vs_pins[] = {GPIOA_0};
+
+/* spdif_in */
+static const unsigned int spdif_in_z_pins[] = {GPIOZ_4};
+
+static const unsigned int spdif_in_a1_pins[] = {GPIOA_1};
+static const unsigned int spdif_in_a7_pins[] = {GPIOA_7};
+static const unsigned int spdif_in_a19_pins[] = {GPIOA_19};
+static const unsigned int spdif_in_a20_pins[] = {GPIOA_20};
+
+/* spdif_out */
+static const unsigned int spdif_out_z_pins[] = {GPIOZ_5};
+
+static const unsigned int spdif_out_a1_pins[] = {GPIOA_1};
+static const unsigned int spdif_out_a11_pins[] = {GPIOA_11};
+static const unsigned int spdif_out_a19_pins[] = {GPIOA_19};
+static const unsigned int spdif_out_a20_pins[] = {GPIOA_20};
+
+/* jtag_ee */
+static const unsigned int jtag_tdo_x_pins[] = {GPIOX_0};
+static const unsigned int jtag_tdi_x_pins[] = {GPIOX_1};
+static const unsigned int jtag_clk_x_pins[] = {GPIOX_4};
+static const unsigned int jtag_tms_x_pins[] = {GPIOX_5};
+
+/* eth */
+static const unsigned int eth_txd0_x_pins[] = {GPIOX_8};
+static const unsigned int eth_txd1_x_pins[] = {GPIOX_9};
+static const unsigned int eth_txen_x_pins[] = {GPIOX_10};
+static const unsigned int eth_rgmii_rx_clk_x_pins[] = {GPIOX_12};
+static const unsigned int eth_rxd0_x_pins[] = {GPIOX_13};
+static const unsigned int eth_rxd1_x_pins[] = {GPIOX_14};
+static const unsigned int eth_rx_dv_x_pins[] = {GPIOX_15};
+static const unsigned int eth_mdio_x_pins[] = {GPIOX_21};
+static const unsigned int eth_mdc_x_pins[] = {GPIOX_22};
+
+static const unsigned int eth_txd0_y_pins[] = {GPIOY_10};
+static const unsigned int eth_txd1_y_pins[] = {GPIOY_11};
+static const unsigned int eth_txen_y_pins[] = {GPIOY_9};
+static const unsigned int eth_rgmii_rx_clk_y_pins[] = {GPIOY_2};
+static const unsigned int eth_rxd0_y_pins[] = {GPIOY_4};
+static const unsigned int eth_rxd1_y_pins[] = {GPIOY_5};
+static const unsigned int eth_rx_dv_y_pins[] = {GPIOY_3};
+static const unsigned int eth_mdio_y_pins[] = {GPIOY_0};
+static const unsigned int eth_mdc_y_pins[] = {GPIOY_1};
+
+static const unsigned int eth_rxd2_rgmii_pins[] = {GPIOY_6};
+static const unsigned int eth_rxd3_rgmii_pins[] = {GPIOY_7};
+static const unsigned int eth_rgmii_tx_clk_pins[] = {GPIOY_8};
+static const unsigned int eth_txd2_rgmii_pins[] = {GPIOY_12};
+static const unsigned int eth_txd3_rgmii_pins[] = {GPIOY_13};
+
+/* pdm */
+static const unsigned int pdm_dclk_a14_pins[] = {GPIOA_14};
+static const unsigned int pdm_dclk_a19_pins[] = {GPIOA_19};
+static const unsigned int pdm_din0_pins[] = {GPIOA_15};
+static const unsigned int pdm_din1_pins[] = {GPIOA_16};
+static const unsigned int pdm_din2_pins[] = {GPIOA_17};
+static const unsigned int pdm_din3_pins[] = {GPIOA_18};
+
+static struct meson_pmx_group meson_axg_periphs_groups[] = {
+       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(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(GPIOA_0),
+       GPIO_GROUP(GPIOA_1),
+       GPIO_GROUP(GPIOA_2),
+       GPIO_GROUP(GPIOA_3),
+       GPIO_GROUP(GPIOA_4),
+       GPIO_GROUP(GPIOA_5),
+       GPIO_GROUP(GPIOA_6),
+       GPIO_GROUP(GPIOA_7),
+       GPIO_GROUP(GPIOA_8),
+       GPIO_GROUP(GPIOA_9),
+       GPIO_GROUP(GPIOA_10),
+       GPIO_GROUP(GPIOA_11),
+       GPIO_GROUP(GPIOA_12),
+       GPIO_GROUP(GPIOA_13),
+       GPIO_GROUP(GPIOA_14),
+       GPIO_GROUP(GPIOA_15),
+       GPIO_GROUP(GPIOA_16),
+       GPIO_GROUP(GPIOA_17),
+       GPIO_GROUP(GPIOA_19),
+       GPIO_GROUP(GPIOA_20),
+
+       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(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),
+
+       /* bank BOOT */
+       GROUP(emmc_nand_d0, 1),
+       GROUP(emmc_nand_d1, 1),
+       GROUP(emmc_nand_d2, 1),
+       GROUP(emmc_nand_d3, 1),
+       GROUP(emmc_nand_d4, 1),
+       GROUP(emmc_nand_d5, 1),
+       GROUP(emmc_nand_d6, 1),
+       GROUP(emmc_nand_d7, 1),
+       GROUP(emmc_clk, 1),
+       GROUP(emmc_cmd, 1),
+       GROUP(emmc_ds, 1),
+       GROUP(nand_ce0, 2),
+       GROUP(nand_ale, 2),
+       GROUP(nand_cle, 2),
+       GROUP(nand_wen_clk, 2),
+       GROUP(nand_ren_wr, 2),
+       GROUP(nand_rb0, 2),
+       GROUP(nor_hold, 3),
+       GROUP(nor_d, 3),
+       GROUP(nor_q, 3),
+       GROUP(nor_c, 3),
+       GROUP(nor_wp, 3),
+       GROUP(nor_cs, 3),
+
+       /* bank GPIOZ */
+       GROUP(spi0_clk, 1),
+       GROUP(spi0_mosi, 1),
+       GROUP(spi0_miso, 1),
+       GROUP(spi0_ss0, 1),
+       GROUP(spi0_ss1, 1),
+       GROUP(spi0_ss2, 1),
+       GROUP(i2c0_sck, 1),
+       GROUP(i2c0_sda, 1),
+       GROUP(i2c1_sck_z, 1),
+       GROUP(i2c1_sda_z, 1),
+       GROUP(uart_rts_b_z, 2),
+       GROUP(uart_cts_b_z, 2),
+       GROUP(uart_tx_b_z, 2),
+       GROUP(uart_rx_b_z, 2),
+       GROUP(pwm_a_z, 2),
+       GROUP(pwm_b_z, 2),
+       GROUP(spdif_in_z, 3),
+       GROUP(spdif_out_z, 3),
+       GROUP(uart_ao_tx_b_z, 2),
+       GROUP(uart_ao_rx_b_z, 2),
+       GROUP(uart_ao_cts_b_z, 2),
+       GROUP(uart_ao_rts_b_z, 2),
+
+       /* bank GPIOX */
+       GROUP(sdio_d0, 1),
+       GROUP(sdio_d1, 1),
+       GROUP(sdio_d2, 1),
+       GROUP(sdio_d3, 1),
+       GROUP(sdio_clk, 1),
+       GROUP(sdio_cmd, 1),
+       GROUP(i2c1_sck_x, 1),
+       GROUP(i2c1_sda_x, 1),
+       GROUP(i2c2_sck_x, 1),
+       GROUP(i2c2_sda_x, 1),
+       GROUP(uart_rts_a, 1),
+       GROUP(uart_cts_a, 1),
+       GROUP(uart_tx_a, 1),
+       GROUP(uart_rx_a, 1),
+       GROUP(uart_rts_b_x, 2),
+       GROUP(uart_cts_b_x, 2),
+       GROUP(uart_tx_b_x, 2),
+       GROUP(uart_rx_b_x, 2),
+       GROUP(jtag_tdo_x, 2),
+       GROUP(jtag_tdi_x, 2),
+       GROUP(jtag_clk_x, 2),
+       GROUP(jtag_tms_x, 2),
+       GROUP(spi1_clk_x, 4),
+       GROUP(spi1_mosi_x, 4),
+       GROUP(spi1_miso_x, 4),
+       GROUP(spi1_ss0_x, 4),
+       GROUP(pwm_a_x18, 3),
+       GROUP(pwm_a_x20, 1),
+       GROUP(pwm_b_x, 3),
+       GROUP(pwm_c_x10, 3),
+       GROUP(pwm_c_x17, 3),
+       GROUP(pwm_d_x11, 3),
+       GROUP(pwm_d_x16, 3),
+       GROUP(eth_txd0_x, 4),
+       GROUP(eth_txd1_x, 4),
+       GROUP(eth_txen_x, 4),
+       GROUP(eth_rgmii_rx_clk_x, 4),
+       GROUP(eth_rxd0_x, 4),
+       GROUP(eth_rxd1_x, 4),
+       GROUP(eth_rx_dv_x, 4),
+       GROUP(eth_mdio_x, 4),
+       GROUP(eth_mdc_x, 4),
+
+       /* bank GPIOY */
+       GROUP(eth_txd0_y, 1),
+       GROUP(eth_txd1_y, 1),
+       GROUP(eth_txen_y, 1),
+       GROUP(eth_rgmii_rx_clk_y, 1),
+       GROUP(eth_rxd0_y, 1),
+       GROUP(eth_rxd1_y, 1),
+       GROUP(eth_rx_dv_y, 1),
+       GROUP(eth_mdio_y, 1),
+       GROUP(eth_mdc_y, 1),
+       GROUP(eth_rxd2_rgmii, 1),
+       GROUP(eth_rxd3_rgmii, 1),
+       GROUP(eth_rgmii_tx_clk, 1),
+       GROUP(eth_txd2_rgmii, 1),
+       GROUP(eth_txd3_rgmii, 1),
+
+       /* bank GPIOA */
+       GROUP(spdif_out_a1, 4),
+       GROUP(spdif_out_a11, 3),
+       GROUP(spdif_out_a19, 2),
+       GROUP(spdif_out_a20, 1),
+       GROUP(spdif_in_a1, 3),
+       GROUP(spdif_in_a7, 3),
+       GROUP(spdif_in_a19, 1),
+       GROUP(spdif_in_a20, 2),
+       GROUP(spi1_clk_a, 3),
+       GROUP(spi1_mosi_a, 3),
+       GROUP(spi1_miso_a, 3),
+       GROUP(spi1_ss0_a, 3),
+       GROUP(spi1_ss1, 3),
+       GROUP(pwm_a_a, 3),
+       GROUP(pwm_b_a, 3),
+       GROUP(pwm_c_a, 3),
+       GROUP(pwm_vs, 2),
+       GROUP(i2c2_sda_a, 3),
+       GROUP(i2c2_sck_a, 3),
+       GROUP(i2c3_sda_a6, 4),
+       GROUP(i2c3_sck_a7, 4),
+       GROUP(i2c3_sda_a12, 4),
+       GROUP(i2c3_sck_a13, 4),
+       GROUP(i2c3_sda_a19, 4),
+       GROUP(i2c3_sck_a20, 4),
+       GROUP(pdm_dclk_a14, 1),
+       GROUP(pdm_dclk_a19, 3),
+       GROUP(pdm_din0, 1),
+       GROUP(pdm_din1, 1),
+       GROUP(pdm_din2, 1),
+       GROUP(pdm_din3, 1),
+};
+
+/* uart_ao_a */
+static const unsigned int uart_ao_tx_a_pins[] = {GPIOAO_0};
+static const unsigned int uart_ao_rx_a_pins[] = {GPIOAO_1};
+static const unsigned int uart_ao_cts_a_pins[] = {GPIOAO_2};
+static const unsigned int uart_ao_rts_a_pins[] = {GPIOAO_3};
+
+/* uart_ao_b */
+static const unsigned int uart_ao_tx_b_pins[] = {GPIOAO_4};
+static const unsigned int uart_ao_rx_b_pins[] = {GPIOAO_5};
+static const unsigned int uart_ao_cts_b_pins[] = {GPIOAO_2};
+static const unsigned int uart_ao_rts_b_pins[] = {GPIOAO_3};
+
+/* i2c_ao */
+static const unsigned int i2c_ao_sck_4_pins[] = {GPIOAO_4};
+static const unsigned int i2c_ao_sda_5_pins[] = {GPIOAO_5};
+static const unsigned int i2c_ao_sck_8_pins[] = {GPIOAO_8};
+static const unsigned int i2c_ao_sda_9_pins[] = {GPIOAO_9};
+static const unsigned int i2c_ao_sck_10_pins[] = {GPIOAO_10};
+static const unsigned int i2c_ao_sda_11_pins[] = {GPIOAO_11};
+
+/* i2c_ao_slave */
+static const unsigned int i2c_ao_slave_sck_pins[] = {GPIOAO_10};
+static const unsigned int i2c_ao_slave_sda_pins[] = {GPIOAO_11};
+
+/* ir_in */
+static const unsigned int remote_input_ao_pins[] = {GPIOAO_6};
+
+/* ir_out */
+static const unsigned int remote_out_ao_pins[] = {GPIOAO_7};
+
+/* pwm_ao_a */
+static const unsigned int pwm_ao_a_pins[] = {GPIOAO_3};
+
+/* pwm_ao_b */
+static const unsigned int pwm_ao_b_ao2_pins[] = {GPIOAO_2};
+static const unsigned int pwm_ao_b_ao12_pins[] = {GPIOAO_12};
+
+/* pwm_ao_c */
+static const unsigned int pwm_ao_c_ao8_pins[] = {GPIOAO_8};
+static const unsigned int pwm_ao_c_ao13_pins[] = {GPIOAO_13};
+
+/* pwm_ao_d */
+static const unsigned int pwm_ao_d_pins[] = {GPIOAO_9};
+
+/* jtag_ao */
+static const unsigned int jtag_ao_tdi_pins[] = {GPIOAO_3};
+static const unsigned int jtag_ao_tdo_pins[] = {GPIOAO_4};
+static const unsigned int jtag_ao_clk_pins[] = {GPIOAO_5};
+static const unsigned int jtag_ao_tms_pins[] = {GPIOAO_7};
+
+static struct meson_pmx_group meson_axg_aobus_groups[] = {
+       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_TEST_N),
+
+       /* bank AO */
+       GROUP(uart_ao_tx_a, 1),
+       GROUP(uart_ao_rx_a, 1),
+       GROUP(uart_ao_cts_a, 2),
+       GROUP(uart_ao_rts_a, 2),
+       GROUP(uart_ao_tx_b, 1),
+       GROUP(uart_ao_rx_b, 1),
+       GROUP(uart_ao_cts_b, 1),
+       GROUP(uart_ao_rts_b, 1),
+       GROUP(i2c_ao_sck_4, 2),
+       GROUP(i2c_ao_sda_5, 2),
+       GROUP(i2c_ao_sck_8, 2),
+       GROUP(i2c_ao_sda_9, 2),
+       GROUP(i2c_ao_sck_10, 2),
+       GROUP(i2c_ao_sda_11, 2),
+       GROUP(i2c_ao_slave_sck, 1),
+       GROUP(i2c_ao_slave_sda, 1),
+       GROUP(remote_input_ao, 1),
+       GROUP(remote_out_ao, 1),
+       GROUP(pwm_ao_a, 3),
+       GROUP(pwm_ao_b_ao2, 3),
+       GROUP(pwm_ao_b_ao12, 3),
+       GROUP(pwm_ao_c_ao8, 3),
+       GROUP(pwm_ao_c_ao13, 3),
+       GROUP(pwm_ao_d, 3),
+       GROUP(jtag_ao_tdi, 4),
+       GROUP(jtag_ao_tdo, 4),
+       GROUP(jtag_ao_clk, 4),
+       GROUP(jtag_ao_tms, 4),
+};
+
+static const char * const gpio_periphs_groups[] = {
+       "GPIOZ_0", "GPIOZ_1", "GPIOZ_2", "GPIOZ_3", "GPIOZ_4",
+       "GPIOZ_5", "GPIOZ_6", "GPIOZ_7", "GPIOZ_8", "GPIOZ_9",
+       "GPIOZ_10",
+
+       "BOOT_0", "BOOT_1", "BOOT_2", "BOOT_3", "BOOT_4",
+       "BOOT_5", "BOOT_6", "BOOT_7", "BOOT_8", "BOOT_9",
+       "BOOT_10", "BOOT_11", "BOOT_12", "BOOT_13", "BOOT_14",
+
+       "GPIOA_0", "GPIOA_1", "GPIOA_2", "GPIOA_3", "GPIOA_4",
+       "GPIOA_5", "GPIOA_6", "GPIOA_7", "GPIOA_8", "GPIOA_9",
+       "GPIOA_10", "GPIOA_11", "GPIOA_12", "GPIOA_13", "GPIOA_14",
+       "GPIOA_15", "GPIOA_16", "GPIOA_17", "GPIOA_18", "GPIOA_19",
+       "GPIOA_20",
+
+       "GPIOX_0", "GPIOX_1", "GPIOX_2", "GPIOX_3", "GPIOX_4",
+       "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", "GPIOX_19",
+       "GPIOX_20", "GPIOX_21", "GPIOX_22",
+
+       "GPIOY_0", "GPIOY_1", "GPIOY_2", "GPIOY_3", "GPIOY_4",
+       "GPIOY_5", "GPIOY_6", "GPIOY_7", "GPIOY_8", "GPIOY_9",
+       "GPIOY_10", "GPIOY_11", "GPIOY_12", "GPIOY_13", "GPIOY_14",
+       "GPIOY_15",
+};
+
+static const char * const emmc_groups[] = {
+       "emmc_nand_d0", "emmc_nand_d1", "emmc_nand_d2",
+       "emmc_nand_d3", "emmc_nand_d4", "emmc_nand_d5",
+       "emmc_nand_d6", "emmc_nand_d7",
+       "emmc_clk", "emmc_cmd", "emmc_ds",
+};
+
+static const char * const nand_groups[] = {
+       "emmc_nand_d0", "emmc_nand_d1", "emmc_nand_d2",
+       "emmc_nand_d3", "emmc_nand_d4", "emmc_nand_d5",
+       "emmc_nand_d6", "emmc_nand_d7",
+       "nand_ce0", "nand_ale", "nand_cle",
+       "nand_wen_clk", "nand_ren_wr", "nand_rb0",
+};
+
+static const char * const nor_groups[] = {
+       "nor_d", "nor_q", "nor_c", "nor_cs",
+       "nor_hold", "nor_wp",
+};
+
+static const char * const sdio_groups[] = {
+       "sdio_d0", "sdio_d1", "sdio_d2", "sdio_d3",
+       "sdio_cmd", "sdio_clk",
+};
+
+static const char * const spi0_groups[] = {
+       "spi0_clk", "spi0_mosi", "spi0_miso", "spi0_ss0",
+       "spi0_ss1", "spi0_ss2"
+};
+
+static const char * const spi1_groups[] = {
+       "spi1_clk_x", "spi1_mosi_x", "spi1_miso_x", "spi1_ss0_x",
+       "spi1_clk_a", "spi1_mosi_a", "spi1_miso_a", "spi1_ss0_a",
+       "spi1_ss1"
+};
+
+static const char * const uart_a_groups[] = {
+       "uart_tx_a", "uart_rx_a", "uart_cts_a", "uart_rts_a",
+};
+
+static const char * const uart_b_groups[] = {
+       "uart_tx_b_z", "uart_rx_b_z", "uart_cts_b_z", "uart_rts_b_z",
+       "uart_tx_b_x", "uart_rx_b_x", "uart_cts_b_x", "uart_rts_b_x",
+};
+
+static const char * const uart_ao_b_gpioz_groups[] = {
+       "uart_ao_tx_b_z", "uart_ao_rx_b_z",
+       "uart_ao_cts_b_z", "uart_ao_rts_b_z",
+};
+
+static const char * const i2c0_groups[] = {
+       "i2c0_sck", "i2c0_sda",
+};
+
+static const char * const i2c1_groups[] = {
+       "i2c1_sck_z", "i2c1_sda_z",
+       "i2c1_sck_x", "i2c1_sda_x",
+};
+
+static const char * const i2c2_groups[] = {
+       "i2c2_sck_x", "i2c2_sda_x",
+       "i2c2_sda_a", "i2c2_sck_a",
+};
+
+static const char * const i2c3_groups[] = {
+       "i2c3_sda_a6", "i2c3_sck_a7",
+       "i2c3_sda_a12", "i2c3_sck_a13",
+       "i2c3_sda_a19", "i2c3_sck_a20",
+};
+
+static const char * const eth_groups[] = {
+       "eth_rxd2_rgmii", "eth_rxd3_rgmii", "eth_rgmii_tx_clk",
+       "eth_txd2_rgmii", "eth_txd3_rgmii",
+       "eth_txd0_x", "eth_txd1_x", "eth_txen_x", "eth_rgmii_rx_clk_x",
+       "eth_rxd0_x", "eth_rxd1_x", "eth_rx_dv_x", "eth_mdio_x",
+       "eth_mdc_x",
+       "eth_txd0_y", "eth_txd1_y", "eth_txen_y", "eth_rgmii_rx_clk_y",
+       "eth_rxd0_y", "eth_rxd1_y", "eth_rx_dv_y", "eth_mdio_y",
+       "eth_mdc_y",
+};
+
+static const char * const pwm_a_groups[] = {
+       "pwm_a_z", "pwm_a_x18", "pwm_a_x20", "pwm_a_a",
+};
+
+static const char * const pwm_b_groups[] = {
+       "pwm_b_z", "pwm_b_x", "pwm_b_a",
+};
+
+static const char * const pwm_c_groups[] = {
+       "pwm_c_x10", "pwm_c_x17", "pwm_c_a",
+};
+
+static const char * const pwm_d_groups[] = {
+       "pwm_d_x11", "pwm_d_x16",
+};
+
+static const char * const pwm_vs_groups[] = {
+       "pwm_vs",
+};
+
+static const char * const spdif_out_groups[] = {
+       "spdif_out_z", "spdif_out_a1", "spdif_out_a11",
+       "spdif_out_a19", "spdif_out_a20",
+};
+
+static const char * const spdif_in_groups[] = {
+       "spdif_in_z", "spdif_in_a1", "spdif_in_a7",
+       "spdif_in_a19", "spdif_in_a20",
+};
+
+static const char * const jtag_ee_groups[] = {
+       "jtag_tdo_x", "jtag_tdi_x", "jtag_clk_x",
+       "jtag_tms_x",
+};
+
+static const char * const pdm_groups[] = {
+       "pdm_din0", "pdm_din1", "pdm_din2", "pdm_din3",
+       "pdm_dclk_a14", "pdm_dclk_a19",
+};
+
+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_a_groups[] = {
+       "uart_ao_tx_a", "uart_ao_rx_a", "uart_ao_cts_a", "uart_ao_rts_a",
+};
+
+static const char * const uart_ao_b_groups[] = {
+       "uart_ao_tx_b", "uart_ao_rx_b", "uart_ao_cts_b", "uart_ao_rts_b",
+};
+
+static const char * const i2c_ao_groups[] = {
+       "i2c_ao_sck_4", "i2c_ao_sda_5",
+       "i2c_ao_sck_8", "i2c_ao_sda_9",
+       "i2c_ao_sck_10", "i2c_ao_sda_11",
+};
+
+static const char * const i2c_ao_slave_groups[] = {
+       "i2c_ao_slave_sck", "i2c_ao_slave_sda",
+};
+
+static const char * const remote_input_ao_groups[] = {
+       "remote_input_ao",
+};
+
+static const char * const remote_out_ao_groups[] = {
+       "remote_out_ao",
+};
+
+static const char * const pwm_ao_a_groups[] = {
+       "pwm_ao_a",
+};
+
+static const char * const pwm_ao_b_groups[] = {
+       "pwm_ao_b_ao2", "pwm_ao_b_ao12",
+};
+
+static const char * const pwm_ao_c_groups[] = {
+       "pwm_ao_c_ao8", "pwm_ao_c_ao13",
+};
+
+static const char * const pwm_ao_d_groups[] = {
+       "pwm_ao_d",
+};
+
+static const char * const jtag_ao_groups[] = {
+       "jtag_ao_tdi", "jtag_ao_tdo", "jtag_ao_clk", "jtag_ao_tms",
+};
+
+static struct meson_pmx_func meson_axg_periphs_functions[] = {
+       FUNCTION(gpio_periphs),
+       FUNCTION(emmc),
+       FUNCTION(nor),
+       FUNCTION(spi0),
+       FUNCTION(spi1),
+       FUNCTION(sdio),
+       FUNCTION(nand),
+       FUNCTION(uart_a),
+       FUNCTION(uart_b),
+       FUNCTION(uart_ao_b_gpioz),
+       FUNCTION(i2c0),
+       FUNCTION(i2c1),
+       FUNCTION(i2c2),
+       FUNCTION(i2c3),
+       FUNCTION(eth),
+       FUNCTION(pwm_a),
+       FUNCTION(pwm_b),
+       FUNCTION(pwm_c),
+       FUNCTION(pwm_d),
+       FUNCTION(pwm_vs),
+       FUNCTION(spdif_out),
+       FUNCTION(spdif_in),
+       FUNCTION(jtag_ee),
+       FUNCTION(pdm),
+};
+
+static struct meson_pmx_func meson_axg_aobus_functions[] = {
+       FUNCTION(gpio_aobus),
+       FUNCTION(uart_ao_a),
+       FUNCTION(uart_ao_b),
+       FUNCTION(i2c_ao),
+       FUNCTION(i2c_ao_slave),
+       FUNCTION(remote_input_ao),
+       FUNCTION(remote_out_ao),
+       FUNCTION(pwm_ao_a),
+       FUNCTION(pwm_ao_b),
+       FUNCTION(pwm_ao_c),
+       FUNCTION(pwm_ao_d),
+       FUNCTION(jtag_ao),
+};
+
+static struct meson_bank meson_axg_periphs_banks[] = {
+       /*   name    first      last       irq       pullen  pull    dir     out     in  */
+       BANK("Z",    GPIOZ_0,   GPIOZ_10, 14,  24, 3,  0,  3,  0,  9,  0,  10, 0,  11, 0),
+       BANK("BOOT", BOOT_0,    BOOT_14,  25,  39, 4,  0,  4,  0,  12, 0,  13, 0,  14, 0),
+       BANK("A",    GPIOA_0,   GPIOA_20, 40,  60, 0,  0,  0,  0,  0,  0,  1,  0,  2,  0),
+       BANK("X",    GPIOX_0,   GPIOX_22, 61,  83, 2,  0,  2,  0,  6,  0,  7,  0,  8,  0),
+       BANK("Y",        GPIOY_0,       GPIOY_15, 84,  99, 1,  0,  1,  0,  3,  0,  4,  0,  5,  0),
+};
+
+static struct meson_bank meson_axg_aobus_banks[] = {
+       /*   name    first      last      irq   pullen  pull    dir     out     in  */
+       BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 13, 0,  16,  0, 0,  0,  0,  0, 16,  1,  0),
+};
+
+static struct meson_pmx_bank meson_axg_periphs_pmx_banks[] = {
+       /*       name    first          lask       reg  offset  */
+       BANK_PMX("Z",    GPIOZ_0, GPIOZ_10, 0x2, 0),
+       BANK_PMX("BOOT", BOOT_0,  BOOT_14,  0x0, 0),
+       BANK_PMX("A",    GPIOA_0, GPIOA_20, 0xb, 0),
+       BANK_PMX("X",    GPIOX_0, GPIOX_22, 0x4, 0),
+       BANK_PMX("Y",    GPIOY_0, GPIOY_15, 0x8, 0),
+};
+
+static struct meson_axg_pmx_data meson_axg_periphs_pmx_banks_data = {
+       .pmx_banks      = meson_axg_periphs_pmx_banks,
+       .num_pmx_banks = ARRAY_SIZE(meson_axg_periphs_pmx_banks),
+};
+
+static struct meson_pmx_bank meson_axg_aobus_pmx_banks[] = {
+       BANK_PMX("AO", GPIOAO_0, GPIOAO_13, 0x0, 0),
+};
+
+static struct meson_axg_pmx_data meson_axg_aobus_pmx_banks_data = {
+       .pmx_banks      = meson_axg_aobus_pmx_banks,
+       .num_pmx_banks = ARRAY_SIZE(meson_axg_aobus_pmx_banks),
+};
+
+static struct meson_pinctrl_data meson_axg_periphs_pinctrl_data = {
+       .name           = "periphs-banks",
+       .pins           = meson_axg_periphs_pins,
+       .groups         = meson_axg_periphs_groups,
+       .funcs          = meson_axg_periphs_functions,
+       .banks          = meson_axg_periphs_banks,
+       .num_pins       = ARRAY_SIZE(meson_axg_periphs_pins),
+       .num_groups     = ARRAY_SIZE(meson_axg_periphs_groups),
+       .num_funcs      = ARRAY_SIZE(meson_axg_periphs_functions),
+       .num_banks      = ARRAY_SIZE(meson_axg_periphs_banks),
+       .pmx_ops        = &meson_axg_pmx_ops,
+       .pmx_data       = &meson_axg_periphs_pmx_banks_data,
+};
+
+static struct meson_pinctrl_data meson_axg_aobus_pinctrl_data = {
+       .name           = "aobus-banks",
+       .pins           = meson_axg_aobus_pins,
+       .groups         = meson_axg_aobus_groups,
+       .funcs          = meson_axg_aobus_functions,
+       .banks          = meson_axg_aobus_banks,
+       .num_pins       = ARRAY_SIZE(meson_axg_aobus_pins),
+       .num_groups     = ARRAY_SIZE(meson_axg_aobus_groups),
+       .num_funcs      = ARRAY_SIZE(meson_axg_aobus_functions),
+       .num_banks      = ARRAY_SIZE(meson_axg_aobus_banks),
+       .pmx_ops        = &meson_axg_pmx_ops,
+       .pmx_data       = &meson_axg_aobus_pmx_banks_data,
+};
+
+static const struct of_device_id meson_axg_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson-axg-periphs-pinctrl",
+               .data = &meson_axg_periphs_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson-axg-aobus-pinctrl",
+               .data = &meson_axg_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson_axg_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson-axg-pinctrl",
+               .of_match_table = meson_axg_pinctrl_dt_match,
+       },
+};
+
+builtin_platform_driver(meson_axg_pinctrl_driver);
index 183b6e471635f2d14cd38a9418ad6718a7ba9d13..12a3911093290263731f663e4b308c68583b3100 100644 (file)
@@ -108,6 +108,7 @@ struct meson_pinctrl_data {
        struct meson_bank *banks;
        unsigned int num_banks;
        const struct pinmux_ops *pmx_ops;
+       void *pmx_data;
 };
 
 struct meson_pinctrl {
index bdb8d174efefb7ee897c60bab250a126a53af729..5b63248c82090a4fbc681bf33a43ac05f3f12b5d 100644 (file)
@@ -1006,11 +1006,11 @@ static int armada_37xx_pinctrl_register(struct platform_device *pdev,
 static const struct of_device_id armada_37xx_pinctrl_of_match[] = {
        {
                .compatible = "marvell,armada3710-sb-pinctrl",
-               .data = (void *)&armada_37xx_pin_sb,
+               .data = &armada_37xx_pin_sb,
        },
        {
                .compatible = "marvell,armada3710-nb-pinctrl",
-               .data = (void *)&armada_37xx_pin_nb,
+               .data = &armada_37xx_pin_nb,
        },
        { },
 };
index 163d4614b0f80233957d23a13949fe32330bb6be..9e05cfaf75f020d60595bf8ee0172170bd81bf56 100644 (file)
@@ -636,10 +636,9 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
         */
        size = pctl->num_groups * sizeof(*pctl->groups) + noname * 8;
        p = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
-       if (!p) {
-               dev_err(&pdev->dev, "failed to alloc group data\n");
+       if (!p)
                return -ENOMEM;
-       }
+
        pctl->groups = p;
        noname_buf = p + pctl->num_groups * sizeof(*pctl->groups);
 
index b32c0d6020247e0d7d5e0c2cdb5d516643942a0b..d56a49e53f56c5493522c1eb15f2ca0a0e8b9252 100644 (file)
@@ -633,7 +633,7 @@ static void abx500_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
        for (i = 0; i < chip->ngpio; i++, gpio++) {
                /* On AB8500, there is no GPIO0, the first is the GPIO 1 */
                abx500_gpio_dbg_show_one(s, pctldev, chip, i + 1, gpio);
-               seq_printf(s, "\n");
+               seq_putc(s, '\n');
        }
 }
 
@@ -1155,13 +1155,9 @@ static int abx500_gpio_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
-       pct = devm_kzalloc(&pdev->dev, sizeof(struct abx500_pinctrl),
-                                  GFP_KERNEL);
-       if (pct == NULL) {
-               dev_err(&pdev->dev,
-                       "failed to allocate memory for pct\n");
+       pct = devm_kzalloc(&pdev->dev, sizeof(*pct), GFP_KERNEL);
+       if (!pct)
                return -ENOMEM;
-       }
 
        pct->dev = &pdev->dev;
        pct->parent = dev_get_drvdata(pdev->dev.parent);
index 56aa181084ac9acc01b2b3689c9019fa921970bb..094a451db2a29beb81a92e062f5f8db98b77bc54 100644 (file)
@@ -827,13 +827,10 @@ static int adi_gpio_pint_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct resource *res;
-       struct gpio_pint *pint;
+       struct gpio_pint *pint = devm_kzalloc(dev, sizeof(*pint), GFP_KERNEL);
 
-       pint = devm_kzalloc(dev, sizeof(struct gpio_pint), GFP_KERNEL);
-       if (!pint) {
-               dev_err(dev, "Memory alloc failed\n");
+       if (!pint)
                return -ENOMEM;
-       }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        pint->base = devm_ioremap_resource(dev, res);
@@ -945,11 +942,9 @@ static int adi_gpio_probe(struct platform_device *pdev)
        if (!pdata)
                return -EINVAL;
 
-       port = devm_kzalloc(dev, sizeof(struct gpio_port), GFP_KERNEL);
-       if (!port) {
-               dev_err(dev, "Memory alloc failed\n");
+       port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
+       if (!port)
                return -ENOMEM;
-       }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        port->base = devm_ioremap_resource(dev, res);
index b1ca838dd80a1c2843083b9c16d532be6ce5d40d..4b57a13758a43b49020e8d728662f1dbd5cbf7a3 100644 (file)
@@ -910,7 +910,7 @@ static int atmel_pinctrl_probe(struct platform_device *pdev)
        int i, ret;
        struct resource *res;
        struct atmel_pioctrl *atmel_pioctrl;
-       struct atmel_pioctrl_data *atmel_pioctrl_data;
+       const struct atmel_pioctrl_data *atmel_pioctrl_data;
 
        atmel_pioctrl = devm_kzalloc(dev, sizeof(*atmel_pioctrl), GFP_KERNEL);
        if (!atmel_pioctrl)
@@ -924,7 +924,7 @@ static int atmel_pinctrl_probe(struct platform_device *pdev)
                dev_err(dev, "unknown compatible string\n");
                return -ENODEV;
        }
-       atmel_pioctrl_data = (struct atmel_pioctrl_data *)match->data;
+       atmel_pioctrl_data = match->data;
        atmel_pioctrl->nbanks = atmel_pioctrl_data->nbanks;
        atmel_pioctrl->npins = atmel_pioctrl->nbanks * ATMEL_PIO_NPINS_PER_BANK;
 
index 03492e3c09fa3ff0885cb357fdbdf80c68485724..297f1d161211cc0bfce732fdf4aa87c5ada21a1c 100644 (file)
@@ -1050,10 +1050,8 @@ static int at91_pinctrl_mux_mask(struct at91_pinctrl *info,
        info->nmux = size / gpio_banks;
 
        info->mux_mask = devm_kzalloc(info->dev, sizeof(u32) * size, GFP_KERNEL);
-       if (!info->mux_mask) {
-               dev_err(info->dev, "could not alloc mux_mask\n");
+       if (!info->mux_mask)
                return -ENOMEM;
-       }
 
        ret = of_property_read_u32_array(np, "atmel,mux-mask",
                                          info->mux_mask, size);
index 22d3bb0bf927bb117af2ee6ad02a1060cc85a7c1..1231bbbfa74472d8c18de5bc310016ad64de0afe 100644 (file)
@@ -413,9 +413,11 @@ static int axp20x_pctl_probe(struct platform_device *pdev)
        pctl->chip.set                  = axp20x_gpio_set;
        pctl->chip.direction_input      = axp20x_gpio_input;
        pctl->chip.direction_output     = axp20x_gpio_output;
+
+       pctl->desc = of_device_get_match_data(dev);
+
        pctl->chip.ngpio                = pctl->desc->npins;
 
-       pctl->desc = (struct axp20x_pctrl_desc *)of_device_get_match_data(dev);
        pctl->regmap = axp20x->regmap;
        pctl->dev = &pdev->dev;
 
index c11b8f14d841e91268eb404b22bb017b83e05e8a..8c9970ae8505a91344eb9a62b05383db59e5edb4 100644 (file)
@@ -67,6 +67,9 @@ struct gemini_pmx {
  *     elements in .pins so we can iterate over that array
  * @mask: bits to clear to enable this when doing pin muxing
  * @value: bits to set to enable this when doing pin muxing
+ * @driving_mask: bitmask for the IO Pad driving register for this
+ *     group, if it supports altering the driving strength of
+ *     its lines.
  */
 struct gemini_pin_group {
        const char *name;
@@ -74,12 +77,14 @@ struct gemini_pin_group {
        const unsigned int num_pins;
        u32 mask;
        u32 value;
+       u32 driving_mask;
 };
 
 /* Some straight-forward control registers */
 #define GLOBAL_WORD_ID         0x00
 #define GLOBAL_STATUS          0x04
 #define GLOBAL_STATUS_FLPIN    BIT(20)
+#define GLOBAL_IODRIVE         0x10
 #define GLOBAL_GMAC_CTRL_SKEW  0x1c
 #define GLOBAL_GMAC0_DATA_SKEW 0x20
 #define GLOBAL_GMAC1_DATA_SKEW 0x24
@@ -738,6 +743,7 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
                /* Conflict with all flash usage */
                .value = IDE_PADS_ENABLE | NAND_PADS_DISABLE |
                        PFLASH_PADS_DISABLE | SFLASH_PADS_DISABLE,
+               .driving_mask = GENMASK(21, 20),
        },
        {
                .name = "satagrp",
@@ -753,6 +759,7 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
                .name = "gmii_gmac0_grp",
                .pins = gmii_gmac0_3512_pins,
                .num_pins = ARRAY_SIZE(gmii_gmac0_3512_pins),
+               .driving_mask = GENMASK(17, 16),
        },
        {
                .name = "gmii_gmac1_grp",
@@ -760,6 +767,7 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
                .num_pins = ARRAY_SIZE(gmii_gmac1_3512_pins),
                /* Bring out RGMII on the GMAC1 pins */
                .value = GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
+               .driving_mask = GENMASK(19, 18),
        },
        {
                .name = "pcigrp",
@@ -767,6 +775,7 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
                .num_pins = ARRAY_SIZE(pci_3512_pins),
                /* Conflict only with GPIO2 */
                .value = PCI_PADS_ENABLE | PCI_CLK_PAD_ENABLE,
+               .driving_mask = GENMASK(23, 22),
        },
        {
                .name = "lpcgrp",
@@ -1671,6 +1680,7 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
                /* Conflict with all flash usage */
                .value = IDE_PADS_ENABLE | NAND_PADS_DISABLE |
                        PFLASH_PADS_DISABLE | SFLASH_PADS_DISABLE,
+               .driving_mask = GENMASK(21, 20),
        },
        {
                .name = "satagrp",
@@ -1686,6 +1696,7 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
                .name = "gmii_gmac0_grp",
                .pins = gmii_gmac0_3516_pins,
                .num_pins = ARRAY_SIZE(gmii_gmac0_3516_pins),
+               .driving_mask = GENMASK(17, 16),
        },
        {
                .name = "gmii_gmac1_grp",
@@ -1693,6 +1704,7 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
                .num_pins = ARRAY_SIZE(gmii_gmac1_3516_pins),
                /* Bring out RGMII on the GMAC1 pins */
                .value = GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
+               .driving_mask = GENMASK(19, 18),
        },
        {
                .name = "pcigrp",
@@ -1700,6 +1712,7 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
                .num_pins = ARRAY_SIZE(pci_3516_pins),
                /* Conflict only with GPIO2 */
                .value = PCI_PADS_ENABLE | PCI_CLK_PAD_ENABLE,
+               .driving_mask = GENMASK(23, 22),
        },
        {
                .name = "lpcgrp",
@@ -2015,7 +2028,8 @@ static const char * const sflashgrps[] = { "sflashgrp" };
 static const char * const gpio0grps[] = { "gpio0agrp", "gpio0bgrp", "gpio0cgrp",
                                          "gpio0dgrp", "gpio0egrp", "gpio0fgrp",
                                          "gpio0ggrp", "gpio0hgrp", "gpio0igrp",
-                                         "gpio0jgrp", "gpio0kgrp" };
+                                         "gpio0jgrp", "gpio0kgrp", "gpio0lgrp",
+                                         "gpio0mgrp" };
 static const char * const gpio1grps[] = { "gpio1agrp", "gpio1bgrp", "gpio1cgrp",
                                          "gpio1dgrp" };
 static const char * const gpio2grps[] = { "gpio2agrp", "gpio2bgrp", "gpio2cgrp" };
@@ -2393,9 +2407,77 @@ static int gemini_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
        return ret;
 }
 
+static int gemini_pinconf_group_set(struct pinctrl_dev *pctldev,
+                                   unsigned selector,
+                                   unsigned long *configs,
+                                   unsigned num_configs)
+{
+       struct gemini_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
+       const struct gemini_pin_group *grp = NULL;
+       enum pin_config_param param;
+       u32 arg;
+       u32 val;
+       int i;
+
+       if (pmx->is_3512)
+               grp = &gemini_3512_pin_groups[selector];
+       if (pmx->is_3516)
+               grp = &gemini_3516_pin_groups[selector];
+
+       /* First figure out if this group supports configs */
+       if (!grp->driving_mask) {
+               dev_err(pmx->dev, "pin config group \"%s\" does "
+                       "not support drive strength setting\n",
+                       grp->name);
+               return -EINVAL;
+       }
+
+       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_DRIVE_STRENGTH:
+                       switch (arg) {
+                       case 4:
+                               val = 0;
+                               break;
+                       case 8:
+                               val = 1;
+                               break;
+                       case 12:
+                               val = 2;
+                               break;
+                       case 16:
+                               val = 3;
+                               break;
+                       default:
+                               dev_err(pmx->dev,
+                                       "invalid drive strength %d mA\n",
+                                       arg);
+                               return -ENOTSUPP;
+                       }
+                       val <<= (ffs(grp->driving_mask) - 1);
+                       regmap_update_bits(pmx->map, GLOBAL_IODRIVE,
+                                          grp->driving_mask,
+                                          val);
+                       dev_info(pmx->dev,
+                                "set group %s to %d mA drive strength mask %08x val %08x\n",
+                                grp->name, arg, grp->driving_mask, val);
+                       break;
+               default:
+                       dev_err(pmx->dev, "invalid config param %04x\n", param);
+                       return -ENOTSUPP;
+               }
+       }
+
+       return 0;
+}
+
 static const struct pinconf_ops gemini_pinconf_ops = {
        .pin_config_get = gemini_pinconf_get,
        .pin_config_set = gemini_pinconf_set,
+       .pin_config_group_set = gemini_pinconf_group_set,
        .is_generic = true,
 };
 
index 372ddf386bdb9ebfab7b65b0210eedad463fdf4f..ac38a3f9f86bf6aab07cfb66d4f5a1f4e65b4b1f 100644 (file)
@@ -736,10 +736,8 @@ static int ingenic_pinctrl_probe(struct platform_device *pdev)
 
        base = devm_ioremap_resource(dev,
                        platform_get_resource(pdev, IORESOURCE_MEM, 0));
-       if (IS_ERR(base)) {
-               dev_err(dev, "Failed to ioremap registers\n");
+       if (IS_ERR(base))
                return PTR_ERR(base);
-       }
 
        jzpc->map = devm_regmap_init_mmio(dev, base,
                        &ingenic_pinctrl_regmap_config);
index 4a6ea159c65de4c6365ebfffb698b214fa2ae937..644c5beb05cb3632a895802245f2af6b9c833200 100644 (file)
@@ -455,31 +455,22 @@ static irqreturn_t mcp23s08_irq(int irq, void *data)
                defval_changed, gpio_set;
 
        mutex_lock(&mcp->lock);
-       if (mcp_read(mcp, MCP_INTF, &intf) < 0) {
-               mutex_unlock(&mcp->lock);
-               return IRQ_HANDLED;
-       }
+       if (mcp_read(mcp, MCP_INTF, &intf))
+               goto unlock;
 
-       if (mcp_read(mcp, MCP_INTCAP, &intcap) < 0) {
-               mutex_unlock(&mcp->lock);
-               return IRQ_HANDLED;
-       }
+       if (mcp_read(mcp, MCP_INTCAP, &intcap))
+               goto unlock;
 
-       if (mcp_read(mcp, MCP_INTCON, &intcon) < 0) {
-               mutex_unlock(&mcp->lock);
-               return IRQ_HANDLED;
-       }
+       if (mcp_read(mcp, MCP_INTCON, &intcon))
+               goto unlock;
 
-       if (mcp_read(mcp, MCP_DEFVAL, &defval) < 0) {
-               mutex_unlock(&mcp->lock);
-               return IRQ_HANDLED;
-       }
+       if (mcp_read(mcp, MCP_DEFVAL, &defval))
+               goto unlock;
 
        /* This clears the interrupt(configurable on S18) */
-       if (mcp_read(mcp, MCP_GPIO, &gpio) < 0) {
-               mutex_unlock(&mcp->lock);
-               return IRQ_HANDLED;
-       }
+       if (mcp_read(mcp, MCP_GPIO, &gpio))
+               goto unlock;
+
        gpio_orig = mcp->cached_gpio;
        mcp->cached_gpio = gpio;
        mutex_unlock(&mcp->lock);
@@ -541,6 +532,10 @@ static irqreturn_t mcp23s08_irq(int irq, void *data)
        }
 
        return IRQ_HANDLED;
+
+unlock:
+       mutex_unlock(&mcp->lock);
+       return IRQ_HANDLED;
 }
 
 static void mcp23s08_irq_mask(struct irq_data *data)
@@ -753,13 +748,12 @@ static void mcp23s08_dbg_show(struct seq_file *s, struct gpio_chip *chip)
                if (!label)
                        continue;
 
-               seq_printf(s, " gpio-%-3d P%c.%d (%-12s) %s %s %s",
-                       chip->base + t, bank, t, label,
-                       (iodir & mask) ? "in " : "out",
-                       (gpio & mask) ? "hi" : "lo",
-                       (gppu & mask) ? "up" : "  ");
+               seq_printf(s, " gpio-%-3d P%c.%d (%-12s) %s %s %s\n",
+                          chip->base + t, bank, t, label,
+                          (iodir & mask) ? "in " : "out",
+                          (gpio & mask) ? "hi" : "lo",
+                          (gppu & mask) ? "up" : "  ");
                /* NOTE:  ignoring the irq-related registers */
-               seq_puts(s, "\n");
        }
 done:
        mutex_unlock(&mcp->lock);
@@ -896,16 +890,16 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
                        goto fail;
        }
 
-       ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp);
-       if (ret < 0)
-               goto fail;
-
        if (mcp->irq && mcp->irq_controller) {
                ret = mcp23s08_irq_setup(mcp);
                if (ret)
                        goto fail;
        }
 
+       ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp);
+       if (ret < 0)
+               goto fail;
+
        mcp->pinctrl_desc.name = "mcp23xxx-pinctrl";
        mcp->pinctrl_desc.pctlops = &mcp_pinctrl_ops;
        mcp->pinctrl_desc.confops = &mcp_pinconf_ops;
diff --git a/drivers/pinctrl/pinctrl-ocelot.c b/drivers/pinctrl/pinctrl-ocelot.c
new file mode 100644 (file)
index 0000000..01a50d9
--- /dev/null
@@ -0,0 +1,511 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Microsemi SoCs pinctrl driver
+ *
+ * Author: <alexandre.belloni@free-electrons.com>
+ * License: Dual MIT/GPL
+ * Copyright (c) 2017 Microsemi Corporation
+ */
+
+#include <linux/gpio/driver.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.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/regmap.h>
+#include <linux/slab.h>
+
+#include "core.h"
+#include "pinconf.h"
+#include "pinmux.h"
+
+#define OCELOT_GPIO_OUT_SET    0x0
+#define OCELOT_GPIO_OUT_CLR    0x4
+#define OCELOT_GPIO_OUT                0x8
+#define OCELOT_GPIO_IN         0xc
+#define OCELOT_GPIO_OE         0x10
+#define OCELOT_GPIO_INTR       0x14
+#define OCELOT_GPIO_INTR_ENA   0x18
+#define OCELOT_GPIO_INTR_IDENT 0x1c
+#define OCELOT_GPIO_ALT0       0x20
+#define OCELOT_GPIO_ALT1       0x24
+#define OCELOT_GPIO_SD_MAP     0x28
+
+#define OCELOT_PINS            22
+#define OCELOT_FUNC_PER_PIN    4
+
+enum {
+       FUNC_NONE,
+       FUNC_GPIO,
+       FUNC_IRQ0_IN,
+       FUNC_IRQ0_OUT,
+       FUNC_IRQ1_IN,
+       FUNC_IRQ1_OUT,
+       FUNC_MIIM1,
+       FUNC_PCI_WAKE,
+       FUNC_PTP0,
+       FUNC_PTP1,
+       FUNC_PTP2,
+       FUNC_PTP3,
+       FUNC_PWM,
+       FUNC_RECO_CLK0,
+       FUNC_RECO_CLK1,
+       FUNC_SFP0,
+       FUNC_SFP1,
+       FUNC_SFP2,
+       FUNC_SFP3,
+       FUNC_SFP4,
+       FUNC_SFP5,
+       FUNC_SG0,
+       FUNC_SI,
+       FUNC_TACHO,
+       FUNC_TWI,
+       FUNC_TWI_SCL_M,
+       FUNC_UART,
+       FUNC_UART2,
+       FUNC_MAX
+};
+
+static const char *const ocelot_function_names[] = {
+       [FUNC_NONE]             = "none",
+       [FUNC_GPIO]             = "gpio",
+       [FUNC_IRQ0_IN]          = "irq0_in",
+       [FUNC_IRQ0_OUT]         = "irq0_out",
+       [FUNC_IRQ1_IN]          = "irq1_in",
+       [FUNC_IRQ1_OUT]         = "irq1_out",
+       [FUNC_MIIM1]            = "miim1",
+       [FUNC_PCI_WAKE]         = "pci_wake",
+       [FUNC_PTP0]             = "ptp0",
+       [FUNC_PTP1]             = "ptp1",
+       [FUNC_PTP2]             = "ptp2",
+       [FUNC_PTP3]             = "ptp3",
+       [FUNC_PWM]              = "pwm",
+       [FUNC_RECO_CLK0]        = "reco_clk0",
+       [FUNC_RECO_CLK1]        = "reco_clk1",
+       [FUNC_SFP0]             = "sfp0",
+       [FUNC_SFP1]             = "sfp1",
+       [FUNC_SFP2]             = "sfp2",
+       [FUNC_SFP3]             = "sfp3",
+       [FUNC_SFP4]             = "sfp4",
+       [FUNC_SFP5]             = "sfp5",
+       [FUNC_SG0]              = "sg0",
+       [FUNC_SI]               = "si",
+       [FUNC_TACHO]            = "tacho",
+       [FUNC_TWI]              = "twi",
+       [FUNC_TWI_SCL_M]        = "twi_scl_m",
+       [FUNC_UART]             = "uart",
+       [FUNC_UART2]            = "uart2",
+};
+
+struct ocelot_pmx_func {
+       const char **groups;
+       unsigned int ngroups;
+};
+
+struct ocelot_pin_caps {
+       unsigned int pin;
+       unsigned char functions[OCELOT_FUNC_PER_PIN];
+};
+
+struct ocelot_pinctrl {
+       struct device *dev;
+       struct pinctrl_dev *pctl;
+       struct gpio_chip gpio_chip;
+       struct regmap *map;
+       struct ocelot_pmx_func func[FUNC_MAX];
+};
+
+#define OCELOT_P(p, f0, f1, f2)                                                \
+static struct ocelot_pin_caps ocelot_pin_##p = {                       \
+       .pin = p,                                                       \
+       .functions = {                                                  \
+                       FUNC_GPIO, FUNC_##f0, FUNC_##f1, FUNC_##f2,     \
+       },                                                              \
+}
+
+OCELOT_P(0,  SG0,       NONE,      NONE);
+OCELOT_P(1,  SG0,       NONE,      NONE);
+OCELOT_P(2,  SG0,       NONE,      NONE);
+OCELOT_P(3,  SG0,       NONE,      NONE);
+OCELOT_P(4,  IRQ0_IN,   IRQ0_OUT,  TWI);
+OCELOT_P(5,  IRQ1_IN,   IRQ1_OUT,  PCI_WAKE);
+OCELOT_P(6,  UART,      TWI_SCL_M, NONE);
+OCELOT_P(7,  UART,      TWI_SCL_M, NONE);
+OCELOT_P(8,  SI,        TWI_SCL_M, IRQ0_OUT);
+OCELOT_P(9,  SI,        TWI_SCL_M, IRQ1_OUT);
+OCELOT_P(10, PTP2,      TWI_SCL_M, SFP0);
+OCELOT_P(11, PTP3,      TWI_SCL_M, SFP1);
+OCELOT_P(12, UART2,     TWI_SCL_M, SFP2);
+OCELOT_P(13, UART2,     TWI_SCL_M, SFP3);
+OCELOT_P(14, MIIM1,     TWI_SCL_M, SFP4);
+OCELOT_P(15, MIIM1,     TWI_SCL_M, SFP5);
+OCELOT_P(16, TWI,       NONE,      SI);
+OCELOT_P(17, TWI,       TWI_SCL_M, SI);
+OCELOT_P(18, PTP0,      TWI_SCL_M, NONE);
+OCELOT_P(19, PTP1,      TWI_SCL_M, NONE);
+OCELOT_P(20, RECO_CLK0, TACHO,     NONE);
+OCELOT_P(21, RECO_CLK1, PWM,       NONE);
+
+#define OCELOT_PIN(n) {                                                \
+       .number = n,                                            \
+       .name = "GPIO_"#n,                                      \
+       .drv_data = &ocelot_pin_##n                             \
+}
+
+static const struct pinctrl_pin_desc ocelot_pins[] = {
+       OCELOT_PIN(0),
+       OCELOT_PIN(1),
+       OCELOT_PIN(2),
+       OCELOT_PIN(3),
+       OCELOT_PIN(4),
+       OCELOT_PIN(5),
+       OCELOT_PIN(6),
+       OCELOT_PIN(7),
+       OCELOT_PIN(8),
+       OCELOT_PIN(9),
+       OCELOT_PIN(10),
+       OCELOT_PIN(11),
+       OCELOT_PIN(12),
+       OCELOT_PIN(13),
+       OCELOT_PIN(14),
+       OCELOT_PIN(15),
+       OCELOT_PIN(16),
+       OCELOT_PIN(17),
+       OCELOT_PIN(18),
+       OCELOT_PIN(19),
+       OCELOT_PIN(20),
+       OCELOT_PIN(21),
+};
+
+static int ocelot_get_functions_count(struct pinctrl_dev *pctldev)
+{
+       return ARRAY_SIZE(ocelot_function_names);
+}
+
+static const char *ocelot_get_function_name(struct pinctrl_dev *pctldev,
+                                           unsigned int function)
+{
+       return ocelot_function_names[function];
+}
+
+static int ocelot_get_function_groups(struct pinctrl_dev *pctldev,
+                                     unsigned int function,
+                                     const char *const **groups,
+                                     unsigned *const num_groups)
+{
+       struct ocelot_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
+
+       *groups  = info->func[function].groups;
+       *num_groups = info->func[function].ngroups;
+
+       return 0;
+}
+
+static int ocelot_pin_function_idx(unsigned int pin, unsigned int function)
+{
+       struct ocelot_pin_caps *p = ocelot_pins[pin].drv_data;
+       int i;
+
+       for (i = 0; i < OCELOT_FUNC_PER_PIN; i++) {
+               if (function == p->functions[i])
+                       return i;
+       }
+
+       return -1;
+}
+
+static int ocelot_pinmux_set_mux(struct pinctrl_dev *pctldev,
+                                unsigned int selector, unsigned int group)
+{
+       struct ocelot_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
+       struct ocelot_pin_caps *pin = ocelot_pins[group].drv_data;
+       int f;
+
+       f = ocelot_pin_function_idx(group, selector);
+       if (f < 0)
+               return -EINVAL;
+
+       /*
+        * f is encoded on two bits.
+        * bit 0 of f goes in BIT(pin) of ALT0, bit 1 of f goes in BIT(pin) of
+        * ALT1
+        * This is racy because both registers can't be updated at the same time
+        * but it doesn't matter much for now.
+        */
+       regmap_update_bits(info->map, OCELOT_GPIO_ALT0, BIT(pin->pin),
+                          f << pin->pin);
+       regmap_update_bits(info->map, OCELOT_GPIO_ALT1, BIT(pin->pin),
+                          f << (pin->pin - 1));
+
+       return 0;
+}
+
+static int ocelot_gpio_set_direction(struct pinctrl_dev *pctldev,
+                                    struct pinctrl_gpio_range *range,
+                                    unsigned int pin, bool input)
+{
+       struct ocelot_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
+
+       regmap_update_bits(info->map, OCELOT_GPIO_OE, BIT(pin),
+                          input ? BIT(pin) : 0);
+
+       return 0;
+}
+
+static int ocelot_gpio_request_enable(struct pinctrl_dev *pctldev,
+                                     struct pinctrl_gpio_range *range,
+                                     unsigned int offset)
+{
+       struct ocelot_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
+
+       regmap_update_bits(info->map, OCELOT_GPIO_ALT0, BIT(offset), 0);
+       regmap_update_bits(info->map, OCELOT_GPIO_ALT1, BIT(offset), 0);
+
+       return 0;
+}
+
+static const struct pinmux_ops ocelot_pmx_ops = {
+       .get_functions_count = ocelot_get_functions_count,
+       .get_function_name = ocelot_get_function_name,
+       .get_function_groups = ocelot_get_function_groups,
+       .set_mux = ocelot_pinmux_set_mux,
+       .gpio_set_direction = ocelot_gpio_set_direction,
+       .gpio_request_enable = ocelot_gpio_request_enable,
+};
+
+static int ocelot_pctl_get_groups_count(struct pinctrl_dev *pctldev)
+{
+       return ARRAY_SIZE(ocelot_pins);
+}
+
+static const char *ocelot_pctl_get_group_name(struct pinctrl_dev *pctldev,
+                                             unsigned int group)
+{
+       return ocelot_pins[group].name;
+}
+
+static int ocelot_pctl_get_group_pins(struct pinctrl_dev *pctldev,
+                                     unsigned int group,
+                                     const unsigned int **pins,
+                                     unsigned int *num_pins)
+{
+       *pins = &ocelot_pins[group].number;
+       *num_pins = 1;
+
+       return 0;
+}
+
+static const struct pinctrl_ops ocelot_pctl_ops = {
+       .get_groups_count = ocelot_pctl_get_groups_count,
+       .get_group_name = ocelot_pctl_get_group_name,
+       .get_group_pins = ocelot_pctl_get_group_pins,
+       .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
+       .dt_free_map = pinconf_generic_dt_free_map,
+};
+
+static struct pinctrl_desc ocelot_desc = {
+       .name = "ocelot-pinctrl",
+       .pins = ocelot_pins,
+       .npins = ARRAY_SIZE(ocelot_pins),
+       .pctlops = &ocelot_pctl_ops,
+       .pmxops = &ocelot_pmx_ops,
+       .owner = THIS_MODULE,
+};
+
+static int ocelot_create_group_func_map(struct device *dev,
+                                       struct ocelot_pinctrl *info)
+{
+       u16 pins[ARRAY_SIZE(ocelot_pins)];
+       int f, npins, i;
+
+       for (f = 0; f < FUNC_MAX; f++) {
+               for (npins = 0, i = 0; i < ARRAY_SIZE(ocelot_pins); i++) {
+                       if (ocelot_pin_function_idx(i, f) >= 0)
+                               pins[npins++] = i;
+               }
+
+               info->func[f].ngroups = npins;
+               info->func[f].groups = devm_kzalloc(dev, npins *
+                                                        sizeof(char *),
+                                                        GFP_KERNEL);
+               if (!info->func[f].groups)
+                       return -ENOMEM;
+
+               for (i = 0; i < npins; i++)
+                       info->func[f].groups[i] = ocelot_pins[pins[i]].name;
+       }
+
+       return 0;
+}
+
+static int ocelot_pinctrl_register(struct platform_device *pdev,
+                                  struct ocelot_pinctrl *info)
+{
+       int ret;
+
+       ret = ocelot_create_group_func_map(&pdev->dev, info);
+       if (ret) {
+               dev_err(&pdev->dev, "Unable to create group func map.\n");
+               return ret;
+       }
+
+       info->pctl = devm_pinctrl_register(&pdev->dev, &ocelot_desc, info);
+       if (IS_ERR(info->pctl)) {
+               dev_err(&pdev->dev, "Failed to register pinctrl\n");
+               return PTR_ERR(info->pctl);
+       }
+
+       return 0;
+}
+
+static int ocelot_gpio_get(struct gpio_chip *chip, unsigned int offset)
+{
+       struct ocelot_pinctrl *info = gpiochip_get_data(chip);
+       unsigned int val;
+
+       regmap_read(info->map, OCELOT_GPIO_IN, &val);
+
+       return !!(val & BIT(offset));
+}
+
+static void ocelot_gpio_set(struct gpio_chip *chip, unsigned int offset,
+                           int value)
+{
+       struct ocelot_pinctrl *info = gpiochip_get_data(chip);
+
+       if (value)
+               regmap_write(info->map, OCELOT_GPIO_OUT_SET, BIT(offset));
+       else
+               regmap_write(info->map, OCELOT_GPIO_OUT_CLR, BIT(offset));
+}
+
+static int ocelot_gpio_get_direction(struct gpio_chip *chip,
+                                    unsigned int offset)
+{
+       struct ocelot_pinctrl *info = gpiochip_get_data(chip);
+       unsigned int val;
+
+       regmap_read(info->map, OCELOT_GPIO_OE, &val);
+
+       return !(val & BIT(offset));
+}
+
+static int ocelot_gpio_direction_input(struct gpio_chip *chip,
+                                      unsigned int offset)
+{
+       return pinctrl_gpio_direction_input(chip->base + offset);
+}
+
+static int ocelot_gpio_direction_output(struct gpio_chip *chip,
+                                       unsigned int offset, int value)
+{
+       struct ocelot_pinctrl *info = gpiochip_get_data(chip);
+       unsigned int pin = BIT(offset);
+
+       if (value)
+               regmap_write(info->map, OCELOT_GPIO_OUT_SET, pin);
+       else
+               regmap_write(info->map, OCELOT_GPIO_OUT_CLR, pin);
+
+       return pinctrl_gpio_direction_output(chip->base + offset);
+}
+
+static const struct gpio_chip ocelot_gpiolib_chip = {
+       .request = gpiochip_generic_request,
+       .free = gpiochip_generic_free,
+       .set = ocelot_gpio_set,
+       .get = ocelot_gpio_get,
+       .get_direction = ocelot_gpio_get_direction,
+       .direction_input = ocelot_gpio_direction_input,
+       .direction_output = ocelot_gpio_direction_output,
+       .owner = THIS_MODULE,
+};
+
+static int ocelot_gpiochip_register(struct platform_device *pdev,
+                                   struct ocelot_pinctrl *info)
+{
+       struct gpio_chip *gc;
+       int ret;
+
+       info->gpio_chip = ocelot_gpiolib_chip;
+
+       gc = &info->gpio_chip;
+       gc->ngpio = OCELOT_PINS;
+       gc->parent = &pdev->dev;
+       gc->base = 0;
+       gc->of_node = info->dev->of_node;
+       gc->label = "ocelot-gpio";
+
+       ret = devm_gpiochip_add_data(&pdev->dev, gc, info);
+       if (ret)
+               return ret;
+
+       /* TODO: this can be used as an irqchip but no board is using that */
+
+       return 0;
+}
+
+static const struct regmap_config ocelot_pinctrl_regmap_config = {
+       .reg_bits = 32,
+       .val_bits = 32,
+       .reg_stride = 4,
+       .max_register = 0x64,
+};
+
+static const struct of_device_id ocelot_pinctrl_of_match[] = {
+       { .compatible = "mscc,ocelot-pinctrl" },
+       {},
+};
+
+int ocelot_pinctrl_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct ocelot_pinctrl *info;
+       void __iomem *base;
+       int ret;
+
+       info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       base = devm_ioremap_resource(dev,
+                       platform_get_resource(pdev, IORESOURCE_MEM, 0));
+       if (IS_ERR(base)) {
+               dev_err(dev, "Failed to ioremap registers\n");
+               return PTR_ERR(base);
+       }
+
+       info->map = devm_regmap_init_mmio(dev, base,
+                                         &ocelot_pinctrl_regmap_config);
+       if (IS_ERR(info->map)) {
+               dev_err(dev, "Failed to create regmap\n");
+               return PTR_ERR(info->map);
+       }
+       dev_set_drvdata(dev, info->map);
+       info->dev = dev;
+
+       ret = ocelot_pinctrl_register(pdev, info);
+       if (ret)
+               return ret;
+
+       ret = ocelot_gpiochip_register(pdev, info);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static struct platform_driver ocelot_pinctrl_driver = {
+       .driver = {
+               .name = "pinctrl-ocelot",
+               .of_match_table = of_match_ptr(ocelot_pinctrl_of_match),
+               .suppress_bind_attrs = true,
+       },
+       .probe = ocelot_pinctrl_probe,
+};
+builtin_platform_driver(ocelot_pinctrl_driver);
index 4d6a5015b9272f335d8738c072e27cd0eec56f9b..d42f18cb1bc7dfe01281d826f7a3f72428261a7b 100644 (file)
@@ -1012,10 +1012,8 @@ static int palmas_pinctrl_probe(struct platform_device *pdev)
        }
 
        pci = devm_kzalloc(&pdev->dev, sizeof(*pci), GFP_KERNEL);
-       if (!pci) {
-               dev_err(&pdev->dev, "Malloc for pci failed\n");
+       if (!pci)
                return -ENOMEM;
-       }
 
        pci->dev = &pdev->dev;
        pci->palmas = dev_get_drvdata(pdev->dev.parent);
index 2ba17548ad5b5132789fb3b1ed15a89fbf3c4e6a..3924779f55785695ec8a8a719ac3f2434a9e5192 100644 (file)
@@ -136,7 +136,7 @@ struct rockchip_drv {
  * @iomux: array describing the 4 iomux sources of the bank
  * @drv: array describing the 4 drive strength sources of the bank
  * @pull_type: array describing the 4 pull type sources of the bank
- * @valid: are all necessary informations present
+ * @valid: is all necessary information present
  * @of_node: dt node of this bank
  * @drvdata: common pinctrl basedata
  * @domain: irqdomain of the gpio bank
@@ -1988,7 +1988,7 @@ static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
                info->functions[selector].name, info->groups[group].name);
 
        /*
-        * for each pin in the pin group selected, program the correspoding pin
+        * for each pin in the pin group selected, program the corresponding
         * pin function number in the config register.
         */
        for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
@@ -2014,8 +2014,16 @@ static int rockchip_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 {
        struct rockchip_pin_bank *bank = gpiochip_get_data(chip);
        u32 data;
+       int ret;
 
+       ret = clk_enable(bank->clk);
+       if (ret < 0) {
+               dev_err(bank->drvdata->dev,
+                       "failed to enable clock for bank %s\n", bank->name);
+               return ret;
+       }
        data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR);
+       clk_disable(bank->clk);
 
        return !(data & BIT(offset));
 }
@@ -2400,18 +2408,14 @@ static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
        info->functions = devm_kzalloc(dev, info->nfunctions *
                                              sizeof(struct rockchip_pmx_func),
                                              GFP_KERNEL);
-       if (!info->functions) {
-               dev_err(dev, "failed to allocate memory for function list\n");
+       if (!info->functions)
                return -EINVAL;
-       }
 
        info->groups = devm_kzalloc(dev, info->ngroups *
                                            sizeof(struct rockchip_pin_group),
                                            GFP_KERNEL);
-       if (!info->groups) {
-               dev_err(dev, "failed allocate memory for ping group list\n");
+       if (!info->groups)
                return -EINVAL;
-       }
 
        i = 0;
 
@@ -2447,10 +2451,9 @@ static int rockchip_pinctrl_register(struct platform_device *pdev,
 
        pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
                        info->ctrl->nr_pins, GFP_KERNEL);
-       if (!pindesc) {
-               dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
+       if (!pindesc)
                return -ENOMEM;
-       }
+
        ctrldesc->pins = pindesc;
        ctrldesc->npins = info->ctrl->nr_pins;
 
@@ -2532,7 +2535,7 @@ static int rockchip_gpio_get(struct gpio_chip *gc, unsigned offset)
 
 /*
  * gpiolib gpio_direction_input callback function. The setting of the pin
- * mux function as 'gpio input' will be handled by the pinctrl susbsystem
+ * mux function as 'gpio input' will be handled by the pinctrl subsystem
  * interface.
  */
 static int rockchip_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
@@ -2542,7 +2545,7 @@ static int rockchip_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
 
 /*
  * gpiolib gpio_direction_output callback function. The setting of the pin
- * mux function as 'gpio output' will be handled by the pinctrl susbsystem
+ * mux function as 'gpio output' will be handled by the pinctrl subsystem
  * interface.
  */
 static int rockchip_gpio_direction_output(struct gpio_chip *gc,
@@ -3163,7 +3166,7 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
-       info = devm_kzalloc(dev, sizeof(struct rockchip_pinctrl), GFP_KERNEL);
+       info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
        if (!info)
                return -ENOMEM;
 
index 3501491e5bfc8a5547c3ac820e01ad338dbb097b..cec75379f936e7e937fc8e17e942554e858669aa 100644 (file)
@@ -1462,8 +1462,6 @@ static void pcs_irq_chain_handler(struct irq_desc *desc)
        pcs_irq_handle(pcs_soc);
        /* REVISIT: export and add handle_bad_irq(irq, desc)? */
        chained_irq_exit(chip, desc);
-
-       return;
 }
 
 static int pcs_irqdomain_map(struct irq_domain *d, unsigned int irq,
@@ -1649,10 +1647,9 @@ static int pcs_probe(struct platform_device *pdev)
                return -EINVAL;
 
        pcs = devm_kzalloc(&pdev->dev, sizeof(*pcs), GFP_KERNEL);
-       if (!pcs) {
-               dev_err(&pdev->dev, "could not allocate\n");
+       if (!pcs)
                return -ENOMEM;
-       }
+
        pcs->dev = &pdev->dev;
        pcs->np = np;
        raw_spin_lock_init(&pcs->lock);
@@ -1777,8 +1774,7 @@ static int pcs_probe(struct platform_device *pdev)
                        dev_warn(pcs->dev, "initialized with no interrupts\n");
        }
 
-       dev_info(pcs->dev, "%i pins at pa %p size %u\n",
-                pcs->desc.npins, pcs->base, pcs->size);
+       dev_info(pcs->dev, "%i pins, size %u\n", pcs->desc.npins, pcs->size);
 
        return pinctrl_enable(pcs->pctl);
 
index fb242c542dc926c9392d31b99f937c17215cec81..cbf58a10113df861fbc12335e68c2158c492a60b 100644 (file)
@@ -1144,6 +1144,27 @@ static int sx150x_probe(struct i2c_client *client,
        if (ret)
                return ret;
 
+       /* Pinctrl_desc */
+       pctl->pinctrl_desc.name = "sx150x-pinctrl";
+       pctl->pinctrl_desc.pctlops = &sx150x_pinctrl_ops;
+       pctl->pinctrl_desc.confops = &sx150x_pinconf_ops;
+       pctl->pinctrl_desc.pins = pctl->data->pins;
+       pctl->pinctrl_desc.npins = pctl->data->npins;
+       pctl->pinctrl_desc.owner = THIS_MODULE;
+
+       ret = devm_pinctrl_register_and_init(dev, &pctl->pinctrl_desc,
+                                            pctl, &pctl->pctldev);
+       if (ret) {
+               dev_err(dev, "Failed to register pinctrl device\n");
+               return ret;
+       }
+
+       ret = pinctrl_enable(pctl->pctldev);
+       if (ret) {
+               dev_err(dev, "Failed to enable pinctrl device\n");
+               return ret;
+       }
+
        /* Register GPIO controller */
        pctl->gpio.label = devm_kstrdup(dev, client->name, GFP_KERNEL);
        pctl->gpio.base = -1;
@@ -1172,6 +1193,11 @@ static int sx150x_probe(struct i2c_client *client,
        if (ret)
                return ret;
 
+       ret = gpiochip_add_pin_range(&pctl->gpio, dev_name(dev),
+                                    0, 0, pctl->data->npins);
+       if (ret)
+               return ret;
+
        /* Add Interrupt support if an irq is specified */
        if (client->irq > 0) {
                pctl->irq_chip.name = devm_kstrdup(dev, client->name,
@@ -1217,20 +1243,6 @@ static int sx150x_probe(struct i2c_client *client,
                                            client->irq);
        }
 
-       /* Pinctrl_desc */
-       pctl->pinctrl_desc.name = "sx150x-pinctrl";
-       pctl->pinctrl_desc.pctlops = &sx150x_pinctrl_ops;
-       pctl->pinctrl_desc.confops = &sx150x_pinconf_ops;
-       pctl->pinctrl_desc.pins = pctl->data->pins;
-       pctl->pinctrl_desc.npins = pctl->data->npins;
-       pctl->pinctrl_desc.owner = THIS_MODULE;
-
-       pctl->pctldev = pinctrl_register(&pctl->pinctrl_desc, dev, pctl);
-       if (IS_ERR(pctl->pctldev)) {
-               dev_err(dev, "Failed to register pinctrl device\n");
-               return PTR_ERR(pctl->pctldev);
-       }
-
        return 0;
 }
 
index 5cfa93cecf73fc1fd1eefe110a9e3382da8857c4..b16d1c96b7eba04a41cf725cbe3f1e7a414e7df0 100644 (file)
@@ -357,10 +357,8 @@ static int add_map_configs(struct device *dev,
 
        dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
                              GFP_KERNEL);
-       if (!dup_configs) {
-               dev_err(dev, "kmemdup(configs) failed\n");
+       if (!dup_configs)
                return -ENOMEM;
-       }
 
        /*
         * We support both pins and pin groups, but we need to figure out which
@@ -931,10 +929,9 @@ static int tz1090_pdc_pinctrl_probe(struct platform_device *pdev)
        struct resource *res;
 
        pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
-       if (!pmx) {
-               dev_err(&pdev->dev, "Can't alloc tz1090_pdc_pmx\n");
+       if (!pmx)
                return -ENOMEM;
-       }
+
        pmx->dev = &pdev->dev;
        spin_lock_init(&pmx->lock);
 
index 74d1ffcc2199c2fe6f2835cc58f909dc32290127..2379ce2be3656c85f3e25b861982eb8daf83dcb3 100644 (file)
@@ -1082,10 +1082,8 @@ static int add_map_configs(struct device *dev,
 
        dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
                              GFP_KERNEL);
-       if (!dup_configs) {
-               dev_err(dev, "kmemdup(configs) failed\n");
+       if (!dup_configs)
                return -ENOMEM;
-       }
 
        (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
        (*map)[*num_maps].data.configs.group_or_pin = group;
@@ -1946,10 +1944,9 @@ static int tz1090_pinctrl_probe(struct platform_device *pdev)
        struct resource *res;
 
        pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
-       if (!pmx) {
-               dev_err(&pdev->dev, "Can't alloc tz1090_pmx\n");
+       if (!pmx)
                return -ENOMEM;
-       }
+
        pmx->dev = &pdev->dev;
        spin_lock_init(&pmx->lock);
 
index 9189fbafb102acd88b3cb4e0da72457104d04e82..f2bcbf62c03dfb456642dcadb5d3d5750b196fcf 100644 (file)
@@ -83,10 +83,8 @@ int pinctrl_utils_add_map_configs(struct pinctrl_dev *pctldev,
 
        dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
                              GFP_KERNEL);
-       if (!dup_configs) {
-               dev_err(pctldev->dev, "kmemdup(configs) failed\n");
+       if (!dup_configs)
                return -ENOMEM;
-       }
 
        (*map)[*num_maps].type = type;
        (*map)[*num_maps].data.configs.group_or_pin = group;
index f9e98a7d4f0ce088617a4bd4bf90511793809941..cd0f402c116460f8e7edf1d20815f764ce31abab 100644 (file)
@@ -1730,18 +1730,16 @@ static int pinmux_xway_probe(struct platform_device *pdev)
        xway_info.pads = devm_kzalloc(&pdev->dev,
                        sizeof(struct pinctrl_pin_desc) * xway_chip.ngpio,
                        GFP_KERNEL);
-       if (!xway_info.pads) {
-               dev_err(&pdev->dev, "Failed to allocate pads\n");
+       if (!xway_info.pads)
                return -ENOMEM;
-       }
+
        for (i = 0; i < xway_chip.ngpio; i++) {
                /* strlen("ioXY") + 1 = 5 */
                char *name = devm_kzalloc(&pdev->dev, 5, GFP_KERNEL);
 
-               if (!name) {
-                       dev_err(&pdev->dev, "Failed to allocate pad name\n");
+               if (!name)
                        return -ENOMEM;
-               }
+
                snprintf(name, 5, "io%d", i);
                xway_info.pads[i].number = GPIO0 + i;
                xway_info.pads[i].name = name;
index 55502fc4479c29c3cdb9c23d5bf9aad9593a3f7b..b8e9bda8ec98a39cc623a1db1c97504f0248204e 100644 (file)
@@ -493,8 +493,6 @@ void pinmux_disable_setting(const struct pinctrl_setting *setting)
                        continue;
                }
                if (desc->mux_setting == &(setting->data.mux)) {
-                       desc->mux_setting = NULL;
-                       /* And release the pin */
                        pin_free(pctldev, pins[i], NULL);
                } else {
                        const char *gname;
@@ -619,7 +617,7 @@ static int pinmux_pins_show(struct seq_file *s, void *what)
                                   pctlops->get_group_name(pctldev,
                                        desc->mux_setting->group));
                else
-                       seq_printf(s, "\n");
+                       seq_putc(s, '\n');
        }
 
        mutex_unlock(&pctldev->mutex);
index 866aa3ce1ac95a3866526b648e1e806aef5eba71..6cf0006d4c8df4837e512ac1e81a32f7d709969e 100644 (file)
@@ -436,3 +436,7 @@ int pxa2xx_pinctrl_exit(struct platform_device *pdev)
        return 0;
 }
 EXPORT_SYMBOL_GPL(pxa2xx_pinctrl_exit);
+
+MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
+MODULE_DESCRIPTION("Marvell PXA2xx pinctrl driver");
+MODULE_LICENSE("GPL v2");
index 9e504dbc7fb593e27fce4bc28b062544c4c52bdc..fcaaa92d76df52da5f1c3c466c47a34059e18c95 100644 (file)
@@ -106,6 +106,14 @@ config PINCTRL_MSM8996
          This is the pinctrl, pinmux, pinconf and gpiolib driver for the
          Qualcomm TLMM block found in the Qualcomm MSM8996 platform.
 
+config PINCTRL_MSM8998
+       tristate "Qualcomm MSM8998 pin controller driver"
+       depends on GPIOLIB && OF
+       select PINCTRL_MSM
+       help
+         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
+         Qualcomm TLMM block found in the Qualcomm MSM8998 platform.
+
 config PINCTRL_QDF2XXX
        tristate "Qualcomm Technologies QDF2xxx pin controller driver"
        depends on GPIOLIB && ACPI
index a1db345ded1c0c334e0a6e18676efcd57194219b..8cb45bbd2e7f01191a185e8e250e113b171a3dbf 100644 (file)
@@ -12,6 +12,7 @@ obj-$(CONFIG_PINCTRL_MSM8X74) += pinctrl-msm8x74.o
 obj-$(CONFIG_PINCTRL_MSM8916)  += pinctrl-msm8916.o
 obj-$(CONFIG_PINCTRL_MSM8994)   += pinctrl-msm8994.o
 obj-$(CONFIG_PINCTRL_MSM8996)   += pinctrl-msm8996.o
+obj-$(CONFIG_PINCTRL_MSM8998)   += pinctrl-msm8998.o
 obj-$(CONFIG_PINCTRL_QDF2XXX)  += pinctrl-qdf2xxx.o
 obj-$(CONFIG_PINCTRL_MDM9615)  += pinctrl-mdm9615.o
 obj-$(CONFIG_PINCTRL_QCOM_SPMI_PMIC) += pinctrl-spmi-gpio.o
index 7a960590ecaae8a602af8baab88b200dc56ecd57..495432f3341baa1d24621f55b6e03bcb6fd8c471 100644 (file)
@@ -898,10 +898,9 @@ int msm_pinctrl_probe(struct platform_device *pdev,
        int ret;
 
        pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
-       if (!pctrl) {
-               dev_err(&pdev->dev, "Can't allocate msm_pinctrl\n");
+       if (!pctrl)
                return -ENOMEM;
-       }
+
        pctrl->dev = &pdev->dev;
        pctrl->soc = soc_data;
        pctrl->chip = msm_gpio_template;
diff --git a/drivers/pinctrl/qcom/pinctrl-msm8998.c b/drivers/pinctrl/qcom/pinctrl-msm8998.c
new file mode 100644 (file)
index 0000000..c339531
--- /dev/null
@@ -0,0 +1,1590 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-msm.h"
+
+#define NORTH  0x500000
+#define WEST   0x100000
+#define EAST   0x900000
+
+#define FUNCTION(fname)                                        \
+       [msm_mux_##fname] = {                           \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+#define PINGROUP(id, base, f1, f2, f3, f4, f5, f6, f7, f8, f9) \
+       {                                               \
+               .name = "gpio" #id,                     \
+               .pins = gpio##id##_pins,                \
+               .npins = ARRAY_SIZE(gpio##id##_pins),   \
+               .funcs = (int[]){                       \
+                       msm_mux_gpio, /* gpio mode */   \
+                       msm_mux_##f1,                   \
+                       msm_mux_##f2,                   \
+                       msm_mux_##f3,                   \
+                       msm_mux_##f4,                   \
+                       msm_mux_##f5,                   \
+                       msm_mux_##f6,                   \
+                       msm_mux_##f7,                   \
+                       msm_mux_##f8,                   \
+                       msm_mux_##f9                    \
+               },                                      \
+               .nfuncs = 10,                           \
+               .ctl_reg = base + 0x1000 * id,  \
+               .io_reg = base + 0x4 + 0x1000 * id,             \
+               .intr_cfg_reg = base + 0x8 + 0x1000 * id,       \
+               .intr_status_reg = base + 0xc + 0x1000 * id,    \
+               .intr_target_reg = base + 0x8 + 0x1000 * id,    \
+               .mux_bit = 2,                   \
+               .pull_bit = 0,                  \
+               .drv_bit = 6,                   \
+               .oe_bit = 9,                    \
+               .in_bit = 0,                    \
+               .out_bit = 1,                   \
+               .intr_enable_bit = 0,           \
+               .intr_status_bit = 0,           \
+               .intr_target_bit = 5,           \
+               .intr_target_kpss_val = 3,  \
+               .intr_raw_status_bit = 4,       \
+               .intr_polarity_bit = 1,         \
+               .intr_detection_bit = 2,        \
+               .intr_detection_width = 2,      \
+       }
+
+#define SDC_QDSD_PINGROUP(pg_name, ctl, pull, drv)     \
+       {                                               \
+               .name = #pg_name,                       \
+               .pins = pg_name##_pins,                 \
+               .npins = ARRAY_SIZE(pg_name##_pins),    \
+               .ctl_reg = ctl,                         \
+               .io_reg = 0,                            \
+               .intr_cfg_reg = 0,                      \
+               .intr_status_reg = 0,                   \
+               .intr_target_reg = 0,                   \
+               .mux_bit = -1,                          \
+               .pull_bit = pull,                       \
+               .drv_bit = drv,                         \
+               .oe_bit = -1,                           \
+               .in_bit = -1,                           \
+               .out_bit = -1,                          \
+               .intr_enable_bit = -1,                  \
+               .intr_status_bit = -1,                  \
+               .intr_target_bit = -1,                  \
+               .intr_raw_status_bit = -1,              \
+               .intr_polarity_bit = -1,                \
+               .intr_detection_bit = -1,               \
+               .intr_detection_width = -1,             \
+       }
+
+#define UFS_RESET(pg_name, offset)                             \
+       {                                               \
+               .name = #pg_name,                       \
+               .pins = pg_name##_pins,                 \
+               .npins = ARRAY_SIZE(pg_name##_pins),    \
+               .ctl_reg = offset,                      \
+               .io_reg = offset + 0x4,                 \
+               .intr_cfg_reg = 0,                      \
+               .intr_status_reg = 0,                   \
+               .intr_target_reg = 0,                   \
+               .mux_bit = -1,                          \
+               .pull_bit = 3,                          \
+               .drv_bit = 0,                           \
+               .oe_bit = -1,                           \
+               .in_bit = -1,                           \
+               .out_bit = 0,                           \
+               .intr_enable_bit = -1,                  \
+               .intr_status_bit = -1,                  \
+               .intr_target_bit = -1,                  \
+               .intr_raw_status_bit = -1,              \
+               .intr_polarity_bit = -1,                \
+               .intr_detection_bit = -1,               \
+               .intr_detection_width = -1,             \
+       }
+
+static const struct pinctrl_pin_desc msm8998_pins[] = {
+       PINCTRL_PIN(0, "GPIO_0"),
+       PINCTRL_PIN(1, "GPIO_1"),
+       PINCTRL_PIN(2, "GPIO_2"),
+       PINCTRL_PIN(3, "GPIO_3"),
+       PINCTRL_PIN(4, "GPIO_4"),
+       PINCTRL_PIN(5, "GPIO_5"),
+       PINCTRL_PIN(6, "GPIO_6"),
+       PINCTRL_PIN(7, "GPIO_7"),
+       PINCTRL_PIN(8, "GPIO_8"),
+       PINCTRL_PIN(9, "GPIO_9"),
+       PINCTRL_PIN(10, "GPIO_10"),
+       PINCTRL_PIN(11, "GPIO_11"),
+       PINCTRL_PIN(12, "GPIO_12"),
+       PINCTRL_PIN(13, "GPIO_13"),
+       PINCTRL_PIN(14, "GPIO_14"),
+       PINCTRL_PIN(15, "GPIO_15"),
+       PINCTRL_PIN(16, "GPIO_16"),
+       PINCTRL_PIN(17, "GPIO_17"),
+       PINCTRL_PIN(18, "GPIO_18"),
+       PINCTRL_PIN(19, "GPIO_19"),
+       PINCTRL_PIN(20, "GPIO_20"),
+       PINCTRL_PIN(21, "GPIO_21"),
+       PINCTRL_PIN(22, "GPIO_22"),
+       PINCTRL_PIN(23, "GPIO_23"),
+       PINCTRL_PIN(24, "GPIO_24"),
+       PINCTRL_PIN(25, "GPIO_25"),
+       PINCTRL_PIN(26, "GPIO_26"),
+       PINCTRL_PIN(27, "GPIO_27"),
+       PINCTRL_PIN(28, "GPIO_28"),
+       PINCTRL_PIN(29, "GPIO_29"),
+       PINCTRL_PIN(30, "GPIO_30"),
+       PINCTRL_PIN(31, "GPIO_31"),
+       PINCTRL_PIN(32, "GPIO_32"),
+       PINCTRL_PIN(33, "GPIO_33"),
+       PINCTRL_PIN(34, "GPIO_34"),
+       PINCTRL_PIN(35, "GPIO_35"),
+       PINCTRL_PIN(36, "GPIO_36"),
+       PINCTRL_PIN(37, "GPIO_37"),
+       PINCTRL_PIN(38, "GPIO_38"),
+       PINCTRL_PIN(39, "GPIO_39"),
+       PINCTRL_PIN(40, "GPIO_40"),
+       PINCTRL_PIN(41, "GPIO_41"),
+       PINCTRL_PIN(42, "GPIO_42"),
+       PINCTRL_PIN(43, "GPIO_43"),
+       PINCTRL_PIN(44, "GPIO_44"),
+       PINCTRL_PIN(45, "GPIO_45"),
+       PINCTRL_PIN(46, "GPIO_46"),
+       PINCTRL_PIN(47, "GPIO_47"),
+       PINCTRL_PIN(48, "GPIO_48"),
+       PINCTRL_PIN(49, "GPIO_49"),
+       PINCTRL_PIN(50, "GPIO_50"),
+       PINCTRL_PIN(51, "GPIO_51"),
+       PINCTRL_PIN(52, "GPIO_52"),
+       PINCTRL_PIN(53, "GPIO_53"),
+       PINCTRL_PIN(54, "GPIO_54"),
+       PINCTRL_PIN(55, "GPIO_55"),
+       PINCTRL_PIN(56, "GPIO_56"),
+       PINCTRL_PIN(57, "GPIO_57"),
+       PINCTRL_PIN(58, "GPIO_58"),
+       PINCTRL_PIN(59, "GPIO_59"),
+       PINCTRL_PIN(60, "GPIO_60"),
+       PINCTRL_PIN(61, "GPIO_61"),
+       PINCTRL_PIN(62, "GPIO_62"),
+       PINCTRL_PIN(63, "GPIO_63"),
+       PINCTRL_PIN(64, "GPIO_64"),
+       PINCTRL_PIN(65, "GPIO_65"),
+       PINCTRL_PIN(66, "GPIO_66"),
+       PINCTRL_PIN(67, "GPIO_67"),
+       PINCTRL_PIN(68, "GPIO_68"),
+       PINCTRL_PIN(69, "GPIO_69"),
+       PINCTRL_PIN(70, "GPIO_70"),
+       PINCTRL_PIN(71, "GPIO_71"),
+       PINCTRL_PIN(72, "GPIO_72"),
+       PINCTRL_PIN(73, "GPIO_73"),
+       PINCTRL_PIN(74, "GPIO_74"),
+       PINCTRL_PIN(75, "GPIO_75"),
+       PINCTRL_PIN(76, "GPIO_76"),
+       PINCTRL_PIN(77, "GPIO_77"),
+       PINCTRL_PIN(78, "GPIO_78"),
+       PINCTRL_PIN(79, "GPIO_79"),
+       PINCTRL_PIN(80, "GPIO_80"),
+       PINCTRL_PIN(81, "GPIO_81"),
+       PINCTRL_PIN(82, "GPIO_82"),
+       PINCTRL_PIN(83, "GPIO_83"),
+       PINCTRL_PIN(84, "GPIO_84"),
+       PINCTRL_PIN(85, "GPIO_85"),
+       PINCTRL_PIN(86, "GPIO_86"),
+       PINCTRL_PIN(87, "GPIO_87"),
+       PINCTRL_PIN(88, "GPIO_88"),
+       PINCTRL_PIN(89, "GPIO_89"),
+       PINCTRL_PIN(90, "GPIO_90"),
+       PINCTRL_PIN(91, "GPIO_91"),
+       PINCTRL_PIN(92, "GPIO_92"),
+       PINCTRL_PIN(93, "GPIO_93"),
+       PINCTRL_PIN(94, "GPIO_94"),
+       PINCTRL_PIN(95, "GPIO_95"),
+       PINCTRL_PIN(96, "GPIO_96"),
+       PINCTRL_PIN(97, "GPIO_97"),
+       PINCTRL_PIN(98, "GPIO_98"),
+       PINCTRL_PIN(99, "GPIO_99"),
+       PINCTRL_PIN(100, "GPIO_100"),
+       PINCTRL_PIN(101, "GPIO_101"),
+       PINCTRL_PIN(102, "GPIO_102"),
+       PINCTRL_PIN(103, "GPIO_103"),
+       PINCTRL_PIN(104, "GPIO_104"),
+       PINCTRL_PIN(105, "GPIO_105"),
+       PINCTRL_PIN(106, "GPIO_106"),
+       PINCTRL_PIN(107, "GPIO_107"),
+       PINCTRL_PIN(108, "GPIO_108"),
+       PINCTRL_PIN(109, "GPIO_109"),
+       PINCTRL_PIN(110, "GPIO_110"),
+       PINCTRL_PIN(111, "GPIO_111"),
+       PINCTRL_PIN(112, "GPIO_112"),
+       PINCTRL_PIN(113, "GPIO_113"),
+       PINCTRL_PIN(114, "GPIO_114"),
+       PINCTRL_PIN(115, "GPIO_115"),
+       PINCTRL_PIN(116, "GPIO_116"),
+       PINCTRL_PIN(117, "GPIO_117"),
+       PINCTRL_PIN(118, "GPIO_118"),
+       PINCTRL_PIN(119, "GPIO_119"),
+       PINCTRL_PIN(120, "GPIO_120"),
+       PINCTRL_PIN(121, "GPIO_121"),
+       PINCTRL_PIN(122, "GPIO_122"),
+       PINCTRL_PIN(123, "GPIO_123"),
+       PINCTRL_PIN(124, "GPIO_124"),
+       PINCTRL_PIN(125, "GPIO_125"),
+       PINCTRL_PIN(126, "GPIO_126"),
+       PINCTRL_PIN(127, "GPIO_127"),
+       PINCTRL_PIN(128, "GPIO_128"),
+       PINCTRL_PIN(129, "GPIO_129"),
+       PINCTRL_PIN(130, "GPIO_130"),
+       PINCTRL_PIN(131, "GPIO_131"),
+       PINCTRL_PIN(132, "GPIO_132"),
+       PINCTRL_PIN(133, "GPIO_133"),
+       PINCTRL_PIN(134, "GPIO_134"),
+       PINCTRL_PIN(135, "GPIO_135"),
+       PINCTRL_PIN(136, "GPIO_136"),
+       PINCTRL_PIN(137, "GPIO_137"),
+       PINCTRL_PIN(138, "GPIO_138"),
+       PINCTRL_PIN(139, "GPIO_139"),
+       PINCTRL_PIN(140, "GPIO_140"),
+       PINCTRL_PIN(141, "GPIO_141"),
+       PINCTRL_PIN(142, "GPIO_142"),
+       PINCTRL_PIN(143, "GPIO_143"),
+       PINCTRL_PIN(144, "GPIO_144"),
+       PINCTRL_PIN(145, "GPIO_145"),
+       PINCTRL_PIN(146, "GPIO_146"),
+       PINCTRL_PIN(147, "GPIO_147"),
+       PINCTRL_PIN(148, "GPIO_148"),
+       PINCTRL_PIN(149, "GPIO_149"),
+       PINCTRL_PIN(150, "SDC2_CLK"),
+       PINCTRL_PIN(151, "SDC2_CMD"),
+       PINCTRL_PIN(152, "SDC2_DATA"),
+       PINCTRL_PIN(153, "UFS_RESET"),
+};
+
+#define DECLARE_MSM_GPIO_PINS(pin) \
+       static const unsigned int gpio##pin##_pins[] = { pin }
+DECLARE_MSM_GPIO_PINS(0);
+DECLARE_MSM_GPIO_PINS(1);
+DECLARE_MSM_GPIO_PINS(2);
+DECLARE_MSM_GPIO_PINS(3);
+DECLARE_MSM_GPIO_PINS(4);
+DECLARE_MSM_GPIO_PINS(5);
+DECLARE_MSM_GPIO_PINS(6);
+DECLARE_MSM_GPIO_PINS(7);
+DECLARE_MSM_GPIO_PINS(8);
+DECLARE_MSM_GPIO_PINS(9);
+DECLARE_MSM_GPIO_PINS(10);
+DECLARE_MSM_GPIO_PINS(11);
+DECLARE_MSM_GPIO_PINS(12);
+DECLARE_MSM_GPIO_PINS(13);
+DECLARE_MSM_GPIO_PINS(14);
+DECLARE_MSM_GPIO_PINS(15);
+DECLARE_MSM_GPIO_PINS(16);
+DECLARE_MSM_GPIO_PINS(17);
+DECLARE_MSM_GPIO_PINS(18);
+DECLARE_MSM_GPIO_PINS(19);
+DECLARE_MSM_GPIO_PINS(20);
+DECLARE_MSM_GPIO_PINS(21);
+DECLARE_MSM_GPIO_PINS(22);
+DECLARE_MSM_GPIO_PINS(23);
+DECLARE_MSM_GPIO_PINS(24);
+DECLARE_MSM_GPIO_PINS(25);
+DECLARE_MSM_GPIO_PINS(26);
+DECLARE_MSM_GPIO_PINS(27);
+DECLARE_MSM_GPIO_PINS(28);
+DECLARE_MSM_GPIO_PINS(29);
+DECLARE_MSM_GPIO_PINS(30);
+DECLARE_MSM_GPIO_PINS(31);
+DECLARE_MSM_GPIO_PINS(32);
+DECLARE_MSM_GPIO_PINS(33);
+DECLARE_MSM_GPIO_PINS(34);
+DECLARE_MSM_GPIO_PINS(35);
+DECLARE_MSM_GPIO_PINS(36);
+DECLARE_MSM_GPIO_PINS(37);
+DECLARE_MSM_GPIO_PINS(38);
+DECLARE_MSM_GPIO_PINS(39);
+DECLARE_MSM_GPIO_PINS(40);
+DECLARE_MSM_GPIO_PINS(41);
+DECLARE_MSM_GPIO_PINS(42);
+DECLARE_MSM_GPIO_PINS(43);
+DECLARE_MSM_GPIO_PINS(44);
+DECLARE_MSM_GPIO_PINS(45);
+DECLARE_MSM_GPIO_PINS(46);
+DECLARE_MSM_GPIO_PINS(47);
+DECLARE_MSM_GPIO_PINS(48);
+DECLARE_MSM_GPIO_PINS(49);
+DECLARE_MSM_GPIO_PINS(50);
+DECLARE_MSM_GPIO_PINS(51);
+DECLARE_MSM_GPIO_PINS(52);
+DECLARE_MSM_GPIO_PINS(53);
+DECLARE_MSM_GPIO_PINS(54);
+DECLARE_MSM_GPIO_PINS(55);
+DECLARE_MSM_GPIO_PINS(56);
+DECLARE_MSM_GPIO_PINS(57);
+DECLARE_MSM_GPIO_PINS(58);
+DECLARE_MSM_GPIO_PINS(59);
+DECLARE_MSM_GPIO_PINS(60);
+DECLARE_MSM_GPIO_PINS(61);
+DECLARE_MSM_GPIO_PINS(62);
+DECLARE_MSM_GPIO_PINS(63);
+DECLARE_MSM_GPIO_PINS(64);
+DECLARE_MSM_GPIO_PINS(65);
+DECLARE_MSM_GPIO_PINS(66);
+DECLARE_MSM_GPIO_PINS(67);
+DECLARE_MSM_GPIO_PINS(68);
+DECLARE_MSM_GPIO_PINS(69);
+DECLARE_MSM_GPIO_PINS(70);
+DECLARE_MSM_GPIO_PINS(71);
+DECLARE_MSM_GPIO_PINS(72);
+DECLARE_MSM_GPIO_PINS(73);
+DECLARE_MSM_GPIO_PINS(74);
+DECLARE_MSM_GPIO_PINS(75);
+DECLARE_MSM_GPIO_PINS(76);
+DECLARE_MSM_GPIO_PINS(77);
+DECLARE_MSM_GPIO_PINS(78);
+DECLARE_MSM_GPIO_PINS(79);
+DECLARE_MSM_GPIO_PINS(80);
+DECLARE_MSM_GPIO_PINS(81);
+DECLARE_MSM_GPIO_PINS(82);
+DECLARE_MSM_GPIO_PINS(83);
+DECLARE_MSM_GPIO_PINS(84);
+DECLARE_MSM_GPIO_PINS(85);
+DECLARE_MSM_GPIO_PINS(86);
+DECLARE_MSM_GPIO_PINS(87);
+DECLARE_MSM_GPIO_PINS(88);
+DECLARE_MSM_GPIO_PINS(89);
+DECLARE_MSM_GPIO_PINS(90);
+DECLARE_MSM_GPIO_PINS(91);
+DECLARE_MSM_GPIO_PINS(92);
+DECLARE_MSM_GPIO_PINS(93);
+DECLARE_MSM_GPIO_PINS(94);
+DECLARE_MSM_GPIO_PINS(95);
+DECLARE_MSM_GPIO_PINS(96);
+DECLARE_MSM_GPIO_PINS(97);
+DECLARE_MSM_GPIO_PINS(98);
+DECLARE_MSM_GPIO_PINS(99);
+DECLARE_MSM_GPIO_PINS(100);
+DECLARE_MSM_GPIO_PINS(101);
+DECLARE_MSM_GPIO_PINS(102);
+DECLARE_MSM_GPIO_PINS(103);
+DECLARE_MSM_GPIO_PINS(104);
+DECLARE_MSM_GPIO_PINS(105);
+DECLARE_MSM_GPIO_PINS(106);
+DECLARE_MSM_GPIO_PINS(107);
+DECLARE_MSM_GPIO_PINS(108);
+DECLARE_MSM_GPIO_PINS(109);
+DECLARE_MSM_GPIO_PINS(110);
+DECLARE_MSM_GPIO_PINS(111);
+DECLARE_MSM_GPIO_PINS(112);
+DECLARE_MSM_GPIO_PINS(113);
+DECLARE_MSM_GPIO_PINS(114);
+DECLARE_MSM_GPIO_PINS(115);
+DECLARE_MSM_GPIO_PINS(116);
+DECLARE_MSM_GPIO_PINS(117);
+DECLARE_MSM_GPIO_PINS(118);
+DECLARE_MSM_GPIO_PINS(119);
+DECLARE_MSM_GPIO_PINS(120);
+DECLARE_MSM_GPIO_PINS(121);
+DECLARE_MSM_GPIO_PINS(122);
+DECLARE_MSM_GPIO_PINS(123);
+DECLARE_MSM_GPIO_PINS(124);
+DECLARE_MSM_GPIO_PINS(125);
+DECLARE_MSM_GPIO_PINS(126);
+DECLARE_MSM_GPIO_PINS(127);
+DECLARE_MSM_GPIO_PINS(128);
+DECLARE_MSM_GPIO_PINS(129);
+DECLARE_MSM_GPIO_PINS(130);
+DECLARE_MSM_GPIO_PINS(131);
+DECLARE_MSM_GPIO_PINS(132);
+DECLARE_MSM_GPIO_PINS(133);
+DECLARE_MSM_GPIO_PINS(134);
+DECLARE_MSM_GPIO_PINS(135);
+DECLARE_MSM_GPIO_PINS(136);
+DECLARE_MSM_GPIO_PINS(137);
+DECLARE_MSM_GPIO_PINS(138);
+DECLARE_MSM_GPIO_PINS(139);
+DECLARE_MSM_GPIO_PINS(140);
+DECLARE_MSM_GPIO_PINS(141);
+DECLARE_MSM_GPIO_PINS(142);
+DECLARE_MSM_GPIO_PINS(143);
+DECLARE_MSM_GPIO_PINS(144);
+DECLARE_MSM_GPIO_PINS(145);
+DECLARE_MSM_GPIO_PINS(146);
+DECLARE_MSM_GPIO_PINS(147);
+DECLARE_MSM_GPIO_PINS(148);
+DECLARE_MSM_GPIO_PINS(149);
+
+static const unsigned int sdc2_clk_pins[] = { 150 };
+static const unsigned int sdc2_cmd_pins[] = { 151 };
+static const unsigned int sdc2_data_pins[] = { 152 };
+static const unsigned int ufs_reset_pins[] = { 153 };
+
+enum msm8998_functions {
+       msm_mux_adsp_ext,
+       msm_mux_agera_pll,
+       msm_mux_atest_char,
+       msm_mux_atest_gpsadc0,
+       msm_mux_atest_gpsadc1,
+       msm_mux_atest_tsens,
+       msm_mux_atest_tsens2,
+       msm_mux_atest_usb1,
+       msm_mux_atest_usb10,
+       msm_mux_atest_usb11,
+       msm_mux_atest_usb12,
+       msm_mux_atest_usb13,
+       msm_mux_audio_ref,
+       msm_mux_bimc_dte0,
+       msm_mux_bimc_dte1,
+       msm_mux_blsp10_spi,
+       msm_mux_blsp10_spi_a,
+       msm_mux_blsp10_spi_b,
+       msm_mux_blsp11_i2c,
+       msm_mux_blsp1_spi,
+       msm_mux_blsp1_spi_a,
+       msm_mux_blsp1_spi_b,
+       msm_mux_blsp2_spi,
+       msm_mux_blsp9_spi,
+       msm_mux_blsp_i2c1,
+       msm_mux_blsp_i2c10,
+       msm_mux_blsp_i2c11,
+       msm_mux_blsp_i2c12,
+       msm_mux_blsp_i2c2,
+       msm_mux_blsp_i2c3,
+       msm_mux_blsp_i2c4,
+       msm_mux_blsp_i2c5,
+       msm_mux_blsp_i2c6,
+       msm_mux_blsp_i2c7,
+       msm_mux_blsp_i2c8,
+       msm_mux_blsp_i2c9,
+       msm_mux_blsp_spi1,
+       msm_mux_blsp_spi10,
+       msm_mux_blsp_spi11,
+       msm_mux_blsp_spi12,
+       msm_mux_blsp_spi2,
+       msm_mux_blsp_spi3,
+       msm_mux_blsp_spi4,
+       msm_mux_blsp_spi5,
+       msm_mux_blsp_spi6,
+       msm_mux_blsp_spi7,
+       msm_mux_blsp_spi8,
+       msm_mux_blsp_spi9,
+       msm_mux_blsp_uart1_a,
+       msm_mux_blsp_uart1_b,
+       msm_mux_blsp_uart2_a,
+       msm_mux_blsp_uart2_b,
+       msm_mux_blsp_uart3_a,
+       msm_mux_blsp_uart3_b,
+       msm_mux_blsp_uart7_a,
+       msm_mux_blsp_uart7_b,
+       msm_mux_blsp_uart8,
+       msm_mux_blsp_uart8_a,
+       msm_mux_blsp_uart8_b,
+       msm_mux_blsp_uart9_a,
+       msm_mux_blsp_uart9_b,
+       msm_mux_blsp_uim1_a,
+       msm_mux_blsp_uim1_b,
+       msm_mux_blsp_uim2_a,
+       msm_mux_blsp_uim2_b,
+       msm_mux_blsp_uim3_a,
+       msm_mux_blsp_uim3_b,
+       msm_mux_blsp_uim7_a,
+       msm_mux_blsp_uim7_b,
+       msm_mux_blsp_uim8_a,
+       msm_mux_blsp_uim8_b,
+       msm_mux_blsp_uim9_a,
+       msm_mux_blsp_uim9_b,
+       msm_mux_bt_reset,
+       msm_mux_btfm_slimbus,
+       msm_mux_cam_mclk,
+       msm_mux_cci_async,
+       msm_mux_cci_i2c,
+       msm_mux_cci_timer0,
+       msm_mux_cci_timer1,
+       msm_mux_cci_timer2,
+       msm_mux_cci_timer3,
+       msm_mux_cci_timer4,
+       msm_mux_cri_trng,
+       msm_mux_cri_trng0,
+       msm_mux_cri_trng1,
+       msm_mux_dbg_out,
+       msm_mux_ddr_bist,
+       msm_mux_edp_hot,
+       msm_mux_edp_lcd,
+       msm_mux_gcc_gp1_a,
+       msm_mux_gcc_gp1_b,
+       msm_mux_gcc_gp2_a,
+       msm_mux_gcc_gp2_b,
+       msm_mux_gcc_gp3_a,
+       msm_mux_gcc_gp3_b,
+       msm_mux_gpio,
+       msm_mux_hdmi_cec,
+       msm_mux_hdmi_ddc,
+       msm_mux_hdmi_hot,
+       msm_mux_hdmi_rcv,
+       msm_mux_isense_dbg,
+       msm_mux_jitter_bist,
+       msm_mux_ldo_en,
+       msm_mux_ldo_update,
+       msm_mux_lpass_slimbus,
+       msm_mux_m_voc,
+       msm_mux_mdp_vsync,
+       msm_mux_mdp_vsync0,
+       msm_mux_mdp_vsync1,
+       msm_mux_mdp_vsync2,
+       msm_mux_mdp_vsync3,
+       msm_mux_mdp_vsync_a,
+       msm_mux_mdp_vsync_b,
+       msm_mux_modem_tsync,
+       msm_mux_mss_lte,
+       msm_mux_nav_dr,
+       msm_mux_nav_pps,
+       msm_mux_pa_indicator,
+       msm_mux_pci_e0,
+       msm_mux_phase_flag,
+       msm_mux_pll_bypassnl,
+       msm_mux_pll_reset,
+       msm_mux_pri_mi2s,
+       msm_mux_pri_mi2s_ws,
+       msm_mux_prng_rosc,
+       msm_mux_pwr_crypto,
+       msm_mux_pwr_modem,
+       msm_mux_pwr_nav,
+       msm_mux_qdss_cti0_a,
+       msm_mux_qdss_cti0_b,
+       msm_mux_qdss_cti1_a,
+       msm_mux_qdss_cti1_b,
+       msm_mux_qdss,
+       msm_mux_qlink_enable,
+       msm_mux_qlink_request,
+       msm_mux_qua_mi2s,
+       msm_mux_sd_card,
+       msm_mux_sd_write,
+       msm_mux_sdc40,
+       msm_mux_sdc41,
+       msm_mux_sdc42,
+       msm_mux_sdc43,
+       msm_mux_sdc4_clk,
+       msm_mux_sdc4_cmd,
+       msm_mux_sec_mi2s,
+       msm_mux_sp_cmu,
+       msm_mux_spkr_i2s,
+       msm_mux_ssbi1,
+       msm_mux_ssc_irq,
+       msm_mux_ter_mi2s,
+       msm_mux_tgu_ch0,
+       msm_mux_tgu_ch1,
+       msm_mux_tsense_pwm1,
+       msm_mux_tsense_pwm2,
+       msm_mux_tsif1_clk,
+       msm_mux_tsif1_data,
+       msm_mux_tsif1_en,
+       msm_mux_tsif1_error,
+       msm_mux_tsif1_sync,
+       msm_mux_tsif2_clk,
+       msm_mux_tsif2_data,
+       msm_mux_tsif2_en,
+       msm_mux_tsif2_error,
+       msm_mux_tsif2_sync,
+       msm_mux_uim1_clk,
+       msm_mux_uim1_data,
+       msm_mux_uim1_present,
+       msm_mux_uim1_reset,
+       msm_mux_uim2_clk,
+       msm_mux_uim2_data,
+       msm_mux_uim2_present,
+       msm_mux_uim2_reset,
+       msm_mux_uim_batt,
+       msm_mux_usb_phy,
+       msm_mux_vfr_1,
+       msm_mux_vsense_clkout,
+       msm_mux_vsense_data0,
+       msm_mux_vsense_data1,
+       msm_mux_vsense_mode,
+       msm_mux_wlan1_adc0,
+       msm_mux_wlan1_adc1,
+       msm_mux_wlan2_adc0,
+       msm_mux_wlan2_adc1,
+       msm_mux__,
+};
+
+static const char * const gpio_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
+       "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
+       "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
+       "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
+       "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
+       "gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
+       "gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
+       "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
+       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68", "gpio69", "gpio70",
+       "gpio71", "gpio72", "gpio73", "gpio74", "gpio75", "gpio76", "gpio77",
+       "gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84",
+       "gpio85", "gpio86", "gpio87", "gpio88", "gpio89", "gpio90", "gpio91",
+       "gpio92", "gpio93", "gpio94", "gpio95", "gpio96", "gpio97", "gpio98",
+       "gpio99", "gpio100", "gpio101", "gpio102", "gpio103", "gpio104",
+       "gpio105", "gpio106", "gpio107", "gpio108", "gpio109", "gpio110",
+       "gpio111", "gpio112", "gpio113", "gpio114", "gpio115", "gpio116",
+       "gpio117", "gpio118", "gpio119", "gpio120", "gpio121", "gpio122",
+       "gpio123", "gpio124", "gpio125", "gpio126", "gpio127", "gpio128",
+       "gpio129", "gpio130", "gpio131", "gpio132", "gpio133", "gpio134",
+       "gpio135", "gpio136", "gpio137", "gpio138", "gpio139", "gpio140",
+       "gpio141", "gpio142", "gpio143", "gpio144", "gpio145", "gpio146",
+       "gpio147", "gpio148", "gpio149",
+};
+static const char * const blsp_spi1_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3",
+};
+static const char * const blsp_uim1_a_groups[] = {
+       "gpio0", "gpio1",
+};
+static const char * const blsp_uart1_a_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3",
+};
+static const char * const blsp_i2c1_groups[] = {
+       "gpio2", "gpio3",
+};
+static const char * const blsp_spi8_groups[] = {
+       "gpio4", "gpio5", "gpio6", "gpio7",
+};
+static const char * const blsp_uart8_a_groups[] = {
+       "gpio4", "gpio5", "gpio6", "gpio7",
+};
+static const char * const blsp_uim8_a_groups[] = {
+       "gpio4", "gpio5",
+};
+static const char * const qdss_cti0_b_groups[] = {
+       "gpio4", "gpio5",
+};
+static const char * const blsp_i2c8_groups[] = {
+       "gpio6", "gpio7",
+};
+static const char * const ddr_bist_groups[] = {
+       "gpio7", "gpio8", "gpio9", "gpio10",
+};
+static const char * const atest_tsens2_groups[] = {
+       "gpio7",
+};
+static const char * const atest_usb1_groups[] = {
+       "gpio7",
+};
+static const char * const blsp_spi4_groups[] = {
+       "gpio8", "gpio9", "gpio10", "gpio11",
+};
+static const char * const blsp_uart1_b_groups[] = {
+       "gpio8", "gpio9", "gpio10", "gpio11",
+};
+static const char * const blsp_uim1_b_groups[] = {
+       "gpio8", "gpio9",
+};
+static const char * const wlan1_adc1_groups[] = {
+       "gpio8",
+};
+static const char * const atest_usb13_groups[] = {
+       "gpio8",
+};
+static const char * const bimc_dte1_groups[] = {
+       "gpio8", "gpio10",
+};
+static const char * const tsif1_sync_groups[] = {
+       "gpio9",
+};
+static const char * const wlan1_adc0_groups[] = {
+       "gpio9",
+};
+static const char * const atest_usb12_groups[] = {
+       "gpio9",
+};
+static const char * const bimc_dte0_groups[] = {
+       "gpio9", "gpio11",
+};
+static const char * const mdp_vsync_a_groups[] = {
+       "gpio10", "gpio11",
+};
+static const char * const blsp_i2c4_groups[] = {
+       "gpio10", "gpio11",
+};
+static const char * const atest_gpsadc1_groups[] = {
+       "gpio10",
+};
+static const char * const wlan2_adc1_groups[] = {
+       "gpio10",
+};
+static const char * const atest_usb11_groups[] = {
+       "gpio10",
+};
+static const char * const edp_lcd_groups[] = {
+       "gpio11",
+};
+static const char * const dbg_out_groups[] = {
+       "gpio11",
+};
+static const char * const atest_gpsadc0_groups[] = {
+       "gpio11",
+};
+static const char * const wlan2_adc0_groups[] = {
+       "gpio11",
+};
+static const char * const atest_usb10_groups[] = {
+       "gpio11",
+};
+static const char * const mdp_vsync_groups[] = {
+       "gpio12",
+};
+static const char * const m_voc_groups[] = {
+       "gpio12",
+};
+static const char * const cam_mclk_groups[] = {
+       "gpio13", "gpio14", "gpio15", "gpio16",
+};
+static const char * const pll_bypassnl_groups[] = {
+       "gpio13",
+};
+static const char * const qdss_groups[] = {
+       "gpio13", "gpio14", "gpio15", "gpio16", "gpio17", "gpio18", "gpio19",
+       "gpio20", "gpio21", "gpio22", "gpio23", "gpio24", "gpio25", "gpio26",
+       "gpio27", "gpio28", "gpio29", "gpio30", "gpio41", "gpio42", "gpio43",
+       "gpio44", "gpio75", "gpio76", "gpio77", "gpio79", "gpio80", "gpio93",
+       "gpio117", "gpio118", "gpio119", "gpio120", "gpio121", "gpio122",
+       "gpio123", "gpio124",
+};
+static const char * const pll_reset_groups[] = {
+       "gpio14",
+};
+static const char * const cci_i2c_groups[] = {
+       "gpio17", "gpio18", "gpio19", "gpio20",
+};
+static const char * const phase_flag_groups[] = {
+       "gpio18", "gpio19", "gpio73", "gpio74", "gpio75", "gpio76", "gpio77",
+       "gpio89", "gpio91", "gpio92", "gpio96", "gpio114", "gpio115",
+       "gpio116", "gpio117", "gpio118", "gpio119", "gpio120", "gpio121",
+       "gpio122", "gpio123", "gpio124", "gpio125", "gpio126", "gpio128",
+       "gpio129", "gpio130", "gpio131", "gpio132", "gpio133", "gpio134",
+};
+static const char * const cci_timer4_groups[] = {
+       "gpio25",
+};
+static const char * const blsp2_spi_groups[] = {
+       "gpio25", "gpio29", "gpio30",
+};
+static const char * const cci_timer0_groups[] = {
+       "gpio21",
+};
+static const char * const vsense_data0_groups[] = {
+       "gpio21",
+};
+static const char * const cci_timer1_groups[] = {
+       "gpio22",
+};
+static const char * const vsense_data1_groups[] = {
+       "gpio22",
+};
+static const char * const cci_timer2_groups[] = {
+       "gpio23",
+};
+static const char * const blsp1_spi_b_groups[] = {
+       "gpio23", "gpio28",
+};
+static const char * const vsense_mode_groups[] = {
+       "gpio23",
+};
+static const char * const cci_timer3_groups[] = {
+       "gpio24",
+};
+static const char * const cci_async_groups[] = {
+       "gpio24", "gpio25", "gpio26",
+};
+static const char * const blsp1_spi_a_groups[] = {
+       "gpio24", "gpio27",
+};
+static const char * const vsense_clkout_groups[] = {
+       "gpio24",
+};
+static const char * const hdmi_rcv_groups[] = {
+       "gpio30",
+};
+static const char * const hdmi_cec_groups[] = {
+       "gpio31",
+};
+static const char * const blsp_spi2_groups[] = {
+       "gpio31", "gpio32", "gpio33", "gpio34",
+};
+static const char * const blsp_uart2_a_groups[] = {
+       "gpio31", "gpio32", "gpio33", "gpio34",
+};
+static const char * const blsp_uim2_a_groups[] = {
+       "gpio31", "gpio34",
+};
+static const char * const pwr_modem_groups[] = {
+       "gpio31",
+};
+static const char * const hdmi_ddc_groups[] = {
+       "gpio32", "gpio33",
+};
+static const char * const blsp_i2c2_groups[] = {
+       "gpio32", "gpio33",
+};
+static const char * const pwr_nav_groups[] = {
+       "gpio32",
+};
+static const char * const pwr_crypto_groups[] = {
+       "gpio33",
+};
+static const char * const hdmi_hot_groups[] = {
+       "gpio34",
+};
+static const char * const edp_hot_groups[] = {
+       "gpio34",
+};
+static const char * const pci_e0_groups[] = {
+       "gpio35", "gpio36", "gpio37",
+};
+static const char * const jitter_bist_groups[] = {
+       "gpio35",
+};
+static const char * const agera_pll_groups[] = {
+       "gpio36", "gpio37",
+};
+static const char * const atest_tsens_groups[] = {
+       "gpio36",
+};
+static const char * const usb_phy_groups[] = {
+       "gpio38",
+};
+static const char * const lpass_slimbus_groups[] = {
+       "gpio39", "gpio70", "gpio71", "gpio72",
+};
+static const char * const sd_write_groups[] = {
+       "gpio40",
+};
+static const char * const tsif1_error_groups[] = {
+       "gpio40",
+};
+static const char * const blsp_spi6_groups[] = {
+       "gpio41", "gpio42", "gpio43", "gpio44",
+};
+static const char * const blsp_uart3_b_groups[] = {
+       "gpio41", "gpio42", "gpio43", "gpio44",
+};
+static const char * const blsp_uim3_b_groups[] = {
+       "gpio41", "gpio42",
+};
+static const char * const blsp_i2c6_groups[] = {
+       "gpio43", "gpio44",
+};
+static const char * const bt_reset_groups[] = {
+       "gpio45",
+};
+static const char * const blsp_spi3_groups[] = {
+       "gpio45", "gpio46", "gpio47", "gpio48",
+};
+static const char * const blsp_uart3_a_groups[] = {
+       "gpio45", "gpio46", "gpio47", "gpio48",
+};
+static const char * const blsp_uim3_a_groups[] = {
+       "gpio45", "gpio46",
+};
+static const char * const blsp_i2c3_groups[] = {
+       "gpio47", "gpio48",
+};
+static const char * const blsp_spi9_groups[] = {
+       "gpio49", "gpio50", "gpio51", "gpio52",
+};
+static const char * const blsp_uart9_a_groups[] = {
+       "gpio49", "gpio50", "gpio51", "gpio52",
+};
+static const char * const blsp_uim9_a_groups[] = {
+       "gpio49", "gpio50",
+};
+static const char * const blsp10_spi_b_groups[] = {
+       "gpio49", "gpio50",
+};
+static const char * const qdss_cti0_a_groups[] = {
+       "gpio49", "gpio50",
+};
+static const char * const blsp_i2c9_groups[] = {
+       "gpio51", "gpio52",
+};
+static const char * const blsp10_spi_a_groups[] = {
+       "gpio51", "gpio52",
+};
+static const char * const blsp_spi7_groups[] = {
+       "gpio53", "gpio54", "gpio55", "gpio56",
+};
+static const char * const blsp_uart7_a_groups[] = {
+       "gpio53", "gpio54", "gpio55", "gpio56",
+};
+static const char * const blsp_uim7_a_groups[] = {
+       "gpio53", "gpio54",
+};
+static const char * const blsp_i2c7_groups[] = {
+       "gpio55", "gpio56",
+};
+static const char * const qua_mi2s_groups[] = {
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
+};
+static const char * const blsp10_spi_groups[] = {
+       "gpio57",
+};
+static const char * const gcc_gp1_a_groups[] = {
+       "gpio57",
+};
+static const char * const ssc_irq_groups[] = {
+       "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", "gpio78",
+       "gpio79", "gpio80", "gpio117", "gpio118", "gpio119", "gpio120",
+       "gpio121", "gpio122", "gpio123", "gpio124", "gpio125",
+};
+static const char * const blsp_spi11_groups[] = {
+       "gpio58", "gpio59", "gpio60", "gpio61",
+};
+static const char * const blsp_uart8_b_groups[] = {
+       "gpio58", "gpio59", "gpio60", "gpio61",
+};
+static const char * const blsp_uim8_b_groups[] = {
+       "gpio58", "gpio59",
+};
+static const char * const gcc_gp2_a_groups[] = {
+       "gpio58",
+};
+static const char * const qdss_cti1_a_groups[] = {
+       "gpio58", "gpio59",
+};
+static const char * const gcc_gp3_a_groups[] = {
+       "gpio59",
+};
+static const char * const blsp_i2c11_groups[] = {
+       "gpio60", "gpio61",
+};
+static const char * const cri_trng0_groups[] = {
+       "gpio60",
+};
+static const char * const cri_trng1_groups[] = {
+       "gpio61",
+};
+static const char * const cri_trng_groups[] = {
+       "gpio62",
+};
+static const char * const pri_mi2s_groups[] = {
+       "gpio64", "gpio65", "gpio67", "gpio68",
+};
+static const char * const sp_cmu_groups[] = {
+       "gpio64",
+};
+static const char * const blsp_spi10_groups[] = {
+       "gpio65", "gpio66", "gpio67", "gpio68",
+};
+static const char * const blsp_uart7_b_groups[] = {
+       "gpio65", "gpio66", "gpio67", "gpio68",
+};
+static const char * const blsp_uim7_b_groups[] = {
+       "gpio65", "gpio66",
+};
+static const char * const pri_mi2s_ws_groups[] = {
+       "gpio66",
+};
+static const char * const blsp_i2c10_groups[] = {
+       "gpio67", "gpio68",
+};
+static const char * const spkr_i2s_groups[] = {
+       "gpio69", "gpio70", "gpio71", "gpio72",
+};
+static const char * const audio_ref_groups[] = {
+       "gpio69",
+};
+static const char * const blsp9_spi_groups[] = {
+       "gpio70", "gpio71", "gpio72",
+};
+static const char * const tsense_pwm1_groups[] = {
+       "gpio71",
+};
+static const char * const tsense_pwm2_groups[] = {
+       "gpio71",
+};
+static const char * const btfm_slimbus_groups[] = {
+       "gpio73", "gpio74",
+};
+static const char * const ter_mi2s_groups[] = {
+       "gpio74", "gpio75", "gpio76", "gpio77", "gpio78",
+};
+static const char * const gcc_gp1_b_groups[] = {
+       "gpio78",
+};
+static const char * const sec_mi2s_groups[] = {
+       "gpio79", "gpio80", "gpio81", "gpio82", "gpio83",
+};
+static const char * const blsp_spi12_groups[] = {
+       "gpio81", "gpio82", "gpio83", "gpio84",
+};
+static const char * const blsp_uart9_b_groups[] = {
+       "gpio81", "gpio82", "gpio83", "gpio84",
+};
+static const char * const blsp_uim9_b_groups[] = {
+       "gpio81", "gpio82",
+};
+static const char * const gcc_gp2_b_groups[] = {
+       "gpio81",
+};
+static const char * const gcc_gp3_b_groups[] = {
+       "gpio82",
+};
+static const char * const blsp_i2c12_groups[] = {
+       "gpio83", "gpio84",
+};
+static const char * const blsp_spi5_groups[] = {
+       "gpio85", "gpio86", "gpio87", "gpio88",
+};
+static const char * const blsp_uart2_b_groups[] = {
+       "gpio85", "gpio86", "gpio87", "gpio88",
+};
+static const char * const blsp_uim2_b_groups[] = {
+       "gpio85", "gpio86",
+};
+static const char * const blsp_i2c5_groups[] = {
+       "gpio87", "gpio88",
+};
+static const char * const tsif1_clk_groups[] = {
+       "gpio89",
+};
+static const char * const tsif1_en_groups[] = {
+       "gpio90",
+};
+static const char * const mdp_vsync0_groups[] = {
+       "gpio90",
+};
+static const char * const mdp_vsync1_groups[] = {
+       "gpio90",
+};
+static const char * const mdp_vsync2_groups[] = {
+       "gpio90",
+};
+static const char * const mdp_vsync3_groups[] = {
+       "gpio90",
+};
+static const char * const blsp1_spi_groups[] = {
+       "gpio90",
+};
+static const char * const tgu_ch0_groups[] = {
+       "gpio90",
+};
+static const char * const qdss_cti1_b_groups[] = {
+       "gpio90", "gpio91",
+};
+static const char * const tsif1_data_groups[] = {
+       "gpio91",
+};
+static const char * const sdc4_cmd_groups[] = {
+       "gpio91",
+};
+static const char * const tgu_ch1_groups[] = {
+       "gpio91",
+};
+static const char * const tsif2_error_groups[] = {
+       "gpio92",
+};
+static const char * const sdc43_groups[] = {
+       "gpio92",
+};
+static const char * const vfr_1_groups[] = {
+       "gpio92",
+};
+static const char * const tsif2_clk_groups[] = {
+       "gpio93",
+};
+static const char * const sdc4_clk_groups[] = {
+       "gpio93",
+};
+static const char * const tsif2_en_groups[] = {
+       "gpio94",
+};
+static const char * const sdc42_groups[] = {
+       "gpio94",
+};
+static const char * const sd_card_groups[] = {
+       "gpio95",
+};
+static const char * const tsif2_data_groups[] = {
+       "gpio95",
+};
+static const char * const sdc41_groups[] = {
+       "gpio95",
+};
+static const char * const tsif2_sync_groups[] = {
+       "gpio96",
+};
+static const char * const sdc40_groups[] = {
+       "gpio96",
+};
+static const char * const mdp_vsync_b_groups[] = {
+       "gpio97", "gpio98",
+};
+static const char * const ldo_en_groups[] = {
+       "gpio97",
+};
+static const char * const ldo_update_groups[] = {
+       "gpio98",
+};
+static const char * const blsp_uart8_groups[] = {
+       "gpio100", "gpio101",
+};
+static const char * const blsp11_i2c_groups[] = {
+       "gpio102", "gpio103",
+};
+static const char * const prng_rosc_groups[] = {
+       "gpio102",
+};
+static const char * const uim2_data_groups[] = {
+       "gpio105",
+};
+static const char * const uim2_clk_groups[] = {
+       "gpio106",
+};
+static const char * const uim2_reset_groups[] = {
+       "gpio107",
+};
+static const char * const uim2_present_groups[] = {
+       "gpio108",
+};
+static const char * const uim1_data_groups[] = {
+       "gpio109",
+};
+static const char * const uim1_clk_groups[] = {
+       "gpio110",
+};
+static const char * const uim1_reset_groups[] = {
+       "gpio111",
+};
+static const char * const uim1_present_groups[] = {
+       "gpio112",
+};
+static const char * const uim_batt_groups[] = {
+       "gpio113",
+};
+static const char * const nav_dr_groups[] = {
+       "gpio115",
+};
+static const char * const atest_char_groups[] = {
+       "gpio117", "gpio118", "gpio119", "gpio120", "gpio121",
+};
+static const char * const adsp_ext_groups[] = {
+       "gpio118",
+};
+static const char * const modem_tsync_groups[] = {
+       "gpio128",
+};
+static const char * const nav_pps_groups[] = {
+       "gpio128",
+};
+static const char * const qlink_request_groups[] = {
+       "gpio130",
+};
+static const char * const qlink_enable_groups[] = {
+       "gpio131",
+};
+static const char * const pa_indicator_groups[] = {
+       "gpio135",
+};
+static const char * const ssbi1_groups[] = {
+       "gpio142",
+};
+static const char * const isense_dbg_groups[] = {
+       "gpio143",
+};
+static const char * const mss_lte_groups[] = {
+       "gpio144", "gpio145",
+};
+
+static const struct msm_function msm8998_functions[] = {
+       FUNCTION(gpio),
+       FUNCTION(adsp_ext),
+       FUNCTION(agera_pll),
+       FUNCTION(atest_char),
+       FUNCTION(atest_gpsadc0),
+       FUNCTION(atest_gpsadc1),
+       FUNCTION(atest_tsens),
+       FUNCTION(atest_tsens2),
+       FUNCTION(atest_usb1),
+       FUNCTION(atest_usb10),
+       FUNCTION(atest_usb11),
+       FUNCTION(atest_usb12),
+       FUNCTION(atest_usb13),
+       FUNCTION(audio_ref),
+       FUNCTION(bimc_dte0),
+       FUNCTION(bimc_dte1),
+       FUNCTION(blsp10_spi),
+       FUNCTION(blsp10_spi_a),
+       FUNCTION(blsp10_spi_b),
+       FUNCTION(blsp11_i2c),
+       FUNCTION(blsp1_spi),
+       FUNCTION(blsp1_spi_a),
+       FUNCTION(blsp1_spi_b),
+       FUNCTION(blsp2_spi),
+       FUNCTION(blsp9_spi),
+       FUNCTION(blsp_i2c1),
+       FUNCTION(blsp_i2c2),
+       FUNCTION(blsp_i2c3),
+       FUNCTION(blsp_i2c4),
+       FUNCTION(blsp_i2c5),
+       FUNCTION(blsp_i2c6),
+       FUNCTION(blsp_i2c7),
+       FUNCTION(blsp_i2c8),
+       FUNCTION(blsp_i2c9),
+       FUNCTION(blsp_i2c10),
+       FUNCTION(blsp_i2c11),
+       FUNCTION(blsp_i2c12),
+       FUNCTION(blsp_spi1),
+       FUNCTION(blsp_spi2),
+       FUNCTION(blsp_spi3),
+       FUNCTION(blsp_spi4),
+       FUNCTION(blsp_spi5),
+       FUNCTION(blsp_spi6),
+       FUNCTION(blsp_spi7),
+       FUNCTION(blsp_spi8),
+       FUNCTION(blsp_spi9),
+       FUNCTION(blsp_spi10),
+       FUNCTION(blsp_spi11),
+       FUNCTION(blsp_spi12),
+       FUNCTION(blsp_uart1_a),
+       FUNCTION(blsp_uart1_b),
+       FUNCTION(blsp_uart2_a),
+       FUNCTION(blsp_uart2_b),
+       FUNCTION(blsp_uart3_a),
+       FUNCTION(blsp_uart3_b),
+       FUNCTION(blsp_uart7_a),
+       FUNCTION(blsp_uart7_b),
+       FUNCTION(blsp_uart8),
+       FUNCTION(blsp_uart8_a),
+       FUNCTION(blsp_uart8_b),
+       FUNCTION(blsp_uart9_a),
+       FUNCTION(blsp_uart9_b),
+       FUNCTION(blsp_uim1_a),
+       FUNCTION(blsp_uim1_b),
+       FUNCTION(blsp_uim2_a),
+       FUNCTION(blsp_uim2_b),
+       FUNCTION(blsp_uim3_a),
+       FUNCTION(blsp_uim3_b),
+       FUNCTION(blsp_uim7_a),
+       FUNCTION(blsp_uim7_b),
+       FUNCTION(blsp_uim8_a),
+       FUNCTION(blsp_uim8_b),
+       FUNCTION(blsp_uim9_a),
+       FUNCTION(blsp_uim9_b),
+       FUNCTION(bt_reset),
+       FUNCTION(btfm_slimbus),
+       FUNCTION(cam_mclk),
+       FUNCTION(cci_async),
+       FUNCTION(cci_i2c),
+       FUNCTION(cci_timer0),
+       FUNCTION(cci_timer1),
+       FUNCTION(cci_timer2),
+       FUNCTION(cci_timer3),
+       FUNCTION(cci_timer4),
+       FUNCTION(cri_trng),
+       FUNCTION(cri_trng0),
+       FUNCTION(cri_trng1),
+       FUNCTION(dbg_out),
+       FUNCTION(ddr_bist),
+       FUNCTION(edp_hot),
+       FUNCTION(edp_lcd),
+       FUNCTION(gcc_gp1_a),
+       FUNCTION(gcc_gp1_b),
+       FUNCTION(gcc_gp2_a),
+       FUNCTION(gcc_gp2_b),
+       FUNCTION(gcc_gp3_a),
+       FUNCTION(gcc_gp3_b),
+       FUNCTION(hdmi_cec),
+       FUNCTION(hdmi_ddc),
+       FUNCTION(hdmi_hot),
+       FUNCTION(hdmi_rcv),
+       FUNCTION(isense_dbg),
+       FUNCTION(jitter_bist),
+       FUNCTION(ldo_en),
+       FUNCTION(ldo_update),
+       FUNCTION(lpass_slimbus),
+       FUNCTION(m_voc),
+       FUNCTION(mdp_vsync),
+       FUNCTION(mdp_vsync0),
+       FUNCTION(mdp_vsync1),
+       FUNCTION(mdp_vsync2),
+       FUNCTION(mdp_vsync3),
+       FUNCTION(mdp_vsync_a),
+       FUNCTION(mdp_vsync_b),
+       FUNCTION(modem_tsync),
+       FUNCTION(mss_lte),
+       FUNCTION(nav_dr),
+       FUNCTION(nav_pps),
+       FUNCTION(pa_indicator),
+       FUNCTION(pci_e0),
+       FUNCTION(phase_flag),
+       FUNCTION(pll_bypassnl),
+       FUNCTION(pll_reset),
+       FUNCTION(pri_mi2s),
+       FUNCTION(pri_mi2s_ws),
+       FUNCTION(prng_rosc),
+       FUNCTION(pwr_crypto),
+       FUNCTION(pwr_modem),
+       FUNCTION(pwr_nav),
+       FUNCTION(qdss_cti0_a),
+       FUNCTION(qdss_cti0_b),
+       FUNCTION(qdss_cti1_a),
+       FUNCTION(qdss_cti1_b),
+       FUNCTION(qdss),
+       FUNCTION(qlink_enable),
+       FUNCTION(qlink_request),
+       FUNCTION(qua_mi2s),
+       FUNCTION(sd_card),
+       FUNCTION(sd_write),
+       FUNCTION(sdc40),
+       FUNCTION(sdc41),
+       FUNCTION(sdc42),
+       FUNCTION(sdc43),
+       FUNCTION(sdc4_clk),
+       FUNCTION(sdc4_cmd),
+       FUNCTION(sec_mi2s),
+       FUNCTION(sp_cmu),
+       FUNCTION(spkr_i2s),
+       FUNCTION(ssbi1),
+       FUNCTION(ssc_irq),
+       FUNCTION(ter_mi2s),
+       FUNCTION(tgu_ch0),
+       FUNCTION(tgu_ch1),
+       FUNCTION(tsense_pwm1),
+       FUNCTION(tsense_pwm2),
+       FUNCTION(tsif1_clk),
+       FUNCTION(tsif1_data),
+       FUNCTION(tsif1_en),
+       FUNCTION(tsif1_error),
+       FUNCTION(tsif1_sync),
+       FUNCTION(tsif2_clk),
+       FUNCTION(tsif2_data),
+       FUNCTION(tsif2_en),
+       FUNCTION(tsif2_error),
+       FUNCTION(tsif2_sync),
+       FUNCTION(uim1_clk),
+       FUNCTION(uim1_data),
+       FUNCTION(uim1_present),
+       FUNCTION(uim1_reset),
+       FUNCTION(uim2_clk),
+       FUNCTION(uim2_data),
+       FUNCTION(uim2_present),
+       FUNCTION(uim2_reset),
+       FUNCTION(uim_batt),
+       FUNCTION(usb_phy),
+       FUNCTION(vfr_1),
+       FUNCTION(vsense_clkout),
+       FUNCTION(vsense_data0),
+       FUNCTION(vsense_data1),
+       FUNCTION(vsense_mode),
+       FUNCTION(wlan1_adc0),
+       FUNCTION(wlan1_adc1),
+       FUNCTION(wlan2_adc0),
+       FUNCTION(wlan2_adc1),
+};
+
+static const struct msm_pingroup msm8998_groups[] = {
+       PINGROUP(0, EAST, blsp_spi1, blsp_uart1_a, blsp_uim1_a, _, _, _, _, _, _),
+       PINGROUP(1, EAST, blsp_spi1, blsp_uart1_a, blsp_uim1_a, _, _, _, _, _, _),
+       PINGROUP(2, EAST, blsp_spi1, blsp_uart1_a, blsp_i2c1, _, _, _, _, _, _),
+       PINGROUP(3, EAST, blsp_spi1, blsp_uart1_a, blsp_i2c1, _, _, _, _, _, _),
+       PINGROUP(4, WEST, blsp_spi8, blsp_uart8_a, blsp_uim8_a, _, qdss_cti0_b, _, _, _, _),
+       PINGROUP(5, WEST, blsp_spi8, blsp_uart8_a, blsp_uim8_a, _, qdss_cti0_b, _, _, _, _),
+       PINGROUP(6, WEST, blsp_spi8, blsp_uart8_a, blsp_i2c8, _, _, _, _, _, _),
+       PINGROUP(7, WEST, blsp_spi8, blsp_uart8_a, blsp_i2c8, ddr_bist, _, atest_tsens2, atest_usb1, _, _),
+       PINGROUP(8, EAST, blsp_spi4, blsp_uart1_b, blsp_uim1_b, _, ddr_bist, _, wlan1_adc1, atest_usb13, bimc_dte1),
+       PINGROUP(9, EAST, blsp_spi4, blsp_uart1_b, blsp_uim1_b, tsif1_sync, ddr_bist, _, wlan1_adc0, atest_usb12, bimc_dte0),
+       PINGROUP(10, EAST, mdp_vsync_a, blsp_spi4, blsp_uart1_b, blsp_i2c4, ddr_bist, atest_gpsadc1, wlan2_adc1, atest_usb11, bimc_dte1),
+       PINGROUP(11, EAST, mdp_vsync_a, edp_lcd, blsp_spi4, blsp_uart1_b, blsp_i2c4, dbg_out, atest_gpsadc0, wlan2_adc0, atest_usb10),
+       PINGROUP(12, EAST, mdp_vsync, m_voc, _, _, _, _, _, _, _),
+       PINGROUP(13, EAST, cam_mclk, pll_bypassnl, qdss, _, _, _, _, _, _),
+       PINGROUP(14, EAST, cam_mclk, pll_reset, qdss, _, _, _, _, _, _),
+       PINGROUP(15, EAST, cam_mclk, qdss, _, _, _, _, _, _, _),
+       PINGROUP(16, EAST, cam_mclk, qdss, _, _, _, _, _, _, _),
+       PINGROUP(17, EAST, cci_i2c, qdss, _, _, _, _, _, _, _),
+       PINGROUP(18, EAST, cci_i2c, phase_flag, qdss, _, _, _, _, _, _),
+       PINGROUP(19, EAST, cci_i2c, phase_flag, qdss, _, _, _, _, _, _),
+       PINGROUP(20, EAST, cci_i2c, qdss, _, _, _, _, _, _, _),
+       PINGROUP(21, EAST, cci_timer0, _, qdss, vsense_data0, _, _, _, _, _),
+       PINGROUP(22, EAST, cci_timer1, _, qdss, vsense_data1, _, _, _, _, _),
+       PINGROUP(23, EAST, cci_timer2, blsp1_spi_b, qdss, vsense_mode, _, _, _, _, _),
+       PINGROUP(24, EAST, cci_timer3, cci_async, blsp1_spi_a, _, qdss, vsense_clkout, _, _, _),
+       PINGROUP(25, EAST, cci_timer4, cci_async, blsp2_spi, _, qdss, _, _, _, _),
+       PINGROUP(26, EAST, cci_async, qdss, _, _, _, _, _, _, _),
+       PINGROUP(27, EAST, blsp1_spi_a, qdss, _, _, _, _, _, _, _),
+       PINGROUP(28, EAST, blsp1_spi_b, qdss, _, _, _, _, _, _, _),
+       PINGROUP(29, EAST, blsp2_spi, _, qdss, _, _, _, _, _, _),
+       PINGROUP(30, EAST, hdmi_rcv, blsp2_spi, qdss, _, _, _, _, _, _),
+       PINGROUP(31, EAST, hdmi_cec, blsp_spi2, blsp_uart2_a, blsp_uim2_a, pwr_modem, _, _, _, _),
+       PINGROUP(32, EAST, hdmi_ddc, blsp_spi2, blsp_uart2_a, blsp_i2c2, pwr_nav, _, _, _, _),
+       PINGROUP(33, EAST, hdmi_ddc, blsp_spi2, blsp_uart2_a, blsp_i2c2, pwr_crypto, _, _, _, _),
+       PINGROUP(34, EAST, hdmi_hot, edp_hot, blsp_spi2, blsp_uart2_a, blsp_uim2_a, _, _, _, _),
+       PINGROUP(35, NORTH, pci_e0, jitter_bist, _, _, _, _, _, _, _),
+       PINGROUP(36, NORTH, pci_e0, agera_pll, _, atest_tsens, _, _, _, _, _),
+       PINGROUP(37, NORTH, agera_pll, _, _, _, _, _, _, _, _),
+       PINGROUP(38, WEST, usb_phy, _, _, _, _, _, _, _, _),
+       PINGROUP(39, WEST, lpass_slimbus, _, _, _, _, _, _, _, _),
+       PINGROUP(40, EAST, sd_write, tsif1_error, _, _, _, _, _, _, _),
+       PINGROUP(41, EAST, blsp_spi6, blsp_uart3_b, blsp_uim3_b, _, qdss, _, _, _, _),
+       PINGROUP(42, EAST, blsp_spi6, blsp_uart3_b, blsp_uim3_b, _, qdss, _, _, _, _),
+       PINGROUP(43, EAST, blsp_spi6, blsp_uart3_b, blsp_i2c6, _, qdss, _, _, _, _),
+       PINGROUP(44, EAST, blsp_spi6, blsp_uart3_b, blsp_i2c6, _, qdss, _, _, _, _),
+       PINGROUP(45, EAST, blsp_spi3, blsp_uart3_a, blsp_uim3_a, _, _, _, _, _, _),
+       PINGROUP(46, EAST, blsp_spi3, blsp_uart3_a, blsp_uim3_a, _, _, _, _, _, _),
+       PINGROUP(47, EAST, blsp_spi3, blsp_uart3_a, blsp_i2c3, _, _, _, _, _, _),
+       PINGROUP(48, EAST, blsp_spi3, blsp_uart3_a, blsp_i2c3, _, _, _, _, _, _),
+       PINGROUP(49, NORTH, blsp_spi9, blsp_uart9_a, blsp_uim9_a, blsp10_spi_b, qdss_cti0_a, _, _, _, _),
+       PINGROUP(50, NORTH, blsp_spi9, blsp_uart9_a, blsp_uim9_a, blsp10_spi_b, qdss_cti0_a, _, _, _, _),
+       PINGROUP(51, NORTH, blsp_spi9, blsp_uart9_a, blsp_i2c9, blsp10_spi_a, _, _, _, _, _),
+       PINGROUP(52, NORTH, blsp_spi9, blsp_uart9_a, blsp_i2c9, blsp10_spi_a, _, _, _, _, _),
+       PINGROUP(53, WEST, blsp_spi7, blsp_uart7_a, blsp_uim7_a, _, _, _, _, _, _),
+       PINGROUP(54, WEST, blsp_spi7, blsp_uart7_a, blsp_uim7_a, _, _, _, _, _, _),
+       PINGROUP(55, WEST, blsp_spi7, blsp_uart7_a, blsp_i2c7, _, _, _, _, _, _),
+       PINGROUP(56, WEST, blsp_spi7, blsp_uart7_a, blsp_i2c7, _, _, _, _, _, _),
+       PINGROUP(57, WEST, qua_mi2s, blsp10_spi, gcc_gp1_a, _, _, _, _, _, _),
+       PINGROUP(58, WEST, qua_mi2s, blsp_spi11, blsp_uart8_b, blsp_uim8_b, gcc_gp2_a, _, qdss_cti1_a, _, _),
+       PINGROUP(59, WEST, qua_mi2s, blsp_spi11, blsp_uart8_b, blsp_uim8_b, gcc_gp3_a, _, qdss_cti1_a, _, _),
+       PINGROUP(60, WEST, qua_mi2s, blsp_spi11, blsp_uart8_b, blsp_i2c11, cri_trng0, _, _, _, _),
+       PINGROUP(61, WEST, qua_mi2s, blsp_spi11, blsp_uart8_b, blsp_i2c11, cri_trng1, _, _, _, _),
+       PINGROUP(62, WEST, qua_mi2s, cri_trng, _, _, _, _, _, _, _),
+       PINGROUP(63, WEST, qua_mi2s, _, _, _, _, _, _, _, _),
+       PINGROUP(64, WEST, pri_mi2s, sp_cmu, _, _, _, _, _, _, _),
+       PINGROUP(65, WEST, pri_mi2s, blsp_spi10, blsp_uart7_b, blsp_uim7_b, _, _, _, _, _),
+       PINGROUP(66, WEST, pri_mi2s_ws, blsp_spi10, blsp_uart7_b, blsp_uim7_b, _, _, _, _, _),
+       PINGROUP(67, WEST, pri_mi2s, blsp_spi10, blsp_uart7_b, blsp_i2c10, _, _, _, _, _),
+       PINGROUP(68, WEST, pri_mi2s, blsp_spi10, blsp_uart7_b, blsp_i2c10, _, _, _, _, _),
+       PINGROUP(69, WEST, spkr_i2s, audio_ref, _, _, _, _, _, _, _),
+       PINGROUP(70, WEST, lpass_slimbus, spkr_i2s, blsp9_spi, _, _, _, _, _, _),
+       PINGROUP(71, WEST, lpass_slimbus, spkr_i2s, blsp9_spi, tsense_pwm1, tsense_pwm2, _, _, _, _),
+       PINGROUP(72, WEST, lpass_slimbus, spkr_i2s, blsp9_spi, _, _, _, _, _, _),
+       PINGROUP(73, WEST, btfm_slimbus, phase_flag, _, _, _, _, _, _, _),
+       PINGROUP(74, WEST, btfm_slimbus, ter_mi2s, phase_flag, _, _, _, _, _, _),
+       PINGROUP(75, WEST, ter_mi2s, phase_flag, qdss, _, _, _, _, _, _),
+       PINGROUP(76, WEST, ter_mi2s, phase_flag, qdss, _, _, _, _, _, _),
+       PINGROUP(77, WEST, ter_mi2s, phase_flag, qdss, _, _, _, _, _, _),
+       PINGROUP(78, WEST, ter_mi2s, gcc_gp1_b, _, _, _, _, _, _, _),
+       PINGROUP(79, WEST, sec_mi2s, _, qdss, _, _, _, _, _, _),
+       PINGROUP(80, WEST, sec_mi2s, _, qdss, _, _, _, _, _, _),
+       PINGROUP(81, WEST, sec_mi2s, blsp_spi12, blsp_uart9_b, blsp_uim9_b, gcc_gp2_b, _, _, _, _),
+       PINGROUP(82, WEST, sec_mi2s, blsp_spi12, blsp_uart9_b, blsp_uim9_b, gcc_gp3_b, _, _, _, _),
+       PINGROUP(83, WEST, sec_mi2s, blsp_spi12, blsp_uart9_b, blsp_i2c12, _, _, _, _, _),
+       PINGROUP(84, WEST, blsp_spi12, blsp_uart9_b, blsp_i2c12, _, _, _, _, _, _),
+       PINGROUP(85, EAST, blsp_spi5, blsp_uart2_b, blsp_uim2_b, _, _, _, _, _, _),
+       PINGROUP(86, EAST, blsp_spi5, blsp_uart2_b, blsp_uim2_b, _, _, _, _, _, _),
+       PINGROUP(87, EAST, blsp_spi5, blsp_uart2_b, blsp_i2c5, _, _, _, _, _, _),
+       PINGROUP(88, EAST, blsp_spi5, blsp_uart2_b, blsp_i2c5, _, _, _, _, _, _),
+       PINGROUP(89, EAST, tsif1_clk, phase_flag, _, _, _, _, _, _, _),
+       PINGROUP(90, EAST, tsif1_en, mdp_vsync0, mdp_vsync1, mdp_vsync2, mdp_vsync3, blsp1_spi, tgu_ch0, qdss_cti1_b, _),
+       PINGROUP(91, EAST, tsif1_data, sdc4_cmd, tgu_ch1, phase_flag, qdss_cti1_b, _, _, _, _),
+       PINGROUP(92, EAST, tsif2_error, sdc43, vfr_1, phase_flag, _, _, _, _, _),
+       PINGROUP(93, EAST, tsif2_clk, sdc4_clk, _, qdss, _, _, _, _, _),
+       PINGROUP(94, EAST, tsif2_en, sdc42, _, _, _, _, _, _, _),
+       PINGROUP(95, EAST, tsif2_data, sdc41, _, _, _, _, _, _, _),
+       PINGROUP(96, EAST, tsif2_sync, sdc40, phase_flag, _, _, _, _, _, _),
+       PINGROUP(97, WEST, _, mdp_vsync_b, ldo_en, _, _, _, _, _, _),
+       PINGROUP(98, WEST, _, mdp_vsync_b, ldo_update, _, _, _, _, _, _),
+       PINGROUP(99, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(100, WEST, _, _, blsp_uart8, _, _, _, _, _, _),
+       PINGROUP(101, WEST, _, blsp_uart8, _, _, _, _, _, _, _),
+       PINGROUP(102, WEST, _, blsp11_i2c, prng_rosc, _, _, _, _, _, _),
+       PINGROUP(103, WEST, _, blsp11_i2c, phase_flag, _, _, _, _, _, _),
+       PINGROUP(104, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(105, NORTH, uim2_data, _, _, _, _, _, _, _, _),
+       PINGROUP(106, NORTH, uim2_clk, _, _, _, _, _, _, _, _),
+       PINGROUP(107, NORTH, uim2_reset, _, _, _, _, _, _, _, _),
+       PINGROUP(108, NORTH, uim2_present, _, _, _, _, _, _, _, _),
+       PINGROUP(109, NORTH, uim1_data, _, _, _, _, _, _, _, _),
+       PINGROUP(110, NORTH, uim1_clk, _, _, _, _, _, _, _, _),
+       PINGROUP(111, NORTH, uim1_reset, _, _, _, _, _, _, _, _),
+       PINGROUP(112, NORTH, uim1_present, _, _, _, _, _, _, _, _),
+       PINGROUP(113, NORTH, uim_batt, _, _, _, _, _, _, _, _),
+       PINGROUP(114, WEST, _, _, phase_flag, _, _, _, _, _, _),
+       PINGROUP(115, WEST, _, nav_dr, phase_flag, _, _, _, _, _, _),
+       PINGROUP(116, WEST, phase_flag, _, _, _, _, _, _, _, _),
+       PINGROUP(117, EAST, phase_flag, qdss, atest_char, _, _, _, _, _, _),
+       PINGROUP(118, EAST, adsp_ext, phase_flag, qdss, atest_char, _, _, _, _, _),
+       PINGROUP(119, EAST, phase_flag, qdss, atest_char, _, _, _, _, _, _),
+       PINGROUP(120, EAST, phase_flag, qdss, atest_char, _, _, _, _, _, _),
+       PINGROUP(121, EAST, phase_flag, qdss, atest_char, _, _, _, _, _, _),
+       PINGROUP(122, EAST, phase_flag, qdss, _, _, _, _, _, _, _),
+       PINGROUP(123, EAST, phase_flag, qdss, _, _, _, _, _, _, _),
+       PINGROUP(124, EAST, phase_flag, qdss, _, _, _, _, _, _, _),
+       PINGROUP(125, EAST, phase_flag, _, _, _, _, _, _, _, _),
+       PINGROUP(126, EAST, phase_flag, _, _, _, _, _, _, _, _),
+       PINGROUP(127, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(128, WEST, modem_tsync, nav_pps, phase_flag, _, _, _, _, _, _),
+       PINGROUP(129, WEST, phase_flag, _, _, _, _, _, _, _, _),
+       PINGROUP(130, NORTH, qlink_request, phase_flag, _, _, _, _, _, _, _),
+       PINGROUP(131, NORTH, qlink_enable, phase_flag, _, _, _, _, _, _, _),
+       PINGROUP(132, WEST, _, phase_flag, _, _, _, _, _, _, _),
+       PINGROUP(133, WEST, phase_flag, _, _, _, _, _, _, _, _),
+       PINGROUP(134, WEST, phase_flag, _, _, _, _, _, _, _, _),
+       PINGROUP(135, WEST, _, pa_indicator, _, _, _, _, _, _, _),
+       PINGROUP(136, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(137, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(138, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(139, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(140, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(141, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(142, WEST, _, ssbi1, _, _, _, _, _, _, _),
+       PINGROUP(143, WEST, isense_dbg, _, _, _, _, _, _, _, _),
+       PINGROUP(144, WEST, mss_lte, _, _, _, _, _, _, _, _),
+       PINGROUP(145, WEST, mss_lte, _, _, _, _, _, _, _, _),
+       PINGROUP(146, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(147, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(148, WEST, _, _, _, _, _, _, _, _, _),
+       PINGROUP(149, WEST, _, _, _, _, _, _, _, _, _),
+       SDC_QDSD_PINGROUP(sdc2_clk, 0x999000, 14, 6),
+       SDC_QDSD_PINGROUP(sdc2_cmd, 0x999000, 11, 3),
+       SDC_QDSD_PINGROUP(sdc2_data, 0x999000, 9, 0),
+       UFS_RESET(ufs_reset, 0x19d000),
+};
+
+static const struct msm_pinctrl_soc_data msm8998_pinctrl = {
+       .pins = msm8998_pins,
+       .npins = ARRAY_SIZE(msm8998_pins),
+       .functions = msm8998_functions,
+       .nfunctions = ARRAY_SIZE(msm8998_functions),
+       .groups = msm8998_groups,
+       .ngroups = ARRAY_SIZE(msm8998_groups),
+       .ngpios = 150,
+};
+
+static int msm8998_pinctrl_probe(struct platform_device *pdev)
+{
+       return msm_pinctrl_probe(pdev, &msm8998_pinctrl);
+}
+
+static const struct of_device_id msm8998_pinctrl_of_match[] = {
+       { .compatible = "qcom,msm8998-pinctrl", },
+       { },
+};
+
+static struct platform_driver msm8998_pinctrl_driver = {
+       .driver = {
+               .name = "msm8998-pinctrl",
+               .owner = THIS_MODULE,
+               .of_match_table = msm8998_pinctrl_of_match,
+       },
+       .probe = msm8998_pinctrl_probe,
+       .remove = msm_pinctrl_remove,
+};
+
+static int __init msm8998_pinctrl_init(void)
+{
+       return platform_driver_register(&msm8998_pinctrl_driver);
+}
+arch_initcall(msm8998_pinctrl_init);
+
+static void __exit msm8998_pinctrl_exit(void)
+{
+       platform_driver_unregister(&msm8998_pinctrl_driver);
+}
+module_exit(msm8998_pinctrl_exit);
+
+MODULE_DESCRIPTION("QTI msm8998 pinctrl driver");
+MODULE_LICENSE("GPL v2");
+MODULE_DEVICE_TABLE(of, msm8998_pinctrl_of_match);
index ecfb90059eeb9e3eee1ee044efeae48b4f827db2..11b5eeb14c4a00e9993992f838a2cfe7cb4f72cb 100644 (file)
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # Samsung Pin control drivers
 #
index 071084d3ee9c19606679ffcc280f8d7d8388ac1f..c32399faff5724c388aedf1890bb68cb67940423 100644 (file)
@@ -1,22 +1,17 @@
-/*
- * Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- * Copyright (c) 2012 Linaro Ltd
- *             http://www.linaro.org
- *
- * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file contains the Samsung Exynos specific information required by the
- * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
- * external gpio and wakeup interrupt support.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
+//
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//             http://www.samsung.com
+// Copyright (c) 2012 Linaro Ltd
+//             http://www.linaro.org
+//
+// Author: Thomas Abraham <thomas.ab@samsung.com>
+//
+// This file contains the Samsung Exynos specific information required by the
+// the Samsung pinctrl/gpiolib driver. It also includes the implementation of
+// external gpio and wakeup interrupt support.
 
 #include <linux/device.h>
 #include <linux/of_address.h>
index 08e9fdb58fd2c1f203ddb34ed08f41a322bde91b..fc8f7833bec0b29120bf559681e68ef41b09b7b4 100644 (file)
@@ -1,22 +1,17 @@
-/*
- * Exynos ARMv8 specific support for Samsung pinctrl/gpiolib driver
- * with eint support.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- * Copyright (c) 2012 Linaro Ltd
- *             http://www.linaro.org
- * Copyright (c) 2017 Krzysztof Kozlowski <krzk@kernel.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file contains the Samsung Exynos specific information required by the
- * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
- * external gpio and wakeup interrupt support.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Exynos ARMv8 specific support for Samsung pinctrl/gpiolib driver
+// with eint support.
+//
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//             http://www.samsung.com
+// Copyright (c) 2012 Linaro Ltd
+//             http://www.linaro.org
+// Copyright (c) 2017 Krzysztof Kozlowski <krzk@kernel.org>
+//
+// This file contains the Samsung Exynos specific information required by the
+// the Samsung pinctrl/gpiolib driver. It also includes the implementation of
+// external gpio and wakeup interrupt support.
 
 #include <linux/slab.h>
 #include <linux/soc/samsung/exynos-regs-pmu.h>
index c8d0de7ea16054d616a2aaaa493e6df1386fedd4..0a625a64ff5de87baa110a4d7acc3c8e9a5c860d 100644 (file)
@@ -1,22 +1,17 @@
-/*
- * Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- * Copyright (c) 2012 Linaro Ltd
- *             http://www.linaro.org
- *
- * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file contains the Samsung Exynos specific information required by the
- * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
- * external gpio and wakeup interrupt support.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
+//
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//             http://www.samsung.com
+// Copyright (c) 2012 Linaro Ltd
+//             http://www.linaro.org
+//
+// Author: Thomas Abraham <thomas.ab@samsung.com>
+//
+// This file contains the Samsung Exynos specific information required by the
+// the Samsung pinctrl/gpiolib driver. It also includes the implementation of
+// external gpio and wakeup interrupt support.
 
 #include <linux/device.h>
 #include <linux/interrupt.h>
index 7639b926c5c174f2fd1a3de311ff748537c8dbf7..abd43aa7eb0d9e57dd79386e8288e0da79b9d845 100644 (file)
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
 /*
  * Exynos specific definitions for Samsung pinctrl and gpiolib driver.
  *
  * pinctrl/gpiolib interface drivers.
  *
  * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
  */
 
 #ifndef __PINCTRL_SAMSUNG_EXYNOS_H
index 32a3a9fd65c485786f7b3bdd61fc58a248a1d074..3d8d5e8128398ab93405af7283d2567505adb7cd 100644 (file)
@@ -1,16 +1,11 @@
-/*
- * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's EXYNOS5440 SoC.
- *
- * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// pin-controller/pin-mux/pin-config/gpio-driver for Samsung's EXYNOS5440 SoC.
+//
+// Author: Thomas Abraham <thomas.ab@samsung.com>
+//
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//             http://www.samsung.com
 
 #include <linux/init.h>
 #include <linux/platform_device.h>
index edf27264b6036a03f166bfb004f8e183b292712d..10187cb0e9b9d9d74bd207f3207ec00ad125bb86 100644 (file)
@@ -1,17 +1,12 @@
-/*
- * S3C24XX specific support for Samsung pinctrl/gpiolib driver.
- *
- * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file contains the SamsungS3C24XX specific information required by the
- * Samsung pinctrl/gpiolib driver. It also includes the implementation of
- * external gpio and wakeup interrupt support.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// S3C24XX specific support for Samsung pinctrl/gpiolib driver.
+//
+// Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
+//
+// This file contains the SamsungS3C24XX specific information required by the
+// Samsung pinctrl/gpiolib driver. It also includes the implementation of
+// external gpio and wakeup interrupt support.
 
 #include <linux/init.h>
 #include <linux/device.h>
index e63663b32907439eb22de6c233532eb0329cafe6..679628ac4b31a7c9af210e812d9c8420b6e245ea 100644 (file)
@@ -1,19 +1,14 @@
-/*
- * S3C64xx specific support for pinctrl-samsung driver.
- *
- * Copyright (c) 2013 Tomasz Figa <tomasz.figa@gmail.com>
- *
- * Based on pinctrl-exynos.c, please see the file for original copyrights.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file contains the Samsung S3C64xx specific information required by the
- * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
- * external gpio and wakeup interrupt support.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// S3C64xx specific support for pinctrl-samsung driver.
+//
+// Copyright (c) 2013 Tomasz Figa <tomasz.figa@gmail.com>
+//
+// Based on pinctrl-exynos.c, please see the file for original copyrights.
+//
+// This file contains the Samsung S3C64xx specific information required by the
+// the Samsung pinctrl/gpiolib driver. It also includes the implementation of
+// external gpio and wakeup interrupt support.
 
 #include <linux/init.h>
 #include <linux/device.h>
index e04f7fe0a65def85814c64381d5ba48326561a9c..da58e4554137419a77b6848b5b2e9f96b126d346 100644 (file)
@@ -1,24 +1,19 @@
-/*
- * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- * Copyright (c) 2012 Linaro Ltd
- *             http://www.linaro.org
- *
- * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This driver implements the Samsung pinctrl driver. It supports setting up of
- * pinmux and pinconf configurations. The gpiolib interface is also included.
- * External interrupt (gpio and wakeup) support are not included in this driver
- * but provides extensions to which platform specific implementation of the gpio
- * and wakeup interrupts can be hooked to.
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
+//
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//             http://www.samsung.com
+// Copyright (c) 2012 Linaro Ltd
+//             http://www.linaro.org
+//
+// Author: Thomas Abraham <thomas.ab@samsung.com>
+//
+// This driver implements the Samsung pinctrl driver. It supports setting up of
+// pinmux and pinconf configurations. The gpiolib interface is also included.
+// External interrupt (gpio and wakeup) support are not included in this driver
+// but provides extensions to which platform specific implementation of the gpio
+// and wakeup interrupts can be hooked to.
 
 #include <linux/init.h>
 #include <linux/platform_device.h>
index 9af07af6cad627b5e02d4fbd362149e42dd97343..e204f609823bad288850dd540b7ee7a367df4e95 100644 (file)
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
 /*
  * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
  *
@@ -7,11 +8,6 @@
  *             http://www.linaro.org
  *
  * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
  */
 
 #ifndef __PINCTRL_SAMSUNG_H
index 5d5312eb7102ac47f8bbfa83fb1d6a734c60db75..4ed3761418f9cd91caf539f542250ead94f4c2e7 100644 (file)
@@ -89,6 +89,11 @@ config PINCTRL_PFC_R8A7796
         depends on ARCH_R8A7796
         select PINCTRL_SH_PFC
 
+config PINCTRL_PFC_R8A77970
+       def_bool y
+       depends on ARCH_R8A77970
+       select PINCTRL_SH_PFC
+
 config PINCTRL_PFC_R8A77995
         def_bool y
         depends on ARCH_R8A77995
index a7903904b64eb1d13865ecece8ba9298886b391f..22e758ce1fc2af6f1035dba24333de0e74d314be 100644 (file)
@@ -16,6 +16,7 @@ obj-$(CONFIG_PINCTRL_PFC_R8A7794)     += pfc-r8a7794.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7795)      += pfc-r8a7795.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7795)      += pfc-r8a7795-es1.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7796)      += pfc-r8a7796.o
+obj-$(CONFIG_PINCTRL_PFC_R8A77970)     += pfc-r8a77970.o
 obj-$(CONFIG_PINCTRL_PFC_R8A77995)     += pfc-r8a77995.o
 obj-$(CONFIG_PINCTRL_PFC_SH7203)       += pfc-sh7203.o
 obj-$(CONFIG_PINCTRL_PFC_SH7264)       += pfc-sh7264.o
index cf4ae4bc91156991f0e297cf5354ecc132089dbf..e9eb7a7c6fac36835412d5321c63baf1832ea5dd 100644 (file)
@@ -557,6 +557,12 @@ static const struct of_device_id sh_pfc_of_table[] = {
                .data = &r8a7796_pinmux_info,
        },
 #endif
+#ifdef CONFIG_PINCTRL_PFC_R8A77970
+       {
+               .compatible = "renesas,pfc-r8a77970",
+               .data = &r8a77970_pinmux_info,
+       },
+#endif
 #ifdef CONFIG_PINCTRL_PFC_R8A77995
        {
                .compatible = "renesas,pfc-r8a77995",
index 10bd35f8c894c58e1cce7174ec6764cbfadbf937..5811784d88cb966590d39d1c0bb4929ee60d3ab6 100644 (file)
@@ -4145,6 +4145,32 @@ static const unsigned int ssi9_ctrl_b_mux[] = {
        SSI_SCK9_B_MARK, SSI_WS9_B_MARK,
 };
 
+/* - TPU -------------------------------------------------------------------- */
+static const unsigned int tpu_to0_pins[] = {
+       RCAR_GP_PIN(6, 14),
+};
+static const unsigned int tpu_to0_mux[] = {
+       TPU_TO0_MARK,
+};
+static const unsigned int tpu_to1_pins[] = {
+       RCAR_GP_PIN(1, 17),
+};
+static const unsigned int tpu_to1_mux[] = {
+       TPU_TO1_MARK,
+};
+static const unsigned int tpu_to2_pins[] = {
+       RCAR_GP_PIN(1, 18),
+};
+static const unsigned int tpu_to2_mux[] = {
+       TPU_TO2_MARK,
+};
+static const unsigned int tpu_to3_pins[] = {
+       RCAR_GP_PIN(1, 24),
+};
+static const unsigned int tpu_to3_mux[] = {
+       TPU_TO3_MARK,
+};
+
 /* - USB0 ------------------------------------------------------------------- */
 static const unsigned int usb0_pins[] = {
        RCAR_GP_PIN(7, 23), /* PWEN */
@@ -4431,7 +4457,7 @@ static const unsigned int vin2_clk_mux[] = {
 };
 
 static const struct {
-       struct sh_pfc_pin_group common[342];
+       struct sh_pfc_pin_group common[346];
        struct sh_pfc_pin_group r8a779x[9];
 } pinmux_groups = {
        .common = {
@@ -4743,6 +4769,10 @@ static const struct {
                SH_PFC_PIN_GROUP(ssi9_data_b),
                SH_PFC_PIN_GROUP(ssi9_ctrl),
                SH_PFC_PIN_GROUP(ssi9_ctrl_b),
+               SH_PFC_PIN_GROUP(tpu_to0),
+               SH_PFC_PIN_GROUP(tpu_to1),
+               SH_PFC_PIN_GROUP(tpu_to2),
+               SH_PFC_PIN_GROUP(tpu_to3),
                SH_PFC_PIN_GROUP(usb0),
                SH_PFC_PIN_GROUP(usb1),
                VIN_DATA_PIN_GROUP(vin0_data, 24),
@@ -4826,6 +4856,10 @@ static const char * const can0_groups[] = {
        "can0_data_d",
        "can0_data_e",
        "can0_data_f",
+       /*
+        * Retained for backwards compatibility, use can_clk_groups in new
+        * designs.
+        */
        "can_clk",
        "can_clk_b",
        "can_clk_c",
@@ -4837,6 +4871,21 @@ static const char * const can1_groups[] = {
        "can1_data_b",
        "can1_data_c",
        "can1_data_d",
+       /*
+        * Retained for backwards compatibility, use can_clk_groups in new
+        * designs.
+        */
+       "can_clk",
+       "can_clk_b",
+       "can_clk_c",
+       "can_clk_d",
+};
+
+/*
+ * can_clk_groups allows for independent configuration, use can_clk function
+ * in new designs.
+ */
+static const char * const can_clk_groups[] = {
        "can_clk",
        "can_clk_b",
        "can_clk_c",
@@ -5259,6 +5308,13 @@ static const char * const ssi_groups[] = {
        "ssi9_ctrl_b",
 };
 
+static const char * const tpu_groups[] = {
+       "tpu_to0",
+       "tpu_to1",
+       "tpu_to2",
+       "tpu_to3",
+};
+
 static const char * const usb0_groups[] = {
        "usb0",
 };
@@ -5308,7 +5364,7 @@ static const char * const vin2_groups[] = {
 };
 
 static const struct {
-       struct sh_pfc_function common[56];
+       struct sh_pfc_function common[58];
        struct sh_pfc_function r8a779x[2];
 } pinmux_functions = {
        .common = {
@@ -5316,6 +5372,7 @@ static const struct {
                SH_PFC_FUNCTION(avb),
                SH_PFC_FUNCTION(can0),
                SH_PFC_FUNCTION(can1),
+               SH_PFC_FUNCTION(can_clk),
                SH_PFC_FUNCTION(du),
                SH_PFC_FUNCTION(du0),
                SH_PFC_FUNCTION(du1),
@@ -5363,6 +5420,7 @@ static const struct {
                SH_PFC_FUNCTION(sdhi1),
                SH_PFC_FUNCTION(sdhi2),
                SH_PFC_FUNCTION(ssi),
+               SH_PFC_FUNCTION(tpu),
                SH_PFC_FUNCTION(usb0),
                SH_PFC_FUNCTION(usb1),
                SH_PFC_FUNCTION(vin0),
index 333a3470e842153bfb330135c495d9d79695c0fd..16400243759462a6e3af3e721b0a0bb62220a547 100644 (file)
@@ -1608,6 +1608,116 @@ static const unsigned int avb_gmii_mux[] = {
        AVB_TX_EN_MARK, AVB_TX_ER_MARK, AVB_TX_CLK_MARK,
        AVB_COL_MARK,
 };
+
+/* - CAN -------------------------------------------------------------------- */
+static const unsigned int can0_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(6, 15), RCAR_GP_PIN(6, 14),
+};
+
+static const unsigned int can0_data_mux[] = {
+       CAN0_TX_MARK, CAN0_RX_MARK,
+};
+
+static const unsigned int can0_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(3, 16), RCAR_GP_PIN(3, 15),
+};
+
+static const unsigned int can0_data_b_mux[] = {
+       CAN0_TX_B_MARK, CAN0_RX_B_MARK,
+};
+
+static const unsigned int can0_data_c_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(2, 17), RCAR_GP_PIN(2, 16),
+};
+
+static const unsigned int can0_data_c_mux[] = {
+       CAN0_TX_C_MARK, CAN0_RX_C_MARK,
+};
+
+static const unsigned int can0_data_d_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(5, 12), RCAR_GP_PIN(5, 11),
+};
+
+static const unsigned int can0_data_d_mux[] = {
+       CAN0_TX_D_MARK, CAN0_RX_D_MARK,
+};
+
+static const unsigned int can1_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(6, 25), RCAR_GP_PIN(6, 24),
+};
+
+static const unsigned int can1_data_mux[] = {
+       CAN1_TX_MARK, CAN1_RX_MARK,
+};
+
+static const unsigned int can1_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 1),
+};
+
+static const unsigned int can1_data_b_mux[] = {
+       CAN1_TX_B_MARK, CAN1_RX_B_MARK,
+};
+
+static const unsigned int can1_data_c_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(5, 6), RCAR_GP_PIN(5, 5),
+};
+
+static const unsigned int can1_data_c_mux[] = {
+       CAN1_TX_C_MARK, CAN1_RX_C_MARK,
+};
+
+static const unsigned int can1_data_d_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(3, 31), RCAR_GP_PIN(3, 30),
+};
+
+static const unsigned int can1_data_d_mux[] = {
+       CAN1_TX_D_MARK, CAN1_RX_D_MARK,
+};
+
+static const unsigned int can_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(3, 31),
+};
+
+static const unsigned int can_clk_mux[] = {
+       CAN_CLK_MARK,
+};
+
+static const unsigned int can_clk_b_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(1, 23),
+};
+
+static const unsigned int can_clk_b_mux[] = {
+       CAN_CLK_B_MARK,
+};
+
+static const unsigned int can_clk_c_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(1, 0),
+};
+
+static const unsigned int can_clk_c_mux[] = {
+       CAN_CLK_C_MARK,
+};
+
+static const unsigned int can_clk_d_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(5, 0),
+};
+
+static const unsigned int can_clk_d_mux[] = {
+       CAN_CLK_D_MARK,
+};
+
 /* - DU --------------------------------------------------------------------- */
 static const unsigned int du0_rgb666_pins[] = {
        /* R[7:2], G[7:2], B[7:2] */
@@ -2118,6 +2228,35 @@ static const unsigned int i2c4_e_pins[] = {
 static const unsigned int i2c4_e_mux[] = {
        I2C4_SCL_E_MARK, I2C4_SDA_E_MARK,
 };
+/* - I2C5 ------------------------------------------------------------------- */
+static const unsigned int i2c5_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(4, 14), RCAR_GP_PIN(4, 15),
+};
+static const unsigned int i2c5_mux[] = {
+       I2C5_SCL_MARK, I2C5_SDA_MARK,
+};
+static const unsigned int i2c5_b_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15),
+};
+static const unsigned int i2c5_b_mux[] = {
+       I2C5_SCL_B_MARK, I2C5_SDA_B_MARK,
+};
+static const unsigned int i2c5_c_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(4, 31), RCAR_GP_PIN(4, 30),
+};
+static const unsigned int i2c5_c_mux[] = {
+       I2C5_SCL_C_MARK, I2C5_SDA_C_MARK,
+};
+static const unsigned int i2c5_d_pins[] = {
+       /* SCL, SDA */
+       RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 14),
+};
+static const unsigned int i2c5_d_mux[] = {
+       I2C5_SCL_D_MARK, I2C5_SDA_D_MARK,
+};
 /* - INTC ------------------------------------------------------------------- */
 static const unsigned int intc_irq0_pins[] = {
        /* IRQ0 */
@@ -2436,6 +2575,109 @@ static const unsigned int msiof2_tx_b_pins[] = {
 static const unsigned int msiof2_tx_b_mux[] = {
        MSIOF2_TXD_B_MARK,
 };
+/* - PWM -------------------------------------------------------------------- */
+static const unsigned int pwm0_pins[] = {
+       RCAR_GP_PIN(1, 14),
+};
+static const unsigned int pwm0_mux[] = {
+       PWM0_MARK,
+};
+static const unsigned int pwm0_b_pins[] = {
+       RCAR_GP_PIN(5, 3),
+};
+static const unsigned int pwm0_b_mux[] = {
+       PWM0_B_MARK,
+};
+static const unsigned int pwm1_pins[] = {
+       RCAR_GP_PIN(4, 5),
+};
+static const unsigned int pwm1_mux[] = {
+       PWM1_MARK,
+};
+static const unsigned int pwm1_b_pins[] = {
+       RCAR_GP_PIN(5, 10),
+};
+static const unsigned int pwm1_b_mux[] = {
+       PWM1_B_MARK,
+};
+static const unsigned int pwm1_c_pins[] = {
+       RCAR_GP_PIN(1, 18),
+};
+static const unsigned int pwm1_c_mux[] = {
+       PWM1_C_MARK,
+};
+static const unsigned int pwm2_pins[] = {
+       RCAR_GP_PIN(4, 10),
+};
+static const unsigned int pwm2_mux[] = {
+       PWM2_MARK,
+};
+static const unsigned int pwm2_b_pins[] = {
+       RCAR_GP_PIN(5, 17),
+};
+static const unsigned int pwm2_b_mux[] = {
+       PWM2_B_MARK,
+};
+static const unsigned int pwm2_c_pins[] = {
+       RCAR_GP_PIN(0, 13),
+};
+static const unsigned int pwm2_c_mux[] = {
+       PWM2_C_MARK,
+};
+static const unsigned int pwm3_pins[] = {
+       RCAR_GP_PIN(4, 13),
+};
+static const unsigned int pwm3_mux[] = {
+       PWM3_MARK,
+};
+static const unsigned int pwm3_b_pins[] = {
+       RCAR_GP_PIN(0, 16),
+};
+static const unsigned int pwm3_b_mux[] = {
+       PWM3_B_MARK,
+};
+static const unsigned int pwm4_pins[] = {
+       RCAR_GP_PIN(1, 3),
+};
+static const unsigned int pwm4_mux[] = {
+       PWM4_MARK,
+};
+static const unsigned int pwm4_b_pins[] = {
+       RCAR_GP_PIN(0, 21),
+};
+static const unsigned int pwm4_b_mux[] = {
+       PWM4_B_MARK,
+};
+static const unsigned int pwm5_pins[] = {
+       RCAR_GP_PIN(3, 30),
+};
+static const unsigned int pwm5_mux[] = {
+       PWM5_MARK,
+};
+static const unsigned int pwm5_b_pins[] = {
+       RCAR_GP_PIN(4, 0),
+};
+static const unsigned int pwm5_b_mux[] = {
+       PWM5_B_MARK,
+};
+static const unsigned int pwm5_c_pins[] = {
+       RCAR_GP_PIN(0, 10),
+};
+static const unsigned int pwm5_c_mux[] = {
+       PWM5_C_MARK,
+};
+static const unsigned int pwm6_pins[] = {
+       RCAR_GP_PIN(4, 8),
+};
+static const unsigned int pwm6_mux[] = {
+       PWM6_MARK,
+};
+static const unsigned int pwm6_b_pins[] = {
+       RCAR_GP_PIN(0, 7),
+};
+static const unsigned int pwm6_b_mux[] = {
+       PWM6_B_MARK,
+};
 /* - QSPI ------------------------------------------------------------------- */
 static const unsigned int qspi_ctrl_pins[] = {
        /* SPCLK, SSL */
@@ -3280,6 +3522,79 @@ static const unsigned int ssi9_ctrl_b_pins[] = {
 static const unsigned int ssi9_ctrl_b_mux[] = {
        SSI_SCK9_B_MARK, SSI_WS9_B_MARK,
 };
+/* - TPU -------------------------------------------------------------------- */
+static const unsigned int tpu_to0_pins[] = {
+       RCAR_GP_PIN(3, 31),
+};
+static const unsigned int tpu_to0_mux[] = {
+       TPUTO0_MARK,
+};
+static const unsigned int tpu_to0_b_pins[] = {
+       RCAR_GP_PIN(3, 30),
+};
+static const unsigned int tpu_to0_b_mux[] = {
+       TPUTO0_B_MARK,
+};
+static const unsigned int tpu_to0_c_pins[] = {
+       RCAR_GP_PIN(1, 18),
+};
+static const unsigned int tpu_to0_c_mux[] = {
+       TPUTO0_C_MARK,
+};
+static const unsigned int tpu_to1_pins[] = {
+       RCAR_GP_PIN(4, 9),
+};
+static const unsigned int tpu_to1_mux[] = {
+       TPUTO1_MARK,
+};
+static const unsigned int tpu_to1_b_pins[] = {
+       RCAR_GP_PIN(4, 0),
+};
+static const unsigned int tpu_to1_b_mux[] = {
+       TPUTO1_B_MARK,
+};
+static const unsigned int tpu_to1_c_pins[] = {
+       RCAR_GP_PIN(4, 4),
+};
+static const unsigned int tpu_to1_c_mux[] = {
+       TPUTO1_C_MARK,
+};
+static const unsigned int tpu_to2_pins[] = {
+       RCAR_GP_PIN(1, 3),
+};
+static const unsigned int tpu_to2_mux[] = {
+       TPUTO2_MARK,
+};
+static const unsigned int tpu_to2_b_pins[] = {
+       RCAR_GP_PIN(1, 0),
+};
+static const unsigned int tpu_to2_b_mux[] = {
+       TPUTO2_B_MARK,
+};
+static const unsigned int tpu_to2_c_pins[] = {
+       RCAR_GP_PIN(0, 22),
+};
+static const unsigned int tpu_to2_c_mux[] = {
+       TPUTO2_C_MARK,
+};
+static const unsigned int tpu_to3_pins[] = {
+       RCAR_GP_PIN(1, 14),
+};
+static const unsigned int tpu_to3_mux[] = {
+       TPUTO3_MARK,
+};
+static const unsigned int tpu_to3_b_pins[] = {
+       RCAR_GP_PIN(1, 13),
+};
+static const unsigned int tpu_to3_b_mux[] = {
+       TPUTO3_B_MARK,
+};
+static const unsigned int tpu_to3_c_pins[] = {
+       RCAR_GP_PIN(0, 21),
+};
+static const unsigned int tpu_to3_c_mux[] = {
+       TPUTO3_C_MARK,
+};
 /* - USB0 ------------------------------------------------------------------- */
 static const unsigned int usb0_pins[] = {
        RCAR_GP_PIN(5, 24), /* PWEN */
@@ -3459,6 +3774,18 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(avb_mdio),
        SH_PFC_PIN_GROUP(avb_mii),
        SH_PFC_PIN_GROUP(avb_gmii),
+       SH_PFC_PIN_GROUP(can0_data),
+       SH_PFC_PIN_GROUP(can0_data_b),
+       SH_PFC_PIN_GROUP(can0_data_c),
+       SH_PFC_PIN_GROUP(can0_data_d),
+       SH_PFC_PIN_GROUP(can1_data),
+       SH_PFC_PIN_GROUP(can1_data_b),
+       SH_PFC_PIN_GROUP(can1_data_c),
+       SH_PFC_PIN_GROUP(can1_data_d),
+       SH_PFC_PIN_GROUP(can_clk),
+       SH_PFC_PIN_GROUP(can_clk_b),
+       SH_PFC_PIN_GROUP(can_clk_c),
+       SH_PFC_PIN_GROUP(can_clk_d),
        SH_PFC_PIN_GROUP(du0_rgb666),
        SH_PFC_PIN_GROUP(du0_rgb888),
        SH_PFC_PIN_GROUP(du0_clk0_out),
@@ -3523,6 +3850,10 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(i2c4_c),
        SH_PFC_PIN_GROUP(i2c4_d),
        SH_PFC_PIN_GROUP(i2c4_e),
+       SH_PFC_PIN_GROUP(i2c5),
+       SH_PFC_PIN_GROUP(i2c5_b),
+       SH_PFC_PIN_GROUP(i2c5_c),
+       SH_PFC_PIN_GROUP(i2c5_d),
        SH_PFC_PIN_GROUP(intc_irq0),
        SH_PFC_PIN_GROUP(intc_irq1),
        SH_PFC_PIN_GROUP(intc_irq2),
@@ -3567,6 +3898,23 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(msiof2_ss2_b),
        SH_PFC_PIN_GROUP(msiof2_rx_b),
        SH_PFC_PIN_GROUP(msiof2_tx_b),
+       SH_PFC_PIN_GROUP(pwm0),
+       SH_PFC_PIN_GROUP(pwm0_b),
+       SH_PFC_PIN_GROUP(pwm1),
+       SH_PFC_PIN_GROUP(pwm1_b),
+       SH_PFC_PIN_GROUP(pwm1_c),
+       SH_PFC_PIN_GROUP(pwm2),
+       SH_PFC_PIN_GROUP(pwm2_b),
+       SH_PFC_PIN_GROUP(pwm2_c),
+       SH_PFC_PIN_GROUP(pwm3),
+       SH_PFC_PIN_GROUP(pwm3_b),
+       SH_PFC_PIN_GROUP(pwm4),
+       SH_PFC_PIN_GROUP(pwm4_b),
+       SH_PFC_PIN_GROUP(pwm5),
+       SH_PFC_PIN_GROUP(pwm5_b),
+       SH_PFC_PIN_GROUP(pwm5_c),
+       SH_PFC_PIN_GROUP(pwm6),
+       SH_PFC_PIN_GROUP(pwm6_b),
        SH_PFC_PIN_GROUP(qspi_ctrl),
        SH_PFC_PIN_GROUP(qspi_data2),
        SH_PFC_PIN_GROUP(qspi_data4),
@@ -3684,6 +4032,18 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(ssi9_ctrl),
        SH_PFC_PIN_GROUP(ssi9_data_b),
        SH_PFC_PIN_GROUP(ssi9_ctrl_b),
+       SH_PFC_PIN_GROUP(tpu_to0),
+       SH_PFC_PIN_GROUP(tpu_to0_b),
+       SH_PFC_PIN_GROUP(tpu_to0_c),
+       SH_PFC_PIN_GROUP(tpu_to1),
+       SH_PFC_PIN_GROUP(tpu_to1_b),
+       SH_PFC_PIN_GROUP(tpu_to1_c),
+       SH_PFC_PIN_GROUP(tpu_to2),
+       SH_PFC_PIN_GROUP(tpu_to2_b),
+       SH_PFC_PIN_GROUP(tpu_to2_c),
+       SH_PFC_PIN_GROUP(tpu_to3),
+       SH_PFC_PIN_GROUP(tpu_to3_b),
+       SH_PFC_PIN_GROUP(tpu_to3_c),
        SH_PFC_PIN_GROUP(usb0),
        SH_PFC_PIN_GROUP(usb1),
        VIN_DATA_PIN_GROUP(vin0_data, 24),
@@ -3731,6 +4091,47 @@ static const char * const avb_groups[] = {
        "avb_gmii",
 };
 
+static const char * const can0_groups[] = {
+       "can0_data",
+       "can0_data_b",
+       "can0_data_c",
+       "can0_data_d",
+       /*
+        * Retained for backwards compatibility, use can_clk_groups in new
+        * designs.
+        */
+       "can_clk",
+       "can_clk_b",
+       "can_clk_c",
+       "can_clk_d",
+};
+
+static const char * const can1_groups[] = {
+       "can1_data",
+       "can1_data_b",
+       "can1_data_c",
+       "can1_data_d",
+       /*
+        * Retained for backwards compatibility, use can_clk_groups in new
+        * designs.
+        */
+       "can_clk",
+       "can_clk_b",
+       "can_clk_c",
+       "can_clk_d",
+};
+
+/*
+ * can_clk_groups allows for independent configuration, use can_clk function
+ * in new designs.
+ */
+static const char * const can_clk_groups[] = {
+       "can_clk",
+       "can_clk_b",
+       "can_clk_c",
+       "can_clk_d",
+};
+
 static const char * const du0_groups[] = {
        "du0_rgb666",
        "du0_rgb888",
@@ -3828,6 +4229,13 @@ static const char * const i2c4_groups[] = {
        "i2c4_e",
 };
 
+static const char * const i2c5_groups[] = {
+       "i2c5",
+       "i2c5_b",
+       "i2c5_c",
+       "i2c5_d",
+};
+
 static const char * const intc_groups[] = {
        "intc_irq0",
        "intc_irq1",
@@ -3887,6 +4295,44 @@ static const char * const msiof2_groups[] = {
        "msiof2_tx_b",
 };
 
+static const char * const pwm0_groups[] = {
+       "pwm0",
+       "pwm0_b",
+};
+
+static const char * const pwm1_groups[] = {
+       "pwm1",
+       "pwm1_b",
+       "pwm1_c",
+};
+
+static const char * const pwm2_groups[] = {
+       "pwm2",
+       "pwm2_b",
+       "pwm2_c",
+};
+
+static const char * const pwm3_groups[] = {
+       "pwm3",
+       "pwm3_b",
+};
+
+static const char * const pwm4_groups[] = {
+       "pwm4",
+       "pwm4_b",
+};
+
+static const char * const pwm5_groups[] = {
+       "pwm5",
+       "pwm5_b",
+       "pwm5_c",
+};
+
+static const char * const pwm6_groups[] = {
+       "pwm6",
+       "pwm6_b",
+};
+
 static const char * const qspi_groups[] = {
        "qspi_ctrl",
        "qspi_data2",
@@ -4067,6 +4513,21 @@ static const char * const ssi_groups[] = {
        "ssi9_ctrl_b",
 };
 
+static const char * const tpu_groups[] = {
+       "tpu_to0",
+       "tpu_to0_b",
+       "tpu_to0_c",
+       "tpu_to1",
+       "tpu_to1_b",
+       "tpu_to1_c",
+       "tpu_to2",
+       "tpu_to2_b",
+       "tpu_to2_c",
+       "tpu_to3",
+       "tpu_to3_b",
+       "tpu_to3_c",
+};
+
 static const char * const usb0_groups[] = {
        "usb0",
 };
@@ -4102,6 +4563,9 @@ static const char * const vin1_groups[] = {
 static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(audio_clk),
        SH_PFC_FUNCTION(avb),
+       SH_PFC_FUNCTION(can0),
+       SH_PFC_FUNCTION(can1),
+       SH_PFC_FUNCTION(can_clk),
        SH_PFC_FUNCTION(du0),
        SH_PFC_FUNCTION(du1),
        SH_PFC_FUNCTION(eth),
@@ -4113,11 +4577,19 @@ static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(i2c2),
        SH_PFC_FUNCTION(i2c3),
        SH_PFC_FUNCTION(i2c4),
+       SH_PFC_FUNCTION(i2c5),
        SH_PFC_FUNCTION(intc),
        SH_PFC_FUNCTION(mmc),
        SH_PFC_FUNCTION(msiof0),
        SH_PFC_FUNCTION(msiof1),
        SH_PFC_FUNCTION(msiof2),
+       SH_PFC_FUNCTION(pwm0),
+       SH_PFC_FUNCTION(pwm1),
+       SH_PFC_FUNCTION(pwm2),
+       SH_PFC_FUNCTION(pwm3),
+       SH_PFC_FUNCTION(pwm4),
+       SH_PFC_FUNCTION(pwm5),
+       SH_PFC_FUNCTION(pwm6),
        SH_PFC_FUNCTION(qspi),
        SH_PFC_FUNCTION(scif0),
        SH_PFC_FUNCTION(scif1),
@@ -4139,6 +4611,7 @@ static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(sdhi1),
        SH_PFC_FUNCTION(sdhi2),
        SH_PFC_FUNCTION(ssi),
+       SH_PFC_FUNCTION(tpu),
        SH_PFC_FUNCTION(usb0),
        SH_PFC_FUNCTION(usb1),
        SH_PFC_FUNCTION(vin0),
index 1d4d84f34d6043d0f0c6fd3081c7e5d00aeacf8a..292e35d4d2f4931784c67ec996b57358dccd02b9 100644 (file)
@@ -1397,7 +1397,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP16_27_24,    AUDIO_CLKOUT_B,         SEL_ADG_1),
        PINMUX_IPSR_MSEL(IP16_27_24,    SSI_SCK2_B,             SEL_SSI_1),
        PINMUX_IPSR_MSEL(IP16_27_24,    TS_SDEN1_D,             SEL_TSIF1_3),
-       PINMUX_IPSR_MSEL(IP16_27_24,    STP_ISEN_1_D,           SEL_SSP1_1_2),
+       PINMUX_IPSR_MSEL(IP16_27_24,    STP_ISEN_1_D,           SEL_SSP1_1_3),
        PINMUX_IPSR_MSEL(IP16_27_24,    STP_OPWM_0_E,           SEL_SSP1_0_4),
        PINMUX_IPSR_MSEL(IP16_27_24,    RIF3_D0_B,              SEL_DRIF3_1),
        PINMUX_IPSR_MSEL(IP16_27_24,    TCLK2_B,                SEL_TIMER_TMU_1),
index d1cec6d12e818cb901b230eb47ef7c63799237cb..18aeee592fdcf24694909230c15974696f8b4a43 100644 (file)
@@ -20,7 +20,7 @@
 
 #define CPU_ALL_PORT(fn, sfx)                                          \
        PORT_GP_CFG_16(0, fn, sfx, CFG_FLAGS),  \
-       PORT_GP_CFG_28(1, fn, sfx, CFG_FLAGS),  \
+       PORT_GP_CFG_29(1, fn, sfx, CFG_FLAGS),  \
        PORT_GP_CFG_15(2, fn, sfx, CFG_FLAGS),  \
        PORT_GP_CFG_12(3, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE),      \
        PORT_GP_CFG_1(3, 12, fn, sfx, CFG_FLAGS),       \
@@ -55,6 +55,7 @@
 #define GPSR0_0                F_(D0,                  IP5_15_12)
 
 /* GPSR1 */
+#define GPSR1_28       FM(CLKOUT)
 #define GPSR1_27       F_(EX_WAIT0_A,          IP5_11_8)
 #define GPSR1_26       F_(WE1_N,               IP5_7_4)
 #define GPSR1_25       F_(WE0_N,               IP5_3_0)
 #define GPSR5_11       F_(RX2_A,               IP13_7_4)
 #define GPSR5_10       F_(TX2_A,               IP13_3_0)
 #define GPSR5_9                F_(SCK2,                IP12_31_28)
-#define GPSR5_8                F_(RTS1_N_TANS,         IP12_27_24)
+#define GPSR5_8                F_(RTS1_N,              IP12_27_24)
 #define GPSR5_7                F_(CTS1_N,              IP12_23_20)
 #define GPSR5_6                F_(TX1_A,               IP12_19_16)
 #define GPSR5_5                F_(RX1_A,               IP12_15_12)
-#define GPSR5_4                F_(RTS0_N_TANS,         IP12_11_8)
+#define GPSR5_4                F_(RTS0_N,              IP12_11_8)
 #define GPSR5_3                F_(CTS0_N,              IP12_7_4)
 #define GPSR5_2                F_(TX0,                 IP12_3_0)
 #define GPSR5_1                F_(RX0,                 IP11_31_28)
 #define IP0_11_8       FM(AVB_PHY_INT)         F_(0, 0)        FM(MSIOF2_SYNC_C)       FM(RX4_A)                       F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP0_15_12      FM(AVB_LINK)            F_(0, 0)        FM(MSIOF2_SCK_C)        FM(TX4_A)                       F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP0_19_16      FM(AVB_AVTP_MATCH_A)    F_(0, 0)        FM(MSIOF2_RXD_C)        FM(CTS4_N_A)                    F_(0, 0)        FM(FSCLKST2_N_A) F_(0, 0)               F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP0_23_20      FM(AVB_AVTP_CAPTURE_A)  F_(0, 0)        FM(MSIOF2_TXD_C)        FM(RTS4_N_TANS_A)               F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_23_20      FM(AVB_AVTP_CAPTURE_A)  F_(0, 0)        FM(MSIOF2_TXD_C)        FM(RTS4_N_A)                    F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP0_27_24      FM(IRQ0)                FM(QPOLB)       F_(0, 0)                FM(DU_CDE)                      FM(VI4_DATA0_B) FM(CAN0_TX_B)   FM(CANFD0_TX_B)         FM(MSIOF3_SS2_E) F_(0, 0)               F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP0_31_28      FM(IRQ1)                FM(QPOLA)       F_(0, 0)                FM(DU_DISP)                     FM(VI4_DATA1_B) FM(CAN0_RX_B)   FM(CANFD0_RX_B)         FM(MSIOF3_SS1_E) F_(0, 0)               F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP1_3_0                FM(IRQ2)                FM(QCPV_QDE)    F_(0, 0)                FM(DU_EXODDF_DU_ODDF_DISP_CDE)  FM(VI4_DATA2_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_SYNC_E) F_(0, 0)              FM(PWM3_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_7_4                FM(IRQ3)                FM(QSTVB_QVE)   FM(A25)                 FM(DU_DOTCLKOUT1)               FM(VI4_DATA3_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_SCK_E) F_(0, 0)               FM(PWM4_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_11_8       FM(IRQ4)                FM(QSTH_QHS)    FM(A24)                 FM(DU_EXHSYNC_DU_HSYNC)         FM(VI4_DATA4_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_RXD_E) F_(0, 0)               FM(PWM5_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_15_12      FM(IRQ5)                FM(QSTB_QHE)    FM(A23)                 FM(DU_EXVSYNC_DU_VSYNC)         FM(VI4_DATA5_B) FM(FSCLKST2_N_B) F_(0, 0)               FM(MSIOF3_TXD_E) F_(0, 0)               FM(PWM6_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_19_16      FM(PWM0)                FM(AVB_AVTP_PPS)FM(A22)                 F_(0, 0)                        FM(VI4_DATA6_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IECLK_B)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_23_20      FM(PWM1_A)              F_(0, 0)        FM(A21)                 FM(HRX3_D)                      FM(VI4_DATA7_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IERX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_27_24      FM(PWM2_A)              F_(0, 0)        FM(A20)                 FM(HTX3_D)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IETX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_7_4                FM(IRQ3)                FM(QSTVB_QVE)   F_(0, 0)                FM(DU_DOTCLKOUT1)               FM(VI4_DATA3_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_SCK_E) F_(0, 0)               FM(PWM4_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_11_8       FM(IRQ4)                FM(QSTH_QHS)    F_(0, 0)                FM(DU_EXHSYNC_DU_HSYNC)         FM(VI4_DATA4_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_RXD_E) F_(0, 0)               FM(PWM5_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_15_12      FM(IRQ5)                FM(QSTB_QHE)    F_(0, 0)                FM(DU_EXVSYNC_DU_VSYNC)         FM(VI4_DATA5_B) FM(FSCLKST2_N_B) F_(0, 0)               FM(MSIOF3_TXD_E) F_(0, 0)               FM(PWM6_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_19_16      FM(PWM0)                FM(AVB_AVTP_PPS)F_(0, 0)                F_(0, 0)                        FM(VI4_DATA6_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IECLK_B)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_23_20      FM(PWM1_A)              F_(0, 0)        F_(0, 0)                FM(HRX3_D)                      FM(VI4_DATA7_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IERX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_27_24      FM(PWM2_A)              F_(0, 0)        F_(0, 0)                FM(HTX3_D)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IETX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP1_31_28      FM(A0)                  FM(LCDOUT16)    FM(MSIOF3_SYNC_B)       F_(0, 0)                        FM(VI4_DATA8)   F_(0, 0)        FM(DU_DB0)              F_(0, 0)        F_(0, 0)                FM(PWM3_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP2_3_0                FM(A1)                  FM(LCDOUT17)    FM(MSIOF3_TXD_B)        F_(0, 0)                        FM(VI4_DATA9)   F_(0, 0)        FM(DU_DB1)              F_(0, 0)        F_(0, 0)                FM(PWM4_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP2_7_4                FM(A2)                  FM(LCDOUT18)    FM(MSIOF3_SCK_B)        F_(0, 0)                        FM(VI4_DATA10)  F_(0, 0)        FM(DU_DB2)              F_(0, 0)        F_(0, 0)                FM(PWM5_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP2_27_24      FM(A7)                  FM(LCDOUT23)    FM(MSIOF2_SS2_A)        FM(TX4_B)                       FM(VI4_DATA15)  FM(VI5_DATA15)  FM(DU_DB7)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP2_31_28      FM(A8)                  FM(RX3_B)       FM(MSIOF2_SYNC_A)       FM(HRX4_B)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                FM(SDA6_A)      FM(AVB_AVTP_MATCH_B)    FM(PWM1_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_3_0                FM(A9)                  F_(0, 0)        FM(MSIOF2_SCK_A)        FM(CTS4_N_B)                    F_(0, 0)        FM(VI5_VSYNC_N) F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP3_7_4                FM(A10)                 F_(0, 0)        FM(MSIOF2_RXD_A)        FM(RTS4_N_TANS_B)               F_(0, 0)        FM(VI5_HSYNC_N) F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_7_4                FM(A10)                 F_(0, 0)        FM(MSIOF2_RXD_A)        FM(RTS4_N_B)                    F_(0, 0)        FM(VI5_HSYNC_N) F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_11_8       FM(A11)                 FM(TX3_B)       FM(MSIOF2_TXD_A)        FM(HTX4_B)                      FM(HSCK4)       FM(VI5_FIELD)   F_(0, 0)                FM(SCL6_A)      FM(AVB_AVTP_CAPTURE_B)  FM(PWM2_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_15_12      FM(A12)                 FM(LCDOUT12)    FM(MSIOF3_SCK_C)        F_(0, 0)                        FM(HRX4_A)      FM(VI5_DATA8)   FM(DU_DG4)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_19_16      FM(A13)                 FM(LCDOUT13)    FM(MSIOF3_SYNC_C)       F_(0, 0)                        FM(HTX4_A)      FM(VI5_DATA9)   FM(DU_DG5)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP4_27_24      FM(RD_N)                F_(0, 0)        FM(MSIOF3_SYNC_D)       FM(RX3_A)                       FM(HRX3_A)      F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(CAN0_TX_A)           FM(CANFD0_TX_A) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP4_31_28      FM(RD_WR_N)             F_(0, 0)        FM(MSIOF3_RXD_D)        FM(TX3_A)                       FM(HTX3_A)      F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(CAN0_RX_A)           FM(CANFD0_RX_A) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_3_0                FM(WE0_N)               F_(0, 0)        FM(MSIOF3_TXD_D)        FM(CTS3_N)                      FM(HCTS3_N)     F_(0, 0)        F_(0, 0)                FM(SCL6_B)      FM(CAN_CLK)             F_(0, 0)        FM(IECLK_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP5_7_4                FM(WE1_N)               F_(0, 0)        FM(MSIOF3_SS1_D)        FM(RTS3_N_TANS)                 FM(HRTS3_N)     F_(0, 0)        F_(0, 0)                FM(SDA6_B)      FM(CAN1_RX)             FM(CANFD1_RX)   FM(IERX_A)      F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_7_4                FM(WE1_N)               F_(0, 0)        FM(MSIOF3_SS1_D)        FM(RTS3_N)                      FM(HRTS3_N)     F_(0, 0)        F_(0, 0)                FM(SDA6_B)      FM(CAN1_RX)             FM(CANFD1_RX)   FM(IERX_A)      F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_11_8       FM(EX_WAIT0_A)          FM(QCLK)        F_(0, 0)                F_(0, 0)                        FM(VI4_CLK)     F_(0, 0)        FM(DU_DOTCLKOUT0)       F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_15_12      FM(D0)                  FM(MSIOF2_SS1_B)FM(MSIOF3_SCK_A)        F_(0, 0)                        FM(VI4_DATA16)  FM(VI5_DATA0)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_19_16      FM(D1)                  FM(MSIOF2_SS2_B)FM(MSIOF3_SYNC_A)       F_(0, 0)                        FM(VI4_DATA17)  FM(VI5_DATA1)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_15_12      FM(D8)                  FM(LCDOUT0)     FM(MSIOF2_SCK_D)        FM(SCK4_C)                      FM(VI4_DATA0_A) F_(0, 0)        FM(DU_DR0)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_19_16      FM(D9)                  FM(LCDOUT1)     FM(MSIOF2_SYNC_D)       F_(0, 0)                        FM(VI4_DATA1_A) F_(0, 0)        FM(DU_DR1)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_23_20      FM(D10)                 FM(LCDOUT2)     FM(MSIOF2_RXD_D)        FM(HRX3_B)                      FM(VI4_DATA2_A) FM(CTS4_N_C)    FM(DU_DR2)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP6_27_24      FM(D11)                 FM(LCDOUT3)     FM(MSIOF2_TXD_D)        FM(HTX3_B)                      FM(VI4_DATA3_A) FM(RTS4_N_TANS_C)FM(DU_DR3)             F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_27_24      FM(D11)                 FM(LCDOUT3)     FM(MSIOF2_TXD_D)        FM(HTX3_B)                      FM(VI4_DATA3_A) FM(RTS4_N_C)    FM(DU_DR3)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_31_28      FM(D12)                 FM(LCDOUT4)     FM(MSIOF2_SS1_D)        FM(RX4_C)                       FM(VI4_DATA4_A) F_(0, 0)        FM(DU_DR4)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP7_3_0                FM(D13)                 FM(LCDOUT5)     FM(MSIOF2_SS2_D)        FM(TX4_C)                       FM(VI4_DATA5_A) F_(0, 0)        FM(DU_DR5)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP7_7_4                FM(D14)                 FM(LCDOUT6)     FM(MSIOF3_SS1_A)        FM(HRX3_C)                      FM(VI4_DATA6_A) F_(0, 0)        FM(DU_DR6)              FM(SCL6_C)      F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP11_31_28     FM(RX0)                 FM(HRX1_B)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SCK0_C)   FM(STP_ISCLK_0_C)       FM(RIF0_D0_B)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_3_0       FM(TX0)                 FM(HTX1_B)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC0_C)FM(STP_ISSYNC_0_C)      FM(RIF0_D1_B)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_7_4       FM(CTS0_N)              FM(HCTS1_N_B)   FM(MSIOF1_SYNC_B)       F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC1_C)FM(STP_ISSYNC_1_C)      FM(RIF1_SYNC_B) FM(AUDIO_CLKOUT_C)      FM(ADICS_SAMP)  F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP12_11_8      FM(RTS0_N_TANS)         FM(HRTS1_N_B)   FM(MSIOF1_SS1_B)        FM(AUDIO_CLKA_B)                FM(SCL2_A)      F_(0, 0)        FM(STP_IVCXO27_1_C)     FM(RIF0_SYNC_B) F_(0, 0)                FM(ADICHS1)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_11_8      FM(RTS0_N)              FM(HRTS1_N_B)   FM(MSIOF1_SS1_B)        FM(AUDIO_CLKA_B)                FM(SCL2_A)      F_(0, 0)        FM(STP_IVCXO27_1_C)     FM(RIF0_SYNC_B) F_(0, 0)                FM(ADICHS1)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_15_12     FM(RX1_A)               FM(HRX1_A)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SDAT0_C)  FM(STP_ISD_0_C)         FM(RIF1_CLK_C)  F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_19_16     FM(TX1_A)               FM(HTX1_A)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SDEN0_C)  FM(STP_ISEN_0_C)        FM(RIF1_D0_C)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_23_20     FM(CTS1_N)              FM(HCTS1_N_A)   FM(MSIOF1_RXD_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SDEN1_C)  FM(STP_ISEN_1_C)        FM(RIF1_D0_B)   F_(0, 0)                FM(ADIDATA)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP12_27_24     FM(RTS1_N_TANS)         FM(HRTS1_N_A)   FM(MSIOF1_TXD_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SDAT1_C)  FM(STP_ISD_1_C)         FM(RIF1_D1_B)   F_(0, 0)                FM(ADICHS0)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_27_24     FM(RTS1_N)              FM(HRTS1_N_A)   FM(MSIOF1_TXD_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SDAT1_C)  FM(STP_ISD_1_C)         FM(RIF1_D1_B)   F_(0, 0)                FM(ADICHS0)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_31_28     FM(SCK2)                FM(SCIF_CLK_B)  FM(MSIOF1_SCK_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SCK1_C)   FM(STP_ISCLK_1_C)       FM(RIF1_CLK_B)  F_(0, 0)                FM(ADICLK)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP13_3_0       FM(TX2_A)               F_(0, 0)        F_(0, 0)                FM(SD2_CD_B)                    FM(SCL1_A)      F_(0, 0)        FM(FMCLK_A)             FM(RIF1_D1_C)   F_(0, 0)                FM(FSO_CFE_0_N) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP13_7_4       FM(RX2_A)               F_(0, 0)        F_(0, 0)                FM(SD2_WP_B)                    FM(SDA1_A)      F_(0, 0)        FM(FMIN_A)              FM(RIF1_SYNC_C) F_(0, 0)                FM(FSO_CFE_1_N) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
                                                                                                GPSR6_31 \
                                                                                                GPSR6_30 \
                                                                                                GPSR6_29 \
-                                                                                               GPSR6_28 \
+               GPSR1_28                                                                        GPSR6_28 \
                GPSR1_27                                                                        GPSR6_27 \
                GPSR1_26                                                                        GPSR6_26 \
                GPSR1_25                                                        GPSR5_25        GPSR6_25 \
@@ -548,7 +549,7 @@ MOD_SEL0_4_3                MOD_SEL1_4 \
        FM(AVB_TX_CTL) FM(AVB_TXC) FM(AVB_TD0) FM(AVB_TD1) FM(AVB_TD2) FM(AVB_TD3) \
        FM(AVB_RX_CTL) FM(AVB_RXC) FM(AVB_RD0) FM(AVB_RD1) FM(AVB_RD2) FM(AVB_RD3) \
        FM(AVB_TXCREFCLK) FM(AVB_MDIO) \
-       FM(CLKOUT) FM(PRESETOUT) \
+       FM(PRESETOUT) \
        FM(DU_DOTCLKIN0) FM(DU_DOTCLKIN1) FM(DU_DOTCLKIN2) FM(DU_DOTCLKIN3) \
        FM(TMS) FM(TDO) FM(ASEBRK) FM(MLB_REF) FM(TDI) FM(TCK) FM(TRST) FM(EXTALR)
 
@@ -587,6 +588,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_SINGLE(AVS1),
        PINMUX_SINGLE(AVS2),
+       PINMUX_SINGLE(CLKOUT),
        PINMUX_SINGLE(HDMI0_CEC),
        PINMUX_SINGLE(HDMI1_CEC),
        PINMUX_SINGLE(I2C_SEL_0_1),
@@ -622,7 +624,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_MSEL(IP0_23_20,     AVB_AVTP_CAPTURE_A,     SEL_ETHERAVB_0),
        PINMUX_IPSR_MSEL(IP0_23_20,     MSIOF2_TXD_C,           SEL_MSIOF2_2),
-       PINMUX_IPSR_MSEL(IP0_23_20,     RTS4_N_TANS_A,          SEL_SCIF4_0),
+       PINMUX_IPSR_MSEL(IP0_23_20,     RTS4_N_A,               SEL_SCIF4_0),
 
        PINMUX_IPSR_GPSR(IP0_27_24,     IRQ0),
        PINMUX_IPSR_GPSR(IP0_27_24,     QPOLB),
@@ -650,7 +652,6 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP1_7_4,       IRQ3),
        PINMUX_IPSR_GPSR(IP1_7_4,       QSTVB_QVE),
-       PINMUX_IPSR_GPSR(IP1_7_4,       A25),
        PINMUX_IPSR_GPSR(IP1_7_4,       DU_DOTCLKOUT1),
        PINMUX_IPSR_MSEL(IP1_7_4,       VI4_DATA3_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_7_4,       PWM4_B,                 SEL_PWM4_1),
@@ -658,7 +659,6 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP1_11_8,      IRQ4),
        PINMUX_IPSR_GPSR(IP1_11_8,      QSTH_QHS),
-       PINMUX_IPSR_GPSR(IP1_11_8,      A24),
        PINMUX_IPSR_GPSR(IP1_11_8,      DU_EXHSYNC_DU_HSYNC),
        PINMUX_IPSR_MSEL(IP1_11_8,      VI4_DATA4_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_11_8,      PWM5_B,                 SEL_PWM5_1),
@@ -666,7 +666,6 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP1_15_12,     IRQ5),
        PINMUX_IPSR_GPSR(IP1_15_12,     QSTB_QHE),
-       PINMUX_IPSR_GPSR(IP1_15_12,     A23),
        PINMUX_IPSR_GPSR(IP1_15_12,     DU_EXVSYNC_DU_VSYNC),
        PINMUX_IPSR_MSEL(IP1_15_12,     VI4_DATA5_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_15_12,     PWM6_B,                 SEL_PWM6_1),
@@ -675,18 +674,15 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP1_19_16,     PWM0),
        PINMUX_IPSR_GPSR(IP1_19_16,     AVB_AVTP_PPS),
-       PINMUX_IPSR_GPSR(IP1_19_16,     A22),
        PINMUX_IPSR_MSEL(IP1_19_16,     VI4_DATA6_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_19_16,     IECLK_B,                SEL_IEBUS_1),
 
        PINMUX_IPSR_MSEL(IP1_23_20,     PWM1_A,                 SEL_PWM1_0),
-       PINMUX_IPSR_GPSR(IP1_23_20,     A21),
        PINMUX_IPSR_MSEL(IP1_23_20,     HRX3_D,                 SEL_HSCIF3_3),
        PINMUX_IPSR_MSEL(IP1_23_20,     VI4_DATA7_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_23_20,     IERX_B,                 SEL_IEBUS_1),
 
        PINMUX_IPSR_MSEL(IP1_27_24,     PWM2_A,                 SEL_PWM2_0),
-       PINMUX_IPSR_GPSR(IP1_27_24,     A20),
        PINMUX_IPSR_MSEL(IP1_27_24,     HTX3_D,                 SEL_HSCIF3_3),
        PINMUX_IPSR_MSEL(IP1_27_24,     IETX_B,                 SEL_IEBUS_1),
 
@@ -766,7 +762,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP3_7_4,       A10),
        PINMUX_IPSR_MSEL(IP3_7_4,       MSIOF2_RXD_A,           SEL_MSIOF2_0),
-       PINMUX_IPSR_MSEL(IP3_7_4,       RTS4_N_TANS_B,          SEL_SCIF4_1),
+       PINMUX_IPSR_MSEL(IP3_7_4,       RTS4_N_B,               SEL_SCIF4_1),
        PINMUX_IPSR_GPSR(IP3_7_4,       VI5_HSYNC_N),
 
        PINMUX_IPSR_GPSR(IP3_11_8,      A11),
@@ -869,7 +865,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP5_7_4,       WE1_N),
        PINMUX_IPSR_MSEL(IP5_7_4,       MSIOF3_SS1_D,           SEL_MSIOF3_3),
-       PINMUX_IPSR_GPSR(IP5_7_4,       RTS3_N_TANS),
+       PINMUX_IPSR_GPSR(IP5_7_4,       RTS3_N),
        PINMUX_IPSR_GPSR(IP5_7_4,       HRTS3_N),
        PINMUX_IPSR_MSEL(IP5_7_4,       SDA6_B,                 SEL_I2C6_1),
        PINMUX_IPSR_GPSR(IP5_7_4,       CAN1_RX),
@@ -950,7 +946,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP6_27_24,     MSIOF2_TXD_D,           SEL_MSIOF2_3),
        PINMUX_IPSR_MSEL(IP6_27_24,     HTX3_B,                 SEL_HSCIF3_1),
        PINMUX_IPSR_MSEL(IP6_27_24,     VI4_DATA3_A,            SEL_VIN4_0),
-       PINMUX_IPSR_MSEL(IP6_27_24,     RTS4_N_TANS_C,          SEL_SCIF4_2),
+       PINMUX_IPSR_MSEL(IP6_27_24,     RTS4_N_C,               SEL_SCIF4_2),
        PINMUX_IPSR_GPSR(IP6_27_24,     DU_DR3),
 
        PINMUX_IPSR_GPSR(IP6_31_28,     D12),
@@ -1159,7 +1155,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP12_7_4,      AUDIO_CLKOUT_C),
        PINMUX_IPSR_GPSR(IP12_7_4,      ADICS_SAMP),
 
-       PINMUX_IPSR_GPSR(IP12_11_8,     RTS0_N_TANS),
+       PINMUX_IPSR_GPSR(IP12_11_8,     RTS0_N),
        PINMUX_IPSR_MSEL(IP12_11_8,     HRTS1_N_B,              SEL_HSCIF1_1),
        PINMUX_IPSR_MSEL(IP12_11_8,     MSIOF1_SS1_B,           SEL_MSIOF1_1),
        PINMUX_IPSR_MSEL(IP12_11_8,     AUDIO_CLKA_B,           SEL_ADG_A_1),
@@ -1188,7 +1184,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP12_23_20,    RIF1_D0_B,              SEL_DRIF1_1),
        PINMUX_IPSR_GPSR(IP12_23_20,    ADIDATA),
 
-       PINMUX_IPSR_GPSR(IP12_27_24,    RTS1_N_TANS),
+       PINMUX_IPSR_GPSR(IP12_27_24,    RTS1_N),
        PINMUX_IPSR_MSEL(IP12_27_24,    HRTS1_N_A,              SEL_HSCIF1_0),
        PINMUX_IPSR_MSEL(IP12_27_24,    MSIOF1_TXD_B,           SEL_MSIOF1_1),
        PINMUX_IPSR_MSEL(IP12_27_24,    TS_SDAT1_C,             SEL_TSIF1_2),
@@ -1781,6 +1777,61 @@ static const unsigned int avb_avtp_capture_b_mux[] = {
        AVB_AVTP_CAPTURE_B_MARK,
 };
 
+/* - CAN ------------------------------------------------------------------ */
+static const unsigned int can0_data_a_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 23),     RCAR_GP_PIN(1, 24),
+};
+static const unsigned int can0_data_a_mux[] = {
+       CAN0_TX_A_MARK,         CAN0_RX_A_MARK,
+};
+static const unsigned int can0_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(2, 0),      RCAR_GP_PIN(2, 1),
+};
+static const unsigned int can0_data_b_mux[] = {
+       CAN0_TX_B_MARK,         CAN0_RX_B_MARK,
+};
+static const unsigned int can1_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 22),     RCAR_GP_PIN(1, 26),
+};
+static const unsigned int can1_data_mux[] = {
+       CAN1_TX_MARK,           CAN1_RX_MARK,
+};
+
+/* - CAN Clock -------------------------------------------------------------- */
+static const unsigned int can_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(1, 25),
+};
+static const unsigned int can_clk_mux[] = {
+       CAN_CLK_MARK,
+};
+
+/* - CAN FD --------------------------------------------------------------- */
+static const unsigned int canfd0_data_a_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 23),     RCAR_GP_PIN(1, 24),
+};
+static const unsigned int canfd0_data_a_mux[] = {
+       CANFD0_TX_A_MARK,       CANFD0_RX_A_MARK,
+};
+static const unsigned int canfd0_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(2, 0),      RCAR_GP_PIN(2, 1),
+};
+static const unsigned int canfd0_data_b_mux[] = {
+       CANFD0_TX_B_MARK,       CANFD0_RX_B_MARK,
+};
+static const unsigned int canfd1_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 22),     RCAR_GP_PIN(1, 26),
+};
+static const unsigned int canfd1_data_mux[] = {
+       CANFD1_TX_MARK,         CANFD1_RX_MARK,
+};
+
 /* - DRIF0 --------------------------------------------------------------- */
 static const unsigned int drif0_ctrl_a_pins[] = {
        /* CLK, SYNC */
@@ -3176,6 +3227,22 @@ static const unsigned int pwm6_b_mux[] = {
        PWM6_B_MARK,
 };
 
+/* - SATA --------------------------------------------------------------------*/
+static const unsigned int sata0_devslp_a_pins[] = {
+       /* DEVSLP */
+       RCAR_GP_PIN(6, 16),
+};
+static const unsigned int sata0_devslp_a_mux[] = {
+       SATA_DEVSLP_A_MARK,
+};
+static const unsigned int sata0_devslp_b_pins[] = {
+       /* DEVSLP */
+       RCAR_GP_PIN(4, 6),
+};
+static const unsigned int sata0_devslp_b_mux[] = {
+       SATA_DEVSLP_B_MARK,
+};
+
 /* - SCIF0 ------------------------------------------------------------------ */
 static const unsigned int scif0_data_pins[] = {
        /* RX, TX */
@@ -3196,7 +3263,7 @@ static const unsigned int scif0_ctrl_pins[] = {
        RCAR_GP_PIN(5, 4), RCAR_GP_PIN(5, 3),
 };
 static const unsigned int scif0_ctrl_mux[] = {
-       RTS0_N_TANS_MARK, CTS0_N_MARK,
+       RTS0_N_MARK, CTS0_N_MARK,
 };
 /* - SCIF1 ------------------------------------------------------------------ */
 static const unsigned int scif1_data_a_pins[] = {
@@ -3218,7 +3285,7 @@ static const unsigned int scif1_ctrl_pins[] = {
        RCAR_GP_PIN(5, 8), RCAR_GP_PIN(5, 7),
 };
 static const unsigned int scif1_ctrl_mux[] = {
-       RTS1_N_TANS_MARK, CTS1_N_MARK,
+       RTS1_N_MARK, CTS1_N_MARK,
 };
 
 static const unsigned int scif1_data_b_pins[] = {
@@ -3270,7 +3337,7 @@ static const unsigned int scif3_ctrl_pins[] = {
        RCAR_GP_PIN(1, 26), RCAR_GP_PIN(1, 25),
 };
 static const unsigned int scif3_ctrl_mux[] = {
-       RTS3_N_TANS_MARK, CTS3_N_MARK,
+       RTS3_N_MARK, CTS3_N_MARK,
 };
 static const unsigned int scif3_data_b_pins[] = {
        /* RX, TX */
@@ -3299,7 +3366,7 @@ static const unsigned int scif4_ctrl_a_pins[] = {
        RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 13),
 };
 static const unsigned int scif4_ctrl_a_mux[] = {
-       RTS4_N_TANS_A_MARK, CTS4_N_A_MARK,
+       RTS4_N_A_MARK, CTS4_N_A_MARK,
 };
 static const unsigned int scif4_data_b_pins[] = {
        /* RX, TX */
@@ -3320,7 +3387,7 @@ static const unsigned int scif4_ctrl_b_pins[] = {
        RCAR_GP_PIN(1, 10), RCAR_GP_PIN(1, 9),
 };
 static const unsigned int scif4_ctrl_b_mux[] = {
-       RTS4_N_TANS_B_MARK, CTS4_N_B_MARK,
+       RTS4_N_B_MARK, CTS4_N_B_MARK,
 };
 static const unsigned int scif4_data_c_pins[] = {
        /* RX, TX */
@@ -3341,7 +3408,7 @@ static const unsigned int scif4_ctrl_c_pins[] = {
        RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
 };
 static const unsigned int scif4_ctrl_c_mux[] = {
-       RTS4_N_TANS_C_MARK, CTS4_N_C_MARK,
+       RTS4_N_C_MARK, CTS4_N_C_MARK,
 };
 /* - SCIF5 ------------------------------------------------------------------ */
 static const unsigned int scif5_data_a_pins[] = {
@@ -3843,6 +3910,13 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(avb_avtp_capture_a),
        SH_PFC_PIN_GROUP(avb_avtp_match_b),
        SH_PFC_PIN_GROUP(avb_avtp_capture_b),
+       SH_PFC_PIN_GROUP(can0_data_a),
+       SH_PFC_PIN_GROUP(can0_data_b),
+       SH_PFC_PIN_GROUP(can1_data),
+       SH_PFC_PIN_GROUP(can_clk),
+       SH_PFC_PIN_GROUP(canfd0_data_a),
+       SH_PFC_PIN_GROUP(canfd0_data_b),
+       SH_PFC_PIN_GROUP(canfd1_data),
        SH_PFC_PIN_GROUP(drif0_ctrl_a),
        SH_PFC_PIN_GROUP(drif0_data0_a),
        SH_PFC_PIN_GROUP(drif0_data1_a),
@@ -4034,6 +4108,8 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(pwm5_b),
        SH_PFC_PIN_GROUP(pwm6_a),
        SH_PFC_PIN_GROUP(pwm6_b),
+       SH_PFC_PIN_GROUP(sata0_devslp_a),
+       SH_PFC_PIN_GROUP(sata0_devslp_b),
        SH_PFC_PIN_GROUP(scif0_data),
        SH_PFC_PIN_GROUP(scif0_clk),
        SH_PFC_PIN_GROUP(scif0_ctrl),
@@ -4154,6 +4230,28 @@ static const char * const avb_groups[] = {
        "avb_avtp_capture_b",
 };
 
+static const char * const can0_groups[] = {
+       "can0_data_a",
+       "can0_data_b",
+};
+
+static const char * const can1_groups[] = {
+       "can1_data",
+};
+
+static const char * const can_clk_groups[] = {
+       "can_clk",
+};
+
+static const char * const canfd0_groups[] = {
+       "canfd0_data_a",
+       "canfd0_data_b",
+};
+
+static const char * const canfd1_groups[] = {
+       "canfd1_data",
+};
+
 static const char * const drif0_groups[] = {
        "drif0_ctrl_a",
        "drif0_data0_a",
@@ -4420,6 +4518,11 @@ static const char * const pwm6_groups[] = {
        "pwm6_b",
 };
 
+static const char * const sata0_groups[] = {
+       "sata0_devslp_a",
+       "sata0_devslp_b",
+};
+
 static const char * const scif0_groups[] = {
        "scif0_data",
        "scif0_clk",
@@ -4559,6 +4662,11 @@ static const char * const usb30_groups[] = {
 static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(audio_clk),
        SH_PFC_FUNCTION(avb),
+       SH_PFC_FUNCTION(can0),
+       SH_PFC_FUNCTION(can1),
+       SH_PFC_FUNCTION(can_clk),
+       SH_PFC_FUNCTION(canfd0),
+       SH_PFC_FUNCTION(canfd1),
        SH_PFC_FUNCTION(drif0),
        SH_PFC_FUNCTION(drif1),
        SH_PFC_FUNCTION(drif2),
@@ -4584,6 +4692,7 @@ static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(pwm4),
        SH_PFC_FUNCTION(pwm5),
        SH_PFC_FUNCTION(pwm6),
+       SH_PFC_FUNCTION(sata0),
        SH_PFC_FUNCTION(scif0),
        SH_PFC_FUNCTION(scif1),
        SH_PFC_FUNCTION(scif2),
@@ -4644,7 +4753,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
                0, 0,
                0, 0,
                0, 0,
-               0, 0,
+               GP_1_28_FN,     GPSR1_28,
                GP_1_27_FN,     GPSR1_27,
                GP_1_26_FN,     GPSR1_26,
                GP_1_25_FN,     GPSR1_25,
@@ -5246,7 +5355,7 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
                { RCAR_GP_PIN(1, 19),  0, 3 },  /* A19 */
        } },
        { PINMUX_DRIVE_REG("DRVCTRL8", 0xe6060320) {
-               { PIN_NUMBER('F', 1), 28, 3 },  /* CLKOUT */
+               { RCAR_GP_PIN(1, 28), 28, 3 },  /* CLKOUT */
                { RCAR_GP_PIN(1, 20), 24, 3 },  /* CS0 */
                { RCAR_GP_PIN(1, 21), 20, 3 },  /* CS1_A26 */
                { RCAR_GP_PIN(1, 22), 16, 3 },  /* BS */
@@ -5342,11 +5451,11 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
                { RCAR_GP_PIN(5,  3),  0, 3 },  /* CTS0 */
        } },
        { PINMUX_DRIVE_REG("DRVCTRL18", 0xe6060348) {
-               { RCAR_GP_PIN(5,  4), 28, 3 },  /* RTS0_TANS */
+               { RCAR_GP_PIN(5,  4), 28, 3 },  /* RTS0 */
                { RCAR_GP_PIN(5,  5), 24, 3 },  /* RX1 */
                { RCAR_GP_PIN(5,  6), 20, 3 },  /* TX1 */
                { RCAR_GP_PIN(5,  7), 16, 3 },  /* CTS1 */
-               { RCAR_GP_PIN(5,  8), 12, 3 },  /* RTS1_TANS */
+               { RCAR_GP_PIN(5,  8), 12, 3 },  /* RTS1 */
                { RCAR_GP_PIN(5,  9),  8, 3 },  /* SCK2 */
                { RCAR_GP_PIN(5, 10),  4, 3 },  /* TX2 */
                { RCAR_GP_PIN(5, 11),  0, 3 },  /* RX2 */
@@ -5507,7 +5616,7 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
                [31] = RCAR_GP_PIN(1, 19),      /* A19 */
        } },
        { PINMUX_BIAS_REG("PUEN2", 0xe6060408, "PUD2", 0xe6060448) {
-               [ 0] = PIN_NUMBER('F', 1),      /* CLKOUT */
+               [ 0] = RCAR_GP_PIN(1, 28),      /* CLKOUT */
                [ 1] = RCAR_GP_PIN(1, 20),      /* CS0_N */
                [ 2] = RCAR_GP_PIN(1, 21),      /* CS1_N */
                [ 3] = RCAR_GP_PIN(1, 22),      /* BS_N */
@@ -5591,11 +5700,11 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
                [13] = RCAR_GP_PIN(5,  1),      /* RX0 */
                [14] = RCAR_GP_PIN(5,  2),      /* TX0 */
                [15] = RCAR_GP_PIN(5,  3),      /* CTS0_N */
-               [16] = RCAR_GP_PIN(5,  4),      /* RTS0_N_TANS */
+               [16] = RCAR_GP_PIN(5,  4),      /* RTS0_N */
                [17] = RCAR_GP_PIN(5,  5),      /* RX1_A */
                [18] = RCAR_GP_PIN(5,  6),      /* TX1_A */
                [19] = RCAR_GP_PIN(5,  7),      /* CTS1_N */
-               [20] = RCAR_GP_PIN(5,  8),      /* RTS1_N_TANS */
+               [20] = RCAR_GP_PIN(5,  8),      /* RTS1_N */
                [21] = RCAR_GP_PIN(5,  9),      /* SCK2 */
                [22] = RCAR_GP_PIN(5, 10),      /* TX2_A */
                [23] = RCAR_GP_PIN(5, 11),      /* RX2_A */
index 73ed9c74c1373b91307ba1947759309b577c10b9..e5807d1ce0dccbb660bcc81f6e80f7c126061d4c 100644 (file)
 #define GPSR5_11       F_(RX2_A,               IP13_7_4)
 #define GPSR5_10       F_(TX2_A,               IP13_3_0)
 #define GPSR5_9                F_(SCK2,                IP12_31_28)
-#define GPSR5_8                F_(RTS1_N_TANS,         IP12_27_24)
+#define GPSR5_8                F_(RTS1_N,              IP12_27_24)
 #define GPSR5_7                F_(CTS1_N,              IP12_23_20)
 #define GPSR5_6                F_(TX1_A,               IP12_19_16)
 #define GPSR5_5                F_(RX1_A,               IP12_15_12)
-#define GPSR5_4                F_(RTS0_N_TANS,         IP12_11_8)
+#define GPSR5_4                F_(RTS0_N,              IP12_11_8)
 #define GPSR5_3                F_(CTS0_N,              IP12_7_4)
 #define GPSR5_2                F_(TX0,                 IP12_3_0)
 #define GPSR5_1                F_(RX0,                 IP11_31_28)
 #define IP0_11_8       FM(AVB_PHY_INT)         F_(0, 0)        FM(MSIOF2_SYNC_C)       FM(RX4_A)                       F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP0_15_12      FM(AVB_LINK)            F_(0, 0)        FM(MSIOF2_SCK_C)        FM(TX4_A)                       F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP0_19_16      FM(AVB_AVTP_MATCH_A)    F_(0, 0)        FM(MSIOF2_RXD_C)        FM(CTS4_N_A)                    F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP0_23_20      FM(AVB_AVTP_CAPTURE_A)  F_(0, 0)        FM(MSIOF2_TXD_C)        FM(RTS4_N_TANS_A)               F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_23_20      FM(AVB_AVTP_CAPTURE_A)  F_(0, 0)        FM(MSIOF2_TXD_C)        FM(RTS4_N_A)                    F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP0_27_24      FM(IRQ0)                FM(QPOLB)       F_(0, 0)                FM(DU_CDE)                      FM(VI4_DATA0_B) FM(CAN0_TX_B)   FM(CANFD0_TX_B)         FM(MSIOF3_SS2_E) F_(0, 0)               F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP0_31_28      FM(IRQ1)                FM(QPOLA)       F_(0, 0)                FM(DU_DISP)                     FM(VI4_DATA1_B) FM(CAN0_RX_B)   FM(CANFD0_RX_B)         FM(MSIOF3_SS1_E) F_(0, 0)               F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP1_3_0                FM(IRQ2)                FM(QCPV_QDE)    F_(0, 0)                FM(DU_EXODDF_DU_ODDF_DISP_CDE)  FM(VI4_DATA2_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_SYNC_E) F_(0, 0)              FM(PWM3_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_7_4                FM(IRQ3)                FM(QSTVB_QVE)   FM(A25)                 FM(DU_DOTCLKOUT1)               FM(VI4_DATA3_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_SCK_E) F_(0, 0)               FM(PWM4_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_11_8       FM(IRQ4)                FM(QSTH_QHS)    FM(A24)                 FM(DU_EXHSYNC_DU_HSYNC)         FM(VI4_DATA4_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_RXD_E) F_(0, 0)               FM(PWM5_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_15_12      FM(IRQ5)                FM(QSTB_QHE)    FM(A23)                 FM(DU_EXVSYNC_DU_VSYNC)         FM(VI4_DATA5_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_TXD_E) F_(0, 0)               FM(PWM6_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_19_16      FM(PWM0)                FM(AVB_AVTP_PPS)FM(A22)                 F_(0, 0)                        FM(VI4_DATA6_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IECLK_B)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_23_20      FM(PWM1_A)              F_(0, 0)        FM(A21)                 FM(HRX3_D)                      FM(VI4_DATA7_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IERX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP1_27_24      FM(PWM2_A)              F_(0, 0)        FM(A20)                 FM(HTX3_D)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IETX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_7_4                FM(IRQ3)                FM(QSTVB_QVE)   F_(0, 0)                FM(DU_DOTCLKOUT1)               FM(VI4_DATA3_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_SCK_E) F_(0, 0)               FM(PWM4_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_11_8       FM(IRQ4)                FM(QSTH_QHS)    F_(0, 0)                FM(DU_EXHSYNC_DU_HSYNC)         FM(VI4_DATA4_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_RXD_E) F_(0, 0)               FM(PWM5_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_15_12      FM(IRQ5)                FM(QSTB_QHE)    F_(0, 0)                FM(DU_EXVSYNC_DU_VSYNC)         FM(VI4_DATA5_B) F_(0, 0)        F_(0, 0)                FM(MSIOF3_TXD_E) F_(0, 0)               FM(PWM6_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_19_16      FM(PWM0)                FM(AVB_AVTP_PPS)F_(0, 0)                F_(0, 0)                        FM(VI4_DATA6_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IECLK_B)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_23_20      FM(PWM1_A)              F_(0, 0)        F_(0, 0)                FM(HRX3_D)                      FM(VI4_DATA7_B) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IERX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_27_24      FM(PWM2_A)              F_(0, 0)        F_(0, 0)                FM(HTX3_D)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)                FM(IETX_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP1_31_28      FM(A0)                  FM(LCDOUT16)    FM(MSIOF3_SYNC_B)       F_(0, 0)                        FM(VI4_DATA8)   F_(0, 0)        FM(DU_DB0)              F_(0, 0)        F_(0, 0)                FM(PWM3_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP2_3_0                FM(A1)                  FM(LCDOUT17)    FM(MSIOF3_TXD_B)        F_(0, 0)                        FM(VI4_DATA9)   F_(0, 0)        FM(DU_DB1)              F_(0, 0)        F_(0, 0)                FM(PWM4_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP2_7_4                FM(A2)                  FM(LCDOUT18)    FM(MSIOF3_SCK_B)        F_(0, 0)                        FM(VI4_DATA10)  F_(0, 0)        FM(DU_DB2)              F_(0, 0)        F_(0, 0)                FM(PWM5_A)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP2_27_24      FM(A7)                  FM(LCDOUT23)    FM(MSIOF2_SS2_A)        FM(TX4_B)                       FM(VI4_DATA15)  FM(VI5_DATA15)  FM(DU_DB7)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP2_31_28      FM(A8)                  FM(RX3_B)       FM(MSIOF2_SYNC_A)       FM(HRX4_B)                      F_(0, 0)        F_(0, 0)        F_(0, 0)                FM(SDA6_A)      FM(AVB_AVTP_MATCH_B)    FM(PWM1_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_3_0                FM(A9)                  F_(0, 0)        FM(MSIOF2_SCK_A)        FM(CTS4_N_B)                    F_(0, 0)        FM(VI5_VSYNC_N) F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP3_7_4                FM(A10)                 F_(0, 0)        FM(MSIOF2_RXD_A)        FM(RTS4_N_TANS_B)               F_(0, 0)        FM(VI5_HSYNC_N) F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_7_4                FM(A10)                 F_(0, 0)        FM(MSIOF2_RXD_A)        FM(RTS4_N_B)                    F_(0, 0)        FM(VI5_HSYNC_N) F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP3_11_8       FM(A11)                 FM(TX3_B)       FM(MSIOF2_TXD_A)        FM(HTX4_B)                      FM(HSCK4)       FM(VI5_FIELD)   F_(0, 0)                FM(SCL6_A)      FM(AVB_AVTP_CAPTURE_B)  FM(PWM2_B)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 
 /* IPSRx */            /* 0 */                 /* 1 */         /* 2 */                 /* 3 */                         /* 4 */         /* 5 */         /* 6 */                 /* 7 */         /* 8 */                 /* 9 */         /* A */         /* B */         /* C - F */
 #define IP4_27_24      FM(RD_N)                F_(0, 0)        FM(MSIOF3_SYNC_D)       FM(RX3_A)                       FM(HRX3_A)      F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(CAN0_TX_A)           FM(CANFD0_TX_A) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP4_31_28      FM(RD_WR_N)             F_(0, 0)        FM(MSIOF3_RXD_D)        FM(TX3_A)                       FM(HTX3_A)      F_(0, 0)        F_(0, 0)                F_(0, 0)        FM(CAN0_RX_A)           FM(CANFD0_RX_A) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_3_0                FM(WE0_N)               F_(0, 0)        FM(MSIOF3_TXD_D)        FM(CTS3_N)                      FM(HCTS3_N)     F_(0, 0)        F_(0, 0)                FM(SCL6_B)      FM(CAN_CLK)             F_(0, 0)        FM(IECLK_A)     F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP5_7_4                FM(WE1_N)               F_(0, 0)        FM(MSIOF3_SS1_D)        FM(RTS3_N_TANS)                 FM(HRTS3_N)     F_(0, 0)        F_(0, 0)                FM(SDA6_B)      FM(CAN1_RX)             FM(CANFD1_RX)   FM(IERX_A)      F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_7_4                FM(WE1_N)               F_(0, 0)        FM(MSIOF3_SS1_D)        FM(RTS3_N)                      FM(HRTS3_N)     F_(0, 0)        F_(0, 0)                FM(SDA6_B)      FM(CAN1_RX)             FM(CANFD1_RX)   FM(IERX_A)      F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_11_8       FM(EX_WAIT0_A)          FM(QCLK)        F_(0, 0)                F_(0, 0)                        FM(VI4_CLK)     F_(0, 0)        FM(DU_DOTCLKOUT0)       F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_15_12      FM(D0)                  FM(MSIOF2_SS1_B)FM(MSIOF3_SCK_A)        F_(0, 0)                        FM(VI4_DATA16)  FM(VI5_DATA0)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP5_19_16      FM(D1)                  FM(MSIOF2_SS2_B)FM(MSIOF3_SYNC_A)       F_(0, 0)                        FM(VI4_DATA17)  FM(VI5_DATA1)   F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_15_12      FM(D8)                  FM(LCDOUT0)     FM(MSIOF2_SCK_D)        FM(SCK4_C)                      FM(VI4_DATA0_A) F_(0, 0)        FM(DU_DR0)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_19_16      FM(D9)                  FM(LCDOUT1)     FM(MSIOF2_SYNC_D)       F_(0, 0)                        FM(VI4_DATA1_A) F_(0, 0)        FM(DU_DR1)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_23_20      FM(D10)                 FM(LCDOUT2)     FM(MSIOF2_RXD_D)        FM(HRX3_B)                      FM(VI4_DATA2_A) FM(CTS4_N_C)    FM(DU_DR2)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP6_27_24      FM(D11)                 FM(LCDOUT3)     FM(MSIOF2_TXD_D)        FM(HTX3_B)                      FM(VI4_DATA3_A) FM(RTS4_N_TANS_C)FM(DU_DR3)             F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_27_24      FM(D11)                 FM(LCDOUT3)     FM(MSIOF2_TXD_D)        FM(HTX3_B)                      FM(VI4_DATA3_A) FM(RTS4_N_C)    FM(DU_DR3)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP6_31_28      FM(D12)                 FM(LCDOUT4)     FM(MSIOF2_SS1_D)        FM(RX4_C)                       FM(VI4_DATA4_A) F_(0, 0)        FM(DU_DR4)              F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 
 /* IPSRx */            /* 0 */                 /* 1 */         /* 2 */                 /* 3 */                         /* 4 */         /* 5 */         /* 6 */                 /* 7 */         /* 8 */                 /* 9 */         /* A */         /* B */         /* C - F */
 #define IP11_31_28     FM(RX0)                 FM(HRX1_B)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SCK0_C)   FM(STP_ISCLK_0_C)       FM(RIF0_D0_B)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_3_0       FM(TX0)                 FM(HTX1_B)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC0_C)FM(STP_ISSYNC_0_C)      FM(RIF0_D1_B)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_7_4       FM(CTS0_N)              FM(HCTS1_N_B)   FM(MSIOF1_SYNC_B)       F_(0, 0)                        F_(0, 0)        FM(TS_SPSYNC1_C)FM(STP_ISSYNC_1_C)      FM(RIF1_SYNC_B) FM(AUDIO_CLKOUT_C)      FM(ADICS_SAMP)  F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP12_11_8      FM(RTS0_N_TANS)         FM(HRTS1_N_B)   FM(MSIOF1_SS1_B)        FM(AUDIO_CLKA_B)                FM(SCL2_A)      F_(0, 0)        FM(STP_IVCXO27_1_C)     FM(RIF0_SYNC_B) F_(0, 0)                FM(ADICHS1)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_11_8      FM(RTS0_N)              FM(HRTS1_N_B)   FM(MSIOF1_SS1_B)        FM(AUDIO_CLKA_B)                FM(SCL2_A)      F_(0, 0)        FM(STP_IVCXO27_1_C)     FM(RIF0_SYNC_B) F_(0, 0)                FM(ADICHS1)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_15_12     FM(RX1_A)               FM(HRX1_A)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SDAT0_C)  FM(STP_ISD_0_C)         FM(RIF1_CLK_C)  F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_19_16     FM(TX1_A)               FM(HTX1_A)      F_(0, 0)                F_(0, 0)                        F_(0, 0)        FM(TS_SDEN0_C)  FM(STP_ISEN_0_C)        FM(RIF1_D0_C)   F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_23_20     FM(CTS1_N)              FM(HCTS1_N_A)   FM(MSIOF1_RXD_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SDEN1_C)  FM(STP_ISEN_1_C)        FM(RIF1_D0_B)   F_(0, 0)                FM(ADIDATA)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
-#define IP12_27_24     FM(RTS1_N_TANS)         FM(HRTS1_N_A)   FM(MSIOF1_TXD_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SDAT1_C)  FM(STP_ISD_1_C)         FM(RIF1_D1_B)   F_(0, 0)                FM(ADICHS0)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP12_27_24     FM(RTS1_N)              FM(HRTS1_N_A)   FM(MSIOF1_TXD_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SDAT1_C)  FM(STP_ISD_1_C)         FM(RIF1_D1_B)   F_(0, 0)                FM(ADICHS0)     F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP12_31_28     FM(SCK2)                FM(SCIF_CLK_B)  FM(MSIOF1_SCK_B)        F_(0, 0)                        F_(0, 0)        FM(TS_SCK1_C)   FM(STP_ISCLK_1_C)       FM(RIF1_CLK_B)  F_(0, 0)                FM(ADICLK)      F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP13_3_0       FM(TX2_A)               F_(0, 0)        F_(0, 0)                FM(SD2_CD_B)                    FM(SCL1_A)      F_(0, 0)        FM(FMCLK_A)             FM(RIF1_D1_C)   F_(0, 0)                FM(FSO_CFE_0_N) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
 #define IP13_7_4       FM(RX2_A)               F_(0, 0)        F_(0, 0)                FM(SD2_WP_B)                    FM(SDA1_A)      F_(0, 0)        FM(FMIN_A)              FM(RIF1_SYNC_C) F_(0, 0)                FM(FSO_CFE_1_N) F_(0, 0)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
@@ -626,7 +626,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_MSEL(IP0_23_20,     AVB_AVTP_CAPTURE_A,     SEL_ETHERAVB_0),
        PINMUX_IPSR_MSEL(IP0_23_20,     MSIOF2_TXD_C,           SEL_MSIOF2_2),
-       PINMUX_IPSR_MSEL(IP0_23_20,     RTS4_N_TANS_A,          SEL_SCIF4_0),
+       PINMUX_IPSR_MSEL(IP0_23_20,     RTS4_N_A,               SEL_SCIF4_0),
 
        PINMUX_IPSR_GPSR(IP0_27_24,     IRQ0),
        PINMUX_IPSR_GPSR(IP0_27_24,     QPOLB),
@@ -654,7 +654,6 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP1_7_4,       IRQ3),
        PINMUX_IPSR_GPSR(IP1_7_4,       QSTVB_QVE),
-       PINMUX_IPSR_GPSR(IP1_7_4,       A25),
        PINMUX_IPSR_GPSR(IP1_7_4,       DU_DOTCLKOUT1),
        PINMUX_IPSR_MSEL(IP1_7_4,       VI4_DATA3_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_7_4,       PWM4_B,                 SEL_PWM4_1),
@@ -662,7 +661,6 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP1_11_8,      IRQ4),
        PINMUX_IPSR_GPSR(IP1_11_8,      QSTH_QHS),
-       PINMUX_IPSR_GPSR(IP1_11_8,      A24),
        PINMUX_IPSR_GPSR(IP1_11_8,      DU_EXHSYNC_DU_HSYNC),
        PINMUX_IPSR_MSEL(IP1_11_8,      VI4_DATA4_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_11_8,      PWM5_B,                 SEL_PWM5_1),
@@ -670,7 +668,6 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP1_15_12,     IRQ5),
        PINMUX_IPSR_GPSR(IP1_15_12,     QSTB_QHE),
-       PINMUX_IPSR_GPSR(IP1_15_12,     A23),
        PINMUX_IPSR_GPSR(IP1_15_12,     DU_EXVSYNC_DU_VSYNC),
        PINMUX_IPSR_MSEL(IP1_15_12,     VI4_DATA5_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_15_12,     PWM6_B,                 SEL_PWM6_1),
@@ -678,18 +675,15 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP1_19_16,     PWM0),
        PINMUX_IPSR_GPSR(IP1_19_16,     AVB_AVTP_PPS),
-       PINMUX_IPSR_GPSR(IP1_19_16,     A22),
        PINMUX_IPSR_MSEL(IP1_19_16,     VI4_DATA6_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_19_16,     IECLK_B,                SEL_IEBUS_1),
 
        PINMUX_IPSR_MSEL(IP1_23_20,     PWM1_A,                 SEL_PWM1_0),
-       PINMUX_IPSR_GPSR(IP1_23_20,     A21),
        PINMUX_IPSR_MSEL(IP1_23_20,     HRX3_D,                 SEL_HSCIF3_3),
        PINMUX_IPSR_MSEL(IP1_23_20,     VI4_DATA7_B,            SEL_VIN4_1),
        PINMUX_IPSR_MSEL(IP1_23_20,     IERX_B,                 SEL_IEBUS_1),
 
        PINMUX_IPSR_MSEL(IP1_27_24,     PWM2_A,                 SEL_PWM2_0),
-       PINMUX_IPSR_GPSR(IP1_27_24,     A20),
        PINMUX_IPSR_MSEL(IP1_27_24,     HTX3_D,                 SEL_HSCIF3_3),
        PINMUX_IPSR_MSEL(IP1_27_24,     IETX_B,                 SEL_IEBUS_1),
 
@@ -769,7 +763,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP3_7_4,       A10),
        PINMUX_IPSR_MSEL(IP3_7_4,       MSIOF2_RXD_A,           SEL_MSIOF2_0),
-       PINMUX_IPSR_MSEL(IP3_7_4,       RTS4_N_TANS_B,          SEL_SCIF4_1),
+       PINMUX_IPSR_MSEL(IP3_7_4,       RTS4_N_B,               SEL_SCIF4_1),
        PINMUX_IPSR_GPSR(IP3_7_4,       VI5_HSYNC_N),
 
        PINMUX_IPSR_GPSR(IP3_11_8,      A11),
@@ -872,7 +866,7 @@ static const u16 pinmux_data[] = {
 
        PINMUX_IPSR_GPSR(IP5_7_4,       WE1_N),
        PINMUX_IPSR_MSEL(IP5_7_4,       MSIOF3_SS1_D,           SEL_MSIOF3_3),
-       PINMUX_IPSR_GPSR(IP5_7_4,       RTS3_N_TANS),
+       PINMUX_IPSR_GPSR(IP5_7_4,       RTS3_N),
        PINMUX_IPSR_GPSR(IP5_7_4,       HRTS3_N),
        PINMUX_IPSR_MSEL(IP5_7_4,       SDA6_B,                 SEL_I2C6_1),
        PINMUX_IPSR_GPSR(IP5_7_4,       CAN1_RX),
@@ -953,7 +947,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP6_27_24,     MSIOF2_TXD_D,           SEL_MSIOF2_3),
        PINMUX_IPSR_MSEL(IP6_27_24,     HTX3_B,                 SEL_HSCIF3_1),
        PINMUX_IPSR_MSEL(IP6_27_24,     VI4_DATA3_A,            SEL_VIN4_0),
-       PINMUX_IPSR_MSEL(IP6_27_24,     RTS4_N_TANS_C,          SEL_SCIF4_2),
+       PINMUX_IPSR_MSEL(IP6_27_24,     RTS4_N_C,               SEL_SCIF4_2),
        PINMUX_IPSR_GPSR(IP6_27_24,     DU_DR3),
 
        PINMUX_IPSR_GPSR(IP6_31_28,     D12),
@@ -1161,7 +1155,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_GPSR(IP12_7_4,      AUDIO_CLKOUT_C),
        PINMUX_IPSR_GPSR(IP12_7_4,      ADICS_SAMP),
 
-       PINMUX_IPSR_GPSR(IP12_11_8,     RTS0_N_TANS),
+       PINMUX_IPSR_GPSR(IP12_11_8,     RTS0_N),
        PINMUX_IPSR_MSEL(IP12_11_8,     HRTS1_N_B,              SEL_HSCIF1_1),
        PINMUX_IPSR_MSEL(IP12_11_8,     MSIOF1_SS1_B,           SEL_MSIOF1_1),
        PINMUX_IPSR_MSEL(IP12_11_8,     AUDIO_CLKA_B,           SEL_ADG_A_1),
@@ -1190,7 +1184,7 @@ static const u16 pinmux_data[] = {
        PINMUX_IPSR_MSEL(IP12_23_20,    RIF1_D0_B,              SEL_DRIF1_1),
        PINMUX_IPSR_GPSR(IP12_23_20,    ADIDATA),
 
-       PINMUX_IPSR_GPSR(IP12_27_24,    RTS1_N_TANS),
+       PINMUX_IPSR_GPSR(IP12_27_24,    RTS1_N),
        PINMUX_IPSR_MSEL(IP12_27_24,    HRTS1_N_A,              SEL_HSCIF1_0),
        PINMUX_IPSR_MSEL(IP12_27_24,    MSIOF1_TXD_B,           SEL_MSIOF1_1),
        PINMUX_IPSR_MSEL(IP12_27_24,    TS_SDAT1_C,             SEL_TSIF1_2),
@@ -3255,7 +3249,7 @@ static const unsigned int scif0_ctrl_pins[] = {
        RCAR_GP_PIN(5, 4), RCAR_GP_PIN(5, 3),
 };
 static const unsigned int scif0_ctrl_mux[] = {
-       RTS0_N_TANS_MARK, CTS0_N_MARK,
+       RTS0_N_MARK, CTS0_N_MARK,
 };
 /* - SCIF1 ------------------------------------------------------------------ */
 static const unsigned int scif1_data_a_pins[] = {
@@ -3277,7 +3271,7 @@ static const unsigned int scif1_ctrl_pins[] = {
        RCAR_GP_PIN(5, 8), RCAR_GP_PIN(5, 7),
 };
 static const unsigned int scif1_ctrl_mux[] = {
-       RTS1_N_TANS_MARK, CTS1_N_MARK,
+       RTS1_N_MARK, CTS1_N_MARK,
 };
 
 static const unsigned int scif1_data_b_pins[] = {
@@ -3329,7 +3323,7 @@ static const unsigned int scif3_ctrl_pins[] = {
        RCAR_GP_PIN(1, 26), RCAR_GP_PIN(1, 25),
 };
 static const unsigned int scif3_ctrl_mux[] = {
-       RTS3_N_TANS_MARK, CTS3_N_MARK,
+       RTS3_N_MARK, CTS3_N_MARK,
 };
 static const unsigned int scif3_data_b_pins[] = {
        /* RX, TX */
@@ -3358,7 +3352,7 @@ static const unsigned int scif4_ctrl_a_pins[] = {
        RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 13),
 };
 static const unsigned int scif4_ctrl_a_mux[] = {
-       RTS4_N_TANS_A_MARK, CTS4_N_A_MARK,
+       RTS4_N_A_MARK, CTS4_N_A_MARK,
 };
 static const unsigned int scif4_data_b_pins[] = {
        /* RX, TX */
@@ -3379,7 +3373,7 @@ static const unsigned int scif4_ctrl_b_pins[] = {
        RCAR_GP_PIN(1, 10), RCAR_GP_PIN(1, 9),
 };
 static const unsigned int scif4_ctrl_b_mux[] = {
-       RTS4_N_TANS_B_MARK, CTS4_N_B_MARK,
+       RTS4_N_B_MARK, CTS4_N_B_MARK,
 };
 static const unsigned int scif4_data_c_pins[] = {
        /* RX, TX */
@@ -3400,7 +3394,7 @@ static const unsigned int scif4_ctrl_c_pins[] = {
        RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
 };
 static const unsigned int scif4_ctrl_c_mux[] = {
-       RTS4_N_TANS_C_MARK, CTS4_N_C_MARK,
+       RTS4_N_C_MARK, CTS4_N_C_MARK,
 };
 /* - SCIF5 ------------------------------------------------------------------ */
 static const unsigned int scif5_data_a_pins[] = {
@@ -5406,11 +5400,11 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
                { RCAR_GP_PIN(5,  3),  0, 3 },  /* CTS0 */
        } },
        { PINMUX_DRIVE_REG("DRVCTRL18", 0xe6060348) {
-               { RCAR_GP_PIN(5,  4), 28, 3 },  /* RTS0_TANS */
+               { RCAR_GP_PIN(5,  4), 28, 3 },  /* RTS0 */
                { RCAR_GP_PIN(5,  5), 24, 3 },  /* RX1 */
                { RCAR_GP_PIN(5,  6), 20, 3 },  /* TX1 */
                { RCAR_GP_PIN(5,  7), 16, 3 },  /* CTS1 */
-               { RCAR_GP_PIN(5,  8), 12, 3 },  /* RTS1_TANS */
+               { RCAR_GP_PIN(5,  8), 12, 3 },  /* RTS1 */
                { RCAR_GP_PIN(5,  9),  8, 3 },  /* SCK2 */
                { RCAR_GP_PIN(5, 10),  4, 3 },  /* TX2 */
                { RCAR_GP_PIN(5, 11),  0, 3 },  /* RX2 */
@@ -5655,11 +5649,11 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
                [13] = RCAR_GP_PIN(5,  1),      /* RX0 */
                [14] = RCAR_GP_PIN(5,  2),      /* TX0 */
                [15] = RCAR_GP_PIN(5,  3),      /* CTS0_N */
-               [16] = RCAR_GP_PIN(5,  4),      /* RTS0_N_TANS */
+               [16] = RCAR_GP_PIN(5,  4),      /* RTS0_N */
                [17] = RCAR_GP_PIN(5,  5),      /* RX1_A */
                [18] = RCAR_GP_PIN(5,  6),      /* TX1_A */
                [19] = RCAR_GP_PIN(5,  7),      /* CTS1_N */
-               [20] = RCAR_GP_PIN(5,  8),      /* RTS1_N_TANS */
+               [20] = RCAR_GP_PIN(5,  8),      /* RTS1_N */
                [21] = RCAR_GP_PIN(5,  9),      /* SCK2 */
                [22] = RCAR_GP_PIN(5, 10),      /* TX2_A */
                [23] = RCAR_GP_PIN(5, 11),      /* RX2_A */
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a77970.c b/drivers/pinctrl/sh-pfc/pfc-r8a77970.c
new file mode 100644 (file)
index 0000000..794f12d
--- /dev/null
@@ -0,0 +1,2329 @@
+/*
+ * R8A77970 processor support - PFC hardware block.
+ *
+ * Copyright (C) 2016 Renesas Electronics Corp.
+ * Copyright (C) 2017 Cogent Embedded, Inc. <source@cogentembedded.com>
+ *
+ * This file is based on the drivers/pinctrl/sh-pfc/pfc-r8a7795.c
+ *
+ * R-Car Gen3 processor support - PFC hardware block.
+ *
+ * Copyright (C) 2015  Renesas Electronics Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ */
+
+#include <linux/io.h>
+#include <linux/kernel.h>
+
+#include "core.h"
+#include "sh_pfc.h"
+
+#define CPU_ALL_PORT(fn, sfx)                                          \
+       PORT_GP_CFG_22(0, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),      \
+       PORT_GP_CFG_28(1, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),      \
+       PORT_GP_CFG_17(2, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),      \
+       PORT_GP_CFG_17(3, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),      \
+       PORT_GP_CFG_6(4, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH),       \
+       PORT_GP_CFG_15(5, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH)
+/*
+ * F_() : just information
+ * FM() : macro for FN_xxx / xxx_MARK
+ */
+
+/* GPSR0 */
+#define GPSR0_21       F_(DU_EXODDF_DU_ODDF_DISP_CDE,  IP2_23_20)
+#define GPSR0_20       F_(DU_EXVSYNC_DU_VSYNC,         IP2_19_16)
+#define GPSR0_19       F_(DU_EXHSYNC_DU_HSYNC,         IP2_15_12)
+#define GPSR0_18       F_(DU_DOTCLKOUT,                IP2_11_8)
+#define GPSR0_17       F_(DU_DB7,                      IP2_7_4)
+#define GPSR0_16       F_(DU_DB6,                      IP2_3_0)
+#define GPSR0_15       F_(DU_DB5,                      IP1_31_28)
+#define GPSR0_14       F_(DU_DB4,                      IP1_27_24)
+#define GPSR0_13       F_(DU_DB3,                      IP1_23_20)
+#define GPSR0_12       F_(DU_DB2,                      IP1_19_16)
+#define GPSR0_11       F_(DU_DG7,                      IP1_15_12)
+#define GPSR0_10       F_(DU_DG6,                      IP1_11_8)
+#define GPSR0_9                F_(DU_DG5,                      IP1_7_4)
+#define GPSR0_8                F_(DU_DG4,                      IP1_3_0)
+#define GPSR0_7                F_(DU_DG3,                      IP0_31_28)
+#define GPSR0_6                F_(DU_DG2,                      IP0_27_24)
+#define GPSR0_5                F_(DU_DR7,                      IP0_23_20)
+#define GPSR0_4                F_(DU_DR6,                      IP0_19_16)
+#define GPSR0_3                F_(DU_DR5,                      IP0_15_12)
+#define GPSR0_2                F_(DU_DR4,                      IP0_11_8)
+#define GPSR0_1                F_(DU_DR3,                      IP0_7_4)
+#define GPSR0_0                F_(DU_DR2,                      IP0_3_0)
+
+/* GPSR1 */
+#define GPSR1_27       F_(DIGRF_CLKOUT,        IP8_27_24)
+#define GPSR1_26       F_(DIGRF_CLKIN,         IP8_23_20)
+#define GPSR1_25       F_(CANFD_CLK_A,         IP8_19_16)
+#define GPSR1_24       F_(CANFD1_RX,           IP8_15_12)
+#define GPSR1_23       F_(CANFD1_TX,           IP8_11_8)
+#define GPSR1_22       F_(CANFD0_RX_A,         IP8_7_4)
+#define GPSR1_21       F_(CANFD0_TX_A,         IP8_3_0)
+#define GPSR1_20       F_(AVB0_AVTP_CAPTURE,   IP7_31_28)
+#define GPSR1_19       FM(AVB0_AVTP_MATCH)
+#define GPSR1_18       FM(AVB0_LINK)
+#define GPSR1_17       FM(AVB0_PHY_INT)
+#define GPSR1_16       FM(AVB0_MAGIC)
+#define GPSR1_15       FM(AVB0_MDC)
+#define GPSR1_14       FM(AVB0_MDIO)
+#define GPSR1_13       FM(AVB0_TXCREFCLK)
+#define GPSR1_12       FM(AVB0_TD3)
+#define GPSR1_11       FM(AVB0_TD2)
+#define GPSR1_10       FM(AVB0_TD1)
+#define GPSR1_9                FM(AVB0_TD0)
+#define GPSR1_8                FM(AVB0_TXC)
+#define GPSR1_7                FM(AVB0_TX_CTL)
+#define GPSR1_6                FM(AVB0_RD3)
+#define GPSR1_5                FM(AVB0_RD2)
+#define GPSR1_4                FM(AVB0_RD1)
+#define GPSR1_3                FM(AVB0_RD0)
+#define GPSR1_2                FM(AVB0_RXC)
+#define GPSR1_1                FM(AVB0_RX_CTL)
+#define GPSR1_0                F_(IRQ0,                IP2_27_24)
+
+/* GPSR2 */
+#define GPSR2_16       F_(VI0_FIELD,           IP4_31_28)
+#define GPSR2_15       F_(VI0_DATA11,          IP4_27_24)
+#define GPSR2_14       F_(VI0_DATA10,          IP4_23_20)
+#define GPSR2_13       F_(VI0_DATA9,           IP4_19_16)
+#define GPSR2_12       F_(VI0_DATA8,           IP4_15_12)
+#define GPSR2_11       F_(VI0_DATA7,           IP4_11_8)
+#define GPSR2_10       F_(VI0_DATA6,           IP4_7_4)
+#define GPSR2_9                F_(VI0_DATA5,           IP4_3_0)
+#define GPSR2_8                F_(VI0_DATA4,           IP3_31_28)
+#define GPSR2_7                F_(VI0_DATA3,           IP3_27_24)
+#define GPSR2_6                F_(VI0_DATA2,           IP3_23_20)
+#define GPSR2_5                F_(VI0_DATA1,           IP3_19_16)
+#define GPSR2_4                F_(VI0_DATA0,           IP3_15_12)
+#define GPSR2_3                F_(VI0_VSYNC_N,         IP3_11_8)
+#define GPSR2_2                F_(VI0_HSYNC_N,         IP3_7_4)
+#define GPSR2_1                F_(VI0_CLKENB,          IP3_3_0)
+#define GPSR2_0                F_(VI0_CLK,             IP2_31_28)
+
+/* GPSR3 */
+#define GPSR3_16       F_(VI1_FIELD,           IP7_3_0)
+#define GPSR3_15       F_(VI1_DATA11,          IP6_31_28)
+#define GPSR3_14       F_(VI1_DATA10,          IP6_27_24)
+#define GPSR3_13       F_(VI1_DATA9,           IP6_23_20)
+#define GPSR3_12       F_(VI1_DATA8,           IP6_19_16)
+#define GPSR3_11       F_(VI1_DATA7,           IP6_15_12)
+#define GPSR3_10       F_(VI1_DATA6,           IP6_11_8)
+#define GPSR3_9                F_(VI1_DATA5,           IP6_7_4)
+#define GPSR3_8                F_(VI1_DATA4,           IP6_3_0)
+#define GPSR3_7                F_(VI1_DATA3,           IP5_31_28)
+#define GPSR3_6                F_(VI1_DATA2,           IP5_27_24)
+#define GPSR3_5                F_(VI1_DATA1,           IP5_23_20)
+#define GPSR3_4                F_(VI1_DATA0,           IP5_19_16)
+#define GPSR3_3                F_(VI1_VSYNC_N,         IP5_15_12)
+#define GPSR3_2                F_(VI1_HSYNC_N,         IP5_11_8)
+#define GPSR3_1                F_(VI1_CLKENB,          IP5_7_4)
+#define GPSR3_0                F_(VI1_CLK,             IP5_3_0)
+
+/* GPSR4 */
+#define GPSR4_5                F_(SDA2,                IP7_27_24)
+#define GPSR4_4                F_(SCL2,                IP7_23_20)
+#define GPSR4_3                F_(SDA1,                IP7_19_16)
+#define GPSR4_2                F_(SCL1,                IP7_15_12)
+#define GPSR4_1                F_(SDA0,                IP7_11_8)
+#define GPSR4_0                F_(SCL0,                IP7_7_4)
+
+/* GPSR5 */
+#define GPSR5_14       FM(RPC_INT_N)
+#define GPSR5_13       FM(RPC_WP_N)
+#define GPSR5_12       FM(RPC_RESET_N)
+#define GPSR5_11       FM(QSPI1_SSL)
+#define GPSR5_10       FM(QSPI1_IO3)
+#define GPSR5_9                FM(QSPI1_IO2)
+#define GPSR5_8                FM(QSPI1_MISO_IO1)
+#define GPSR5_7                FM(QSPI1_MOSI_IO0)
+#define GPSR5_6                FM(QSPI1_SPCLK)
+#define GPSR5_5                FM(QSPI0_SSL)
+#define GPSR5_4                FM(QSPI0_IO3)
+#define GPSR5_3                FM(QSPI0_IO2)
+#define GPSR5_2                FM(QSPI0_MISO_IO1)
+#define GPSR5_1                FM(QSPI0_MOSI_IO0)
+#define GPSR5_0                FM(QSPI0_SPCLK)
+
+
+/* IPSRx */            /* 0 */                         /* 1 */                 /* 2 */         /* 3 */         /* 4 */                 /* 5 */         /* 6 - F */
+#define IP0_3_0                FM(DU_DR2)                      FM(HSCK0)               F_(0, 0)        FM(A0)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_7_4                FM(DU_DR3)                      FM(HRTS0_N)             F_(0, 0)        FM(A1)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_11_8       FM(DU_DR4)                      FM(HCTS0_N)             F_(0, 0)        FM(A2)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_15_12      FM(DU_DR5)                      FM(HTX0)                F_(0, 0)        FM(A3)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_19_16      FM(DU_DR6)                      FM(MSIOF3_RXD)          F_(0, 0)        FM(A4)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_23_20      FM(DU_DR7)                      FM(MSIOF3_TXD)          F_(0, 0)        FM(A5)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_27_24      FM(DU_DG2)                      FM(MSIOF3_SS1)          F_(0, 0)        FM(A6)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP0_31_28      FM(DU_DG3)                      FM(MSIOF3_SS2)          F_(0, 0)        FM(A7)          FM(PWMFSW0)             F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_3_0                FM(DU_DG4)                      F_(0, 0)                F_(0, 0)        FM(A8)          FM(FSO_CFE_0_N_A)       F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_7_4                FM(DU_DG5)                      F_(0, 0)                F_(0, 0)        FM(A9)          FM(FSO_CFE_1_N_A)       F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_11_8       FM(DU_DG6)                      F_(0, 0)                F_(0, 0)        FM(A10)         FM(FSO_TOE_N_A)         F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_15_12      FM(DU_DG7)                      F_(0, 0)                F_(0, 0)        FM(A11)         FM(IRQ1)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_19_16      FM(DU_DB2)                      F_(0, 0)                F_(0, 0)        FM(A12)         FM(IRQ2)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_23_20      FM(DU_DB3)                      F_(0, 0)                F_(0, 0)        FM(A13)         FM(FXR_CLKOUT1)         F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_27_24      FM(DU_DB4)                      F_(0, 0)                F_(0, 0)        FM(A14)         FM(FXR_CLKOUT2)         F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP1_31_28      FM(DU_DB5)                      F_(0, 0)                F_(0, 0)        FM(A15)         FM(FXR_TXENA_N)         F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_3_0                FM(DU_DB6)                      F_(0, 0)                F_(0, 0)        FM(A16)         FM(FXR_TXENB_N)         F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_7_4                FM(DU_DB7)                      F_(0, 0)                F_(0, 0)        FM(A17)         F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_11_8       FM(DU_DOTCLKOUT)                FM(SCIF_CLK_A)          F_(0, 0)        FM(A18)         F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_15_12      FM(DU_EXHSYNC_DU_HSYNC)         FM(HRX0)                F_(0, 0)        FM(A19)         FM(IRQ3)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_19_16      FM(DU_EXVSYNC_DU_VSYNC)         FM(MSIOF3_SCK)          F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_23_20      FM(DU_EXODDF_DU_ODDF_DISP_CDE)  FM(MSIOF3_SYNC)         F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_27_24      FM(IRQ0)                        FM(CC5_OSCOUT)          F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP2_31_28      FM(VI0_CLK)                     FM(MSIOF2_SCK)          FM(SCK3)        F_(0, 0)        FM(HSCK3)               F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_3_0                FM(VI0_CLKENB)                  FM(MSIOF2_RXD)          FM(RX3)         FM(RD_WR_N)     FM(HCTS3_N)             F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_7_4                FM(VI0_HSYNC_N)                 FM(MSIOF2_TXD)          FM(TX3)         F_(0, 0)        FM(HRTS3_N)             F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_11_8       FM(VI0_VSYNC_N)                 FM(MSIOF2_SYNC)         FM(CTS3_N)      F_(0, 0)        FM(HTX3)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_15_12      FM(VI0_DATA0)                   FM(MSIOF2_SS1)          FM(RTS3_N_TANS) F_(0, 0)        FM(HRX3)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_19_16      FM(VI0_DATA1)                   FM(MSIOF2_SS2)          FM(SCK1)        F_(0, 0)        FM(SPEEDIN_A)           F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_23_20      FM(VI0_DATA2)                   FM(AVB0_AVTP_PPS)       FM(SDA3_A)      F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_27_24      FM(VI0_DATA3)                   FM(HSCK1)               FM(SCL3_A)      F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP3_31_28      FM(VI0_DATA4)                   FM(HRTS1_N)             FM(RX1_A)       F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_3_0                FM(VI0_DATA5)                   FM(HCTS1_N)             FM(TX1_A)       F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_7_4                FM(VI0_DATA6)                   FM(HTX1)                FM(CTS1_N)      F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_11_8       FM(VI0_DATA7)                   FM(HRX1)                FM(RTS1_N_TANS) F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_15_12      FM(VI0_DATA8)                   FM(HSCK2)               FM(PWM0_A)      FM(A22)         F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_19_16      FM(VI0_DATA9)                   FM(HCTS2_N)             FM(PWM1_A)      FM(A23)         FM(FSO_CFE_0_N_B)       F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_23_20      FM(VI0_DATA10)                  FM(HRTS2_N)             FM(PWM2_A)      FM(A24)         FM(FSO_CFE_1_N_B)       F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_27_24      FM(VI0_DATA11)                  FM(HTX2)                FM(PWM3_A)      FM(A25)         FM(FSO_TOE_N_B)         F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP4_31_28      FM(VI0_FIELD)                   FM(HRX2)                FM(PWM4_A)      FM(CS1_N)       FM(FSCLKST2_N_A)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_3_0                FM(VI1_CLK)                     FM(MSIOF1_RXD)          F_(0, 0)        FM(CS0_N)       F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_7_4                FM(VI1_CLKENB)                  FM(MSIOF1_TXD)          F_(0, 0)        FM(D0)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_11_8       FM(VI1_HSYNC_N)                 FM(MSIOF1_SCK)          F_(0, 0)        FM(D1)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_15_12      FM(VI1_VSYNC_N)                 FM(MSIOF1_SYNC)         F_(0, 0)        FM(D2)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_19_16      FM(VI1_DATA0)                   FM(MSIOF1_SS1)          F_(0, 0)        FM(D3)          F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_23_20      FM(VI1_DATA1)                   FM(MSIOF1_SS2)          F_(0, 0)        FM(D4)          FM(MMC_CMD)             F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_27_24      FM(VI1_DATA2)                   FM(CANFD0_TX_B)         F_(0, 0)        FM(D5)          FM(MMC_D0)              F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP5_31_28      FM(VI1_DATA3)                   FM(CANFD0_RX_B)         F_(0, 0)        FM(D6)          FM(MMC_D1)              F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_3_0                FM(VI1_DATA4)                   FM(CANFD_CLK_B)         F_(0, 0)        FM(D7)          FM(MMC_D2)              F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_7_4                FM(VI1_DATA5)                   F_(0,0)                 FM(SCK4)        FM(D8)          FM(MMC_D3)              F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_11_8       FM(VI1_DATA6)                   F_(0,0)                 FM(RX4)         FM(D9)          FM(MMC_CLK)             F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_15_12      FM(VI1_DATA7)                   F_(0,0)                 FM(TX4)         FM(D10)         FM(MMC_D4)              F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_19_16      FM(VI1_DATA8)                   F_(0,0)                 FM(CTS4_N)      FM(D11)         FM(MMC_D5)              F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_23_20      FM(VI1_DATA9)                   F_(0,0)                 FM(RTS4_N_TANS) FM(D12)         FM(MMC_D6)              FM(SCL3_B)      F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_27_24      FM(VI1_DATA10)                  F_(0,0)                 F_(0, 0)        FM(D13)         FM(MMC_D7)              FM(SDA3_B)      F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP6_31_28      FM(VI1_DATA11)                  FM(SCL4)                FM(IRQ4)        FM(D14)         FM(MMC_WP)              F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_3_0                FM(VI1_FIELD)                   FM(SDA4)                FM(IRQ5)        FM(D15)         FM(MMC_CD)              F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_7_4                FM(SCL0)                        FM(DU_DR0)              FM(TPU0TO0)     FM(CLKOUT)      F_(0, 0)                FM(MSIOF0_RXD)  F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_11_8       FM(SDA0)                        FM(DU_DR1)              FM(TPU0TO1)     FM(BS_N)        FM(SCK0)                FM(MSIOF0_TXD)  F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_15_12      FM(SCL1)                        FM(DU_DG0)              FM(TPU0TO2)     FM(RD_N)        FM(CTS0_N)              FM(MSIOF0_SCK)  F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_19_16      FM(SDA1)                        FM(DU_DG1)              FM(TPU0TO3)     FM(WE0_N)       FM(RTS0_N_TANS)         FM(MSIOF0_SYNC) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_23_20      FM(SCL2)                        FM(DU_DB0)              FM(TCLK1_A)     FM(WE1_N)       FM(RX0)                 FM(MSIOF0_SS1)  F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_27_24      FM(SDA2)                        FM(DU_DB1)              FM(TCLK2_A)     FM(EX_WAIT0)    FM(TX0)                 FM(MSIOF0_SS2)  F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP7_31_28      FM(AVB0_AVTP_CAPTURE)           F_(0, 0)                F_(0, 0)        F_(0, 0)        FM(FSCLKST2_N_B)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_3_0                FM(CANFD0_TX_A)                 FM(FXR_TXDA)            FM(PWM0_B)      FM(DU_DISP)     FM(FSCLKST2_N_C)        F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_7_4                FM(CANFD0_RX_A)                 FM(RXDA_EXTFXR)         FM(PWM1_B)      FM(DU_CDE)      F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_11_8       FM(CANFD1_TX)                   FM(FXR_TXDB)            FM(PWM2_B)      FM(TCLK1_B)     FM(TX1_B)               F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_15_12      FM(CANFD1_RX)                   FM(RXDB_EXTFXR)         FM(PWM3_B)      FM(TCLK2_B)     FM(RX1_B)               F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_19_16      FM(CANFD_CLK_A)                 FM(CLK_EXTFXR)          FM(PWM4_B)      FM(SPEEDIN_B)   FM(SCIF_CLK_B)          F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_23_20      FM(DIGRF_CLKIN)                 FM(DIGRF_CLKEN_IN)      F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_27_24      FM(DIGRF_CLKOUT)                FM(DIGRF_CLKEN_OUT)     F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
+#define IP8_31_28      F_(0, 0)                        F_(0, 0)                F_(0, 0)        F_(0, 0)        F_(0, 0)                F_(0, 0)        F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)  F_(0, 0) F_(0, 0) F_(0, 0)
+
+#define PINMUX_GPSR    \
+\
+               GPSR1_27 \
+               GPSR1_26 \
+               GPSR1_25 \
+               GPSR1_24 \
+               GPSR1_23 \
+               GPSR1_22 \
+GPSR0_21       GPSR1_21 \
+GPSR0_20       GPSR1_20 \
+GPSR0_19       GPSR1_19 \
+GPSR0_18       GPSR1_18 \
+GPSR0_17       GPSR1_17 \
+GPSR0_16       GPSR1_16        GPSR2_16        GPSR3_16 \
+GPSR0_15       GPSR1_15        GPSR2_15        GPSR3_15 \
+GPSR0_14       GPSR1_14        GPSR2_14        GPSR3_14                        GPSR5_14 \
+GPSR0_13       GPSR1_13        GPSR2_13        GPSR3_13                        GPSR5_13 \
+GPSR0_12       GPSR1_12        GPSR2_12        GPSR3_12                        GPSR5_12 \
+GPSR0_11       GPSR1_11        GPSR2_11        GPSR3_11                        GPSR5_11 \
+GPSR0_10       GPSR1_10        GPSR2_10        GPSR3_10                        GPSR5_10 \
+GPSR0_9                GPSR1_9         GPSR2_9         GPSR3_9                         GPSR5_9 \
+GPSR0_8                GPSR1_8         GPSR2_8         GPSR3_8                         GPSR5_8 \
+GPSR0_7                GPSR1_7         GPSR2_7         GPSR3_7                         GPSR5_7 \
+GPSR0_6                GPSR1_6         GPSR2_6         GPSR3_6                         GPSR5_6 \
+GPSR0_5                GPSR1_5         GPSR2_5         GPSR3_5         GPSR4_5         GPSR5_5 \
+GPSR0_4                GPSR1_4         GPSR2_4         GPSR3_4         GPSR4_4         GPSR5_4 \
+GPSR0_3                GPSR1_3         GPSR2_3         GPSR3_3         GPSR4_3         GPSR5_3 \
+GPSR0_2                GPSR1_2         GPSR2_2         GPSR3_2         GPSR4_2         GPSR5_2 \
+GPSR0_1                GPSR1_1         GPSR2_1         GPSR3_1         GPSR4_1         GPSR5_1 \
+GPSR0_0                GPSR1_0         GPSR2_0         GPSR3_0         GPSR4_0         GPSR5_0
+
+#define PINMUX_IPSR    \
+\
+FM(IP0_3_0)    IP0_3_0         FM(IP1_3_0)     IP1_3_0         FM(IP2_3_0)     IP2_3_0         FM(IP3_3_0)     IP3_3_0 \
+FM(IP0_7_4)    IP0_7_4         FM(IP1_7_4)     IP1_7_4         FM(IP2_7_4)     IP2_7_4         FM(IP3_7_4)     IP3_7_4 \
+FM(IP0_11_8)   IP0_11_8        FM(IP1_11_8)    IP1_11_8        FM(IP2_11_8)    IP2_11_8        FM(IP3_11_8)    IP3_11_8 \
+FM(IP0_15_12)  IP0_15_12       FM(IP1_15_12)   IP1_15_12       FM(IP2_15_12)   IP2_15_12       FM(IP3_15_12)   IP3_15_12 \
+FM(IP0_19_16)  IP0_19_16       FM(IP1_19_16)   IP1_19_16       FM(IP2_19_16)   IP2_19_16       FM(IP3_19_16)   IP3_19_16 \
+FM(IP0_23_20)  IP0_23_20       FM(IP1_23_20)   IP1_23_20       FM(IP2_23_20)   IP2_23_20       FM(IP3_23_20)   IP3_23_20 \
+FM(IP0_27_24)  IP0_27_24       FM(IP1_27_24)   IP1_27_24       FM(IP2_27_24)   IP2_27_24       FM(IP3_27_24)   IP3_27_24 \
+FM(IP0_31_28)  IP0_31_28       FM(IP1_31_28)   IP1_31_28       FM(IP2_31_28)   IP2_31_28       FM(IP3_31_28)   IP3_31_28 \
+\
+FM(IP4_3_0)    IP4_3_0         FM(IP5_3_0)     IP5_3_0         FM(IP6_3_0)     IP6_3_0         FM(IP7_3_0)     IP7_3_0 \
+FM(IP4_7_4)    IP4_7_4         FM(IP5_7_4)     IP5_7_4         FM(IP6_7_4)     IP6_7_4         FM(IP7_7_4)     IP7_7_4 \
+FM(IP4_11_8)   IP4_11_8        FM(IP5_11_8)    IP5_11_8        FM(IP6_11_8)    IP6_11_8        FM(IP7_11_8)    IP7_11_8 \
+FM(IP4_15_12)  IP4_15_12       FM(IP5_15_12)   IP5_15_12       FM(IP6_15_12)   IP6_15_12       FM(IP7_15_12)   IP7_15_12 \
+FM(IP4_19_16)  IP4_19_16       FM(IP5_19_16)   IP5_19_16       FM(IP6_19_16)   IP6_19_16       FM(IP7_19_16)   IP7_19_16 \
+FM(IP4_23_20)  IP4_23_20       FM(IP5_23_20)   IP5_23_20       FM(IP6_23_20)   IP6_23_20       FM(IP7_23_20)   IP7_23_20 \
+FM(IP4_27_24)  IP4_27_24       FM(IP5_27_24)   IP5_27_24       FM(IP6_27_24)   IP6_27_24       FM(IP7_27_24)   IP7_27_24 \
+FM(IP4_31_28)  IP4_31_28       FM(IP5_31_28)   IP5_31_28       FM(IP6_31_28)   IP6_31_28       FM(IP7_31_28)   IP7_31_28 \
+\
+FM(IP8_3_0)    IP8_3_0 \
+FM(IP8_7_4)    IP8_7_4 \
+FM(IP8_11_8)   IP8_11_8 \
+FM(IP8_15_12)  IP8_15_12 \
+FM(IP8_19_16)  IP8_19_16 \
+FM(IP8_23_20)  IP8_23_20 \
+FM(IP8_27_24)  IP8_27_24 \
+FM(IP8_31_28)  IP8_31_28
+
+/* MOD_SEL0 */         /* 0 */                 /* 1 */
+#define MOD_SEL0_11    FM(SEL_I2C3_0)          FM(SEL_I2C3_1)
+#define MOD_SEL0_10    FM(SEL_HSCIF0_0)        FM(SEL_HSCIF0_1)
+#define MOD_SEL0_9     FM(SEL_SCIF1_0)         FM(SEL_SCIF1_1)
+#define MOD_SEL0_8     FM(SEL_CANFD0_0)        FM(SEL_CANFD0_1)
+#define MOD_SEL0_7     FM(SEL_PWM4_0)          FM(SEL_PWM4_1)
+#define MOD_SEL0_6     FM(SEL_PWM3_0)          FM(SEL_PWM3_1)
+#define MOD_SEL0_5     FM(SEL_PWM2_0)          FM(SEL_PWM2_1)
+#define MOD_SEL0_4     FM(SEL_PWM1_0)          FM(SEL_PWM1_1)
+#define MOD_SEL0_3     FM(SEL_PWM0_0)          FM(SEL_PWM0_1)
+#define MOD_SEL0_2     FM(SEL_RFSO_0)          FM(SEL_RFSO_1)
+#define MOD_SEL0_1     FM(SEL_RSP_0)           FM(SEL_RSP_1)
+#define MOD_SEL0_0     FM(SEL_TMU_0)           FM(SEL_TMU_1)
+
+#define PINMUX_MOD_SELS \
+\
+MOD_SEL0_11 \
+MOD_SEL0_10 \
+MOD_SEL0_9 \
+MOD_SEL0_8 \
+MOD_SEL0_7 \
+MOD_SEL0_6 \
+MOD_SEL0_5 \
+MOD_SEL0_4 \
+MOD_SEL0_3 \
+MOD_SEL0_2 \
+MOD_SEL0_1 \
+MOD_SEL0_0
+
+enum {
+       PINMUX_RESERVED = 0,
+
+       PINMUX_DATA_BEGIN,
+       GP_ALL(DATA),
+       PINMUX_DATA_END,
+
+#define F_(x, y)
+#define FM(x)   FN_##x,
+       PINMUX_FUNCTION_BEGIN,
+       GP_ALL(FN),
+       PINMUX_GPSR
+       PINMUX_IPSR
+       PINMUX_MOD_SELS
+       PINMUX_FUNCTION_END,
+#undef F_
+#undef FM
+
+#define F_(x, y)
+#define FM(x)  x##_MARK,
+       PINMUX_MARK_BEGIN,
+       PINMUX_GPSR
+       PINMUX_IPSR
+       PINMUX_MOD_SELS
+       PINMUX_MARK_END,
+#undef F_
+#undef FM
+};
+
+static const u16 pinmux_data[] = {
+       PINMUX_DATA_GP_ALL(),
+
+       PINMUX_SINGLE(AVB0_RX_CTL),
+       PINMUX_SINGLE(AVB0_RXC),
+       PINMUX_SINGLE(AVB0_RD0),
+       PINMUX_SINGLE(AVB0_RD1),
+       PINMUX_SINGLE(AVB0_RD2),
+       PINMUX_SINGLE(AVB0_RD3),
+       PINMUX_SINGLE(AVB0_TX_CTL),
+       PINMUX_SINGLE(AVB0_TXC),
+       PINMUX_SINGLE(AVB0_TD0),
+       PINMUX_SINGLE(AVB0_TD1),
+       PINMUX_SINGLE(AVB0_TD2),
+       PINMUX_SINGLE(AVB0_TD3),
+       PINMUX_SINGLE(AVB0_TXCREFCLK),
+       PINMUX_SINGLE(AVB0_MDIO),
+       PINMUX_SINGLE(AVB0_MDC),
+       PINMUX_SINGLE(AVB0_MAGIC),
+       PINMUX_SINGLE(AVB0_PHY_INT),
+       PINMUX_SINGLE(AVB0_LINK),
+       PINMUX_SINGLE(AVB0_AVTP_MATCH),
+
+       PINMUX_SINGLE(QSPI0_SPCLK),
+       PINMUX_SINGLE(QSPI0_MOSI_IO0),
+       PINMUX_SINGLE(QSPI0_MISO_IO1),
+       PINMUX_SINGLE(QSPI0_IO2),
+       PINMUX_SINGLE(QSPI0_IO3),
+       PINMUX_SINGLE(QSPI0_SSL),
+       PINMUX_SINGLE(QSPI1_SPCLK),
+       PINMUX_SINGLE(QSPI1_MOSI_IO0),
+       PINMUX_SINGLE(QSPI1_MISO_IO1),
+       PINMUX_SINGLE(QSPI1_IO2),
+       PINMUX_SINGLE(QSPI1_IO3),
+       PINMUX_SINGLE(QSPI1_SSL),
+       PINMUX_SINGLE(RPC_RESET_N),
+       PINMUX_SINGLE(RPC_WP_N),
+       PINMUX_SINGLE(RPC_INT_N),
+
+       /* IPSR0 */
+       PINMUX_IPSR_GPSR(IP0_3_0,       DU_DR2),
+       PINMUX_IPSR_GPSR(IP0_3_0,       HSCK0),
+       PINMUX_IPSR_GPSR(IP0_3_0,       A0),
+
+       PINMUX_IPSR_GPSR(IP0_7_4,       DU_DR3),
+       PINMUX_IPSR_GPSR(IP0_7_4,       HRTS0_N),
+       PINMUX_IPSR_GPSR(IP0_7_4,       A1),
+
+       PINMUX_IPSR_GPSR(IP0_11_8,      DU_DR4),
+       PINMUX_IPSR_GPSR(IP0_11_8,      HCTS0_N),
+       PINMUX_IPSR_GPSR(IP0_11_8,      A2),
+
+       PINMUX_IPSR_GPSR(IP0_15_12,     DU_DR5),
+       PINMUX_IPSR_GPSR(IP0_15_12,     HTX0),
+       PINMUX_IPSR_GPSR(IP0_15_12,     A3),
+
+       PINMUX_IPSR_GPSR(IP0_19_16,     DU_DR6),
+       PINMUX_IPSR_GPSR(IP0_19_16,     MSIOF3_RXD),
+       PINMUX_IPSR_GPSR(IP0_19_16,     A4),
+
+       PINMUX_IPSR_GPSR(IP0_23_20,     DU_DR7),
+       PINMUX_IPSR_GPSR(IP0_23_20,     MSIOF3_TXD),
+       PINMUX_IPSR_GPSR(IP0_23_20,     A5),
+
+       PINMUX_IPSR_GPSR(IP0_27_24,     DU_DG2),
+       PINMUX_IPSR_GPSR(IP0_27_24,     MSIOF3_SS1),
+       PINMUX_IPSR_GPSR(IP0_27_24,     A6),
+
+       PINMUX_IPSR_GPSR(IP0_31_28,     DU_DG3),
+       PINMUX_IPSR_GPSR(IP0_31_28,     MSIOF3_SS2),
+       PINMUX_IPSR_GPSR(IP0_31_28,     A7),
+       PINMUX_IPSR_GPSR(IP0_31_28,     PWMFSW0),
+
+       /* IPSR1 */
+       PINMUX_IPSR_GPSR(IP1_3_0,       DU_DG4),
+       PINMUX_IPSR_GPSR(IP1_3_0,       A8),
+       PINMUX_IPSR_MSEL(IP1_3_0,       FSO_CFE_0_N_A,  SEL_RFSO_0),
+
+       PINMUX_IPSR_GPSR(IP1_7_4,       DU_DG5),
+       PINMUX_IPSR_GPSR(IP1_7_4,       A9),
+       PINMUX_IPSR_MSEL(IP1_7_4,       FSO_CFE_1_N_A,  SEL_RFSO_0),
+
+       PINMUX_IPSR_GPSR(IP1_11_8,      DU_DG6),
+       PINMUX_IPSR_GPSR(IP1_11_8,      A10),
+       PINMUX_IPSR_MSEL(IP1_11_8,      FSO_TOE_N_A,    SEL_RFSO_0),
+
+       PINMUX_IPSR_GPSR(IP1_15_12,     DU_DG7),
+       PINMUX_IPSR_GPSR(IP1_15_12,     A11),
+       PINMUX_IPSR_GPSR(IP1_15_12,     IRQ1),
+
+       PINMUX_IPSR_GPSR(IP1_19_16,     DU_DB2),
+       PINMUX_IPSR_GPSR(IP1_19_16,     A12),
+       PINMUX_IPSR_GPSR(IP1_19_16,     IRQ2),
+
+       PINMUX_IPSR_GPSR(IP1_23_20,     DU_DB3),
+       PINMUX_IPSR_GPSR(IP1_23_20,     A13),
+       PINMUX_IPSR_GPSR(IP1_23_20,     FXR_CLKOUT1),
+
+       PINMUX_IPSR_GPSR(IP1_27_24,     DU_DB4),
+       PINMUX_IPSR_GPSR(IP1_27_24,     A14),
+       PINMUX_IPSR_GPSR(IP1_27_24,     FXR_CLKOUT2),
+
+       PINMUX_IPSR_GPSR(IP1_31_28,     DU_DB5),
+       PINMUX_IPSR_GPSR(IP1_31_28,     A15),
+       PINMUX_IPSR_GPSR(IP1_31_28,     FXR_TXENA_N),
+
+       /* IPSR2 */
+       PINMUX_IPSR_GPSR(IP2_3_0,       DU_DB6),
+       PINMUX_IPSR_GPSR(IP2_3_0,       A16),
+       PINMUX_IPSR_GPSR(IP2_3_0,       FXR_TXENB_N),
+
+       PINMUX_IPSR_GPSR(IP2_7_4,       DU_DB7),
+       PINMUX_IPSR_GPSR(IP2_7_4,       A17),
+
+       PINMUX_IPSR_GPSR(IP2_11_8,      DU_DOTCLKOUT),
+       PINMUX_IPSR_MSEL(IP2_11_8,      SCIF_CLK_A,     SEL_HSCIF0_0),
+       PINMUX_IPSR_GPSR(IP2_11_8,      A18),
+
+       PINMUX_IPSR_GPSR(IP2_15_12,     DU_EXHSYNC_DU_HSYNC),
+       PINMUX_IPSR_GPSR(IP2_15_12,     HRX0),
+       PINMUX_IPSR_GPSR(IP2_15_12,     A19),
+       PINMUX_IPSR_GPSR(IP2_15_12,     IRQ3),
+
+       PINMUX_IPSR_GPSR(IP2_19_16,     DU_EXVSYNC_DU_VSYNC),
+       PINMUX_IPSR_GPSR(IP2_19_16,     MSIOF3_SCK),
+
+       PINMUX_IPSR_GPSR(IP2_23_20,     DU_EXODDF_DU_ODDF_DISP_CDE),
+       PINMUX_IPSR_GPSR(IP2_23_20,     MSIOF3_SYNC),
+
+       PINMUX_IPSR_GPSR(IP2_27_24,     IRQ0),
+       PINMUX_IPSR_GPSR(IP2_27_24,     CC5_OSCOUT),
+
+       PINMUX_IPSR_GPSR(IP2_31_28,     VI0_CLK),
+       PINMUX_IPSR_GPSR(IP2_31_28,     MSIOF2_SCK),
+       PINMUX_IPSR_GPSR(IP2_31_28,     SCK3),
+       PINMUX_IPSR_GPSR(IP2_31_28,     HSCK3),
+
+       /* IPSR3 */
+       PINMUX_IPSR_GPSR(IP3_3_0,       VI0_CLKENB),
+       PINMUX_IPSR_GPSR(IP3_3_0,       MSIOF2_RXD),
+       PINMUX_IPSR_GPSR(IP3_3_0,       RX3),
+       PINMUX_IPSR_GPSR(IP3_3_0,       RD_WR_N),
+       PINMUX_IPSR_GPSR(IP3_3_0,       HCTS3_N),
+
+       PINMUX_IPSR_GPSR(IP3_7_4,       VI0_HSYNC_N),
+       PINMUX_IPSR_GPSR(IP3_7_4,       MSIOF2_TXD),
+       PINMUX_IPSR_GPSR(IP3_7_4,       TX3),
+       PINMUX_IPSR_GPSR(IP3_7_4,       HRTS3_N),
+
+       PINMUX_IPSR_GPSR(IP3_11_8,      VI0_VSYNC_N),
+       PINMUX_IPSR_GPSR(IP3_11_8,      MSIOF2_SYNC),
+       PINMUX_IPSR_GPSR(IP3_11_8,      CTS3_N),
+       PINMUX_IPSR_GPSR(IP3_11_8,      HTX3),
+
+       PINMUX_IPSR_GPSR(IP3_15_12,     VI0_DATA0),
+       PINMUX_IPSR_GPSR(IP3_15_12,     MSIOF2_SS1),
+       PINMUX_IPSR_GPSR(IP3_15_12,     RTS3_N_TANS),
+       PINMUX_IPSR_GPSR(IP3_15_12,     HRX3),
+
+       PINMUX_IPSR_GPSR(IP3_19_16,     VI0_DATA1),
+       PINMUX_IPSR_GPSR(IP3_19_16,     MSIOF2_SS2),
+       PINMUX_IPSR_GPSR(IP3_19_16,     SCK1),
+       PINMUX_IPSR_MSEL(IP3_19_16,     SPEEDIN_A,      SEL_RSP_0),
+
+       PINMUX_IPSR_GPSR(IP3_23_20,     VI0_DATA2),
+       PINMUX_IPSR_GPSR(IP3_23_20,     AVB0_AVTP_PPS),
+       PINMUX_IPSR_MSEL(IP3_23_20,     SDA3_A,         SEL_I2C3_0),
+
+       PINMUX_IPSR_GPSR(IP3_27_24,     VI0_DATA3),
+       PINMUX_IPSR_GPSR(IP3_27_24,     HSCK1),
+       PINMUX_IPSR_MSEL(IP3_27_24,     SCL3_A,         SEL_I2C3_0),
+
+       PINMUX_IPSR_GPSR(IP3_31_28,     VI0_DATA4),
+       PINMUX_IPSR_GPSR(IP3_31_28,     HRTS1_N),
+       PINMUX_IPSR_MSEL(IP3_31_28,     RX1_A,  SEL_SCIF1_0),
+
+       /* IPSR4 */
+       PINMUX_IPSR_GPSR(IP4_3_0,       VI0_DATA5),
+       PINMUX_IPSR_GPSR(IP4_3_0,       HCTS1_N),
+       PINMUX_IPSR_MSEL(IP4_3_0,       TX1_A,  SEL_SCIF1_0),
+
+       PINMUX_IPSR_GPSR(IP4_7_4,       VI0_DATA6),
+       PINMUX_IPSR_GPSR(IP4_7_4,       HTX1),
+       PINMUX_IPSR_GPSR(IP4_7_4,       CTS1_N),
+
+       PINMUX_IPSR_GPSR(IP4_11_8,      VI0_DATA7),
+       PINMUX_IPSR_GPSR(IP4_11_8,      HRX1),
+       PINMUX_IPSR_GPSR(IP4_11_8,      RTS1_N_TANS),
+
+       PINMUX_IPSR_GPSR(IP4_15_12,     VI0_DATA8),
+       PINMUX_IPSR_GPSR(IP4_15_12,     HSCK2),
+       PINMUX_IPSR_MSEL(IP4_15_12,     PWM0_A, SEL_PWM0_0),
+
+       PINMUX_IPSR_GPSR(IP4_19_16,     VI0_DATA9),
+       PINMUX_IPSR_GPSR(IP4_19_16,     HCTS2_N),
+       PINMUX_IPSR_MSEL(IP4_19_16,     PWM1_A, SEL_PWM1_0),
+       PINMUX_IPSR_MSEL(IP4_19_16,     FSO_CFE_0_N_B,  SEL_RFSO_1),
+
+       PINMUX_IPSR_GPSR(IP4_23_20,     VI0_DATA10),
+       PINMUX_IPSR_GPSR(IP4_23_20,     HRTS2_N),
+       PINMUX_IPSR_MSEL(IP4_23_20,     PWM2_A, SEL_PWM2_0),
+       PINMUX_IPSR_MSEL(IP4_23_20,     FSO_CFE_1_N_B,  SEL_RFSO_1),
+
+       PINMUX_IPSR_GPSR(IP4_27_24,     VI0_DATA11),
+       PINMUX_IPSR_GPSR(IP4_27_24,     HTX2),
+       PINMUX_IPSR_MSEL(IP4_27_24,     PWM3_A, SEL_PWM3_0),
+       PINMUX_IPSR_MSEL(IP4_27_24,     FSO_TOE_N_B,    SEL_RFSO_1),
+
+       PINMUX_IPSR_GPSR(IP4_31_28,     VI0_FIELD),
+       PINMUX_IPSR_GPSR(IP4_31_28,     HRX2),
+       PINMUX_IPSR_MSEL(IP4_31_28,     PWM4_A, SEL_PWM4_0),
+       PINMUX_IPSR_GPSR(IP4_31_28,     CS1_N),
+       PINMUX_IPSR_GPSR(IP4_31_28,     FSCLKST2_N_A),
+
+       /* IPSR5 */
+       PINMUX_IPSR_GPSR(IP5_3_0,       VI1_CLK),
+       PINMUX_IPSR_GPSR(IP5_3_0,       MSIOF1_RXD),
+       PINMUX_IPSR_GPSR(IP5_3_0,       CS0_N),
+
+       PINMUX_IPSR_GPSR(IP5_7_4,       VI1_CLKENB),
+       PINMUX_IPSR_GPSR(IP5_7_4,       MSIOF1_TXD),
+       PINMUX_IPSR_GPSR(IP5_7_4,       D0),
+
+       PINMUX_IPSR_GPSR(IP5_11_8,      VI1_HSYNC_N),
+       PINMUX_IPSR_GPSR(IP5_11_8,      MSIOF1_SCK),
+       PINMUX_IPSR_GPSR(IP5_11_8,      D1),
+
+       PINMUX_IPSR_GPSR(IP5_15_12,     VI1_VSYNC_N),
+       PINMUX_IPSR_GPSR(IP5_15_12,     MSIOF1_SYNC),
+       PINMUX_IPSR_GPSR(IP5_15_12,     D2),
+
+       PINMUX_IPSR_GPSR(IP5_19_16,     VI1_DATA0),
+       PINMUX_IPSR_GPSR(IP5_19_16,     MSIOF1_SS1),
+       PINMUX_IPSR_GPSR(IP5_19_16,     D3),
+
+       PINMUX_IPSR_GPSR(IP5_23_20,     VI1_DATA1),
+       PINMUX_IPSR_GPSR(IP5_23_20,     MSIOF1_SS2),
+       PINMUX_IPSR_GPSR(IP5_23_20,     D4),
+       PINMUX_IPSR_GPSR(IP5_23_20,     MMC_CMD),
+
+       PINMUX_IPSR_GPSR(IP5_27_24,     VI1_DATA2),
+       PINMUX_IPSR_MSEL(IP5_27_24,     CANFD0_TX_B,    SEL_CANFD0_1),
+       PINMUX_IPSR_GPSR(IP5_27_24,     D5),
+       PINMUX_IPSR_GPSR(IP5_27_24,     MMC_D0),
+
+       PINMUX_IPSR_GPSR(IP5_31_28,     VI1_DATA3),
+       PINMUX_IPSR_MSEL(IP5_31_28,     CANFD0_RX_B,    SEL_CANFD0_1),
+       PINMUX_IPSR_GPSR(IP5_31_28,     D6),
+       PINMUX_IPSR_GPSR(IP5_31_28,     MMC_D1),
+
+       /* IPSR6 */
+       PINMUX_IPSR_GPSR(IP6_3_0,       VI1_DATA4),
+       PINMUX_IPSR_MSEL(IP6_3_0,       CANFD_CLK_B,    SEL_CANFD0_1),
+       PINMUX_IPSR_GPSR(IP6_3_0,       D7),
+       PINMUX_IPSR_GPSR(IP6_3_0,       MMC_D2),
+
+       PINMUX_IPSR_GPSR(IP6_7_4,       VI1_DATA5),
+       PINMUX_IPSR_GPSR(IP6_7_4,       SCK4),
+       PINMUX_IPSR_GPSR(IP6_7_4,       D8),
+       PINMUX_IPSR_GPSR(IP6_7_4,       MMC_D3),
+
+       PINMUX_IPSR_GPSR(IP6_11_8,      VI1_DATA6),
+       PINMUX_IPSR_GPSR(IP6_11_8,      RX4),
+       PINMUX_IPSR_GPSR(IP6_11_8,      D9),
+       PINMUX_IPSR_GPSR(IP6_11_8,      MMC_CLK),
+
+       PINMUX_IPSR_GPSR(IP6_15_12,     VI1_DATA7),
+       PINMUX_IPSR_GPSR(IP6_15_12,     TX4),
+       PINMUX_IPSR_GPSR(IP6_15_12,     D10),
+       PINMUX_IPSR_GPSR(IP6_15_12,     MMC_D4),
+
+       PINMUX_IPSR_GPSR(IP6_19_16,     VI1_DATA8),
+       PINMUX_IPSR_GPSR(IP6_19_16,     CTS4_N),
+       PINMUX_IPSR_GPSR(IP6_19_16,     D11),
+       PINMUX_IPSR_GPSR(IP6_19_16,     MMC_D5),
+
+       PINMUX_IPSR_GPSR(IP6_23_20,     VI1_DATA9),
+       PINMUX_IPSR_GPSR(IP6_23_20,     RTS4_N_TANS),
+       PINMUX_IPSR_GPSR(IP6_23_20,     D12),
+       PINMUX_IPSR_GPSR(IP6_23_20,     MMC_D6),
+       PINMUX_IPSR_MSEL(IP6_23_20,     SCL3_B, SEL_I2C3_1),
+
+       PINMUX_IPSR_GPSR(IP6_27_24,     VI1_DATA10),
+       PINMUX_IPSR_GPSR(IP6_27_24,     D13),
+       PINMUX_IPSR_GPSR(IP6_27_24,     MMC_D7),
+       PINMUX_IPSR_MSEL(IP6_27_24,     SDA3_B, SEL_I2C3_1),
+
+       PINMUX_IPSR_GPSR(IP6_31_28,     VI1_DATA11),
+       PINMUX_IPSR_GPSR(IP6_31_28,     SCL4),
+       PINMUX_IPSR_GPSR(IP6_31_28,     IRQ4),
+       PINMUX_IPSR_GPSR(IP6_31_28,     D14),
+       PINMUX_IPSR_GPSR(IP6_31_28,     MMC_WP),
+
+       /* IPSR7 */
+       PINMUX_IPSR_GPSR(IP7_3_0,       VI1_FIELD),
+       PINMUX_IPSR_GPSR(IP7_3_0,       SDA4),
+       PINMUX_IPSR_GPSR(IP7_3_0,       IRQ5),
+       PINMUX_IPSR_GPSR(IP7_3_0,       D15),
+       PINMUX_IPSR_GPSR(IP7_3_0,       MMC_CD),
+
+       PINMUX_IPSR_GPSR(IP7_7_4,       SCL0),
+       PINMUX_IPSR_GPSR(IP7_7_4,       DU_DR0),
+       PINMUX_IPSR_GPSR(IP7_7_4,       TPU0TO0),
+       PINMUX_IPSR_GPSR(IP7_7_4,       CLKOUT),
+       PINMUX_IPSR_GPSR(IP7_7_4,       MSIOF0_RXD),
+
+       PINMUX_IPSR_GPSR(IP7_11_8,      SDA0),
+       PINMUX_IPSR_GPSR(IP7_11_8,      DU_DR1),
+       PINMUX_IPSR_GPSR(IP7_11_8,      TPU0TO1),
+       PINMUX_IPSR_GPSR(IP7_11_8,      BS_N),
+       PINMUX_IPSR_GPSR(IP7_11_8,      SCK0),
+       PINMUX_IPSR_GPSR(IP7_11_8,      MSIOF0_TXD),
+
+       PINMUX_IPSR_GPSR(IP7_15_12,     SCL1),
+       PINMUX_IPSR_GPSR(IP7_15_12,     DU_DG0),
+       PINMUX_IPSR_GPSR(IP7_15_12,     TPU0TO2),
+       PINMUX_IPSR_GPSR(IP7_15_12,     RD_N),
+       PINMUX_IPSR_GPSR(IP7_15_12,     CTS0_N),
+       PINMUX_IPSR_GPSR(IP7_15_12,     MSIOF0_SCK),
+
+       PINMUX_IPSR_GPSR(IP7_19_16,     SDA1),
+       PINMUX_IPSR_GPSR(IP7_19_16,     DU_DG1),
+       PINMUX_IPSR_GPSR(IP7_19_16,     TPU0TO3),
+       PINMUX_IPSR_GPSR(IP7_19_16,     WE0_N),
+       PINMUX_IPSR_GPSR(IP7_19_16,     RTS0_N_TANS),
+       PINMUX_IPSR_GPSR(IP7_19_16,     MSIOF0_SYNC),
+
+       PINMUX_IPSR_GPSR(IP7_23_20,     SCL2),
+       PINMUX_IPSR_GPSR(IP7_23_20,     DU_DB0),
+       PINMUX_IPSR_MSEL(IP7_23_20,     TCLK1_A,        SEL_TMU_0),
+       PINMUX_IPSR_GPSR(IP7_23_20,     WE1_N),
+       PINMUX_IPSR_GPSR(IP7_23_20,     RX0),
+       PINMUX_IPSR_GPSR(IP7_23_20,     MSIOF0_SS1),
+
+       PINMUX_IPSR_GPSR(IP7_27_24,     SDA2),
+       PINMUX_IPSR_GPSR(IP7_27_24,     DU_DB1),
+       PINMUX_IPSR_MSEL(IP7_27_24,     TCLK2_A,        SEL_TMU_0),
+       PINMUX_IPSR_GPSR(IP7_27_24,     EX_WAIT0),
+       PINMUX_IPSR_GPSR(IP7_27_24,     TX0),
+       PINMUX_IPSR_GPSR(IP7_27_24,     MSIOF0_SS2),
+
+       PINMUX_IPSR_GPSR(IP7_31_28,     AVB0_AVTP_CAPTURE),
+       PINMUX_IPSR_GPSR(IP7_31_28,     FSCLKST2_N_B),
+
+       /* IPSR8 */
+       PINMUX_IPSR_MSEL(IP8_3_0,       CANFD0_TX_A,    SEL_CANFD0_0),
+       PINMUX_IPSR_GPSR(IP8_3_0,       FXR_TXDA),
+       PINMUX_IPSR_MSEL(IP8_3_0,       PWM0_B,         SEL_PWM0_1),
+       PINMUX_IPSR_GPSR(IP8_3_0,       DU_DISP),
+       PINMUX_IPSR_GPSR(IP8_3_0,       FSCLKST2_N_C),
+
+       PINMUX_IPSR_MSEL(IP8_7_4,       CANFD0_RX_A,    SEL_CANFD0_0),
+       PINMUX_IPSR_GPSR(IP8_7_4,       RXDA_EXTFXR),
+       PINMUX_IPSR_MSEL(IP8_7_4,       PWM1_B,         SEL_PWM1_1),
+       PINMUX_IPSR_GPSR(IP8_7_4,       DU_CDE),
+
+       PINMUX_IPSR_GPSR(IP8_11_8,      CANFD1_TX),
+       PINMUX_IPSR_GPSR(IP8_11_8,      FXR_TXDB),
+       PINMUX_IPSR_MSEL(IP8_11_8,      PWM2_B,         SEL_PWM2_1),
+       PINMUX_IPSR_MSEL(IP8_11_8,      TCLK1_B,        SEL_TMU_1),
+       PINMUX_IPSR_MSEL(IP8_11_8,      TX1_B,          SEL_SCIF1_1),
+
+       PINMUX_IPSR_GPSR(IP8_15_12,     CANFD1_RX),
+       PINMUX_IPSR_GPSR(IP8_15_12,     RXDB_EXTFXR),
+       PINMUX_IPSR_MSEL(IP8_15_12,     PWM3_B,         SEL_PWM3_1),
+       PINMUX_IPSR_MSEL(IP8_15_12,     TCLK2_B,        SEL_TMU_1),
+       PINMUX_IPSR_MSEL(IP8_15_12,     RX1_B,          SEL_SCIF1_1),
+
+       PINMUX_IPSR_MSEL(IP8_19_16,     CANFD_CLK_A,    SEL_CANFD0_0),
+       PINMUX_IPSR_GPSR(IP8_19_16,     CLK_EXTFXR),
+       PINMUX_IPSR_MSEL(IP8_19_16,     PWM4_B,         SEL_PWM4_1),
+       PINMUX_IPSR_MSEL(IP8_19_16,     SPEEDIN_B,      SEL_RSP_1),
+       PINMUX_IPSR_MSEL(IP8_19_16,     SCIF_CLK_B,     SEL_HSCIF0_1),
+
+       PINMUX_IPSR_GPSR(IP8_23_20,     DIGRF_CLKIN),
+       PINMUX_IPSR_GPSR(IP8_23_20,     DIGRF_CLKEN_IN),
+
+       PINMUX_IPSR_GPSR(IP8_27_24,     DIGRF_CLKOUT),
+       PINMUX_IPSR_GPSR(IP8_27_24,     DIGRF_CLKEN_OUT),
+};
+
+static const struct sh_pfc_pin pinmux_pins[] = {
+       PINMUX_GPIO_GP_ALL(),
+};
+
+/* - CANFD Clock ------------------------------------------------------------ */
+static const unsigned int canfd_clk_a_pins[] = {
+       /* CANFD_CLK */
+       RCAR_GP_PIN(1, 25),
+};
+static const unsigned int canfd_clk_a_mux[] = {
+       CANFD_CLK_A_MARK,
+};
+static const unsigned int canfd_clk_b_pins[] = {
+       /* CANFD_CLK */
+       RCAR_GP_PIN(3, 8),
+};
+static const unsigned int canfd_clk_b_mux[] = {
+       CANFD_CLK_B_MARK,
+};
+
+/* - CANFD0 ----------------------------------------------------------------- */
+static const unsigned int canfd0_data_a_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 22),
+};
+static const unsigned int canfd0_data_a_mux[] = {
+       CANFD0_TX_A_MARK, CANFD0_RX_A_MARK,
+};
+static const unsigned int canfd0_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+};
+static const unsigned int canfd0_data_b_mux[] = {
+       CANFD0_TX_B_MARK, CANFD0_RX_B_MARK,
+};
+
+/* - CANFD1 ----------------------------------------------------------------- */
+static const unsigned int canfd1_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 24),
+};
+static const unsigned int canfd1_data_mux[] = {
+       CANFD1_TX_MARK, CANFD1_RX_MARK,
+};
+
+/* - DU --------------------------------------------------------------------- */
+static const unsigned int du_rgb666_pins[] = {
+       /* R[7:2], G[7:2], B[7:2] */
+       RCAR_GP_PIN(0, 5), RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 3),
+       RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 1), RCAR_GP_PIN(0, 0),
+       RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 9),
+       RCAR_GP_PIN(0, 8), RCAR_GP_PIN(0, 7), RCAR_GP_PIN(0, 6),
+       RCAR_GP_PIN(0, 17), RCAR_GP_PIN(0, 16), RCAR_GP_PIN(0, 15),
+       RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 13), RCAR_GP_PIN(0, 12),
+};
+static const unsigned int du_rgb666_mux[] = {
+       DU_DR7_MARK, DU_DR6_MARK, DU_DR5_MARK,
+       DU_DR4_MARK, DU_DR3_MARK, DU_DR2_MARK,
+       DU_DG7_MARK, DU_DG6_MARK, DU_DG5_MARK,
+       DU_DG4_MARK, DU_DG3_MARK, DU_DG2_MARK,
+       DU_DB7_MARK, DU_DB6_MARK, DU_DB5_MARK,
+       DU_DB4_MARK, DU_DB3_MARK, DU_DB2_MARK,
+};
+static const unsigned int du_clk_out_pins[] = {
+       /* DOTCLKOUT */
+       RCAR_GP_PIN(0, 18),
+};
+static const unsigned int du_clk_out_mux[] = {
+       DU_DOTCLKOUT_MARK,
+};
+static const unsigned int du_sync_pins[] = {
+       /* EXVSYNC/VSYNC, EXHSYNC/HSYNC */
+       RCAR_GP_PIN(0, 20), RCAR_GP_PIN(0, 19),
+};
+static const unsigned int du_sync_mux[] = {
+       DU_EXVSYNC_DU_VSYNC_MARK, DU_EXHSYNC_DU_HSYNC_MARK
+};
+static const unsigned int du_oddf_pins[] = {
+       /* EXODDF/ODDF/DISP/CDE */
+       RCAR_GP_PIN(0, 21),
+};
+static const unsigned int du_oddf_mux[] = {
+       DU_EXODDF_DU_ODDF_DISP_CDE_MARK,
+};
+static const unsigned int du_cde_pins[] = {
+       /* CDE */
+       RCAR_GP_PIN(1, 22),
+};
+static const unsigned int du_cde_mux[] = {
+       DU_CDE_MARK,
+};
+static const unsigned int du_disp_pins[] = {
+       /* DISP */
+       RCAR_GP_PIN(1, 21),
+};
+static const unsigned int du_disp_mux[] = {
+       DU_DISP_MARK,
+};
+
+/* - HSCIF0 ----------------------------------------------------------------- */
+static const unsigned int hscif0_data_pins[] = {
+       /* HRX, HTX */
+       RCAR_GP_PIN(0, 19), RCAR_GP_PIN(0, 3),
+};
+static const unsigned int hscif0_data_mux[] = {
+       HRX0_MARK, HTX0_MARK,
+};
+static const unsigned int hscif0_clk_pins[] = {
+       /* HSCK */
+       RCAR_GP_PIN(0, 0),
+};
+static const unsigned int hscif0_clk_mux[] = {
+       HSCK0_MARK,
+};
+static const unsigned int hscif0_ctrl_pins[] = {
+       /* HRTS#, HCTS# */
+       RCAR_GP_PIN(0, 1), RCAR_GP_PIN(0, 2),
+};
+static const unsigned int hscif0_ctrl_mux[] = {
+       HRTS0_N_MARK, HCTS0_N_MARK,
+};
+
+/* - HSCIF1 ----------------------------------------------------------------- */
+static const unsigned int hscif1_data_pins[] = {
+       /* HRX, HTX */
+       RCAR_GP_PIN(2, 11), RCAR_GP_PIN(2, 10),
+};
+static const unsigned int hscif1_data_mux[] = {
+       HRX1_MARK, HTX1_MARK,
+};
+static const unsigned int hscif1_clk_pins[] = {
+       /* HSCK */
+       RCAR_GP_PIN(2, 7),
+};
+static const unsigned int hscif1_clk_mux[] = {
+       HSCK1_MARK,
+};
+static const unsigned int hscif1_ctrl_pins[] = {
+       /* HRTS#, HCTS# */
+       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
+};
+static const unsigned int hscif1_ctrl_mux[] = {
+       HRTS1_N_MARK, HCTS1_N_MARK,
+};
+
+/* - HSCIF2 ----------------------------------------------------------------- */
+static const unsigned int hscif2_data_pins[] = {
+       /* HRX, HTX */
+       RCAR_GP_PIN(2, 16), RCAR_GP_PIN(2, 15),
+};
+static const unsigned int hscif2_data_mux[] = {
+       HRX2_MARK, HTX2_MARK,
+};
+static const unsigned int hscif2_clk_pins[] = {
+       /* HSCK */
+       RCAR_GP_PIN(2, 12),
+};
+static const unsigned int hscif2_clk_mux[] = {
+       HSCK2_MARK,
+};
+static const unsigned int hscif2_ctrl_pins[] = {
+       /* HRTS#, HCTS# */
+       RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 13),
+};
+static const unsigned int hscif2_ctrl_mux[] = {
+       HRTS2_N_MARK, HCTS2_N_MARK,
+};
+
+/* - HSCIF3 ----------------------------------------------------------------- */
+static const unsigned int hscif3_data_pins[] = {
+       /* HRX, HTX */
+       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 3),
+};
+static const unsigned int hscif3_data_mux[] = {
+       HRX3_MARK, HTX3_MARK,
+};
+static const unsigned int hscif3_clk_pins[] = {
+       /* HSCK */
+       RCAR_GP_PIN(2, 0),
+};
+static const unsigned int hscif3_clk_mux[] = {
+       HSCK3_MARK,
+};
+static const unsigned int hscif3_ctrl_pins[] = {
+       /* HRTS#, HCTS# */
+       RCAR_GP_PIN(2, 2), RCAR_GP_PIN(2, 1),
+};
+static const unsigned int hscif3_ctrl_mux[] = {
+       HRTS3_N_MARK, HCTS3_N_MARK,
+};
+
+/* - I2C0 ------------------------------------------------------------------- */
+static const unsigned int i2c0_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(4, 1), RCAR_GP_PIN(4, 0),
+};
+static const unsigned int i2c0_mux[] = {
+       SDA0_MARK, SCL0_MARK,
+};
+
+/* - I2C1 ------------------------------------------------------------------- */
+static const unsigned int i2c1_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(4, 3), RCAR_GP_PIN(4, 2),
+};
+static const unsigned int i2c1_mux[] = {
+       SDA1_MARK, SCL1_MARK,
+};
+
+/* - I2C2 ------------------------------------------------------------------- */
+static const unsigned int i2c2_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(4, 5), RCAR_GP_PIN(4, 4),
+};
+static const unsigned int i2c2_mux[] = {
+       SDA2_MARK, SCL2_MARK,
+};
+
+/* - I2C3 ------------------------------------------------------------------- */
+static const unsigned int i2c3_a_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
+};
+static const unsigned int i2c3_a_mux[] = {
+       SDA3_A_MARK, SCL3_A_MARK,
+};
+static const unsigned int i2c3_b_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 13),
+};
+static const unsigned int i2c3_b_mux[] = {
+       SDA3_B_MARK, SCL3_B_MARK,
+};
+
+/* - I2C4 ------------------------------------------------------------------- */
+static const unsigned int i2c4_pins[] = {
+       /* SDA, SCL */
+       RCAR_GP_PIN(3, 16), RCAR_GP_PIN(3, 15),
+};
+static const unsigned int i2c4_mux[] = {
+       SDA4_MARK, SCL4_MARK,
+};
+
+/* - INTC-EX ---------------------------------------------------------------- */
+static const unsigned int intc_ex_irq0_pins[] = {
+       /* IRQ0 */
+       RCAR_GP_PIN(1, 0),
+};
+static const unsigned int intc_ex_irq0_mux[] = {
+       IRQ0_MARK,
+};
+static const unsigned int intc_ex_irq1_pins[] = {
+       /* IRQ1 */
+       RCAR_GP_PIN(0, 11),
+};
+static const unsigned int intc_ex_irq1_mux[] = {
+       IRQ1_MARK,
+};
+static const unsigned int intc_ex_irq2_pins[] = {
+       /* IRQ2 */
+       RCAR_GP_PIN(0, 12),
+};
+static const unsigned int intc_ex_irq2_mux[] = {
+       IRQ2_MARK,
+};
+static const unsigned int intc_ex_irq3_pins[] = {
+       /* IRQ3 */
+       RCAR_GP_PIN(0, 19),
+};
+static const unsigned int intc_ex_irq3_mux[] = {
+       IRQ3_MARK,
+};
+static const unsigned int intc_ex_irq4_pins[] = {
+       /* IRQ4 */
+       RCAR_GP_PIN(3, 15),
+};
+static const unsigned int intc_ex_irq4_mux[] = {
+       IRQ4_MARK,
+};
+static const unsigned int intc_ex_irq5_pins[] = {
+       /* IRQ5 */
+       RCAR_GP_PIN(3, 16),
+};
+static const unsigned int intc_ex_irq5_mux[] = {
+       IRQ5_MARK,
+};
+
+/* - MMC -------------------------------------------------------------------- */
+static const unsigned int mmc_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(3, 6),
+};
+static const unsigned int mmc_data1_mux[] = {
+       MMC_D0_MARK,
+};
+static const unsigned int mmc_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
+};
+static const unsigned int mmc_data4_mux[] = {
+       MMC_D0_MARK, MMC_D1_MARK,
+       MMC_D2_MARK, MMC_D3_MARK,
+};
+static const unsigned int mmc_data8_pins[] = {
+       /* D[0:7] */
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
+       RCAR_GP_PIN(3, 11), RCAR_GP_PIN(3, 12),
+       RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 14),
+};
+static const unsigned int mmc_data8_mux[] = {
+       MMC_D0_MARK, MMC_D1_MARK,
+       MMC_D2_MARK, MMC_D3_MARK,
+       MMC_D4_MARK, MMC_D5_MARK,
+       MMC_D6_MARK, MMC_D7_MARK,
+};
+static const unsigned int mmc_ctrl_pins[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 5),
+};
+static const unsigned int mmc_ctrl_mux[] = {
+       MMC_CLK_MARK, MMC_CMD_MARK,
+};
+static const unsigned int mmc_cd_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(3, 16),
+};
+static const unsigned int mmc_cd_mux[] = {
+       MMC_CD_MARK,
+};
+static const unsigned int mmc_wp_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(3, 15),
+};
+static const unsigned int mmc_wp_mux[] = {
+       MMC_WP_MARK,
+};
+
+/* - MSIOF0 ----------------------------------------------------------------- */
+static const unsigned int msiof0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 2),
+};
+static const unsigned int msiof0_clk_mux[] = {
+       MSIOF0_SCK_MARK,
+};
+static const unsigned int msiof0_sync_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(4, 3),
+};
+static const unsigned int msiof0_sync_mux[] = {
+       MSIOF0_SYNC_MARK,
+};
+static const unsigned int msiof0_ss1_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(4, 4),
+};
+static const unsigned int msiof0_ss1_mux[] = {
+       MSIOF0_SS1_MARK,
+};
+static const unsigned int msiof0_ss2_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(4, 5),
+};
+static const unsigned int msiof0_ss2_mux[] = {
+       MSIOF0_SS2_MARK,
+};
+static const unsigned int msiof0_txd_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(4, 1),
+};
+static const unsigned int msiof0_txd_mux[] = {
+       MSIOF0_TXD_MARK,
+};
+static const unsigned int msiof0_rxd_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(4, 0),
+};
+static const unsigned int msiof0_rxd_mux[] = {
+       MSIOF0_RXD_MARK,
+};
+
+/* - MSIOF1 ----------------------------------------------------------------- */
+static const unsigned int msiof1_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(3, 2),
+};
+static const unsigned int msiof1_clk_mux[] = {
+       MSIOF1_SCK_MARK,
+};
+static const unsigned int msiof1_sync_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(3, 3),
+};
+static const unsigned int msiof1_sync_mux[] = {
+       MSIOF1_SYNC_MARK,
+};
+static const unsigned int msiof1_ss1_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(3, 4),
+};
+static const unsigned int msiof1_ss1_mux[] = {
+       MSIOF1_SS1_MARK,
+};
+static const unsigned int msiof1_ss2_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(3, 5),
+};
+static const unsigned int msiof1_ss2_mux[] = {
+       MSIOF1_SS2_MARK,
+};
+static const unsigned int msiof1_txd_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(3, 1),
+};
+static const unsigned int msiof1_txd_mux[] = {
+       MSIOF1_TXD_MARK,
+};
+static const unsigned int msiof1_rxd_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(3, 0),
+};
+static const unsigned int msiof1_rxd_mux[] = {
+       MSIOF1_RXD_MARK,
+};
+
+/* - MSIOF2 ----------------------------------------------------------------- */
+static const unsigned int msiof2_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 0),
+};
+static const unsigned int msiof2_clk_mux[] = {
+       MSIOF2_SCK_MARK,
+};
+static const unsigned int msiof2_sync_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(2, 3),
+};
+static const unsigned int msiof2_sync_mux[] = {
+       MSIOF2_SYNC_MARK,
+};
+static const unsigned int msiof2_ss1_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(2, 4),
+};
+static const unsigned int msiof2_ss1_mux[] = {
+       MSIOF2_SS1_MARK,
+};
+static const unsigned int msiof2_ss2_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(2, 5),
+};
+static const unsigned int msiof2_ss2_mux[] = {
+       MSIOF2_SS2_MARK,
+};
+static const unsigned int msiof2_txd_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(2, 2),
+};
+static const unsigned int msiof2_txd_mux[] = {
+       MSIOF2_TXD_MARK,
+};
+static const unsigned int msiof2_rxd_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(2, 1),
+};
+static const unsigned int msiof2_rxd_mux[] = {
+       MSIOF2_RXD_MARK,
+};
+
+/* - MSIOF3 ----------------------------------------------------------------- */
+static const unsigned int msiof3_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 20),
+};
+static const unsigned int msiof3_clk_mux[] = {
+       MSIOF3_SCK_MARK,
+};
+static const unsigned int msiof3_sync_pins[] = {
+       /* SYNC */
+       RCAR_GP_PIN(0, 21),
+};
+static const unsigned int msiof3_sync_mux[] = {
+       MSIOF3_SYNC_MARK,
+};
+static const unsigned int msiof3_ss1_pins[] = {
+       /* SS1 */
+       RCAR_GP_PIN(0, 6),
+};
+static const unsigned int msiof3_ss1_mux[] = {
+       MSIOF3_SS1_MARK,
+};
+static const unsigned int msiof3_ss2_pins[] = {
+       /* SS2 */
+       RCAR_GP_PIN(0, 7),
+};
+static const unsigned int msiof3_ss2_mux[] = {
+       MSIOF3_SS2_MARK,
+};
+static const unsigned int msiof3_txd_pins[] = {
+       /* TXD */
+       RCAR_GP_PIN(0, 5),
+};
+static const unsigned int msiof3_txd_mux[] = {
+       MSIOF3_TXD_MARK,
+};
+static const unsigned int msiof3_rxd_pins[] = {
+       /* RXD */
+       RCAR_GP_PIN(0, 4),
+};
+static const unsigned int msiof3_rxd_mux[] = {
+       MSIOF3_RXD_MARK,
+};
+
+/* - PWM0 ------------------------------------------------------------------- */
+static const unsigned int pwm0_a_pins[] = {
+       RCAR_GP_PIN(2, 12),
+};
+static const unsigned int pwm0_a_mux[] = {
+       PWM0_A_MARK,
+};
+static const unsigned int pwm0_b_pins[] = {
+       RCAR_GP_PIN(1, 21),
+};
+static const unsigned int pwm0_b_mux[] = {
+       PWM0_B_MARK,
+};
+
+/* - PWM1 ------------------------------------------------------------------- */
+static const unsigned int pwm1_a_pins[] = {
+       RCAR_GP_PIN(2, 13),
+};
+static const unsigned int pwm1_a_mux[] = {
+       PWM1_A_MARK,
+};
+static const unsigned int pwm1_b_pins[] = {
+       RCAR_GP_PIN(1, 22),
+};
+static const unsigned int pwm1_b_mux[] = {
+       PWM1_B_MARK,
+};
+
+/* - PWM2 ------------------------------------------------------------------- */
+static const unsigned int pwm2_a_pins[] = {
+       RCAR_GP_PIN(2, 14),
+};
+static const unsigned int pwm2_a_mux[] = {
+       PWM2_A_MARK,
+};
+static const unsigned int pwm2_b_pins[] = {
+       RCAR_GP_PIN(1, 23),
+};
+static const unsigned int pwm2_b_mux[] = {
+       PWM2_B_MARK,
+};
+
+/* - PWM3 ------------------------------------------------------------------- */
+static const unsigned int pwm3_a_pins[] = {
+       RCAR_GP_PIN(2, 15),
+};
+static const unsigned int pwm3_a_mux[] = {
+       PWM3_A_MARK,
+};
+static const unsigned int pwm3_b_pins[] = {
+       RCAR_GP_PIN(1, 24),
+};
+static const unsigned int pwm3_b_mux[] = {
+       PWM3_B_MARK,
+};
+
+/* - PWM4 ------------------------------------------------------------------- */
+static const unsigned int pwm4_a_pins[] = {
+       RCAR_GP_PIN(2, 16),
+};
+static const unsigned int pwm4_a_mux[] = {
+       PWM4_A_MARK,
+};
+static const unsigned int pwm4_b_pins[] = {
+       RCAR_GP_PIN(1, 25),
+};
+static const unsigned int pwm4_b_mux[] = {
+       PWM4_B_MARK,
+};
+
+/* - SCIF Clock ------------------------------------------------------------- */
+static const unsigned int scif_clk_a_pins[] = {
+       /* SCIF_CLK */
+       RCAR_GP_PIN(0, 18),
+};
+static const unsigned int scif_clk_a_mux[] = {
+       SCIF_CLK_A_MARK,
+};
+static const unsigned int scif_clk_b_pins[] = {
+       /* SCIF_CLK */
+       RCAR_GP_PIN(1, 25),
+};
+static const unsigned int scif_clk_b_mux[] = {
+       SCIF_CLK_B_MARK,
+};
+
+/* - SCIF0 ------------------------------------------------------------------ */
+static const unsigned int scif0_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(4, 4), RCAR_GP_PIN(4, 5),
+};
+static const unsigned int scif0_data_mux[] = {
+       RX0_MARK, TX0_MARK,
+};
+static const unsigned int scif0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 1),
+};
+static const unsigned int scif0_clk_mux[] = {
+       SCK0_MARK,
+};
+static const unsigned int scif0_ctrl_pins[] = {
+       /* RTS#, CTS# */
+       RCAR_GP_PIN(4, 3), RCAR_GP_PIN(4, 2),
+};
+static const unsigned int scif0_ctrl_mux[] = {
+       RTS0_N_TANS_MARK, CTS0_N_MARK,
+};
+
+/* - SCIF1 ------------------------------------------------------------------ */
+static const unsigned int scif1_data_a_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
+};
+static const unsigned int scif1_data_a_mux[] = {
+       RX1_A_MARK, TX1_A_MARK,
+};
+static const unsigned int scif1_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 5),
+};
+static const unsigned int scif1_clk_mux[] = {
+       SCK1_MARK,
+};
+static const unsigned int scif1_ctrl_pins[] = {
+       /* RTS#, CTS# */
+       RCAR_GP_PIN(2, 11), RCAR_GP_PIN(2, 10),
+};
+static const unsigned int scif1_ctrl_mux[] = {
+       RTS1_N_TANS_MARK, CTS1_N_MARK,
+};
+static const unsigned int scif1_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 24), RCAR_GP_PIN(1, 23),
+};
+static const unsigned int scif1_data_b_mux[] = {
+       RX1_B_MARK, TX1_B_MARK,
+};
+
+/* - SCIF3 ------------------------------------------------------------------ */
+static const unsigned int scif3_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(2, 1), RCAR_GP_PIN(2, 2),
+};
+static const unsigned int scif3_data_mux[] = {
+       RX3_MARK, TX3_MARK,
+};
+static const unsigned int scif3_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 0),
+};
+static const unsigned int scif3_clk_mux[] = {
+       SCK3_MARK,
+};
+static const unsigned int scif3_ctrl_pins[] = {
+       /* RTS#, CTS# */
+       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 3),
+};
+static const unsigned int scif3_ctrl_mux[] = {
+       RTS3_N_TANS_MARK, CTS3_N_MARK,
+};
+
+/* - SCIF4 ------------------------------------------------------------------ */
+static const unsigned int scif4_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+};
+static const unsigned int scif4_data_mux[] = {
+       RX4_MARK, TX4_MARK,
+};
+static const unsigned int scif4_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(3, 9),
+};
+static const unsigned int scif4_clk_mux[] = {
+       SCK4_MARK,
+};
+static const unsigned int scif4_ctrl_pins[] = {
+       /* RTS#, CTS# */
+       RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 12),
+};
+static const unsigned int scif4_ctrl_mux[] = {
+       RTS4_N_TANS_MARK, CTS4_N_MARK,
+};
+
+/* - TMU -------------------------------------------------------------------- */
+static const unsigned int tmu_tclk1_a_pins[] = {
+       /* TCLK1 */
+       RCAR_GP_PIN(4, 4),
+};
+static const unsigned int tmu_tclk1_a_mux[] = {
+       TCLK1_A_MARK,
+};
+static const unsigned int tmu_tclk1_b_pins[] = {
+       /* TCLK1 */
+       RCAR_GP_PIN(1, 23),
+};
+static const unsigned int tmu_tclk1_b_mux[] = {
+       TCLK1_B_MARK,
+};
+static const unsigned int tmu_tclk2_a_pins[] = {
+       /* TCLK2 */
+       RCAR_GP_PIN(4, 5),
+};
+static const unsigned int tmu_tclk2_a_mux[] = {
+       TCLK2_A_MARK,
+};
+static const unsigned int tmu_tclk2_b_pins[] = {
+       /* TCLK2 */
+       RCAR_GP_PIN(1, 24),
+};
+static const unsigned int tmu_tclk2_b_mux[] = {
+       TCLK2_B_MARK,
+};
+
+/* - VIN0 ------------------------------------------------------------------- */
+static const unsigned int vin0_data8_pins[] = {
+       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
+       RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
+       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
+       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
+};
+static const unsigned int vin0_data8_mux[] = {
+       VI0_DATA0_MARK, VI0_DATA1_MARK,
+       VI0_DATA2_MARK, VI0_DATA3_MARK,
+       VI0_DATA4_MARK, VI0_DATA5_MARK,
+       VI0_DATA6_MARK, VI0_DATA7_MARK,
+};
+static const unsigned int vin0_data10_pins[] = {
+       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
+       RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
+       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
+       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
+       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
+};
+static const unsigned int vin0_data10_mux[] = {
+       VI0_DATA0_MARK, VI0_DATA1_MARK,
+       VI0_DATA2_MARK, VI0_DATA3_MARK,
+       VI0_DATA4_MARK, VI0_DATA5_MARK,
+       VI0_DATA6_MARK, VI0_DATA7_MARK,
+       VI0_DATA8_MARK,  VI0_DATA9_MARK,
+};
+static const unsigned int vin0_data12_pins[] = {
+       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
+       RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7),
+       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9),
+       RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
+       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
+       RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 15),
+};
+static const unsigned int vin0_data12_mux[] = {
+       VI0_DATA0_MARK, VI0_DATA1_MARK,
+       VI0_DATA2_MARK, VI0_DATA3_MARK,
+       VI0_DATA4_MARK, VI0_DATA5_MARK,
+       VI0_DATA6_MARK, VI0_DATA7_MARK,
+       VI0_DATA8_MARK,  VI0_DATA9_MARK,
+       VI0_DATA10_MARK, VI0_DATA11_MARK,
+};
+static const unsigned int vin0_sync_pins[] = {
+       /* HSYNC#, VSYNC# */
+       RCAR_GP_PIN(2, 2), RCAR_GP_PIN(2, 3),
+};
+static const unsigned int vin0_sync_mux[] = {
+       VI0_HSYNC_N_MARK, VI0_VSYNC_N_MARK,
+};
+static const unsigned int vin0_field_pins[] = {
+       /* FIELD */
+       RCAR_GP_PIN(2, 16),
+};
+static const unsigned int vin0_field_mux[] = {
+       VI0_FIELD_MARK,
+};
+static const unsigned int vin0_clkenb_pins[] = {
+       /* CLKENB */
+       RCAR_GP_PIN(2, 1),
+};
+static const unsigned int vin0_clkenb_mux[] = {
+       VI0_CLKENB_MARK,
+};
+static const unsigned int vin0_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(2, 0),
+};
+static const unsigned int vin0_clk_mux[] = {
+       VI0_CLK_MARK,
+};
+
+/* - VIN1 ------------------------------------------------------------------- */
+static const unsigned int vin1_data8_pins[] = {
+       RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+};
+static const unsigned int vin1_data8_mux[] = {
+       VI1_DATA0_MARK, VI1_DATA1_MARK,
+       VI1_DATA2_MARK, VI1_DATA3_MARK,
+       VI1_DATA4_MARK, VI1_DATA5_MARK,
+       VI1_DATA6_MARK, VI1_DATA7_MARK,
+};
+static const unsigned int vin1_data10_pins[] = {
+       RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+       RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13),
+};
+static const unsigned int vin1_data10_mux[] = {
+       VI1_DATA0_MARK, VI1_DATA1_MARK,
+       VI1_DATA2_MARK, VI1_DATA3_MARK,
+       VI1_DATA4_MARK, VI1_DATA5_MARK,
+       VI1_DATA6_MARK, VI1_DATA7_MARK,
+       VI1_DATA8_MARK,  VI1_DATA9_MARK,
+};
+static const unsigned int vin1_data12_pins[] = {
+       RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+       RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13),
+       RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15),
+};
+static const unsigned int vin1_data12_mux[] = {
+       VI1_DATA0_MARK, VI1_DATA1_MARK,
+       VI1_DATA2_MARK, VI1_DATA3_MARK,
+       VI1_DATA4_MARK, VI1_DATA5_MARK,
+       VI1_DATA6_MARK, VI1_DATA7_MARK,
+       VI1_DATA8_MARK,  VI1_DATA9_MARK,
+       VI1_DATA10_MARK, VI1_DATA11_MARK,
+};
+static const unsigned int vin1_sync_pins[] = {
+       /* HSYNC#, VSYNC# */
+       RCAR_GP_PIN(3, 2), RCAR_GP_PIN(3, 3),
+};
+static const unsigned int vin1_sync_mux[] = {
+       VI1_HSYNC_N_MARK, VI1_VSYNC_N_MARK,
+};
+static const unsigned int vin1_field_pins[] = {
+       RCAR_GP_PIN(3, 16),
+};
+static const unsigned int vin1_field_mux[] = {
+       /* FIELD */
+       VI1_FIELD_MARK,
+};
+static const unsigned int vin1_clkenb_pins[] = {
+       RCAR_GP_PIN(3, 1),
+};
+static const unsigned int vin1_clkenb_mux[] = {
+       /* CLKENB */
+       VI1_CLKENB_MARK,
+};
+static const unsigned int vin1_clk_pins[] = {
+       RCAR_GP_PIN(3, 0),
+};
+static const unsigned int vin1_clk_mux[] = {
+       /* CLK */
+       VI1_CLK_MARK,
+};
+
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(canfd_clk_a),
+       SH_PFC_PIN_GROUP(canfd_clk_b),
+       SH_PFC_PIN_GROUP(canfd0_data_a),
+       SH_PFC_PIN_GROUP(canfd0_data_b),
+       SH_PFC_PIN_GROUP(canfd1_data),
+       SH_PFC_PIN_GROUP(du_rgb666),
+       SH_PFC_PIN_GROUP(du_clk_out),
+       SH_PFC_PIN_GROUP(du_sync),
+       SH_PFC_PIN_GROUP(du_oddf),
+       SH_PFC_PIN_GROUP(du_cde),
+       SH_PFC_PIN_GROUP(du_disp),
+       SH_PFC_PIN_GROUP(hscif0_data),
+       SH_PFC_PIN_GROUP(hscif0_clk),
+       SH_PFC_PIN_GROUP(hscif0_ctrl),
+       SH_PFC_PIN_GROUP(hscif1_data),
+       SH_PFC_PIN_GROUP(hscif1_clk),
+       SH_PFC_PIN_GROUP(hscif1_ctrl),
+       SH_PFC_PIN_GROUP(hscif2_data),
+       SH_PFC_PIN_GROUP(hscif2_clk),
+       SH_PFC_PIN_GROUP(hscif2_ctrl),
+       SH_PFC_PIN_GROUP(hscif3_data),
+       SH_PFC_PIN_GROUP(hscif3_clk),
+       SH_PFC_PIN_GROUP(hscif3_ctrl),
+       SH_PFC_PIN_GROUP(i2c0),
+       SH_PFC_PIN_GROUP(i2c1),
+       SH_PFC_PIN_GROUP(i2c2),
+       SH_PFC_PIN_GROUP(i2c3_a),
+       SH_PFC_PIN_GROUP(i2c3_b),
+       SH_PFC_PIN_GROUP(i2c4),
+       SH_PFC_PIN_GROUP(intc_ex_irq0),
+       SH_PFC_PIN_GROUP(intc_ex_irq1),
+       SH_PFC_PIN_GROUP(intc_ex_irq2),
+       SH_PFC_PIN_GROUP(intc_ex_irq3),
+       SH_PFC_PIN_GROUP(intc_ex_irq4),
+       SH_PFC_PIN_GROUP(intc_ex_irq5),
+       SH_PFC_PIN_GROUP(mmc_data1),
+       SH_PFC_PIN_GROUP(mmc_data4),
+       SH_PFC_PIN_GROUP(mmc_data8),
+       SH_PFC_PIN_GROUP(mmc_ctrl),
+       SH_PFC_PIN_GROUP(mmc_cd),
+       SH_PFC_PIN_GROUP(mmc_wp),
+       SH_PFC_PIN_GROUP(msiof0_clk),
+       SH_PFC_PIN_GROUP(msiof0_sync),
+       SH_PFC_PIN_GROUP(msiof0_ss1),
+       SH_PFC_PIN_GROUP(msiof0_ss2),
+       SH_PFC_PIN_GROUP(msiof0_txd),
+       SH_PFC_PIN_GROUP(msiof0_rxd),
+       SH_PFC_PIN_GROUP(msiof1_clk),
+       SH_PFC_PIN_GROUP(msiof1_sync),
+       SH_PFC_PIN_GROUP(msiof1_ss1),
+       SH_PFC_PIN_GROUP(msiof1_ss2),
+       SH_PFC_PIN_GROUP(msiof1_txd),
+       SH_PFC_PIN_GROUP(msiof1_rxd),
+       SH_PFC_PIN_GROUP(msiof2_clk),
+       SH_PFC_PIN_GROUP(msiof2_sync),
+       SH_PFC_PIN_GROUP(msiof2_ss1),
+       SH_PFC_PIN_GROUP(msiof2_ss2),
+       SH_PFC_PIN_GROUP(msiof2_txd),
+       SH_PFC_PIN_GROUP(msiof2_rxd),
+       SH_PFC_PIN_GROUP(msiof3_clk),
+       SH_PFC_PIN_GROUP(msiof3_sync),
+       SH_PFC_PIN_GROUP(msiof3_ss1),
+       SH_PFC_PIN_GROUP(msiof3_ss2),
+       SH_PFC_PIN_GROUP(msiof3_txd),
+       SH_PFC_PIN_GROUP(msiof3_rxd),
+       SH_PFC_PIN_GROUP(pwm0_a),
+       SH_PFC_PIN_GROUP(pwm0_b),
+       SH_PFC_PIN_GROUP(pwm1_a),
+       SH_PFC_PIN_GROUP(pwm1_b),
+       SH_PFC_PIN_GROUP(pwm2_a),
+       SH_PFC_PIN_GROUP(pwm2_b),
+       SH_PFC_PIN_GROUP(pwm3_a),
+       SH_PFC_PIN_GROUP(pwm3_b),
+       SH_PFC_PIN_GROUP(pwm4_a),
+       SH_PFC_PIN_GROUP(pwm4_b),
+       SH_PFC_PIN_GROUP(scif_clk_a),
+       SH_PFC_PIN_GROUP(scif_clk_b),
+       SH_PFC_PIN_GROUP(scif0_data),
+       SH_PFC_PIN_GROUP(scif0_clk),
+       SH_PFC_PIN_GROUP(scif0_ctrl),
+       SH_PFC_PIN_GROUP(scif1_data_a),
+       SH_PFC_PIN_GROUP(scif1_clk),
+       SH_PFC_PIN_GROUP(scif1_ctrl),
+       SH_PFC_PIN_GROUP(scif1_data_b),
+       SH_PFC_PIN_GROUP(scif3_data),
+       SH_PFC_PIN_GROUP(scif3_clk),
+       SH_PFC_PIN_GROUP(scif3_ctrl),
+       SH_PFC_PIN_GROUP(scif4_data),
+       SH_PFC_PIN_GROUP(scif4_clk),
+       SH_PFC_PIN_GROUP(scif4_ctrl),
+       SH_PFC_PIN_GROUP(tmu_tclk1_a),
+       SH_PFC_PIN_GROUP(tmu_tclk1_b),
+       SH_PFC_PIN_GROUP(tmu_tclk2_a),
+       SH_PFC_PIN_GROUP(tmu_tclk2_b),
+       SH_PFC_PIN_GROUP(vin0_data8),
+       SH_PFC_PIN_GROUP(vin0_data10),
+       SH_PFC_PIN_GROUP(vin0_data12),
+       SH_PFC_PIN_GROUP(vin0_sync),
+       SH_PFC_PIN_GROUP(vin0_field),
+       SH_PFC_PIN_GROUP(vin0_clkenb),
+       SH_PFC_PIN_GROUP(vin0_clk),
+       SH_PFC_PIN_GROUP(vin1_data8),
+       SH_PFC_PIN_GROUP(vin1_data10),
+       SH_PFC_PIN_GROUP(vin1_data12),
+       SH_PFC_PIN_GROUP(vin1_sync),
+       SH_PFC_PIN_GROUP(vin1_field),
+       SH_PFC_PIN_GROUP(vin1_clkenb),
+       SH_PFC_PIN_GROUP(vin1_clk),
+};
+
+static const char * const canfd_clk_groups[] = {
+       "canfd_clk_a",
+       "canfd_clk_b",
+};
+
+static const char * const canfd0_groups[] = {
+       "canfd0_data_a",
+       "canfd0_data_b",
+};
+
+static const char * const canfd1_groups[] = {
+       "canfd1_data",
+};
+
+static const char * const du_groups[] = {
+       "du_rgb666",
+       "du_clk_out",
+       "du_sync",
+       "du_oddf",
+       "du_cde",
+       "du_disp",
+};
+
+static const char * const hscif0_groups[] = {
+       "hscif0_data",
+       "hscif0_clk",
+       "hscif0_ctrl",
+};
+
+static const char * const hscif1_groups[] = {
+       "hscif1_data",
+       "hscif1_clk",
+       "hscif1_ctrl",
+};
+
+static const char * const hscif2_groups[] = {
+       "hscif2_data",
+       "hscif2_clk",
+       "hscif2_ctrl",
+};
+
+static const char * const hscif3_groups[] = {
+       "hscif3_data",
+       "hscif3_clk",
+       "hscif3_ctrl",
+};
+
+static const char * const i2c0_groups[] = {
+       "i2c0",
+};
+
+static const char * const i2c1_groups[] = {
+       "i2c1",
+};
+
+static const char * const i2c2_groups[] = {
+       "i2c2",
+};
+
+static const char * const i2c3_groups[] = {
+       "i2c3_a",
+       "i2c3_b",
+};
+
+static const char * const i2c4_groups[] = {
+       "i2c4",
+};
+
+static const char * const intc_ex_groups[] = {
+       "intc_ex_irq0",
+       "intc_ex_irq1",
+       "intc_ex_irq2",
+       "intc_ex_irq3",
+       "intc_ex_irq4",
+       "intc_ex_irq5",
+};
+
+static const char * const mmc_groups[] = {
+       "mmc_data1",
+       "mmc_data4",
+       "mmc_data8",
+       "mmc_ctrl",
+       "mmc_cd",
+       "mmc_wp",
+};
+
+static const char * const msiof0_groups[] = {
+       "msiof0_clk",
+       "msiof0_sync",
+       "msiof0_ss1",
+       "msiof0_ss2",
+       "msiof0_txd",
+       "msiof0_rxd",
+};
+
+static const char * const msiof1_groups[] = {
+       "msiof1_clk",
+       "msiof1_sync",
+       "msiof1_ss1",
+       "msiof1_ss2",
+       "msiof1_txd",
+       "msiof1_rxd",
+};
+
+static const char * const msiof2_groups[] = {
+       "msiof2_clk",
+       "msiof2_sync",
+       "msiof2_ss1",
+       "msiof2_ss2",
+       "msiof2_txd",
+       "msiof2_rxd",
+};
+
+static const char * const msiof3_groups[] = {
+       "msiof3_clk",
+       "msiof3_sync",
+       "msiof3_ss1",
+       "msiof3_ss2",
+       "msiof3_txd",
+       "msiof3_rxd",
+};
+
+static const char * const pwm0_groups[] = {
+       "pwm0_a",
+       "pwm0_b",
+};
+
+static const char * const pwm1_groups[] = {
+       "pwm1_a",
+       "pwm1_b",
+};
+
+static const char * const pwm2_groups[] = {
+       "pwm2_a",
+       "pwm2_b",
+};
+
+static const char * const pwm3_groups[] = {
+       "pwm3_a",
+       "pwm3_b",
+};
+
+static const char * const pwm4_groups[] = {
+       "pwm4_a",
+       "pwm4_b",
+};
+
+static const char * const scif_clk_groups[] = {
+       "scif_clk_a",
+       "scif_clk_b",
+};
+
+static const char * const scif0_groups[] = {
+       "scif0_data",
+       "scif0_clk",
+       "scif0_ctrl",
+};
+
+static const char * const scif1_groups[] = {
+       "scif1_data_a",
+       "scif1_clk",
+       "scif1_ctrl",
+       "scif1_data_b",
+};
+
+static const char * const scif3_groups[] = {
+       "scif3_data",
+       "scif3_clk",
+       "scif3_ctrl",
+};
+
+static const char * const scif4_groups[] = {
+       "scif4_data",
+       "scif4_clk",
+       "scif4_ctrl",
+};
+
+static const char * const tmu_groups[] = {
+       "tmu_tclk1_a",
+       "tmu_tclk1_b",
+       "tmu_tclk2_a",
+       "tmu_tclk2_b",
+};
+
+static const char * const vin0_groups[] = {
+       "vin0_data8",
+       "vin0_data10",
+       "vin0_data12",
+       "vin0_sync",
+       "vin0_field",
+       "vin0_clkenb",
+       "vin0_clk",
+};
+
+static const char * const vin1_groups[] = {
+       "vin1_data8",
+       "vin1_data10",
+       "vin1_data12",
+       "vin1_sync",
+       "vin1_field",
+       "vin1_clkenb",
+       "vin1_clk",
+};
+
+static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(canfd_clk),
+       SH_PFC_FUNCTION(canfd0),
+       SH_PFC_FUNCTION(canfd1),
+       SH_PFC_FUNCTION(du),
+       SH_PFC_FUNCTION(hscif0),
+       SH_PFC_FUNCTION(hscif1),
+       SH_PFC_FUNCTION(hscif2),
+       SH_PFC_FUNCTION(hscif3),
+       SH_PFC_FUNCTION(i2c0),
+       SH_PFC_FUNCTION(i2c1),
+       SH_PFC_FUNCTION(i2c2),
+       SH_PFC_FUNCTION(i2c3),
+       SH_PFC_FUNCTION(i2c4),
+       SH_PFC_FUNCTION(intc_ex),
+       SH_PFC_FUNCTION(mmc),
+       SH_PFC_FUNCTION(msiof0),
+       SH_PFC_FUNCTION(msiof1),
+       SH_PFC_FUNCTION(msiof2),
+       SH_PFC_FUNCTION(msiof3),
+       SH_PFC_FUNCTION(pwm0),
+       SH_PFC_FUNCTION(pwm1),
+       SH_PFC_FUNCTION(pwm2),
+       SH_PFC_FUNCTION(pwm3),
+       SH_PFC_FUNCTION(pwm4),
+       SH_PFC_FUNCTION(scif_clk),
+       SH_PFC_FUNCTION(scif0),
+       SH_PFC_FUNCTION(scif1),
+       SH_PFC_FUNCTION(scif3),
+       SH_PFC_FUNCTION(scif4),
+       SH_PFC_FUNCTION(tmu),
+       SH_PFC_FUNCTION(vin0),
+       SH_PFC_FUNCTION(vin1),
+};
+
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
+#define F_(x, y)       FN_##y
+#define FM(x)          FN_##x
+       { PINMUX_CFG_REG("GPSR0", 0xe6060100, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_0_21_FN,     GPSR0_21,
+               GP_0_20_FN,     GPSR0_20,
+               GP_0_19_FN,     GPSR0_19,
+               GP_0_18_FN,     GPSR0_18,
+               GP_0_17_FN,     GPSR0_17,
+               GP_0_16_FN,     GPSR0_16,
+               GP_0_15_FN,     GPSR0_15,
+               GP_0_14_FN,     GPSR0_14,
+               GP_0_13_FN,     GPSR0_13,
+               GP_0_12_FN,     GPSR0_12,
+               GP_0_11_FN,     GPSR0_11,
+               GP_0_10_FN,     GPSR0_10,
+               GP_0_9_FN,      GPSR0_9,
+               GP_0_8_FN,      GPSR0_8,
+               GP_0_7_FN,      GPSR0_7,
+               GP_0_6_FN,      GPSR0_6,
+               GP_0_5_FN,      GPSR0_5,
+               GP_0_4_FN,      GPSR0_4,
+               GP_0_3_FN,      GPSR0_3,
+               GP_0_2_FN,      GPSR0_2,
+               GP_0_1_FN,      GPSR0_1,
+               GP_0_0_FN,      GPSR0_0, }
+       },
+       { PINMUX_CFG_REG("GPSR1", 0xe6060104, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_1_27_FN,     GPSR1_27,
+               GP_1_26_FN,     GPSR1_26,
+               GP_1_25_FN,     GPSR1_25,
+               GP_1_24_FN,     GPSR1_24,
+               GP_1_23_FN,     GPSR1_23,
+               GP_1_22_FN,     GPSR1_22,
+               GP_1_21_FN,     GPSR1_21,
+               GP_1_20_FN,     GPSR1_20,
+               GP_1_19_FN,     GPSR1_19,
+               GP_1_18_FN,     GPSR1_18,
+               GP_1_17_FN,     GPSR1_17,
+               GP_1_16_FN,     GPSR1_16,
+               GP_1_15_FN,     GPSR1_15,
+               GP_1_14_FN,     GPSR1_14,
+               GP_1_13_FN,     GPSR1_13,
+               GP_1_12_FN,     GPSR1_12,
+               GP_1_11_FN,     GPSR1_11,
+               GP_1_10_FN,     GPSR1_10,
+               GP_1_9_FN,      GPSR1_9,
+               GP_1_8_FN,      GPSR1_8,
+               GP_1_7_FN,      GPSR1_7,
+               GP_1_6_FN,      GPSR1_6,
+               GP_1_5_FN,      GPSR1_5,
+               GP_1_4_FN,      GPSR1_4,
+               GP_1_3_FN,      GPSR1_3,
+               GP_1_2_FN,      GPSR1_2,
+               GP_1_1_FN,      GPSR1_1,
+               GP_1_0_FN,      GPSR1_0, }
+       },
+       { PINMUX_CFG_REG("GPSR2", 0xe6060108, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_2_16_FN,     GPSR2_16,
+               GP_2_15_FN,     GPSR2_15,
+               GP_2_14_FN,     GPSR2_14,
+               GP_2_13_FN,     GPSR2_13,
+               GP_2_12_FN,     GPSR2_12,
+               GP_2_11_FN,     GPSR2_11,
+               GP_2_10_FN,     GPSR2_10,
+               GP_2_9_FN,      GPSR2_9,
+               GP_2_8_FN,      GPSR2_8,
+               GP_2_7_FN,      GPSR2_7,
+               GP_2_6_FN,      GPSR2_6,
+               GP_2_5_FN,      GPSR2_5,
+               GP_2_4_FN,      GPSR2_4,
+               GP_2_3_FN,      GPSR2_3,
+               GP_2_2_FN,      GPSR2_2,
+               GP_2_1_FN,      GPSR2_1,
+               GP_2_0_FN,      GPSR2_0, }
+       },
+       { PINMUX_CFG_REG("GPSR3", 0xe606010c, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_3_16_FN,     GPSR3_16,
+               GP_3_15_FN,     GPSR3_15,
+               GP_3_14_FN,     GPSR3_14,
+               GP_3_13_FN,     GPSR3_13,
+               GP_3_12_FN,     GPSR3_12,
+               GP_3_11_FN,     GPSR3_11,
+               GP_3_10_FN,     GPSR3_10,
+               GP_3_9_FN,      GPSR3_9,
+               GP_3_8_FN,      GPSR3_8,
+               GP_3_7_FN,      GPSR3_7,
+               GP_3_6_FN,      GPSR3_6,
+               GP_3_5_FN,      GPSR3_5,
+               GP_3_4_FN,      GPSR3_4,
+               GP_3_3_FN,      GPSR3_3,
+               GP_3_2_FN,      GPSR3_2,
+               GP_3_1_FN,      GPSR3_1,
+               GP_3_0_FN,      GPSR3_0, }
+       },
+       { PINMUX_CFG_REG("GPSR4", 0xe6060110, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_4_5_FN,      GPSR4_5,
+               GP_4_4_FN,      GPSR4_4,
+               GP_4_3_FN,      GPSR4_3,
+               GP_4_2_FN,      GPSR4_2,
+               GP_4_1_FN,      GPSR4_1,
+               GP_4_0_FN,      GPSR4_0, }
+       },
+       { PINMUX_CFG_REG("GPSR5", 0xe6060114, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_5_14_FN,     GPSR5_14,
+               GP_5_13_FN,     GPSR5_13,
+               GP_5_12_FN,     GPSR5_12,
+               GP_5_11_FN,     GPSR5_11,
+               GP_5_10_FN,     GPSR5_10,
+               GP_5_9_FN,      GPSR5_9,
+               GP_5_8_FN,      GPSR5_8,
+               GP_5_7_FN,      GPSR5_7,
+               GP_5_6_FN,      GPSR5_6,
+               GP_5_5_FN,      GPSR5_5,
+               GP_5_4_FN,      GPSR5_4,
+               GP_5_3_FN,      GPSR5_3,
+               GP_5_2_FN,      GPSR5_2,
+               GP_5_1_FN,      GPSR5_1,
+               GP_5_0_FN,      GPSR5_0, }
+       },
+#undef F_
+#undef FM
+
+#define F_(x, y)       x,
+#define FM(x)          FN_##x,
+       { PINMUX_CFG_REG("IPSR0", 0xe6060200, 32, 4) {
+               IP0_31_28
+               IP0_27_24
+               IP0_23_20
+               IP0_19_16
+               IP0_15_12
+               IP0_11_8
+               IP0_7_4
+               IP0_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR1", 0xe6060204, 32, 4) {
+               IP1_31_28
+               IP1_27_24
+               IP1_23_20
+               IP1_19_16
+               IP1_15_12
+               IP1_11_8
+               IP1_7_4
+               IP1_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR2", 0xe6060208, 32, 4) {
+               IP2_31_28
+               IP2_27_24
+               IP2_23_20
+               IP2_19_16
+               IP2_15_12
+               IP2_11_8
+               IP2_7_4
+               IP2_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR3", 0xe606020c, 32, 4) {
+               IP3_31_28
+               IP3_27_24
+               IP3_23_20
+               IP3_19_16
+               IP3_15_12
+               IP3_11_8
+               IP3_7_4
+               IP3_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR4", 0xe6060210, 32, 4) {
+               IP4_31_28
+               IP4_27_24
+               IP4_23_20
+               IP4_19_16
+               IP4_15_12
+               IP4_11_8
+               IP4_7_4
+               IP4_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR5", 0xe6060214, 32, 4) {
+               IP5_31_28
+               IP5_27_24
+               IP5_23_20
+               IP5_19_16
+               IP5_15_12
+               IP5_11_8
+               IP5_7_4
+               IP5_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR6", 0xe6060218, 32, 4) {
+               IP6_31_28
+               IP6_27_24
+               IP6_23_20
+               IP6_19_16
+               IP6_15_12
+               IP6_11_8
+               IP6_7_4
+               IP6_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR7", 0xe606021c, 32, 4) {
+               IP7_31_28
+               IP7_27_24
+               IP7_23_20
+               IP7_19_16
+               IP7_15_12
+               IP7_11_8
+               IP7_7_4
+               IP7_3_0 }
+       },
+       { PINMUX_CFG_REG("IPSR8", 0xe6060220, 32, 4) {
+               IP8_31_28
+               IP8_27_24
+               IP8_23_20
+               IP8_19_16
+               IP8_15_12
+               IP8_11_8
+               IP8_7_4
+               IP8_3_0 }
+       },
+#undef F_
+#undef FM
+
+#define F_(x, y)       x,
+#define FM(x)          FN_##x,
+       { PINMUX_CFG_REG_VAR("MOD_SEL0", 0xe6060500, 32,
+                            4, 4, 4, 4,
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) {
+               /* RESERVED 31, 30, 29, 28 */
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED 27, 26, 25, 24 */
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED 23, 22, 21, 20 */
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED 19, 18, 17, 16 */
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED 15, 14, 13, 12 */
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               MOD_SEL0_11
+               MOD_SEL0_10
+               MOD_SEL0_9
+               MOD_SEL0_8
+               MOD_SEL0_7
+               MOD_SEL0_6
+               MOD_SEL0_5
+               MOD_SEL0_4
+               MOD_SEL0_3
+               MOD_SEL0_2
+               MOD_SEL0_1
+               MOD_SEL0_0 }
+       },
+       { },
+};
+
+static int r8a77970_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin,
+                                  u32 *pocctrl)
+{
+       int bit = pin & 0x1f;
+
+       *pocctrl = 0xe6060380;
+       if (pin >= RCAR_GP_PIN(0, 0) && pin <= RCAR_GP_PIN(0, 21))
+               return bit;
+       if (pin >= RCAR_GP_PIN(2, 0) && pin <= RCAR_GP_PIN(2, 9))
+               return bit + 22;
+
+       *pocctrl += 4;
+       if (pin >= RCAR_GP_PIN(2, 10) && pin <= RCAR_GP_PIN(2, 16))
+               return bit - 10;
+       if (pin >= RCAR_GP_PIN(3, 0) && pin <= RCAR_GP_PIN(3, 16))
+               return bit + 7;
+
+       return -EINVAL;
+}
+
+static const struct sh_pfc_soc_operations pinmux_ops = {
+       .pin_to_pocctrl = r8a77970_pin_to_pocctrl,
+};
+
+const struct sh_pfc_soc_info r8a77970_pinmux_info = {
+       .name = "r8a77970_pfc",
+       .ops = &pinmux_ops,
+       .unlock_reg = 0xe6060000, /* PMMR */
+
+       .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
+
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .groups = pinmux_groups,
+       .nr_groups = ARRAY_SIZE(pinmux_groups),
+       .functions = pinmux_functions,
+       .nr_functions = ARRAY_SIZE(pinmux_functions),
+
+       .cfg_regs = pinmux_config_regs,
+
+       .pinmux_data = pinmux_data,
+       .pinmux_data_size = ARRAY_SIZE(pinmux_data),
+};
index 89b7541ab1ed9eac704afe1d7adf804b99cbc694..a4927b78a17bc46e1c59e669e558807d17e4629b 100644 (file)
@@ -518,6 +518,8 @@ static const u16 pinmux_data[] = {
        PINMUX_SINGLE(QSPI0_MISO_IO1),
        PINMUX_SINGLE(QSPI0_MOSI_IO0),
        PINMUX_SINGLE(QSPI0_SPCLK),
+       PINMUX_SINGLE(SCL0),
+       PINMUX_SINGLE(SDA0),
 
        /* IPSR0 */
        PINMUX_IPSR_MSEL(IP0_3_0,       IRQ0_A, SEL_IRQ_0_0),
@@ -1057,6 +1059,61 @@ static const unsigned int avb0_avtp_capture_b_mux[] = {
        AVB0_AVTP_CAPTURE_B_MARK,
 };
 
+/* - CAN ------------------------------------------------------------------ */
+static const unsigned int can0_data_a_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 31),
+};
+static const unsigned int can0_data_a_mux[] = {
+       CAN0_TX_A_MARK, CAN0_RX_A_MARK,
+};
+static const unsigned int can0_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(4, 22), RCAR_GP_PIN(4, 5),
+};
+static const unsigned int can0_data_b_mux[] = {
+       CAN0_TX_B_MARK, CAN0_RX_B_MARK,
+};
+static const unsigned int can1_data_a_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(4, 30), RCAR_GP_PIN(4, 29),
+};
+static const unsigned int can1_data_a_mux[] = {
+       CAN1_TX_A_MARK, CAN1_RX_A_MARK,
+};
+static const unsigned int can1_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(4, 7), RCAR_GP_PIN(4, 6),
+};
+static const unsigned int can1_data_b_mux[] = {
+       CAN1_TX_B_MARK, CAN1_RX_B_MARK,
+};
+
+/* - CAN Clock -------------------------------------------------------------- */
+static const unsigned int can_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(5, 2),
+};
+static const unsigned int can_clk_mux[] = {
+       CAN_CLK_MARK,
+};
+
+/* - CAN FD ----------------------------------------------------------------- */
+static const unsigned int canfd0_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 31),
+};
+static const unsigned int canfd0_data_mux[] = {
+       CANFD0_TX_MARK, CANFD0_RX_MARK,
+};
+static const unsigned int canfd1_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(4, 30), RCAR_GP_PIN(4, 29),
+};
+static const unsigned int canfd1_data_mux[] = {
+       CANFD1_TX_MARK, CANFD1_RX_MARK,
+};
+
 /* - I2C -------------------------------------------------------------------- */
 static const unsigned int i2c0_pins[] = {
        /* SCL, SDA */
@@ -1504,6 +1561,13 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(avb0_avtp_pps_b),
        SH_PFC_PIN_GROUP(avb0_avtp_match_b),
        SH_PFC_PIN_GROUP(avb0_avtp_capture_b),
+       SH_PFC_PIN_GROUP(can0_data_a),
+       SH_PFC_PIN_GROUP(can0_data_b),
+       SH_PFC_PIN_GROUP(can1_data_a),
+       SH_PFC_PIN_GROUP(can1_data_b),
+       SH_PFC_PIN_GROUP(can_clk),
+       SH_PFC_PIN_GROUP(canfd0_data),
+       SH_PFC_PIN_GROUP(canfd1_data),
        SH_PFC_PIN_GROUP(i2c0),
        SH_PFC_PIN_GROUP(i2c1),
        SH_PFC_PIN_GROUP(i2c2_a),
@@ -1581,6 +1645,25 @@ static const char * const avb0_groups[] = {
        "avb0_avtp_capture_b",
 };
 
+static const char * const can0_groups[] = {
+       "can0_data_a",
+       "can0_data_b",
+};
+static const char * const can1_groups[] = {
+       "can1_data_a",
+       "can1_data_b",
+};
+static const char * const can_clk_groups[] = {
+       "can_clk",
+};
+
+static const char * const canfd0_groups[] = {
+       "canfd0_data",
+};
+static const char * const canfd1_groups[] = {
+       "canfd1_data",
+};
+
 static const char * const i2c0_groups[] = {
        "i2c0",
 };
@@ -1691,6 +1774,11 @@ static const char * const usb0_groups[] = {
 static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(audio_clk),
        SH_PFC_FUNCTION(avb0),
+       SH_PFC_FUNCTION(can0),
+       SH_PFC_FUNCTION(can1),
+       SH_PFC_FUNCTION(can_clk),
+       SH_PFC_FUNCTION(canfd0),
+       SH_PFC_FUNCTION(canfd1),
        SH_PFC_FUNCTION(i2c0),
        SH_PFC_FUNCTION(i2c1),
        SH_PFC_FUNCTION(i2c2),
index 213108a058feefb0a9794d04158b2a34166902c5..5747ab0472df34826111ed4055b0dfa8de37fdd6 100644 (file)
@@ -283,6 +283,7 @@ extern const struct sh_pfc_soc_info r8a7794_pinmux_info;
 extern const struct sh_pfc_soc_info r8a7795_pinmux_info;
 extern const struct sh_pfc_soc_info r8a7795es1_pinmux_info;
 extern const struct sh_pfc_soc_info r8a7796_pinmux_info;
+extern const struct sh_pfc_soc_info r8a77970_pinmux_info;
 extern const struct sh_pfc_soc_info r8a77995_pinmux_info;
 extern const struct sh_pfc_soc_info sh7203_pinmux_info;
 extern const struct sh_pfc_soc_info sh7264_pinmux_info;
@@ -389,10 +390,14 @@ extern const struct sh_pfc_soc_info shx3_pinmux_info;
        PORT_GP_CFG_1(bank, 3,  fn, sfx, cfg)
 #define PORT_GP_4(bank, fn, sfx)       PORT_GP_CFG_4(bank, fn, sfx, 0)
 
-#define PORT_GP_CFG_8(bank, fn, sfx, cfg)                              \
+#define PORT_GP_CFG_6(bank, fn, sfx, cfg)                              \
        PORT_GP_CFG_4(bank, fn, sfx, cfg),                              \
        PORT_GP_CFG_1(bank, 4,  fn, sfx, cfg),                          \
-       PORT_GP_CFG_1(bank, 5,  fn, sfx, cfg),                          \
+       PORT_GP_CFG_1(bank, 5,  fn, sfx, cfg)
+#define PORT_GP_6(bank, fn, sfx)       PORT_GP_CFG_6(bank, fn, sfx, 0)
+
+#define PORT_GP_CFG_8(bank, fn, sfx, cfg)                              \
+       PORT_GP_CFG_6(bank, fn, sfx, cfg),                              \
        PORT_GP_CFG_1(bank, 6,  fn, sfx, cfg),                          \
        PORT_GP_CFG_1(bank, 7,  fn, sfx, cfg)
 #define PORT_GP_8(bank, fn, sfx)       PORT_GP_CFG_8(bank, fn, sfx, 0)
@@ -450,9 +455,13 @@ extern const struct sh_pfc_soc_info shx3_pinmux_info;
        PORT_GP_CFG_1(bank, 20, fn, sfx, cfg)
 #define PORT_GP_21(bank, fn, sfx)      PORT_GP_CFG_21(bank, fn, sfx, 0)
 
-#define PORT_GP_CFG_23(bank, fn, sfx, cfg)                             \
+#define PORT_GP_CFG_22(bank, fn, sfx, cfg)                             \
        PORT_GP_CFG_21(bank, fn, sfx, cfg),                             \
-       PORT_GP_CFG_1(bank, 21, fn, sfx, cfg),                          \
+       PORT_GP_CFG_1(bank, 21, fn, sfx, cfg)
+#define PORT_GP_22(bank, fn, sfx)      PORT_GP_CFG_22(bank, fn, sfx, 0)
+
+#define PORT_GP_CFG_23(bank, fn, sfx, cfg)                             \
+       PORT_GP_CFG_22(bank, fn, sfx, cfg),                             \
        PORT_GP_CFG_1(bank, 22, fn, sfx, cfg)
 #define PORT_GP_23(bank, fn, sfx)      PORT_GP_CFG_23(bank, fn, sfx, 0)
 
index 6a0ed8ab33b989069959191b5f5f59fd84ccde0f..d2123e396b29c8e7bd8557dc623a496f19faa3d7 100644 (file)
@@ -519,10 +519,8 @@ static int plgpio_probe(struct platform_device *pdev)
        int ret, irq;
 
        plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL);
-       if (!plgpio) {
-               dev_err(&pdev->dev, "memory allocation fail\n");
+       if (!plgpio)
                return -ENOMEM;
-       }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        plgpio->base = devm_ioremap_resource(&pdev->dev, res);
@@ -544,10 +542,8 @@ static int plgpio_probe(struct platform_device *pdev)
                        sizeof(*plgpio->csave_regs) *
                        DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG),
                        GFP_KERNEL);
-       if (!plgpio->csave_regs) {
-               dev_err(&pdev->dev, "csave registers memory allocation fail\n");
+       if (!plgpio->csave_regs)
                return -ENOMEM;
-       }
 #endif
 
        platform_set_drvdata(pdev, plgpio);
index 4db52ba38d8d3f8ca92cb3d12f780b18b4d0a794..efe79d3f76596102a5c264c3065e37c4ccbdc3ab 100644 (file)
@@ -361,10 +361,8 @@ int spear_pinctrl_probe(struct platform_device *pdev,
                return -ENODEV;
 
        pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
-       if (!pmx) {
-               dev_err(&pdev->dev, "Can't alloc spear_pmx\n");
+       if (!pmx)
                return -ENOMEM;
-       }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        pmx->vbase = devm_ioremap_resource(&pdev->dev, res);
index 63529911445c7815bd5b455db7d73fe03c328a77..ba1c2ca406e42450d6c1fe04fe5922fca4bae29b 100644 (file)
@@ -818,7 +818,7 @@ static void sprd_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
 
        grp = &info->groups[selector];
 
-       seq_printf(s, "\n");
+       seq_putc(s, '\n');
        for (i = 0; i < grp->npins; i++, config++) {
                unsigned int pin_id = grp->pins[i];
 
index 7e1fe39a56a5592040b02c961c08ebe5087ed28c..1c4e00b2eb65e9d81fce19020ab0c1b985561ef9 100644 (file)
@@ -27,9 +27,21 @@ config PINCTRL_STM32F746
        default MACH_STM32F746
        select PINCTRL_STM32
 
+config PINCTRL_STM32F769
+       bool "STMicroelectronics STM32F769 pin control" if COMPILE_TEST && !MACH_STM32F769
+       depends on OF
+       default MACH_STM32F769
+       select PINCTRL_STM32
+
 config PINCTRL_STM32H743
        bool "STMicroelectronics STM32H743 pin control" if COMPILE_TEST && !MACH_STM32H743
        depends on OF
        default MACH_STM32H743
        select PINCTRL_STM32
+
+config PINCTRL_STM32MP157
+       bool "STMicroelectronics STM32MP157 pin control" if COMPILE_TEST && !MACH_STM32MP157
+       depends on OF
+       default MACH_STM32MP157
+       select PINCTRL_STM32
 endif
index d13ca35734863514a54fd0c5c50902bfa6ea4129..f7c56d4b941cf9e8a8f15d746b4f8cdfaf19d3d8 100644 (file)
@@ -6,4 +6,6 @@ obj-$(CONFIG_PINCTRL_STM32) += pinctrl-stm32.o
 obj-$(CONFIG_PINCTRL_STM32F429)        += pinctrl-stm32f429.o
 obj-$(CONFIG_PINCTRL_STM32F469)        += pinctrl-stm32f469.o
 obj-$(CONFIG_PINCTRL_STM32F746)        += pinctrl-stm32f746.o
+obj-$(CONFIG_PINCTRL_STM32F769)        += pinctrl-stm32f769.o
 obj-$(CONFIG_PINCTRL_STM32H743)        += pinctrl-stm32h743.o
+obj-$(CONFIG_PINCTRL_STM32MP157) += pinctrl-stm32mp157.o
index e62ab087bfd8afd788236d11137405d4abfca3f5..617df163067fef8cdc6b8530c91b6d3ab0ce3e9d 100644 (file)
@@ -1,7 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (C) Maxime Coquelin 2015
+ * Copyright (C) STMicroelectronics 2017
  * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
- * License terms:  GNU General Public License (GPL), version 2
  *
  * Heavily based on Mediatek's pinctrl driver
  */
index 8702a9992ce59ec3b616c694be5139c202e267e2..473a6238a27bfa9c0c6c27e32425a51278abff63 100644 (file)
@@ -1,7 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (C) Maxime Coquelin 2015
+ * Copyright (C) STMicroelectronics 2017
  * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
- * License terms:  GNU General Public License (GPL), version 2
  */
 #ifndef __PINCTRL_STM32_H
 #define __PINCTRL_STM32_H
index 4bbade25acc6edbc695adf8df5c8536bc20d9f60..663a97113c5171b6b31417cd41da05c8b9b8306d 100644 (file)
@@ -1,7 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (C) Maxime Coquelin 2015
+ * Copyright (C) STMicroelectronics 2017
  * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
- * License terms:  GNU General Public License (GPL), version 2
  */
 #include <linux/init.h>
 #include <linux/of.h>
index 86c8cebfa9b9ef3ce7b0918091a62e3af23b802e..ed5397f6d7f2991b617bbe511d58429de6460b7e 100644 (file)
@@ -1,7 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
- * Copyright (C) Alexandre Torgue 2016
- * Author:  Alexandre Torgue <alexandre.torgue@st.com>
- * License terms:  GNU General Public License (GPL), version 2
+ * Copyright (C) STMicroelectronics 2017
+ * Author:  Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
  */
 #include <linux/init.h>
 #include <linux/of.h>
index a2fae7357c369366c5f7c1282d3945c6e95d7942..d832aab7ebe1178f5ca0a3eb8af42faf882fa06e 100644 (file)
@@ -1,7 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (C) Maxime Coquelin 2015
+ * Copyright (C) STMicroelectronics 2017
  * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
- * License terms:  GNU General Public License (GPL), version 2
  */
 #include <linux/init.h>
 #include <linux/of.h>
diff --git a/drivers/pinctrl/stm32/pinctrl-stm32f769.c b/drivers/pinctrl/stm32/pinctrl-stm32f769.c
new file mode 100644 (file)
index 0000000..f81c51c
--- /dev/null
@@ -0,0 +1,1827 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) STMicroelectronics 2017
+ * Author:  Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+#include <linux/init.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+#include "pinctrl-stm32.h"
+
+static const struct stm32_desc_pin stm32f769_pins[] = {
+       STM32_PIN(
+               PINCTRL_PIN(0, "PA0"),
+               STM32_FUNCTION(0, "GPIOA0"),
+               STM32_FUNCTION(2, "TIM2_CH1 TIM2_ETR"),
+               STM32_FUNCTION(3, "TIM5_CH1"),
+               STM32_FUNCTION(4, "TIM8_ETR"),
+               STM32_FUNCTION(8, "USART2_CTS"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(11, "SAI2_SD_B"),
+               STM32_FUNCTION(12, "ETH_MII_CRS"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(1, "PA1"),
+               STM32_FUNCTION(0, "GPIOA1"),
+               STM32_FUNCTION(2, "TIM2_CH2"),
+               STM32_FUNCTION(3, "TIM5_CH2"),
+               STM32_FUNCTION(8, "USART2_RTS"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO3"),
+               STM32_FUNCTION(11, "SAI2_MCLK_B"),
+               STM32_FUNCTION(12, "ETH_MII_RX_CLK ETH_RMII_REF_CLK"),
+               STM32_FUNCTION(15, "LCD_R2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(2, "PA2"),
+               STM32_FUNCTION(0, "GPIOA2"),
+               STM32_FUNCTION(2, "TIM2_CH3"),
+               STM32_FUNCTION(3, "TIM5_CH3"),
+               STM32_FUNCTION(4, "TIM9_CH1"),
+               STM32_FUNCTION(8, "USART2_TX"),
+               STM32_FUNCTION(9, "SAI2_SCK_B"),
+               STM32_FUNCTION(12, "ETH_MDIO"),
+               STM32_FUNCTION(13, "MDIOS_MDIO"),
+               STM32_FUNCTION(15, "LCD_R1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(3, "PA3"),
+               STM32_FUNCTION(0, "GPIOA3"),
+               STM32_FUNCTION(2, "TIM2_CH4"),
+               STM32_FUNCTION(3, "TIM5_CH4"),
+               STM32_FUNCTION(4, "TIM9_CH2"),
+               STM32_FUNCTION(8, "USART2_RX"),
+               STM32_FUNCTION(10, "LCD_B2"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_D0"),
+               STM32_FUNCTION(12, "ETH_MII_COL"),
+               STM32_FUNCTION(15, "LCD_B5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(4, "PA4"),
+               STM32_FUNCTION(0, "GPIOA4"),
+               STM32_FUNCTION(6, "SPI1_NSS I2S1_WS"),
+               STM32_FUNCTION(7, "SPI3_NSS I2S3_WS"),
+               STM32_FUNCTION(8, "USART2_CK"),
+               STM32_FUNCTION(9, "SPI6_NSS"),
+               STM32_FUNCTION(13, "OTG_HS_SOF"),
+               STM32_FUNCTION(14, "DCMI_HSYNC"),
+               STM32_FUNCTION(15, "LCD_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(5, "PA5"),
+               STM32_FUNCTION(0, "GPIOA5"),
+               STM32_FUNCTION(2, "TIM2_CH1 TIM2_ETR"),
+               STM32_FUNCTION(4, "TIM8_CH1N"),
+               STM32_FUNCTION(6, "SPI1_SCK I2S1_CK"),
+               STM32_FUNCTION(9, "SPI6_SCK"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_CK"),
+               STM32_FUNCTION(15, "LCD_R4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(6, "PA6"),
+               STM32_FUNCTION(0, "GPIOA6"),
+               STM32_FUNCTION(2, "TIM1_BKIN"),
+               STM32_FUNCTION(3, "TIM3_CH1"),
+               STM32_FUNCTION(4, "TIM8_BKIN"),
+               STM32_FUNCTION(6, "SPI1_MISO"),
+               STM32_FUNCTION(9, "SPI6_MISO"),
+               STM32_FUNCTION(10, "TIM13_CH1"),
+               STM32_FUNCTION(13, "MDIOS_MDC"),
+               STM32_FUNCTION(14, "DCMI_PIXCLK"),
+               STM32_FUNCTION(15, "LCD_G2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(7, "PA7"),
+               STM32_FUNCTION(0, "GPIOA7"),
+               STM32_FUNCTION(2, "TIM1_CH1N"),
+               STM32_FUNCTION(3, "TIM3_CH2"),
+               STM32_FUNCTION(4, "TIM8_CH1N"),
+               STM32_FUNCTION(6, "SPI1_MOSI I2S1_SD"),
+               STM32_FUNCTION(9, "SPI6_MOSI"),
+               STM32_FUNCTION(10, "TIM14_CH1"),
+               STM32_FUNCTION(12, "ETH_MII_RX_DV ETH_RMII_CRS_DV"),
+               STM32_FUNCTION(13, "FMC_SDNWE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(8, "PA8"),
+               STM32_FUNCTION(0, "GPIOA8"),
+               STM32_FUNCTION(1, "MCO1"),
+               STM32_FUNCTION(2, "TIM1_CH1"),
+               STM32_FUNCTION(4, "TIM8_BKIN2"),
+               STM32_FUNCTION(5, "I2C3_SCL"),
+               STM32_FUNCTION(8, "USART1_CK"),
+               STM32_FUNCTION(11, "OTG_FS_SOF"),
+               STM32_FUNCTION(12, "CAN3_RX"),
+               STM32_FUNCTION(13, "UART7_RX"),
+               STM32_FUNCTION(14, "LCD_B3"),
+               STM32_FUNCTION(15, "LCD_R6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(9, "PA9"),
+               STM32_FUNCTION(0, "GPIOA9"),
+               STM32_FUNCTION(2, "TIM1_CH2"),
+               STM32_FUNCTION(5, "I2C3_SMBA"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(8, "USART1_TX"),
+               STM32_FUNCTION(14, "DCMI_D0"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(10, "PA10"),
+               STM32_FUNCTION(0, "GPIOA10"),
+               STM32_FUNCTION(2, "TIM1_CH3"),
+               STM32_FUNCTION(8, "USART1_RX"),
+               STM32_FUNCTION(10, "LCD_B4"),
+               STM32_FUNCTION(11, "OTG_FS_ID"),
+               STM32_FUNCTION(13, "MDIOS_MDIO"),
+               STM32_FUNCTION(14, "DCMI_D1"),
+               STM32_FUNCTION(15, "LCD_B1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(11, "PA11"),
+               STM32_FUNCTION(0, "GPIOA11"),
+               STM32_FUNCTION(2, "TIM1_CH4"),
+               STM32_FUNCTION(6, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(7, "UART4_RX"),
+               STM32_FUNCTION(8, "USART1_CTS"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(11, "OTG_FS_DM"),
+               STM32_FUNCTION(15, "LCD_R4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(12, "PA12"),
+               STM32_FUNCTION(0, "GPIOA12"),
+               STM32_FUNCTION(2, "TIM1_ETR"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(7, "UART4_TX"),
+               STM32_FUNCTION(8, "USART1_RTS"),
+               STM32_FUNCTION(9, "SAI2_FS_B"),
+               STM32_FUNCTION(10, "CAN1_TX"),
+               STM32_FUNCTION(11, "OTG_FS_DP"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(13, "PA13"),
+               STM32_FUNCTION(0, "GPIOA13"),
+               STM32_FUNCTION(1, "JTMS SWDIO"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(14, "PA14"),
+               STM32_FUNCTION(0, "GPIOA14"),
+               STM32_FUNCTION(1, "JTCK SWCLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(15, "PA15"),
+               STM32_FUNCTION(0, "GPIOA15"),
+               STM32_FUNCTION(1, "JTDI"),
+               STM32_FUNCTION(2, "TIM2_CH1 TIM2_ETR"),
+               STM32_FUNCTION(5, "HDMI_CEC"),
+               STM32_FUNCTION(6, "SPI1_NSS I2S1_WS"),
+               STM32_FUNCTION(7, "SPI3_NSS I2S3_WS"),
+               STM32_FUNCTION(8, "SPI6_NSS"),
+               STM32_FUNCTION(9, "UART4_RTS"),
+               STM32_FUNCTION(12, "CAN3_TX"),
+               STM32_FUNCTION(13, "UART7_TX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(16, "PB0"),
+               STM32_FUNCTION(0, "GPIOB0"),
+               STM32_FUNCTION(2, "TIM1_CH2N"),
+               STM32_FUNCTION(3, "TIM3_CH3"),
+               STM32_FUNCTION(4, "TIM8_CH2N"),
+               STM32_FUNCTION(7, "DFSDM_CKOUT"),
+               STM32_FUNCTION(9, "UART4_CTS"),
+               STM32_FUNCTION(10, "LCD_R3"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_D1"),
+               STM32_FUNCTION(12, "ETH_MII_RXD2"),
+               STM32_FUNCTION(15, "LCD_G1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(17, "PB1"),
+               STM32_FUNCTION(0, "GPIOB1"),
+               STM32_FUNCTION(2, "TIM1_CH3N"),
+               STM32_FUNCTION(3, "TIM3_CH4"),
+               STM32_FUNCTION(4, "TIM8_CH3N"),
+               STM32_FUNCTION(7, "DFSDM_DATIN1"),
+               STM32_FUNCTION(10, "LCD_R6"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_D2"),
+               STM32_FUNCTION(12, "ETH_MII_RXD3"),
+               STM32_FUNCTION(15, "LCD_G0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(18, "PB2"),
+               STM32_FUNCTION(0, "GPIOB2"),
+               STM32_FUNCTION(7, "SAI1_SD_A"),
+               STM32_FUNCTION(8, "SPI3_MOSI I2S3_SD"),
+               STM32_FUNCTION(10, "QUADSPI_CLK"),
+               STM32_FUNCTION(11, "DFSDM_CKIN1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(19, "PB3"),
+               STM32_FUNCTION(0, "GPIOB3"),
+               STM32_FUNCTION(1, "JTDO TRACESWO"),
+               STM32_FUNCTION(2, "TIM2_CH2"),
+               STM32_FUNCTION(6, "SPI1_SCK I2S1_CK"),
+               STM32_FUNCTION(7, "SPI3_SCK I2S3_CK"),
+               STM32_FUNCTION(9, "SPI6_SCK"),
+               STM32_FUNCTION(11, "SDMMC2_D2"),
+               STM32_FUNCTION(12, "CAN3_RX"),
+               STM32_FUNCTION(13, "UART7_RX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(20, "PB4"),
+               STM32_FUNCTION(0, "GPIOB4"),
+               STM32_FUNCTION(1, "NJTRST"),
+               STM32_FUNCTION(3, "TIM3_CH1"),
+               STM32_FUNCTION(6, "SPI1_MISO"),
+               STM32_FUNCTION(7, "SPI3_MISO"),
+               STM32_FUNCTION(8, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(9, "SPI6_MISO"),
+               STM32_FUNCTION(11, "SDMMC2_D3"),
+               STM32_FUNCTION(12, "CAN3_TX"),
+               STM32_FUNCTION(13, "UART7_TX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(21, "PB5"),
+               STM32_FUNCTION(0, "GPIOB5"),
+               STM32_FUNCTION(2, "UART5_RX"),
+               STM32_FUNCTION(3, "TIM3_CH2"),
+               STM32_FUNCTION(5, "I2C1_SMBA"),
+               STM32_FUNCTION(6, "SPI1_MOSI I2S1_SD"),
+               STM32_FUNCTION(7, "SPI3_MOSI I2S3_SD"),
+               STM32_FUNCTION(9, "SPI6_MOSI"),
+               STM32_FUNCTION(10, "CAN2_RX"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_D7"),
+               STM32_FUNCTION(12, "ETH_PPS_OUT"),
+               STM32_FUNCTION(13, "FMC_SDCKE1"),
+               STM32_FUNCTION(14, "DCMI_D10"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(22, "PB6"),
+               STM32_FUNCTION(0, "GPIOB6"),
+               STM32_FUNCTION(2, "UART5_TX"),
+               STM32_FUNCTION(3, "TIM4_CH1"),
+               STM32_FUNCTION(4, "HDMI_CEC"),
+               STM32_FUNCTION(5, "I2C1_SCL"),
+               STM32_FUNCTION(7, "DFSDM_DATIN5"),
+               STM32_FUNCTION(8, "USART1_TX"),
+               STM32_FUNCTION(10, "CAN2_TX"),
+               STM32_FUNCTION(11, "QUADSPI_BK1_NCS"),
+               STM32_FUNCTION(12, "I2C4_SCL"),
+               STM32_FUNCTION(13, "FMC_SDNE1"),
+               STM32_FUNCTION(14, "DCMI_D5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(23, "PB7"),
+               STM32_FUNCTION(0, "GPIOB7"),
+               STM32_FUNCTION(3, "TIM4_CH2"),
+               STM32_FUNCTION(5, "I2C1_SDA"),
+               STM32_FUNCTION(7, "DFSDM_CKIN5"),
+               STM32_FUNCTION(8, "USART1_RX"),
+               STM32_FUNCTION(12, "I2C4_SDA"),
+               STM32_FUNCTION(13, "FMC_NL"),
+               STM32_FUNCTION(14, "DCMI_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(24, "PB8"),
+               STM32_FUNCTION(0, "GPIOB8"),
+               STM32_FUNCTION(2, "I2C4_SCL"),
+               STM32_FUNCTION(3, "TIM4_CH3"),
+               STM32_FUNCTION(4, "TIM10_CH1"),
+               STM32_FUNCTION(5, "I2C1_SCL"),
+               STM32_FUNCTION(7, "DFSDM_CKIN7"),
+               STM32_FUNCTION(8, "UART5_RX"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(11, "SDMMC2_D4"),
+               STM32_FUNCTION(12, "ETH_MII_TXD3"),
+               STM32_FUNCTION(13, "SDMMC1_D4"),
+               STM32_FUNCTION(14, "DCMI_D6"),
+               STM32_FUNCTION(15, "LCD_B6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(25, "PB9"),
+               STM32_FUNCTION(0, "GPIOB9"),
+               STM32_FUNCTION(2, "I2C4_SDA"),
+               STM32_FUNCTION(3, "TIM4_CH4"),
+               STM32_FUNCTION(4, "TIM11_CH1"),
+               STM32_FUNCTION(5, "I2C1_SDA"),
+               STM32_FUNCTION(6, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(7, "DFSDM_DATIN7"),
+               STM32_FUNCTION(8, "UART5_TX"),
+               STM32_FUNCTION(10, "CAN1_TX"),
+               STM32_FUNCTION(11, "SDMMC2_D5"),
+               STM32_FUNCTION(12, "I2C4_SMBA"),
+               STM32_FUNCTION(13, "SDMMC1_D5"),
+               STM32_FUNCTION(14, "DCMI_D7"),
+               STM32_FUNCTION(15, "LCD_B7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(26, "PB10"),
+               STM32_FUNCTION(0, "GPIOB10"),
+               STM32_FUNCTION(2, "TIM2_CH3"),
+               STM32_FUNCTION(5, "I2C2_SCL"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(7, "DFSDM_DATIN7"),
+               STM32_FUNCTION(8, "USART3_TX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_NCS"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_D3"),
+               STM32_FUNCTION(12, "ETH_MII_RX_ER"),
+               STM32_FUNCTION(15, "LCD_G4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(27, "PB11"),
+               STM32_FUNCTION(0, "GPIOB11"),
+               STM32_FUNCTION(2, "TIM2_CH4"),
+               STM32_FUNCTION(5, "I2C2_SDA"),
+               STM32_FUNCTION(7, "DFSDM_CKIN7"),
+               STM32_FUNCTION(8, "USART3_RX"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_D4"),
+               STM32_FUNCTION(12, "ETH_MII_TX_EN ETH_RMII_TX_EN"),
+               STM32_FUNCTION(14, "DSI_TE"),
+               STM32_FUNCTION(15, "LCD_G5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(28, "PB12"),
+               STM32_FUNCTION(0, "GPIOB12"),
+               STM32_FUNCTION(2, "TIM1_BKIN"),
+               STM32_FUNCTION(5, "I2C2_SMBA"),
+               STM32_FUNCTION(6, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(7, "DFSDM_DATIN1"),
+               STM32_FUNCTION(8, "USART3_CK"),
+               STM32_FUNCTION(9, "UART5_RX"),
+               STM32_FUNCTION(10, "CAN2_RX"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_D5"),
+               STM32_FUNCTION(12, "ETH_MII_TXD0 ETH_RMII_TXD0"),
+               STM32_FUNCTION(13, "OTG_HS_ID"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(29, "PB13"),
+               STM32_FUNCTION(0, "GPIOB13"),
+               STM32_FUNCTION(2, "TIM1_CH1N"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(7, "DFSDM_CKIN1"),
+               STM32_FUNCTION(8, "USART3_CTS"),
+               STM32_FUNCTION(9, "UART5_TX"),
+               STM32_FUNCTION(10, "CAN2_TX"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_D6"),
+               STM32_FUNCTION(12, "ETH_MII_TXD1 ETH_RMII_TXD1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(30, "PB14"),
+               STM32_FUNCTION(0, "GPIOB14"),
+               STM32_FUNCTION(2, "TIM1_CH2N"),
+               STM32_FUNCTION(4, "TIM8_CH2N"),
+               STM32_FUNCTION(5, "USART1_TX"),
+               STM32_FUNCTION(6, "SPI2_MISO"),
+               STM32_FUNCTION(7, "DFSDM_DATIN2"),
+               STM32_FUNCTION(8, "USART3_RTS"),
+               STM32_FUNCTION(9, "UART4_RTS"),
+               STM32_FUNCTION(10, "TIM12_CH1"),
+               STM32_FUNCTION(11, "SDMMC2_D0"),
+               STM32_FUNCTION(13, "OTG_HS_DM"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(31, "PB15"),
+               STM32_FUNCTION(0, "GPIOB15"),
+               STM32_FUNCTION(1, "RTC_REFIN"),
+               STM32_FUNCTION(2, "TIM1_CH3N"),
+               STM32_FUNCTION(4, "TIM8_CH3N"),
+               STM32_FUNCTION(5, "USART1_RX"),
+               STM32_FUNCTION(6, "SPI2_MOSI I2S2_SD"),
+               STM32_FUNCTION(7, "DFSDM_CKIN2"),
+               STM32_FUNCTION(9, "UART4_CTS"),
+               STM32_FUNCTION(10, "TIM12_CH2"),
+               STM32_FUNCTION(11, "SDMMC2_D1"),
+               STM32_FUNCTION(13, "OTG_HS_DP"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(32, "PC0"),
+               STM32_FUNCTION(0, "GPIOC0"),
+               STM32_FUNCTION(4, "DFSDM_CKIN0"),
+               STM32_FUNCTION(7, "DFSDM_DATIN4"),
+               STM32_FUNCTION(9, "SAI2_FS_B"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_STP"),
+               STM32_FUNCTION(13, "FMC_SDNWE"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(33, "PC1"),
+               STM32_FUNCTION(0, "GPIOC1"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(4, "DFSDM_DATIN0"),
+               STM32_FUNCTION(6, "SPI2_MOSI I2S2_SD"),
+               STM32_FUNCTION(7, "SAI1_SD_A"),
+               STM32_FUNCTION(11, "DFSDM_CKIN4"),
+               STM32_FUNCTION(12, "ETH_MDC"),
+               STM32_FUNCTION(13, "MDIOS_MDC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(34, "PC2"),
+               STM32_FUNCTION(0, "GPIOC2"),
+               STM32_FUNCTION(4, "DFSDM_CKIN1"),
+               STM32_FUNCTION(6, "SPI2_MISO"),
+               STM32_FUNCTION(7, "DFSDM_CKOUT"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_DIR"),
+               STM32_FUNCTION(12, "ETH_MII_TXD2"),
+               STM32_FUNCTION(13, "FMC_SDNE0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(35, "PC3"),
+               STM32_FUNCTION(0, "GPIOC3"),
+               STM32_FUNCTION(4, "DFSDM_DATIN1"),
+               STM32_FUNCTION(6, "SPI2_MOSI I2S2_SD"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_NXT"),
+               STM32_FUNCTION(12, "ETH_MII_TX_CLK"),
+               STM32_FUNCTION(13, "FMC_SDCKE0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(36, "PC4"),
+               STM32_FUNCTION(0, "GPIOC4"),
+               STM32_FUNCTION(4, "DFSDM_CKIN2"),
+               STM32_FUNCTION(6, "I2S1_MCK"),
+               STM32_FUNCTION(9, "SPDIF_RX2"),
+               STM32_FUNCTION(12, "ETH_MII_RXD0 ETH_RMII_RXD0"),
+               STM32_FUNCTION(13, "FMC_SDNE0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(37, "PC5"),
+               STM32_FUNCTION(0, "GPIOC5"),
+               STM32_FUNCTION(4, "DFSDM_DATIN2"),
+               STM32_FUNCTION(9, "SPDIF_RX3"),
+               STM32_FUNCTION(12, "ETH_MII_RXD1 ETH_RMII_RXD1"),
+               STM32_FUNCTION(13, "FMC_SDCKE0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(38, "PC6"),
+               STM32_FUNCTION(0, "GPIOC6"),
+               STM32_FUNCTION(3, "TIM3_CH1"),
+               STM32_FUNCTION(4, "TIM8_CH1"),
+               STM32_FUNCTION(6, "I2S2_MCK"),
+               STM32_FUNCTION(8, "DFSDM_CKIN3"),
+               STM32_FUNCTION(9, "USART6_TX"),
+               STM32_FUNCTION(10, "FMC_NWAIT"),
+               STM32_FUNCTION(11, "SDMMC2_D6"),
+               STM32_FUNCTION(13, "SDMMC1_D6"),
+               STM32_FUNCTION(14, "DCMI_D0"),
+               STM32_FUNCTION(15, "LCD_HSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(39, "PC7"),
+               STM32_FUNCTION(0, "GPIOC7"),
+               STM32_FUNCTION(3, "TIM3_CH2"),
+               STM32_FUNCTION(4, "TIM8_CH2"),
+               STM32_FUNCTION(7, "I2S3_MCK"),
+               STM32_FUNCTION(8, "DFSDM_DATIN3"),
+               STM32_FUNCTION(9, "USART6_RX"),
+               STM32_FUNCTION(10, "FMC_NE1"),
+               STM32_FUNCTION(11, "SDMMC2_D7"),
+               STM32_FUNCTION(13, "SDMMC1_D7"),
+               STM32_FUNCTION(14, "DCMI_D1"),
+               STM32_FUNCTION(15, "LCD_G6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(40, "PC8"),
+               STM32_FUNCTION(0, "GPIOC8"),
+               STM32_FUNCTION(1, "TRACED1"),
+               STM32_FUNCTION(3, "TIM3_CH3"),
+               STM32_FUNCTION(4, "TIM8_CH3"),
+               STM32_FUNCTION(8, "UART5_RTS"),
+               STM32_FUNCTION(9, "USART6_CK"),
+               STM32_FUNCTION(10, "FMC_NE2 FMC_NCE"),
+               STM32_FUNCTION(13, "SDMMC1_D0"),
+               STM32_FUNCTION(14, "DCMI_D2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(41, "PC9"),
+               STM32_FUNCTION(0, "GPIOC9"),
+               STM32_FUNCTION(1, "MCO2"),
+               STM32_FUNCTION(3, "TIM3_CH4"),
+               STM32_FUNCTION(4, "TIM8_CH4"),
+               STM32_FUNCTION(5, "I2C3_SDA"),
+               STM32_FUNCTION(6, "I2S_CKIN"),
+               STM32_FUNCTION(8, "UART5_CTS"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO0"),
+               STM32_FUNCTION(11, "LCD_G3"),
+               STM32_FUNCTION(13, "SDMMC1_D1"),
+               STM32_FUNCTION(14, "DCMI_D3"),
+               STM32_FUNCTION(15, "LCD_B2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(42, "PC10"),
+               STM32_FUNCTION(0, "GPIOC10"),
+               STM32_FUNCTION(4, "DFSDM_CKIN5"),
+               STM32_FUNCTION(7, "SPI3_SCK I2S3_CK"),
+               STM32_FUNCTION(8, "USART3_TX"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO1"),
+               STM32_FUNCTION(13, "SDMMC1_D2"),
+               STM32_FUNCTION(14, "DCMI_D8"),
+               STM32_FUNCTION(15, "LCD_R2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(43, "PC11"),
+               STM32_FUNCTION(0, "GPIOC11"),
+               STM32_FUNCTION(4, "DFSDM_DATIN5"),
+               STM32_FUNCTION(7, "SPI3_MISO"),
+               STM32_FUNCTION(8, "USART3_RX"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_NCS"),
+               STM32_FUNCTION(13, "SDMMC1_D3"),
+               STM32_FUNCTION(14, "DCMI_D4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(44, "PC12"),
+               STM32_FUNCTION(0, "GPIOC12"),
+               STM32_FUNCTION(1, "TRACED3"),
+               STM32_FUNCTION(7, "SPI3_MOSI I2S3_SD"),
+               STM32_FUNCTION(8, "USART3_CK"),
+               STM32_FUNCTION(9, "UART5_TX"),
+               STM32_FUNCTION(13, "SDMMC1_CK"),
+               STM32_FUNCTION(14, "DCMI_D9"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(45, "PC13"),
+               STM32_FUNCTION(0, "GPIOC13"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(46, "PC14"),
+               STM32_FUNCTION(0, "GPIOC14"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(47, "PC15"),
+               STM32_FUNCTION(0, "GPIOC15"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(48, "PD0"),
+               STM32_FUNCTION(0, "GPIOD0"),
+               STM32_FUNCTION(4, "DFSDM_CKIN6"),
+               STM32_FUNCTION(7, "DFSDM_DATIN7"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(13, "FMC_D2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(49, "PD1"),
+               STM32_FUNCTION(0, "GPIOD1"),
+               STM32_FUNCTION(4, "DFSDM_DATIN6"),
+               STM32_FUNCTION(7, "DFSDM_CKIN7"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(10, "CAN1_TX"),
+               STM32_FUNCTION(13, "FMC_D3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(50, "PD2"),
+               STM32_FUNCTION(0, "GPIOD2"),
+               STM32_FUNCTION(1, "TRACED2"),
+               STM32_FUNCTION(3, "TIM3_ETR"),
+               STM32_FUNCTION(9, "UART5_RX"),
+               STM32_FUNCTION(13, "SDMMC1_CMD"),
+               STM32_FUNCTION(14, "DCMI_D11"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(51, "PD3"),
+               STM32_FUNCTION(0, "GPIOD3"),
+               STM32_FUNCTION(4, "DFSDM_CKOUT"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(7, "DFSDM_DATIN0"),
+               STM32_FUNCTION(8, "USART2_CTS"),
+               STM32_FUNCTION(13, "FMC_CLK"),
+               STM32_FUNCTION(14, "DCMI_D5"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(52, "PD4"),
+               STM32_FUNCTION(0, "GPIOD4"),
+               STM32_FUNCTION(7, "DFSDM_CKIN0"),
+               STM32_FUNCTION(8, "USART2_RTS"),
+               STM32_FUNCTION(13, "FMC_NOE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(53, "PD5"),
+               STM32_FUNCTION(0, "GPIOD5"),
+               STM32_FUNCTION(8, "USART2_TX"),
+               STM32_FUNCTION(13, "FMC_NWE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(54, "PD6"),
+               STM32_FUNCTION(0, "GPIOD6"),
+               STM32_FUNCTION(4, "DFSDM_CKIN4"),
+               STM32_FUNCTION(6, "SPI3_MOSI I2S3_SD"),
+               STM32_FUNCTION(7, "SAI1_SD_A"),
+               STM32_FUNCTION(8, "USART2_RX"),
+               STM32_FUNCTION(11, "DFSDM_DATIN1"),
+               STM32_FUNCTION(12, "SDMMC2_CK"),
+               STM32_FUNCTION(13, "FMC_NWAIT"),
+               STM32_FUNCTION(14, "DCMI_D10"),
+               STM32_FUNCTION(15, "LCD_B2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(55, "PD7"),
+               STM32_FUNCTION(0, "GPIOD7"),
+               STM32_FUNCTION(4, "DFSDM_DATIN4"),
+               STM32_FUNCTION(6, "SPI1_MOSI I2S1_SD"),
+               STM32_FUNCTION(7, "DFSDM_CKIN1"),
+               STM32_FUNCTION(8, "USART2_CK"),
+               STM32_FUNCTION(9, "SPDIF_RX0"),
+               STM32_FUNCTION(12, "SDMMC2_CMD"),
+               STM32_FUNCTION(13, "FMC_NE1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(56, "PD8"),
+               STM32_FUNCTION(0, "GPIOD8"),
+               STM32_FUNCTION(4, "DFSDM_CKIN3"),
+               STM32_FUNCTION(8, "USART3_TX"),
+               STM32_FUNCTION(9, "SPDIF_RX1"),
+               STM32_FUNCTION(13, "FMC_D13"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(57, "PD9"),
+               STM32_FUNCTION(0, "GPIOD9"),
+               STM32_FUNCTION(4, "DFSDM_DATIN3"),
+               STM32_FUNCTION(8, "USART3_RX"),
+               STM32_FUNCTION(13, "FMC_D14"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(58, "PD10"),
+               STM32_FUNCTION(0, "GPIOD10"),
+               STM32_FUNCTION(4, "DFSDM_CKOUT"),
+               STM32_FUNCTION(8, "USART3_CK"),
+               STM32_FUNCTION(13, "FMC_D15"),
+               STM32_FUNCTION(15, "LCD_B3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(59, "PD11"),
+               STM32_FUNCTION(0, "GPIOD11"),
+               STM32_FUNCTION(5, "I2C4_SMBA"),
+               STM32_FUNCTION(8, "USART3_CTS"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO0"),
+               STM32_FUNCTION(11, "SAI2_SD_A"),
+               STM32_FUNCTION(13, "FMC_A16 FMC_CLE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(60, "PD12"),
+               STM32_FUNCTION(0, "GPIOD12"),
+               STM32_FUNCTION(3, "TIM4_CH1"),
+               STM32_FUNCTION(4, "LPTIM1_IN1"),
+               STM32_FUNCTION(5, "I2C4_SCL"),
+               STM32_FUNCTION(8, "USART3_RTS"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO1"),
+               STM32_FUNCTION(11, "SAI2_FS_A"),
+               STM32_FUNCTION(13, "FMC_A17 FMC_ALE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(61, "PD13"),
+               STM32_FUNCTION(0, "GPIOD13"),
+               STM32_FUNCTION(3, "TIM4_CH2"),
+               STM32_FUNCTION(4, "LPTIM1_OUT"),
+               STM32_FUNCTION(5, "I2C4_SDA"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO3"),
+               STM32_FUNCTION(11, "SAI2_SCK_A"),
+               STM32_FUNCTION(13, "FMC_A18"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(62, "PD14"),
+               STM32_FUNCTION(0, "GPIOD14"),
+               STM32_FUNCTION(3, "TIM4_CH3"),
+               STM32_FUNCTION(9, "UART8_CTS"),
+               STM32_FUNCTION(13, "FMC_D0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(63, "PD15"),
+               STM32_FUNCTION(0, "GPIOD15"),
+               STM32_FUNCTION(3, "TIM4_CH4"),
+               STM32_FUNCTION(9, "UART8_RTS"),
+               STM32_FUNCTION(13, "FMC_D1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(64, "PE0"),
+               STM32_FUNCTION(0, "GPIOE0"),
+               STM32_FUNCTION(3, "TIM4_ETR"),
+               STM32_FUNCTION(4, "LPTIM1_ETR"),
+               STM32_FUNCTION(9, "UART8_RX"),
+               STM32_FUNCTION(11, "SAI2_MCLK_A"),
+               STM32_FUNCTION(13, "FMC_NBL0"),
+               STM32_FUNCTION(14, "DCMI_D2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(65, "PE1"),
+               STM32_FUNCTION(0, "GPIOE1"),
+               STM32_FUNCTION(4, "LPTIM1_IN2"),
+               STM32_FUNCTION(9, "UART8_TX"),
+               STM32_FUNCTION(13, "FMC_NBL1"),
+               STM32_FUNCTION(14, "DCMI_D3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(66, "PE2"),
+               STM32_FUNCTION(0, "GPIOE2"),
+               STM32_FUNCTION(1, "TRACECLK"),
+               STM32_FUNCTION(6, "SPI4_SCK"),
+               STM32_FUNCTION(7, "SAI1_MCLK_A"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO2"),
+               STM32_FUNCTION(12, "ETH_MII_TXD3"),
+               STM32_FUNCTION(13, "FMC_A23"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(67, "PE3"),
+               STM32_FUNCTION(0, "GPIOE3"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(7, "SAI1_SD_B"),
+               STM32_FUNCTION(13, "FMC_A19"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(68, "PE4"),
+               STM32_FUNCTION(0, "GPIOE4"),
+               STM32_FUNCTION(1, "TRACED1"),
+               STM32_FUNCTION(6, "SPI4_NSS"),
+               STM32_FUNCTION(7, "SAI1_FS_A"),
+               STM32_FUNCTION(11, "DFSDM_DATIN3"),
+               STM32_FUNCTION(13, "FMC_A20"),
+               STM32_FUNCTION(14, "DCMI_D4"),
+               STM32_FUNCTION(15, "LCD_B0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(69, "PE5"),
+               STM32_FUNCTION(0, "GPIOE5"),
+               STM32_FUNCTION(1, "TRACED2"),
+               STM32_FUNCTION(4, "TIM9_CH1"),
+               STM32_FUNCTION(6, "SPI4_MISO"),
+               STM32_FUNCTION(7, "SAI1_SCK_A"),
+               STM32_FUNCTION(11, "DFSDM_CKIN3"),
+               STM32_FUNCTION(13, "FMC_A21"),
+               STM32_FUNCTION(14, "DCMI_D6"),
+               STM32_FUNCTION(15, "LCD_G0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(70, "PE6"),
+               STM32_FUNCTION(0, "GPIOE6"),
+               STM32_FUNCTION(1, "TRACED3"),
+               STM32_FUNCTION(2, "TIM1_BKIN2"),
+               STM32_FUNCTION(4, "TIM9_CH2"),
+               STM32_FUNCTION(6, "SPI4_MOSI"),
+               STM32_FUNCTION(7, "SAI1_SD_A"),
+               STM32_FUNCTION(11, "SAI2_MCLK_B"),
+               STM32_FUNCTION(13, "FMC_A22"),
+               STM32_FUNCTION(14, "DCMI_D7"),
+               STM32_FUNCTION(15, "LCD_G1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(71, "PE7"),
+               STM32_FUNCTION(0, "GPIOE7"),
+               STM32_FUNCTION(2, "TIM1_ETR"),
+               STM32_FUNCTION(7, "DFSDM_DATIN2"),
+               STM32_FUNCTION(9, "UART7_RX"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_IO0"),
+               STM32_FUNCTION(13, "FMC_D4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(72, "PE8"),
+               STM32_FUNCTION(0, "GPIOE8"),
+               STM32_FUNCTION(2, "TIM1_CH1N"),
+               STM32_FUNCTION(7, "DFSDM_CKIN2"),
+               STM32_FUNCTION(9, "UART7_TX"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_IO1"),
+               STM32_FUNCTION(13, "FMC_D5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(73, "PE9"),
+               STM32_FUNCTION(0, "GPIOE9"),
+               STM32_FUNCTION(2, "TIM1_CH1"),
+               STM32_FUNCTION(7, "DFSDM_CKOUT"),
+               STM32_FUNCTION(9, "UART7_RTS"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_IO2"),
+               STM32_FUNCTION(13, "FMC_D6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(74, "PE10"),
+               STM32_FUNCTION(0, "GPIOE10"),
+               STM32_FUNCTION(2, "TIM1_CH2N"),
+               STM32_FUNCTION(7, "DFSDM_DATIN4"),
+               STM32_FUNCTION(9, "UART7_CTS"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_IO3"),
+               STM32_FUNCTION(13, "FMC_D7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(75, "PE11"),
+               STM32_FUNCTION(0, "GPIOE11"),
+               STM32_FUNCTION(2, "TIM1_CH2"),
+               STM32_FUNCTION(6, "SPI4_NSS"),
+               STM32_FUNCTION(7, "DFSDM_CKIN4"),
+               STM32_FUNCTION(11, "SAI2_SD_B"),
+               STM32_FUNCTION(13, "FMC_D8"),
+               STM32_FUNCTION(15, "LCD_G3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(76, "PE12"),
+               STM32_FUNCTION(0, "GPIOE12"),
+               STM32_FUNCTION(2, "TIM1_CH3N"),
+               STM32_FUNCTION(6, "SPI4_SCK"),
+               STM32_FUNCTION(7, "DFSDM_DATIN5"),
+               STM32_FUNCTION(11, "SAI2_SCK_B"),
+               STM32_FUNCTION(13, "FMC_D9"),
+               STM32_FUNCTION(15, "LCD_B4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(77, "PE13"),
+               STM32_FUNCTION(0, "GPIOE13"),
+               STM32_FUNCTION(2, "TIM1_CH3"),
+               STM32_FUNCTION(6, "SPI4_MISO"),
+               STM32_FUNCTION(7, "DFSDM_CKIN5"),
+               STM32_FUNCTION(11, "SAI2_FS_B"),
+               STM32_FUNCTION(13, "FMC_D10"),
+               STM32_FUNCTION(15, "LCD_DE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(78, "PE14"),
+               STM32_FUNCTION(0, "GPIOE14"),
+               STM32_FUNCTION(2, "TIM1_CH4"),
+               STM32_FUNCTION(6, "SPI4_MOSI"),
+               STM32_FUNCTION(11, "SAI2_MCLK_B"),
+               STM32_FUNCTION(13, "FMC_D11"),
+               STM32_FUNCTION(15, "LCD_CLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(79, "PE15"),
+               STM32_FUNCTION(0, "GPIOE15"),
+               STM32_FUNCTION(2, "TIM1_BKIN"),
+               STM32_FUNCTION(13, "FMC_D12"),
+               STM32_FUNCTION(15, "LCD_R7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(80, "PF0"),
+               STM32_FUNCTION(0, "GPIOF0"),
+               STM32_FUNCTION(5, "I2C2_SDA"),
+               STM32_FUNCTION(13, "FMC_A0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(81, "PF1"),
+               STM32_FUNCTION(0, "GPIOF1"),
+               STM32_FUNCTION(5, "I2C2_SCL"),
+               STM32_FUNCTION(13, "FMC_A1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(82, "PF2"),
+               STM32_FUNCTION(0, "GPIOF2"),
+               STM32_FUNCTION(5, "I2C2_SMBA"),
+               STM32_FUNCTION(13, "FMC_A2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(83, "PF3"),
+               STM32_FUNCTION(0, "GPIOF3"),
+               STM32_FUNCTION(13, "FMC_A3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(84, "PF4"),
+               STM32_FUNCTION(0, "GPIOF4"),
+               STM32_FUNCTION(13, "FMC_A4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(85, "PF5"),
+               STM32_FUNCTION(0, "GPIOF5"),
+               STM32_FUNCTION(13, "FMC_A5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(86, "PF6"),
+               STM32_FUNCTION(0, "GPIOF6"),
+               STM32_FUNCTION(4, "TIM10_CH1"),
+               STM32_FUNCTION(6, "SPI5_NSS"),
+               STM32_FUNCTION(7, "SAI1_SD_B"),
+               STM32_FUNCTION(9, "UART7_RX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(87, "PF7"),
+               STM32_FUNCTION(0, "GPIOF7"),
+               STM32_FUNCTION(4, "TIM11_CH1"),
+               STM32_FUNCTION(6, "SPI5_SCK"),
+               STM32_FUNCTION(7, "SAI1_MCLK_B"),
+               STM32_FUNCTION(9, "UART7_TX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(88, "PF8"),
+               STM32_FUNCTION(0, "GPIOF8"),
+               STM32_FUNCTION(6, "SPI5_MISO"),
+               STM32_FUNCTION(7, "SAI1_SCK_B"),
+               STM32_FUNCTION(9, "UART7_RTS"),
+               STM32_FUNCTION(10, "TIM13_CH1"),
+               STM32_FUNCTION(11, "QUADSPI_BK1_IO0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(89, "PF9"),
+               STM32_FUNCTION(0, "GPIOF9"),
+               STM32_FUNCTION(6, "SPI5_MOSI"),
+               STM32_FUNCTION(7, "SAI1_FS_B"),
+               STM32_FUNCTION(9, "UART7_CTS"),
+               STM32_FUNCTION(10, "TIM14_CH1"),
+               STM32_FUNCTION(11, "QUADSPI_BK1_IO1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(90, "PF10"),
+               STM32_FUNCTION(0, "GPIOF10"),
+               STM32_FUNCTION(10, "QUADSPI_CLK"),
+               STM32_FUNCTION(14, "DCMI_D11"),
+               STM32_FUNCTION(15, "LCD_DE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(91, "PF11"),
+               STM32_FUNCTION(0, "GPIOF11"),
+               STM32_FUNCTION(6, "SPI5_MOSI"),
+               STM32_FUNCTION(11, "SAI2_SD_B"),
+               STM32_FUNCTION(13, "FMC_SDNRAS"),
+               STM32_FUNCTION(14, "DCMI_D12"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(92, "PF12"),
+               STM32_FUNCTION(0, "GPIOF12"),
+               STM32_FUNCTION(13, "FMC_A6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(93, "PF13"),
+               STM32_FUNCTION(0, "GPIOF13"),
+               STM32_FUNCTION(5, "I2C4_SMBA"),
+               STM32_FUNCTION(7, "DFSDM_DATIN6"),
+               STM32_FUNCTION(13, "FMC_A7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(94, "PF14"),
+               STM32_FUNCTION(0, "GPIOF14"),
+               STM32_FUNCTION(5, "I2C4_SCL"),
+               STM32_FUNCTION(7, "DFSDM_CKIN6"),
+               STM32_FUNCTION(13, "FMC_A8"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(95, "PF15"),
+               STM32_FUNCTION(0, "GPIOF15"),
+               STM32_FUNCTION(5, "I2C4_SDA"),
+               STM32_FUNCTION(13, "FMC_A9"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(96, "PG0"),
+               STM32_FUNCTION(0, "GPIOG0"),
+               STM32_FUNCTION(13, "FMC_A10"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(97, "PG1"),
+               STM32_FUNCTION(0, "GPIOG1"),
+               STM32_FUNCTION(13, "FMC_A11"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(98, "PG2"),
+               STM32_FUNCTION(0, "GPIOG2"),
+               STM32_FUNCTION(13, "FMC_A12"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(99, "PG3"),
+               STM32_FUNCTION(0, "GPIOG3"),
+               STM32_FUNCTION(13, "FMC_A13"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(100, "PG4"),
+               STM32_FUNCTION(0, "GPIOG4"),
+               STM32_FUNCTION(13, "FMC_A14 FMC_BA0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(101, "PG5"),
+               STM32_FUNCTION(0, "GPIOG5"),
+               STM32_FUNCTION(13, "FMC_A15 FMC_BA1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(102, "PG6"),
+               STM32_FUNCTION(0, "GPIOG6"),
+               STM32_FUNCTION(13, "FMC_NE3"),
+               STM32_FUNCTION(14, "DCMI_D12"),
+               STM32_FUNCTION(15, "LCD_R7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(103, "PG7"),
+               STM32_FUNCTION(0, "GPIOG7"),
+               STM32_FUNCTION(7, "SAI1_MCLK_A"),
+               STM32_FUNCTION(9, "USART6_CK"),
+               STM32_FUNCTION(13, "FMC_INT"),
+               STM32_FUNCTION(14, "DCMI_D13"),
+               STM32_FUNCTION(15, "LCD_CLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(104, "PG8"),
+               STM32_FUNCTION(0, "GPIOG8"),
+               STM32_FUNCTION(6, "SPI6_NSS"),
+               STM32_FUNCTION(8, "SPDIF_RX2"),
+               STM32_FUNCTION(9, "USART6_RTS"),
+               STM32_FUNCTION(12, "ETH_PPS_OUT"),
+               STM32_FUNCTION(13, "FMC_SDCLK"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(105, "PG9"),
+               STM32_FUNCTION(0, "GPIOG9"),
+               STM32_FUNCTION(6, "SPI1_MISO"),
+               STM32_FUNCTION(8, "SPDIF_RX3"),
+               STM32_FUNCTION(9, "USART6_RX"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_IO2"),
+               STM32_FUNCTION(11, "SAI2_FS_B"),
+               STM32_FUNCTION(12, "SDMMC2_D0"),
+               STM32_FUNCTION(13, "FMC_NE2 FMC_NCE"),
+               STM32_FUNCTION(14, "DCMI_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(106, "PG10"),
+               STM32_FUNCTION(0, "GPIOG10"),
+               STM32_FUNCTION(6, "SPI1_NSS I2S1_WS"),
+               STM32_FUNCTION(10, "LCD_G3"),
+               STM32_FUNCTION(11, "SAI2_SD_B"),
+               STM32_FUNCTION(12, "SDMMC2_D1"),
+               STM32_FUNCTION(13, "FMC_NE3"),
+               STM32_FUNCTION(14, "DCMI_D2"),
+               STM32_FUNCTION(15, "LCD_B2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(107, "PG11"),
+               STM32_FUNCTION(0, "GPIOG11"),
+               STM32_FUNCTION(6, "SPI1_SCK I2S1_CK"),
+               STM32_FUNCTION(8, "SPDIF_RX0"),
+               STM32_FUNCTION(11, "SDMMC2_D2"),
+               STM32_FUNCTION(12, "ETH_MII_TX_EN ETH_RMII_TX_EN"),
+               STM32_FUNCTION(14, "DCMI_D3"),
+               STM32_FUNCTION(15, "LCD_B3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(108, "PG12"),
+               STM32_FUNCTION(0, "GPIOG12"),
+               STM32_FUNCTION(4, "LPTIM1_IN1"),
+               STM32_FUNCTION(6, "SPI6_MISO"),
+               STM32_FUNCTION(8, "SPDIF_RX1"),
+               STM32_FUNCTION(9, "USART6_RTS"),
+               STM32_FUNCTION(10, "LCD_B4"),
+               STM32_FUNCTION(12, "SDMMC2_D3"),
+               STM32_FUNCTION(13, "FMC_NE4"),
+               STM32_FUNCTION(15, "LCD_B1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(109, "PG13"),
+               STM32_FUNCTION(0, "GPIOG13"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(4, "LPTIM1_OUT"),
+               STM32_FUNCTION(6, "SPI6_SCK"),
+               STM32_FUNCTION(9, "USART6_CTS"),
+               STM32_FUNCTION(12, "ETH_MII_TXD0 ETH_RMII_TXD0"),
+               STM32_FUNCTION(13, "FMC_A24"),
+               STM32_FUNCTION(15, "LCD_R0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(110, "PG14"),
+               STM32_FUNCTION(0, "GPIOG14"),
+               STM32_FUNCTION(1, "TRACED1"),
+               STM32_FUNCTION(4, "LPTIM1_ETR"),
+               STM32_FUNCTION(6, "SPI6_MOSI"),
+               STM32_FUNCTION(9, "USART6_TX"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_IO3"),
+               STM32_FUNCTION(12, "ETH_MII_TXD1 ETH_RMII_TXD1"),
+               STM32_FUNCTION(13, "FMC_A25"),
+               STM32_FUNCTION(15, "LCD_B0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(111, "PG15"),
+               STM32_FUNCTION(0, "GPIOG15"),
+               STM32_FUNCTION(9, "USART6_CTS"),
+               STM32_FUNCTION(13, "FMC_SDNCAS"),
+               STM32_FUNCTION(14, "DCMI_D13"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(112, "PH0"),
+               STM32_FUNCTION(0, "GPIOH0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(113, "PH1"),
+               STM32_FUNCTION(0, "GPIOH1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(114, "PH2"),
+               STM32_FUNCTION(0, "GPIOH2"),
+               STM32_FUNCTION(4, "LPTIM1_IN2"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_IO0"),
+               STM32_FUNCTION(11, "SAI2_SCK_B"),
+               STM32_FUNCTION(12, "ETH_MII_CRS"),
+               STM32_FUNCTION(13, "FMC_SDCKE0"),
+               STM32_FUNCTION(15, "LCD_R0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(115, "PH3"),
+               STM32_FUNCTION(0, "GPIOH3"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_IO1"),
+               STM32_FUNCTION(11, "SAI2_MCLK_B"),
+               STM32_FUNCTION(12, "ETH_MII_COL"),
+               STM32_FUNCTION(13, "FMC_SDNE0"),
+               STM32_FUNCTION(15, "LCD_R1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(116, "PH4"),
+               STM32_FUNCTION(0, "GPIOH4"),
+               STM32_FUNCTION(5, "I2C2_SCL"),
+               STM32_FUNCTION(10, "LCD_G5"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_NXT"),
+               STM32_FUNCTION(15, "LCD_G4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(117, "PH5"),
+               STM32_FUNCTION(0, "GPIOH5"),
+               STM32_FUNCTION(5, "I2C2_SDA"),
+               STM32_FUNCTION(6, "SPI5_NSS"),
+               STM32_FUNCTION(13, "FMC_SDNWE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(118, "PH6"),
+               STM32_FUNCTION(0, "GPIOH6"),
+               STM32_FUNCTION(5, "I2C2_SMBA"),
+               STM32_FUNCTION(6, "SPI5_SCK"),
+               STM32_FUNCTION(10, "TIM12_CH1"),
+               STM32_FUNCTION(12, "ETH_MII_RXD2"),
+               STM32_FUNCTION(13, "FMC_SDNE1"),
+               STM32_FUNCTION(14, "DCMI_D8"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(119, "PH7"),
+               STM32_FUNCTION(0, "GPIOH7"),
+               STM32_FUNCTION(5, "I2C3_SCL"),
+               STM32_FUNCTION(6, "SPI5_MISO"),
+               STM32_FUNCTION(12, "ETH_MII_RXD3"),
+               STM32_FUNCTION(13, "FMC_SDCKE1"),
+               STM32_FUNCTION(14, "DCMI_D9"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(120, "PH8"),
+               STM32_FUNCTION(0, "GPIOH8"),
+               STM32_FUNCTION(5, "I2C3_SDA"),
+               STM32_FUNCTION(13, "FMC_D16"),
+               STM32_FUNCTION(14, "DCMI_HSYNC"),
+               STM32_FUNCTION(15, "LCD_R2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(121, "PH9"),
+               STM32_FUNCTION(0, "GPIOH9"),
+               STM32_FUNCTION(5, "I2C3_SMBA"),
+               STM32_FUNCTION(10, "TIM12_CH2"),
+               STM32_FUNCTION(13, "FMC_D17"),
+               STM32_FUNCTION(14, "DCMI_D0"),
+               STM32_FUNCTION(15, "LCD_R3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(122, "PH10"),
+               STM32_FUNCTION(0, "GPIOH10"),
+               STM32_FUNCTION(3, "TIM5_CH1"),
+               STM32_FUNCTION(5, "I2C4_SMBA"),
+               STM32_FUNCTION(13, "FMC_D18"),
+               STM32_FUNCTION(14, "DCMI_D1"),
+               STM32_FUNCTION(15, "LCD_R4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(123, "PH11"),
+               STM32_FUNCTION(0, "GPIOH11"),
+               STM32_FUNCTION(3, "TIM5_CH2"),
+               STM32_FUNCTION(5, "I2C4_SCL"),
+               STM32_FUNCTION(13, "FMC_D19"),
+               STM32_FUNCTION(14, "DCMI_D2"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(124, "PH12"),
+               STM32_FUNCTION(0, "GPIOH12"),
+               STM32_FUNCTION(3, "TIM5_CH3"),
+               STM32_FUNCTION(5, "I2C4_SDA"),
+               STM32_FUNCTION(13, "FMC_D20"),
+               STM32_FUNCTION(14, "DCMI_D3"),
+               STM32_FUNCTION(15, "LCD_R6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(125, "PH13"),
+               STM32_FUNCTION(0, "GPIOH13"),
+               STM32_FUNCTION(4, "TIM8_CH1N"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(10, "CAN1_TX"),
+               STM32_FUNCTION(13, "FMC_D21"),
+               STM32_FUNCTION(15, "LCD_G2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(126, "PH14"),
+               STM32_FUNCTION(0, "GPIOH14"),
+               STM32_FUNCTION(4, "TIM8_CH2N"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(13, "FMC_D22"),
+               STM32_FUNCTION(14, "DCMI_D4"),
+               STM32_FUNCTION(15, "LCD_G3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(127, "PH15"),
+               STM32_FUNCTION(0, "GPIOH15"),
+               STM32_FUNCTION(4, "TIM8_CH3N"),
+               STM32_FUNCTION(13, "FMC_D23"),
+               STM32_FUNCTION(14, "DCMI_D11"),
+               STM32_FUNCTION(15, "LCD_G4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(128, "PI0"),
+               STM32_FUNCTION(0, "GPIOI0"),
+               STM32_FUNCTION(3, "TIM5_CH4"),
+               STM32_FUNCTION(6, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(13, "FMC_D24"),
+               STM32_FUNCTION(14, "DCMI_D13"),
+               STM32_FUNCTION(15, "LCD_G5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(129, "PI1"),
+               STM32_FUNCTION(0, "GPIOI1"),
+               STM32_FUNCTION(4, "TIM8_BKIN2"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(13, "FMC_D25"),
+               STM32_FUNCTION(14, "DCMI_D8"),
+               STM32_FUNCTION(15, "LCD_G6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(130, "PI2"),
+               STM32_FUNCTION(0, "GPIOI2"),
+               STM32_FUNCTION(4, "TIM8_CH4"),
+               STM32_FUNCTION(6, "SPI2_MISO"),
+               STM32_FUNCTION(13, "FMC_D26"),
+               STM32_FUNCTION(14, "DCMI_D9"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(131, "PI3"),
+               STM32_FUNCTION(0, "GPIOI3"),
+               STM32_FUNCTION(4, "TIM8_ETR"),
+               STM32_FUNCTION(6, "SPI2_MOSI I2S2_SD"),
+               STM32_FUNCTION(13, "FMC_D27"),
+               STM32_FUNCTION(14, "DCMI_D10"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(132, "PI4"),
+               STM32_FUNCTION(0, "GPIOI4"),
+               STM32_FUNCTION(4, "TIM8_BKIN"),
+               STM32_FUNCTION(11, "SAI2_MCLK_A"),
+               STM32_FUNCTION(13, "FMC_NBL2"),
+               STM32_FUNCTION(14, "DCMI_D5"),
+               STM32_FUNCTION(15, "LCD_B4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(133, "PI5"),
+               STM32_FUNCTION(0, "GPIOI5"),
+               STM32_FUNCTION(4, "TIM8_CH1"),
+               STM32_FUNCTION(11, "SAI2_SCK_A"),
+               STM32_FUNCTION(13, "FMC_NBL3"),
+               STM32_FUNCTION(14, "DCMI_VSYNC"),
+               STM32_FUNCTION(15, "LCD_B5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(134, "PI6"),
+               STM32_FUNCTION(0, "GPIOI6"),
+               STM32_FUNCTION(4, "TIM8_CH2"),
+               STM32_FUNCTION(11, "SAI2_SD_A"),
+               STM32_FUNCTION(13, "FMC_D28"),
+               STM32_FUNCTION(14, "DCMI_D6"),
+               STM32_FUNCTION(15, "LCD_B6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(135, "PI7"),
+               STM32_FUNCTION(0, "GPIOI7"),
+               STM32_FUNCTION(4, "TIM8_CH3"),
+               STM32_FUNCTION(11, "SAI2_FS_A"),
+               STM32_FUNCTION(13, "FMC_D29"),
+               STM32_FUNCTION(14, "DCMI_D7"),
+               STM32_FUNCTION(15, "LCD_B7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(136, "PI8"),
+               STM32_FUNCTION(0, "GPIOI8"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(137, "PI9"),
+               STM32_FUNCTION(0, "GPIOI9"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(13, "FMC_D30"),
+               STM32_FUNCTION(15, "LCD_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(138, "PI10"),
+               STM32_FUNCTION(0, "GPIOI10"),
+               STM32_FUNCTION(12, "ETH_MII_RX_ER"),
+               STM32_FUNCTION(13, "FMC_D31"),
+               STM32_FUNCTION(15, "LCD_HSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(139, "PI11"),
+               STM32_FUNCTION(0, "GPIOI11"),
+               STM32_FUNCTION(10, "LCD_G6"),
+               STM32_FUNCTION(11, "OTG_HS_ULPI_DIR"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(140, "PI12"),
+               STM32_FUNCTION(0, "GPIOI12"),
+               STM32_FUNCTION(15, "LCD_HSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(141, "PI13"),
+               STM32_FUNCTION(0, "GPIOI13"),
+               STM32_FUNCTION(15, "LCD_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(142, "PI14"),
+               STM32_FUNCTION(0, "GPIOI14"),
+               STM32_FUNCTION(15, "LCD_CLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(143, "PI15"),
+               STM32_FUNCTION(0, "GPIOI15"),
+               STM32_FUNCTION(10, "LCD_G2"),
+               STM32_FUNCTION(15, "LCD_R0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(144, "PJ0"),
+               STM32_FUNCTION(0, "GPIOJ0"),
+               STM32_FUNCTION(10, "LCD_R7"),
+               STM32_FUNCTION(15, "LCD_R1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(145, "PJ1"),
+               STM32_FUNCTION(0, "GPIOJ1"),
+               STM32_FUNCTION(15, "LCD_R2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(146, "PJ2"),
+               STM32_FUNCTION(0, "GPIOJ2"),
+               STM32_FUNCTION(14, "DSI_TE"),
+               STM32_FUNCTION(15, "LCD_R3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(147, "PJ3"),
+               STM32_FUNCTION(0, "GPIOJ3"),
+               STM32_FUNCTION(15, "LCD_R4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(148, "PJ4"),
+               STM32_FUNCTION(0, "GPIOJ4"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(149, "PJ5"),
+               STM32_FUNCTION(0, "GPIOJ5"),
+               STM32_FUNCTION(15, "LCD_R6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(150, "PJ6"),
+               STM32_FUNCTION(0, "GPIOJ6"),
+               STM32_FUNCTION(15, "LCD_R7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(151, "PJ7"),
+               STM32_FUNCTION(0, "GPIOJ7"),
+               STM32_FUNCTION(15, "LCD_G0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(152, "PJ8"),
+               STM32_FUNCTION(0, "GPIOJ8"),
+               STM32_FUNCTION(15, "LCD_G1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(153, "PJ9"),
+               STM32_FUNCTION(0, "GPIOJ9"),
+               STM32_FUNCTION(15, "LCD_G2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(154, "PJ10"),
+               STM32_FUNCTION(0, "GPIOJ10"),
+               STM32_FUNCTION(15, "LCD_G3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(155, "PJ11"),
+               STM32_FUNCTION(0, "GPIOJ11"),
+               STM32_FUNCTION(15, "LCD_G4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(156, "PJ12"),
+               STM32_FUNCTION(0, "GPIOJ12"),
+               STM32_FUNCTION(10, "LCD_G3"),
+               STM32_FUNCTION(15, "LCD_B0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(157, "PJ13"),
+               STM32_FUNCTION(0, "GPIOJ13"),
+               STM32_FUNCTION(10, "LCD_G4"),
+               STM32_FUNCTION(15, "LCD_B1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(158, "PJ14"),
+               STM32_FUNCTION(0, "GPIOJ14"),
+               STM32_FUNCTION(15, "LCD_B2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(159, "PJ15"),
+               STM32_FUNCTION(0, "GPIOJ15"),
+               STM32_FUNCTION(15, "LCD_B3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(160, "PK0"),
+               STM32_FUNCTION(0, "GPIOK0"),
+               STM32_FUNCTION(15, "LCD_G5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(161, "PK1"),
+               STM32_FUNCTION(0, "GPIOK1"),
+               STM32_FUNCTION(15, "LCD_G6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(162, "PK2"),
+               STM32_FUNCTION(0, "GPIOK2"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(163, "PK3"),
+               STM32_FUNCTION(0, "GPIOK3"),
+               STM32_FUNCTION(15, "LCD_B4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(164, "PK4"),
+               STM32_FUNCTION(0, "GPIOK4"),
+               STM32_FUNCTION(15, "LCD_B5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(165, "PK5"),
+               STM32_FUNCTION(0, "GPIOK5"),
+               STM32_FUNCTION(15, "LCD_B6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(166, "PK6"),
+               STM32_FUNCTION(0, "GPIOK6"),
+               STM32_FUNCTION(15, "LCD_B7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(167, "PK7"),
+               STM32_FUNCTION(0, "GPIOK7"),
+               STM32_FUNCTION(15, "LCD_DE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+};
+
+static struct stm32_pinctrl_match_data stm32f769_match_data = {
+       .pins = stm32f769_pins,
+       .npins = ARRAY_SIZE(stm32f769_pins),
+};
+
+static const struct of_device_id stm32f769_pctrl_match[] = {
+       {
+               .compatible = "st,stm32f769-pinctrl",
+               .data = &stm32f769_match_data,
+       },
+       { }
+};
+
+static struct platform_driver stm32f769_pinctrl_driver = {
+       .probe = stm32_pctl_probe,
+       .driver = {
+               .name = "stm32f769-pinctrl",
+               .of_match_table = stm32f769_pctrl_match,
+       },
+};
+
+static int __init stm32f769_pinctrl_init(void)
+{
+       return platform_driver_register(&stm32f769_pinctrl_driver);
+}
+arch_initcall(stm32f769_pinctrl_init);
index e34b2b9217ce1ed3aef3063cb63cf96fff56df7d..ffe7b52715069da220f3e76e7ade51dffa1d9f4a 100644 (file)
@@ -1,7 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
- * Copyright (C) Alexandre Torgue 2017
- * Author:  Alexandre Torgue <alexandre.torgue@st.com>
- * License terms:  GNU General Public License (GPL), version 2
+ * Copyright (C) STMicroelectronics 2017
+ * Author:  Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
  */
 #include <linux/init.h>
 #include <linux/of.h>
diff --git a/drivers/pinctrl/stm32/pinctrl-stm32mp157.c b/drivers/pinctrl/stm32/pinctrl-stm32mp157.c
new file mode 100644 (file)
index 0000000..7c7d628
--- /dev/null
@@ -0,0 +1,2188 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) STMicroelectronics 2017 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+#include <linux/init.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+#include "pinctrl-stm32.h"
+
+static const struct stm32_desc_pin stm32mp157_pins[] = {
+       STM32_PIN(
+               PINCTRL_PIN(0, "PA0"),
+               STM32_FUNCTION(0, "GPIOA0"),
+               STM32_FUNCTION(2, "TIM2_CH1 TIM2_ETR"),
+               STM32_FUNCTION(3, "TIM5_CH1"),
+               STM32_FUNCTION(4, "TIM8_ETR"),
+               STM32_FUNCTION(5, "TIM15_BKIN"),
+               STM32_FUNCTION(8, "USART2_CTS_NSS USART_BOOT2_CTS_NSS"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(10, "SDMMC2_CMD"),
+               STM32_FUNCTION(11, "SAI2_SD_B"),
+               STM32_FUNCTION(12, "ETH_GMII_CRS ETH_MII_CRS"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(1, "PA1"),
+               STM32_FUNCTION(0, "GPIOA1"),
+               STM32_FUNCTION(1, "ETH_CLK"),
+               STM32_FUNCTION(2, "TIM2_CH2"),
+               STM32_FUNCTION(3, "TIM5_CH2"),
+               STM32_FUNCTION(4, "LPTIM3_OUT"),
+               STM32_FUNCTION(5, "TIM15_CH1N"),
+               STM32_FUNCTION(8, "USART2_RTS USART_BOOT2_RTS"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO3 QUADSPI_BOOTBK1_IO3"),
+               STM32_FUNCTION(11, "SAI2_MCLK_B"),
+               STM32_FUNCTION(12, "ETH_GMII_RX_CLK ETH_MII_RX_CLK ETH_RGMII_RX_CLK ETH_RMII_REF_CLK"),
+               STM32_FUNCTION(15, "LCD_R2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(2, "PA2"),
+               STM32_FUNCTION(0, "GPIOA2"),
+               STM32_FUNCTION(2, "TIM2_CH3"),
+               STM32_FUNCTION(3, "TIM5_CH3"),
+               STM32_FUNCTION(4, "LPTIM4_OUT"),
+               STM32_FUNCTION(5, "TIM15_CH1"),
+               STM32_FUNCTION(8, "USART2_TX USART_BOOT2_TX"),
+               STM32_FUNCTION(9, "SAI2_SCK_B"),
+               STM32_FUNCTION(11, "SDMMC2_D0DIR SDMMC_BOOT2_D0DIR"),
+               STM32_FUNCTION(12, "ETH_MDIO"),
+               STM32_FUNCTION(13, "MDIOS_MDIO"),
+               STM32_FUNCTION(15, "LCD_R1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(3, "PA3"),
+               STM32_FUNCTION(0, "GPIOA3"),
+               STM32_FUNCTION(2, "TIM2_CH4"),
+               STM32_FUNCTION(3, "TIM5_CH4"),
+               STM32_FUNCTION(4, "LPTIM5_OUT"),
+               STM32_FUNCTION(5, "TIM15_CH2"),
+               STM32_FUNCTION(8, "USART2_RX USART_BOOT2_RX"),
+               STM32_FUNCTION(10, "LCD_B2"),
+               STM32_FUNCTION(12, "ETH_GMII_COL ETH_MII_COL"),
+               STM32_FUNCTION(15, "LCD_B5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(4, "PA4"),
+               STM32_FUNCTION(0, "GPIOA4"),
+               STM32_FUNCTION(1, "HDP0"),
+               STM32_FUNCTION(3, "TIM5_ETR"),
+               STM32_FUNCTION(5, "SAI4_D2"),
+               STM32_FUNCTION(6, "SPI1_NSS I2S1_WS"),
+               STM32_FUNCTION(7, "SPI3_NSS I2S3_WS"),
+               STM32_FUNCTION(8, "USART2_CK USART_BOOT2_CK"),
+               STM32_FUNCTION(9, "SPI6_NSS"),
+               STM32_FUNCTION(13, "SAI4_FS_A"),
+               STM32_FUNCTION(14, "DCMI_HSYNC"),
+               STM32_FUNCTION(15, "LCD_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(5, "PA5"),
+               STM32_FUNCTION(0, "GPIOA5"),
+               STM32_FUNCTION(2, "TIM2_CH1 TIM2_ETR"),
+               STM32_FUNCTION(4, "TIM8_CH1N"),
+               STM32_FUNCTION(5, "SAI4_CK1"),
+               STM32_FUNCTION(6, "SPI1_SCK I2S1_CK"),
+               STM32_FUNCTION(9, "SPI6_SCK"),
+               STM32_FUNCTION(13, "SAI4_MCLK_A"),
+               STM32_FUNCTION(15, "LCD_R4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(6, "PA6"),
+               STM32_FUNCTION(0, "GPIOA6"),
+               STM32_FUNCTION(2, "TIM1_BKIN"),
+               STM32_FUNCTION(3, "TIM3_CH1"),
+               STM32_FUNCTION(4, "TIM8_BKIN"),
+               STM32_FUNCTION(5, "SAI4_CK2"),
+               STM32_FUNCTION(6, "SPI1_MISO I2S1_SDI"),
+               STM32_FUNCTION(9, "SPI6_MISO"),
+               STM32_FUNCTION(10, "TIM13_CH1"),
+               STM32_FUNCTION(12, "MDIOS_MDC"),
+               STM32_FUNCTION(13, "SAI4_SCK_A"),
+               STM32_FUNCTION(14, "DCMI_PIXCLK"),
+               STM32_FUNCTION(15, "LCD_G2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(7, "PA7"),
+               STM32_FUNCTION(0, "GPIOA7"),
+               STM32_FUNCTION(2, "TIM1_CH1N"),
+               STM32_FUNCTION(3, "TIM3_CH2"),
+               STM32_FUNCTION(4, "TIM8_CH1N"),
+               STM32_FUNCTION(5, "SAI4_D1"),
+               STM32_FUNCTION(6, "SPI1_MOSI I2S1_SDO"),
+               STM32_FUNCTION(9, "SPI6_MOSI"),
+               STM32_FUNCTION(10, "TIM14_CH1"),
+               STM32_FUNCTION(11, "QUADSPI_CLK"),
+               STM32_FUNCTION(12, "ETH_GMII_RX_DV ETH_MII_RX_DV ETH_RGMII_RX_CTL ETH_RMII_CRS_DV"),
+               STM32_FUNCTION(13, "SAI4_SD_A"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(8, "PA8"),
+               STM32_FUNCTION(0, "GPIOA8"),
+               STM32_FUNCTION(1, "MCO1"),
+               STM32_FUNCTION(2, "TIM1_CH1"),
+               STM32_FUNCTION(4, "TIM8_BKIN2"),
+               STM32_FUNCTION(5, "I2C3_SCL"),
+               STM32_FUNCTION(6, "SPI3_MOSI I2S3_SDO"),
+               STM32_FUNCTION(8, "USART1_CK"),
+               STM32_FUNCTION(9, "SDMMC2_CKIN SDMMC_BOOT2_CKIN"),
+               STM32_FUNCTION(10, "SDMMC2_D4 SDMMC_BOOT2_D4"),
+               STM32_FUNCTION(11, "USBO_SOF"),
+               STM32_FUNCTION(13, "SAI4_SD_B"),
+               STM32_FUNCTION(14, "UART7_RX"),
+               STM32_FUNCTION(15, "LCD_R6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(9, "PA9"),
+               STM32_FUNCTION(0, "GPIOA9"),
+               STM32_FUNCTION(2, "TIM1_CH2"),
+               STM32_FUNCTION(5, "I2C3_SMBA"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(8, "USART1_TX"),
+               STM32_FUNCTION(9, "SDMMC2_CDIR SDMMC_BOOT2_CDIR"),
+               STM32_FUNCTION(10, "CAN1_RXFD"),
+               STM32_FUNCTION(11, "SDMMC2_D5 SDMMC_BOOT2_D5"),
+               STM32_FUNCTION(14, "DCMI_D0"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(10, "PA10"),
+               STM32_FUNCTION(0, "GPIOA10"),
+               STM32_FUNCTION(2, "TIM1_CH3"),
+               STM32_FUNCTION(6, "SPI3_NSS I2S3_WS"),
+               STM32_FUNCTION(8, "USART1_RX"),
+               STM32_FUNCTION(10, "CAN1_TXFD"),
+               STM32_FUNCTION(12, "MDIOS_MDIO"),
+               STM32_FUNCTION(13, "SAI4_FS_B"),
+               STM32_FUNCTION(14, "DCMI_D1"),
+               STM32_FUNCTION(15, "LCD_B1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(11, "PA11"),
+               STM32_FUNCTION(0, "GPIOA11"),
+               STM32_FUNCTION(2, "TIM1_CH4"),
+               STM32_FUNCTION(3, "I2C6_SCL"),
+               STM32_FUNCTION(5, "I2C5_SCL"),
+               STM32_FUNCTION(6, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(7, "UART4_RX"),
+               STM32_FUNCTION(8, "USART1_CTS_NSS"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(15, "LCD_R4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(12, "PA12"),
+               STM32_FUNCTION(0, "GPIOA12"),
+               STM32_FUNCTION(2, "TIM1_ETR"),
+               STM32_FUNCTION(3, "I2C6_SDA"),
+               STM32_FUNCTION(5, "I2C5_SDA"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(7, "UART4_TX"),
+               STM32_FUNCTION(8, "USART1_RTS"),
+               STM32_FUNCTION(9, "SAI2_FS_B"),
+               STM32_FUNCTION(10, "CAN1_TX"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(13, "PA13"),
+               STM32_FUNCTION(0, "GPIOA13"),
+               STM32_FUNCTION(1, "DBTRGO"),
+               STM32_FUNCTION(2, "DBTRGI"),
+               STM32_FUNCTION(3, "MCO1"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(14, "PA14"),
+               STM32_FUNCTION(0, "GPIOA14"),
+               STM32_FUNCTION(1, "DBTRGO"),
+               STM32_FUNCTION(2, "DBTRGI"),
+               STM32_FUNCTION(3, "MCO2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(15, "PA15"),
+               STM32_FUNCTION(0, "GPIOA15"),
+               STM32_FUNCTION(1, "DBTRGI"),
+               STM32_FUNCTION(2, "TIM2_CH1 TIM2_ETR"),
+               STM32_FUNCTION(3, "SAI4_D2"),
+               STM32_FUNCTION(4, "SDMMC1_CDIR"),
+               STM32_FUNCTION(5, "HDMI_CEC"),
+               STM32_FUNCTION(6, "SPI1_NSS I2S1_WS"),
+               STM32_FUNCTION(7, "SPI3_NSS I2S3_WS"),
+               STM32_FUNCTION(8, "SPI6_NSS"),
+               STM32_FUNCTION(9, "UART4_RTS UART_BOOT4_RTS"),
+               STM32_FUNCTION(10, "SDMMC2_D5 SDMMC_BOOT2_D5"),
+               STM32_FUNCTION(11, "SDMMC2_CDIR SDMMC_BOOT2_CDIR"),
+               STM32_FUNCTION(12, "SDMMC1_D5 SDMMC_BOOT1_D5"),
+               STM32_FUNCTION(13, "SAI4_FS_A"),
+               STM32_FUNCTION(14, "UART7_TX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(16, "PB0"),
+               STM32_FUNCTION(0, "GPIOB0"),
+               STM32_FUNCTION(2, "TIM1_CH2N"),
+               STM32_FUNCTION(3, "TIM3_CH3"),
+               STM32_FUNCTION(4, "TIM8_CH2N"),
+               STM32_FUNCTION(7, "DFSDM_CKOUT"),
+               STM32_FUNCTION(9, "UART4_CTS UART_BOOT4_CTS"),
+               STM32_FUNCTION(10, "LCD_R3"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD2 ETH_MII_RXD2 ETH_RGMII_RXD2"),
+               STM32_FUNCTION(13, "MDIOS_MDIO"),
+               STM32_FUNCTION(15, "LCD_G1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(17, "PB1"),
+               STM32_FUNCTION(0, "GPIOB1"),
+               STM32_FUNCTION(2, "TIM1_CH3N"),
+               STM32_FUNCTION(3, "TIM3_CH4"),
+               STM32_FUNCTION(4, "TIM8_CH3N"),
+               STM32_FUNCTION(7, "DFSDM_DATA1"),
+               STM32_FUNCTION(10, "LCD_R6"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD3 ETH_MII_RXD3 ETH_RGMII_RXD3"),
+               STM32_FUNCTION(13, "MDIOS_MDC"),
+               STM32_FUNCTION(15, "LCD_G0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(18, "PB2"),
+               STM32_FUNCTION(0, "GPIOB2"),
+               STM32_FUNCTION(1, "TRACED4"),
+               STM32_FUNCTION(2, "RTC_OUT2"),
+               STM32_FUNCTION(3, "SAI1_D1"),
+               STM32_FUNCTION(4, "DFSDM_CK1"),
+               STM32_FUNCTION(5, "USART1_RX"),
+               STM32_FUNCTION(6, "I2S_CKIN"),
+               STM32_FUNCTION(7, "SAI1_SD_A"),
+               STM32_FUNCTION(8, "SPI3_MOSI I2S3_SDO"),
+               STM32_FUNCTION(9, "UART4_RX UART_BOOT4_RX"),
+               STM32_FUNCTION(10, "QUADSPI_CLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(19, "PB3"),
+               STM32_FUNCTION(0, "GPIOB3"),
+               STM32_FUNCTION(1, "TRACED9"),
+               STM32_FUNCTION(2, "TIM2_CH2"),
+               STM32_FUNCTION(5, "SAI4_CK1"),
+               STM32_FUNCTION(6, "SPI1_SCK I2S1_CK"),
+               STM32_FUNCTION(7, "SPI3_SCK I2S3_CK"),
+               STM32_FUNCTION(9, "SPI6_SCK"),
+               STM32_FUNCTION(10, "SDMMC2_D2 SDMMC_BOOT2_D2"),
+               STM32_FUNCTION(13, "SAI4_MCLK_A"),
+               STM32_FUNCTION(14, "UART7_RX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(20, "PB4"),
+               STM32_FUNCTION(0, "GPIOB4"),
+               STM32_FUNCTION(1, "TRACED8"),
+               STM32_FUNCTION(2, "TIM16_BKIN"),
+               STM32_FUNCTION(3, "TIM3_CH1"),
+               STM32_FUNCTION(5, "SAI4_CK2"),
+               STM32_FUNCTION(6, "SPI1_MISO I2S1_SDI"),
+               STM32_FUNCTION(7, "SPI3_MISO I2S3_SDI"),
+               STM32_FUNCTION(8, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(9, "SPI6_MISO"),
+               STM32_FUNCTION(10, "SDMMC2_D3 SDMMC_BOOT2_D3"),
+               STM32_FUNCTION(13, "SAI4_SCK_A"),
+               STM32_FUNCTION(14, "UART7_TX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(21, "PB5"),
+               STM32_FUNCTION(0, "GPIOB5"),
+               STM32_FUNCTION(1, "ETH_CLK"),
+               STM32_FUNCTION(2, "TIM17_BKIN"),
+               STM32_FUNCTION(3, "TIM3_CH2"),
+               STM32_FUNCTION(4, "SAI4_D1"),
+               STM32_FUNCTION(5, "I2C1_SMBA"),
+               STM32_FUNCTION(6, "SPI1_MOSI I2S1_SDO"),
+               STM32_FUNCTION(7, "I2C4_SMBA"),
+               STM32_FUNCTION(8, "SPI3_MOSI I2S3_SDO"),
+               STM32_FUNCTION(9, "SPI6_MOSI"),
+               STM32_FUNCTION(10, "CAN2_RX"),
+               STM32_FUNCTION(11, "SAI4_SD_A"),
+               STM32_FUNCTION(12, "ETH_PPS_OUT"),
+               STM32_FUNCTION(13, "UART5_RX UART_BOOT5_RX"),
+               STM32_FUNCTION(14, "DCMI_D10"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(22, "PB6"),
+               STM32_FUNCTION(0, "GPIOB6"),
+               STM32_FUNCTION(2, "TIM16_CH1N"),
+               STM32_FUNCTION(3, "TIM4_CH1"),
+               STM32_FUNCTION(5, "I2C1_SCL"),
+               STM32_FUNCTION(6, "HDMI_CEC"),
+               STM32_FUNCTION(7, "I2C4_SCL"),
+               STM32_FUNCTION(8, "USART1_TX"),
+               STM32_FUNCTION(10, "CAN2_TX"),
+               STM32_FUNCTION(11, "QUADSPI_BK1_NCS QUADSPI_BOOTBK1_NCS"),
+               STM32_FUNCTION(12, "DFSDM_DATA5"),
+               STM32_FUNCTION(13, "UART5_TX"),
+               STM32_FUNCTION(14, "DCMI_D5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(23, "PB7"),
+               STM32_FUNCTION(0, "GPIOB7"),
+               STM32_FUNCTION(2, "TIM17_CH1N"),
+               STM32_FUNCTION(3, "TIM4_CH2"),
+               STM32_FUNCTION(5, "I2C1_SDA"),
+               STM32_FUNCTION(7, "I2C4_SDA"),
+               STM32_FUNCTION(8, "USART1_RX"),
+               STM32_FUNCTION(10, "CAN2_TXFD"),
+               STM32_FUNCTION(11, "SDMMC2_D1 SDMMC_BOOT2_D1"),
+               STM32_FUNCTION(12, "DFSDM_CK5"),
+               STM32_FUNCTION(13, "FMC_NL"),
+               STM32_FUNCTION(14, "DCMI_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(24, "PB8"),
+               STM32_FUNCTION(0, "GPIOB8"),
+               STM32_FUNCTION(1, "HDP6"),
+               STM32_FUNCTION(2, "TIM16_CH1"),
+               STM32_FUNCTION(3, "TIM4_CH3"),
+               STM32_FUNCTION(4, "DFSDM_CK7"),
+               STM32_FUNCTION(5, "I2C1_SCL"),
+               STM32_FUNCTION(6, "SDMMC1_CKIN SDMMC_BOOT1_CKIN"),
+               STM32_FUNCTION(7, "I2C4_SCL"),
+               STM32_FUNCTION(8, "SDMMC2_CKIN SDMMC_BOOT2_CKIN"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(11, "SDMMC2_D4 SDMMC_BOOT2_D4"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD3 ETH_MII_TXD3 ETH_RGMII_TXD3"),
+               STM32_FUNCTION(13, "SDMMC1_D4 SDMMC_BOOT1_D4"),
+               STM32_FUNCTION(14, "DCMI_D6"),
+               STM32_FUNCTION(15, "LCD_B6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(25, "PB9"),
+               STM32_FUNCTION(0, "GPIOB9"),
+               STM32_FUNCTION(1, "HDP7"),
+               STM32_FUNCTION(2, "TIM17_CH1"),
+               STM32_FUNCTION(3, "TIM4_CH4"),
+               STM32_FUNCTION(4, "DFSDM_DATA7"),
+               STM32_FUNCTION(5, "I2C1_SDA"),
+               STM32_FUNCTION(6, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(7, "I2C4_SDA"),
+               STM32_FUNCTION(8, "SDMMC2_CDIR SDMMC_BOOT2_CDIR"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(10, "CAN1_TX"),
+               STM32_FUNCTION(11, "SDMMC2_D5 SDMMC_BOOT2_D5"),
+               STM32_FUNCTION(12, "SDMMC1_CDIR SDMMC_BOOT1_CDIR"),
+               STM32_FUNCTION(13, "SDMMC1_D5 SDMMC_BOOT1_D5"),
+               STM32_FUNCTION(14, "DCMI_D7"),
+               STM32_FUNCTION(15, "LCD_B7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(26, "PB10"),
+               STM32_FUNCTION(0, "GPIOB10"),
+               STM32_FUNCTION(2, "TIM2_CH3"),
+               STM32_FUNCTION(4, "LPTIM2_IN1"),
+               STM32_FUNCTION(5, "I2C2_SCL"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(7, "DFSDM_DATA7"),
+               STM32_FUNCTION(8, "USART3_TX USART_BOOT3_TX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_NCS"),
+               STM32_FUNCTION(12, "ETH_GMII_RX_ER ETH_MII_RX_ER"),
+               STM32_FUNCTION(15, "LCD_G4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(27, "PB11"),
+               STM32_FUNCTION(0, "GPIOB11"),
+               STM32_FUNCTION(2, "TIM2_CH4"),
+               STM32_FUNCTION(4, "LPTIM2_ETR"),
+               STM32_FUNCTION(5, "I2C2_SDA"),
+               STM32_FUNCTION(7, "DFSDM_CK7"),
+               STM32_FUNCTION(8, "USART3_RX"),
+               STM32_FUNCTION(12, "ETH_GMII_TX_EN ETH_MII_TX_EN ETH_RGMII_TX_CTL ETH_RMII_TX_EN"),
+               STM32_FUNCTION(14, "DSI_TE"),
+               STM32_FUNCTION(15, "LCD_G5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(28, "PB12"),
+               STM32_FUNCTION(0, "GPIOB12"),
+               STM32_FUNCTION(2, "TIM1_BKIN"),
+               STM32_FUNCTION(3, "I2C6_SMBA"),
+               STM32_FUNCTION(5, "I2C2_SMBA"),
+               STM32_FUNCTION(6, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(7, "DFSDM_DATA1"),
+               STM32_FUNCTION(8, "USART3_CK USART_BOOT3_CK"),
+               STM32_FUNCTION(9, "USART3_RX USART_BOOT3_RX"),
+               STM32_FUNCTION(10, "CAN2_RX"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD0 ETH_MII_TXD0 ETH_RGMII_TXD0 ETH_RMII_TXD0"),
+               STM32_FUNCTION(15, "UART5_RX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(29, "PB13"),
+               STM32_FUNCTION(0, "GPIOB13"),
+               STM32_FUNCTION(2, "TIM1_CH1N"),
+               STM32_FUNCTION(4, "DFSDM_CKOUT"),
+               STM32_FUNCTION(5, "LPTIM2_OUT"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(7, "DFSDM_CK1"),
+               STM32_FUNCTION(8, "USART3_CTS_NSS USART_BOOT3_CTS_NSS"),
+               STM32_FUNCTION(10, "CAN2_TX"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD1 ETH_MII_TXD1 ETH_RGMII_TXD1 ETH_RMII_TXD1"),
+               STM32_FUNCTION(15, "UART5_TX UART_BOOT5_TX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(30, "PB14"),
+               STM32_FUNCTION(0, "GPIOB14"),
+               STM32_FUNCTION(2, "TIM1_CH2N"),
+               STM32_FUNCTION(3, "TIM12_CH1"),
+               STM32_FUNCTION(4, "TIM8_CH2N"),
+               STM32_FUNCTION(5, "USART1_TX"),
+               STM32_FUNCTION(6, "SPI2_MISO I2S2_SDI"),
+               STM32_FUNCTION(7, "DFSDM_DATA2"),
+               STM32_FUNCTION(8, "USART3_RTS USART_BOOT3_RTS"),
+               STM32_FUNCTION(10, "SDMMC2_D0 SDMMC_BOOT2_D0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(31, "PB15"),
+               STM32_FUNCTION(0, "GPIOB15"),
+               STM32_FUNCTION(1, "RTC_REFIN"),
+               STM32_FUNCTION(2, "TIM1_CH3N"),
+               STM32_FUNCTION(3, "TIM12_CH2"),
+               STM32_FUNCTION(4, "TIM8_CH3N"),
+               STM32_FUNCTION(5, "USART1_RX"),
+               STM32_FUNCTION(6, "SPI2_MOSI I2S2_SDO"),
+               STM32_FUNCTION(7, "DFSDM_CK2"),
+               STM32_FUNCTION(10, "SDMMC2_D1 SDMMC_BOOT2_D1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(32, "PC0"),
+               STM32_FUNCTION(0, "GPIOC0"),
+               STM32_FUNCTION(4, "DFSDM_CK0"),
+               STM32_FUNCTION(5, "LPTIM2_IN2"),
+               STM32_FUNCTION(7, "DFSDM_DATA4"),
+               STM32_FUNCTION(9, "SAI2_FS_B"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_NCS QUADSPI_BOOTBK2_NCS"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(33, "PC1"),
+               STM32_FUNCTION(0, "GPIOC1"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(3, "SAI1_D1"),
+               STM32_FUNCTION(4, "DFSDM_DATA0"),
+               STM32_FUNCTION(5, "DFSDM_CK4"),
+               STM32_FUNCTION(6, "SPI2_MOSI I2S2_SDO"),
+               STM32_FUNCTION(7, "SAI1_SD_A"),
+               STM32_FUNCTION(10, "SDMMC2_CK"),
+               STM32_FUNCTION(12, "ETH_MDC"),
+               STM32_FUNCTION(13, "MDIOS_MDC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(34, "PC2"),
+               STM32_FUNCTION(0, "GPIOC2"),
+               STM32_FUNCTION(4, "DFSDM_CK1"),
+               STM32_FUNCTION(6, "SPI2_MISO I2S2_SDI"),
+               STM32_FUNCTION(7, "DFSDM_CKOUT"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD2 ETH_MII_TXD2 ETH_RGMII_TXD2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(35, "PC3"),
+               STM32_FUNCTION(0, "GPIOC3"),
+               STM32_FUNCTION(1, "TRACECLK"),
+               STM32_FUNCTION(4, "DFSDM_DATA1"),
+               STM32_FUNCTION(6, "SPI2_MOSI I2S2_SDO"),
+               STM32_FUNCTION(12, "ETH_GMII_TX_CLK ETH_MII_TX_CLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(36, "PC4"),
+               STM32_FUNCTION(0, "GPIOC4"),
+               STM32_FUNCTION(4, "DFSDM_CK2"),
+               STM32_FUNCTION(6, "I2S1_MCK"),
+               STM32_FUNCTION(10, "SPDIF_IN2"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD0 ETH_MII_RXD0 ETH_RGMII_RXD0 ETH_RMII_RXD0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(37, "PC5"),
+               STM32_FUNCTION(0, "GPIOC5"),
+               STM32_FUNCTION(3, "SAI1_D3"),
+               STM32_FUNCTION(4, "DFSDM_DATA2"),
+               STM32_FUNCTION(5, "SAI4_D4"),
+               STM32_FUNCTION(7, "SAI1_D4"),
+               STM32_FUNCTION(10, "SPDIF_IN3"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD1 ETH_MII_RXD1 ETH_RGMII_RXD1 ETH_RMII_RXD1"),
+               STM32_FUNCTION(13, "SAI4_D3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(38, "PC6"),
+               STM32_FUNCTION(0, "GPIOC6"),
+               STM32_FUNCTION(1, "HDP1"),
+               STM32_FUNCTION(3, "TIM3_CH1"),
+               STM32_FUNCTION(4, "TIM8_CH1"),
+               STM32_FUNCTION(5, "DFSDM_CK3"),
+               STM32_FUNCTION(6, "I2S2_MCK"),
+               STM32_FUNCTION(8, "USART6_TX USART_BOOT6_TX"),
+               STM32_FUNCTION(9, "SDMMC1_D0DIR SDMMC_BOOT1_D0DIR"),
+               STM32_FUNCTION(10, "SDMMC2_D0DIR SDMMC_BOOT2_D0DIR"),
+               STM32_FUNCTION(11, "SDMMC2_D6 SDMMC_BOOT2_D6"),
+               STM32_FUNCTION(12, "DSI_TE"),
+               STM32_FUNCTION(13, "SDMMC1_D6 SDMMC_BOOT1_D6"),
+               STM32_FUNCTION(14, "DCMI_D0"),
+               STM32_FUNCTION(15, "LCD_HSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(39, "PC7"),
+               STM32_FUNCTION(0, "GPIOC7"),
+               STM32_FUNCTION(1, "HDP4"),
+               STM32_FUNCTION(3, "TIM3_CH2"),
+               STM32_FUNCTION(4, "TIM8_CH2"),
+               STM32_FUNCTION(5, "DFSDM_DATA3"),
+               STM32_FUNCTION(7, "I2S3_MCK"),
+               STM32_FUNCTION(8, "USART6_RX USART_BOOT6_RX"),
+               STM32_FUNCTION(9, "SDMMC1_D123DIR SDMMC_BOOT1_D123DIR"),
+               STM32_FUNCTION(10, "SDMMC2_D123DIR SDMMC_BOOT2_D123DIR"),
+               STM32_FUNCTION(11, "SDMMC2_D7 SDMMC_BOOT2_D7"),
+               STM32_FUNCTION(13, "SDMMC1_D7 SDMMC_BOOT1_D7"),
+               STM32_FUNCTION(14, "DCMI_D1"),
+               STM32_FUNCTION(15, "LCD_G6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(40, "PC8"),
+               STM32_FUNCTION(0, "GPIOC8"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(3, "TIM3_CH3"),
+               STM32_FUNCTION(4, "TIM8_CH3"),
+               STM32_FUNCTION(7, "UART4_TX"),
+               STM32_FUNCTION(8, "USART6_CK USART_BOOT6_CK"),
+               STM32_FUNCTION(9, "UART5_RTS UART_BOOT5_RTS"),
+               STM32_FUNCTION(13, "SDMMC1_D0 SDMMC_BOOT1_D0"),
+               STM32_FUNCTION(14, "DCMI_D2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(41, "PC9"),
+               STM32_FUNCTION(0, "GPIOC9"),
+               STM32_FUNCTION(1, "TRACED1"),
+               STM32_FUNCTION(3, "TIM3_CH4"),
+               STM32_FUNCTION(4, "TIM8_CH4"),
+               STM32_FUNCTION(5, "I2C3_SDA"),
+               STM32_FUNCTION(6, "I2S_CKIN"),
+               STM32_FUNCTION(9, "UART5_CTS UART_BOOT5_CTS"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO0"),
+               STM32_FUNCTION(13, "SDMMC1_D1 SDMMC_BOOT1_D1"),
+               STM32_FUNCTION(14, "DCMI_D3"),
+               STM32_FUNCTION(15, "LCD_B2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(42, "PC10"),
+               STM32_FUNCTION(0, "GPIOC10"),
+               STM32_FUNCTION(1, "TRACED2"),
+               STM32_FUNCTION(4, "DFSDM_CK5"),
+               STM32_FUNCTION(7, "SPI3_SCK I2S3_CK"),
+               STM32_FUNCTION(8, "USART3_TX"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO1"),
+               STM32_FUNCTION(11, "SAI4_MCLK_B"),
+               STM32_FUNCTION(13, "SDMMC1_D2 SDMMC_BOOT1_D2"),
+               STM32_FUNCTION(14, "DCMI_D8"),
+               STM32_FUNCTION(15, "LCD_R2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(43, "PC11"),
+               STM32_FUNCTION(0, "GPIOC11"),
+               STM32_FUNCTION(1, "TRACED3"),
+               STM32_FUNCTION(4, "DFSDM_DATA5"),
+               STM32_FUNCTION(7, "SPI3_MISO I2S3_SDI"),
+               STM32_FUNCTION(8, "USART3_RX"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_NCS QUADSPI_BOOTBK2_NCS"),
+               STM32_FUNCTION(11, "SAI4_SCK_B"),
+               STM32_FUNCTION(13, "SDMMC1_D3 SDMMC_BOOT1_D3"),
+               STM32_FUNCTION(14, "DCMI_D4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(44, "PC12"),
+               STM32_FUNCTION(0, "GPIOC12"),
+               STM32_FUNCTION(1, "TRACECLK"),
+               STM32_FUNCTION(2, "MCO2"),
+               STM32_FUNCTION(3, "SAI4_D3"),
+               STM32_FUNCTION(7, "SPI3_MOSI I2S3_SDO"),
+               STM32_FUNCTION(8, "USART3_CK USART_BOOT3_CK"),
+               STM32_FUNCTION(9, "UART5_TX"),
+               STM32_FUNCTION(11, "SAI4_SD_B"),
+               STM32_FUNCTION(13, "SDMMC1_CK SDMMC_BOOT1_CK"),
+               STM32_FUNCTION(14, "DCMI_D9"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(45, "PC13"),
+               STM32_FUNCTION(0, "GPIOC13"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(46, "PC14"),
+               STM32_FUNCTION(0, "GPIOC14"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(47, "PC15"),
+               STM32_FUNCTION(0, "GPIOC15"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(48, "PD0"),
+               STM32_FUNCTION(0, "GPIOD0"),
+               STM32_FUNCTION(3, "I2C6_SDA"),
+               STM32_FUNCTION(4, "DFSDM_CK6"),
+               STM32_FUNCTION(5, "I2C5_SDA"),
+               STM32_FUNCTION(7, "SAI3_SCK_A"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(11, "SDMMC3_CMD"),
+               STM32_FUNCTION(12, "DFSDM_DATA7"),
+               STM32_FUNCTION(13, "FMC_D2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(49, "PD1"),
+               STM32_FUNCTION(0, "GPIOD1"),
+               STM32_FUNCTION(3, "I2C6_SCL"),
+               STM32_FUNCTION(4, "DFSDM_DATA6"),
+               STM32_FUNCTION(5, "I2C5_SCL"),
+               STM32_FUNCTION(7, "SAI3_SD_A"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(10, "CAN1_TX"),
+               STM32_FUNCTION(11, "SDMMC3_D0"),
+               STM32_FUNCTION(12, "DFSDM_CK7"),
+               STM32_FUNCTION(13, "FMC_D3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(50, "PD2"),
+               STM32_FUNCTION(0, "GPIOD2"),
+               STM32_FUNCTION(3, "TIM3_ETR"),
+               STM32_FUNCTION(5, "I2C5_SMBA"),
+               STM32_FUNCTION(7, "UART4_RX"),
+               STM32_FUNCTION(9, "UART5_RX"),
+               STM32_FUNCTION(13, "SDMMC1_CMD SDMMC_BOOT1_CMD"),
+               STM32_FUNCTION(14, "DCMI_D11"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(51, "PD3"),
+               STM32_FUNCTION(0, "GPIOD3"),
+               STM32_FUNCTION(1, "HDP5"),
+               STM32_FUNCTION(4, "DFSDM_CKOUT"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(7, "DFSDM_DATA0"),
+               STM32_FUNCTION(8, "USART2_CTS_NSS USART_BOOT2_CTS_NSS"),
+               STM32_FUNCTION(9, "SDMMC1_D123DIR SDMMC_BOOT1_D123DIR"),
+               STM32_FUNCTION(10, "SDMMC2_D7 SDMMC_BOOT2_D7"),
+               STM32_FUNCTION(11, "SDMMC2_D123DIR SDMMC_BOOT2_D123DIR"),
+               STM32_FUNCTION(12, "SDMMC1_D7 SDMMC_BOOT1_D7"),
+               STM32_FUNCTION(13, "FMC_CLK"),
+               STM32_FUNCTION(14, "DCMI_D5"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(52, "PD4"),
+               STM32_FUNCTION(0, "GPIOD4"),
+               STM32_FUNCTION(7, "SAI3_FS_A"),
+               STM32_FUNCTION(8, "USART2_RTS USART_BOOT2_RTS"),
+               STM32_FUNCTION(10, "CAN1_RXFD"),
+               STM32_FUNCTION(11, "SDMMC3_D1"),
+               STM32_FUNCTION(12, "DFSDM_CK0"),
+               STM32_FUNCTION(13, "FMC_NOE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(53, "PD5"),
+               STM32_FUNCTION(0, "GPIOD5"),
+               STM32_FUNCTION(8, "USART2_TX"),
+               STM32_FUNCTION(10, "CAN1_TXFD"),
+               STM32_FUNCTION(11, "SDMMC3_D2"),
+               STM32_FUNCTION(13, "FMC_NWE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(54, "PD6"),
+               STM32_FUNCTION(0, "GPIOD6"),
+               STM32_FUNCTION(2, "TIM16_CH1N"),
+               STM32_FUNCTION(3, "SAI1_D1"),
+               STM32_FUNCTION(4, "DFSDM_CK4"),
+               STM32_FUNCTION(5, "DFSDM_DATA1"),
+               STM32_FUNCTION(6, "SPI3_MOSI I2S3_SDO"),
+               STM32_FUNCTION(7, "SAI1_SD_A"),
+               STM32_FUNCTION(8, "USART2_RX"),
+               STM32_FUNCTION(10, "CAN2_RXFD"),
+               STM32_FUNCTION(11, "FMC_INT"),
+               STM32_FUNCTION(13, "FMC_NWAIT"),
+               STM32_FUNCTION(14, "DCMI_D10"),
+               STM32_FUNCTION(15, "LCD_B2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(55, "PD7"),
+               STM32_FUNCTION(0, "GPIOD7"),
+               STM32_FUNCTION(1, "TRACED6"),
+               STM32_FUNCTION(4, "DFSDM_DATA4"),
+               STM32_FUNCTION(5, "I2C2_SCL"),
+               STM32_FUNCTION(7, "DFSDM_CK1"),
+               STM32_FUNCTION(8, "USART2_CK USART_BOOT2_CK"),
+               STM32_FUNCTION(10, "SPDIF_IN0"),
+               STM32_FUNCTION(11, "SDMMC3_D3"),
+               STM32_FUNCTION(13, "FMC_NE1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(56, "PD8"),
+               STM32_FUNCTION(0, "GPIOD8"),
+               STM32_FUNCTION(4, "DFSDM_CK3"),
+               STM32_FUNCTION(7, "SAI3_SCK_B"),
+               STM32_FUNCTION(8, "USART3_TX"),
+               STM32_FUNCTION(10, "SPDIF_IN1"),
+               STM32_FUNCTION(13, "FMC_D13"),
+               STM32_FUNCTION(15, "LCD_B7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(57, "PD9"),
+               STM32_FUNCTION(0, "GPIOD9"),
+               STM32_FUNCTION(4, "DFSDM_DATA3"),
+               STM32_FUNCTION(7, "SAI3_SD_B"),
+               STM32_FUNCTION(8, "USART3_RX"),
+               STM32_FUNCTION(10, "CAN2_RXFD"),
+               STM32_FUNCTION(13, "FMC_D14"),
+               STM32_FUNCTION(15, "LCD_B0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(58, "PD10"),
+               STM32_FUNCTION(0, "GPIOD10"),
+               STM32_FUNCTION(1, "RTC_REFIN"),
+               STM32_FUNCTION(2, "TIM16_BKIN"),
+               STM32_FUNCTION(4, "DFSDM_CKOUT"),
+               STM32_FUNCTION(5, "I2C5_SMBA"),
+               STM32_FUNCTION(6, "SPI3_MISO I2S3_SDI"),
+               STM32_FUNCTION(7, "SAI3_FS_B"),
+               STM32_FUNCTION(8, "USART3_CK USART_BOOT3_CK"),
+               STM32_FUNCTION(10, "CAN2_TXFD"),
+               STM32_FUNCTION(13, "FMC_D15"),
+               STM32_FUNCTION(15, "LCD_B3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(59, "PD11"),
+               STM32_FUNCTION(0, "GPIOD11"),
+               STM32_FUNCTION(4, "LPTIM2_IN2"),
+               STM32_FUNCTION(5, "I2C4_SMBA"),
+               STM32_FUNCTION(6, "I2C1_SMBA"),
+               STM32_FUNCTION(8, "USART3_CTS_NSS USART_BOOT3_CTS_NSS"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO0"),
+               STM32_FUNCTION(11, "SAI2_SD_A"),
+               STM32_FUNCTION(13, "FMC_A16 FMC_CLE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(60, "PD12"),
+               STM32_FUNCTION(0, "GPIOD12"),
+               STM32_FUNCTION(2, "LPTIM1_IN1"),
+               STM32_FUNCTION(3, "TIM4_CH1"),
+               STM32_FUNCTION(4, "LPTIM2_IN1"),
+               STM32_FUNCTION(5, "I2C4_SCL"),
+               STM32_FUNCTION(6, "I2C1_SCL"),
+               STM32_FUNCTION(8, "USART3_RTS USART_BOOT3_RTS"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO1"),
+               STM32_FUNCTION(11, "SAI2_FS_A"),
+               STM32_FUNCTION(13, "FMC_A17 FMC_ALE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(61, "PD13"),
+               STM32_FUNCTION(0, "GPIOD13"),
+               STM32_FUNCTION(2, "LPTIM1_OUT"),
+               STM32_FUNCTION(3, "TIM4_CH2"),
+               STM32_FUNCTION(5, "I2C4_SDA"),
+               STM32_FUNCTION(6, "I2C1_SDA"),
+               STM32_FUNCTION(7, "I2S3_MCK"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO3 QUADSPI_BOOTBK1_IO3"),
+               STM32_FUNCTION(11, "SAI2_SCK_A"),
+               STM32_FUNCTION(13, "FMC_A18"),
+               STM32_FUNCTION(14, "DSI_TE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(62, "PD14"),
+               STM32_FUNCTION(0, "GPIOD14"),
+               STM32_FUNCTION(3, "TIM4_CH3"),
+               STM32_FUNCTION(7, "SAI3_MCLK_B"),
+               STM32_FUNCTION(9, "UART8_CTS UART_BOOT8_CTS"),
+               STM32_FUNCTION(13, "FMC_D0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(63, "PD15"),
+               STM32_FUNCTION(0, "GPIOD15"),
+               STM32_FUNCTION(3, "TIM4_CH4"),
+               STM32_FUNCTION(7, "SAI3_MCLK_A"),
+               STM32_FUNCTION(9, "UART8_CTS UART_BOOT8_CTS"),
+               STM32_FUNCTION(13, "FMC_D1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(64, "PE0"),
+               STM32_FUNCTION(0, "GPIOE0"),
+               STM32_FUNCTION(2, "LPTIM1_ETR"),
+               STM32_FUNCTION(3, "TIM4_ETR"),
+               STM32_FUNCTION(5, "LPTIM2_ETR"),
+               STM32_FUNCTION(6, "SPI3_SCK I2S3_CK"),
+               STM32_FUNCTION(7, "SAI4_MCLK_B"),
+               STM32_FUNCTION(9, "UART8_RX UART_BOOT8_RX"),
+               STM32_FUNCTION(10, "CAN1_RXFD"),
+               STM32_FUNCTION(11, "SAI2_MCLK_A"),
+               STM32_FUNCTION(13, "FMC_NBL0"),
+               STM32_FUNCTION(14, "DCMI_D2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(65, "PE1"),
+               STM32_FUNCTION(0, "GPIOE1"),
+               STM32_FUNCTION(2, "LPTIM1_IN2"),
+               STM32_FUNCTION(6, "I2S2_MCK"),
+               STM32_FUNCTION(7, "SAI3_SD_B"),
+               STM32_FUNCTION(9, "UART8_TX UART_BOOT8_TX"),
+               STM32_FUNCTION(10, "CAN1_TXFD"),
+               STM32_FUNCTION(13, "FMC_NBL1"),
+               STM32_FUNCTION(14, "DCMI_D3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(66, "PE2"),
+               STM32_FUNCTION(0, "GPIOE2"),
+               STM32_FUNCTION(1, "TRACECLK"),
+               STM32_FUNCTION(3, "SAI1_CK1"),
+               STM32_FUNCTION(5, "I2C4_SCL"),
+               STM32_FUNCTION(6, "SPI4_SCK"),
+               STM32_FUNCTION(7, "SAI1_MCLK_A"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO2 QUADSPI_BOOTBK1_IO2"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD3 ETH_MII_TXD3 ETH_RGMII_TXD3"),
+               STM32_FUNCTION(13, "FMC_A23"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(67, "PE3"),
+               STM32_FUNCTION(0, "GPIOE3"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(5, "TIM15_BKIN"),
+               STM32_FUNCTION(7, "SAI1_SD_B"),
+               STM32_FUNCTION(10, "SDMMC2_CK SDMMC_BOOT2_CK"),
+               STM32_FUNCTION(13, "FMC_A19"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(68, "PE4"),
+               STM32_FUNCTION(0, "GPIOE4"),
+               STM32_FUNCTION(1, "TRACED1"),
+               STM32_FUNCTION(3, "SAI1_D2"),
+               STM32_FUNCTION(4, "DFSDM_DATA3"),
+               STM32_FUNCTION(5, "TIM15_CH1N"),
+               STM32_FUNCTION(6, "SPI4_NSS"),
+               STM32_FUNCTION(7, "SAI1_FS_A"),
+               STM32_FUNCTION(8, "SDMMC2_CKIN SDMMC_BOOT2_CKIN"),
+               STM32_FUNCTION(9, "SDMMC1_CKIN SDMMC_BOOT1_CKIN"),
+               STM32_FUNCTION(10, "SDMMC2_D4 SDMMC_BOOT2_D4"),
+               STM32_FUNCTION(12, "SDMMC1_D4 SDMMC_BOOT1_D4"),
+               STM32_FUNCTION(13, "FMC_A20"),
+               STM32_FUNCTION(14, "DCMI_D4"),
+               STM32_FUNCTION(15, "LCD_B0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(69, "PE5"),
+               STM32_FUNCTION(0, "GPIOE5"),
+               STM32_FUNCTION(1, "TRACED3"),
+               STM32_FUNCTION(3, "SAI1_CK2"),
+               STM32_FUNCTION(4, "DFSDM_CK3"),
+               STM32_FUNCTION(5, "TIM15_CH1"),
+               STM32_FUNCTION(6, "SPI4_MISO"),
+               STM32_FUNCTION(7, "SAI1_SCK_A"),
+               STM32_FUNCTION(8, "SDMMC2_D0DIR SDMMC_BOOT2_D0DIR"),
+               STM32_FUNCTION(9, "SDMMC1_D0DIR SDMMC_BOOT1_D0DIR"),
+               STM32_FUNCTION(10, "SDMMC2_D6 SDMMC_BOOT2_D6"),
+               STM32_FUNCTION(12, "SDMMC1_D6 SDMMC_BOOT1_D6"),
+               STM32_FUNCTION(13, "FMC_A21"),
+               STM32_FUNCTION(14, "DCMI_D6"),
+               STM32_FUNCTION(15, "LCD_G0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(70, "PE6"),
+               STM32_FUNCTION(0, "GPIOE6"),
+               STM32_FUNCTION(1, "TRACED2"),
+               STM32_FUNCTION(2, "TIM1_BKIN2"),
+               STM32_FUNCTION(3, "SAI1_D1"),
+               STM32_FUNCTION(5, "TIM15_CH2"),
+               STM32_FUNCTION(6, "SPI4_MOSI"),
+               STM32_FUNCTION(7, "SAI1_SD_A"),
+               STM32_FUNCTION(8, "SDMMC2_D0"),
+               STM32_FUNCTION(9, "SDMMC1_D2 SDMMC_BOOT1_D2"),
+               STM32_FUNCTION(11, "SAI2_MCLK_B"),
+               STM32_FUNCTION(13, "FMC_A22"),
+               STM32_FUNCTION(14, "DCMI_D7"),
+               STM32_FUNCTION(15, "LCD_G1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(71, "PE7"),
+               STM32_FUNCTION(0, "GPIOE7"),
+               STM32_FUNCTION(2, "TIM1_ETR"),
+               STM32_FUNCTION(3, "TIM3_ETR"),
+               STM32_FUNCTION(4, "DFSDM_DATA2"),
+               STM32_FUNCTION(8, "UART7_RX"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_IO0 QUADSPI_BOOTBK2_IO0"),
+               STM32_FUNCTION(13, "FMC_D4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(72, "PE8"),
+               STM32_FUNCTION(0, "GPIOE8"),
+               STM32_FUNCTION(2, "TIM1_CH1N"),
+               STM32_FUNCTION(4, "DFSDM_CK2"),
+               STM32_FUNCTION(8, "UART7_TX"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_IO1 QUADSPI_BOOTBK2_IO1"),
+               STM32_FUNCTION(13, "FMC_D5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(73, "PE9"),
+               STM32_FUNCTION(0, "GPIOE9"),
+               STM32_FUNCTION(2, "TIM1_CH1"),
+               STM32_FUNCTION(4, "DFSDM_CKOUT"),
+               STM32_FUNCTION(8, "UART7_RTS UART_BOOT7_RTS"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_IO2 QUADSPI_BOOTBK2_IO2"),
+               STM32_FUNCTION(13, "FMC_D6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(74, "PE10"),
+               STM32_FUNCTION(0, "GPIOE10"),
+               STM32_FUNCTION(2, "TIM1_CH2N"),
+               STM32_FUNCTION(4, "DFSDM_DATA4"),
+               STM32_FUNCTION(8, "UART7_CTS UART_BOOT7_CTS"),
+               STM32_FUNCTION(11, "QUADSPI_BK2_IO3 QUADSPI_BOOTBK2_IO3"),
+               STM32_FUNCTION(13, "FMC_D7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(75, "PE11"),
+               STM32_FUNCTION(0, "GPIOE11"),
+               STM32_FUNCTION(2, "TIM1_CH2"),
+               STM32_FUNCTION(4, "DFSDM_CK4"),
+               STM32_FUNCTION(6, "SPI4_NSS"),
+               STM32_FUNCTION(8, "USART6_CK USART_BOOT6_CK"),
+               STM32_FUNCTION(11, "SAI2_SD_B"),
+               STM32_FUNCTION(13, "FMC_D8"),
+               STM32_FUNCTION(15, "LCD_G3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(76, "PE12"),
+               STM32_FUNCTION(0, "GPIOE12"),
+               STM32_FUNCTION(2, "TIM1_CH3N"),
+               STM32_FUNCTION(4, "DFSDM_DATA5"),
+               STM32_FUNCTION(6, "SPI4_SCK"),
+               STM32_FUNCTION(9, "SDMMC1_D0DIR SDMMC_BOOT1_D0DIR"),
+               STM32_FUNCTION(11, "SAI2_SCK_B"),
+               STM32_FUNCTION(13, "FMC_D9"),
+               STM32_FUNCTION(15, "LCD_B4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(77, "PE13"),
+               STM32_FUNCTION(0, "GPIOE13"),
+               STM32_FUNCTION(1, "HDP2"),
+               STM32_FUNCTION(2, "TIM1_CH3"),
+               STM32_FUNCTION(4, "DFSDM_CK5"),
+               STM32_FUNCTION(6, "SPI4_MISO"),
+               STM32_FUNCTION(11, "SAI2_FS_B"),
+               STM32_FUNCTION(13, "FMC_D10"),
+               STM32_FUNCTION(15, "LCD_DE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(78, "PE14"),
+               STM32_FUNCTION(0, "GPIOE14"),
+               STM32_FUNCTION(2, "TIM1_CH4"),
+               STM32_FUNCTION(6, "SPI4_MOSI"),
+               STM32_FUNCTION(9, "UART8_RTS UART_BOOT8_RTS"),
+               STM32_FUNCTION(11, "SAI2_MCLK_B"),
+               STM32_FUNCTION(12, "SDMMC1_D123DIR SDMMC_BOOT1_D123DIR"),
+               STM32_FUNCTION(13, "FMC_D11"),
+               STM32_FUNCTION(14, "LCD_G0"),
+               STM32_FUNCTION(15, "LCD_CLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(79, "PE15"),
+               STM32_FUNCTION(0, "GPIOE15"),
+               STM32_FUNCTION(1, "HDP3"),
+               STM32_FUNCTION(2, "TIM1_BKIN"),
+               STM32_FUNCTION(5, "TIM15_BKIN"),
+               STM32_FUNCTION(8, "USART2_CTS_NSS USART_BOOT2_CTS_NSS"),
+               STM32_FUNCTION(9, "UART8_CTS UART_BOOT8_CTS"),
+               STM32_FUNCTION(13, "FMC_D12"),
+               STM32_FUNCTION(15, "LCD_R7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(80, "PF0"),
+               STM32_FUNCTION(0, "GPIOF0"),
+               STM32_FUNCTION(5, "I2C2_SDA"),
+               STM32_FUNCTION(10, "SDMMC3_D0"),
+               STM32_FUNCTION(11, "SDMMC3_CKIN"),
+               STM32_FUNCTION(13, "FMC_A0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(81, "PF1"),
+               STM32_FUNCTION(0, "GPIOF1"),
+               STM32_FUNCTION(5, "I2C2_SCL"),
+               STM32_FUNCTION(10, "SDMMC3_CMD"),
+               STM32_FUNCTION(11, "SDMMC3_CDIR"),
+               STM32_FUNCTION(13, "FMC_A1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(82, "PF2"),
+               STM32_FUNCTION(0, "GPIOF2"),
+               STM32_FUNCTION(5, "I2C2_SMBA"),
+               STM32_FUNCTION(10, "SDMMC2_D0DIR SDMMC_BOOT2_D0DIR"),
+               STM32_FUNCTION(11, "SDMMC3_D0DIR"),
+               STM32_FUNCTION(12, "SDMMC1_D0DIR SDMMC_BOOT1_D0DIR"),
+               STM32_FUNCTION(13, "FMC_A2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(83, "PF3"),
+               STM32_FUNCTION(0, "GPIOF3"),
+               STM32_FUNCTION(12, "ETH_GMII_TX_ER ETH_MII_TX_ER"),
+               STM32_FUNCTION(13, "FMC_A3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(84, "PF4"),
+               STM32_FUNCTION(0, "GPIOF4"),
+               STM32_FUNCTION(8, "USART2_RX"),
+               STM32_FUNCTION(10, "SDMMC3_D1"),
+               STM32_FUNCTION(11, "SDMMC3_D123DIR"),
+               STM32_FUNCTION(13, "FMC_A4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(85, "PF5"),
+               STM32_FUNCTION(0, "GPIOF5"),
+               STM32_FUNCTION(8, "USART2_TX"),
+               STM32_FUNCTION(10, "SDMMC3_D2"),
+               STM32_FUNCTION(13, "FMC_A5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(86, "PF6"),
+               STM32_FUNCTION(0, "GPIOF6"),
+               STM32_FUNCTION(2, "TIM16_CH1"),
+               STM32_FUNCTION(6, "SPI5_NSS"),
+               STM32_FUNCTION(7, "SAI1_SD_B"),
+               STM32_FUNCTION(8, "UART7_RX UART_BOOT7_RX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO3 QUADSPI_BOOTBK1_IO3"),
+               STM32_FUNCTION(13, "SAI4_SCK_B"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(87, "PF7"),
+               STM32_FUNCTION(0, "GPIOF7"),
+               STM32_FUNCTION(2, "TIM17_CH1"),
+               STM32_FUNCTION(6, "SPI5_SCK"),
+               STM32_FUNCTION(7, "SAI1_MCLK_B"),
+               STM32_FUNCTION(8, "UART7_TX UART_BOOT7_TX"),
+               STM32_FUNCTION(10, "QUADSPI_BK1_IO2 QUADSPI_BOOTBK1_IO2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(88, "PF8"),
+               STM32_FUNCTION(0, "GPIOF8"),
+               STM32_FUNCTION(1, "TRACED12"),
+               STM32_FUNCTION(2, "TIM16_CH1N"),
+               STM32_FUNCTION(6, "SPI5_MISO"),
+               STM32_FUNCTION(7, "SAI1_SCK_B"),
+               STM32_FUNCTION(8, "UART7_RTS UART_BOOT7_RTS"),
+               STM32_FUNCTION(10, "TIM13_CH1"),
+               STM32_FUNCTION(11, "QUADSPI_BK1_IO0 QUADSPI_BOOTBK1_IO0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(89, "PF9"),
+               STM32_FUNCTION(0, "GPIOF9"),
+               STM32_FUNCTION(1, "TRACED13"),
+               STM32_FUNCTION(2, "TIM17_CH1N"),
+               STM32_FUNCTION(6, "SPI5_MOSI"),
+               STM32_FUNCTION(7, "SAI1_FS_B"),
+               STM32_FUNCTION(8, "UART7_CTS UART_BOOT7_CTS"),
+               STM32_FUNCTION(10, "TIM14_CH1"),
+               STM32_FUNCTION(11, "QUADSPI_BK1_IO1 QUADSPI_BOOTBK1_IO1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(90, "PF10"),
+               STM32_FUNCTION(0, "GPIOF10"),
+               STM32_FUNCTION(2, "TIM16_BKIN"),
+               STM32_FUNCTION(3, "SAI1_D3"),
+               STM32_FUNCTION(4, "SAI4_D4"),
+               STM32_FUNCTION(7, "SAI1_D4"),
+               STM32_FUNCTION(10, "QUADSPI_CLK QUADSPI_BOOTCLK"),
+               STM32_FUNCTION(13, "SAI4_D3"),
+               STM32_FUNCTION(14, "DCMI_D11"),
+               STM32_FUNCTION(15, "LCD_DE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(91, "PF11"),
+               STM32_FUNCTION(0, "GPIOF11"),
+               STM32_FUNCTION(6, "SPI5_MOSI"),
+               STM32_FUNCTION(11, "SAI2_SD_B"),
+               STM32_FUNCTION(14, "DCMI_D12"),
+               STM32_FUNCTION(15, "LCD_G5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(92, "PF12"),
+               STM32_FUNCTION(0, "GPIOF12"),
+               STM32_FUNCTION(1, "TRACED4"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD4"),
+               STM32_FUNCTION(13, "FMC_A6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(93, "PF13"),
+               STM32_FUNCTION(0, "GPIOF13"),
+               STM32_FUNCTION(1, "TRACED5"),
+               STM32_FUNCTION(4, "DFSDM_DATA6"),
+               STM32_FUNCTION(5, "I2C4_SMBA"),
+               STM32_FUNCTION(6, "I2C1_SMBA"),
+               STM32_FUNCTION(7, "DFSDM_DATA3"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD5"),
+               STM32_FUNCTION(13, "FMC_A7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(94, "PF14"),
+               STM32_FUNCTION(0, "GPIOF14"),
+               STM32_FUNCTION(1, "TRACED6"),
+               STM32_FUNCTION(4, "DFSDM_CK6"),
+               STM32_FUNCTION(5, "I2C4_SCL"),
+               STM32_FUNCTION(6, "I2C1_SCL"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD6"),
+               STM32_FUNCTION(13, "FMC_A8"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(95, "PF15"),
+               STM32_FUNCTION(0, "GPIOF15"),
+               STM32_FUNCTION(1, "TRACED7"),
+               STM32_FUNCTION(5, "I2C4_SDA"),
+               STM32_FUNCTION(6, "I2C1_SDA"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD7"),
+               STM32_FUNCTION(13, "FMC_A9"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(96, "PG0"),
+               STM32_FUNCTION(0, "GPIOG0"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(4, "DFSDM_DATA0"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD4"),
+               STM32_FUNCTION(13, "FMC_A10"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(97, "PG1"),
+               STM32_FUNCTION(0, "GPIOG1"),
+               STM32_FUNCTION(1, "TRACED1"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD5"),
+               STM32_FUNCTION(13, "FMC_A11"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(98, "PG2"),
+               STM32_FUNCTION(0, "GPIOG2"),
+               STM32_FUNCTION(1, "TRACED2"),
+               STM32_FUNCTION(2, "MCO2"),
+               STM32_FUNCTION(4, "TIM8_BKIN"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD6"),
+               STM32_FUNCTION(13, "FMC_A12"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(99, "PG3"),
+               STM32_FUNCTION(0, "GPIOG3"),
+               STM32_FUNCTION(1, "TRACED3"),
+               STM32_FUNCTION(4, "TIM8_BKIN2"),
+               STM32_FUNCTION(5, "DFSDM_CK1"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD7"),
+               STM32_FUNCTION(13, "FMC_A13"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(100, "PG4"),
+               STM32_FUNCTION(0, "GPIOG4"),
+               STM32_FUNCTION(2, "TIM1_BKIN2"),
+               STM32_FUNCTION(12, "ETH_GMII_GTX_CLK ETH_RGMII_GTX_CLK"),
+               STM32_FUNCTION(13, "FMC_A14"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(101, "PG5"),
+               STM32_FUNCTION(0, "GPIOG5"),
+               STM32_FUNCTION(2, "TIM1_ETR"),
+               STM32_FUNCTION(12, "ETH_GMII_CLK125 ETH_RGMII_CLK125"),
+               STM32_FUNCTION(13, "FMC_A15"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(102, "PG6"),
+               STM32_FUNCTION(0, "GPIOG6"),
+               STM32_FUNCTION(1, "TRACED14"),
+               STM32_FUNCTION(2, "TIM17_BKIN"),
+               STM32_FUNCTION(11, "SDMMC2_CMD SDMMC_BOOT2_CMD"),
+               STM32_FUNCTION(14, "DCMI_D12"),
+               STM32_FUNCTION(15, "LCD_R7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(103, "PG7"),
+               STM32_FUNCTION(0, "GPIOG7"),
+               STM32_FUNCTION(1, "TRACED5"),
+               STM32_FUNCTION(7, "SAI1_MCLK_A"),
+               STM32_FUNCTION(8, "USART6_CK USART_BOOT6_CK"),
+               STM32_FUNCTION(9, "UART8_RTS UART_BOOT8_RTS"),
+               STM32_FUNCTION(10, "QUADSPI_CLK"),
+               STM32_FUNCTION(12, "QUADSPI_BK2_IO3 QUADSPI_BOOTBK2_IO3"),
+               STM32_FUNCTION(13, "FMC_INT"),
+               STM32_FUNCTION(14, "DCMI_D13"),
+               STM32_FUNCTION(15, "LCD_CLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(104, "PG8"),
+               STM32_FUNCTION(0, "GPIOG8"),
+               STM32_FUNCTION(1, "TRACED15"),
+               STM32_FUNCTION(2, "TIM2_CH1 TIM2_ETR"),
+               STM32_FUNCTION(3, "ETH_CLK"),
+               STM32_FUNCTION(4, "TIM8_ETR"),
+               STM32_FUNCTION(6, "SPI6_NSS"),
+               STM32_FUNCTION(7, "SAI4_D2"),
+               STM32_FUNCTION(8, "USART6_RTS USART_BOOT6_RTS"),
+               STM32_FUNCTION(9, "USART3_RTS"),
+               STM32_FUNCTION(10, "SPDIF_IN2"),
+               STM32_FUNCTION(11, "SAI4_FS_A"),
+               STM32_FUNCTION(12, "ETH_PPS_OUT"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(105, "PG9"),
+               STM32_FUNCTION(0, "GPIOG9"),
+               STM32_FUNCTION(1, "DBTRGO"),
+               STM32_FUNCTION(8, "USART6_RX"),
+               STM32_FUNCTION(9, "SPDIF_IN3"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_IO2 QUADSPI_BOOTBK2_IO2"),
+               STM32_FUNCTION(11, "SAI2_FS_B"),
+               STM32_FUNCTION(13, "FMC_NE2 FMC_NCE"),
+               STM32_FUNCTION(14, "DCMI_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(106, "PG10"),
+               STM32_FUNCTION(0, "GPIOG10"),
+               STM32_FUNCTION(1, "TRACED10"),
+               STM32_FUNCTION(9, "UART8_CTS UART_BOOT8_CTS"),
+               STM32_FUNCTION(10, "LCD_G3"),
+               STM32_FUNCTION(11, "SAI2_SD_B"),
+               STM32_FUNCTION(12, "QUADSPI_BK2_IO2 QUADSPI_BOOTBK2_IO2"),
+               STM32_FUNCTION(13, "FMC_NE3"),
+               STM32_FUNCTION(14, "DCMI_D2"),
+               STM32_FUNCTION(15, "LCD_B2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(107, "PG11"),
+               STM32_FUNCTION(0, "GPIOG11"),
+               STM32_FUNCTION(1, "TRACED11"),
+               STM32_FUNCTION(5, "USART1_TX"),
+               STM32_FUNCTION(7, "UART4_TX UART_BOOT4_TX"),
+               STM32_FUNCTION(9, "SPDIF_IN0"),
+               STM32_FUNCTION(12, "ETH_GMII_TX_EN ETH_MII_TX_EN ETH_RGMII_TX_CTL ETH_RMII_TX_EN"),
+               STM32_FUNCTION(14, "DCMI_D3"),
+               STM32_FUNCTION(15, "LCD_B3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(108, "PG12"),
+               STM32_FUNCTION(0, "GPIOG12"),
+               STM32_FUNCTION(2, "LPTIM1_IN1"),
+               STM32_FUNCTION(6, "SPI6_MISO"),
+               STM32_FUNCTION(7, "SAI4_CK2"),
+               STM32_FUNCTION(8, "USART6_RTS USART_BOOT6_RTS"),
+               STM32_FUNCTION(9, "SPDIF_IN1"),
+               STM32_FUNCTION(10, "LCD_B4"),
+               STM32_FUNCTION(11, "SAI4_SCK_A"),
+               STM32_FUNCTION(12, "ETH_PHY_INTN"),
+               STM32_FUNCTION(13, "FMC_NE4"),
+               STM32_FUNCTION(15, "LCD_B1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(109, "PG13"),
+               STM32_FUNCTION(0, "GPIOG13"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(2, "LPTIM1_OUT"),
+               STM32_FUNCTION(3, "SAI1_CK2"),
+               STM32_FUNCTION(5, "SAI4_CK1"),
+               STM32_FUNCTION(6, "SPI6_SCK"),
+               STM32_FUNCTION(7, "SAI1_SCK_A"),
+               STM32_FUNCTION(8, "USART6_CTS_NSS USART_BOOT6_CTS_NSS"),
+               STM32_FUNCTION(11, "SAI4_MCLK_A"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD0 ETH_MII_TXD0 ETH_RGMII_TXD0 ETH_RMII_TXD0"),
+               STM32_FUNCTION(13, "FMC_A24"),
+               STM32_FUNCTION(15, "LCD_R0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(110, "PG14"),
+               STM32_FUNCTION(0, "GPIOG14"),
+               STM32_FUNCTION(1, "TRACED1"),
+               STM32_FUNCTION(2, "LPTIM1_ETR"),
+               STM32_FUNCTION(6, "SPI6_MOSI"),
+               STM32_FUNCTION(7, "SAI4_D1"),
+               STM32_FUNCTION(8, "USART6_TX"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_IO3 QUADSPI_BOOTBK2_IO3"),
+               STM32_FUNCTION(11, "SAI4_SD_A"),
+               STM32_FUNCTION(12, "ETH_GMII_TXD1 ETH_MII_TXD1 ETH_RGMII_TXD1 ETH_RMII_TXD1"),
+               STM32_FUNCTION(13, "FMC_A25"),
+               STM32_FUNCTION(15, "LCD_B0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(111, "PG15"),
+               STM32_FUNCTION(0, "GPIOG15"),
+               STM32_FUNCTION(1, "TRACED7"),
+               STM32_FUNCTION(3, "SAI1_D2"),
+               STM32_FUNCTION(5, "I2C2_SDA"),
+               STM32_FUNCTION(7, "SAI1_FS_A"),
+               STM32_FUNCTION(8, "USART6_CTS_NSS USART_BOOT6_CTS_NSS"),
+               STM32_FUNCTION(11, "SDMMC3_CK"),
+               STM32_FUNCTION(14, "DCMI_D13"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(112, "PH0"),
+               STM32_FUNCTION(0, "GPIOH0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(113, "PH1"),
+               STM32_FUNCTION(0, "GPIOH1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(114, "PH2"),
+               STM32_FUNCTION(0, "GPIOH2"),
+               STM32_FUNCTION(2, "LPTIM1_IN2"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_IO0 QUADSPI_BOOTBK2_IO0"),
+               STM32_FUNCTION(11, "SAI2_SCK_B"),
+               STM32_FUNCTION(12, "ETH_GMII_CRS ETH_MII_CRS"),
+               STM32_FUNCTION(15, "LCD_R0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(115, "PH3"),
+               STM32_FUNCTION(0, "GPIOH3"),
+               STM32_FUNCTION(4, "DFSDM_CK4"),
+               STM32_FUNCTION(10, "QUADSPI_BK2_IO1 QUADSPI_BOOTBK2_IO1"),
+               STM32_FUNCTION(11, "SAI2_MCLK_B"),
+               STM32_FUNCTION(12, "ETH_GMII_COL ETH_MII_COL"),
+               STM32_FUNCTION(15, "LCD_R1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(116, "PH4"),
+               STM32_FUNCTION(0, "GPIOH4"),
+               STM32_FUNCTION(5, "I2C2_SCL"),
+               STM32_FUNCTION(10, "LCD_G5"),
+               STM32_FUNCTION(15, "LCD_G4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(117, "PH5"),
+               STM32_FUNCTION(0, "GPIOH5"),
+               STM32_FUNCTION(5, "I2C2_SDA"),
+               STM32_FUNCTION(6, "SPI5_NSS"),
+               STM32_FUNCTION(13, "SAI4_SD_B"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(118, "PH6"),
+               STM32_FUNCTION(0, "GPIOH6"),
+               STM32_FUNCTION(3, "TIM12_CH1"),
+               STM32_FUNCTION(5, "I2C2_SMBA"),
+               STM32_FUNCTION(6, "SPI5_SCK"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD2 ETH_MII_RXD2 ETH_RGMII_RXD2"),
+               STM32_FUNCTION(13, "MDIOS_MDIO"),
+               STM32_FUNCTION(14, "DCMI_D8"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(119, "PH7"),
+               STM32_FUNCTION(0, "GPIOH7"),
+               STM32_FUNCTION(5, "I2C3_SCL"),
+               STM32_FUNCTION(6, "SPI5_MISO"),
+               STM32_FUNCTION(12, "ETH_GMII_RXD3 ETH_MII_RXD3 ETH_RGMII_RXD3"),
+               STM32_FUNCTION(13, "MDIOS_MDC"),
+               STM32_FUNCTION(14, "DCMI_D9"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(120, "PH8"),
+               STM32_FUNCTION(0, "GPIOH8"),
+               STM32_FUNCTION(3, "TIM5_ETR"),
+               STM32_FUNCTION(5, "I2C3_SDA"),
+               STM32_FUNCTION(14, "DCMI_HSYNC"),
+               STM32_FUNCTION(15, "LCD_R2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(121, "PH9"),
+               STM32_FUNCTION(0, "GPIOH9"),
+               STM32_FUNCTION(3, "TIM12_CH2"),
+               STM32_FUNCTION(5, "I2C3_SMBA"),
+               STM32_FUNCTION(14, "DCMI_D0"),
+               STM32_FUNCTION(15, "LCD_R3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(122, "PH10"),
+               STM32_FUNCTION(0, "GPIOH10"),
+               STM32_FUNCTION(3, "TIM5_CH1"),
+               STM32_FUNCTION(5, "I2C4_SMBA"),
+               STM32_FUNCTION(6, "I2C1_SMBA"),
+               STM32_FUNCTION(14, "DCMI_D1"),
+               STM32_FUNCTION(15, "LCD_R4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(123, "PH11"),
+               STM32_FUNCTION(0, "GPIOH11"),
+               STM32_FUNCTION(3, "TIM5_CH2"),
+               STM32_FUNCTION(5, "I2C4_SCL"),
+               STM32_FUNCTION(6, "I2C1_SCL"),
+               STM32_FUNCTION(14, "DCMI_D2"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(124, "PH12"),
+               STM32_FUNCTION(0, "GPIOH12"),
+               STM32_FUNCTION(1, "HDP2"),
+               STM32_FUNCTION(3, "TIM5_CH3"),
+               STM32_FUNCTION(5, "I2C4_SDA"),
+               STM32_FUNCTION(6, "I2C1_SDA"),
+               STM32_FUNCTION(14, "DCMI_D3"),
+               STM32_FUNCTION(15, "LCD_R6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(125, "PH13"),
+               STM32_FUNCTION(0, "GPIOH13"),
+               STM32_FUNCTION(4, "TIM8_CH1N"),
+               STM32_FUNCTION(9, "UART4_TX"),
+               STM32_FUNCTION(10, "CAN1_TX"),
+               STM32_FUNCTION(15, "LCD_G2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(126, "PH14"),
+               STM32_FUNCTION(0, "GPIOH14"),
+               STM32_FUNCTION(4, "TIM8_CH2N"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(14, "DCMI_D4"),
+               STM32_FUNCTION(15, "LCD_G3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(127, "PH15"),
+               STM32_FUNCTION(0, "GPIOH15"),
+               STM32_FUNCTION(4, "TIM8_CH3N"),
+               STM32_FUNCTION(10, "CAN1_TXFD"),
+               STM32_FUNCTION(14, "DCMI_D11"),
+               STM32_FUNCTION(15, "LCD_G4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(128, "PI0"),
+               STM32_FUNCTION(0, "GPIOI0"),
+               STM32_FUNCTION(3, "TIM5_CH4"),
+               STM32_FUNCTION(6, "SPI2_NSS I2S2_WS"),
+               STM32_FUNCTION(10, "CAN1_RXFD"),
+               STM32_FUNCTION(14, "DCMI_D13"),
+               STM32_FUNCTION(15, "LCD_G5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(129, "PI1"),
+               STM32_FUNCTION(0, "GPIOI1"),
+               STM32_FUNCTION(4, "TIM8_BKIN2"),
+               STM32_FUNCTION(6, "SPI2_SCK I2S2_CK"),
+               STM32_FUNCTION(14, "DCMI_D8"),
+               STM32_FUNCTION(15, "LCD_G6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(130, "PI2"),
+               STM32_FUNCTION(0, "GPIOI2"),
+               STM32_FUNCTION(4, "TIM8_CH4"),
+               STM32_FUNCTION(6, "SPI2_MISO I2S2_SDI"),
+               STM32_FUNCTION(14, "DCMI_D9"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(131, "PI3"),
+               STM32_FUNCTION(0, "GPIOI3"),
+               STM32_FUNCTION(4, "TIM8_ETR"),
+               STM32_FUNCTION(6, "SPI2_MOSI I2S2_SDO"),
+               STM32_FUNCTION(14, "DCMI_D10"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(132, "PI4"),
+               STM32_FUNCTION(0, "GPIOI4"),
+               STM32_FUNCTION(4, "TIM8_BKIN"),
+               STM32_FUNCTION(11, "SAI2_MCLK_A"),
+               STM32_FUNCTION(14, "DCMI_D5"),
+               STM32_FUNCTION(15, "LCD_B4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(133, "PI5"),
+               STM32_FUNCTION(0, "GPIOI5"),
+               STM32_FUNCTION(4, "TIM8_CH1"),
+               STM32_FUNCTION(11, "SAI2_SCK_A"),
+               STM32_FUNCTION(14, "DCMI_VSYNC"),
+               STM32_FUNCTION(15, "LCD_B5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(134, "PI6"),
+               STM32_FUNCTION(0, "GPIOI6"),
+               STM32_FUNCTION(4, "TIM8_CH2"),
+               STM32_FUNCTION(11, "SAI2_SD_A"),
+               STM32_FUNCTION(14, "DCMI_D6"),
+               STM32_FUNCTION(15, "LCD_B6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(135, "PI7"),
+               STM32_FUNCTION(0, "GPIOI7"),
+               STM32_FUNCTION(4, "TIM8_CH3"),
+               STM32_FUNCTION(11, "SAI2_FS_A"),
+               STM32_FUNCTION(14, "DCMI_D7"),
+               STM32_FUNCTION(15, "LCD_B7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(136, "PI8"),
+               STM32_FUNCTION(0, "GPIOI8"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(137, "PI9"),
+               STM32_FUNCTION(0, "GPIOI9"),
+               STM32_FUNCTION(1, "HDP1"),
+               STM32_FUNCTION(9, "UART4_RX"),
+               STM32_FUNCTION(10, "CAN1_RX"),
+               STM32_FUNCTION(15, "LCD_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(138, "PI10"),
+               STM32_FUNCTION(0, "GPIOI10"),
+               STM32_FUNCTION(1, "HDP0"),
+               STM32_FUNCTION(9, "USART3_CTS_NSS USART_BOOT3_CTS_NSS"),
+               STM32_FUNCTION(10, "CAN1_RXFD"),
+               STM32_FUNCTION(12, "ETH_GMII_RX_ER ETH_MII_RX_ER"),
+               STM32_FUNCTION(15, "LCD_HSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(139, "PI11"),
+               STM32_FUNCTION(0, "GPIOI11"),
+               STM32_FUNCTION(1, "MCO1"),
+               STM32_FUNCTION(6, "I2S_CKIN"),
+               STM32_FUNCTION(10, "LCD_G6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(140, "PI12"),
+               STM32_FUNCTION(0, "GPIOI12"),
+               STM32_FUNCTION(1, "TRACED0"),
+               STM32_FUNCTION(3, "HDP0"),
+               STM32_FUNCTION(15, "LCD_HSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(141, "PI13"),
+               STM32_FUNCTION(0, "GPIOI13"),
+               STM32_FUNCTION(1, "TRACED1"),
+               STM32_FUNCTION(3, "HDP1"),
+               STM32_FUNCTION(15, "LCD_VSYNC"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(142, "PI14"),
+               STM32_FUNCTION(0, "GPIOI14"),
+               STM32_FUNCTION(1, "TRACECLK"),
+               STM32_FUNCTION(15, "LCD_CLK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(143, "PI15"),
+               STM32_FUNCTION(0, "GPIOI15"),
+               STM32_FUNCTION(10, "LCD_G2"),
+               STM32_FUNCTION(15, "LCD_R0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(144, "PJ0"),
+               STM32_FUNCTION(0, "GPIOJ0"),
+               STM32_FUNCTION(1, "TRACED8"),
+               STM32_FUNCTION(10, "LCD_R7"),
+               STM32_FUNCTION(15, "LCD_R1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(145, "PJ1"),
+               STM32_FUNCTION(0, "GPIOJ1"),
+               STM32_FUNCTION(1, "TRACED9"),
+               STM32_FUNCTION(15, "LCD_R2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(146, "PJ2"),
+               STM32_FUNCTION(0, "GPIOJ2"),
+               STM32_FUNCTION(1, "TRACED10"),
+               STM32_FUNCTION(14, "DSI_TE"),
+               STM32_FUNCTION(15, "LCD_R3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(147, "PJ3"),
+               STM32_FUNCTION(0, "GPIOJ3"),
+               STM32_FUNCTION(1, "TRACED11"),
+               STM32_FUNCTION(15, "LCD_R4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(148, "PJ4"),
+               STM32_FUNCTION(0, "GPIOJ4"),
+               STM32_FUNCTION(1, "TRACED12"),
+               STM32_FUNCTION(15, "LCD_R5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(149, "PJ5"),
+               STM32_FUNCTION(0, "GPIOJ5"),
+               STM32_FUNCTION(1, "TRACED2"),
+               STM32_FUNCTION(3, "HDP2"),
+               STM32_FUNCTION(15, "LCD_R6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(150, "PJ6"),
+               STM32_FUNCTION(0, "GPIOJ6"),
+               STM32_FUNCTION(1, "TRACED3"),
+               STM32_FUNCTION(3, "HDP3"),
+               STM32_FUNCTION(4, "TIM8_CH2"),
+               STM32_FUNCTION(15, "LCD_R7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(151, "PJ7"),
+               STM32_FUNCTION(0, "GPIOJ7"),
+               STM32_FUNCTION(1, "TRACED13"),
+               STM32_FUNCTION(4, "TIM8_CH2N"),
+               STM32_FUNCTION(15, "LCD_G0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(152, "PJ8"),
+               STM32_FUNCTION(0, "GPIOJ8"),
+               STM32_FUNCTION(1, "TRACED14"),
+               STM32_FUNCTION(2, "TIM1_CH3N"),
+               STM32_FUNCTION(4, "TIM8_CH1"),
+               STM32_FUNCTION(9, "UART8_TX"),
+               STM32_FUNCTION(15, "LCD_G1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(153, "PJ9"),
+               STM32_FUNCTION(0, "GPIOJ9"),
+               STM32_FUNCTION(1, "TRACED15"),
+               STM32_FUNCTION(2, "TIM1_CH3"),
+               STM32_FUNCTION(4, "TIM8_CH1N"),
+               STM32_FUNCTION(9, "UART8_RX"),
+               STM32_FUNCTION(15, "LCD_G2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(154, "PJ10"),
+               STM32_FUNCTION(0, "GPIOJ10"),
+               STM32_FUNCTION(2, "TIM1_CH2N"),
+               STM32_FUNCTION(4, "TIM8_CH2"),
+               STM32_FUNCTION(6, "SPI5_MOSI"),
+               STM32_FUNCTION(15, "LCD_G3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(155, "PJ11"),
+               STM32_FUNCTION(0, "GPIOJ11"),
+               STM32_FUNCTION(2, "TIM1_CH2"),
+               STM32_FUNCTION(4, "TIM8_CH2N"),
+               STM32_FUNCTION(6, "SPI5_MISO"),
+               STM32_FUNCTION(15, "LCD_G4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(156, "PJ12"),
+               STM32_FUNCTION(0, "GPIOJ12"),
+               STM32_FUNCTION(10, "LCD_G3"),
+               STM32_FUNCTION(15, "LCD_B0"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(157, "PJ13"),
+               STM32_FUNCTION(0, "GPIOJ13"),
+               STM32_FUNCTION(10, "LCD_G4"),
+               STM32_FUNCTION(15, "LCD_B1"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(158, "PJ14"),
+               STM32_FUNCTION(0, "GPIOJ14"),
+               STM32_FUNCTION(15, "LCD_B2"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(159, "PJ15"),
+               STM32_FUNCTION(0, "GPIOJ15"),
+               STM32_FUNCTION(15, "LCD_B3"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(160, "PK0"),
+               STM32_FUNCTION(0, "GPIOK0"),
+               STM32_FUNCTION(2, "TIM1_CH1N"),
+               STM32_FUNCTION(4, "TIM8_CH3"),
+               STM32_FUNCTION(6, "SPI5_SCK"),
+               STM32_FUNCTION(15, "LCD_G5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(161, "PK1"),
+               STM32_FUNCTION(0, "GPIOK1"),
+               STM32_FUNCTION(1, "TRACED4"),
+               STM32_FUNCTION(2, "TIM1_CH1"),
+               STM32_FUNCTION(3, "HDP4"),
+               STM32_FUNCTION(4, "TIM8_CH3N"),
+               STM32_FUNCTION(6, "SPI5_NSS"),
+               STM32_FUNCTION(15, "LCD_G6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(162, "PK2"),
+               STM32_FUNCTION(0, "GPIOK2"),
+               STM32_FUNCTION(1, "TRACED5"),
+               STM32_FUNCTION(2, "TIM1_BKIN"),
+               STM32_FUNCTION(3, "HDP5"),
+               STM32_FUNCTION(4, "TIM8_BKIN"),
+               STM32_FUNCTION(15, "LCD_G7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(163, "PK3"),
+               STM32_FUNCTION(0, "GPIOK3"),
+               STM32_FUNCTION(15, "LCD_B4"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(164, "PK4"),
+               STM32_FUNCTION(0, "GPIOK4"),
+               STM32_FUNCTION(15, "LCD_B5"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(165, "PK5"),
+               STM32_FUNCTION(0, "GPIOK5"),
+               STM32_FUNCTION(1, "TRACED6"),
+               STM32_FUNCTION(3, "HDP6"),
+               STM32_FUNCTION(15, "LCD_B6"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(166, "PK6"),
+               STM32_FUNCTION(0, "GPIOK6"),
+               STM32_FUNCTION(1, "TRACED7"),
+               STM32_FUNCTION(3, "HDP7"),
+               STM32_FUNCTION(15, "LCD_B7"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(167, "PK7"),
+               STM32_FUNCTION(0, "GPIOK7"),
+               STM32_FUNCTION(15, "LCD_DE"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+};
+
+static const struct stm32_desc_pin stm32mp157_z_pins[] = {
+       STM32_PIN(
+               PINCTRL_PIN(400, "PZ0"),
+               STM32_FUNCTION(0, "GPIOZ0"),
+               STM32_FUNCTION(3, "I2C6_SCL"),
+               STM32_FUNCTION(4, "I2C2_SCL"),
+               STM32_FUNCTION(6, "SPI1_SCK I2S1_CK"),
+               STM32_FUNCTION(8, "USART1_CK"),
+               STM32_FUNCTION(9, "SPI6_SCK"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(401, "PZ1"),
+               STM32_FUNCTION(0, "GPIOZ1"),
+               STM32_FUNCTION(3, "I2C6_SDA"),
+               STM32_FUNCTION(4, "I2C2_SDA"),
+               STM32_FUNCTION(5, "I2C5_SDA"),
+               STM32_FUNCTION(6, "SPI1_MISO I2S1_SDI"),
+               STM32_FUNCTION(7, "I2C4_SDA"),
+               STM32_FUNCTION(8, "USART1_RX"),
+               STM32_FUNCTION(9, "SPI6_MISO"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(402, "PZ2"),
+               STM32_FUNCTION(0, "GPIOZ2"),
+               STM32_FUNCTION(3, "I2C6_SCL"),
+               STM32_FUNCTION(4, "I2C2_SCL"),
+               STM32_FUNCTION(5, "I2C5_SMBA"),
+               STM32_FUNCTION(6, "SPI1_MOSI I2S1_SDO"),
+               STM32_FUNCTION(7, "I2C4_SMBA"),
+               STM32_FUNCTION(8, "USART1_TX"),
+               STM32_FUNCTION(9, "SPI6_MOSI"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(403, "PZ3"),
+               STM32_FUNCTION(0, "GPIOZ3"),
+               STM32_FUNCTION(3, "I2C6_SDA"),
+               STM32_FUNCTION(4, "I2C2_SDA"),
+               STM32_FUNCTION(5, "I2C5_SDA"),
+               STM32_FUNCTION(6, "SPI1_NSS I2S1_WS"),
+               STM32_FUNCTION(7, "I2C4_SDA"),
+               STM32_FUNCTION(8, "USART1_CTS_NSS"),
+               STM32_FUNCTION(9, "SPI6_NSS"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(404, "PZ4"),
+               STM32_FUNCTION(0, "GPIOZ4"),
+               STM32_FUNCTION(3, "I2C6_SCL"),
+               STM32_FUNCTION(4, "I2C2_SCL"),
+               STM32_FUNCTION(5, "I2C5_SCL"),
+               STM32_FUNCTION(7, "I2C4_SCL"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(405, "PZ5"),
+               STM32_FUNCTION(0, "GPIOZ5"),
+               STM32_FUNCTION(3, "I2C6_SDA"),
+               STM32_FUNCTION(4, "I2C2_SDA"),
+               STM32_FUNCTION(5, "I2C5_SDA"),
+               STM32_FUNCTION(7, "I2C4_SDA"),
+               STM32_FUNCTION(8, "USART1_RTS"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(406, "PZ6"),
+               STM32_FUNCTION(0, "GPIOZ6"),
+               STM32_FUNCTION(3, "I2C6_SCL"),
+               STM32_FUNCTION(4, "I2C2_SCL"),
+               STM32_FUNCTION(5, "USART1_CK"),
+               STM32_FUNCTION(6, "I2S1_MCK"),
+               STM32_FUNCTION(7, "I2C4_SMBA"),
+               STM32_FUNCTION(8, "USART1_RX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+       STM32_PIN(
+               PINCTRL_PIN(407, "PZ7"),
+               STM32_FUNCTION(0, "GPIOZ7"),
+               STM32_FUNCTION(3, "I2C6_SDA"),
+               STM32_FUNCTION(4, "I2C2_SDA"),
+               STM32_FUNCTION(8, "USART1_TX"),
+               STM32_FUNCTION(16, "EVENTOUT"),
+               STM32_FUNCTION(17, "ANALOG")
+       ),
+};
+
+static struct stm32_pinctrl_match_data stm32mp157_match_data = {
+       .pins = stm32mp157_pins,
+       .npins = ARRAY_SIZE(stm32mp157_pins),
+};
+
+static struct stm32_pinctrl_match_data stm32mp157_z_match_data = {
+       .pins = stm32mp157_z_pins,
+       .npins = ARRAY_SIZE(stm32mp157_z_pins),
+};
+
+static const struct of_device_id stm32mp157_pctrl_match[] = {
+       {
+               .compatible = "st,stm32mp157-pinctrl",
+               .data = &stm32mp157_match_data,
+       },
+       {
+               .compatible = "st,stm32mp157-z-pinctrl",
+               .data = &stm32mp157_z_match_data,
+       },
+       { }
+};
+
+static struct platform_driver stm32mp157_pinctrl_driver = {
+       .probe = stm32_pctl_probe,
+       .driver = {
+               .name = "stm32mp157-pinctrl",
+               .of_match_table = stm32mp157_pctrl_match,
+       },
+};
+
+static int __init stm32mp157_pinctrl_init(void)
+{
+       return platform_driver_register(&stm32mp157_pinctrl_driver);
+}
+arch_initcall(stm32mp157_pinctrl_init);
index 295e48fc94bc087923340792ffefdd04172e404a..0c7c361ebac52557351bdb4454c349c4ddba78ca 100644 (file)
@@ -1167,7 +1167,7 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "pwm"),           /* PWM1 */
-                 SUNXI_FUNCTION_VARIANT(0x3, "i2c3",   /* SDA */
+                 SUNXI_FUNCTION_VARIANT(0x3, "i2c4",   /* SDA */
                                         PINCTRL_SUN7I_A20 |
                                         PINCTRL_SUN8I_R40)),
        SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 4),
index 4b6cb25bc796f86d00b9ab56b7144f20bfb2d610..341312d665120a29472ce174474f870c913e5458 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <linux/io.h>
 #include <linux/clk.h>
+#include <linux/clk-provider.h>
 #include <linux/gpio/driver.h>
 #include <linux/irqdomain.h>
 #include <linux/irqchip/chained_irq.h>
@@ -83,7 +84,9 @@ sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl,
                        struct sunxi_desc_function *func = pin->functions;
 
                        while (func->name) {
-                               if (!strcmp(func->name, func_name))
+                               if (!strcmp(func->name, func_name) &&
+                                       (!func->variant ||
+                                       func->variant & pctl->variant))
                                        return func;
 
                                func++;
@@ -1185,7 +1188,7 @@ static int sunxi_pinctrl_setup_debounce(struct sunxi_pinctrl *pctl,
        int i, ret;
 
        /* Deal with old DTs that didn't have the oscillators */
-       if (of_count_phandle_with_args(node, "clocks", "#clock-cells") != 3)
+       if (of_clk_get_parent_count(node) != 3)
                return 0;
 
        /* If we don't have any setup, bail out */
index 51716819129d2106adff66086fc824fa0dbe09e6..72c718e66ebb11fa5074a7e8d476a3787aee2025 100644 (file)
@@ -666,10 +666,9 @@ int tegra_pinctrl_probe(struct platform_device *pdev,
        int fn, gn, gfn;
 
        pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
-       if (!pmx) {
-               dev_err(&pdev->dev, "Can't alloc tegra_pmx\n");
+       if (!pmx)
                return -ENOMEM;
-       }
+
        pmx->dev = &pdev->dev;
        pmx->soc = soc_data;
 
@@ -722,10 +721,8 @@ int tegra_pinctrl_probe(struct platform_device *pdev,
 
        pmx->regs = devm_kzalloc(&pdev->dev, pmx->nbanks * sizeof(*pmx->regs),
                                 GFP_KERNEL);
-       if (!pmx->regs) {
-               dev_err(&pdev->dev, "Can't alloc regs pointer\n");
+       if (!pmx->regs)
                return -ENOMEM;
-       }
 
        for (i = 0; i < pmx->nbanks; i++) {
                res = platform_get_resource(pdev, IORESOURCE_MEM, i);
index 26fda5c53e65022ceb28fe58dbc65430b0510d9b..ec0f77afeaa493f3ef0fb5c8ae63de3fc6e92a48 100644 (file)
@@ -146,6 +146,71 @@ static const struct pinctrl_ops uniphier_pctlops = {
        .dt_free_map = pinctrl_utils_free_map,
 };
 
+static const unsigned int uniphier_conf_drv_strengths_1bit[] = {4, 8};
+static const unsigned int uniphier_conf_drv_strengths_2bit[] = {8, 12, 16, 20};
+static const unsigned int uniphier_conf_drv_strengths_3bit[] = {4, 5, 7, 9, 11,
+                                                               12, 14, 16};
+static const unsigned int uniphier_conf_drv_strengths_fixed4[] = {4};
+static const unsigned int uniphier_conf_drv_strengths_fixed5[] = {5};
+static const unsigned int uniphier_conf_drv_strengths_fixed8[] = {8};
+
+static int uniphier_conf_get_drvctrl_data(struct pinctrl_dev *pctldev,
+                                         unsigned int pin, unsigned int *reg,
+                                         unsigned int *shift,
+                                         unsigned int *mask,
+                                         const unsigned int **strengths)
+{
+       const struct pin_desc *desc = pin_desc_get(pctldev, pin);
+       enum uniphier_pin_drv_type type =
+                               uniphier_pin_get_drv_type(desc->drv_data);
+       unsigned int base = 0;
+       unsigned int stride = 0;
+       unsigned int width = 0;
+       unsigned int drvctrl;
+
+       switch (type) {
+       case UNIPHIER_PIN_DRV_1BIT:
+               *strengths = uniphier_conf_drv_strengths_1bit;
+               base = UNIPHIER_PINCTRL_DRVCTRL_BASE;
+               stride = 1;
+               width = 1;
+               break;
+       case UNIPHIER_PIN_DRV_2BIT:
+               *strengths = uniphier_conf_drv_strengths_2bit;
+               base = UNIPHIER_PINCTRL_DRV2CTRL_BASE;
+               stride = 2;
+               width = 2;
+               break;
+       case UNIPHIER_PIN_DRV_3BIT:
+               *strengths = uniphier_conf_drv_strengths_3bit;
+               base = UNIPHIER_PINCTRL_DRV3CTRL_BASE;
+               stride = 4;
+               width = 3;
+               break;
+       case UNIPHIER_PIN_DRV_FIXED4:
+               *strengths = uniphier_conf_drv_strengths_fixed4;
+               break;
+       case UNIPHIER_PIN_DRV_FIXED5:
+               *strengths = uniphier_conf_drv_strengths_fixed5;
+               break;
+       case UNIPHIER_PIN_DRV_FIXED8:
+               *strengths = uniphier_conf_drv_strengths_fixed8;
+               break;
+       default:
+               /* drive strength control is not supported for this pin */
+               return -EINVAL;
+       }
+
+       drvctrl = uniphier_pin_get_drvctrl(desc->drv_data);
+       drvctrl *= stride;
+
+       *reg = base + drvctrl / 32 * 4;
+       *shift = drvctrl % 32;
+       *mask = (1U << width) - 1;
+
+       return 0;
+}
+
 static int uniphier_conf_pin_bias_get(struct pinctrl_dev *pctldev,
                                      unsigned int pin,
                                      enum pin_config_param param)
@@ -201,59 +266,24 @@ static int uniphier_conf_pin_drive_get(struct pinctrl_dev *pctldev,
                                       unsigned int pin, u32 *strength)
 {
        struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
-       const struct pin_desc *desc = pin_desc_get(pctldev, pin);
-       enum uniphier_pin_drv_type type =
-                               uniphier_pin_get_drv_type(desc->drv_data);
-       static const unsigned int strength_1bit[] = {4, 8};
-       static const unsigned int strength_2bit[] = {8, 12, 16, 20};
-       static const unsigned int strength_3bit[] = {4, 5, 7, 9, 11, 12,
-                                                    14, 16};
-       const unsigned int *supported_strength;
-       unsigned int drvctrl, reg, shift, mask, width, val;
+       unsigned int reg, shift, mask, val;
+       const unsigned int *strengths;
        int ret;
 
-       switch (type) {
-       case UNIPHIER_PIN_DRV_1BIT:
-               supported_strength = strength_1bit;
-               reg = UNIPHIER_PINCTRL_DRVCTRL_BASE;
-               width = 1;
-               break;
-       case UNIPHIER_PIN_DRV_2BIT:
-               supported_strength = strength_2bit;
-               reg = UNIPHIER_PINCTRL_DRV2CTRL_BASE;
-               width = 2;
-               break;
-       case UNIPHIER_PIN_DRV_3BIT:
-               supported_strength = strength_3bit;
-               reg = UNIPHIER_PINCTRL_DRV3CTRL_BASE;
-               width = 4;
-               break;
-       case UNIPHIER_PIN_DRV_FIXED4:
-               *strength = 4;
-               return 0;
-       case UNIPHIER_PIN_DRV_FIXED5:
-               *strength = 5;
-               return 0;
-       case UNIPHIER_PIN_DRV_FIXED8:
-               *strength = 8;
-               return 0;
-       default:
-               /* drive strength control is not supported for this pin */
-               return -EINVAL;
-       }
-
-       drvctrl = uniphier_pin_get_drvctrl(desc->drv_data);
-       drvctrl *= width;
-
-       reg += drvctrl / 32 * 4;
-       shift = drvctrl % 32;
-       mask = (1U << width) - 1;
-
-       ret = regmap_read(priv->regmap, reg, &val);
+       ret = uniphier_conf_get_drvctrl_data(pctldev, pin, &reg, &shift,
+                                            &mask, &strengths);
        if (ret)
                return ret;
 
-       *strength = supported_strength[(val >> shift) & mask];
+       if (mask) {
+               ret = regmap_read(priv->regmap, reg, &val);
+               if (ret)
+                       return ret;
+       } else {
+               val = 0;
+       }
+
+       *strength = strengths[(val >> shift) & mask];
 
        return 0;
 }
@@ -398,40 +428,20 @@ static int uniphier_conf_pin_drive_set(struct pinctrl_dev *pctldev,
 {
        struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
        const struct pin_desc *desc = pin_desc_get(pctldev, pin);
-       enum uniphier_pin_drv_type type =
-                               uniphier_pin_get_drv_type(desc->drv_data);
-       static const unsigned int strength_1bit[] = {4, 8, -1};
-       static const unsigned int strength_2bit[] = {8, 12, 16, 20, -1};
-       static const unsigned int strength_3bit[] = {4, 5, 7, 9, 11, 12, 14,
-                                                    16, -1};
-       const unsigned int *supported_strength;
-       unsigned int drvctrl, reg, shift, mask, width, val;
+       unsigned int reg, shift, mask, val;
+       const unsigned int *strengths;
+       int ret;
 
-       switch (type) {
-       case UNIPHIER_PIN_DRV_1BIT:
-               supported_strength = strength_1bit;
-               reg = UNIPHIER_PINCTRL_DRVCTRL_BASE;
-               width = 1;
-               break;
-       case UNIPHIER_PIN_DRV_2BIT:
-               supported_strength = strength_2bit;
-               reg = UNIPHIER_PINCTRL_DRV2CTRL_BASE;
-               width = 2;
-               break;
-       case UNIPHIER_PIN_DRV_3BIT:
-               supported_strength = strength_3bit;
-               reg = UNIPHIER_PINCTRL_DRV3CTRL_BASE;
-               width = 4;
-               break;
-       default:
-               dev_err(pctldev->dev,
-                       "cannot change drive strength for pin %s\n",
+       ret = uniphier_conf_get_drvctrl_data(pctldev, pin, &reg, &shift,
+                                            &mask, &strengths);
+       if (ret) {
+               dev_err(pctldev->dev, "cannot set drive strength for pin %s\n",
                        desc->name);
-               return -EINVAL;
+               return ret;
        }
 
-       for (val = 0; supported_strength[val] > 0; val++) {
-               if (supported_strength[val] > strength)
+       for (val = 0; val <= mask; val++) {
+               if (strengths[val] > strength)
                        break;
        }
 
@@ -442,14 +452,10 @@ static int uniphier_conf_pin_drive_set(struct pinctrl_dev *pctldev,
                return -EINVAL;
        }
 
-       val--;
-
-       drvctrl = uniphier_pin_get_drvctrl(desc->drv_data);
-       drvctrl *= width;
+       if (!mask)
+               return 0;
 
-       reg += drvctrl / 32 * 4;
-       shift = drvctrl % 32;
-       mask = (1U << width) - 1;
+       val--;
 
        return regmap_update_bits(priv->regmap, reg,
                                  mask << shift, val << shift);
index 767f340d6b115f00d798a06aa86612c500c8bbe7..9086a3758eeecc204819fe400689517c43809764 100644 (file)
@@ -458,10 +458,8 @@ static int vt8500_pinctrl_probe(struct platform_device *pdev)
        struct wmt_pinctrl_data *data;
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
-       if (!data) {
-               dev_err(&pdev->dev, "failed to allocate data\n");
+       if (!data)
                return -ENOMEM;
-       }
 
        data->banks = vt8500_banks;
        data->nbanks = ARRAY_SIZE(vt8500_banks);
index a56fdbd87e42b9da3bd3c80976eb2f28155fe7cc..e1aae1d4b0b17cc0264ae0615819eb9bd1183ba7 100644 (file)
@@ -489,10 +489,8 @@ static int wm8505_pinctrl_probe(struct platform_device *pdev)
        struct wmt_pinctrl_data *data;
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
-       if (!data) {
-               dev_err(&pdev->dev, "failed to allocate data\n");
+       if (!data)
                return -ENOMEM;
-       }
 
        data->banks = wm8505_banks;
        data->nbanks = ARRAY_SIZE(wm8505_banks);
index 270dd491f5a1e8c82d8968bdbdb49d24ee284903..4678227d40019209007e7d263f4cf40d0fa03e41 100644 (file)
@@ -327,10 +327,8 @@ static int wm8650_pinctrl_probe(struct platform_device *pdev)
        struct wmt_pinctrl_data *data;
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
-       if (!data) {
-               dev_err(&pdev->dev, "failed to allocate data\n");
+       if (!data)
                return -ENOMEM;
-       }
 
        data->banks = wm8650_banks;
        data->nbanks = ARRAY_SIZE(wm8650_banks);
index 74f7b3a18f3a859272598f58b800407ff9b871a4..c46d6946c8f58ecd324556300b89c1a6fd58b931 100644 (file)
@@ -366,10 +366,8 @@ static int wm8750_pinctrl_probe(struct platform_device *pdev)
        struct wmt_pinctrl_data *data;
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
-       if (!data) {
-               dev_err(&pdev->dev, "failed to allocate data\n");
+       if (!data)
                return -ENOMEM;
-       }
 
        data->banks = wm8750_banks;
        data->nbanks = ARRAY_SIZE(wm8750_banks);
index 45792aa7a06e31efdd9536bc392df0395ce8c77c..e2e85316a65e81397b44561eb7ee14ce4b0f7bea 100644 (file)
@@ -345,10 +345,8 @@ static int wm8850_pinctrl_probe(struct platform_device *pdev)
        struct wmt_pinctrl_data *data;
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
-       if (!data) {
-               dev_err(&pdev->dev, "failed to allocate data\n");
+       if (!data)
                return -ENOMEM;
-       }
 
        data->banks = wm8850_banks;
        data->nbanks = ARRAY_SIZE(wm8850_banks);
diff --git a/include/dt-bindings/gpio/meson-axg-gpio.h b/include/dt-bindings/gpio/meson-axg-gpio.h
new file mode 100644 (file)
index 0000000..25bb1ff
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2017 Amlogic, Inc. All rights reserved.
+ * Author: Xingyu Chen <xingyu.chen@amlogic.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef _DT_BINDINGS_MESON_AXG_GPIO_H
+#define _DT_BINDINGS_MESON_AXG_GPIO_H
+
+/* First GPIO chip */
+#define GPIOAO_0       0
+#define GPIOAO_1       1
+#define GPIOAO_2       2
+#define GPIOAO_3       3
+#define GPIOAO_4       4
+#define GPIOAO_5       5
+#define GPIOAO_6       6
+#define GPIOAO_7       7
+#define GPIOAO_8       8
+#define GPIOAO_9       9
+#define GPIOAO_10      10
+#define GPIOAO_11      11
+#define GPIOAO_12      12
+#define GPIOAO_13      13
+#define GPIO_TEST_N 14
+
+/* Second GPIO chip */
+#define GPIOZ_0                0
+#define GPIOZ_1                1
+#define GPIOZ_2                2
+#define GPIOZ_3                3
+#define GPIOZ_4                4
+#define GPIOZ_5                5
+#define GPIOZ_6                6
+#define GPIOZ_7                7
+#define GPIOZ_8                8
+#define GPIOZ_9                9
+#define GPIOZ_10       10
+#define BOOT_0         11
+#define BOOT_1         12
+#define BOOT_2         13
+#define BOOT_3         14
+#define BOOT_4         15
+#define BOOT_5         16
+#define BOOT_6         17
+#define BOOT_7         18
+#define BOOT_8         19
+#define BOOT_9         20
+#define BOOT_10                21
+#define BOOT_11                22
+#define BOOT_12                23
+#define BOOT_13                24
+#define BOOT_14                25
+#define GPIOA_0            26
+#define GPIOA_1                27
+#define GPIOA_2                28
+#define GPIOA_3                29
+#define GPIOA_4                30
+#define GPIOA_5                31
+#define GPIOA_6                32
+#define GPIOA_7                33
+#define GPIOA_8                34
+#define GPIOA_9                35
+#define GPIOA_10       36
+#define GPIOA_11       37
+#define GPIOA_12       38
+#define GPIOA_13       39
+#define GPIOA_14       40
+#define GPIOA_15       41
+#define GPIOA_16       42
+#define GPIOA_17       43
+#define GPIOA_18       44
+#define GPIOA_19       45
+#define GPIOA_20       46
+#define GPIOX_0                47
+#define GPIOX_1                48
+#define GPIOX_2                49
+#define GPIOX_3                50
+#define GPIOX_4                51
+#define GPIOX_5                52
+#define GPIOX_6                53
+#define GPIOX_7                54
+#define GPIOX_8                55
+#define GPIOX_9                56
+#define GPIOX_10       57
+#define GPIOX_11       58
+#define GPIOX_12       59
+#define GPIOX_13       60
+#define GPIOX_14       61
+#define GPIOX_15       62
+#define GPIOX_16       63
+#define GPIOX_17       64
+#define GPIOX_18       65
+#define GPIOX_19       66
+#define GPIOX_20       67
+#define GPIOX_21       68
+#define GPIOX_22       69
+#define GPIOY_0                70
+#define GPIOY_1                71
+#define GPIOY_2                72
+#define GPIOY_3                73
+#define GPIOY_4                74
+#define GPIOY_5                75
+#define GPIOY_6                76
+#define GPIOY_7                77
+#define GPIOY_8                78
+#define GPIOY_9                79
+#define GPIOY_10       80
+#define GPIOY_11       81
+#define GPIOY_12       82
+#define GPIOY_13       83
+#define GPIOY_14       84
+#define GPIOY_15       85
+
+#endif /* _DT_BINDINGS_MESON_AXG_GPIO_H */
index b8dfe31821e66694624bcad1589729f4af83f420..b5a2174a63868160f2d711d262bfb95c684d6586 100644 (file)
@@ -1,3 +1,9 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
+/*
+ * Copyright (C) STMicroelectronics 2017 - All Rights Reserved
+ * Author: Torgue Alexandre <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
 #ifndef _DT_BINDINGS_STM32_PINFUNC_H
 #define _DT_BINDINGS_STM32_PINFUNC_H
 
index 05082e407c4a7c242250b05a08fbf028447e6ad6..d01a8638bb4550437e3bf236531d15e6b9850a88 100644 (file)
@@ -43,6 +43,8 @@ extern int pinctrl_init_done(struct device *dev);
 
 #else
 
+struct device;
+
 /* Stubs if we're not using pinctrl */
 
 static inline int pinctrl_bind_pins(struct device *dev)