root/drivers/pinctrl/renesas/pfc-r8a779f0.c
// SPDX-License-Identifier: GPL-2.0
/*
 * R8A779F0 processor support - PFC hardware block.
 *
 * Copyright (C) 2021 Renesas Electronics Corp.
 *
 * This file is based on the drivers/pinctrl/renesas/pfc-r8a779a0.c
 */

#include <linux/errno.h>
#include <linux/io.h>
#include <linux/kernel.h>

#include "sh_pfc.h"

#define CFG_FLAGS (SH_PFC_PIN_CFG_DRIVE_STRENGTH | SH_PFC_PIN_CFG_PULL_UP_DOWN)

#define CPU_ALL_GP(fn, sfx)     \
        PORT_GP_CFG_21(0, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE_18_33),        \
        PORT_GP_CFG_25(1, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE_18_33),        \
        PORT_GP_CFG_17(2, fn, sfx, CFG_FLAGS),  \
        PORT_GP_CFG_19(3, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE_18_33)

#define CPU_ALL_NOGP(fn)                                                                \
        PIN_NOGP_CFG(PRESETOUT0_N, "PRESETOUT0#", fn, SH_PFC_PIN_CFG_PULL_DOWN),        \
        PIN_NOGP_CFG(EXTALR, "EXTALR", fn, SH_PFC_PIN_CFG_PULL_UP_DOWN)

/*
 * F_() : just information
 * FM() : macro for FN_xxx / xxx_MARK
 */

/* GPSR0 */
#define GPSR0_20        F_(IRQ3,        IP2SR0_19_16)
#define GPSR0_19        F_(IRQ2,        IP2SR0_15_12)
#define GPSR0_18        F_(IRQ1,        IP2SR0_11_8)
#define GPSR0_17        F_(IRQ0,        IP2SR0_7_4)
#define GPSR0_16        F_(MSIOF0_SS2,  IP2SR0_3_0)
#define GPSR0_15        F_(MSIOF0_SS1,  IP1SR0_31_28)
#define GPSR0_14        F_(MSIOF0_SCK,  IP1SR0_27_24)
#define GPSR0_13        F_(MSIOF0_TXD,  IP1SR0_23_20)
#define GPSR0_12        F_(MSIOF0_RXD,  IP1SR0_19_16)
#define GPSR0_11        F_(MSIOF0_SYNC, IP1SR0_15_12)
#define GPSR0_10        F_(CTS0_N,      IP1SR0_11_8)
#define GPSR0_9         F_(RTS0_N,      IP1SR0_7_4)
#define GPSR0_8         F_(SCK0,        IP1SR0_3_0)
#define GPSR0_7         F_(TX0,         IP0SR0_31_28)
#define GPSR0_6         F_(RX0,         IP0SR0_27_24)
#define GPSR0_5         F_(HRTS0_N,     IP0SR0_23_20)
#define GPSR0_4         F_(HCTS0_N,     IP0SR0_19_16)
#define GPSR0_3         F_(HTX0,        IP0SR0_15_12)
#define GPSR0_2         F_(HRX0,        IP0SR0_11_8)
#define GPSR0_1         F_(HSCK0,       IP0SR0_7_4)
#define GPSR0_0         F_(SCIF_CLK,    IP0SR0_3_0)

/* GPSR1 */
#define GPSR1_24        FM(SD_WP)
#define GPSR1_23        FM(SD_CD)
#define GPSR1_22        FM(MMC_SD_CMD)
#define GPSR1_21        FM(MMC_D7)
#define GPSR1_20        FM(MMC_DS)
#define GPSR1_19        FM(MMC_D6)
#define GPSR1_18        FM(MMC_D4)
#define GPSR1_17        FM(MMC_D5)
#define GPSR1_16        FM(MMC_SD_D3)
#define GPSR1_15        FM(MMC_SD_D2)
#define GPSR1_14        FM(MMC_SD_D1)
#define GPSR1_13        FM(MMC_SD_D0)
#define GPSR1_12        FM(MMC_SD_CLK)
#define GPSR1_11        FM(GP1_11)
#define GPSR1_10        FM(GP1_10)
#define GPSR1_9         FM(GP1_09)
#define GPSR1_8         FM(GP1_08)
#define GPSR1_7         F_(GP1_07,      IP0SR1_31_28)
#define GPSR1_6         F_(GP1_06,      IP0SR1_27_24)
#define GPSR1_5         F_(GP1_05,      IP0SR1_23_20)
#define GPSR1_4         F_(GP1_04,      IP0SR1_19_16)
#define GPSR1_3         F_(GP1_03,      IP0SR1_15_12)
#define GPSR1_2         F_(GP1_02,      IP0SR1_11_8)
#define GPSR1_1         F_(GP1_01,      IP0SR1_7_4)
#define GPSR1_0         F_(GP1_00,      IP0SR1_3_0)

/* GPSR2 */
#define GPSR2_16        FM(PCIE1_CLKREQ_N)
#define GPSR2_15        FM(PCIE0_CLKREQ_N)
#define GPSR2_14        FM(QSPI0_IO3)
#define GPSR2_13        FM(QSPI0_SSL)
#define GPSR2_12        FM(QSPI0_MISO_IO1)
#define GPSR2_11        FM(QSPI0_IO2)
#define GPSR2_10        FM(QSPI0_SPCLK)
#define GPSR2_9         FM(QSPI0_MOSI_IO0)
#define GPSR2_8         FM(QSPI1_SPCLK)
#define GPSR2_7         FM(QSPI1_MOSI_IO0)
#define GPSR2_6         FM(QSPI1_IO2)
#define GPSR2_5         FM(QSPI1_MISO_IO1)
#define GPSR2_4         FM(QSPI1_IO3)
#define GPSR2_3         FM(QSPI1_SSL)
#define GPSR2_2         FM(RPC_RESET_N)
#define GPSR2_1         FM(RPC_WP_N)
#define GPSR2_0         FM(RPC_INT_N)

/* GPSR3 */
#define GPSR3_18        FM(TSN0_AVTP_CAPTURE_B)
#define GPSR3_17        FM(TSN0_AVTP_MATCH_B)
#define GPSR3_16        FM(TSN0_AVTP_PPS)
#define GPSR3_15        FM(TSN1_AVTP_CAPTURE_B)
#define GPSR3_14        FM(TSN1_AVTP_MATCH_B)
#define GPSR3_13        FM(TSN1_AVTP_PPS)
#define GPSR3_12        FM(TSN0_MAGIC_B)
#define GPSR3_11        FM(TSN1_PHY_INT_B)
#define GPSR3_10        FM(TSN0_PHY_INT_B)
#define GPSR3_9         FM(TSN2_PHY_INT_B)
#define GPSR3_8         FM(TSN0_LINK_B)
#define GPSR3_7         FM(TSN2_LINK_B)
#define GPSR3_6         FM(TSN1_LINK_B)
#define GPSR3_5         FM(TSN1_MDC_B)
#define GPSR3_4         FM(TSN0_MDC_B)
#define GPSR3_3         FM(TSN2_MDC_B)
#define GPSR3_2         FM(TSN0_MDIO_B)
#define GPSR3_1         FM(TSN2_MDIO_B)
#define GPSR3_0         FM(TSN1_MDIO_B)

/* IP0SR0 */            /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */         /* 5 */                 /* 6 */                 /* 7 - F */
#define IP0SR0_3_0      FM(SCIF_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) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
#define IP0SR0_7_4      FM(HSCK0)               FM(SCK3)                FM(MSIOF3_SCK)          F_(0, 0)                F_(0, 0)        FM(TSN0_AVTP_CAPTURE_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 IP0SR0_11_8     FM(HRX0)                FM(RX3)                 FM(MSIOF3_RXD)          F_(0, 0)                F_(0, 0)        FM(TSN0_AVTP_MATCH_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 IP0SR0_15_12    FM(HTX0)                FM(TX3)                 FM(MSIOF3_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) F_(0, 0) F_(0, 0) F_(0, 0)
#define IP0SR0_19_16    FM(HCTS0_N)             FM(CTS3_N)              FM(MSIOF3_SS1)          F_(0, 0)                F_(0, 0)        FM(TSN0_MDC_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 IP0SR0_23_20    FM(HRTS0_N)             FM(RTS3_N)              FM(MSIOF3_SS2)          F_(0, 0)                F_(0, 0)        FM(TSN0_MDIO_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 IP0SR0_27_24    FM(RX0)                 FM(HRX1)                F_(0, 0)                FM(MSIOF1_RXD)          F_(0, 0)        FM(TSN1_AVTP_MATCH_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 IP0SR0_31_28    FM(TX0)                 FM(HTX1)                F_(0, 0)                FM(MSIOF1_TXD)          F_(0, 0)        FM(TSN1_AVTP_CAPTURE_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)
/* IP1SR0 */            /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */         /* 5 */                 /* 6 */                 /* 7 - F */
#define IP1SR0_3_0      FM(SCK0)                FM(HSCK1)               F_(0, 0)                FM(MSIOF1_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)
#define IP1SR0_7_4      FM(RTS0_N)              FM(HRTS1_N)             FM(MSIOF3_SYNC)         F_(0, 0)                F_(0, 0)        FM(TSN1_MDIO_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 IP1SR0_11_8     FM(CTS0_N)              FM(HCTS1_N)             F_(0, 0)                FM(MSIOF1_SYNC)         F_(0, 0)        FM(TSN1_MDC_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 IP1SR0_15_12    FM(MSIOF0_SYNC)         FM(HCTS3_N)             FM(CTS1_N)              FM(IRQ4)                F_(0, 0)        FM(TSN0_LINK_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 IP1SR0_19_16    FM(MSIOF0_RXD)          FM(HRX3)                FM(RX1)                 F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)                F_(0, 0) 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 IP1SR0_23_20    FM(MSIOF0_TXD)          FM(HTX3)                FM(TX1)                 F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)                F_(0, 0) 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 IP1SR0_27_24    FM(MSIOF0_SCK)          FM(HSCK3)               FM(SCK1)                F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)                F_(0, 0) 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 IP1SR0_31_28    FM(MSIOF0_SS1)          FM(HRTS3_N)             FM(RTS1_N)              FM(IRQ5)                F_(0, 0)        FM(TSN1_LINK_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)
/* IP2SR0 */            /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */         /* 5 */                 /* 6 */                 /* 7 - F */
#define IP2SR0_3_0      FM(MSIOF0_SS2)          F_(0, 0)                F_(0, 0)                F_(0, 0)                F_(0, 0)        FM(TSN2_LINK_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 IP2SR0_7_4      FM(IRQ0)                F_(0, 0)                F_(0, 0)                FM(MSIOF1_SS1)          F_(0, 0)        FM(TSN0_MAGIC_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 IP2SR0_11_8     FM(IRQ1)                F_(0, 0)                F_(0, 0)                FM(MSIOF1_SS2)          F_(0, 0)        FM(TSN0_PHY_INT_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 IP2SR0_15_12    FM(IRQ2)                F_(0, 0)                F_(0, 0)                F_(0, 0)                F_(0, 0)        FM(TSN1_PHY_INT_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 IP2SR0_19_16    FM(IRQ3)                F_(0, 0)                F_(0, 0)                F_(0, 0)                F_(0, 0)        FM(TSN2_PHY_INT_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)

/* IP0SR1 */            /* 0 */                 /* 1 */                 /* 2 */                 /* 3 */                 /* 4 */         /* 5 */                 /* 6 */                 /* 7 - F */
#define IP0SR1_3_0      FM(GP1_00)              FM(TCLK1)               FM(HSCK2)               F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)                F_(0, 0) 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 IP0SR1_7_4      FM(GP1_01)              FM(TCLK4)               FM(HRX2)                F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)                F_(0, 0) 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 IP0SR1_11_8     FM(GP1_02)              F_(0, 0)                FM(HTX2)                FM(MSIOF2_SS1)          F_(0, 0)        FM(TSN2_MDC_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 IP0SR1_15_12    FM(GP1_03)              FM(TCLK2)               FM(HCTS2_N)             FM(MSIOF2_SS2)          FM(CTS4_N)      FM(TSN2_MDIO_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 IP0SR1_19_16    FM(GP1_04)              FM(TCLK3)               FM(HRTS2_N)             FM(MSIOF2_SYNC)         FM(RTS4_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 IP0SR1_23_20    FM(GP1_05)              FM(MSIOF2_SCK)          FM(SCK4)                F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)                F_(0, 0) 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 IP0SR1_27_24    FM(GP1_06)              FM(MSIOF2_RXD)          FM(RX4)                 F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)                F_(0, 0) 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 IP0SR1_31_28    FM(GP1_07)              FM(MSIOF2_TXD)          FM(TX4)                 F_(0, 0)                F_(0, 0)        F_(0, 0)                F_(0, 0)                F_(0, 0) 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_24                                        \
                GPSR1_23                                        \
                GPSR1_22                                        \
                GPSR1_21                                        \
GPSR0_20        GPSR1_20                                        \
GPSR0_19        GPSR1_19                                        \
GPSR0_18        GPSR1_18                        GPSR3_18        \
GPSR0_17        GPSR1_17                        GPSR3_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        \
GPSR0_13        GPSR1_13        GPSR2_13        GPSR3_13        \
GPSR0_12        GPSR1_12        GPSR2_12        GPSR3_12        \
GPSR0_11        GPSR1_11        GPSR2_11        GPSR3_11        \
GPSR0_10        GPSR1_10        GPSR2_10        GPSR3_10        \
GPSR0_9         GPSR1_9         GPSR2_9         GPSR3_9         \
GPSR0_8         GPSR1_8         GPSR2_8         GPSR3_8         \
GPSR0_7         GPSR1_7         GPSR2_7         GPSR3_7         \
GPSR0_6         GPSR1_6         GPSR2_6         GPSR3_6         \
GPSR0_5         GPSR1_5         GPSR2_5         GPSR3_5         \
GPSR0_4         GPSR1_4         GPSR2_4         GPSR3_4         \
GPSR0_3         GPSR1_3         GPSR2_3         GPSR3_3         \
GPSR0_2         GPSR1_2         GPSR2_2         GPSR3_2         \
GPSR0_1         GPSR1_1         GPSR2_1         GPSR3_1         \
GPSR0_0         GPSR1_0         GPSR2_0         GPSR3_0

#define PINMUX_IPSR     \
\
FM(IP0SR0_3_0)          IP0SR0_3_0      FM(IP1SR0_3_0)          IP1SR0_3_0      FM(IP2SR0_3_0)          IP2SR0_3_0      \
FM(IP0SR0_7_4)          IP0SR0_7_4      FM(IP1SR0_7_4)          IP1SR0_7_4      FM(IP2SR0_7_4)          IP2SR0_7_4      \
FM(IP0SR0_11_8)         IP0SR0_11_8     FM(IP1SR0_11_8)         IP1SR0_11_8     FM(IP2SR0_11_8)         IP2SR0_11_8     \
FM(IP0SR0_15_12)        IP0SR0_15_12    FM(IP1SR0_15_12)        IP1SR0_15_12    FM(IP2SR0_15_12)        IP2SR0_15_12    \
FM(IP0SR0_19_16)        IP0SR0_19_16    FM(IP1SR0_19_16)        IP1SR0_19_16    FM(IP2SR0_19_16)        IP2SR0_19_16    \
FM(IP0SR0_23_20)        IP0SR0_23_20    FM(IP1SR0_23_20)        IP1SR0_23_20    \
FM(IP0SR0_27_24)        IP0SR0_27_24    FM(IP1SR0_27_24)        IP1SR0_27_24    \
FM(IP0SR0_31_28)        IP0SR0_31_28    FM(IP1SR0_31_28)        IP1SR0_31_28    \
\
FM(IP0SR1_3_0)          IP0SR1_3_0      \
FM(IP0SR1_7_4)          IP0SR1_7_4      \
FM(IP0SR1_11_8)         IP0SR1_11_8     \
FM(IP0SR1_15_12)        IP0SR1_15_12    \
FM(IP0SR1_19_16)        IP0SR1_19_16    \
FM(IP0SR1_23_20)        IP0SR1_23_20    \
FM(IP0SR1_27_24)        IP0SR1_27_24    \
FM(IP0SR1_31_28)        IP0SR1_31_28

/* MOD_SEL1 */                  /* 0 */         /* 1 */         /* 2 */         /* 3 */
#define MOD_SEL1_11_10          FM(SEL_I2C5_0)  F_(0, 0)        F_(0, 0)        FM(SEL_I2C5_3)
#define MOD_SEL1_9_8            FM(SEL_I2C4_0)  F_(0, 0)        F_(0, 0)        FM(SEL_I2C4_3)
#define MOD_SEL1_7_6            FM(SEL_I2C3_0)  F_(0, 0)        F_(0, 0)        FM(SEL_I2C3_3)
#define MOD_SEL1_5_4            FM(SEL_I2C2_0)  F_(0, 0)        F_(0, 0)        FM(SEL_I2C2_3)
#define MOD_SEL1_3_2            FM(SEL_I2C1_0)  F_(0, 0)        F_(0, 0)        FM(SEL_I2C1_3)
#define MOD_SEL1_1_0            FM(SEL_I2C0_0)  F_(0, 0)        F_(0, 0)        FM(SEL_I2C0_3)

#define PINMUX_MOD_SELS \
\
MOD_SEL1_11_10 \
MOD_SEL1_9_8 \
MOD_SEL1_7_6 \
MOD_SEL1_5_4 \
MOD_SEL1_3_2 \
MOD_SEL1_1_0

#define PINMUX_PHYS \
        FM(SCL0) FM(SDA0) FM(SCL1) FM(SDA1) FM(SCL2) FM(SDA2) FM(SCL3) FM(SDA3) \
        FM(SCL4) FM(SDA4) FM(SCL5) FM(SDA5)

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_PHYS
        PINMUX_MARK_END,
#undef F_
#undef FM
};

static const u16 pinmux_data[] = {
/* Using GP_1_[0-9] requires disabling I2C in MOD_SEL1 */
#define GP_1_0_FN       GP_1_0_FN,      FN_SEL_I2C0_0
#define GP_1_1_FN       GP_1_1_FN,      FN_SEL_I2C0_0
#define GP_1_2_FN       GP_1_2_FN,      FN_SEL_I2C1_0
#define GP_1_3_FN       GP_1_3_FN,      FN_SEL_I2C1_0
#define GP_1_4_FN       GP_1_4_FN,      FN_SEL_I2C2_0
#define GP_1_5_FN       GP_1_5_FN,      FN_SEL_I2C2_0
#define GP_1_6_FN       GP_1_6_FN,      FN_SEL_I2C3_0
#define GP_1_7_FN       GP_1_7_FN,      FN_SEL_I2C3_0
#define GP_1_8_FN       GP_1_8_FN,      FN_SEL_I2C4_0
#define GP_1_9_FN       GP_1_9_FN,      FN_SEL_I2C4_0
        PINMUX_DATA_GP_ALL(),
#undef GP_1_0_FN
#undef GP_1_1_FN
#undef GP_1_2_FN
#undef GP_1_3_FN
#undef GP_1_4_FN
#undef GP_1_5_FN
#undef GP_1_6_FN
#undef GP_1_7_FN
#undef GP_1_8_FN
#undef GP_1_9_FN

        PINMUX_SINGLE(SD_WP),
        PINMUX_SINGLE(SD_CD),
        PINMUX_SINGLE(MMC_SD_CMD),
        PINMUX_SINGLE(MMC_D7),
        PINMUX_SINGLE(MMC_DS),
        PINMUX_SINGLE(MMC_D6),
        PINMUX_SINGLE(MMC_D4),
        PINMUX_SINGLE(MMC_D5),
        PINMUX_SINGLE(MMC_SD_D3),
        PINMUX_SINGLE(MMC_SD_D2),
        PINMUX_SINGLE(MMC_SD_D1),
        PINMUX_SINGLE(MMC_SD_D0),
        PINMUX_SINGLE(MMC_SD_CLK),
        PINMUX_SINGLE(PCIE1_CLKREQ_N),
        PINMUX_SINGLE(PCIE0_CLKREQ_N),
        PINMUX_SINGLE(QSPI0_IO3),
        PINMUX_SINGLE(QSPI0_SSL),
        PINMUX_SINGLE(QSPI0_MISO_IO1),
        PINMUX_SINGLE(QSPI0_IO2),
        PINMUX_SINGLE(QSPI0_SPCLK),
        PINMUX_SINGLE(QSPI0_MOSI_IO0),
        PINMUX_SINGLE(QSPI1_SPCLK),
        PINMUX_SINGLE(QSPI1_MOSI_IO0),
        PINMUX_SINGLE(QSPI1_IO2),
        PINMUX_SINGLE(QSPI1_MISO_IO1),
        PINMUX_SINGLE(QSPI1_IO3),
        PINMUX_SINGLE(QSPI1_SSL),
        PINMUX_SINGLE(RPC_RESET_N),
        PINMUX_SINGLE(RPC_WP_N),
        PINMUX_SINGLE(RPC_INT_N),

        PINMUX_SINGLE(TSN0_AVTP_CAPTURE_B),
        PINMUX_SINGLE(TSN0_AVTP_MATCH_B),
        PINMUX_SINGLE(TSN0_AVTP_PPS),
        PINMUX_SINGLE(TSN1_AVTP_CAPTURE_B),
        PINMUX_SINGLE(TSN1_AVTP_MATCH_B),
        PINMUX_SINGLE(TSN1_AVTP_PPS),
        PINMUX_SINGLE(TSN0_MAGIC_B),
        PINMUX_SINGLE(TSN1_PHY_INT_B),
        PINMUX_SINGLE(TSN0_PHY_INT_B),
        PINMUX_SINGLE(TSN2_PHY_INT_B),
        PINMUX_SINGLE(TSN0_LINK_B),
        PINMUX_SINGLE(TSN2_LINK_B),
        PINMUX_SINGLE(TSN1_LINK_B),
        PINMUX_SINGLE(TSN1_MDC_B),
        PINMUX_SINGLE(TSN0_MDC_B),
        PINMUX_SINGLE(TSN2_MDC_B),
        PINMUX_SINGLE(TSN0_MDIO_B),
        PINMUX_SINGLE(TSN2_MDIO_B),
        PINMUX_SINGLE(TSN1_MDIO_B),

        /* IP0SR0 */
        PINMUX_IPSR_GPSR(IP0SR0_3_0,    SCIF_CLK),

        PINMUX_IPSR_GPSR(IP0SR0_7_4,    HSCK0),
        PINMUX_IPSR_GPSR(IP0SR0_7_4,    SCK3),
        PINMUX_IPSR_GPSR(IP0SR0_7_4,    MSIOF3_SCK),
        PINMUX_IPSR_GPSR(IP0SR0_7_4,    TSN0_AVTP_CAPTURE_A),

        PINMUX_IPSR_GPSR(IP0SR0_11_8,   HRX0),
        PINMUX_IPSR_GPSR(IP0SR0_11_8,   RX3),
        PINMUX_IPSR_GPSR(IP0SR0_11_8,   MSIOF3_RXD),
        PINMUX_IPSR_GPSR(IP0SR0_11_8,   TSN0_AVTP_MATCH_A),

        PINMUX_IPSR_GPSR(IP0SR0_15_12,  HTX0),
        PINMUX_IPSR_GPSR(IP0SR0_15_12,  TX3),
        PINMUX_IPSR_GPSR(IP0SR0_15_12,  MSIOF3_TXD),

        PINMUX_IPSR_GPSR(IP0SR0_19_16,  HCTS0_N),
        PINMUX_IPSR_GPSR(IP0SR0_19_16,  CTS3_N),
        PINMUX_IPSR_GPSR(IP0SR0_19_16,  MSIOF3_SS1),
        PINMUX_IPSR_GPSR(IP0SR0_19_16,  TSN0_MDC_A),

        PINMUX_IPSR_GPSR(IP0SR0_23_20,  HRTS0_N),
        PINMUX_IPSR_GPSR(IP0SR0_23_20,  RTS3_N),
        PINMUX_IPSR_GPSR(IP0SR0_23_20,  MSIOF3_SS2),
        PINMUX_IPSR_GPSR(IP0SR0_23_20,  TSN0_MDIO_A),

        PINMUX_IPSR_GPSR(IP0SR0_27_24,  RX0),
        PINMUX_IPSR_GPSR(IP0SR0_27_24,  HRX1),
        PINMUX_IPSR_GPSR(IP0SR0_27_24,  MSIOF1_RXD),
        PINMUX_IPSR_GPSR(IP0SR0_27_24,  TSN1_AVTP_MATCH_A),

        PINMUX_IPSR_GPSR(IP0SR0_31_28,  TX0),
        PINMUX_IPSR_GPSR(IP0SR0_31_28,  HTX1),
        PINMUX_IPSR_GPSR(IP0SR0_31_28,  MSIOF1_TXD),
        PINMUX_IPSR_GPSR(IP0SR0_31_28,  TSN1_AVTP_CAPTURE_A),

        /* IP1SR0 */
        PINMUX_IPSR_GPSR(IP1SR0_3_0,    SCK0),
        PINMUX_IPSR_GPSR(IP1SR0_3_0,    HSCK1),
        PINMUX_IPSR_GPSR(IP1SR0_3_0,    MSIOF1_SCK),

        PINMUX_IPSR_GPSR(IP1SR0_7_4,    RTS0_N),
        PINMUX_IPSR_GPSR(IP1SR0_7_4,    HRTS1_N),
        PINMUX_IPSR_GPSR(IP1SR0_7_4,    MSIOF3_SYNC),
        PINMUX_IPSR_GPSR(IP1SR0_7_4,    TSN1_MDIO_A),

        PINMUX_IPSR_GPSR(IP1SR0_11_8,   CTS0_N),
        PINMUX_IPSR_GPSR(IP1SR0_11_8,   HCTS1_N),
        PINMUX_IPSR_GPSR(IP1SR0_11_8,   MSIOF1_SYNC),
        PINMUX_IPSR_GPSR(IP1SR0_11_8,   TSN1_MDC_A),

        PINMUX_IPSR_GPSR(IP1SR0_15_12,  MSIOF0_SYNC),
        PINMUX_IPSR_GPSR(IP1SR0_15_12,  HCTS3_N),
        PINMUX_IPSR_GPSR(IP1SR0_15_12,  CTS1_N),
        PINMUX_IPSR_GPSR(IP1SR0_15_12,  IRQ4),
        PINMUX_IPSR_GPSR(IP1SR0_15_12,  TSN0_LINK_A),

        PINMUX_IPSR_GPSR(IP1SR0_19_16,  MSIOF0_RXD),
        PINMUX_IPSR_GPSR(IP1SR0_19_16,  HRX3),
        PINMUX_IPSR_GPSR(IP1SR0_19_16,  RX1),

        PINMUX_IPSR_GPSR(IP1SR0_23_20,  MSIOF0_TXD),
        PINMUX_IPSR_GPSR(IP1SR0_23_20,  HTX3),
        PINMUX_IPSR_GPSR(IP1SR0_23_20,  TX1),

        PINMUX_IPSR_GPSR(IP1SR0_27_24,  MSIOF0_SCK),
        PINMUX_IPSR_GPSR(IP1SR0_27_24,  HSCK3),
        PINMUX_IPSR_GPSR(IP1SR0_27_24,  SCK1),

        PINMUX_IPSR_GPSR(IP1SR0_31_28,  MSIOF0_SS1),
        PINMUX_IPSR_GPSR(IP1SR0_31_28,  HRTS3_N),
        PINMUX_IPSR_GPSR(IP1SR0_31_28,  RTS1_N),
        PINMUX_IPSR_GPSR(IP1SR0_31_28,  IRQ5),
        PINMUX_IPSR_GPSR(IP1SR0_31_28,  TSN1_LINK_A),

        /* IP2SR0 */
        PINMUX_IPSR_GPSR(IP2SR0_3_0,    MSIOF0_SS2),
        PINMUX_IPSR_GPSR(IP2SR0_3_0,    TSN2_LINK_A),

        PINMUX_IPSR_GPSR(IP2SR0_7_4,    IRQ0),
        PINMUX_IPSR_GPSR(IP2SR0_7_4,    MSIOF1_SS1),
        PINMUX_IPSR_GPSR(IP2SR0_7_4,    TSN0_MAGIC_A),

        PINMUX_IPSR_GPSR(IP2SR0_11_8,   IRQ1),
        PINMUX_IPSR_GPSR(IP2SR0_11_8,   MSIOF1_SS2),
        PINMUX_IPSR_GPSR(IP2SR0_11_8,   TSN0_PHY_INT_A),

        PINMUX_IPSR_GPSR(IP2SR0_15_12,  IRQ2),
        PINMUX_IPSR_GPSR(IP2SR0_15_12,  TSN1_PHY_INT_A),

        PINMUX_IPSR_GPSR(IP2SR0_19_16,  IRQ3),
        PINMUX_IPSR_GPSR(IP2SR0_19_16,  TSN2_PHY_INT_A),

        /* IP0SR1 */
        /* GP1_00 = SCL0 */
        PINMUX_IPSR_MSEL(IP0SR1_3_0,    GP1_00,         SEL_I2C0_0),
        PINMUX_IPSR_MSEL(IP0SR1_3_0,    TCLK1,          SEL_I2C0_0),
        PINMUX_IPSR_MSEL(IP0SR1_3_0,    HSCK2,          SEL_I2C0_0),
        PINMUX_IPSR_PHYS(IP0SR1_3_0,    SCL0,           SEL_I2C0_3),

        /* GP1_01 = SDA0 */
        PINMUX_IPSR_MSEL(IP0SR1_7_4,    GP1_01,         SEL_I2C0_0),
        PINMUX_IPSR_MSEL(IP0SR1_7_4,    TCLK4,          SEL_I2C0_0),
        PINMUX_IPSR_MSEL(IP0SR1_7_4,    HRX2,           SEL_I2C0_0),
        PINMUX_IPSR_PHYS(IP0SR1_7_4,    SDA0,           SEL_I2C0_3),

        /* GP1_02 = SCL1 */
        PINMUX_IPSR_MSEL(IP0SR1_11_8,   GP1_02,         SEL_I2C1_0),
        PINMUX_IPSR_MSEL(IP0SR1_11_8,   HTX2,           SEL_I2C1_0),
        PINMUX_IPSR_MSEL(IP0SR1_11_8,   MSIOF2_SS1,     SEL_I2C1_0),
        PINMUX_IPSR_MSEL(IP0SR1_11_8,   TSN2_MDC_A,     SEL_I2C1_0),
        PINMUX_IPSR_PHYS(IP0SR1_11_8,   SCL1,           SEL_I2C1_3),

        /* GP1_03 = SDA1 */
        PINMUX_IPSR_MSEL(IP0SR1_15_12,  GP1_03,         SEL_I2C1_0),
        PINMUX_IPSR_MSEL(IP0SR1_15_12,  TCLK2,          SEL_I2C1_0),
        PINMUX_IPSR_MSEL(IP0SR1_15_12,  HCTS2_N,        SEL_I2C1_0),
        PINMUX_IPSR_MSEL(IP0SR1_15_12,  MSIOF2_SS2,     SEL_I2C1_0),
        PINMUX_IPSR_MSEL(IP0SR1_15_12,  CTS4_N,         SEL_I2C1_0),
        PINMUX_IPSR_MSEL(IP0SR1_15_12,  TSN2_MDIO_A,    SEL_I2C1_0),
        PINMUX_IPSR_PHYS(IP0SR1_15_12,  SDA1,           SEL_I2C1_3),

        /* GP1_04 = SCL2 */
        PINMUX_IPSR_MSEL(IP0SR1_19_16,  GP1_04,         SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP0SR1_19_16,  TCLK3,          SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP0SR1_19_16,  HRTS2_N,        SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP0SR1_19_16,  MSIOF2_SYNC,    SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP0SR1_19_16,  RTS4_N,         SEL_I2C2_0),
        PINMUX_IPSR_PHYS(IP0SR1_19_16,  SCL2,           SEL_I2C2_3),

        /* GP1_05 = SDA2 */
        PINMUX_IPSR_MSEL(IP0SR1_23_20,  GP1_05,         SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP0SR1_23_20,  MSIOF2_SCK,     SEL_I2C2_0),
        PINMUX_IPSR_MSEL(IP0SR1_23_20,  SCK4,           SEL_I2C2_0),
        PINMUX_IPSR_PHYS(IP0SR1_23_20,  SDA2,           SEL_I2C2_3),

        /* GP1_06 = SCL3 */
        PINMUX_IPSR_MSEL(IP0SR1_27_24,  GP1_06,         SEL_I2C3_0),
        PINMUX_IPSR_MSEL(IP0SR1_27_24,  MSIOF2_RXD,     SEL_I2C3_0),
        PINMUX_IPSR_MSEL(IP0SR1_27_24,  RX4,            SEL_I2C3_0),
        PINMUX_IPSR_PHYS(IP0SR1_27_24,  SCL3,           SEL_I2C3_3),

        /* GP1_07 = SDA3 */
        PINMUX_IPSR_MSEL(IP0SR1_31_28,  GP1_07,         SEL_I2C3_0),
        PINMUX_IPSR_MSEL(IP0SR1_31_28,  MSIOF2_TXD,     SEL_I2C3_0),
        PINMUX_IPSR_MSEL(IP0SR1_31_28,  TX4,            SEL_I2C3_0),
        PINMUX_IPSR_PHYS(IP0SR1_31_28,  SDA3,           SEL_I2C3_3),

        /* GP1_08 = SCL4 */
        PINMUX_IPSR_NOGM(0,             GP1_08,         SEL_I2C4_0),
        PINMUX_IPSR_NOFN(GP1_08,        SCL4,           SEL_I2C4_3),

        /* GP1_09 = SDA4 */
        PINMUX_IPSR_NOGM(0,             GP1_09,         SEL_I2C4_0),
        PINMUX_IPSR_NOFN(GP1_09,        SDA4,           SEL_I2C4_3),

        /* GP1_10 = SCL5 */
        PINMUX_IPSR_NOGM(0,             GP1_10,         SEL_I2C5_0),
        PINMUX_IPSR_NOFN(GP1_10,        SCL5,           SEL_I2C5_3),

        /* GP1_11 = SDA5 */
        PINMUX_IPSR_NOGM(0,             GP1_11,         SEL_I2C5_0),
        PINMUX_IPSR_NOFN(GP1_11,        SDA5,           SEL_I2C5_3),
};

/*
 * Pins not associated with a GPIO port.
 */
enum {
        GP_ASSIGN_LAST(),
        NOGP_ALL(),
};

static const struct sh_pfc_pin pinmux_pins[] = {
        PINMUX_GPIO_GP_ALL(),
};

/* - HSCIF0 ----------------------------------------------------------------- */
static const unsigned int hscif0_data_pins[] = {
        /* HRX0, HTX0 */
        RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
};
static const unsigned int hscif0_data_mux[] = {
        HRX0_MARK, HTX0_MARK,
};
static const unsigned int hscif0_clk_pins[] = {
        /* HSCK0 */
        RCAR_GP_PIN(0, 1),
};
static const unsigned int hscif0_clk_mux[] = {
        HSCK0_MARK,
};
static const unsigned int hscif0_ctrl_pins[] = {
        /* HRTS0#, HCTS0# */
        RCAR_GP_PIN(0, 5), RCAR_GP_PIN(0, 4),
};
static const unsigned int hscif0_ctrl_mux[] = {
        HRTS0_N_MARK, HCTS0_N_MARK,
};

/* - HSCIF1 ----------------------------------------------------------------- */
static const unsigned int hscif1_data_pins[] = {
        /* HRX1, HTX1 */
        RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
};
static const unsigned int hscif1_data_mux[] = {
        HRX1_MARK, HTX1_MARK,
};
static const unsigned int hscif1_clk_pins[] = {
        /* HSCK1 */
        RCAR_GP_PIN(0, 8),
};
static const unsigned int hscif1_clk_mux[] = {
        HSCK1_MARK,
};
static const unsigned int hscif1_ctrl_pins[] = {
        /* HRTS1#, HCTS1# */
        RCAR_GP_PIN(0, 9), RCAR_GP_PIN(0, 10),
};
static const unsigned int hscif1_ctrl_mux[] = {
        HRTS1_N_MARK, HCTS1_N_MARK,
};

/* - HSCIF2 ----------------------------------------------------------------- */
static const unsigned int hscif2_data_pins[] = {
        /* HRX2, HTX2 */
        RCAR_GP_PIN(1, 1), RCAR_GP_PIN(1, 2),
};
static const unsigned int hscif2_data_mux[] = {
        HRX2_MARK, HTX2_MARK,
};
static const unsigned int hscif2_clk_pins[] = {
        /* HSCK2 */
        RCAR_GP_PIN(1, 0),
};
static const unsigned int hscif2_clk_mux[] = {
        HSCK2_MARK,
};
static const unsigned int hscif2_ctrl_pins[] = {
        /* HRTS2#, HCTS2# */
        RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 3),
};
static const unsigned int hscif2_ctrl_mux[] = {
        HRTS2_N_MARK, HCTS2_N_MARK,
};

/* - HSCIF3 ----------------------------------------------------------------- */
static const unsigned int hscif3_data_pins[] = {
        /* HRX3, HTX3 */
        RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
};
static const unsigned int hscif3_data_mux[] = {
        HRX3_MARK, HTX3_MARK,
};
static const unsigned int hscif3_clk_pins[] = {
        /* HSCK3 */
        RCAR_GP_PIN(0, 14),
};
static const unsigned int hscif3_clk_mux[] = {
        HSCK3_MARK,
};
static const unsigned int hscif3_ctrl_pins[] = {
        /* HRTS3#, HCTS3# */
        RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 11),
};
static const unsigned int hscif3_ctrl_mux[] = {
        HRTS3_N_MARK, HCTS3_N_MARK,
};

/* - I2C0 ------------------------------------------------------------------- */
static const unsigned int i2c0_pins[] = {
        /* SDA0, SCL0 */
        RCAR_GP_PIN(1, 1), RCAR_GP_PIN(1, 0),
};
static const unsigned int i2c0_mux[] = {
        SDA0_MARK, SCL0_MARK,
};

/* - I2C1 ------------------------------------------------------------------- */
static const unsigned int i2c1_pins[] = {
        /* SDA1, SCL1 */
        RCAR_GP_PIN(1, 3), RCAR_GP_PIN(1, 2),
};
static const unsigned int i2c1_mux[] = {
        SDA1_MARK, SCL1_MARK,
};

/* - I2C2 ------------------------------------------------------------------- */
static const unsigned int i2c2_pins[] = {
        /* SDA2, SCL2 */
        RCAR_GP_PIN(1, 5), RCAR_GP_PIN(1, 4),
};
static const unsigned int i2c2_mux[] = {
        SDA2_MARK, SCL2_MARK,
};

/* - I2C3 ------------------------------------------------------------------- */
static const unsigned int i2c3_pins[] = {
        /* SDA3, SCL3 */
        RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 6),
};
static const unsigned int i2c3_mux[] = {
        SDA3_MARK, SCL3_MARK,
};

/* - I2C4 ------------------------------------------------------------------- */
static const unsigned int i2c4_pins[] = {
        /* SDA4, SCL4 */
        RCAR_GP_PIN(1, 9), RCAR_GP_PIN(1, 8),
};
static const unsigned int i2c4_mux[] = {
        SDA4_MARK, SCL4_MARK,
};

/* - I2C5 ------------------------------------------------------------------- */
static const unsigned int i2c5_pins[] = {
        /* SDA5, SCL5 */
        RCAR_GP_PIN(1, 11), RCAR_GP_PIN(1, 10),
};
static const unsigned int i2c5_mux[] = {
        SDA5_MARK, SCL5_MARK,
};

/* - INTC-EX ---------------------------------------------------------------- */
static const unsigned int intc_ex_irq0_pins[] = {
        /* IRQ0 */
        RCAR_GP_PIN(0, 17),
};
static const unsigned int intc_ex_irq0_mux[] = {
        IRQ0_MARK,
};
static const unsigned int intc_ex_irq1_pins[] = {
        /* IRQ1 */
        RCAR_GP_PIN(0, 18),
};
static const unsigned int intc_ex_irq1_mux[] = {
        IRQ1_MARK,
};
static const unsigned int intc_ex_irq2_pins[] = {
        /* IRQ2 */
        RCAR_GP_PIN(0, 19),
};
static const unsigned int intc_ex_irq2_mux[] = {
        IRQ2_MARK,
};
static const unsigned int intc_ex_irq3_pins[] = {
        /* IRQ3 */
        RCAR_GP_PIN(0, 20),
};
static const unsigned int intc_ex_irq3_mux[] = {
        IRQ3_MARK,
};
static const unsigned int intc_ex_irq4_pins[] = {
        /* IRQ4 */
        RCAR_GP_PIN(0, 11),
};
static const unsigned int intc_ex_irq4_mux[] = {
        IRQ4_MARK,
};
static const unsigned int intc_ex_irq5_pins[] = {
        /* IRQ5 */
        RCAR_GP_PIN(0, 15),
};
static const unsigned int intc_ex_irq5_mux[] = {
        IRQ5_MARK,
};

/* - MMC -------------------------------------------------------------------- */
static const unsigned int mmc_data_pins[] = {
        /* MMC_SD_D[0:3], MMC_D[4:7] */
        RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 14),
        RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 16),
        RCAR_GP_PIN(1, 18), RCAR_GP_PIN(1, 17),
        RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 21),
};
static const unsigned int mmc_data_mux[] = {
        MMC_SD_D0_MARK, MMC_SD_D1_MARK,
        MMC_SD_D2_MARK, MMC_SD_D3_MARK,
        MMC_D4_MARK, MMC_D5_MARK,
        MMC_D6_MARK, MMC_D7_MARK,
};
static const unsigned int mmc_ctrl_pins[] = {
        /* MMC_SD_CLK, MMC_SD_CMD */
        RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 22),
};
static const unsigned int mmc_ctrl_mux[] = {
        MMC_SD_CLK_MARK, MMC_SD_CMD_MARK,
};
static const unsigned int mmc_cd_pins[] = {
        /* SD_CD */
        RCAR_GP_PIN(1, 23),
};
static const unsigned int mmc_cd_mux[] = {
        SD_CD_MARK,
};
static const unsigned int mmc_wp_pins[] = {
        /* SD_WP */
        RCAR_GP_PIN(1, 24),
};
static const unsigned int mmc_wp_mux[] = {
        SD_WP_MARK,
};
static const unsigned int mmc_ds_pins[] = {
        /* MMC_DS */
        RCAR_GP_PIN(1, 20),
};
static const unsigned int mmc_ds_mux[] = {
        MMC_DS_MARK,
};

/* - MSIOF0 ----------------------------------------------------------------- */
static const unsigned int msiof0_clk_pins[] = {
        /* MSIOF0_SCK */
        RCAR_GP_PIN(0, 14),
};
static const unsigned int msiof0_clk_mux[] = {
        MSIOF0_SCK_MARK,
};
static const unsigned int msiof0_sync_pins[] = {
        /* MSIOF0_SYNC */
        RCAR_GP_PIN(0, 11),
};
static const unsigned int msiof0_sync_mux[] = {
        MSIOF0_SYNC_MARK,
};
static const unsigned int msiof0_ss1_pins[] = {
        /* MSIOF0_SS1 */
        RCAR_GP_PIN(0, 15),
};
static const unsigned int msiof0_ss1_mux[] = {
        MSIOF0_SS1_MARK,
};
static const unsigned int msiof0_ss2_pins[] = {
        /* MSIOF0_SS2 */
        RCAR_GP_PIN(0, 16),
};
static const unsigned int msiof0_ss2_mux[] = {
        MSIOF0_SS2_MARK,
};
static const unsigned int msiof0_txd_pins[] = {
        /* MSIOF0_TXD */
        RCAR_GP_PIN(0, 13),
};
static const unsigned int msiof0_txd_mux[] = {
        MSIOF0_TXD_MARK,
};
static const unsigned int msiof0_rxd_pins[] = {
        /* MSIOF0_RXD */
        RCAR_GP_PIN(0, 12),
};
static const unsigned int msiof0_rxd_mux[] = {
        MSIOF0_RXD_MARK,
};

/* - MSIOF1 ----------------------------------------------------------------- */
static const unsigned int msiof1_clk_pins[] = {
        /* MSIOF1_SCK */
        RCAR_GP_PIN(0, 8),
};
static const unsigned int msiof1_clk_mux[] = {
        MSIOF1_SCK_MARK,
};
static const unsigned int msiof1_sync_pins[] = {
        /* MSIOF1_SYNC */
        RCAR_GP_PIN(0, 10),
};
static const unsigned int msiof1_sync_mux[] = {
        MSIOF1_SYNC_MARK,
};
static const unsigned int msiof1_ss1_pins[] = {
        /* MSIOF1_SS1 */
        RCAR_GP_PIN(0, 17),
};
static const unsigned int msiof1_ss1_mux[] = {
        MSIOF1_SS1_MARK,
};
static const unsigned int msiof1_ss2_pins[] = {
        /* MSIOF1_SS2 */
        RCAR_GP_PIN(0, 18),
};
static const unsigned int msiof1_ss2_mux[] = {
        MSIOF1_SS2_MARK,
};
static const unsigned int msiof1_txd_pins[] = {
        /* MSIOF1_TXD */
        RCAR_GP_PIN(0, 7),
};
static const unsigned int msiof1_txd_mux[] = {
        MSIOF1_TXD_MARK,
};
static const unsigned int msiof1_rxd_pins[] = {
        /* MSIOF1_RXD */
        RCAR_GP_PIN(0, 6),
};
static const unsigned int msiof1_rxd_mux[] = {
        MSIOF1_RXD_MARK,
};

/* - MSIOF2 ----------------------------------------------------------------- */
static const unsigned int msiof2_clk_pins[] = {
        /* MSIOF2_SCK */
        RCAR_GP_PIN(1, 5),
};
static const unsigned int msiof2_clk_mux[] = {
        MSIOF2_SCK_MARK,
};
static const unsigned int msiof2_sync_pins[] = {
        /* MSIOF2_SYNC */
        RCAR_GP_PIN(1, 4),
};
static const unsigned int msiof2_sync_mux[] = {
        MSIOF2_SYNC_MARK,
};
static const unsigned int msiof2_ss1_pins[] = {
        /* MSIOF2_SS1 */
        RCAR_GP_PIN(1, 2),
};
static const unsigned int msiof2_ss1_mux[] = {
        MSIOF2_SS1_MARK,
};
static const unsigned int msiof2_ss2_pins[] = {
        /* MSIOF2_SS2 */
        RCAR_GP_PIN(1, 3),
};
static const unsigned int msiof2_ss2_mux[] = {
        MSIOF2_SS2_MARK,
};
static const unsigned int msiof2_txd_pins[] = {
        /* MSIOF2_TXD */
        RCAR_GP_PIN(1, 7),
};
static const unsigned int msiof2_txd_mux[] = {
        MSIOF2_TXD_MARK,
};
static const unsigned int msiof2_rxd_pins[] = {
        /* MSIOF2_RXD */
        RCAR_GP_PIN(1, 6),
};
static const unsigned int msiof2_rxd_mux[] = {
        MSIOF2_RXD_MARK,
};

/* - MSIOF3 ----------------------------------------------------------------- */
static const unsigned int msiof3_clk_pins[] = {
        /* MSIOF3_SCK */
        RCAR_GP_PIN(0, 1),
};
static const unsigned int msiof3_clk_mux[] = {
        MSIOF3_SCK_MARK,
};
static const unsigned int msiof3_sync_pins[] = {
        /* MSIOF3_SYNC */
        RCAR_GP_PIN(0, 9),
};
static const unsigned int msiof3_sync_mux[] = {
        MSIOF3_SYNC_MARK,
};
static const unsigned int msiof3_ss1_pins[] = {
        /* MSIOF3_SS1 */
        RCAR_GP_PIN(0, 4),
};
static const unsigned int msiof3_ss1_mux[] = {
        MSIOF3_SS1_MARK,
};
static const unsigned int msiof3_ss2_pins[] = {
        /* MSIOF3_SS2 */
        RCAR_GP_PIN(0, 5),
};
static const unsigned int msiof3_ss2_mux[] = {
        MSIOF3_SS2_MARK,
};
static const unsigned int msiof3_txd_pins[] = {
        /* MSIOF3_TXD */
        RCAR_GP_PIN(0, 3),
};
static const unsigned int msiof3_txd_mux[] = {
        MSIOF3_TXD_MARK,
};
static const unsigned int msiof3_rxd_pins[] = {
        /* MSIOF3_RXD */
        RCAR_GP_PIN(0, 2),
};
static const unsigned int msiof3_rxd_mux[] = {
        MSIOF3_RXD_MARK,
};

/* - PCIE ------------------------------------------------------------------- */
static const unsigned int pcie0_clkreq_n_pins[] = {
        /* PCIE0_CLKREQ# */
        RCAR_GP_PIN(2, 15),
};

static const unsigned int pcie0_clkreq_n_mux[] = {
        PCIE0_CLKREQ_N_MARK,
};

static const unsigned int pcie1_clkreq_n_pins[] = {
        /* PCIE1_CLKREQ# */
        RCAR_GP_PIN(2, 16),
};

static const unsigned int pcie1_clkreq_n_mux[] = {
        PCIE1_CLKREQ_N_MARK,
};

/* - QSPI0 ------------------------------------------------------------------ */
static const unsigned int qspi0_ctrl_pins[] = {
        /* SPCLK, SSL */
        RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 13),
};
static const unsigned int qspi0_ctrl_mux[] = {
        QSPI0_SPCLK_MARK, QSPI0_SSL_MARK,
};
static const unsigned int qspi0_data_pins[] = {
        /* MOSI_IO0, MISO_IO1, IO2, IO3 */
        RCAR_GP_PIN(2, 9), RCAR_GP_PIN(2, 12),
        RCAR_GP_PIN(2, 11), RCAR_GP_PIN(2, 14),
};
static const unsigned int qspi0_data_mux[] = {
        QSPI0_MOSI_IO0_MARK, QSPI0_MISO_IO1_MARK,
        QSPI0_IO2_MARK, QSPI0_IO3_MARK
};

/* - QSPI1 ------------------------------------------------------------------ */
static const unsigned int qspi1_ctrl_pins[] = {
        /* SPCLK, SSL */
        RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 3),
};
static const unsigned int qspi1_ctrl_mux[] = {
        QSPI1_SPCLK_MARK, QSPI1_SSL_MARK,
};
static const unsigned int qspi1_data_pins[] = {
        /* MOSI_IO0, MISO_IO1, IO2, IO3 */
        RCAR_GP_PIN(2, 7), RCAR_GP_PIN(2, 5),
        RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 4),
};
static const unsigned int qspi1_data_mux[] = {
        QSPI1_MOSI_IO0_MARK, QSPI1_MISO_IO1_MARK,
        QSPI1_IO2_MARK, QSPI1_IO3_MARK
};

/* - SCIF0 ------------------------------------------------------------------ */
static const unsigned int scif0_data_pins[] = {
        /* RX0, TX0 */
        RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7),
};
static const unsigned int scif0_data_mux[] = {
        RX0_MARK, TX0_MARK,
};
static const unsigned int scif0_clk_pins[] = {
        /* SCK0 */
        RCAR_GP_PIN(0, 8),
};
static const unsigned int scif0_clk_mux[] = {
        SCK0_MARK,
};
static const unsigned int scif0_ctrl_pins[] = {
        /* RTS0#, CTS0# */
        RCAR_GP_PIN(0, 9), RCAR_GP_PIN(0, 10),
};
static const unsigned int scif0_ctrl_mux[] = {
        RTS0_N_MARK, CTS0_N_MARK,
};

/* - SCIF1 ------------------------------------------------------------------ */
static const unsigned int scif1_data_pins[] = {
        /* RX1, TX1 */
        RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13),
};
static const unsigned int scif1_data_mux[] = {
        RX1_MARK, TX1_MARK,
};
static const unsigned int scif1_clk_pins[] = {
        /* SCK1 */
        RCAR_GP_PIN(0, 14),
};
static const unsigned int scif1_clk_mux[] = {
        SCK1_MARK,
};
static const unsigned int scif1_ctrl_pins[] = {
        /* RTS1#, CTS1# */
        RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 11),
};
static const unsigned int scif1_ctrl_mux[] = {
        RTS1_N_MARK, CTS1_N_MARK,
};

/* - SCIF3 ------------------------------------------------------------------ */
static const unsigned int scif3_data_pins[] = {
        /* RX3, TX3 */
        RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3),
};
static const unsigned int scif3_data_mux[] = {
        RX3_MARK, TX3_MARK,
};
static const unsigned int scif3_clk_pins[] = {
        /* SCK3 */
        RCAR_GP_PIN(0, 1),
};
static const unsigned int scif3_clk_mux[] = {
        SCK3_MARK,
};
static const unsigned int scif3_ctrl_pins[] = {
        /* RTS3#, CTS3# */
        RCAR_GP_PIN(0, 5), RCAR_GP_PIN(0, 4),
};
static const unsigned int scif3_ctrl_mux[] = {
        RTS3_N_MARK, CTS3_N_MARK,
};

/* - SCIF4 ------------------------------------------------------------------ */
static const unsigned int scif4_data_pins[] = {
        /* RX4, TX4 */
        RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7),
};
static const unsigned int scif4_data_mux[] = {
        RX4_MARK, TX4_MARK,
};
static const unsigned int scif4_clk_pins[] = {
        /* SCK4 */
        RCAR_GP_PIN(1, 5),
};
static const unsigned int scif4_clk_mux[] = {
        SCK4_MARK,
};
static const unsigned int scif4_ctrl_pins[] = {
        /* RTS4#, CTS4# */
        RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 3),
};
static const unsigned int scif4_ctrl_mux[] = {
        RTS4_N_MARK, CTS4_N_MARK,
};

/* - SCIF Clock ------------------------------------------------------------- */
static const unsigned int scif_clk_pins[] = {
        /* SCIF_CLK */
        RCAR_GP_PIN(0, 0),
};
static const unsigned int scif_clk_mux[] = {
        SCIF_CLK_MARK,
};

/* - TSN0 ------------------------------------------------ */
static const unsigned int tsn0_link_a_pins[] = {
        /* TSN0_LINK_A */
        RCAR_GP_PIN(0, 11),
};
static const unsigned int tsn0_link_a_mux[] = {
        TSN0_LINK_A_MARK,
};
static const unsigned int tsn0_magic_a_pins[] = {
        /* TSN0_MAGIC_A */
        RCAR_GP_PIN(0, 17),
};
static const unsigned int tsn0_magic_a_mux[] = {
        TSN0_MAGIC_A_MARK,
};
static const unsigned int tsn0_phy_int_a_pins[] = {
        /* TSN0_PHY_INT_A */
        RCAR_GP_PIN(0, 18),
};
static const unsigned int tsn0_phy_int_a_mux[] = {
        TSN0_PHY_INT_A_MARK,
};
static const unsigned int tsn0_mdio_a_pins[] = {
        /* TSN0_MDC_A, TSN0_MDIO_A */
        RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
};
static const unsigned int tsn0_mdio_a_mux[] = {
        TSN0_MDC_A_MARK, TSN0_MDIO_A_MARK,
};
static const unsigned int tsn0_link_b_pins[] = {
        /* TSN0_LINK_B */
        RCAR_GP_PIN(3, 8),
};
static const unsigned int tsn0_link_b_mux[] = {
        TSN0_LINK_B_MARK,
};
static const unsigned int tsn0_magic_b_pins[] = {
        /* TSN0_MAGIC_B */
        RCAR_GP_PIN(3, 12),
};
static const unsigned int tsn0_magic_b_mux[] = {
        TSN0_MAGIC_B_MARK,
};
static const unsigned int tsn0_phy_int_b_pins[] = {
        /* TSN0_PHY_INT_B */
        RCAR_GP_PIN(3, 10),
};
static const unsigned int tsn0_phy_int_b_mux[] = {
        TSN0_PHY_INT_B_MARK,
};
static const unsigned int tsn0_mdio_b_pins[] = {
        /* TSN0_MDC_B, TSN0_MDIO_B */
        RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 2),
};
static const unsigned int tsn0_mdio_b_mux[] = {
        TSN0_MDC_B_MARK, TSN0_MDIO_B_MARK,
};
static const unsigned int tsn0_avtp_pps_pins[] = {
        /* TSN0_AVTP_PPS */
        RCAR_GP_PIN(3, 16),
};
static const unsigned int tsn0_avtp_pps_mux[] = {
        TSN0_AVTP_PPS_MARK,
};
static const unsigned int tsn0_avtp_capture_a_pins[] = {
        /* TSN0_AVTP_CAPTURE_A */
        RCAR_GP_PIN(0, 1),
};
static const unsigned int tsn0_avtp_capture_a_mux[] = {
        TSN0_AVTP_CAPTURE_A_MARK,
};
static const unsigned int tsn0_avtp_match_a_pins[] = {
        /* TSN0_AVTP_MATCH_A */
        RCAR_GP_PIN(0, 2),
};
static const unsigned int tsn0_avtp_match_a_mux[] = {
        TSN0_AVTP_MATCH_A_MARK,
};
static const unsigned int tsn0_avtp_capture_b_pins[] = {
        /* TSN0_AVTP_CAPTURE_B */
        RCAR_GP_PIN(3, 18),
};
static const unsigned int tsn0_avtp_capture_b_mux[] = {
        TSN0_AVTP_CAPTURE_B_MARK,
};
static const unsigned int tsn0_avtp_match_b_pins[] = {
        /* TSN0_AVTP_MATCH_B */
        RCAR_GP_PIN(3, 17),
};
static const unsigned int tsn0_avtp_match_b_mux[] = {
        TSN0_AVTP_MATCH_B_MARK,
};

/* - TSN1 ------------------------------------------------ */
static const unsigned int tsn1_link_a_pins[] = {
        /* TSN1_LINK_A */
        RCAR_GP_PIN(0, 15),
};
static const unsigned int tsn1_link_a_mux[] = {
        TSN1_LINK_A_MARK,
};
static const unsigned int tsn1_phy_int_a_pins[] = {
        /* TSN1_PHY_INT_A */
        RCAR_GP_PIN(0, 19),
};
static const unsigned int tsn1_phy_int_a_mux[] = {
        TSN1_PHY_INT_A_MARK,
};
static const unsigned int tsn1_mdio_a_pins[] = {
        /* TSN1_MDC_A, TSN1_MDIO_A */
        RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 9),
};
static const unsigned int tsn1_mdio_a_mux[] = {
        TSN1_MDC_A_MARK, TSN1_MDIO_A_MARK,
};
static const unsigned int tsn1_link_b_pins[] = {
        /* TSN1_LINK_B */
        RCAR_GP_PIN(3, 6),
};
static const unsigned int tsn1_link_b_mux[] = {
        TSN1_LINK_B_MARK,
};
static const unsigned int tsn1_phy_int_b_pins[] = {
        /* TSN1_PHY_INT_B */
        RCAR_GP_PIN(3, 11),
};
static const unsigned int tsn1_phy_int_b_mux[] = {
        TSN1_PHY_INT_B_MARK,
};
static const unsigned int tsn1_mdio_b_pins[] = {
        /* TSN1_MDC_B, TSN1_MDIO_B */
        RCAR_GP_PIN(3, 5), RCAR_GP_PIN(3, 0),
};
static const unsigned int tsn1_mdio_b_mux[] = {
        TSN1_MDC_B_MARK, TSN1_MDIO_B_MARK,
};
static const unsigned int tsn1_avtp_pps_pins[] = {
        /* TSN1_AVTP_PPS */
        RCAR_GP_PIN(3, 13),
};
static const unsigned int tsn1_avtp_pps_mux[] = {
        TSN1_AVTP_PPS_MARK,
};
static const unsigned int tsn1_avtp_capture_a_pins[] = {
        /* TSN1_AVTP_CAPTURE_A */
        RCAR_GP_PIN(0, 7),
};
static const unsigned int tsn1_avtp_capture_a_mux[] = {
        TSN1_AVTP_CAPTURE_A_MARK,
};
static const unsigned int tsn1_avtp_match_a_pins[] = {
        /* TSN1_AVTP_MATCH_A */
        RCAR_GP_PIN(0, 6),
};
static const unsigned int tsn1_avtp_match_a_mux[] = {
        TSN1_AVTP_MATCH_A_MARK,
};
static const unsigned int tsn1_avtp_capture_b_pins[] = {
        /* TSN1_AVTP_CAPTURE_B */
        RCAR_GP_PIN(3, 15),
};
static const unsigned int tsn1_avtp_capture_b_mux[] = {
        TSN1_AVTP_CAPTURE_B_MARK,
};
static const unsigned int tsn1_avtp_match_b_pins[] = {
        /* TSN1_AVTP_MATCH_B */
        RCAR_GP_PIN(3, 14),
};
static const unsigned int tsn1_avtp_match_b_mux[] = {
        TSN1_AVTP_MATCH_B_MARK,
};

/* - TSN2 ------------------------------------------------ */
static const unsigned int tsn2_link_a_pins[] = {
        /* TSN2_LINK_A */
        RCAR_GP_PIN(0, 16),
};
static const unsigned int tsn2_link_a_mux[] = {
        TSN2_LINK_A_MARK,
};
static const unsigned int tsn2_phy_int_a_pins[] = {
        /* TSN2_PHY_INT_A */
        RCAR_GP_PIN(0, 20),
};
static const unsigned int tsn2_phy_int_a_mux[] = {
        TSN2_PHY_INT_A_MARK,
};
static const unsigned int tsn2_mdio_a_pins[] = {
        /* TSN2_MDC_A, TSN2_MDIO_A */
        RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 3),
};
static const unsigned int tsn2_mdio_a_mux[] = {
        TSN2_MDC_A_MARK, TSN2_MDIO_A_MARK,
};
static const unsigned int tsn2_link_b_pins[] = {
        /* TSN2_LINK_B */
        RCAR_GP_PIN(3, 7),
};
static const unsigned int tsn2_link_b_mux[] = {
        TSN2_LINK_B_MARK,
};
static const unsigned int tsn2_phy_int_b_pins[] = {
        /* TSN2_PHY_INT_B */
        RCAR_GP_PIN(3, 9),
};
static const unsigned int tsn2_phy_int_b_mux[] = {
        TSN2_PHY_INT_B_MARK,
};
static const unsigned int tsn2_mdio_b_pins[] = {
        /* TSN2_MDC_B, TSN2_MDIO_B */
        RCAR_GP_PIN(3, 3), RCAR_GP_PIN(3, 1),
};
static const unsigned int tsn2_mdio_b_mux[] = {
        TSN2_MDC_B_MARK, TSN2_MDIO_B_MARK,
};

static const struct sh_pfc_pin_group pinmux_groups[] = {
        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),
        SH_PFC_PIN_GROUP(i2c4),
        SH_PFC_PIN_GROUP(i2c5),
        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),
        BUS_DATA_PIN_GROUP(mmc_data, 1),
        BUS_DATA_PIN_GROUP(mmc_data, 4),
        BUS_DATA_PIN_GROUP(mmc_data, 8),
        SH_PFC_PIN_GROUP(mmc_ctrl),
        SH_PFC_PIN_GROUP(mmc_cd),
        SH_PFC_PIN_GROUP(mmc_wp),
        SH_PFC_PIN_GROUP(mmc_ds),
        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(pcie0_clkreq_n),
        SH_PFC_PIN_GROUP(pcie1_clkreq_n),
        SH_PFC_PIN_GROUP(qspi0_ctrl),
        BUS_DATA_PIN_GROUP(qspi0_data, 2),
        BUS_DATA_PIN_GROUP(qspi0_data, 4),
        SH_PFC_PIN_GROUP(qspi1_ctrl),
        BUS_DATA_PIN_GROUP(qspi1_data, 2),
        BUS_DATA_PIN_GROUP(qspi1_data, 4),
        SH_PFC_PIN_GROUP(scif0_data),
        SH_PFC_PIN_GROUP(scif0_clk),
        SH_PFC_PIN_GROUP(scif0_ctrl),
        SH_PFC_PIN_GROUP(scif1_data),
        SH_PFC_PIN_GROUP(scif1_clk),
        SH_PFC_PIN_GROUP(scif1_ctrl),
        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(scif_clk),
        SH_PFC_PIN_GROUP(tsn0_link_a),
        SH_PFC_PIN_GROUP(tsn0_magic_a),
        SH_PFC_PIN_GROUP(tsn0_phy_int_a),
        SH_PFC_PIN_GROUP(tsn0_mdio_a),
        SH_PFC_PIN_GROUP(tsn0_link_b),
        SH_PFC_PIN_GROUP(tsn0_magic_b),
        SH_PFC_PIN_GROUP(tsn0_phy_int_b),
        SH_PFC_PIN_GROUP(tsn0_mdio_b),
        SH_PFC_PIN_GROUP(tsn0_avtp_pps),
        SH_PFC_PIN_GROUP(tsn0_avtp_capture_a),
        SH_PFC_PIN_GROUP(tsn0_avtp_match_a),
        SH_PFC_PIN_GROUP(tsn0_avtp_capture_b),
        SH_PFC_PIN_GROUP(tsn0_avtp_match_b),
        SH_PFC_PIN_GROUP(tsn1_link_a),
        SH_PFC_PIN_GROUP(tsn1_phy_int_a),
        SH_PFC_PIN_GROUP(tsn1_mdio_a),
        SH_PFC_PIN_GROUP(tsn1_link_b),
        SH_PFC_PIN_GROUP(tsn1_phy_int_b),
        SH_PFC_PIN_GROUP(tsn1_mdio_b),
        SH_PFC_PIN_GROUP(tsn1_avtp_pps),
        SH_PFC_PIN_GROUP(tsn1_avtp_capture_a),
        SH_PFC_PIN_GROUP(tsn1_avtp_match_a),
        SH_PFC_PIN_GROUP(tsn1_avtp_capture_b),
        SH_PFC_PIN_GROUP(tsn1_avtp_match_b),
        SH_PFC_PIN_GROUP(tsn2_link_a),
        SH_PFC_PIN_GROUP(tsn2_phy_int_a),
        SH_PFC_PIN_GROUP(tsn2_mdio_a),
        SH_PFC_PIN_GROUP(tsn2_link_b),
        SH_PFC_PIN_GROUP(tsn2_phy_int_b),
        SH_PFC_PIN_GROUP(tsn2_mdio_b),
};

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",
};

static const char * const i2c4_groups[] = {
        "i2c4",
};

static const char * const i2c5_groups[] = {
        "i2c5",
};

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",
        "mmc_ds",
};

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 pcie_groups[] = {
        "pcie0_clkreq_n",
        "pcie1_clkreq_n",
};

static const char * const qspi0_groups[] = {
        "qspi0_ctrl",
        "qspi0_data2",
        "qspi0_data4",
};

static const char * const qspi1_groups[] = {
        "qspi1_ctrl",
        "qspi1_data2",
        "qspi1_data4",
};

static const char * const scif0_groups[] = {
        "scif0_data",
        "scif0_clk",
        "scif0_ctrl",
};

static const char * const scif1_groups[] = {
        "scif1_data",
        "scif1_clk",
        "scif1_ctrl",
};

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 scif_clk_groups[] = {
        "scif_clk",
};

static const char * const tsn0_groups[] = {
        "tsn0_link_a",
        "tsn0_magic_a",
        "tsn0_phy_int_a",
        "tsn0_mdio_a",
        "tsn0_link_b",
        "tsn0_magic_b",
        "tsn0_phy_int_b",
        "tsn0_mdio_b",
        "tsn0_avtp_pps",
        "tsn0_avtp_capture_a",
        "tsn0_avtp_match_a",
        "tsn0_avtp_capture_b",
        "tsn0_avtp_match_b",
};

static const char * const tsn1_groups[] = {
        "tsn1_link_a",
        "tsn1_phy_int_a",
        "tsn1_mdio_a",
        "tsn1_link_b",
        "tsn1_phy_int_b",
        "tsn1_mdio_b",
        "tsn1_avtp_pps",
        "tsn1_avtp_capture_a",
        "tsn1_avtp_match_a",
        "tsn1_avtp_capture_b",
        "tsn1_avtp_match_b",
};

static const char * const tsn2_groups[] = {
        "tsn2_link_a",
        "tsn2_phy_int_a",
        "tsn2_mdio_a",
        "tsn2_link_b",
        "tsn2_phy_int_b",
        "tsn2_mdio_b",
};

static const struct sh_pfc_function pinmux_functions[] = {
        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(i2c5),
        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(pcie),
        SH_PFC_FUNCTION(qspi0),
        SH_PFC_FUNCTION(qspi1),
        SH_PFC_FUNCTION(scif0),
        SH_PFC_FUNCTION(scif1),
        SH_PFC_FUNCTION(scif3),
        SH_PFC_FUNCTION(scif4),
        SH_PFC_FUNCTION(scif_clk),
        SH_PFC_FUNCTION(tsn0),
        SH_PFC_FUNCTION(tsn1),
        SH_PFC_FUNCTION(tsn2),
};

static const struct pinmux_cfg_reg pinmux_config_regs[] = {
#define F_(x, y)        FN_##y
#define FM(x)           FN_##x
        { PINMUX_CFG_REG_VAR("GPSR0", 0xe6050040, 32,
                             GROUP(-11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                   1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                             GROUP(
                /* GP0_31_21 RESERVED */
                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_VAR("GPSR1", 0xe6050840, 32,
                             GROUP(-7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                             GROUP(
                /* GP1_31_25 RESERVED */
                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_VAR("GPSR2", 0xe6051040, 32,
                             GROUP(-15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                   1, 1, 1, 1, 1, 1),
                             GROUP(
                /* GP2_31_17 RESERVED */
                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_VAR("GPSR3", 0xe6051840, 32,
                             GROUP(-13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                   1, 1, 1, 1, 1, 1, 1, 1),
                             GROUP(
                /* GP3_31_19 RESERVED */
                GP_3_18_FN,     GPSR3_18,
                GP_3_17_FN,     GPSR3_17,
                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, ))
        },
#undef F_
#undef FM

#define F_(x, y)        x,
#define FM(x)           FN_##x,
        { PINMUX_CFG_REG("IP0SR0", 0xe6050060, 32, 4, GROUP(
                IP0SR0_31_28
                IP0SR0_27_24
                IP0SR0_23_20
                IP0SR0_19_16
                IP0SR0_15_12
                IP0SR0_11_8
                IP0SR0_7_4
                IP0SR0_3_0))
        },
        { PINMUX_CFG_REG("IP1SR0", 0xe6050064, 32, 4, GROUP(
                IP1SR0_31_28
                IP1SR0_27_24
                IP1SR0_23_20
                IP1SR0_19_16
                IP1SR0_15_12
                IP1SR0_11_8
                IP1SR0_7_4
                IP1SR0_3_0))
        },
        { PINMUX_CFG_REG_VAR("IP2SR0", 0xe6050068, 32,
                             GROUP(-12, 4, 4, 4, 4, 4),
                             GROUP(
                /* IP2SR0_31_20 RESERVED */
                IP2SR0_19_16
                IP2SR0_15_12
                IP2SR0_11_8
                IP2SR0_7_4
                IP2SR0_3_0))
        },
        { PINMUX_CFG_REG("IP0SR1", 0xe6050860, 32, 4, GROUP(
                IP0SR1_31_28
                IP0SR1_27_24
                IP0SR1_23_20
                IP0SR1_19_16
                IP0SR1_15_12
                IP0SR1_11_8
                IP0SR1_7_4
                IP0SR1_3_0))
        },
#undef F_
#undef FM

#define F_(x, y)        x,
#define FM(x)           FN_##x,
        { PINMUX_CFG_REG_VAR("MOD_SEL1", 0xe6050900, 32,
                             GROUP(-20, 2, 2, 2, 2, 2, 2),
                             GROUP(
                /* RESERVED 31-12 */
                MOD_SEL1_11_10
                MOD_SEL1_9_8
                MOD_SEL1_7_6
                MOD_SEL1_5_4
                MOD_SEL1_3_2
                MOD_SEL1_1_0))
        },
        { /* sentinel */ }
};

static const struct pinmux_drive_reg pinmux_drive_regs[] = {
        { PINMUX_DRIVE_REG("DRV0CTRL0", 0xe6050080) {
                { RCAR_GP_PIN(0,  7), 28, 3 },  /* TX0 */
                { RCAR_GP_PIN(0,  6), 24, 3 },  /* RX0 */
                { RCAR_GP_PIN(0,  5), 20, 3 },  /* HRTS0_N */
                { RCAR_GP_PIN(0,  4), 16, 3 },  /* HCTS0_N */
                { RCAR_GP_PIN(0,  3), 12, 3 },  /* HTX0 */
                { RCAR_GP_PIN(0,  2),  8, 3 },  /* HRX0 */
                { RCAR_GP_PIN(0,  1),  4, 3 },  /* HSCK0 */
                { RCAR_GP_PIN(0,  0),  0, 3 },  /* SCIF_CLK */
        } },
        { PINMUX_DRIVE_REG("DRV1CTRL0", 0xe6050084) {
                { RCAR_GP_PIN(0, 15), 28, 3 },  /* MSIOF0_SS1 */
                { RCAR_GP_PIN(0, 14), 24, 3 },  /* MSIOF0_SCK */
                { RCAR_GP_PIN(0, 13), 20, 3 },  /* MSIOF0_TXD */
                { RCAR_GP_PIN(0, 12), 16, 3 },  /* MSIOF0_RXD */
                { RCAR_GP_PIN(0, 11), 12, 3 },  /* MSIOF0_SYNC */
                { RCAR_GP_PIN(0, 10),  8, 3 },  /* CTS0_N */
                { RCAR_GP_PIN(0,  9),  4, 3 },  /* RTS0_N */
                { RCAR_GP_PIN(0,  8),  0, 3 },  /* SCK0 */
        } },
        { PINMUX_DRIVE_REG("DRV2CTRL0", 0xe6050088) {
                { RCAR_GP_PIN(0, 20), 16, 3 },  /* IRQ3 */
                { RCAR_GP_PIN(0, 19), 12, 3 },  /* IRQ2 */
                { RCAR_GP_PIN(0, 18),  8, 3 },  /* IRQ1 */
                { RCAR_GP_PIN(0, 17),  4, 3 },  /* IRQ0 */
                { RCAR_GP_PIN(0, 16),  0, 3 },  /* MSIOF0_SS2 */
        } },
        { PINMUX_DRIVE_REG("DRV0CTRL1", 0xe6050880) {
                { RCAR_GP_PIN(1,  7), 28, 3 },  /* GP1_07 */
                { RCAR_GP_PIN(1,  6), 24, 3 },  /* GP1_06 */
                { RCAR_GP_PIN(1,  5), 20, 3 },  /* GP1_05 */
                { RCAR_GP_PIN(1,  4), 16, 3 },  /* GP1_04 */
                { RCAR_GP_PIN(1,  3), 12, 3 },  /* GP1_03 */
                { RCAR_GP_PIN(1,  2),  8, 3 },  /* GP1_02 */
                { RCAR_GP_PIN(1,  1),  4, 3 },  /* GP1_01 */
                { RCAR_GP_PIN(1,  0),  0, 3 },  /* GP1_00 */
        } },
        { PINMUX_DRIVE_REG("DRV1CTRL1", 0xe6050884) {
                { RCAR_GP_PIN(1, 15), 28, 3 },  /* MMC_SD_D2 */
                { RCAR_GP_PIN(1, 14), 24, 3 },  /* MMC_SD_D1 */
                { RCAR_GP_PIN(1, 13), 20, 3 },  /* MMC_SD_D0 */
                { RCAR_GP_PIN(1, 12), 16, 3 },  /* MMC_SD_CLK */
                { RCAR_GP_PIN(1, 11), 12, 3 },  /* GP1_11 */
                { RCAR_GP_PIN(1, 10),  8, 3 },  /* GP1_10 */
                { RCAR_GP_PIN(1,  9),  4, 3 },  /* GP1_09 */
                { RCAR_GP_PIN(1,  8),  0, 3 },  /* GP1_08 */
        } },
        { PINMUX_DRIVE_REG("DRV2CTRL1", 0xe6050888) {
                { RCAR_GP_PIN(1, 23), 28, 3 },  /* SD_CD */
                { RCAR_GP_PIN(1, 22), 24, 3 },  /* MMC_SD_CMD */
                { RCAR_GP_PIN(1, 21), 20, 3 },  /* MMC_D7 */
                { RCAR_GP_PIN(1, 20), 16, 3 },  /* MMC_DS */
                { RCAR_GP_PIN(1, 19), 12, 3 },  /* MMC_D6 */
                { RCAR_GP_PIN(1, 18),  8, 3 },  /* MMC_D4 */
                { RCAR_GP_PIN(1, 17),  4, 3 },  /* MMC_D5 */
                { RCAR_GP_PIN(1, 16),  0, 3 },  /* MMC_SD_D3 */
        } },
        { PINMUX_DRIVE_REG("DRV3CTRL1", 0xe605088c) {
                { RCAR_GP_PIN(1, 24),  0, 3 },  /* SD_WP */
        } },
        { PINMUX_DRIVE_REG("DRV0CTRL2", 0xe6051080) {
                { RCAR_GP_PIN(2,  7), 28, 2 },  /* QSPI1_MOSI_IO0 */
                { RCAR_GP_PIN(2,  6), 24, 2 },  /* QSPI1_IO2 */
                { RCAR_GP_PIN(2,  5), 20, 2 },  /* QSPI1_MISO_IO1 */
                { RCAR_GP_PIN(2,  4), 16, 2 },  /* QSPI1_IO3 */
                { RCAR_GP_PIN(2,  3), 12, 2 },  /* QSPI1_SSL */
                { RCAR_GP_PIN(2,  2),  8, 2 },  /* RPC_RESET_N */
                { RCAR_GP_PIN(2,  1),  4, 2 },  /* RPC_WP_N */
                { RCAR_GP_PIN(2,  0),  0, 2 },  /* RPC_INT_N */
        } },
        { PINMUX_DRIVE_REG("DRV1CTRL2", 0xe6051084) {
                { RCAR_GP_PIN(2, 15), 28, 3 },  /* PCIE0_CLKREQ_N */
                { RCAR_GP_PIN(2, 14), 24, 2 },  /* QSPI0_IO3 */
                { RCAR_GP_PIN(2, 13), 20, 2 },  /* QSPI0_SSL */
                { RCAR_GP_PIN(2, 12), 16, 2 },  /* QSPI0_MISO_IO1 */
                { RCAR_GP_PIN(2, 11), 12, 2 },  /* QSPI0_IO2 */
                { RCAR_GP_PIN(2, 10),  8, 2 },  /* QSPI0_SPCLK */
                { RCAR_GP_PIN(2,  9),  4, 2 },  /* QSPI0_MOSI_IO0 */
                { RCAR_GP_PIN(2,  8),  0, 2 },  /* QSPI1_SPCLK */
        } },
        { PINMUX_DRIVE_REG("DRV2CTRL2", 0xe6051088) {
                { RCAR_GP_PIN(2, 16),  0, 3 },  /* PCIE1_CLKREQ_N */
        } },
        { PINMUX_DRIVE_REG("DRV0CTRL3", 0xe6051880) {
                { RCAR_GP_PIN(3,  7), 28, 3 },  /* TSN2_LINK_B */
                { RCAR_GP_PIN(3,  6), 24, 3 },  /* TSN1_LINK_B */
                { RCAR_GP_PIN(3,  5), 20, 3 },  /* TSN1_MDC_B */
                { RCAR_GP_PIN(3,  4), 16, 3 },  /* TSN0_MDC_B */
                { RCAR_GP_PIN(3,  3), 12, 3 },  /* TSN2_MDC_B */
                { RCAR_GP_PIN(3,  2),  8, 3 },  /* TSN0_MDIO_B */
                { RCAR_GP_PIN(3,  1),  4, 3 },  /* TSN2_MDIO_B */
                { RCAR_GP_PIN(3,  0),  0, 3 },  /* TSN1_MDIO_B */
        } },
        { PINMUX_DRIVE_REG("DRV1CTRL3", 0xe6051884) {
                { RCAR_GP_PIN(3, 15), 28, 3 },  /* TSN1_AVTP_CAPTURE_B */
                { RCAR_GP_PIN(3, 14), 24, 3 },  /* TSN1_AVTP_MATCH_B */
                { RCAR_GP_PIN(3, 13), 20, 3 },  /* TSN1_AVTP_PPS */
                { RCAR_GP_PIN(3, 12), 16, 3 },  /* TSN0_MAGIC_B */
                { RCAR_GP_PIN(3, 11), 12, 3 },  /* TSN1_PHY_INT_B */
                { RCAR_GP_PIN(3, 10),  8, 3 },  /* TSN0_PHY_INT_B */
                { RCAR_GP_PIN(3,  9),  4, 3 },  /* TSN2_PHY_INT_B */
                { RCAR_GP_PIN(3,  8),  0, 3 },  /* TSN0_LINK_B */
        } },
        { PINMUX_DRIVE_REG("DRV2CTRL3", 0xe6051888) {
                { RCAR_GP_PIN(3, 18),  8, 3 },  /* TSN0_AVTP_CAPTURE_B */
                { RCAR_GP_PIN(3, 17),  4, 3 },  /* TSN0_AVTP_MATCH_B */
                { RCAR_GP_PIN(3, 16),  0, 3 },  /* TSN0_AVTP_PPS */
        } },
        { /* sentinel */ }
};

enum ioctrl_regs {
        POC0,
        POC1,
        POC3,
        TD0SEL1,
};

static const struct pinmux_ioctrl_reg pinmux_ioctrl_regs[] = {
        [POC0] = { 0xe60500a0, },
        [POC1] = { 0xe60508a0, },
        [POC3] = { 0xe60518a0, },
        [TD0SEL1] = { 0xe6050920, },
        { /* sentinel */ }
};

static int r8a779f0_pin_to_pocctrl(unsigned int pin, u32 *pocctrl)
{
        int bit = pin & 0x1f;

        *pocctrl = pinmux_ioctrl_regs[POC0].reg;
        if (pin >= RCAR_GP_PIN(0, 0) && pin <= RCAR_GP_PIN(0, 20))
                return bit;

        *pocctrl = pinmux_ioctrl_regs[POC1].reg;
        if (pin >= RCAR_GP_PIN(1, 0) && pin <= RCAR_GP_PIN(1, 24))
                return bit;

        *pocctrl = pinmux_ioctrl_regs[POC3].reg;
        if (pin >= RCAR_GP_PIN(3, 0) && pin <= RCAR_GP_PIN(3, 18))
                return bit;

        return -EINVAL;
}

static const struct pinmux_bias_reg pinmux_bias_regs[] = {
        { PINMUX_BIAS_REG("PUEN0", 0xe60500c0, "PUD0", 0xe60500e0) {
                [ 0] = RCAR_GP_PIN(0,  0),      /* SCIF_CLK */
                [ 1] = RCAR_GP_PIN(0,  1),      /* HSCK0 */
                [ 2] = RCAR_GP_PIN(0,  2),      /* HRX0 */
                [ 3] = RCAR_GP_PIN(0,  3),      /* HTX0 */
                [ 4] = RCAR_GP_PIN(0,  4),      /* HCTS0_N */
                [ 5] = RCAR_GP_PIN(0,  5),      /* HRTS0_N */
                [ 6] = RCAR_GP_PIN(0,  6),      /* RX0 */
                [ 7] = RCAR_GP_PIN(0,  7),      /* TX0 */
                [ 8] = RCAR_GP_PIN(0,  8),      /* SCK0 */
                [ 9] = RCAR_GP_PIN(0,  9),      /* RTS0_N */
                [10] = RCAR_GP_PIN(0, 10),      /* CTS0_N */
                [11] = RCAR_GP_PIN(0, 11),      /* MSIOF0_SYNC */
                [12] = RCAR_GP_PIN(0, 12),      /* MSIOF0_RXD */
                [13] = RCAR_GP_PIN(0, 13),      /* MSIOF0_TXD */
                [14] = RCAR_GP_PIN(0, 14),      /* MSIOF0_SCK */
                [15] = RCAR_GP_PIN(0, 15),      /* MSIOF0_SS1 */
                [16] = RCAR_GP_PIN(0, 16),      /* MSIOF0_SS2 */
                [17] = RCAR_GP_PIN(0, 17),      /* IRQ0 */
                [18] = RCAR_GP_PIN(0, 18),      /* IRQ1 */
                [19] = RCAR_GP_PIN(0, 19),      /* IRQ2 */
                [20] = RCAR_GP_PIN(0, 20),      /* IRQ3 */
                [21] = SH_PFC_PIN_NONE,
                [22] = SH_PFC_PIN_NONE,
                [23] = SH_PFC_PIN_NONE,
                [24] = SH_PFC_PIN_NONE,
                [25] = SH_PFC_PIN_NONE,
                [26] = SH_PFC_PIN_NONE,
                [27] = SH_PFC_PIN_NONE,
                [28] = SH_PFC_PIN_NONE,
                [29] = SH_PFC_PIN_NONE,
                [30] = SH_PFC_PIN_NONE,
                [31] = SH_PFC_PIN_NONE,
        } },
        { PINMUX_BIAS_REG("PUEN1", 0xe60508c0, "PUD1", 0xe60508e0) {
                [ 0] = RCAR_GP_PIN(1,  0),      /* GP1_00 */
                [ 1] = RCAR_GP_PIN(1,  1),      /* GP1_01 */
                [ 2] = RCAR_GP_PIN(1,  2),      /* GP1_02 */
                [ 3] = RCAR_GP_PIN(1,  3),      /* GP1_03 */
                [ 4] = RCAR_GP_PIN(1,  4),      /* GP1_04 */
                [ 5] = RCAR_GP_PIN(1,  5),      /* GP1_05 */
                [ 6] = RCAR_GP_PIN(1,  6),      /* GP1_06 */
                [ 7] = RCAR_GP_PIN(1,  7),      /* GP1_07 */
                [ 8] = RCAR_GP_PIN(1,  8),      /* GP1_08 */
                [ 9] = RCAR_GP_PIN(1,  9),      /* GP1_09 */
                [10] = RCAR_GP_PIN(1, 10),      /* GP1_10 */
                [11] = RCAR_GP_PIN(1, 11),      /* GP1_11 */
                [12] = RCAR_GP_PIN(1, 12),      /* MMC_SD_CLK */
                [13] = RCAR_GP_PIN(1, 13),      /* MMC_SD_D0 */
                [14] = RCAR_GP_PIN(1, 14),      /* MMC_SD_D1 */
                [15] = RCAR_GP_PIN(1, 15),      /* MMC_SD_D2 */
                [16] = RCAR_GP_PIN(1, 16),      /* MMC_SD_D3 */
                [17] = RCAR_GP_PIN(1, 17),      /* MMC_D5 */
                [18] = RCAR_GP_PIN(1, 18),      /* MMC_D4 */
                [19] = RCAR_GP_PIN(1, 19),      /* MMC_D6 */
                [20] = RCAR_GP_PIN(1, 20),      /* MMC_DS */
                [21] = RCAR_GP_PIN(1, 21),      /* MMC_D7 */
                [22] = RCAR_GP_PIN(1, 22),      /* MMC_SD_CMD */
                [23] = RCAR_GP_PIN(1, 23),      /* SD_CD */
                [24] = RCAR_GP_PIN(1, 24),      /* SD_WP */
                [25] = SH_PFC_PIN_NONE,
                [26] = SH_PFC_PIN_NONE,
                [27] = SH_PFC_PIN_NONE,
                [28] = SH_PFC_PIN_NONE,
                [29] = SH_PFC_PIN_NONE,
                [30] = SH_PFC_PIN_NONE,
                [31] = SH_PFC_PIN_NONE,
        } },
        { PINMUX_BIAS_REG("PUEN2", 0xe60510c0, "PUD2", 0xe60510e0) {
                [ 0] = RCAR_GP_PIN(2,  0),      /* RPC_INT_N */
                [ 1] = RCAR_GP_PIN(2,  1),      /* RPC_WP_N */
                [ 2] = RCAR_GP_PIN(2,  2),      /* RPC_RESET_N */
                [ 3] = RCAR_GP_PIN(2,  3),      /* QSPI1_SSL */
                [ 4] = RCAR_GP_PIN(2,  4),      /* QSPI1_IO3 */
                [ 5] = RCAR_GP_PIN(2,  5),      /* QSPI1_MISO_IO1 */
                [ 6] = RCAR_GP_PIN(2,  6),      /* QSPI1_IO2 */
                [ 7] = RCAR_GP_PIN(2,  7),      /* QSPI1_MOSI_IO0 */
                [ 8] = RCAR_GP_PIN(2,  8),      /* QSPI1_SPCLK */
                [ 9] = RCAR_GP_PIN(2,  9),      /* QSPI0_MOSI_IO0 */
                [10] = RCAR_GP_PIN(2, 10),      /* QSPI0_SPCLK */
                [11] = RCAR_GP_PIN(2, 11),      /* QSPI0_IO2 */
                [12] = RCAR_GP_PIN(2, 12),      /* QSPI0_MISO_IO1 */
                [13] = RCAR_GP_PIN(2, 13),      /* QSPI0_SSL */
                [14] = RCAR_GP_PIN(2, 14),      /* QSPI0_IO3 */
                [15] = RCAR_GP_PIN(2, 15),      /* PCIE0_CLKREQ_N */
                [16] = RCAR_GP_PIN(2, 16),      /* PCIE1_CLKREQ_N */
                [17] = SH_PFC_PIN_NONE,
                [18] = SH_PFC_PIN_NONE,
                [19] = SH_PFC_PIN_NONE,
                [20] = SH_PFC_PIN_NONE,
                [21] = SH_PFC_PIN_NONE,
                [22] = SH_PFC_PIN_NONE,
                [23] = SH_PFC_PIN_NONE,
                [24] = SH_PFC_PIN_NONE,
                [25] = SH_PFC_PIN_NONE,
                [26] = SH_PFC_PIN_NONE,
                [27] = SH_PFC_PIN_NONE,
                [28] = SH_PFC_PIN_NONE,
                [29] = SH_PFC_PIN_NONE,
                [30] = SH_PFC_PIN_NONE,
                [31] = SH_PFC_PIN_NONE,
        } },
        { PINMUX_BIAS_REG("PUEN3", 0xe60518c0, "PUD3", 0xe60518e0) {
                [ 0] = RCAR_GP_PIN(3,  0),      /* TSN1_MDIO_B */
                [ 1] = RCAR_GP_PIN(3,  1),      /* TSN2_MDIO_B */
                [ 2] = RCAR_GP_PIN(3,  2),      /* TSN0_MDIO_B */
                [ 3] = RCAR_GP_PIN(3,  3),      /* TSN2_MDC_B */
                [ 4] = RCAR_GP_PIN(3,  4),      /* TSN0_MDC_B */
                [ 5] = RCAR_GP_PIN(3,  5),      /* TSN1_MDC_B */
                [ 6] = RCAR_GP_PIN(3,  6),      /* TSN1_LINK_B */
                [ 7] = RCAR_GP_PIN(3,  7),      /* TSN2_LINK_B */
                [ 8] = RCAR_GP_PIN(3,  8),      /* TSN0_LINK_B */
                [ 9] = RCAR_GP_PIN(3,  9),      /* TSN2_PHY_INT_B */
                [10] = RCAR_GP_PIN(3, 10),      /* TSN0_PHY_INT_B */
                [11] = RCAR_GP_PIN(3, 11),      /* TSN1_PHY_INT_B */
                [12] = RCAR_GP_PIN(3, 12),      /* TSN0_MAGIC_B */
                [13] = RCAR_GP_PIN(3, 13),      /* TSN1_AVTP_PPS */
                [14] = RCAR_GP_PIN(3, 14),      /* TSN1_AVTP_MATCH_B */
                [15] = RCAR_GP_PIN(3, 15),      /* TSN1_AVTP_CAPTURE_B */
                [16] = RCAR_GP_PIN(3, 16),      /* TSN0_AVTP_PPS */
                [17] = RCAR_GP_PIN(3, 17),      /* TSN0_AVTP_MATCH_B */
                [18] = RCAR_GP_PIN(3, 18),      /* TSN0_AVTP_CAPTURE_B */
                [19] = SH_PFC_PIN_NONE,
                [20] = SH_PFC_PIN_NONE,
                [21] = SH_PFC_PIN_NONE,
                [22] = SH_PFC_PIN_NONE,
                [23] = SH_PFC_PIN_NONE,
                [24] = SH_PFC_PIN_NONE,
                [25] = SH_PFC_PIN_NONE,
                [26] = SH_PFC_PIN_NONE,
                [27] = SH_PFC_PIN_NONE,
                [28] = SH_PFC_PIN_NONE,
                [29] = SH_PFC_PIN_NONE,
                [30] = SH_PFC_PIN_NONE,
                [31] = SH_PFC_PIN_NONE,
        } },
        { /* sentinel */ }
};

static const struct sh_pfc_soc_operations r8a779f0_pfc_ops = {
        .pin_to_pocctrl = r8a779f0_pin_to_pocctrl,
        .get_bias = rcar_pinmux_get_bias,
        .set_bias = rcar_pinmux_set_bias,
};

const struct sh_pfc_soc_info r8a779f0_pinmux_info = {
        .name = "r8a779f0_pfc",
        .ops = &r8a779f0_pfc_ops,
        .unlock_reg = 0x1ff,    /* PMMRn mask */

        .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,
        .drive_regs = pinmux_drive_regs,
        .bias_regs = pinmux_bias_regs,
        .ioctrl_regs = pinmux_ioctrl_regs,

        .pinmux_data = pinmux_data,
        .pinmux_data_size = ARRAY_SIZE(pinmux_data),
};