[PATCH RFC] pinctrl: add support for HiSilicon HiSTB SoCs

From: Yang Xiwen forbidden405@outlook.com
The first supported SoC is Hi3798MV200.
Signed-off-by: Yang Xiwen forbidden405@outlook.com --- This patchset adds support for HiSTB ioconfig module. The module is used to set pins config(e.g. pull-up, pull-down, drive-strength etc..) and pinmux.
The first supported chip is Hi3798MV200. Adding support for Hi3798CV200 should be also easy.
Below is an example of the dts node:
```dts ioconfig: pinctrl@8a21000 { compatible = "hisilicon,hi3798mv200-ioconfig"; reg = <0x8a21000 0x180>; #pinctrl-cells = <1>;
emmc_default: emmc-default-state { cdata-pins { // CDATA0-7 pins = "W20", "V20", "U20", "V19", "Y21", "W21", "V21", "U21"; bias-pullup; slew-rate = <1>;
drive-strength = <8>; function = "emmc_cdata"; };
cclk-pin { pins = "T18";
bias-pullup; slew-rate = <1>;
drive-strength = <8>; function = "emmc_cclk"; };
ccmd-pin { pins = "T20";
bias-pullup; slew-rate = <1>;
drive-strength = <6>; function = "emmc_ccmd"; };
reset-pin { pins = "R20";
bias-disable; slew-rate = <1>;
drive-strength = <1>; function = "emmc_rst"; };
datastrobe-pin { pins = "R21";
bias-pullup; slew-rate;
drive-strength = <1>; function = "emmc_datastrobe"; }; }; }; ``` --- drivers/pinctrl/Kconfig | 1 + drivers/pinctrl/Makefile | 1 + drivers/pinctrl/hisilicon/Kconfig | 21 ++ drivers/pinctrl/hisilicon/Makefile | 6 + drivers/pinctrl/hisilicon/pinctrl-hi3798mv2x.c | 319 +++++++++++++++++++++++++ drivers/pinctrl/hisilicon/pinctrl-histb.c | 276 +++++++++++++++++++++ drivers/pinctrl/hisilicon/pinctrl-histb.h | 132 ++++++++++ 7 files changed, 756 insertions(+)
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index a1d53cfbdb..d600a30492 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig @@ -346,6 +346,7 @@ endif
source "drivers/pinctrl/broadcom/Kconfig" source "drivers/pinctrl/exynos/Kconfig" +source "drivers/pinctrl/hisilicon/Kconfig" source "drivers/pinctrl/intel/Kconfig" source "drivers/pinctrl/mediatek/Kconfig" source "drivers/pinctrl/meson/Kconfig" diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index 0e929d8ca0..79fb800faf 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile @@ -36,3 +36,4 @@ obj-$(CONFIG_$(SPL_)PINCTRL_STMFX) += pinctrl-stmfx.o obj-y += broadcom/ obj-$(CONFIG_PINCTRL_ZYNQMP) += pinctrl-zynqmp.o obj-$(CONFIG_PINCTRL_STARFIVE) += starfive/ +obj-$(CONFIG_PINCTRL_HISILICON) += hisilicon/ diff --git a/drivers/pinctrl/hisilicon/Kconfig b/drivers/pinctrl/hisilicon/Kconfig new file mode 100644 index 0000000000..33c3048940 --- /dev/null +++ b/drivers/pinctrl/hisilicon/Kconfig @@ -0,0 +1,21 @@ +config PINCTRL_HISILICON + bool + +config PINCTRL_HISTB + bool "HiSilicon HiSTB pinctrl framework" + depends on PINCTRL + select PINCTRL_HISILICON + imply PINCONF + help + Support HiSTB SoCs IOCONFIG module + +menu "HiSTB pinctrl drivers" + depends on PINCTRL_HISTB + +config PINCTRL_HI3798MV2X + bool "HiSilicon Hi3798MV2X pinctrl driver" + depends on ARCH_HI3798MV2X + help + Support IOCONFIG on Hi3798MV2X SoCs + +endmenu diff --git a/drivers/pinctrl/hisilicon/Makefile b/drivers/pinctrl/hisilicon/Makefile new file mode 100644 index 0000000000..5afb64d4b6 --- /dev/null +++ b/drivers/pinctrl/hisilicon/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright 2024 (r) Yang Xiwen forbidden405@foxmail.com + +obj-$(CONFIG_PINCTRL_HISTB) += pinctrl-histb.o +obj-$(CONFIG_PINCTRL_HI3798MV2X) += pinctrl-hi3798mv2x.o diff --git a/drivers/pinctrl/hisilicon/pinctrl-hi3798mv2x.c b/drivers/pinctrl/hisilicon/pinctrl-hi3798mv2x.c new file mode 100644 index 0000000000..1e0a89675a --- /dev/null +++ b/drivers/pinctrl/hisilicon/pinctrl-hi3798mv2x.c @@ -0,0 +1,319 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * IOCONFIG driver for Hi3798MV2x SoCs + * + * Copyright 2024 (r) Yang Xiwen forbidden405@outlook.com + */ + +#include <dm/device.h> + +#include "pinctrl-histb.h" + +// The sequence is important! +enum hi3798mv2x_ioconfig_pins { + HI3798MV2X_Y19, + HI3798MV2X_W19, + HI3798MV2X_AA20, + HI3798MV2X_Y20, + HI3798MV2X_V19, + HI3798MV2X_Y21, + HI3798MV2X_W20, + HI3798MV2X_W21, + HI3798MV2X_V20, + HI3798MV2X_V21, + HI3798MV2X_U20, + HI3798MV2X_U21, + HI3798MV2X_T18, + HI3798MV2X_T19, + HI3798MV2X_T20, + HI3798MV2X_R20, + HI3798MV2X_R21, + HI3798MV2X_P20, + HI3798MV2X_R19, + HI3798MV2X_K18, + HI3798MV2X_J17, + HI3798MV2X_J18, + HI3798MV2X_H17, + HI3798MV2X_H18, + HI3798MV2X_K20, + HI3798MV2X_K19, + HI3798MV2X_J20, + HI3798MV2X_J19, + HI3798MV2X_H21, + HI3798MV2X_H20, + HI3798MV2X_H19, + HI3798MV2X_G20, + HI3798MV2X_G19, + HI3798MV2X_F21, + HI3798MV2X_F20, + HI3798MV2X_F19, + HI3798MV2X_E20, + HI3798MV2X_E19, + HI3798MV2X_D21, + HI3798MV2X_E18, + HI3798MV2X_C20, + HI3798MV2X_D19, + HI3798MV2X_B21, + HI3798MV2X_B18, + HI3798MV2X_C17, + HI3798MV2X_B17, + HI3798MV2X_A17, + HI3798MV2X_C16, + HI3798MV2X_B16, + HI3798MV2X_B4, + HI3798MV2X_C4, + HI3798MV2X_A3, + HI3798MV2X_B3, + HI3798MV2X_A2, + HI3798MV2X_B2, + HI3798MV2X_A6, + HI3798MV2X_C6, + HI3798MV2X_C5, + HI3798MV2X_C3, + HI3798MV2X_D4, + HI3798MV2X_D3, + HI3798MV2X_B1, + HI3798MV2X_C2, + HI3798MV2X_C1, + HI3798MV2X_A5, + HI3798MV2X_D5, +}; + +/* incomplete (yet) */ +static const struct histb_pin_function_desc hi3798mv2x_pin_funcs[] = { + HISTB_PIN_FUNC(0, "emmc_cdata", ((struct histb_pin_func_setup_entry[]){ + { HI3798MV2X_V19, 0x2 }, { HI3798MV2X_Y21, 0x2 }, { HI3798MV2X_W20, 0x2 }, + { HI3798MV2X_W21, 0x2 }, { HI3798MV2X_V20, 0x2 }, { HI3798MV2X_V21, 0x2 }, + { HI3798MV2X_U20, 0x2 }, { HI3798MV2X_U21, 0x2 }, })), + HISTB_PIN_FUNC(1, "emmc_cclk", + ((struct histb_pin_func_setup_entry[]){ { HI3798MV2X_T18, 0x2 } })), + HISTB_PIN_FUNC(2, "emmc_ccmd", + ((struct histb_pin_func_setup_entry[]){ { HI3798MV2X_T20, 0x2 } })), + HISTB_PIN_FUNC(3, "emmc_rst", + ((struct histb_pin_func_setup_entry[]){ { HI3798MV2X_R20, 0x2 } })), + HISTB_PIN_FUNC(4, "emmc_datastrobe", + ((struct histb_pin_func_setup_entry[]){ { HI3798MV2X_R21, 0x2 } })), +}; + +/* Frequentely used drive strength table */ +#define DRIVE_STRENGTH_TABLE_SAMPLE_A ((const u8[]){ 4, 3, 2, 1, 0 }) +#define DRIVE_STRENGTH_TABLE_SAMPLE_B ((const u8[]){ 18, 17, 16, 15, 13, 12, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1, 0 }) + +static const struct histb_pin_desc hi3798mv2x_pins[] = { + HISTB_PIN(HI3798MV2X_Y19, "Y19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO0_0", 0x0 }, { "NF_RDY", 0x1 }, { } }), + HISTB_PIN_FLAG_NOPD), + HISTB_PIN(HI3798MV2X_W19, "W19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO0_1", 0x0 }, { "NF_CSN", 0x1 }, { } }), + HISTB_PIN_FLAG_NOPD), + HISTB_PIN(HI3798MV2X_AA20, "AA20", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO0_2", 0x0 }, { "NF_DQSN", 0x1 }, { "BOOT_SEL2", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_Y20, "Y20", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]){ { "NF_DQS", 0x1 }, { } }), 0), + HISTB_PIN(HI3798MV2X_V19, "V19", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO0_4", 0x0 }, { "NF_DQ7", 0x1 }, { "EMMC_CDATA3", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_Y21, "Y21", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO0_5", 0x0 }, { "NF_DQ6", 0x1 }, { "EMMC_CDATA4", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_W20, "W20", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO0_6", 0x0 }, { "NF_DQ5", 0x1 }, { "EMMC_CDATA0", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_W21, "W21", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO0_7", 0x0 }, { "NF_DQ4", 0x1 }, { "EMMC_CDATA5", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_V20, "V20", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO1_0", 0x0 }, { "NF_DQ3", 0x1 }, { "EMMC_CDATA1", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_V21, "V21", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO1_1", 0x0 }, { "NF_DQ2", 0x1 }, { "EMMC_CDATA6", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_U20, "U20", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO1_2", 0x0 }, { "NF_DQ1", 0x1 }, { "EMMC_CDATA2", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_U21, "U21", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO1_3", 0x0 }, { "NF_DQ0", 0x1 }, { "EMMC_CDATA7", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_T18, "T18", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO1_4", 0x0 }, { "NF_WEN", 0x1 }, { "EMMC_CCLK_OUT", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_T19, "T19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]) + { { "GPIO1_5", 0x0 }, { "NF_ALE", 0x1 }, { } }), 0), + HISTB_PIN(HI3798MV2X_T20, "T20", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO1_6", 0x0 }, { "NF_CLE", 0x1 }, { "EMMC_CCMD", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_R20, "R20", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO1_7", 0x0 }, { "NF_REC", 0x1 }, { "EMMC_RST", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_R21, "R21", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]) + { { "GPIO2_0", 0x0 }, { "NF_REN", 0x1 }, { "EMMC_DATA_STROBE", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_P20, "P20", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]) + { { "PMC_CORE0", 0x0 }, { "I2C0_SDA", 0x1 }, { "GPIO2_1", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_R19, "R19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]) + { { "PMC_GPU0", 0x0 }, { "I2C0_SCL", 0x1 }, { "GPIO2_2", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_K18, "K18", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]) { { "GPIO2_3", 0x0 }, { "SATA0_PWREN", 0x1 }, + { "UART3_CTSN", 0x2 }, { "TSI0_D7", 0x3 }, { "TSI3_CLK", 0x4 }, { "SIM1_DATA", 0x5 }, { } }), 0), + HISTB_PIN(HI3798MV2X_J17, "J17", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]) + { { "GPIO2_4", 0x0 }, { "SATA0_LED_N", 0x1 }, { "UART3_RTSN", 0x2 }, { "TSI1_SYNC", 0x3 }, + { "TSI1_D1", 0x4 }, { "TSI0D6", 0x5 }, { "TSI3_VALID", 0x6 }, { "SIM1DET", 0x7 }, { } }), 0), + HISTB_PIN(HI3798MV2X_J18, "J18", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO2_5", 0x0 }, { "UART3_RXD", 0x1 }, + { "TSI1_D0", 0x2 }, { "TSIO_D5", 0x3 }, { "TSI3_D0", 0x4 }, { "SIM1_RST", 0x5 }, { } }), 0), + HISTB_PIN(HI3798MV2X_H17, "H17", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO2_6", 0x0 }, { "UART3_TXD", 0x1 }, + { "TSI1_CLK", 0x2 }, { "TSIO_D4", 0x3 }, { "TSI2_VALID", 0x4 }, { "SIM1_CLK", 0x5 }, { } }), 0), + HISTB_PIN(HI3798MV2X_H18, "H18", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO2_7", 0x0 }, { "I2C2_SDA", 0x1 }, + { "TSI1_VALID", 0x2 }, { "TSIO_D3", 0x3 }, { "TSI2_D0", 0x4 }, { "SIM1_PWREN", 0x5 }, { } }), 0), + HISTB_PIN(HI3798MV2X_K20, "K20", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "JTAG_TRSTN", 0x0 }, { "I2C2_SCL", 0x1 }, + { "SPI0_SD0", 0x2 }, { "SIM0_DATA", 0x3 }, { "GPIO3_0", 0x4 }, { } }), 0), + HISTB_PIN(HI3798MV2X_K19, "K19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "JTAG_TDI", 0x0 }, { "SPIO_CSN", 0x1 }, + { "SIM0_DET", 0x2 }, { "GPIO3_1", 0x3 }, { "UART2_CTSN", 0x4 }, { } }), 0), + HISTB_PIN(HI3798MV2X_J20, "J20", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "JTAG_TMS", 0x0 }, { "I2S_RX_BCLK", 0x1 }, + { "SPI0_SCLK", 0x2 }, { "SIM0_RST", 0x3 }, { "GPIO3_2", 0x4 }, { "UART2_TXD", 0x5 }, { } }), 0), + HISTB_PIN(HI3798MV2X_J19, "J19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "JTAG_TCK", 0x0 }, { "I2S_RX_WS", 0x1 }, + { "SPI0_SDI", 0x2 }, { "SIM0_CLK", 0x3 }, { "GPIO3_3", 0x4 }, { "UART2_RXD", 0x5 }, { } }), 0), + HISTB_PIN(HI3798MV2X_H21, "H21", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "JTAG_TDO", 0x0 }, { "I2S_RX_MCLK", 0x1 }, + { "I2S_DOUT3", 0x2 }, { "SIM0_PWREN", 0x3 }, { "GPIO3_4", 0x4 }, { "UART2_RTSN", 0x5 }, { } }), 0), + HISTB_PIN(HI3798MV2X_H20, "H20", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO3_5", 0x0 }, { "I2S_MCLK", 0x1 }, + { "I2S_DOUT2", 0x2 }, { "SF_WPN_IO2", 0x3 }, { "TSO0_SYNC", 0x4 }, { } }), HISTB_PIN_FLAG_NOPD), + HISTB_PIN(HI3798MV2X_H19, "H19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO3_6", 0x0 }, { "I2S_WS", 0x1 }, + { "I2S_DOUT1", 0x2 }, { "TSI1_SYNC", 0x3 }, { "TSI1_D1", 0x4 }, { "SF_SDI_IO1", 0x5 }, + { "TSO0_VALID", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_G20, "G20", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO3_7", 0x0 }, { "I2S_DOUT0", 0x1 }, + { "TSI1_D0", 0x3 }, { "SF_CSN", 0x5 }, { "TSO0_CLK", 0x6 }, { } }), HISTB_PIN_FLAG_NOPD), + HISTB_PIN(HI3798MV2X_G19, "G19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO4_0", 0x0 }, { "I2S_BCLK", 0x1 }, + { "I2S_WS", 0x2 }, { "TSI1_CLK", 0x3 }, { "SF_HOLDN_IO3", 0x5 }, { "TSO0_D0", 0x6 }, { } }), + HISTB_PIN_FLAG_NOPD), + HISTB_PIN(HI3798MV2X_F21, "F21", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO4_1", 0x0 }, { "I2S_DIN", 0x1 }, + { "I2S_BCLK", 0x2 }, { "TSI1_VALID", 0x3 }, { "SF_CLK", 0x5 }, { } }), 0), + HISTB_PIN(HI3798MV2X_F20, "F20", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO4_2", 0x0 }, { "SDIO1_CWPR", 0x1 }, + { "I2S_MCLK", 0x2 }, { "SF_SDO_IO0", 0x4 }, { } }), 0), + HISTB_PIN(HI3798MV2X_F19, "F19", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO4_3", 0x0 }, { "SDIO1_CARD_POWER_EN", 0x1 }, + { "I2C1_SCL", 0x3 }, { "I2S_RX_BCLK", 0x4 }, { "TSI0_D2", 0x5 }, { "TSI2_CLK", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_E20, "E20", ((const u8[]){ 18, 16, 14, 12, 5, 4, 2, 1, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO4_4", 0x0 }, { "SDIO1_CDATA1", 0x1 }, + { "I2S_RX_WS", 0x4 }, { "TSI0_D1", 0x5 }, { "I2C1_SDA", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_E19, "E19", ((const u8[]){ 18, 16, 14, 12, 5, 4, 2, 1, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO4_5", 0x0 }, { "SDIO1_CDATA0", 0x1 }, + { "TSI0_D1", 0x2 }, { "TSI0_SYNC", 0x3 }, { "I2S_RX_MCLK", 0x4 }, { "TSI0_DO", 0x5 }, + { "I2C1_SCL", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_D21, "D21", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]){ { "GPIO4_6", 0x0 }, { "SDIO1_CCLK_OUT", 0x1 }, + { "TSI0_DO", 0x3 }, { "I2S_MCLK", 0x4 }, { "TSI0_CLK", 0x5 }, { "TSI1_VALID", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_E18, "E18", ((const u8[]){ 18, 16, 14, 12, 5, 4, 2, 1, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO4_7", 0x0 }, { "SDIO1_CCMD", 0x1 }, + { "TSI0_CLK", 0x3 }, { "I2S_WS", 0x4 }, { "TSI0_VALID", 0x5 }, { "TSI1_D0", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_C20, "C20", ((const u8[]){ 18, 16, 14, 12, 5, 4, 2, 1, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO6_0", 0x0 }, { "SDIO1_CDATA3", 0x1 }, + { "TSI1_CLK", 0x2 }, { "TSI0_VALID", 0x3 }, { "I2S_DOUT0", 0x4 }, { "I2C2_SCL", 0x5 }, + { "TSI0_VALID", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_D19, "D19", ((const u8[]){ 18, 16, 14, 12, 5, 4, 2, 1, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO6_1", 0x0 }, { "SDIO1_CDATA2", 0x1 }, + { "I2C2_SCL", 0x3 }, { "I2S_BCLK", 0x4 }, { "I2C2_SDA", 0x5 }, { "TSI0_D0", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_B21, "B21", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO6_2", 0x0 }, { "SDIO1_CARD_DETECT", 0x1 }, + { "I2C2_SDA", 0x3 }, { "I2S_DIN", 0x4 }, { "TSI0_CLK", 0x6 }, { } }), 0), + HISTB_PIN(HI3798MV2X_B18, "B18", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "JTAG_SEL", 0x0 }, { "GPIO6_3", 0x1 }, { } }), 0), + HISTB_PIN(HI3798MV2X_C17, "C17", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO6_4", 0x0 }, { "SPDIF_OUT", 0x1 }, { } }), 0), + HISTB_PIN(HI3798MV2X_B17, "B17", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "HDMITX_HOTPLUG", 0x1 }, { "GPIO6_5", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_A17, "A17", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "HDMITX_SDA", 0x1 }, { "GPIO6_6", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_C16, "C16", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "HDMITX_SCL", 0x1 }, { "GPIO6_7", 0x2 }, { } }), 0), + HISTB_PIN(HI3798MV2X_B16, "B16", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "HDMITX_CEC", 0x1 }, { "GPIO7_0", 0x2 }, { } }), + HISTB_PIN_FLAG_NOPU | HISTB_PIN_FLAG_NOPD | HISTB_PIN_FLAG_NOSR), + HISTB_PIN(HI3798MV2X_B4, "B4", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO7_4", 0x0 }, { "RGMII_RXCK", 0x1 }, + { "RMII_TXD1", 0x2 }, { "SDIOO_CDATA1", 0x3 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_C4, "C4", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO7_5", 0x0 }, { "RGMII_RXDV", 0x1 }, + { "RMII_TXD0", 0x2 }, { "SDIO0_CDATA0", 0x3 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_A3, "A3", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]){ { "GPIO7_6", 0x0 }, { "RGMII_RXD0", 0x1 }, + { "RMII_TXEN", 0x2 }, { "SDIO0_CCLK_OUT", 0x3 }, { } }), 0), + HISTB_PIN(HI3798MV2X_B3, "B3", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO7_7", 0x0 }, { "RGMII_RXD1", 0x1 }, + { "RMII_RXDV", 0x2 }, { "SDIO0_CCMD", 0x3 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_A2, "A2", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO8_0", 0x0 }, { "RGMII_RXD2", 0x1 }, + { "RMII_RXD0", 0x2 }, { "SDIO0_CDATA3", 0x3 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_B2, "B2", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO8_1", 0x0 }, { "RGMII_RXD3", 0x1 }, + { "RMII_RXD1", 0x2 }, { "SDIOO_CDATA2", 0x3 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_A6, "A6", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO7_1", 0x0 }, { "RGMII_RST", 0x1 }, + { "UART3_TXD", 0x2 }, { "FE_LED_ACT", 0x3 }, { } }), 0), + HISTB_PIN(HI3798MV2X_C6, "C6", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO7_2", 0x0 }, { "RGMII_MDIO", 0x1 }, + { "UART3_RXD", 0x2 }, { "FE_LED_BASE", 0x3 }, { } }), 0), + HISTB_PIN(HI3798MV2X_C5, "C5", DRIVE_STRENGTH_TABLE_SAMPLE_A, + ((const struct histb_pin_mux_desc[]){ { "GPIO7_3", 0x0 }, { "RGMII_MDCK", 0x1 }, + { "RMII_RST", 0x2 }, { "SDIO0_CARD_DETECT", 0x3 }, { } }), 0), + HISTB_PIN(HI3798MV2X_C3, "C3", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO8_2", 0x0 }, { "RGMII_TXEN", 0x1 }, + { "BOOT_SEL0", 0x2 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_D4, "D4", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO8_3", 0x0 }, { "RGMII_TXCK", 0x1 }, + { "UART3_CTSN", 0x2 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_D3, "D3", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "GPIO8_4", 0x0 }, { "RGMII_TXD3", 0x1 }, + { "UART3_RTSN", 0x2 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_B1, "B1", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]){ { "GPIO8_5", 0x0 }, { "RGMII_TXD2", 0x1 }, + { "RMII_MDCK", 0x2 }, { "BOOT_SEL1", 0x3 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_C2, "C2", ((const u8[]){ 18, 16, 14, 12, 10, 8, 6, 4, 0 }), + ((const struct histb_pin_mux_desc[]){ { "RGMII_TXD1", 0x1 }, { "RMII_MDI0", 0x2 }, + { "SDIO0_CWPR", 0x3 }, { "GPIO8_6", 0x4 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_C1, "C1", DRIVE_STRENGTH_TABLE_SAMPLE_B, + ((const struct histb_pin_mux_desc[]){ { "RGMII_TXDO", 0x1 }, { "RMII_REFCLK", 0x2 }, + { "SDIO0_CARD_POWER_EN", 0x3 }, { "GPIO8_7", 0x4 }, { } }), HISTB_PIN_FLAG_HAS_SCHMITT), + HISTB_PIN(HI3798MV2X_A5, "A5", ((const u8 *)NULL), + ((const struct histb_pin_mux_desc[]){ { "GPIO9_0", 0x0 }, { "CLKOUT_25M", 0x1 }, { } }), 0), + HISTB_PIN(HI3798MV2X_D5, "D5", ((const u8 *)NULL), + ((const struct histb_pin_mux_desc[]){ { "PMC_CPU0", 0x0 }, { "GPIO9_1", 0x1 }, { } }), + HISTB_PIN_FLAG_NOPU | HISTB_PIN_FLAG_NOPD | HISTB_PIN_FLAG_NOSR), +}; + +static struct histb_pinctrl_priv hi3798mv2x_pinctrl_priv = { + .pins = hi3798mv2x_pins, + .funcs = hi3798mv2x_pin_funcs, + .pin_nums = ARRAY_SIZE(hi3798mv2x_pins), + .func_nums = ARRAY_SIZE(hi3798mv2x_pin_funcs), +}; + +static const struct udevice_id hi3798mv2x_pinctrl_match[] = { + { .compatible = "hisilicon,hi3798mv200-ioconfig", .data = (ulong)&hi3798mv2x_pinctrl_priv }, + { }, +}; + +U_BOOT_DRIVER(hi3798mv2x_pinctrl) = { + .name = "hi3798mv2x_pinctrl", + .id = UCLASS_PINCTRL, + .of_match = hi3798mv2x_pinctrl_match, + .of_to_plat = histb_pinctrl_of_to_plat, + .ops = &histb_pinctrl_ops, +}; diff --git a/drivers/pinctrl/hisilicon/pinctrl-histb.c b/drivers/pinctrl/hisilicon/pinctrl-histb.c new file mode 100644 index 0000000000..d0521c3459 --- /dev/null +++ b/drivers/pinctrl/hisilicon/pinctrl-histb.c @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * IOCONFIG pinctrl driver for HiSTB SoCs + * + * Copyright 2024 (r) Yang Xiwen forbidden405@outlook.com + */ + +#include <asm/io.h> +#include <dm/device.h> +#include <dm/device_compat.h> +#include <dm/device-internal.h> +#include <dm/pinctrl.h> +#include <dm/read.h> +#include <linux/bitfield.h> +#include <linux/kernel.h> +#include <linux/types.h> + +#include "pinctrl-histb.h" + +static int histb_pinctrl_get_pins_count(struct udevice *dev) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + + return priv->pin_nums; +} + +static const char *histb_pinctrl_get_pin_name(struct udevice *dev, unsigned int selector) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + + return priv->pins[selector].name; +} + +static int histb_pinctrl_get_functions_count(struct udevice *dev) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + + return priv->func_nums; +} + +static const char *histb_pinctrl_get_function_name(struct udevice *dev, unsigned int selector) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + + return priv->funcs[selector].name; +} + +static int histb_pinctrl_pinmux_set(struct udevice *dev, unsigned int pin_selector, + unsigned int func_selector) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + const struct histb_pin_function_desc *func = &priv->funcs[func_selector]; + const struct histb_pin_func_setup_entry *func_setup_tbl = func->cfg_tbl; + int i; + u32 reg; + void __iomem *pin_reg = (u32 *)priv->base + priv->pins[pin_selector].number; + bool found = false; + + for (i = 0; i < func->pins_num; i++) { + if (func_setup_tbl[i].pin_selector == pin_selector) { + reg = readl(pin_reg); + reg &= ~HISTB_PIN_FUNC_MASK; + reg |= func_setup_tbl[i].mask; + writel(reg, pin_reg); + + found = true; + break; + } + } + + if (!found) { + dev_err(dev, "Unable to set pin %d to the given function %d\n", + pin_selector, func_selector); + return -EINVAL; + } + + return 0; +} + +static const struct pinconf_param histb_pinctrl_pinconf_params[] = { + { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 }, + { "bias-pulldown", PIN_CONFIG_BIAS_PULL_DOWN, 0 }, + { "bias-pullup", PIN_CONFIG_BIAS_PULL_UP, 0 }, + { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 }, + { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 }, + { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 1 }, + { "slew-rate", PIN_CONFIG_SLEW_RATE, 1 }, +}; + +enum histb_pinctrl_bias_status { + BIAS_PULL_DOWN, + BIAS_PULL_UP, + BIAS_DISABLE, +}; + +static int histb_pinctrl_set_bias(struct udevice *dev, unsigned int selector, + enum histb_pinctrl_bias_status status) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + void __iomem *pin_reg = (u32 *)priv->base + priv->pins[selector].number; + u32 reg = readl(pin_reg); + + reg &= ~(HISTB_PIN_PULLDOWN | HISTB_PIN_PULLUP); + + switch (status) { + case BIAS_DISABLE: + break; + case BIAS_PULL_DOWN: + reg |= HISTB_PIN_PULLDOWN; + break; + case BIAS_PULL_UP: + reg |= HISTB_PIN_PULLUP; + break; + } + + writel(reg, pin_reg); + + return 0; +} + +static int histb_pinctrl_set_slew_rate(struct udevice *dev, unsigned int pin_selector, + unsigned int argument) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + void __iomem *pin_reg = (u32 *)priv->base + priv->pins[pin_selector].number; + u32 reg = readl(pin_reg); + + if (likely(argument == 1)) { + reg |= HISTB_PIN_SLEWRATE; + } else if (argument == 0) { + reg &= ~HISTB_PIN_SLEWRATE; + } else { + dev_err(dev, "slew rate argument can be only 0 or 1!\n"); + return -EINVAL; + } + + writel(reg, pin_reg); + + return 0; +} + +static int histb_pinctrl_set_schmitt(struct udevice *dev, unsigned int pin_selector, + unsigned int argument) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + void __iomem *pin_reg = (u32 *)priv->base + priv->pins[pin_selector].number; + u32 reg = readl(pin_reg); + + if (likely(argument == 0)) { + reg &= ~HISTB_PIN_SCHMITT; + } else if (argument == 1) { + reg |= HISTB_PIN_SCHMITT; + } else { + dev_err(dev, "schmitt argument can be only 0 or 1!\n"); + return -EINVAL; + } + + writel(reg, pin_reg); + + return 0; +} + +static int histb_pinctrl_set_drive_strength(struct udevice *dev, unsigned int pin_selector, + unsigned int argument) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + const u8 *drv_tbl = priv->pins[pin_selector].drv_tbl; + void __iomem *pin_reg = (u32 *)priv->base + priv->pins[pin_selector].number; + u32 reg = readl(pin_reg); + int i = -1; + + if (unlikely(argument == 0)) { + dev_err(dev, "the minimal drive strength is 1mA!\n"); + return -EINVAL; + } + + if (unlikely(!drv_tbl)) { + dev_err(dev, "pin %u does not support setting drive strength!\n", pin_selector); + return -ENOENT; + } + + // calculate the largest drive-strength that does not exceeds the given value + // if the lowest value is still too large, use that anyway + // TODO: use bsearch()? + while (drv_tbl[++i] > argument) + ; + + if (!drv_tbl[i]) + i--; + + reg &= ~HISTB_PIN_DRV_MASK; + reg |= FIELD_PREP(HISTB_PIN_DRV_MASK, i); + + debug("%s: setting drive strength of pin %s to %d\n", __func__, priv->pins[pin_selector].name, drv_tbl[i]); + writel(reg, pin_reg); + + return 0; +} + +static int histb_pinctrl_pinconf_set(struct udevice *dev, unsigned int pin_selector, + unsigned int param, unsigned int argument) +{ + switch (param) { + case PIN_CONFIG_BIAS_DISABLE: + return histb_pinctrl_set_bias(dev, pin_selector, BIAS_DISABLE); + case PIN_CONFIG_BIAS_PULL_UP: + return histb_pinctrl_set_bias(dev, pin_selector, BIAS_PULL_UP); + case PIN_CONFIG_BIAS_PULL_DOWN: + return histb_pinctrl_set_bias(dev, pin_selector, BIAS_PULL_DOWN); + case PIN_CONFIG_SLEW_RATE: + return histb_pinctrl_set_slew_rate(dev, pin_selector, argument); + case PIN_CONFIG_INPUT_SCHMITT_ENABLE: + return histb_pinctrl_set_schmitt(dev, pin_selector, argument); + case PIN_CONFIG_DRIVE_STRENGTH: + return histb_pinctrl_set_drive_strength(dev, pin_selector, argument); + } + + dev_err(dev, "can't handle given config %d\n", param); + return -EINVAL; +} + +static int histb_pinctrl_get_pin_muxing(struct udevice *dev, unsigned int selector, + char *buf, int size) +{ + struct histb_pinctrl_priv *priv = dev_get_priv(dev); + const struct histb_pin_mux_desc *desc = priv->pins[selector].func_tbl; + u32 reg = readl((u32 *)priv->base + priv->pins[selector].number); + bool found = false; + int current; + + current = FIELD_GET(HISTB_PIN_FUNC_MASK, reg); + + while (desc->name) { + if (desc->bits == current) { + strlcpy(buf, desc->name, size); + found = true; + break; + } + desc++; + } + + if (!found) { + dev_warn(dev, "unknown pinmux selected\n"); + strcpy(buf, "UNKNOWN!"); + } + + return 0; +} + +const struct pinctrl_ops histb_pinctrl_ops = { + .get_pins_count = histb_pinctrl_get_pins_count, + .get_pin_name = histb_pinctrl_get_pin_name, + .get_functions_count = histb_pinctrl_get_functions_count, + .get_function_name = histb_pinctrl_get_function_name, + .pinmux_set = histb_pinctrl_pinmux_set, + .pinconf_num_params = ARRAY_SIZE(histb_pinctrl_pinconf_params), + .pinconf_params = histb_pinctrl_pinconf_params, + .pinconf_set = histb_pinctrl_pinconf_set, + .set_state = pinctrl_generic_set_state, + .get_pin_muxing = histb_pinctrl_get_pin_muxing, +}; + +int histb_pinctrl_of_to_plat(struct udevice *dev) +{ + struct histb_pinctrl_priv *priv = (void *)dev_get_driver_data(dev); + + priv->base = dev_remap_addr(dev); + if (!priv->base) { + dev_err(dev, "failed to remap addr\n"); + return -EINVAL; + } + + dev_set_priv(dev, priv); + + return 0; +} diff --git a/drivers/pinctrl/hisilicon/pinctrl-histb.h b/drivers/pinctrl/hisilicon/pinctrl-histb.h new file mode 100644 index 0000000000..6169534139 --- /dev/null +++ b/drivers/pinctrl/hisilicon/pinctrl-histb.h @@ -0,0 +1,132 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include <dm/pinctrl.h> +#include <linux/bitops.h> + +/* per-register bit definition */ +#define HISTB_PIN_SCHMITT BIT(14) +#define HISTB_PIN_PULLDOWN BIT(13) +#define HISTB_PIN_PULLUP BIT(12) +#define HISTB_PIN_SLEWRATE BIT(8) +#define HISTB_PIN_DRV_MASK GENMASK(7, 4) +#define HISTB_PIN_FUNC_MASK GENMASK(2, 0) + +/** + * @histb_pin_desc flags + * + * @HISTB_PIN_FLAG_NOPU: This pin does not support "bias-pullup" + * @HISTB_PIN_FLAG_NOPD: This pin does not support "bias-pulldown" + * @HISTB_PIN_FLAG_NOSR: This pin does not support "slew-rate" + * @HISTB_PIN_FLAG_HAS_SCHMITT: This pin supports setting schmitt + */ +#define HISTB_PIN_FLAG_NOPU BIT(0) +#define HISTB_PIN_FLAG_NOPD BIT(1) +#define HISTB_PIN_FLAG_NOSR BIT(2) +#define HISTB_PIN_FLAG_HAS_SCHMITT BIT(3) + +/** + * histb_pin_mux_desc - a descriptor for one function of a pin. + * + * @name: the name of the function, in capital + * @bits: the bits pattern for this function + */ +struct histb_pin_mux_desc { + const char *name; + u32 bits; +}; + +/** + * histb_pin_desc - a descriptor for a pin + * + * @number: ID for this pin, also used as offset into device address space + * @name: pin name, e.g. "F17", refer to the datasheet for detail + * @drv_tbl: (Optional) drive strength table, end with 0. The index is used as bits pattern. fill + * NULL if setting drive strength is not supported. + * @func_tbl: pinmux function table, end with { }. + * @flags: pin flags (use HISTB_PIN_FLAG_* constants) + */ +struct histb_pin_desc { + unsigned int number; + const char *name; + const u8 *drv_tbl; + const struct histb_pin_mux_desc *func_tbl; + int flags; +}; + +/** + * HISTB_PIN() - a helper for initializing struct histb_pin_desc + */ +#define HISTB_PIN(_index, _name, _drv_tbl, _func_tbl, _flag) { \ + .number = _index, \ + .name = _name, \ + .drv_tbl = _drv_tbl, \ + .func_tbl = _func_tbl, \ + .flags = _flag, \ +} + +/** + * histb_pin_func_setup_entry - an entry for setting up a function for a pin + * + * @pin_selector: pin ID + * @mask: function bit pattern + */ +struct histb_pin_func_setup_entry { + unsigned int pin_selector; + u8 mask; +}; + +/** + * histb_pin_function_desc - a descriptor for a function + * + * @func_selector: function selector + * @name: function name + * @pins_num: the number of pins engaged in this function + * @cfg_tbl: config table + */ +struct histb_pin_function_desc { + unsigned int func_selector; + const char *name; + unsigned int pins_num; + const struct histb_pin_func_setup_entry *cfg_tbl; +}; + +/** + * HISTB_PIN_FUNC - a helper macro to setup a function + */ +#define HISTB_PIN_FUNC(_id, _name, _cfg) { \ + .func_selector = _id, \ + .name = _name, \ + .pins_num = ARRAY_SIZE(_cfg), \ + .cfg_tbl = _cfg, \ +} + +/** + * histb_pinctrl_priv - private data for the driver + * + * @base: device base address + * @pins: descriptor array for all pins + * @funcs: descriptor array for all functions + * @pin_nums: array size of .pins + * @func_nums: array size of .funcs + */ +struct histb_pinctrl_priv { + void __iomem *base; + const struct histb_pin_desc *pins; + const struct histb_pin_function_desc *funcs; + unsigned int pin_nums; + unsigned int func_nums; +}; + +/** + * histb_pinctrl_of_to_plat - convert device tree node to private data + * + * use this function as .of_to_plat field in the driver + */ +int histb_pinctrl_of_to_plat(struct udevice *dev); + +/** + * histb_pinctrl_ops - HiSTB pinctrl ops + * + * use this struct as .ops field in the driver + */ +extern const struct pinctrl_ops histb_pinctrl_ops;
--- base-commit: 050a9b981d6a835133521b599be3ae189ce70f41 change-id: 20240204-pinctrl-3a126ad9286e
Best regards,

On Tue, Feb 13, 2024 at 12:30:15AM +0800, Yang Xiwen via B4 Relay wrote:
From: Yang Xiwen forbidden405@outlook.com
The first supported SoC is Hi3798MV200.
Signed-off-by: Yang Xiwen forbidden405@outlook.com
This patchset adds support for HiSTB ioconfig module. The module is used to set pins config(e.g. pull-up, pull-down, drive-strength etc..) and pinmux.
The first supported chip is Hi3798MV200. Adding support for Hi3798CV200 should be also easy.
Below is an example of the dts node:
[snip]
Has this binding already been accepted to the kernel? Thanks.

On 2/13/2024 12:58 AM, Tom Rini wrote:
On Tue, Feb 13, 2024 at 12:30:15AM +0800, Yang Xiwen via B4 Relay wrote:
From: Yang Xiwen forbidden405@outlook.com
The first supported SoC is Hi3798MV200.
Signed-off-by: Yang Xiwen forbidden405@outlook.com
This patchset adds support for HiSTB ioconfig module. The module is used to set pins config(e.g. pull-up, pull-down, drive-strength etc..) and pinmux.
The first supported chip is Hi3798MV200. Adding support for Hi3798CV200 should be also easy.
Below is an example of the dts node:
[snip]
Has this binding already been accepted to the kernel? Thanks.
No, I've not wrote the driver for linux yet. That's why it is RFC now. But it is expected to be soon. I'm going to finish u-boot part first and work on linux kernel later. After that, i can sync linux dts and bindings back to u-boot.

On Tue, Feb 13, 2024 at 01:02:50AM +0800, Yang Xiwen wrote:
On 2/13/2024 12:58 AM, Tom Rini wrote:
On Tue, Feb 13, 2024 at 12:30:15AM +0800, Yang Xiwen via B4 Relay wrote:
From: Yang Xiwen forbidden405@outlook.com
The first supported SoC is Hi3798MV200.
Signed-off-by: Yang Xiwen forbidden405@outlook.com
This patchset adds support for HiSTB ioconfig module. The module is used to set pins config(e.g. pull-up, pull-down, drive-strength etc..) and pinmux.
The first supported chip is Hi3798MV200. Adding support for Hi3798CV200 should be also easy.
Below is an example of the dts node:
[snip]
Has this binding already been accepted to the kernel? Thanks.
No, I've not wrote the driver for linux yet. That's why it is RFC now. But it is expected to be soon. I'm going to finish u-boot part first and work on linux kernel later. After that, i can sync linux dts and bindings back to u-boot.
How soon before you start on the Linux side of things? Given that this wouldn't be merged for v2024.04, there's plenty of time to get that Linux side going (or at least the binding reviewed and accepted to -next or similar) before merging here, and for U-Boot the biggest feedback (aside from anything checkpatch.pl may say) would be to get the binding reviewed.

On 2/13/2024 1:08 AM, Tom Rini wrote:
On Tue, Feb 13, 2024 at 01:02:50AM +0800, Yang Xiwen wrote:
On 2/13/2024 12:58 AM, Tom Rini wrote:
On Tue, Feb 13, 2024 at 12:30:15AM +0800, Yang Xiwen via B4 Relay wrote:
From: Yang Xiwen forbidden405@outlook.com
The first supported SoC is Hi3798MV200.
Signed-off-by: Yang Xiwen forbidden405@outlook.com
This patchset adds support for HiSTB ioconfig module. The module is used to set pins config(e.g. pull-up, pull-down, drive-strength etc..) and pinmux.
The first supported chip is Hi3798MV200. Adding support for Hi3798CV200 should be also easy.
Below is an example of the dts node:
[snip]
Has this binding already been accepted to the kernel? Thanks.
No, I've not wrote the driver for linux yet. That's why it is RFC now. But it is expected to be soon. I'm going to finish u-boot part first and work on linux kernel later. After that, i can sync linux dts and bindings back to u-boot.
How soon before you start on the Linux side of things? Given that this wouldn't be merged for v2024.04, there's plenty of time to get that Linux side going (or at least the binding reviewed and accepted to -next or similar) before merging here, and for U-Boot the biggest feedback (aside from anything checkpatch.pl may say) would be to get the binding reviewed.
Sadly, it's not on my urgent list, since we only need to setup pinctrl stuff once during boot. Not even this SoC(Hi3798MV200) is supported in mainline Linux yet. I'm keeping working on this, but I really can't say how soon i can start working on Linux side. Though I can say it's not going to be very soon if i'm the only one who is working on this platform.
Maybe Jorge and Igor can join and speed up the process. Since Hi3798CV200 is supported by mainline(This SoC is used by 96boards poplar), writing a pinctrl driver for that SoC would receive more comments and reviews.
participants (3)
-
Tom Rini
-
Yang Xiwen
-
Yang Xiwen via B4 Relay