| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * Copyright (C) 2019 MediaTek Inc. All Rights Reserved.
- *
- * Author: Weijie Gao <weijie.gao@mediatek.com>
- */
- #include <common.h>
- #include <dm.h>
- #include <asm/global_data.h>
- #include <dm/pinctrl.h>
- #include <linux/bitops.h>
- #include <linux/io.h>
- #include "pinctrl-mtmips-common.h"
- DECLARE_GLOBAL_DATA_PTR;
- #define AGPIO_OFS 0
- #define GPIOMODE1_OFS 0x24
- #define GPIOMODE2_OFS 0x28
- #define EPHY4_1_PAD_SHIFT 17
- #define EPHY4_1_PAD_MASK 0x0f
- #define EPHY0_SHIFT 16
- #define RF_OLT_MODE_SHIFT 12
- #define N9_EINT_SRC_SHIFT 9
- #define WLED_OD_SHIFT 8
- #define REF_CLKO_PAD_SHIFT 4
- #define I2S_CLK_PAD_SHIFT 3
- #define I2S_WS_PAD_SHIFT 2
- #define I2S_SDO_PAD_SHIFT 1
- #define I2S_SDI_PAD_SHIFT 0
- #define GM4_MASK 3
- #define P4LED_K_SHIFT 26
- #define P3LED_K_SHIFT 24
- #define P2LED_K_SHIFT 22
- #define P1LED_K_SHIFT 20
- #define P0LED_K_SHIFT 18
- #define WLED_K_SHIFT 16
- #define P4LED_A_SHIFT 10
- #define P3LED_A_SHIFT 8
- #define P2LED_A_SHIFT 6
- #define P1LED_A_SHIFT 4
- #define P0LED_A_SHIFT 2
- #define WLED_A_SHIFT 0
- #define PWM1_SHIFT 30
- #define PWM0_SHIFT 28
- #define UART2_SHIFT 26
- #define UART1_SHIFT 24
- #define I2C_SHIFT 20
- #define REFCLK_SHIFT 18
- #define PERST_SHIFT 16
- #define ESD_SHIFT 15
- #define WDT_SHIFT 14
- #define SPI_SHIFT 12
- #define SDMODE_SHIFT 10
- #define UART0_SHIFT 8
- #define I2S_SHIFT 6
- #define SPI_CS1_SHIFT 4
- #define SPIS_SHIFT 2
- #define GPIO0_SHIFT 0
- #define PAD_PU_G0_REG 0x00
- #define PAD_PU_G1_REG 0x04
- #define PAD_PD_G0_REG 0x10
- #define PAD_PD_G1_REG 0x14
- #define PAD_SR_G0_REG 0x20
- #define PAD_SR_G1_REG 0x24
- #define PAD_SMT_G0_REG 0x30
- #define PAD_SMT_G1_REG 0x34
- #define PAD_E2_G0_REG 0x40
- #define PAD_E2_G1_REG 0x44
- #define PAD_E4_G0_REG 0x50
- #define PAD_E4_G1_REG 0x54
- #define PAD_E8_G0_REG 0x60
- #define PAD_E8_G1_REG 0x64
- #define PIN_CONFIG_DRIVE_STRENGTH_28 (PIN_CONFIG_END + 1)
- #define PIN_CONFIG_DRIVE_STRENGTH_4G (PIN_CONFIG_END + 2)
- struct mt7628_pinctrl_priv {
- struct mtmips_pinctrl_priv mp;
- void __iomem *pcbase;
- };
- #if CONFIG_IS_ENABLED(PINMUX)
- static const struct mtmips_pmx_func ephy4_1_pad_grp[] = {
- FUNC("digital", 0xf),
- FUNC("analog", 0),
- };
- static const struct mtmips_pmx_func ephy0_grp[] = {
- FUNC("disable", 1),
- FUNC("enable", 0),
- };
- static const struct mtmips_pmx_func rf_olt_grp[] = {
- FUNC("enable", 1),
- FUNC("disable", 0),
- };
- static const struct mtmips_pmx_func n9_eint_src_grp[] = {
- FUNC("gpio", 1),
- FUNC("utif", 0),
- };
- static const struct mtmips_pmx_func wlen_od_grp[] = {
- FUNC("enable", 1),
- FUNC("disable", 0),
- };
- static const struct mtmips_pmx_func ref_clko_grp[] = {
- FUNC("digital", 1),
- FUNC("analog", 0),
- };
- static const struct mtmips_pmx_func i2s_clk_grp[] = {
- FUNC("digital", 1),
- FUNC("analog", 0),
- };
- static const struct mtmips_pmx_func i2s_ws_grp[] = {
- FUNC("digital", 1),
- FUNC("analog", 0),
- };
- static const struct mtmips_pmx_func i2s_sdo_grp[] = {
- FUNC("digital", 1),
- FUNC("analog", 0),
- };
- static const struct mtmips_pmx_func i2s_sdi_grp[] = {
- FUNC("digital", 1),
- FUNC("analog", 0),
- };
- static const struct mtmips_pmx_func pwm1_grp[] = {
- FUNC("sdxc d6", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("pwm1", 0),
- };
- static const struct mtmips_pmx_func pwm0_grp[] = {
- FUNC("sdxc d7", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("pwm0", 0),
- };
- static const struct mtmips_pmx_func uart2_grp[] = {
- FUNC("sdxc d5 d4", 3),
- FUNC("pwm", 2),
- FUNC("gpio", 1),
- FUNC("uart2", 0),
- };
- static const struct mtmips_pmx_func uart1_grp[] = {
- FUNC("sw_r", 3),
- FUNC("pwm", 2),
- FUNC("gpio", 1),
- FUNC("uart1", 0),
- };
- static const struct mtmips_pmx_func i2c_grp[] = {
- FUNC("-", 3),
- FUNC("debug", 2),
- FUNC("gpio", 1),
- FUNC("i2c", 0),
- };
- static const struct mtmips_pmx_func refclk_grp[] = {
- FUNC("gpio", 1),
- FUNC("refclk", 0),
- };
- static const struct mtmips_pmx_func perst_grp[] = {
- FUNC("gpio", 1),
- FUNC("perst", 0),
- };
- static const struct mtmips_pmx_func esd_grp[] = {
- FUNC("router", 1),
- FUNC("iot", 0),
- };
- static const struct mtmips_pmx_func wdt_grp[] = {
- FUNC("gpio", 1),
- FUNC("wdt", 0),
- };
- static const struct mtmips_pmx_func spi_grp[] = {
- FUNC("gpio", 1),
- FUNC("spi", 0),
- };
- static const struct mtmips_pmx_func sd_mode_grp[] = {
- FUNC("n9 jtag", 3),
- FUNC("utif1", 2),
- FUNC("gpio", 1),
- FUNC("sdxc", 0),
- };
- static const struct mtmips_pmx_func uart0_grp[] = {
- FUNC("-", 3),
- FUNC("-", 2),
- FUNC("gpio", 1),
- FUNC("uart0", 0),
- };
- static const struct mtmips_pmx_func i2s_grp[] = {
- FUNC("antenna", 3),
- FUNC("pcm", 2),
- FUNC("gpio", 1),
- FUNC("i2s", 0),
- };
- static const struct mtmips_pmx_func spi_cs1_grp[] = {
- FUNC("-", 3),
- FUNC("refclk", 2),
- FUNC("gpio", 1),
- FUNC("spi cs1", 0),
- };
- static const struct mtmips_pmx_func spis_grp[] = {
- FUNC("pwm_uart2", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("spis", 0),
- };
- static const struct mtmips_pmx_func gpio0_grp[] = {
- FUNC("perst", 3),
- FUNC("refclk", 2),
- FUNC("gpio", 1),
- FUNC("gpio0", 0),
- };
- static const struct mtmips_pmx_func wled_a_grp[] = {
- FUNC("-", 3),
- FUNC("-", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p0led_a_grp[] = {
- FUNC("jtag", 3),
- FUNC("rsvd", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p1led_a_grp[] = {
- FUNC("jtag", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p2led_a_grp[] = {
- FUNC("jtag", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p3led_a_grp[] = {
- FUNC("jtag", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p4led_a_grp[] = {
- FUNC("jtag", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func wled_k_grp[] = {
- FUNC("-", 3),
- FUNC("-", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p0led_k_grp[] = {
- FUNC("jtag", 3),
- FUNC("rsvd", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p1led_k_grp[] = {
- FUNC("jtag", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p2led_k_grp[] = {
- FUNC("jtag", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p3led_k_grp[] = {
- FUNC("jtag", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_func p4led_k_grp[] = {
- FUNC("jtag", 3),
- FUNC("utif", 2),
- FUNC("gpio", 1),
- FUNC("led", 0),
- };
- static const struct mtmips_pmx_group mt7628_pinmux_data[] = {
- GRP("ephy4_1_pad", ephy4_1_pad_grp, AGPIO_OFS, EPHY4_1_PAD_SHIFT,
- EPHY4_1_PAD_MASK),
- GRP("ephy0", ephy0_grp, AGPIO_OFS, EPHY0_SHIFT, 1),
- GRP("rf_olt", rf_olt_grp, AGPIO_OFS, RF_OLT_MODE_SHIFT, 1),
- GRP("n9_eint_src", n9_eint_src_grp, AGPIO_OFS, N9_EINT_SRC_SHIFT, 1),
- GRP("wlen_od", wlen_od_grp, AGPIO_OFS, WLED_OD_SHIFT, 1),
- GRP("ref_clko_pad", ref_clko_grp, AGPIO_OFS, REF_CLKO_PAD_SHIFT, 1),
- GRP("i2s_clk_pad", i2s_clk_grp, AGPIO_OFS, I2S_CLK_PAD_SHIFT, 1),
- GRP("i2s_ws_pad", i2s_ws_grp, AGPIO_OFS, I2S_WS_PAD_SHIFT, 1),
- GRP("i2s_sdo_pad", i2s_sdo_grp, AGPIO_OFS, I2S_SDO_PAD_SHIFT, 1),
- GRP("i2s_sdi_pad", i2s_sdi_grp, AGPIO_OFS, I2S_SDI_PAD_SHIFT, 1),
- GRP("pwm1", pwm1_grp, GPIOMODE1_OFS, PWM1_SHIFT, GM4_MASK),
- GRP("pwm0", pwm0_grp, GPIOMODE1_OFS, PWM0_SHIFT, GM4_MASK),
- GRP("uart2", uart2_grp, GPIOMODE1_OFS, UART2_SHIFT, GM4_MASK),
- GRP("uart1", uart1_grp, GPIOMODE1_OFS, UART1_SHIFT, GM4_MASK),
- GRP("i2c", i2c_grp, GPIOMODE1_OFS, I2C_SHIFT, GM4_MASK),
- GRP("refclk", refclk_grp, GPIOMODE1_OFS, REFCLK_SHIFT, 1),
- GRP("perst", perst_grp, GPIOMODE1_OFS, PERST_SHIFT, 1),
- GRP("sd router", esd_grp, GPIOMODE1_OFS, ESD_SHIFT, 1),
- GRP("wdt", wdt_grp, GPIOMODE1_OFS, WDT_SHIFT, 1),
- GRP("spi", spi_grp, GPIOMODE1_OFS, SPI_SHIFT, 1),
- GRP("sdmode", sd_mode_grp, GPIOMODE1_OFS, SDMODE_SHIFT, GM4_MASK),
- GRP("uart0", uart0_grp, GPIOMODE1_OFS, UART0_SHIFT, GM4_MASK),
- GRP("i2s", i2s_grp, GPIOMODE1_OFS, I2S_SHIFT, GM4_MASK),
- GRP("spi cs1", spi_cs1_grp, GPIOMODE1_OFS, SPI_CS1_SHIFT, GM4_MASK),
- GRP("spis", spis_grp, GPIOMODE1_OFS, SPIS_SHIFT, GM4_MASK),
- GRP("gpio0", gpio0_grp, GPIOMODE1_OFS, GPIO0_SHIFT, GM4_MASK),
- GRP("wled_a", wled_a_grp, GPIOMODE2_OFS, WLED_A_SHIFT, GM4_MASK),
- GRP("p0led_a", p0led_a_grp, GPIOMODE2_OFS, P0LED_A_SHIFT, GM4_MASK),
- GRP("p1led_a", p1led_a_grp, GPIOMODE2_OFS, P1LED_A_SHIFT, GM4_MASK),
- GRP("p2led_a", p2led_a_grp, GPIOMODE2_OFS, P2LED_A_SHIFT, GM4_MASK),
- GRP("p3led_a", p3led_a_grp, GPIOMODE2_OFS, P3LED_A_SHIFT, GM4_MASK),
- GRP("p4led_a", p4led_a_grp, GPIOMODE2_OFS, P4LED_A_SHIFT, GM4_MASK),
- GRP("wled_k", wled_k_grp, GPIOMODE2_OFS, WLED_K_SHIFT, GM4_MASK),
- GRP("p0led_k", p0led_k_grp, GPIOMODE2_OFS, P0LED_K_SHIFT, GM4_MASK),
- GRP("p1led_k", p1led_k_grp, GPIOMODE2_OFS, P1LED_K_SHIFT, GM4_MASK),
- GRP("p2led_k", p2led_k_grp, GPIOMODE2_OFS, P2LED_K_SHIFT, GM4_MASK),
- GRP("p3led_k", p3led_k_grp, GPIOMODE2_OFS, P3LED_K_SHIFT, GM4_MASK),
- GRP("p4led_k", p4led_k_grp, GPIOMODE2_OFS, P4LED_K_SHIFT, GM4_MASK),
- };
- static int mt7628_get_groups_count(struct udevice *dev)
- {
- return ARRAY_SIZE(mt7628_pinmux_data);
- }
- static const char *mt7628_get_group_name(struct udevice *dev,
- unsigned int selector)
- {
- return mt7628_pinmux_data[selector].name;
- }
- #endif /* CONFIG_IS_ENABLED(PINMUX) */
- #if CONFIG_IS_ENABLED(PINCONF)
- static const struct pinconf_param mt7628_conf_params[] = {
- { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
- { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
- { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
- { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
- { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
- { "drive-strength-28", PIN_CONFIG_DRIVE_STRENGTH_28, 0 },
- { "drive-strength-4g", PIN_CONFIG_DRIVE_STRENGTH_4G, 0 },
- { "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
- };
- static const char *const mt7628_pins[] = {
- "i2s_sdi",
- "i2s_sdo",
- "i2s_ws",
- "i2s_clk",
- "i2s_sclk",
- "i2c_sd",
- "spi_cs1",
- "spi_clk",
- "spi_mosi",
- "spi_miso",
- "spi_cs0",
- "gpio0",
- "uart0_txd",
- "uart0_rxd",
- "spis_cs",
- "spis_clk",
- "spis_miso",
- "spis_mosi",
- "pwm_ch0",
- "pwm_ch1",
- "uart2_txd",
- "uart2_rxd",
- "sd_wp",
- "sd_cd",
- "sd_d1",
- "sd_d0",
- "sd_clk",
- "sd_cmd",
- "sd_d3",
- "sd_d2",
- "ephy_led4_k",
- "ephy_led3_k",
- "ephy_led2_k",
- "ephy_led1_k",
- "ephy_led0_k",
- "wled_k",
- "perst_n",
- "co_clko",
- "wdt",
- "ephy_led4_a",
- "ephy_led3_a",
- "ephy_led2_a",
- "ephy_led1_a",
- "ephy_led0_a",
- "wled_a",
- "uart1_txd",
- "uart1_rxd",
- };
- static const u32 mt7628_drv_strength_28_tbl[] = {2, 4, 6, 8};
- static const u32 mt7628_drv_strength_4g_tbl[] = {4, 8, 12, 16};
- static int mt7628_set_drv_strength(void __iomem *base, u32 val, u32 bit,
- const u32 tbl[], u32 reg_lo, u32 reg_hi)
- {
- int i;
- for (i = 0; i < 4; i++)
- if (tbl[i] == val)
- break;
- if (i >= 4)
- return -EINVAL;
- clrsetbits_32(base + reg_lo, BIT(bit), (i & 1) << bit);
- clrsetbits_32(base + reg_hi, BIT(bit), ((i >> 1) & 1) << bit);
- return 0;
- }
- static int mt7628_get_pins_count(struct udevice *dev)
- {
- return ARRAY_SIZE(mt7628_pins);
- }
- static const char *mt7628_get_pin_name(struct udevice *dev,
- unsigned int selector)
- {
- return mt7628_pins[selector];
- }
- static int mt7628_pinconf_set(struct udevice *dev, unsigned int pin_selector,
- unsigned int param, unsigned int argument)
- {
- struct mt7628_pinctrl_priv *priv = dev_get_priv(dev);
- u32 offs, bit;
- int ret = 0;
- offs = (pin_selector / 32) * 4;
- bit = pin_selector % 32;
- switch (param) {
- case PIN_CONFIG_BIAS_DISABLE:
- clrbits_32(priv->pcbase + offs + PAD_PU_G0_REG, BIT(bit));
- clrbits_32(priv->pcbase + offs + PAD_PD_G0_REG, BIT(bit));
- break;
- case PIN_CONFIG_BIAS_PULL_UP:
- setbits_32(priv->pcbase + offs + PAD_PU_G0_REG, BIT(bit));
- clrbits_32(priv->pcbase + offs + PAD_PD_G0_REG, BIT(bit));
- break;
- case PIN_CONFIG_BIAS_PULL_DOWN:
- clrbits_32(priv->pcbase + offs + PAD_PU_G0_REG, BIT(bit));
- setbits_32(priv->pcbase + offs + PAD_PD_G0_REG, BIT(bit));
- break;
- case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
- clrsetbits_32(priv->pcbase + offs + PAD_SMT_G0_REG,
- BIT(bit), (!!argument) << bit);
- break;
- case PIN_CONFIG_DRIVE_STRENGTH_28:
- ret = mt7628_set_drv_strength(priv->pcbase + offs, argument,
- bit, mt7628_drv_strength_28_tbl,
- PAD_E2_G0_REG, PAD_E4_G0_REG);
- break;
- case PIN_CONFIG_DRIVE_STRENGTH_4G:
- ret = mt7628_set_drv_strength(priv->pcbase + offs, argument,
- bit, mt7628_drv_strength_4g_tbl,
- PAD_E4_G0_REG, PAD_E8_G0_REG);
- break;
- case PIN_CONFIG_SLEW_RATE:
- clrsetbits_32(priv->pcbase + offs + PAD_SR_G0_REG,
- BIT(bit), (!!argument) << bit);
- break;
- default:
- ret = -EINVAL;
- }
- return ret;
- }
- #endif
- static int mt7628_pinctrl_probe(struct udevice *dev)
- {
- struct mt7628_pinctrl_priv *priv = dev_get_priv(dev);
- int ret = 0;
- #if CONFIG_IS_ENABLED(PINMUX)
- ret = mtmips_pinctrl_probe(&priv->mp, ARRAY_SIZE(mt7628_pinmux_data),
- mt7628_pinmux_data);
- #endif /* CONFIG_IS_ENABLED(PINMUX) */
- return ret;
- }
- static int mt7628_pinctrl_of_to_plat(struct udevice *dev)
- {
- struct mt7628_pinctrl_priv *priv = dev_get_priv(dev);
- priv->mp.base = (void __iomem *)dev_remap_addr_index(dev, 0);
- if (!priv->mp.base)
- return -EINVAL;
- priv->pcbase = (void __iomem *)dev_remap_addr_index(dev, 1);
- if (!priv->pcbase)
- return -EINVAL;
- return 0;
- }
- static const struct pinctrl_ops mt7628_pinctrl_ops = {
- #if CONFIG_IS_ENABLED(PINMUX)
- .get_groups_count = mt7628_get_groups_count,
- .get_group_name = mt7628_get_group_name,
- .get_functions_count = mtmips_get_functions_count,
- .get_function_name = mtmips_get_function_name,
- .pinmux_group_set = mtmips_pinmux_group_set,
- #endif /* CONFIG_IS_ENABLED(PINMUX) */
- #if CONFIG_IS_ENABLED(PINCONF)
- .pinconf_num_params = ARRAY_SIZE(mt7628_conf_params),
- .pinconf_params = mt7628_conf_params,
- .get_pins_count = mt7628_get_pins_count,
- .get_pin_name = mt7628_get_pin_name,
- .pinconf_set = mt7628_pinconf_set,
- #endif /* CONFIG_IS_ENABLED(PINCONF) */
- .set_state = pinctrl_generic_set_state,
- };
- static const struct udevice_id mt7628_pinctrl_ids[] = {
- { .compatible = "mediatek,mt7628-pinctrl" },
- { }
- };
- U_BOOT_DRIVER(mt7628_pinctrl) = {
- .name = "mt7628-pinctrl",
- .id = UCLASS_PINCTRL,
- .of_match = mt7628_pinctrl_ids,
- .of_to_plat = mt7628_pinctrl_of_to_plat,
- .ops = &mt7628_pinctrl_ops,
- .probe = mt7628_pinctrl_probe,
- .priv_auto = sizeof(struct mt7628_pinctrl_priv),
- };
|