arch/risc-v/eic7700x: Describe the pads through procfs.

Implements the pinctrl get_pad method, so /proc/pinctrl and
PINCTRLC_GETPAD carry what this block is actually holding: each layout's
common fields with their validity bits, and the layout's own fields, the
RGMII and mode-select voltage bits and the oscillator tuning, as
key:value text.

Names every pad and every documented function select in one
PINCTRL_PADNAME() table, so func:2 on S_MODE reads as GPIO94 rather than
as a number.  The names are the manual's own; a pad's name describes its
default function, not its current one.  The table costs about 9 KiB and
is built only with the file that reads it; the name helpers return NULL
without it and the strings stay empty.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Justin Hammond <justin@dynam.ac>
This commit is contained in:
Justin Hammond 2026-08-17 00:08:21 +08:00 • committed by Xiang Xiao
parent f35dd7813e
commit 2bd1334ec4
3 changed files with 539 additions and 1 deletions

View file

@ -337,9 +337,359 @@ static_assert(nitems(g_eic7700x_pad_bygpio) == EIC7700X_PAD_NGPIOS,
static struct pinctrl_dev_s g_eic7700x_pinctrl_dev =
{
.ops = &g_eic7700x_pinctrl_ops
.ops = &g_eic7700x_pinctrl_ops,
.npins = EIC7700X_PAD_NPADS
};
#ifdef HAVE_PINCTRL_TEXT
/* Every pad's name and the name of each function select the manual
* documents, in select order, for /proc/pinctrl and PINCTRLC_GETPAD.
* The names are the manual's own; a pad's name describes its default
* function, not its current one.
*/
static const struct pinctrl_padname_s
g_eic7700x_pad_names[EIC7700X_PAD_NPADS] =
{
[EIC7700X_PAD_CHIP_MODE] =
PINCTRL_PADNAME("CHIP_MODE", "CHIP_MODE"),
[EIC7700X_PAD_MODE_SET0] =
PINCTRL_PADNAME("MODE_SET0", "SDIO0_DETECT", NULL, "GPIO13"),
[EIC7700X_PAD_MODE_SET1] =
PINCTRL_PADNAME("MODE_SET1", "SDIO0_WRITE_PROT", NULL, "GPIO14"),
[EIC7700X_PAD_MODE_SET2] =
PINCTRL_PADNAME("MODE_SET2", "SDIO1_DETECT", NULL, "GPIO15"),
[EIC7700X_PAD_MODE_SET3] =
PINCTRL_PADNAME("MODE_SET3", "SDIO1_WRITE_PROT", NULL, "GPIO16"),
[EIC7700X_PAD_XIN] =
PINCTRL_PADNAME("XIN", "XIN_24M"),
[EIC7700X_PAD_RESERVED0] =
PINCTRL_PADNAME("RESERVED0", "XOUT_24M"),
[EIC7700X_PAD_RST_OUT_N] =
PINCTRL_PADNAME("RST_OUT_N", "RST_OUT_N"),
[EIC7700X_PAD_KEY_RESET_N] =
PINCTRL_PADNAME("KEY_RESET_N", "KEY_RESET_N"),
[EIC7700X_PAD_RESERVED1] =
PINCTRL_PADNAME("RESERVED1", NULL),
[EIC7700X_PAD_RESERVED2] =
PINCTRL_PADNAME("RESERVED2", NULL),
[EIC7700X_PAD_RESERVED3] =
PINCTRL_PADNAME("RESERVED3", NULL),
[EIC7700X_PAD_GPIO0] =
PINCTRL_PADNAME("GPIO0", "GPIO0"),
[EIC7700X_PAD_POR_SEL] =
PINCTRL_PADNAME("POR_SEL", "POR_SEL"),
[EIC7700X_PAD_JTAG0_TCK] =
PINCTRL_PADNAME("JTAG0_TCK", "JTAG0_TCK", "SPI2_CLK", "GPIO1"),
[EIC7700X_PAD_JTAG0_TMS] =
PINCTRL_PADNAME("JTAG0_TMS", "JTAG0_TMS", "SPI2_D0", "GPIO2"),
[EIC7700X_PAD_JTAG0_TDI] =
PINCTRL_PADNAME("JTAG0_TDI", "JTAG0_TDI", "SPI2_D1", "GPIO3"),
[EIC7700X_PAD_JTAG0_TDO] =
PINCTRL_PADNAME("JTAG0_TDO", "JTAG0_TDO", "SPI2_D2", "GPIO4"),
[EIC7700X_PAD_JTAG0_TRST] =
PINCTRL_PADNAME("JTAG0_TRST", NULL),
[EIC7700X_PAD_SPI2_CS0_N] =
PINCTRL_PADNAME("SPI2_CS0_N", "SPI2_CS0_N", NULL, "GPIO6"),
[EIC7700X_PAD_JTAG1_TCK] =
PINCTRL_PADNAME("JTAG1_TCK", "JTAG1_TCK", NULL, "GPIO7"),
[EIC7700X_PAD_JTAG1_TMS] =
PINCTRL_PADNAME("JTAG1_TMS", "JTAG1_TMS", NULL, "GPIO8"),
[EIC7700X_PAD_JTAG1_TDI] =
PINCTRL_PADNAME("JTAG1_TDI", "JTAG1_TDI", NULL, "GPIO9"),
[EIC7700X_PAD_JTAG1_TDO] =
PINCTRL_PADNAME("JTAG1_TDO", "JTAG1_TDO", NULL, "GPIO10"),
[EIC7700X_PAD_JTAG1_TRST] =
PINCTRL_PADNAME("JTAG1_TRST", NULL),
[EIC7700X_PAD_SPI2_CS1_N] =
PINCTRL_PADNAME("SPI2_CS1_N", "SPI2_CS1_N", NULL, "GPIO12"),
[EIC7700X_PAD_PCIE_CLKREQ_N] =
PINCTRL_PADNAME("PCIE_CLKREQ_N", "PCIE_CLKREQ_N"),
[EIC7700X_PAD_PCIE_WAKE_N] =
PINCTRL_PADNAME("PCIE_WAKE_N", "PCIE_WAKE_N"),
[EIC7700X_PAD_PCIE_PERST_N] =
PINCTRL_PADNAME("PCIE_PERST_N", "PCIE_PERST_N"),
[EIC7700X_PAD_HDMI_SCL] =
PINCTRL_PADNAME("HDMI_SCL", "HDMI_SCL"),
[EIC7700X_PAD_HDMI_SDA] =
PINCTRL_PADNAME("HDMI_SDA", "HDMI_SDA"),
[EIC7700X_PAD_HDMI_CEC] =
PINCTRL_PADNAME("HDMI_CEC", "HDMI_CEC"),
[EIC7700X_PAD_JTAG2_TRST] =
PINCTRL_PADNAME("JTAG2_TRST", "JTAG2_TRST", NULL, "GPIO17"),
[EIC7700X_PAD_RGMII0_CLK_125] =
PINCTRL_PADNAME("RGMII0_CLK_125", "RGMII0_CLK_125"),
[EIC7700X_PAD_RGMII0_TXEN] =
PINCTRL_PADNAME("RGMII0_TXEN", "RGMII0_TXEN"),
[EIC7700X_PAD_RGMII0_TXCLK] =
PINCTRL_PADNAME("RGMII0_TXCLK", "RGMII0_TXCLK"),
[EIC7700X_PAD_RGMII0_TXD0] =
PINCTRL_PADNAME("RGMII0_TXD0", "RGMII0_TXD0"),
[EIC7700X_PAD_RGMII0_TXD1] =
PINCTRL_PADNAME("RGMII0_TXD1", "RGMII0_TXD1"),
[EIC7700X_PAD_RGMII0_TXD2] =
PINCTRL_PADNAME("RGMII0_TXD2", "RGMII0_TXD2"),
[EIC7700X_PAD_RGMII0_TXD3] =
PINCTRL_PADNAME("RGMII0_TXD3", "RGMII0_TXD3"),
[EIC7700X_PAD_I2S0_BCLK] =
PINCTRL_PADNAME("I2S0_BCLK", "I2S0_BCLK", NULL, "GPIO18"),
[EIC7700X_PAD_I2S0_WCLK] =
PINCTRL_PADNAME("I2S0_WCLK", "I2S0_WCLK", NULL, "GPIO19"),
[EIC7700X_PAD_I2S0_SDI] =
PINCTRL_PADNAME("I2S0_SDI", "I2S0_SDI", NULL, "GPIO20"),
[EIC7700X_PAD_I2S0_SDO] =
PINCTRL_PADNAME("I2S0_SDO", "I2S0_SDO", NULL, "GPIO21"),
[EIC7700X_PAD_I2S_MCLK] =
PINCTRL_PADNAME("I2S_MCLK", "I2S_MCLK", NULL, "GPIO22"),
[EIC7700X_PAD_RGMII0_RXCLK] =
PINCTRL_PADNAME("RGMII0_RXCLK", "RGMII0_RXCLK"),
[EIC7700X_PAD_RGMII0_RXDV] =
PINCTRL_PADNAME("RGMII0_RXDV", "RGMII0_RXDV"),
[EIC7700X_PAD_RGMII0_RXD0] =
PINCTRL_PADNAME("RGMII0_RXD0", "RGMII0_RXD0"),
[EIC7700X_PAD_RGMII0_RXD1] =
PINCTRL_PADNAME("RGMII0_RXD1", "RGMII0_RXD1"),
[EIC7700X_PAD_RGMII0_RXD2] =
PINCTRL_PADNAME("RGMII0_RXD2", "RGMII0_RXD2"),
[EIC7700X_PAD_RGMII0_RXD3] =
PINCTRL_PADNAME("RGMII0_RXD3", "RGMII0_RXD3"),
[EIC7700X_PAD_I2S2_BCLK] =
PINCTRL_PADNAME("I2S2_BCLK", "I2S2_BCLK", NULL, "GPIO23"),
[EIC7700X_PAD_I2S2_WCLK] =
PINCTRL_PADNAME("I2S2_WCLK", "I2S2_WCLK", NULL, "GPIO24"),
[EIC7700X_PAD_I2S2_SDI] =
PINCTRL_PADNAME("I2S2_SDI", "I2S2_SDI", NULL, "GPIO25"),
[EIC7700X_PAD_I2S2_SDO] =
PINCTRL_PADNAME("I2S2_SDO", "I2S2_SDO", NULL, "GPIO26"),
[EIC7700X_PAD_GPIO27] =
PINCTRL_PADNAME("GPIO27", "GPIO27", "SATA_ACT_LED"),
[EIC7700X_PAD_GPIO28] =
PINCTRL_PADNAME("GPIO28", "GPIO28"),
[EIC7700X_PAD_GPIO29] =
PINCTRL_PADNAME("GPIO29", "POR_TIME_SEL0", "EMMC_LED_CONTROL", "GPIO29"),
[EIC7700X_PAD_RGMII0_MDC] =
PINCTRL_PADNAME("RGMII0_MDC", "RGMII0_MDC"),
[EIC7700X_PAD_RGMII0_MDIO] =
PINCTRL_PADNAME("RGMII0_MDIO", "RGMII0_MDIO"),
[EIC7700X_PAD_RGMII0_INTB] =
PINCTRL_PADNAME("RGMII0_INTB", "RGMII0_INTB"),
[EIC7700X_PAD_RGMII1_CLK_125] =
PINCTRL_PADNAME("RGMII1_CLK_125", "RGMII1_CLK_125"),
[EIC7700X_PAD_RGMII1_TXEN] =
PINCTRL_PADNAME("RGMII1_TXEN", "RGMII1_TXEN"),
[EIC7700X_PAD_RGMII1_TXCLK] =
PINCTRL_PADNAME("RGMII1_TXCLK", "RGMII1_TXCLK"),
[EIC7700X_PAD_RGMII1_TXD0] =
PINCTRL_PADNAME("RGMII1_TXD0", "RGMII1_TXD0"),
[EIC7700X_PAD_RGMII1_TXD1] =
PINCTRL_PADNAME("RGMII1_TXD1", "RGMII1_TXD1"),
[EIC7700X_PAD_RGMII1_TXD2] =
PINCTRL_PADNAME("RGMII1_TXD2", "RGMII1_TXD2"),
[EIC7700X_PAD_RGMII1_TXD3] =
PINCTRL_PADNAME("RGMII1_TXD3", "RGMII1_TXD3"),
[EIC7700X_PAD_I2S1_BCLK] =
PINCTRL_PADNAME("I2S1_BCLK", "I2S1_BCLK", NULL, "GPIO30"),
[EIC7700X_PAD_I2S1_WCLK] =
PINCTRL_PADNAME("I2S1_WCLK", "I2S1_WCLK", NULL, "GPIO31"),
[EIC7700X_PAD_I2S1_SDI] =
PINCTRL_PADNAME("I2S1_SDI", "I2S1_SDI", NULL, "GPIO32"),
[EIC7700X_PAD_I2S1_SDO] =
PINCTRL_PADNAME("I2S1_SDO", "I2S1_SDO", NULL, "GPIO33"),
[EIC7700X_PAD_GPIO34] =
PINCTRL_PADNAME("GPIO34", "POR_TIME_SEL1", "SD0_LED_CONTROL", "GPIO34"),
[EIC7700X_PAD_RGMII1_RXCLK] =
PINCTRL_PADNAME("RGMII1_RXCLK", "RGMII1_RXCLK"),
[EIC7700X_PAD_RGMII1_RXDV] =
PINCTRL_PADNAME("RGMII1_RXDV", "RGMII1_RXDV"),
[EIC7700X_PAD_RGMII1_RXD0] =
PINCTRL_PADNAME("RGMII1_RXD0", "RGMII1_RXD0"),
[EIC7700X_PAD_RGMII1_RXD1] =
PINCTRL_PADNAME("RGMII1_RXD1", "RGMII1_RXD1"),
[EIC7700X_PAD_RGMII1_RXD2] =
PINCTRL_PADNAME("RGMII1_RXD2", "RGMII1_RXD2"),
[EIC7700X_PAD_RGMII1_RXD3] =
PINCTRL_PADNAME("RGMII1_RXD3", "RGMII1_RXD3"),
[EIC7700X_PAD_SPI1_CS0_N] =
PINCTRL_PADNAME("SPI1_CS0_N", "SPI1_CS0_N", NULL, "GPIO35"),
[EIC7700X_PAD_SPI1_CLK] =
PINCTRL_PADNAME("SPI1_CLK", "SPI1_CLK", NULL, "GPIO36"),
[EIC7700X_PAD_SPI1_D0] =
PINCTRL_PADNAME("SPI1_D0", "SPI1_D0", "I2C9_SCL", "GPIO37", "UART4_TX"),
[EIC7700X_PAD_SPI1_D1] =
PINCTRL_PADNAME("SPI1_D1", "SPI1_D1", "I2C9_SDA", "GPIO38", "UART4_RX"),
[EIC7700X_PAD_SPI1_D2] =
PINCTRL_PADNAME("SPI1_D2", "SPI1_D2", "SD1_LED_CONTROL", "GPIO39"),
[EIC7700X_PAD_SPI1_D3] =
PINCTRL_PADNAME("SPI1_D3", "SPI1_D3", "PWM1", "GPIO40"),
[EIC7700X_PAD_SPI1_CS1_N] =
PINCTRL_PADNAME("SPI1_CS1_N", "SPI1_CS1_N", "PWM2", "GPIO41"),
[EIC7700X_PAD_RGMII1_MDC] =
PINCTRL_PADNAME("RGMII1_MDC", "RGMII1_MDC"),
[EIC7700X_PAD_RGMII1_MDIO] =
PINCTRL_PADNAME("RGMII1_MDIO", "RGMII1_MDIO"),
[EIC7700X_PAD_RGMII1_INTB] =
PINCTRL_PADNAME("RGMII1_INTB", "RGMII1_INTB"),
[EIC7700X_PAD_USB0_PWREN] =
PINCTRL_PADNAME("USB0_PWREN", "USB0_PWREN", NULL, "GPIO42"),
[EIC7700X_PAD_USB1_PWREN] =
PINCTRL_PADNAME("USB1_PWREN", "USB1_PWREN", NULL, "GPIO43"),
[EIC7700X_PAD_I2C0_SCL] =
PINCTRL_PADNAME("I2C0_SCL", "I2C0_SCL", NULL, "GPIO44"),
[EIC7700X_PAD_I2C0_SDA] =
PINCTRL_PADNAME("I2C0_SDA", "I2C0_SDA", NULL, "GPIO45"),
[EIC7700X_PAD_I2C1_SCL] =
PINCTRL_PADNAME("I2C1_SCL", "I2C1_SCL", NULL, "GPIO46"),
[EIC7700X_PAD_I2C1_SDA] =
PINCTRL_PADNAME("I2C1_SDA", "I2C1_SDA", NULL, "GPIO47"),
[EIC7700X_PAD_I2C2_SCL] =
PINCTRL_PADNAME("I2C2_SCL", "I2C2_SCL", NULL, "GPIO48"),
[EIC7700X_PAD_I2C2_SDA] =
PINCTRL_PADNAME("I2C2_SDA", "I2C2_SDA", NULL, "GPIO49"),
[EIC7700X_PAD_I2C3_SCL] =
PINCTRL_PADNAME("I2C3_SCL", "I2C3_SCL", NULL, "GPIO50"),
[EIC7700X_PAD_I2C3_SDA] =
PINCTRL_PADNAME("I2C3_SDA", "I2C3_SDA", NULL, "GPIO51"),
[EIC7700X_PAD_I2C4_SCL] =
PINCTRL_PADNAME("I2C4_SCL", "I2C4_SCL", NULL, "GPIO52"),
[EIC7700X_PAD_I2C4_SDA] =
PINCTRL_PADNAME("I2C4_SDA", "I2C4_SDA", NULL, "GPIO53"),
[EIC7700X_PAD_I2C5_SCL] =
PINCTRL_PADNAME("I2C5_SCL", "I2C5_SCL", NULL, "GPIO54"),
[EIC7700X_PAD_I2C5_SDA] =
PINCTRL_PADNAME("I2C5_SDA", "I2C5_SDA", NULL, "GPIO55"),
[EIC7700X_PAD_UART0_TX] =
PINCTRL_PADNAME("UART0_TX", "UART0_TX", NULL, "GPIO56"),
[EIC7700X_PAD_UART0_RX] =
PINCTRL_PADNAME("UART0_RX", "UART0_RX", NULL, "GPIO57"),
[EIC7700X_PAD_UART1_TX] =
PINCTRL_PADNAME("UART1_TX", "UART1_TX", NULL, "GPIO58"),
[EIC7700X_PAD_UART1_RX] =
PINCTRL_PADNAME("UART1_RX", "UART1_RX", NULL, "GPIO59"),
[EIC7700X_PAD_UART1_CTS] =
PINCTRL_PADNAME("UART1_CTS", "UART1_CTS", "I2C6_SCL", "GPIO60"),
[EIC7700X_PAD_UART1_RTS] =
PINCTRL_PADNAME("UART1_RTS", "UART1_RTS", "I2C6_SDA", "GPIO61"),
[EIC7700X_PAD_UART2_TX] =
PINCTRL_PADNAME("UART2_TX", "UART2_TX", "I2C7_SCL", "GPIO62"),
[EIC7700X_PAD_UART2_RX] =
PINCTRL_PADNAME("UART2_RX", "UART2_RX", "I2C7_SDA", "GPIO63"),
[EIC7700X_PAD_JTAG2_TCK] =
PINCTRL_PADNAME("JTAG2_TCK", "JTAG2_TCK", NULL, "GPIO64"),
[EIC7700X_PAD_JTAG2_TMS] =
PINCTRL_PADNAME("JTAG2_TMS", "JTAG2_TMS", NULL, "GPIO65"),
[EIC7700X_PAD_JTAG2_TDI] =
PINCTRL_PADNAME("JTAG2_TDI", "JTAG2_TDI", NULL, "GPIO66"),
[EIC7700X_PAD_JTAG2_TDO] =
PINCTRL_PADNAME("JTAG2_TDO", "JTAG2_TDO", NULL, "GPIO67"),
[EIC7700X_PAD_FAN_PWM] =
PINCTRL_PADNAME("FAN_PWM", "FAN_PWM", NULL, "GPIO68"),
[EIC7700X_PAD_FAN_TACH] =
PINCTRL_PADNAME("FAN_TACH", "FAN_TACH", NULL, "GPIO69"),
[EIC7700X_PAD_MIPI_CSI0_XVS] =
PINCTRL_PADNAME("MIPI_CSI0_XVS", "MIPI_CSI0_XVS", NULL, "GPIO70"),
[EIC7700X_PAD_MIPI_CSI0_XHS] =
PINCTRL_PADNAME("MIPI_CSI0_XHS", "MIPI_CSI0_XHS", NULL, "GPIO71"),
[EIC7700X_PAD_MIPI_CSI0_MCLK] =
PINCTRL_PADNAME("MIPI_CSI0_MCLK", "MIPI_CSI0_MCLK", NULL, "GPIO72"),
[EIC7700X_PAD_MIPI_CSI1_XVS] =
PINCTRL_PADNAME("MIPI_CSI1_XVS", "MIPI_CSI1_XVS", NULL, "GPIO73"),
[EIC7700X_PAD_MIPI_CSI1_XHS] =
PINCTRL_PADNAME("MIPI_CSI1_XHS", "MIPI_CSI1_XHS", NULL, "GPIO74"),
[EIC7700X_PAD_MIPI_CSI1_MCLK] =
PINCTRL_PADNAME("MIPI_CSI1_MCLK", "MIPI_CSI1_MCLK", NULL, "GPIO75"),
[EIC7700X_PAD_MIPI_CSI2_XVS] =
PINCTRL_PADNAME("MIPI_CSI2_XVS", "MIPI_CSI2_XVS", NULL, "GPIO76"),
[EIC7700X_PAD_MIPI_CSI2_XHS] =
PINCTRL_PADNAME("MIPI_CSI2_XHS", "MIPI_CSI2_XHS", NULL, "GPIO77"),
[EIC7700X_PAD_MIPI_CSI2_MCLK] =
PINCTRL_PADNAME("MIPI_CSI2_MCLK", "MIPI_CSI2_MCLK", NULL, "GPIO78"),
[EIC7700X_PAD_MIPI_CSI3_XVS] =
PINCTRL_PADNAME("MIPI_CSI3_XVS", "MIPI_CSI3_XVS", NULL, "GPIO79"),
[EIC7700X_PAD_MIPI_CSI3_XHS] =
PINCTRL_PADNAME("MIPI_CSI3_XHS", "MIPI_CSI3_XHS", NULL, "GPIO80"),
[EIC7700X_PAD_MIPI_CSI3_MCLK] =
PINCTRL_PADNAME("MIPI_CSI3_MCLK", "MIPI_CSI3_MCLK", NULL, "GPIO81"),
[EIC7700X_PAD_MIPI_CSI4_XVS] =
PINCTRL_PADNAME("MIPI_CSI4_XVS", "MIPI_CSI4_XVS", NULL, "GPIO82"),
[EIC7700X_PAD_MIPI_CSI4_XHS] =
PINCTRL_PADNAME("MIPI_CSI4_XHS", "MIPI_CSI4_XHS", NULL, "GPIO83"),
[EIC7700X_PAD_MIPI_CSI4_MCLK] =
PINCTRL_PADNAME("MIPI_CSI4_MCLK", "MIPI_CSI4_MCLK", NULL, "GPIO84"),
[EIC7700X_PAD_MIPI_CSI5_XVS] =
PINCTRL_PADNAME("MIPI_CSI5_XVS", "MIPI_CSI5_XVS", NULL, "GPIO85"),
[EIC7700X_PAD_MIPI_CSI5_XHS] =
PINCTRL_PADNAME("MIPI_CSI5_XHS", "MIPI_CSI5_XHS", NULL, "GPIO86"),
[EIC7700X_PAD_MIPI_CSI5_MCLK] =
PINCTRL_PADNAME("MIPI_CSI5_MCLK", "MIPI_CSI5_MCLK", NULL, "GPIO87"),
[EIC7700X_PAD_SPI3_CS_N] =
PINCTRL_PADNAME("SPI3_CS_N", "SPI3_CS_N", NULL, "GPIO88"),
[EIC7700X_PAD_SPI3_CLK] =
PINCTRL_PADNAME("SPI3_CLK", "SPI3_CLK", NULL, "GPIO89"),
[EIC7700X_PAD_SPI3_DI] =
PINCTRL_PADNAME("SPI3_DI", "SPI3_DI", NULL, "GPIO90"),
[EIC7700X_PAD_SPI3_DO] =
PINCTRL_PADNAME("SPI3_DO", "SPI3_DO", NULL, "GPIO91"),
[EIC7700X_PAD_GPIO92] =
PINCTRL_PADNAME("GPIO92",
"I2C8_SCL", "MIPI_CSI_XTRIG0", "GPIO92", "UART3_TX"),
[EIC7700X_PAD_GPIO93] =
PINCTRL_PADNAME("GPIO93",
"I2C8_SDA", "MIPI_CSI_XTRIG1", "GPIO93", "UART3_RX"),
[EIC7700X_PAD_S_MODE] =
PINCTRL_PADNAME("S_MODE", "S_MODE", NULL, "GPIO94"),
[EIC7700X_PAD_GPIO95] =
PINCTRL_PADNAME("GPIO95", "LPDDR_REFCLK_SEL", NULL, "GPIO95"),
[EIC7700X_PAD_SPI0_CS_N] =
PINCTRL_PADNAME("SPI0_CS_N", "SPI0_CS_N", NULL, "GPIO96"),
[EIC7700X_PAD_SPI0_CLK] =
PINCTRL_PADNAME("SPI0_CLK", "SPI0_CLK", NULL, "GPIO97"),
[EIC7700X_PAD_SPI0_D0] =
PINCTRL_PADNAME("SPI0_D0", "SPI0_D0", NULL, "GPIO98"),
[EIC7700X_PAD_SPI0_D1] =
PINCTRL_PADNAME("SPI0_D1", "SPI0_D1", NULL, "GPIO99"),
[EIC7700X_PAD_SPI0_D2] =
PINCTRL_PADNAME("SPI0_D2", "SPI0_D2", NULL, "GPIO100"),
[EIC7700X_PAD_SPI0_D3] =
PINCTRL_PADNAME("SPI0_D3", "SPI0_D3", NULL, "GPIO101"),
[EIC7700X_PAD_I2C10_SCL] =
PINCTRL_PADNAME("I2C10_SCL", "I2C10_SCL", NULL, "GPIO102"),
[EIC7700X_PAD_I2C10_SDA] =
PINCTRL_PADNAME("I2C10_SDA", "I2C10_SDA", NULL, "GPIO103"),
[EIC7700X_PAD_I2C11_SCL] =
PINCTRL_PADNAME("I2C11_SCL", "I2C11_SCL", NULL, "GPIO104"),
[EIC7700X_PAD_I2C11_SDA] =
PINCTRL_PADNAME("I2C11_SDA", "I2C11_SDA", NULL, "GPIO105"),
[EIC7700X_PAD_GPIO106] =
PINCTRL_PADNAME("GPIO106", "GPIO106"),
[EIC7700X_PAD_BOOT_SEL0] =
PINCTRL_PADNAME("BOOT_SEL0", "BOOT_SEL0", NULL, "GPIO107"),
[EIC7700X_PAD_BOOT_SEL1] =
PINCTRL_PADNAME("BOOT_SEL1", "BOOT_SEL1", NULL, "GPIO108"),
[EIC7700X_PAD_BOOT_SEL2] =
PINCTRL_PADNAME("BOOT_SEL2", "BOOT_SEL2", NULL, "GPIO109"),
[EIC7700X_PAD_BOOT_SEL3] =
PINCTRL_PADNAME("BOOT_SEL3", "BOOT_SEL3", NULL, "GPIO110"),
[EIC7700X_PAD_GPIO111] =
PINCTRL_PADNAME("GPIO111", "GPIO111"),
[EIC7700X_PAD_RESERVED4] =
PINCTRL_PADNAME("RESERVED4", NULL),
[EIC7700X_PAD_RESERVED5] =
PINCTRL_PADNAME("RESERVED5", NULL),
[EIC7700X_PAD_RESERVED6] =
PINCTRL_PADNAME("RESERVED6", NULL),
[EIC7700X_PAD_RESERVED7] =
PINCTRL_PADNAME("RESERVED7", NULL),
[EIC7700X_PAD_LPDDR_REF_CLK] =
PINCTRL_PADNAME("LPDDR_REF_CLK", "LPDDR_REF_CLK"),
[EIC7700X_PAD_ADDR_RGMII0_SEL_MODE] =
PINCTRL_PADNAME("ADDR_RGMII0_SEL_MODE", NULL),
[EIC7700X_PAD_ADDR_RGMII1_SEL_MODE] =
PINCTRL_PADNAME("ADDR_RGMII1_SEL_MODE", NULL),
};
#endif /* HAVE_PINCTRL_TEXT */
/****************************************************************************
* Private Functions
****************************************************************************/
@ -447,3 +797,40 @@ unsigned int eic7700x_pinctrl_count(FAR unsigned int *changed)
return EIC7700X_PAD_NPADS;
}
/****************************************************************************
* Name: eic7700x_pad_name
*
* Description:
* The manual's name for a pad, or NULL if the pad id is out of range or
* the name tables are not built.
*
****************************************************************************/
FAR const char *eic7700x_pad_name(unsigned int pad)
{
#ifdef HAVE_PINCTRL_TEXT
return pinctrl_padname(g_eic7700x_pad_names, EIC7700X_PAD_NPADS, pad);
#else
return NULL;
#endif
}
/****************************************************************************
* Name: eic7700x_pad_funcname
*
* Description:
* The name of function select func on pad, or NULL if the manual does
* not document it or the name tables are not built.
*
****************************************************************************/
FAR const char *eic7700x_pad_funcname(unsigned int pad, unsigned int func)
{
#ifdef HAVE_PINCTRL_TEXT
return pinctrl_funcname(g_eic7700x_pad_names, EIC7700X_PAD_NPADS,
pad, func);
#else
return NULL;
#endif
}

View file

@ -39,6 +39,16 @@
* Pre-processor Definitions
****************************************************************************/
/* Whether anything wants a pad's name in text. The names cost about nine
* kilobytes, so they are only compiled when something will print them.
* GPIO_PROCFS is a consumer to come: the GPIO driver's procfs entry names
* the pad behind each line.
*/
#if defined(CONFIG_PINCTRL_PROCFS) || defined(CONFIG_GPIO_PROCFS)
# define HAVE_PINCTRL_TEXT 1
#endif
/* How many distinct reset values the 166 pads have between them. The
* manual gives a reset value per field; reassembled into words they
* collapse to this many, so the table stores an index instead of a word.
@ -153,6 +163,41 @@ int eic7700x_pinctrl_initialize(void);
unsigned int eic7700x_pinctrl_count(FAR unsigned int *changed);
/****************************************************************************
* Name: eic7700x_pad_name
*
* Description:
* The manual's name for a pad.
*
* Input Parameters:
* pad - The pad id, an enum eic7700x_pad_e value
*
* Returned Value:
* The name, or NULL if the pad id is out of range or the name tables
* are not built.
*
****************************************************************************/
FAR const char *eic7700x_pad_name(unsigned int pad);
/****************************************************************************
* Name: eic7700x_pad_funcname
*
* Description:
* The name of one of a pad's function selects.
*
* Input Parameters:
* pad - The pad id, an enum eic7700x_pad_e value
* func - The function select
*
* Returned Value:
* The name, or NULL if the manual does not document that select or the
* name tables are not built.
*
****************************************************************************/
FAR const char *eic7700x_pad_funcname(unsigned int pad, unsigned int func);
/****************************************************************************
* Name: eic7700x_pad_lookup
*

View file

@ -29,6 +29,8 @@
#include <stdint.h>
#include <inttypes.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <nuttx/debug.h>
#include <nuttx/pinctrl/pinctrl.h>
@ -52,6 +54,9 @@ static int eic7700x_pinctrl_setslewrate(FAR struct pinctrl_dev_s *dev,
uint32_t pin, uint32_t slewrate);
static int eic7700x_pinctrl_selectgpio(FAR struct pinctrl_dev_s *dev,
uint32_t pin);
static int eic7700x_pinctrl_getpad(FAR struct pinctrl_dev_s *dev,
uint32_t pin,
FAR struct pinctrl_padinfo_s *info);
/****************************************************************************
* Public Data
@ -72,6 +77,7 @@ const struct pinctrl_ops_s g_eic7700x_pinctrl_ops =
.set_driver = eic7700x_pinctrl_setdriver,
.set_slewrate = eic7700x_pinctrl_setslewrate,
.select_gpio = eic7700x_pinctrl_selectgpio,
.get_pad = eic7700x_pinctrl_getpad,
};
/****************************************************************************
@ -357,6 +363,106 @@ static int eic7700x_pinctrl_selectgpio(FAR struct pinctrl_dev_s *dev,
PINCTRL_GEN_IE);
}
/****************************************************************************
* Name: eic7700x_pinctrl_getpad
*
* Description:
* Describe one pad for the framework: the common fields the pad's
* layout has, with their validity bits, and the layout's own fields as
* key:value text. The name helpers return NULL when the name tables
* are not built, which leaves the strings empty as the contract asks.
*
* Input Parameters:
* dev - The pinctrl device
* pin - The pad id
* info - Receives the pad description
*
* Returned Value:
* OK, or -EINVAL if the id names no pad.
*
****************************************************************************/
static int eic7700x_pinctrl_getpad(FAR struct pinctrl_dev_s *dev,
uint32_t pin,
FAR struct pinctrl_padinfo_s *info)
{
FAR const struct eic7700x_pad_s *desc;
FAR const char *name;
uint32_t val;
desc = eic7700x_pad_lookup(pin);
if (desc == NULL)
{
return -EINVAL;
}
val = getreg32(EIC7700X_PINCTRL_PAD(pin));
name = eic7700x_pad_name(pin);
if (name != NULL)
{
strlcpy(info->name, name, sizeof(info->name));
}
switch (desc->shape)
{
case EIC7700X_PADSHAPE_GENERAL:
info->have = PINCTRL_HAVE_FUNCTION | PINCTRL_HAVE_STRENGTH |
PINCTRL_HAVE_PULL | PINCTRL_HAVE_INPUT |
PINCTRL_HAVE_SCHMITT;
info->function = (val & PINCTRL_GEN_FUNC_MASK) >>
PINCTRL_GEN_FUNC_SHIFT;
info->strength = (val & PINCTRL_GEN_DS_MASK) >>
PINCTRL_GEN_DS_SHIFT;
info->pullup = (val & PINCTRL_GEN_PU) != 0;
info->pulldown = (val & PINCTRL_GEN_PD) != 0;
info->input = (val & PINCTRL_GEN_IE) != 0;
info->schmitt = (val & PINCTRL_GEN_SMT) != 0;
name = eic7700x_pad_funcname(pin, info->function);
if (name != NULL)
{
strlcpy(info->funcname, name, sizeof(info->funcname));
}
break;
case EIC7700X_PADSHAPE_RGMII:
info->have = PINCTRL_HAVE_STRENGTH | PINCTRL_HAVE_PULL |
PINCTRL_HAVE_INPUT | PINCTRL_HAVE_SCHMITT;
info->strength = (val & PINCTRL_RGMII_DS_MASK) >>
PINCTRL_RGMII_DS_SHIFT;
info->pullup = (val & PINCTRL_RGMII_PU) != 0;
info->pulldown = (val & PINCTRL_RGMII_PD) != 0;
info->input = (val & PINCTRL_RGMII_IE) != 0;
info->schmitt = (val & PINCTRL_RGMII_SMT) != 0;
snprintf(info->extra, sizeof(info->extra), "ms:%u",
(unsigned int)((val &
(PINCTRL_RGMII_MS2 | PINCTRL_RGMII_MS1)) >> 8));
break;
case EIC7700X_PADSHAPE_OSC:
info->have = PINCTRL_HAVE_STRENGTH;
info->strength = (val & PINCTRL_OSC_DS_MASK) >>
PINCTRL_OSC_DS_SHIFT;
snprintf(info->extra, sizeof(info->extra), "frs:%u rd:%u",
(unsigned int)((val & PINCTRL_OSC_FRS_MASK) >>
PINCTRL_OSC_FRS_SHIFT),
(unsigned int)((val & PINCTRL_OSC_RD_MASK) >>
PINCTRL_OSC_RD_SHIFT));
break;
default:
snprintf(info->extra, sizeof(info->extra), "ms1:%u ms2:%u",
(val & PINCTRL_MODESEL_MS1) != 0,
(val & PINCTRL_MODESEL_MS2) != 0);
break;
}
return OK;
}
/****************************************************************************
* Public Functions
****************************************************************************/