Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pinctrl: rk805: Add rk816 pinctrl support

This adds support for RK816 to the exising rk805 pinctrl driver

It has a single pin which can be configured as input from a thermistor (for
instance in an attached battery) or as a gpio.

Signed-off-by: Alex Bee <knaerzche@gmail.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20240416161237.2500037-4-knaerzche@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Alex Bee and committed by
Lee Jones
1bd97d64 e9006f81

+69
+69
drivers/pinctrl/pinctrl-rk805.c
··· 93 93 RK806_PINMUX_FUN5, 94 94 }; 95 95 96 + enum rk816_pinmux_option { 97 + RK816_PINMUX_THERMISTOR, 98 + RK816_PINMUX_GPIO, 99 + }; 100 + 96 101 enum { 97 102 RK805_GPIO0, 98 103 RK805_GPIO1, ··· 107 102 RK806_GPIO_DVS1, 108 103 RK806_GPIO_DVS2, 109 104 RK806_GPIO_DVS3 105 + }; 106 + 107 + enum { 108 + RK816_GPIO0, 110 109 }; 111 110 112 111 static const char *const rk805_gpio_groups[] = { ··· 124 115 "gpio_pwrctrl3", 125 116 }; 126 117 118 + static const char *const rk816_gpio_groups[] = { 119 + "gpio0", 120 + }; 121 + 127 122 /* RK805: 2 output only GPIOs */ 128 123 static const struct pinctrl_pin_desc rk805_pins_desc[] = { 129 124 PINCTRL_PIN(RK805_GPIO0, "gpio0"), ··· 139 126 PINCTRL_PIN(RK806_GPIO_DVS1, "gpio_pwrctrl1"), 140 127 PINCTRL_PIN(RK806_GPIO_DVS2, "gpio_pwrctrl2"), 141 128 PINCTRL_PIN(RK806_GPIO_DVS3, "gpio_pwrctrl3"), 129 + }; 130 + 131 + /* RK816 */ 132 + static const struct pinctrl_pin_desc rk816_pins_desc[] = { 133 + PINCTRL_PIN(RK816_GPIO0, "gpio0"), 142 134 }; 143 135 144 136 static const struct rk805_pin_function rk805_pin_functions[] = { ··· 194 176 }, 195 177 }; 196 178 179 + static const struct rk805_pin_function rk816_pin_functions[] = { 180 + { 181 + .name = "gpio", 182 + .groups = rk816_gpio_groups, 183 + .ngroups = ARRAY_SIZE(rk816_gpio_groups), 184 + .mux_option = RK816_PINMUX_GPIO, 185 + }, 186 + { 187 + .name = "thermistor", 188 + .groups = rk816_gpio_groups, 189 + .ngroups = ARRAY_SIZE(rk816_gpio_groups), 190 + .mux_option = RK816_PINMUX_THERMISTOR, 191 + }, 192 + }; 193 + 197 194 static const struct rk805_pin_group rk805_pin_groups[] = { 198 195 { 199 196 .name = "gpio0", ··· 238 205 .pins = { RK806_GPIO_DVS3 }, 239 206 .npins = 1, 240 207 } 208 + }; 209 + 210 + static const struct rk805_pin_group rk816_pin_groups[] = { 211 + { 212 + .name = "gpio0", 213 + .pins = { RK816_GPIO0 }, 214 + .npins = 1, 215 + }, 241 216 }; 242 217 243 218 #define RK805_GPIO0_VAL_MSK BIT(0) ··· 294 253 .val_msk = RK806_PWRCTRL3_DATA, 295 254 .dir_msk = RK806_PWRCTRL3_DR, 296 255 } 256 + }; 257 + 258 + #define RK816_FUN_MASK BIT(2) 259 + #define RK816_VAL_MASK BIT(3) 260 + #define RK816_DIR_MASK BIT(4) 261 + 262 + static struct rk805_pin_config rk816_gpio_cfgs[] = { 263 + { 264 + .fun_reg = RK818_IO_POL_REG, 265 + .fun_msk = RK816_FUN_MASK, 266 + .reg = RK818_IO_POL_REG, 267 + .val_msk = RK816_VAL_MASK, 268 + .dir_msk = RK816_DIR_MASK, 269 + }, 297 270 }; 298 271 299 272 /* generic gpio chip */ ··· 494 439 return _rk805_pinctrl_set_mux(pctldev, offset, RK805_PINMUX_GPIO); 495 440 case RK806_ID: 496 441 return _rk805_pinctrl_set_mux(pctldev, offset, RK806_PINMUX_FUN5); 442 + case RK816_ID: 443 + return _rk805_pinctrl_set_mux(pctldev, offset, RK816_PINMUX_GPIO); 497 444 } 498 445 499 446 return -ENOTSUPP; ··· 644 587 pci->pinctrl_desc.npins = ARRAY_SIZE(rk806_pins_desc); 645 588 pci->pin_cfg = rk806_gpio_cfgs; 646 589 pci->gpio_chip.ngpio = ARRAY_SIZE(rk806_gpio_cfgs); 590 + break; 591 + case RK816_ID: 592 + pci->pins = rk816_pins_desc; 593 + pci->num_pins = ARRAY_SIZE(rk816_pins_desc); 594 + pci->functions = rk816_pin_functions; 595 + pci->num_functions = ARRAY_SIZE(rk816_pin_functions); 596 + pci->groups = rk816_pin_groups; 597 + pci->num_pin_groups = ARRAY_SIZE(rk816_pin_groups); 598 + pci->pinctrl_desc.pins = rk816_pins_desc; 599 + pci->pinctrl_desc.npins = ARRAY_SIZE(rk816_pins_desc); 600 + pci->pin_cfg = rk816_gpio_cfgs; 601 + pci->gpio_chip.ngpio = ARRAY_SIZE(rk816_gpio_cfgs); 647 602 break; 648 603 default: 649 604 dev_err(&pdev->dev, "unsupported RK805 ID %lu\n",