|
1 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | 2 | /* |
3 | 3 | * Pinctrl driver for Rockchip SoCs |
4 | | - * |
| 4 | + * Copyright (c) 2020-2024 Rockchip Electronics Co., Ltd. |
5 | 5 | * Copyright (c) 2013 MundoReader S.L. |
6 | 6 | * Author: Heiko Stuebner <[email protected]> |
7 | 7 | * |
@@ -2003,6 +2003,151 @@ static int rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, |
2003 | 2003 | return 0; |
2004 | 2004 | } |
2005 | 2005 |
|
| 2006 | +#define RK3562_DRV_BITS_PER_PIN 8 |
| 2007 | +#define RK3562_DRV_PINS_PER_REG 2 |
| 2008 | +#define RK3562_DRV_GPIO0_OFFSET 0x20070 |
| 2009 | +#define RK3562_DRV_GPIO1_OFFSET 0x200 |
| 2010 | +#define RK3562_DRV_GPIO2_OFFSET 0x240 |
| 2011 | +#define RK3562_DRV_GPIO3_OFFSET 0x10280 |
| 2012 | +#define RK3562_DRV_GPIO4_OFFSET 0x102C0 |
| 2013 | + |
| 2014 | +static int rk3562_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, |
| 2015 | + int pin_num, struct regmap **regmap, |
| 2016 | + int *reg, u8 *bit) |
| 2017 | +{ |
| 2018 | + struct rockchip_pinctrl *info = bank->drvdata; |
| 2019 | + |
| 2020 | + *regmap = info->regmap_base; |
| 2021 | + switch (bank->bank_num) { |
| 2022 | + case 0: |
| 2023 | + *reg = RK3562_DRV_GPIO0_OFFSET; |
| 2024 | + break; |
| 2025 | + |
| 2026 | + case 1: |
| 2027 | + *reg = RK3562_DRV_GPIO1_OFFSET; |
| 2028 | + break; |
| 2029 | + |
| 2030 | + case 2: |
| 2031 | + *reg = RK3562_DRV_GPIO2_OFFSET; |
| 2032 | + break; |
| 2033 | + |
| 2034 | + case 3: |
| 2035 | + *reg = RK3562_DRV_GPIO3_OFFSET; |
| 2036 | + break; |
| 2037 | + |
| 2038 | + case 4: |
| 2039 | + *reg = RK3562_DRV_GPIO4_OFFSET; |
| 2040 | + break; |
| 2041 | + |
| 2042 | + default: |
| 2043 | + dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num); |
| 2044 | + break; |
| 2045 | + } |
| 2046 | + |
| 2047 | + *reg += ((pin_num / RK3562_DRV_PINS_PER_REG) * 4); |
| 2048 | + *bit = pin_num % RK3562_DRV_PINS_PER_REG; |
| 2049 | + *bit *= RK3562_DRV_BITS_PER_PIN; |
| 2050 | + |
| 2051 | + return 0; |
| 2052 | +} |
| 2053 | + |
| 2054 | +#define RK3562_PULL_BITS_PER_PIN 2 |
| 2055 | +#define RK3562_PULL_PINS_PER_REG 8 |
| 2056 | +#define RK3562_PULL_GPIO0_OFFSET 0x20020 |
| 2057 | +#define RK3562_PULL_GPIO1_OFFSET 0x80 |
| 2058 | +#define RK3562_PULL_GPIO2_OFFSET 0x90 |
| 2059 | +#define RK3562_PULL_GPIO3_OFFSET 0x100A0 |
| 2060 | +#define RK3562_PULL_GPIO4_OFFSET 0x100B0 |
| 2061 | + |
| 2062 | +static int rk3562_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, |
| 2063 | + int pin_num, struct regmap **regmap, |
| 2064 | + int *reg, u8 *bit) |
| 2065 | +{ |
| 2066 | + struct rockchip_pinctrl *info = bank->drvdata; |
| 2067 | + |
| 2068 | + *regmap = info->regmap_base; |
| 2069 | + switch (bank->bank_num) { |
| 2070 | + case 0: |
| 2071 | + *reg = RK3562_PULL_GPIO0_OFFSET; |
| 2072 | + break; |
| 2073 | + |
| 2074 | + case 1: |
| 2075 | + *reg = RK3562_PULL_GPIO1_OFFSET; |
| 2076 | + break; |
| 2077 | + |
| 2078 | + case 2: |
| 2079 | + *reg = RK3562_PULL_GPIO2_OFFSET; |
| 2080 | + break; |
| 2081 | + |
| 2082 | + case 3: |
| 2083 | + *reg = RK3562_PULL_GPIO3_OFFSET; |
| 2084 | + break; |
| 2085 | + |
| 2086 | + case 4: |
| 2087 | + *reg = RK3562_PULL_GPIO4_OFFSET; |
| 2088 | + break; |
| 2089 | + |
| 2090 | + default: |
| 2091 | + dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num); |
| 2092 | + break; |
| 2093 | + } |
| 2094 | + |
| 2095 | + *reg += ((pin_num / RK3562_PULL_PINS_PER_REG) * 4); |
| 2096 | + *bit = pin_num % RK3562_PULL_PINS_PER_REG; |
| 2097 | + *bit *= RK3562_PULL_BITS_PER_PIN; |
| 2098 | + |
| 2099 | + return 0; |
| 2100 | +} |
| 2101 | + |
| 2102 | +#define RK3562_SMT_BITS_PER_PIN 2 |
| 2103 | +#define RK3562_SMT_PINS_PER_REG 8 |
| 2104 | +#define RK3562_SMT_GPIO0_OFFSET 0x20030 |
| 2105 | +#define RK3562_SMT_GPIO1_OFFSET 0xC0 |
| 2106 | +#define RK3562_SMT_GPIO2_OFFSET 0xD0 |
| 2107 | +#define RK3562_SMT_GPIO3_OFFSET 0x100E0 |
| 2108 | +#define RK3562_SMT_GPIO4_OFFSET 0x100F0 |
| 2109 | + |
| 2110 | +static int rk3562_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, |
| 2111 | + int pin_num, |
| 2112 | + struct regmap **regmap, |
| 2113 | + int *reg, u8 *bit) |
| 2114 | +{ |
| 2115 | + struct rockchip_pinctrl *info = bank->drvdata; |
| 2116 | + |
| 2117 | + *regmap = info->regmap_base; |
| 2118 | + switch (bank->bank_num) { |
| 2119 | + case 0: |
| 2120 | + *reg = RK3562_SMT_GPIO0_OFFSET; |
| 2121 | + break; |
| 2122 | + |
| 2123 | + case 1: |
| 2124 | + *reg = RK3562_SMT_GPIO1_OFFSET; |
| 2125 | + break; |
| 2126 | + |
| 2127 | + case 2: |
| 2128 | + *reg = RK3562_SMT_GPIO2_OFFSET; |
| 2129 | + break; |
| 2130 | + |
| 2131 | + case 3: |
| 2132 | + *reg = RK3562_SMT_GPIO3_OFFSET; |
| 2133 | + break; |
| 2134 | + |
| 2135 | + case 4: |
| 2136 | + *reg = RK3562_SMT_GPIO4_OFFSET; |
| 2137 | + break; |
| 2138 | + |
| 2139 | + default: |
| 2140 | + dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num); |
| 2141 | + break; |
| 2142 | + } |
| 2143 | + |
| 2144 | + *reg += ((pin_num / RK3562_SMT_PINS_PER_REG) * 4); |
| 2145 | + *bit = pin_num % RK3562_SMT_PINS_PER_REG; |
| 2146 | + *bit *= RK3562_SMT_BITS_PER_PIN; |
| 2147 | + |
| 2148 | + return 0; |
| 2149 | +} |
| 2150 | + |
2006 | 2151 | #define RK3568_PULL_PMU_OFFSET 0x20 |
2007 | 2152 | #define RK3568_PULL_GRF_OFFSET 0x80 |
2008 | 2153 | #define RK3568_PULL_BITS_PER_PIN 2 |
@@ -2495,7 +2640,8 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, |
2495 | 2640 | rmask_bits = RK3588_DRV_BITS_PER_PIN; |
2496 | 2641 | ret = strength; |
2497 | 2642 | goto config; |
2498 | | - } else if (ctrl->type == RK3568) { |
| 2643 | + } else if (ctrl->type == RK3562 || |
| 2644 | + ctrl->type == RK3568) { |
2499 | 2645 | rmask_bits = RK3568_DRV_BITS_PER_PIN; |
2500 | 2646 | ret = (1 << (strength + 1)) - 1; |
2501 | 2647 | goto config; |
@@ -2639,6 +2785,7 @@ static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num) |
2639 | 2785 | case RK3328: |
2640 | 2786 | case RK3368: |
2641 | 2787 | case RK3399: |
| 2788 | + case RK3562: |
2642 | 2789 | case RK3568: |
2643 | 2790 | case RK3576: |
2644 | 2791 | case RK3588: |
@@ -2699,6 +2846,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank, |
2699 | 2846 | case RK3328: |
2700 | 2847 | case RK3368: |
2701 | 2848 | case RK3399: |
| 2849 | + case RK3562: |
2702 | 2850 | case RK3568: |
2703 | 2851 | case RK3576: |
2704 | 2852 | case RK3588: |
@@ -2810,6 +2958,7 @@ static int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num) |
2810 | 2958 |
|
2811 | 2959 | data >>= bit; |
2812 | 2960 | switch (ctrl->type) { |
| 2961 | + case RK3562: |
2813 | 2962 | case RK3568: |
2814 | 2963 | return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1); |
2815 | 2964 | default: |
@@ -2839,6 +2988,7 @@ static int rockchip_set_schmitt(struct rockchip_pin_bank *bank, |
2839 | 2988 |
|
2840 | 2989 | /* enable the write to the equivalent lower bits */ |
2841 | 2990 | switch (ctrl->type) { |
| 2991 | + case RK3562: |
2842 | 2992 | case RK3568: |
2843 | 2993 | data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16); |
2844 | 2994 | rmask = data | (data >> 16); |
@@ -2965,6 +3115,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, |
2965 | 3115 | case RK3328: |
2966 | 3116 | case RK3368: |
2967 | 3117 | case RK3399: |
| 3118 | + case RK3562: |
2968 | 3119 | case RK3568: |
2969 | 3120 | case RK3576: |
2970 | 3121 | case RK3588: |
@@ -4086,6 +4237,49 @@ static struct rockchip_pin_ctrl rk3399_pin_ctrl = { |
4086 | 4237 | .drv_calc_reg = rk3399_calc_drv_reg_and_bit, |
4087 | 4238 | }; |
4088 | 4239 |
|
| 4240 | +static struct rockchip_pin_bank rk3562_pin_banks[] = { |
| 4241 | + PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0", |
| 4242 | + IOMUX_WIDTH_4BIT, |
| 4243 | + IOMUX_WIDTH_4BIT, |
| 4244 | + IOMUX_WIDTH_4BIT, |
| 4245 | + IOMUX_WIDTH_4BIT, |
| 4246 | + 0x20000, 0x20008, 0x20010, 0x20018), |
| 4247 | + PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1", |
| 4248 | + IOMUX_WIDTH_4BIT, |
| 4249 | + IOMUX_WIDTH_4BIT, |
| 4250 | + IOMUX_WIDTH_4BIT, |
| 4251 | + IOMUX_WIDTH_4BIT, |
| 4252 | + 0, 0x08, 0x10, 0x18), |
| 4253 | + PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2", |
| 4254 | + IOMUX_WIDTH_4BIT, |
| 4255 | + IOMUX_WIDTH_4BIT, |
| 4256 | + IOMUX_WIDTH_4BIT, |
| 4257 | + IOMUX_WIDTH_4BIT, |
| 4258 | + 0x20, 0, 0, 0), |
| 4259 | + PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3", |
| 4260 | + IOMUX_WIDTH_4BIT, |
| 4261 | + IOMUX_WIDTH_4BIT, |
| 4262 | + IOMUX_WIDTH_4BIT, |
| 4263 | + IOMUX_WIDTH_4BIT, |
| 4264 | + 0x10040, 0x10048, 0x10050, 0x10058), |
| 4265 | + PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4", |
| 4266 | + IOMUX_WIDTH_4BIT, |
| 4267 | + IOMUX_WIDTH_4BIT, |
| 4268 | + 0, |
| 4269 | + 0, |
| 4270 | + 0x10060, 0x10068, 0, 0), |
| 4271 | +}; |
| 4272 | + |
| 4273 | +static struct rockchip_pin_ctrl rk3562_pin_ctrl __maybe_unused = { |
| 4274 | + .pin_banks = rk3562_pin_banks, |
| 4275 | + .nr_banks = ARRAY_SIZE(rk3562_pin_banks), |
| 4276 | + .label = "RK3562-GPIO", |
| 4277 | + .type = RK3562, |
| 4278 | + .pull_calc_reg = rk3562_calc_pull_reg_and_bit, |
| 4279 | + .drv_calc_reg = rk3562_calc_drv_reg_and_bit, |
| 4280 | + .schmitt_calc_reg = rk3562_calc_schmitt_reg_and_bit, |
| 4281 | +}; |
| 4282 | + |
4089 | 4283 | static struct rockchip_pin_bank rk3568_pin_banks[] = { |
4090 | 4284 | PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, |
4091 | 4285 | IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, |
@@ -4210,6 +4404,8 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = { |
4210 | 4404 | .data = &rk3368_pin_ctrl }, |
4211 | 4405 | { .compatible = "rockchip,rk3399-pinctrl", |
4212 | 4406 | .data = &rk3399_pin_ctrl }, |
| 4407 | + { .compatible = "rockchip,rk3562-pinctrl", |
| 4408 | + .data = &rk3562_pin_ctrl }, |
4213 | 4409 | { .compatible = "rockchip,rk3568-pinctrl", |
4214 | 4410 | .data = &rk3568_pin_ctrl }, |
4215 | 4411 | { .compatible = "rockchip,rk3576-pinctrl", |
|
0 commit comments