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

Configure Feed

Select the types of activity you want to include in your feed.

at v6.3 1051 lines 33 kB view raw
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * pinctrl-palmas.c -- TI PALMAS series pin control driver. 4 * 5 * Copyright (c) 2013, NVIDIA Corporation. 6 * 7 * Author: Laxman Dewangan <ldewangan@nvidia.com> 8 */ 9 10#include <linux/delay.h> 11#include <linux/module.h> 12#include <linux/mfd/palmas.h> 13#include <linux/of.h> 14#include <linux/of_device.h> 15#include <linux/platform_device.h> 16#include <linux/pinctrl/machine.h> 17#include <linux/pinctrl/pinctrl.h> 18#include <linux/pinctrl/pinconf-generic.h> 19#include <linux/pinctrl/pinconf.h> 20#include <linux/pinctrl/pinmux.h> 21#include <linux/pm.h> 22#include <linux/slab.h> 23 24#include "core.h" 25#include "pinconf.h" 26#include "pinctrl-utils.h" 27 28#define PALMAS_PIN_GPIO0_ID 0 29#define PALMAS_PIN_GPIO1_VBUS_LED1_PWM1 1 30#define PALMAS_PIN_GPIO2_REGEN_LED2_PWM2 2 31#define PALMAS_PIN_GPIO3_CHRG_DET 3 32#define PALMAS_PIN_GPIO4_SYSEN1 4 33#define PALMAS_PIN_GPIO5_CLK32KGAUDIO_USB_PSEL 5 34#define PALMAS_PIN_GPIO6_SYSEN2 6 35#define PALMAS_PIN_GPIO7_MSECURE_PWRHOLD 7 36#define PALMAS_PIN_GPIO8_SIM1RSTI 8 37#define PALMAS_PIN_GPIO9_LOW_VBAT 9 38#define PALMAS_PIN_GPIO10_WIRELESS_CHRG1 10 39#define PALMAS_PIN_GPIO11_RCM 11 40#define PALMAS_PIN_GPIO12_SIM2RSTO 12 41#define PALMAS_PIN_GPIO13 13 42#define PALMAS_PIN_GPIO14 14 43#define PALMAS_PIN_GPIO15_SIM2RSTI 15 44#define PALMAS_PIN_VAC 16 45#define PALMAS_PIN_POWERGOOD_USB_PSEL 17 46#define PALMAS_PIN_NRESWARM 18 47#define PALMAS_PIN_PWRDOWN 19 48#define PALMAS_PIN_GPADC_START 20 49#define PALMAS_PIN_RESET_IN 21 50#define PALMAS_PIN_NSLEEP 22 51#define PALMAS_PIN_ENABLE1 23 52#define PALMAS_PIN_ENABLE2 24 53#define PALMAS_PIN_INT 25 54#define PALMAS_PIN_NUM (PALMAS_PIN_INT + 1) 55 56struct palmas_pin_function { 57 const char *name; 58 const char * const *groups; 59 unsigned ngroups; 60}; 61 62struct palmas_pctrl_chip_info { 63 struct device *dev; 64 struct pinctrl_dev *pctl; 65 struct palmas *palmas; 66 int pins_current_opt[PALMAS_PIN_NUM]; 67 const struct palmas_pin_function *functions; 68 unsigned num_functions; 69 const struct palmas_pingroup *pin_groups; 70 int num_pin_groups; 71 const struct pinctrl_pin_desc *pins; 72 unsigned num_pins; 73}; 74 75static const struct pinctrl_pin_desc palmas_pins_desc[] = { 76 PINCTRL_PIN(PALMAS_PIN_GPIO0_ID, "gpio0"), 77 PINCTRL_PIN(PALMAS_PIN_GPIO1_VBUS_LED1_PWM1, "gpio1"), 78 PINCTRL_PIN(PALMAS_PIN_GPIO2_REGEN_LED2_PWM2, "gpio2"), 79 PINCTRL_PIN(PALMAS_PIN_GPIO3_CHRG_DET, "gpio3"), 80 PINCTRL_PIN(PALMAS_PIN_GPIO4_SYSEN1, "gpio4"), 81 PINCTRL_PIN(PALMAS_PIN_GPIO5_CLK32KGAUDIO_USB_PSEL, "gpio5"), 82 PINCTRL_PIN(PALMAS_PIN_GPIO6_SYSEN2, "gpio6"), 83 PINCTRL_PIN(PALMAS_PIN_GPIO7_MSECURE_PWRHOLD, "gpio7"), 84 PINCTRL_PIN(PALMAS_PIN_GPIO8_SIM1RSTI, "gpio8"), 85 PINCTRL_PIN(PALMAS_PIN_GPIO9_LOW_VBAT, "gpio9"), 86 PINCTRL_PIN(PALMAS_PIN_GPIO10_WIRELESS_CHRG1, "gpio10"), 87 PINCTRL_PIN(PALMAS_PIN_GPIO11_RCM, "gpio11"), 88 PINCTRL_PIN(PALMAS_PIN_GPIO12_SIM2RSTO, "gpio12"), 89 PINCTRL_PIN(PALMAS_PIN_GPIO13, "gpio13"), 90 PINCTRL_PIN(PALMAS_PIN_GPIO14, "gpio14"), 91 PINCTRL_PIN(PALMAS_PIN_GPIO15_SIM2RSTI, "gpio15"), 92 PINCTRL_PIN(PALMAS_PIN_VAC, "vac"), 93 PINCTRL_PIN(PALMAS_PIN_POWERGOOD_USB_PSEL, "powergood"), 94 PINCTRL_PIN(PALMAS_PIN_NRESWARM, "nreswarm"), 95 PINCTRL_PIN(PALMAS_PIN_PWRDOWN, "pwrdown"), 96 PINCTRL_PIN(PALMAS_PIN_GPADC_START, "gpadc_start"), 97 PINCTRL_PIN(PALMAS_PIN_RESET_IN, "reset_in"), 98 PINCTRL_PIN(PALMAS_PIN_NSLEEP, "nsleep"), 99 PINCTRL_PIN(PALMAS_PIN_ENABLE1, "enable1"), 100 PINCTRL_PIN(PALMAS_PIN_ENABLE2, "enable2"), 101 PINCTRL_PIN(PALMAS_PIN_INT, "int"), 102}; 103 104static const char * const opt0_groups[] = { 105 "gpio0", 106 "gpio1", 107 "gpio2", 108 "gpio3", 109 "gpio4", 110 "gpio5", 111 "gpio6", 112 "gpio7", 113 "gpio8", 114 "gpio9", 115 "gpio10", 116 "gpio11", 117 "gpio12", 118 "gpio13", 119 "gpio14", 120 "gpio15", 121 "vac", 122 "powergood", 123 "nreswarm", 124 "pwrdown", 125 "gpadc_start", 126 "reset_in", 127 "nsleep", 128 "enable1", 129 "enable2", 130 "int", 131}; 132 133static const char * const opt1_groups[] = { 134 "gpio0", 135 "gpio1", 136 "gpio2", 137 "gpio3", 138 "gpio4", 139 "gpio5", 140 "gpio6", 141 "gpio7", 142 "gpio8", 143 "gpio9", 144 "gpio10", 145 "gpio11", 146 "gpio12", 147 "gpio15", 148 "vac", 149 "powergood", 150}; 151 152static const char * const opt2_groups[] = { 153 "gpio1", 154 "gpio2", 155 "gpio5", 156 "gpio7", 157}; 158 159static const char * const opt3_groups[] = { 160 "gpio1", 161 "gpio2", 162}; 163 164static const char * const gpio_groups[] = { 165 "gpio0", 166 "gpio1", 167 "gpio2", 168 "gpio3", 169 "gpio4", 170 "gpio5", 171 "gpio6", 172 "gpio7", 173 "gpio8", 174 "gpio9", 175 "gpio10", 176 "gpio11", 177 "gpio12", 178 "gpio13", 179 "gpio14", 180 "gpio15", 181}; 182 183static const char * const led_groups[] = { 184 "gpio1", 185 "gpio2", 186}; 187 188static const char * const pwm_groups[] = { 189 "gpio1", 190 "gpio2", 191}; 192 193static const char * const regen_groups[] = { 194 "gpio2", 195}; 196 197static const char * const sysen_groups[] = { 198 "gpio4", 199 "gpio6", 200}; 201 202static const char * const clk32kgaudio_groups[] = { 203 "gpio5", 204}; 205 206static const char * const id_groups[] = { 207 "gpio0", 208}; 209 210static const char * const vbus_det_groups[] = { 211 "gpio1", 212}; 213 214static const char * const chrg_det_groups[] = { 215 "gpio3", 216}; 217 218static const char * const vac_groups[] = { 219 "vac", 220}; 221 222static const char * const vacok_groups[] = { 223 "vac", 224}; 225 226static const char * const powergood_groups[] = { 227 "powergood", 228}; 229 230static const char * const usb_psel_groups[] = { 231 "gpio5", 232 "powergood", 233}; 234 235static const char * const msecure_groups[] = { 236 "gpio7", 237}; 238 239static const char * const pwrhold_groups[] = { 240 "gpio7", 241}; 242 243static const char * const int_groups[] = { 244 "int", 245}; 246 247static const char * const nreswarm_groups[] = { 248 "nreswarm", 249}; 250 251static const char * const simrsto_groups[] = { 252 "gpio12", 253}; 254 255static const char * const simrsti_groups[] = { 256 "gpio8", 257 "gpio15", 258}; 259 260static const char * const low_vbat_groups[] = { 261 "gpio9", 262}; 263 264static const char * const wireless_chrg1_groups[] = { 265 "gpio10", 266}; 267 268static const char * const rcm_groups[] = { 269 "gpio11", 270}; 271 272static const char * const pwrdown_groups[] = { 273 "pwrdown", 274}; 275 276static const char * const gpadc_start_groups[] = { 277 "gpadc_start", 278}; 279 280static const char * const reset_in_groups[] = { 281 "reset_in", 282}; 283 284static const char * const nsleep_groups[] = { 285 "nsleep", 286}; 287 288static const char * const enable_groups[] = { 289 "enable1", 290 "enable2", 291}; 292 293#define FUNCTION_GROUPS \ 294 FUNCTION_GROUP(opt0, OPTION0), \ 295 FUNCTION_GROUP(opt1, OPTION1), \ 296 FUNCTION_GROUP(opt2, OPTION2), \ 297 FUNCTION_GROUP(opt3, OPTION3), \ 298 FUNCTION_GROUP(gpio, GPIO), \ 299 FUNCTION_GROUP(led, LED), \ 300 FUNCTION_GROUP(pwm, PWM), \ 301 FUNCTION_GROUP(regen, REGEN), \ 302 FUNCTION_GROUP(sysen, SYSEN), \ 303 FUNCTION_GROUP(clk32kgaudio, CLK32KGAUDIO), \ 304 FUNCTION_GROUP(id, ID), \ 305 FUNCTION_GROUP(vbus_det, VBUS_DET), \ 306 FUNCTION_GROUP(chrg_det, CHRG_DET), \ 307 FUNCTION_GROUP(vac, VAC), \ 308 FUNCTION_GROUP(vacok, VACOK), \ 309 FUNCTION_GROUP(powergood, POWERGOOD), \ 310 FUNCTION_GROUP(usb_psel, USB_PSEL), \ 311 FUNCTION_GROUP(msecure, MSECURE), \ 312 FUNCTION_GROUP(pwrhold, PWRHOLD), \ 313 FUNCTION_GROUP(int, INT), \ 314 FUNCTION_GROUP(nreswarm, NRESWARM), \ 315 FUNCTION_GROUP(simrsto, SIMRSTO), \ 316 FUNCTION_GROUP(simrsti, SIMRSTI), \ 317 FUNCTION_GROUP(low_vbat, LOW_VBAT), \ 318 FUNCTION_GROUP(wireless_chrg1, WIRELESS_CHRG1), \ 319 FUNCTION_GROUP(rcm, RCM), \ 320 FUNCTION_GROUP(pwrdown, PWRDOWN), \ 321 FUNCTION_GROUP(gpadc_start, GPADC_START), \ 322 FUNCTION_GROUP(reset_in, RESET_IN), \ 323 FUNCTION_GROUP(nsleep, NSLEEP), \ 324 FUNCTION_GROUP(enable, ENABLE) 325 326static const struct palmas_pin_function palmas_pin_function[] = { 327#undef FUNCTION_GROUP 328#define FUNCTION_GROUP(fname, mux) \ 329 { \ 330 .name = #fname, \ 331 .groups = fname##_groups, \ 332 .ngroups = ARRAY_SIZE(fname##_groups), \ 333 } 334 335 FUNCTION_GROUPS, 336}; 337 338enum palmas_pinmux { 339#undef FUNCTION_GROUP 340#define FUNCTION_GROUP(fname, mux) PALMAS_PINMUX_##mux 341 FUNCTION_GROUPS, 342 PALMAS_PINMUX_NA = 0xFFFF, 343}; 344 345struct palmas_pins_pullup_dn_info { 346 int pullup_dn_reg_base; 347 int pullup_dn_reg_add; 348 int pullup_dn_mask; 349 int normal_val; 350 int pull_up_val; 351 int pull_dn_val; 352}; 353 354struct palmas_pins_od_info { 355 int od_reg_base; 356 int od_reg_add; 357 int od_mask; 358 int od_enable; 359 int od_disable; 360}; 361 362struct palmas_pin_info { 363 enum palmas_pinmux mux_opt; 364 const struct palmas_pins_pullup_dn_info *pud_info; 365 const struct palmas_pins_od_info *od_info; 366}; 367 368struct palmas_pingroup { 369 const char *name; 370 const unsigned pins[1]; 371 unsigned npins; 372 unsigned mux_reg_base; 373 unsigned mux_reg_add; 374 unsigned mux_reg_mask; 375 unsigned mux_bit_shift; 376 const struct palmas_pin_info *opt[4]; 377}; 378 379#define PULL_UP_DN(_name, _rbase, _add, _mask, _nv, _uv, _dv) \ 380static const struct palmas_pins_pullup_dn_info pud_##_name##_info = { \ 381 .pullup_dn_reg_base = PALMAS_##_rbase##_BASE, \ 382 .pullup_dn_reg_add = _add, \ 383 .pullup_dn_mask = _mask, \ 384 .normal_val = _nv, \ 385 .pull_up_val = _uv, \ 386 .pull_dn_val = _dv, \ 387} 388 389PULL_UP_DN(nreswarm, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL1, 0x2, 0x0, 0x2, -1); 390PULL_UP_DN(pwrdown, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL1, 0x4, 0x0, -1, 0x4); 391PULL_UP_DN(gpadc_start, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL1, 0x30, 0x0, 0x20, 0x10); 392PULL_UP_DN(reset_in, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL1, 0x40, 0x0, -1, 0x40); 393PULL_UP_DN(nsleep, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL2, 0x3, 0x0, 0x2, 0x1); 394PULL_UP_DN(enable1, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL2, 0xC, 0x0, 0x8, 0x4); 395PULL_UP_DN(enable2, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL2, 0x30, 0x0, 0x20, 0x10); 396PULL_UP_DN(vacok, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL3, 0x40, 0x0, -1, 0x40); 397PULL_UP_DN(chrg_det, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL3, 0x10, 0x0, -1, 0x10); 398PULL_UP_DN(pwrhold, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL3, 0x4, 0x0, -1, 0x4); 399PULL_UP_DN(msecure, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL3, 0x1, 0x0, -1, 0x1); 400PULL_UP_DN(id, USB_OTG, PALMAS_USB_ID_CTRL_SET, 0x40, 0x0, 0x40, -1); 401PULL_UP_DN(gpio0, GPIO, PALMAS_PU_PD_GPIO_CTRL1, 0x04, 0, -1, 1); 402PULL_UP_DN(gpio1, GPIO, PALMAS_PU_PD_GPIO_CTRL1, 0x0C, 0, 0x8, 0x4); 403PULL_UP_DN(gpio2, GPIO, PALMAS_PU_PD_GPIO_CTRL1, 0x30, 0x0, 0x20, 0x10); 404PULL_UP_DN(gpio3, GPIO, PALMAS_PU_PD_GPIO_CTRL1, 0x40, 0x0, -1, 0x40); 405PULL_UP_DN(gpio4, GPIO, PALMAS_PU_PD_GPIO_CTRL2, 0x03, 0x0, 0x2, 0x1); 406PULL_UP_DN(gpio5, GPIO, PALMAS_PU_PD_GPIO_CTRL2, 0x0c, 0x0, 0x8, 0x4); 407PULL_UP_DN(gpio6, GPIO, PALMAS_PU_PD_GPIO_CTRL2, 0x30, 0x0, 0x20, 0x10); 408PULL_UP_DN(gpio7, GPIO, PALMAS_PU_PD_GPIO_CTRL2, 0x40, 0x0, -1, 0x40); 409PULL_UP_DN(gpio9, GPIO, PALMAS_PU_PD_GPIO_CTRL3, 0x0C, 0x0, 0x8, 0x4); 410PULL_UP_DN(gpio10, GPIO, PALMAS_PU_PD_GPIO_CTRL3, 0x30, 0x0, 0x20, 0x10); 411PULL_UP_DN(gpio11, GPIO, PALMAS_PU_PD_GPIO_CTRL3, 0xC0, 0x0, 0x80, 0x40); 412PULL_UP_DN(gpio13, GPIO, PALMAS_PU_PD_GPIO_CTRL4, 0x04, 0x0, -1, 0x04); 413PULL_UP_DN(gpio14, GPIO, PALMAS_PU_PD_GPIO_CTRL4, 0x30, 0x0, 0x20, 0x10); 414 415#define OD_INFO(_name, _rbase, _add, _mask, _ev, _dv) \ 416static const struct palmas_pins_od_info od_##_name##_info = { \ 417 .od_reg_base = PALMAS_##_rbase##_BASE, \ 418 .od_reg_add = _add, \ 419 .od_mask = _mask, \ 420 .od_enable = _ev, \ 421 .od_disable = _dv, \ 422} 423 424OD_INFO(gpio1, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL, 0x1, 0x1, 0x0); 425OD_INFO(gpio2, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL, 0x2, 0x2, 0x0); 426OD_INFO(gpio5, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL, 0x20, 0x20, 0x0); 427OD_INFO(gpio10, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL2, 0x04, 0x04, 0x0); 428OD_INFO(gpio13, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL2, 0x20, 0x20, 0x0); 429OD_INFO(int, PU_PD_OD, PALMAS_OD_OUTPUT_CTRL, 0x8, 0x8, 0x0); 430OD_INFO(pwm1, PU_PD_OD, PALMAS_OD_OUTPUT_CTRL, 0x20, 0x20, 0x0); 431OD_INFO(pwm2, PU_PD_OD, PALMAS_OD_OUTPUT_CTRL, 0x80, 0x80, 0x0); 432OD_INFO(vbus_det, PU_PD_OD, PALMAS_OD_OUTPUT_CTRL, 0x40, 0x40, 0x0); 433 434#define PIN_INFO(_name, _id, _pud_info, _od_info) \ 435static const struct palmas_pin_info pin_##_name##_info = { \ 436 .mux_opt = PALMAS_PINMUX_##_id, \ 437 .pud_info = _pud_info, \ 438 .od_info = _od_info \ 439} 440 441PIN_INFO(gpio0, GPIO, &pud_gpio0_info, NULL); 442PIN_INFO(gpio1, GPIO, &pud_gpio1_info, &od_gpio1_info); 443PIN_INFO(gpio2, GPIO, &pud_gpio2_info, &od_gpio2_info); 444PIN_INFO(gpio3, GPIO, &pud_gpio3_info, NULL); 445PIN_INFO(gpio4, GPIO, &pud_gpio4_info, NULL); 446PIN_INFO(gpio5, GPIO, &pud_gpio5_info, &od_gpio5_info); 447PIN_INFO(gpio6, GPIO, &pud_gpio6_info, NULL); 448PIN_INFO(gpio7, GPIO, &pud_gpio7_info, NULL); 449PIN_INFO(gpio8, GPIO, NULL, NULL); 450PIN_INFO(gpio9, GPIO, &pud_gpio9_info, NULL); 451PIN_INFO(gpio10, GPIO, &pud_gpio10_info, &od_gpio10_info); 452PIN_INFO(gpio11, GPIO, &pud_gpio11_info, NULL); 453PIN_INFO(gpio12, GPIO, NULL, NULL); 454PIN_INFO(gpio13, GPIO, &pud_gpio13_info, &od_gpio13_info); 455PIN_INFO(gpio14, GPIO, &pud_gpio14_info, NULL); 456PIN_INFO(gpio15, GPIO, NULL, NULL); 457PIN_INFO(id, ID, &pud_id_info, NULL); 458PIN_INFO(led1, LED, NULL, NULL); 459PIN_INFO(led2, LED, NULL, NULL); 460PIN_INFO(regen, REGEN, NULL, NULL); 461PIN_INFO(sysen1, SYSEN, NULL, NULL); 462PIN_INFO(sysen2, SYSEN, NULL, NULL); 463PIN_INFO(int, INT, NULL, &od_int_info); 464PIN_INFO(pwm1, PWM, NULL, &od_pwm1_info); 465PIN_INFO(pwm2, PWM, NULL, &od_pwm2_info); 466PIN_INFO(vacok, VACOK, &pud_vacok_info, NULL); 467PIN_INFO(chrg_det, CHRG_DET, &pud_chrg_det_info, NULL); 468PIN_INFO(pwrhold, PWRHOLD, &pud_pwrhold_info, NULL); 469PIN_INFO(msecure, MSECURE, &pud_msecure_info, NULL); 470PIN_INFO(nreswarm, NA, &pud_nreswarm_info, NULL); 471PIN_INFO(pwrdown, NA, &pud_pwrdown_info, NULL); 472PIN_INFO(gpadc_start, NA, &pud_gpadc_start_info, NULL); 473PIN_INFO(reset_in, NA, &pud_reset_in_info, NULL); 474PIN_INFO(nsleep, NA, &pud_nsleep_info, NULL); 475PIN_INFO(enable1, NA, &pud_enable1_info, NULL); 476PIN_INFO(enable2, NA, &pud_enable2_info, NULL); 477PIN_INFO(clk32kgaudio, CLK32KGAUDIO, NULL, NULL); 478PIN_INFO(usb_psel, USB_PSEL, NULL, NULL); 479PIN_INFO(vac, VAC, NULL, NULL); 480PIN_INFO(powergood, POWERGOOD, NULL, NULL); 481PIN_INFO(vbus_det, VBUS_DET, NULL, &od_vbus_det_info); 482PIN_INFO(sim1rsti, SIMRSTI, NULL, NULL); 483PIN_INFO(low_vbat, LOW_VBAT, NULL, NULL); 484PIN_INFO(rcm, RCM, NULL, NULL); 485PIN_INFO(sim2rsto, SIMRSTO, NULL, NULL); 486PIN_INFO(sim2rsti, SIMRSTI, NULL, NULL); 487PIN_INFO(wireless_chrg1, WIRELESS_CHRG1, NULL, NULL); 488 489#define PALMAS_PRIMARY_SECONDARY_NONE 0 490#define PALMAS_NONE_BASE 0 491#define PALMAS_PRIMARY_SECONDARY_INPUT3 PALMAS_PU_PD_INPUT_CTRL3 492 493#define PALMAS_PINGROUP(pg_name, pin_id, base, reg, _mask, _bshift, o0, o1, o2, o3) \ 494 { \ 495 .name = #pg_name, \ 496 .pins = {PALMAS_PIN_##pin_id}, \ 497 .npins = 1, \ 498 .mux_reg_base = PALMAS_##base##_BASE, \ 499 .mux_reg_add = PALMAS_PRIMARY_SECONDARY_##reg, \ 500 .mux_reg_mask = _mask, \ 501 .mux_bit_shift = _bshift, \ 502 .opt = { \ 503 o0, \ 504 o1, \ 505 o2, \ 506 o3, \ 507 }, \ 508 } 509 510static const struct palmas_pingroup tps65913_pingroups[] = { 511 PALMAS_PINGROUP(gpio0, GPIO0_ID, PU_PD_OD, PAD1, 0x4, 0x2, &pin_gpio0_info, &pin_id_info, NULL, NULL), 512 PALMAS_PINGROUP(gpio1, GPIO1_VBUS_LED1_PWM1, PU_PD_OD, PAD1, 0x18, 0x3, &pin_gpio1_info, &pin_vbus_det_info, &pin_led1_info, &pin_pwm1_info), 513 PALMAS_PINGROUP(gpio2, GPIO2_REGEN_LED2_PWM2, PU_PD_OD, PAD1, 0x60, 0x5, &pin_gpio2_info, &pin_regen_info, &pin_led2_info, &pin_pwm2_info), 514 PALMAS_PINGROUP(gpio3, GPIO3_CHRG_DET, PU_PD_OD, PAD1, 0x80, 0x7, &pin_gpio3_info, &pin_chrg_det_info, NULL, NULL), 515 PALMAS_PINGROUP(gpio4, GPIO4_SYSEN1, PU_PD_OD, PAD1, 0x01, 0x0, &pin_gpio4_info, &pin_sysen1_info, NULL, NULL), 516 PALMAS_PINGROUP(gpio5, GPIO5_CLK32KGAUDIO_USB_PSEL, PU_PD_OD, PAD2, 0x6, 0x1, &pin_gpio5_info, &pin_clk32kgaudio_info, &pin_usb_psel_info, NULL), 517 PALMAS_PINGROUP(gpio6, GPIO6_SYSEN2, PU_PD_OD, PAD2, 0x08, 0x3, &pin_gpio6_info, &pin_sysen2_info, NULL, NULL), 518 PALMAS_PINGROUP(gpio7, GPIO7_MSECURE_PWRHOLD, PU_PD_OD, PAD2, 0x30, 0x4, &pin_gpio7_info, &pin_msecure_info, &pin_pwrhold_info, NULL), 519 PALMAS_PINGROUP(vac, VAC, PU_PD_OD, PAD1, 0x02, 0x1, &pin_vac_info, &pin_vacok_info, NULL, NULL), 520 PALMAS_PINGROUP(powergood, POWERGOOD_USB_PSEL, PU_PD_OD, PAD1, 0x01, 0x0, &pin_powergood_info, &pin_usb_psel_info, NULL, NULL), 521 PALMAS_PINGROUP(nreswarm, NRESWARM, NONE, NONE, 0x0, 0x0, &pin_nreswarm_info, NULL, NULL, NULL), 522 PALMAS_PINGROUP(pwrdown, PWRDOWN, NONE, NONE, 0x0, 0x0, &pin_pwrdown_info, NULL, NULL, NULL), 523 PALMAS_PINGROUP(gpadc_start, GPADC_START, NONE, NONE, 0x0, 0x0, &pin_gpadc_start_info, NULL, NULL, NULL), 524 PALMAS_PINGROUP(reset_in, RESET_IN, NONE, NONE, 0x0, 0x0, &pin_reset_in_info, NULL, NULL, NULL), 525 PALMAS_PINGROUP(nsleep, NSLEEP, NONE, NONE, 0x0, 0x0, &pin_nsleep_info, NULL, NULL, NULL), 526 PALMAS_PINGROUP(enable1, ENABLE1, NONE, NONE, 0x0, 0x0, &pin_enable1_info, NULL, NULL, NULL), 527 PALMAS_PINGROUP(enable2, ENABLE2, NONE, NONE, 0x0, 0x0, &pin_enable2_info, NULL, NULL, NULL), 528 PALMAS_PINGROUP(int, INT, NONE, NONE, 0x0, 0x0, &pin_int_info, NULL, NULL, NULL), 529}; 530 531static const struct palmas_pingroup tps80036_pingroups[] = { 532 PALMAS_PINGROUP(gpio0, GPIO0_ID, PU_PD_OD, PAD1, 0x4, 0x2, &pin_gpio0_info, &pin_id_info, NULL, NULL), 533 PALMAS_PINGROUP(gpio1, GPIO1_VBUS_LED1_PWM1, PU_PD_OD, PAD1, 0x18, 0x3, &pin_gpio1_info, &pin_vbus_det_info, &pin_led1_info, &pin_pwm1_info), 534 PALMAS_PINGROUP(gpio2, GPIO2_REGEN_LED2_PWM2, PU_PD_OD, PAD1, 0x60, 0x5, &pin_gpio2_info, &pin_regen_info, &pin_led2_info, &pin_pwm2_info), 535 PALMAS_PINGROUP(gpio3, GPIO3_CHRG_DET, PU_PD_OD, PAD1, 0x80, 0x7, &pin_gpio3_info, &pin_chrg_det_info, NULL, NULL), 536 PALMAS_PINGROUP(gpio4, GPIO4_SYSEN1, PU_PD_OD, PAD1, 0x01, 0x0, &pin_gpio4_info, &pin_sysen1_info, NULL, NULL), 537 PALMAS_PINGROUP(gpio5, GPIO5_CLK32KGAUDIO_USB_PSEL, PU_PD_OD, PAD2, 0x6, 0x1, &pin_gpio5_info, &pin_clk32kgaudio_info, &pin_usb_psel_info, NULL), 538 PALMAS_PINGROUP(gpio6, GPIO6_SYSEN2, PU_PD_OD, PAD2, 0x08, 0x3, &pin_gpio6_info, &pin_sysen2_info, NULL, NULL), 539 PALMAS_PINGROUP(gpio7, GPIO7_MSECURE_PWRHOLD, PU_PD_OD, PAD2, 0x30, 0x4, &pin_gpio7_info, &pin_msecure_info, &pin_pwrhold_info, NULL), 540 PALMAS_PINGROUP(gpio8, GPIO8_SIM1RSTI, PU_PD_OD, PAD4, 0x01, 0x0, &pin_gpio8_info, &pin_sim1rsti_info, NULL, NULL), 541 PALMAS_PINGROUP(gpio9, GPIO9_LOW_VBAT, PU_PD_OD, PAD4, 0x02, 0x1, &pin_gpio9_info, &pin_low_vbat_info, NULL, NULL), 542 PALMAS_PINGROUP(gpio10, GPIO10_WIRELESS_CHRG1, PU_PD_OD, PAD4, 0x04, 0x2, &pin_gpio10_info, &pin_wireless_chrg1_info, NULL, NULL), 543 PALMAS_PINGROUP(gpio11, GPIO11_RCM, PU_PD_OD, PAD4, 0x08, 0x3, &pin_gpio11_info, &pin_rcm_info, NULL, NULL), 544 PALMAS_PINGROUP(gpio12, GPIO12_SIM2RSTO, PU_PD_OD, PAD4, 0x10, 0x4, &pin_gpio12_info, &pin_sim2rsto_info, NULL, NULL), 545 PALMAS_PINGROUP(gpio13, GPIO13, NONE, NONE, 0x00, 0x0, &pin_gpio13_info, NULL, NULL, NULL), 546 PALMAS_PINGROUP(gpio14, GPIO14, NONE, NONE, 0x00, 0x0, &pin_gpio14_info, NULL, NULL, NULL), 547 PALMAS_PINGROUP(gpio15, GPIO15_SIM2RSTI, PU_PD_OD, PAD4, 0x80, 0x7, &pin_gpio15_info, &pin_sim2rsti_info, NULL, NULL), 548 PALMAS_PINGROUP(vac, VAC, PU_PD_OD, PAD1, 0x02, 0x1, &pin_vac_info, &pin_vacok_info, NULL, NULL), 549 PALMAS_PINGROUP(powergood, POWERGOOD_USB_PSEL, PU_PD_OD, PAD1, 0x01, 0x0, &pin_powergood_info, &pin_usb_psel_info, NULL, NULL), 550 PALMAS_PINGROUP(nreswarm, NRESWARM, NONE, NONE, 0x0, 0x0, &pin_nreswarm_info, NULL, NULL, NULL), 551 PALMAS_PINGROUP(pwrdown, PWRDOWN, NONE, NONE, 0x0, 0x0, &pin_pwrdown_info, NULL, NULL, NULL), 552 PALMAS_PINGROUP(gpadc_start, GPADC_START, NONE, NONE, 0x0, 0x0, &pin_gpadc_start_info, NULL, NULL, NULL), 553 PALMAS_PINGROUP(reset_in, RESET_IN, NONE, NONE, 0x0, 0x0, &pin_reset_in_info, NULL, NULL, NULL), 554 PALMAS_PINGROUP(nsleep, NSLEEP, NONE, NONE, 0x0, 0x0, &pin_nsleep_info, NULL, NULL, NULL), 555 PALMAS_PINGROUP(enable1, ENABLE1, NONE, NONE, 0x0, 0x0, &pin_enable1_info, NULL, NULL, NULL), 556 PALMAS_PINGROUP(enable2, ENABLE2, NONE, NONE, 0x0, 0x0, &pin_enable2_info, NULL, NULL, NULL), 557 PALMAS_PINGROUP(int, INT, NONE, NONE, 0x0, 0x0, &pin_int_info, NULL, NULL, NULL), 558}; 559 560static int palmas_pinctrl_get_pin_mux(struct palmas_pctrl_chip_info *pci) 561{ 562 const struct palmas_pingroup *g; 563 unsigned int val; 564 int ret; 565 int i; 566 567 for (i = 0; i < pci->num_pin_groups; ++i) { 568 g = &pci->pin_groups[i]; 569 if (g->mux_reg_base == PALMAS_NONE_BASE) { 570 pci->pins_current_opt[i] = 0; 571 continue; 572 } 573 ret = palmas_read(pci->palmas, g->mux_reg_base, 574 g->mux_reg_add, &val); 575 if (ret < 0) { 576 dev_err(pci->dev, "mux_reg 0x%02x read failed: %d\n", 577 g->mux_reg_add, ret); 578 return ret; 579 } 580 val &= g->mux_reg_mask; 581 pci->pins_current_opt[i] = val >> g->mux_bit_shift; 582 } 583 return 0; 584} 585 586static int palmas_pinctrl_set_dvfs1(struct palmas_pctrl_chip_info *pci, 587 bool enable) 588{ 589 int ret; 590 int val; 591 592 val = enable ? PALMAS_PRIMARY_SECONDARY_PAD3_DVFS1 : 0; 593 ret = palmas_update_bits(pci->palmas, PALMAS_PU_PD_OD_BASE, 594 PALMAS_PRIMARY_SECONDARY_PAD3, 595 PALMAS_PRIMARY_SECONDARY_PAD3_DVFS1, val); 596 if (ret < 0) 597 dev_err(pci->dev, "SECONDARY_PAD3 update failed %d\n", ret); 598 return ret; 599} 600 601static int palmas_pinctrl_set_dvfs2(struct palmas_pctrl_chip_info *pci, 602 bool enable) 603{ 604 int ret; 605 int val; 606 607 val = enable ? PALMAS_PRIMARY_SECONDARY_PAD3_DVFS2 : 0; 608 ret = palmas_update_bits(pci->palmas, PALMAS_PU_PD_OD_BASE, 609 PALMAS_PRIMARY_SECONDARY_PAD3, 610 PALMAS_PRIMARY_SECONDARY_PAD3_DVFS2, val); 611 if (ret < 0) 612 dev_err(pci->dev, "SECONDARY_PAD3 update failed %d\n", ret); 613 return ret; 614} 615 616static int palmas_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) 617{ 618 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 619 620 return pci->num_pin_groups; 621} 622 623static const char *palmas_pinctrl_get_group_name(struct pinctrl_dev *pctldev, 624 unsigned group) 625{ 626 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 627 628 return pci->pin_groups[group].name; 629} 630 631static int palmas_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, 632 unsigned group, const unsigned **pins, unsigned *num_pins) 633{ 634 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 635 636 *pins = pci->pin_groups[group].pins; 637 *num_pins = pci->pin_groups[group].npins; 638 return 0; 639} 640 641static const struct pinctrl_ops palmas_pinctrl_ops = { 642 .get_groups_count = palmas_pinctrl_get_groups_count, 643 .get_group_name = palmas_pinctrl_get_group_name, 644 .get_group_pins = palmas_pinctrl_get_group_pins, 645 .dt_node_to_map = pinconf_generic_dt_node_to_map_pin, 646 .dt_free_map = pinctrl_utils_free_map, 647}; 648 649static int palmas_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev) 650{ 651 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 652 653 return pci->num_functions; 654} 655 656static const char *palmas_pinctrl_get_func_name(struct pinctrl_dev *pctldev, 657 unsigned function) 658{ 659 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 660 661 return pci->functions[function].name; 662} 663 664static int palmas_pinctrl_get_func_groups(struct pinctrl_dev *pctldev, 665 unsigned function, const char * const **groups, 666 unsigned * const num_groups) 667{ 668 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 669 670 *groups = pci->functions[function].groups; 671 *num_groups = pci->functions[function].ngroups; 672 return 0; 673} 674 675static int palmas_pinctrl_set_mux(struct pinctrl_dev *pctldev, 676 unsigned function, 677 unsigned group) 678{ 679 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 680 const struct palmas_pingroup *g; 681 int i; 682 int ret; 683 684 g = &pci->pin_groups[group]; 685 686 /* If direct option is provided here */ 687 if (function <= PALMAS_PINMUX_OPTION3) { 688 if (!g->opt[function]) { 689 dev_err(pci->dev, "Pin %s does not support option %d\n", 690 g->name, function); 691 return -EINVAL; 692 } 693 i = function; 694 } else { 695 for (i = 0; i < ARRAY_SIZE(g->opt); i++) { 696 if (!g->opt[i]) 697 continue; 698 if (g->opt[i]->mux_opt == function) 699 break; 700 } 701 if (WARN_ON(i == ARRAY_SIZE(g->opt))) { 702 dev_err(pci->dev, "Pin %s does not support option %d\n", 703 g->name, function); 704 return -EINVAL; 705 } 706 } 707 708 if (g->mux_reg_base == PALMAS_NONE_BASE) { 709 if (WARN_ON(i != 0)) 710 return -EINVAL; 711 return 0; 712 } 713 714 dev_dbg(pci->dev, "%s(): Base0x%02x:0x%02x:0x%02x:0x%02x\n", 715 __func__, g->mux_reg_base, g->mux_reg_add, 716 g->mux_reg_mask, i << g->mux_bit_shift); 717 718 ret = palmas_update_bits(pci->palmas, g->mux_reg_base, g->mux_reg_add, 719 g->mux_reg_mask, i << g->mux_bit_shift); 720 if (ret < 0) { 721 dev_err(pci->dev, "Reg 0x%02x update failed: %d\n", 722 g->mux_reg_add, ret); 723 return ret; 724 } 725 pci->pins_current_opt[group] = i; 726 return 0; 727} 728 729static const struct pinmux_ops palmas_pinmux_ops = { 730 .get_functions_count = palmas_pinctrl_get_funcs_count, 731 .get_function_name = palmas_pinctrl_get_func_name, 732 .get_function_groups = palmas_pinctrl_get_func_groups, 733 .set_mux = palmas_pinctrl_set_mux, 734}; 735 736static int palmas_pinconf_get(struct pinctrl_dev *pctldev, 737 unsigned pin, unsigned long *config) 738{ 739 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 740 enum pin_config_param param = pinconf_to_config_param(*config); 741 const struct palmas_pingroup *g; 742 const struct palmas_pin_info *opt; 743 unsigned int val; 744 int ret; 745 int base, add; 746 int rval; 747 int arg; 748 int group_nr; 749 750 for (group_nr = 0; group_nr < pci->num_pin_groups; ++group_nr) { 751 if (pci->pin_groups[group_nr].pins[0] == pin) 752 break; 753 } 754 755 if (group_nr == pci->num_pin_groups) { 756 dev_err(pci->dev, 757 "Pinconf is not supported for pin-id %d\n", pin); 758 return -ENOTSUPP; 759 } 760 761 g = &pci->pin_groups[group_nr]; 762 opt = g->opt[pci->pins_current_opt[group_nr]]; 763 if (!opt) { 764 dev_err(pci->dev, 765 "Pinconf is not supported for pin %s\n", g->name); 766 return -ENOTSUPP; 767 } 768 769 switch (param) { 770 case PIN_CONFIG_BIAS_DISABLE: 771 case PIN_CONFIG_BIAS_PULL_UP: 772 case PIN_CONFIG_BIAS_PULL_DOWN: 773 if (!opt->pud_info) { 774 dev_err(pci->dev, 775 "PULL control not supported for pin %s\n", 776 g->name); 777 return -ENOTSUPP; 778 } 779 base = opt->pud_info->pullup_dn_reg_base; 780 add = opt->pud_info->pullup_dn_reg_add; 781 ret = palmas_read(pci->palmas, base, add, &val); 782 if (ret < 0) { 783 dev_err(pci->dev, "Reg 0x%02x read failed: %d\n", 784 add, ret); 785 return ret; 786 } 787 788 rval = val & opt->pud_info->pullup_dn_mask; 789 arg = 0; 790 if ((opt->pud_info->normal_val >= 0) && 791 (opt->pud_info->normal_val == rval) && 792 (param == PIN_CONFIG_BIAS_DISABLE)) 793 arg = 1; 794 else if ((opt->pud_info->pull_up_val >= 0) && 795 (opt->pud_info->pull_up_val == rval) && 796 (param == PIN_CONFIG_BIAS_PULL_UP)) 797 arg = 1; 798 else if ((opt->pud_info->pull_dn_val >= 0) && 799 (opt->pud_info->pull_dn_val == rval) && 800 (param == PIN_CONFIG_BIAS_PULL_DOWN)) 801 arg = 1; 802 break; 803 804 case PIN_CONFIG_DRIVE_OPEN_DRAIN: 805 if (!opt->od_info) { 806 dev_err(pci->dev, 807 "OD control not supported for pin %s\n", 808 g->name); 809 return -ENOTSUPP; 810 } 811 base = opt->od_info->od_reg_base; 812 add = opt->od_info->od_reg_add; 813 ret = palmas_read(pci->palmas, base, add, &val); 814 if (ret < 0) { 815 dev_err(pci->dev, "Reg 0x%02x read failed: %d\n", 816 add, ret); 817 return ret; 818 } 819 rval = val & opt->od_info->od_mask; 820 arg = -1; 821 if ((opt->od_info->od_disable >= 0) && 822 (opt->od_info->od_disable == rval)) 823 arg = 0; 824 else if ((opt->od_info->od_enable >= 0) && 825 (opt->od_info->od_enable == rval)) 826 arg = 1; 827 if (arg < 0) { 828 dev_err(pci->dev, 829 "OD control not supported for pin %s\n", 830 g->name); 831 return -ENOTSUPP; 832 } 833 break; 834 835 default: 836 dev_err(pci->dev, "Properties not supported\n"); 837 return -ENOTSUPP; 838 } 839 840 *config = pinconf_to_config_packed(param, (u16)arg); 841 return 0; 842} 843 844static int palmas_pinconf_set(struct pinctrl_dev *pctldev, 845 unsigned pin, unsigned long *configs, 846 unsigned num_configs) 847{ 848 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev); 849 enum pin_config_param param; 850 u32 param_val; 851 const struct palmas_pingroup *g; 852 const struct palmas_pin_info *opt; 853 int ret; 854 int base, add, mask; 855 int rval; 856 int group_nr; 857 int i; 858 859 for (group_nr = 0; group_nr < pci->num_pin_groups; ++group_nr) { 860 if (pci->pin_groups[group_nr].pins[0] == pin) 861 break; 862 } 863 864 if (group_nr == pci->num_pin_groups) { 865 dev_err(pci->dev, 866 "Pinconf is not supported for pin-id %d\n", pin); 867 return -ENOTSUPP; 868 } 869 870 g = &pci->pin_groups[group_nr]; 871 opt = g->opt[pci->pins_current_opt[group_nr]]; 872 if (!opt) { 873 dev_err(pci->dev, 874 "Pinconf is not supported for pin %s\n", g->name); 875 return -ENOTSUPP; 876 } 877 878 for (i = 0; i < num_configs; i++) { 879 param = pinconf_to_config_param(configs[i]); 880 param_val = pinconf_to_config_argument(configs[i]); 881 882 switch (param) { 883 case PIN_CONFIG_BIAS_DISABLE: 884 case PIN_CONFIG_BIAS_PULL_UP: 885 case PIN_CONFIG_BIAS_PULL_DOWN: 886 if (!opt->pud_info) { 887 dev_err(pci->dev, 888 "PULL control not supported for pin %s\n", 889 g->name); 890 return -ENOTSUPP; 891 } 892 base = opt->pud_info->pullup_dn_reg_base; 893 add = opt->pud_info->pullup_dn_reg_add; 894 mask = opt->pud_info->pullup_dn_mask; 895 896 if (param == PIN_CONFIG_BIAS_DISABLE) 897 rval = opt->pud_info->normal_val; 898 else if (param == PIN_CONFIG_BIAS_PULL_UP) 899 rval = opt->pud_info->pull_up_val; 900 else 901 rval = opt->pud_info->pull_dn_val; 902 903 if (rval < 0) { 904 dev_err(pci->dev, 905 "PULL control not supported for pin %s\n", 906 g->name); 907 return -ENOTSUPP; 908 } 909 break; 910 911 case PIN_CONFIG_DRIVE_OPEN_DRAIN: 912 if (!opt->od_info) { 913 dev_err(pci->dev, 914 "OD control not supported for pin %s\n", 915 g->name); 916 return -ENOTSUPP; 917 } 918 base = opt->od_info->od_reg_base; 919 add = opt->od_info->od_reg_add; 920 mask = opt->od_info->od_mask; 921 if (param_val == 0) 922 rval = opt->od_info->od_disable; 923 else 924 rval = opt->od_info->od_enable; 925 if (rval < 0) { 926 dev_err(pci->dev, 927 "OD control not supported for pin %s\n", 928 g->name); 929 return -ENOTSUPP; 930 } 931 break; 932 default: 933 dev_err(pci->dev, "Properties not supported\n"); 934 return -ENOTSUPP; 935 } 936 937 dev_dbg(pci->dev, "%s(): Add0x%02x:0x%02x:0x%02x:0x%02x\n", 938 __func__, base, add, mask, rval); 939 ret = palmas_update_bits(pci->palmas, base, add, mask, rval); 940 if (ret < 0) { 941 dev_err(pci->dev, "Reg 0x%02x update failed: %d\n", 942 add, ret); 943 return ret; 944 } 945 } /* for each config */ 946 947 return 0; 948} 949 950static const struct pinconf_ops palmas_pinconf_ops = { 951 .pin_config_get = palmas_pinconf_get, 952 .pin_config_set = palmas_pinconf_set, 953}; 954 955static struct pinctrl_desc palmas_pinctrl_desc = { 956 .pctlops = &palmas_pinctrl_ops, 957 .pmxops = &palmas_pinmux_ops, 958 .confops = &palmas_pinconf_ops, 959 .owner = THIS_MODULE, 960}; 961 962struct palmas_pinctrl_data { 963 const struct palmas_pingroup *pin_groups; 964 int num_pin_groups; 965}; 966 967static struct palmas_pinctrl_data tps65913_pinctrl_data = { 968 .pin_groups = tps65913_pingroups, 969 .num_pin_groups = ARRAY_SIZE(tps65913_pingroups), 970}; 971 972static struct palmas_pinctrl_data tps80036_pinctrl_data = { 973 .pin_groups = tps80036_pingroups, 974 .num_pin_groups = ARRAY_SIZE(tps80036_pingroups), 975}; 976 977static const struct of_device_id palmas_pinctrl_of_match[] = { 978 { .compatible = "ti,palmas-pinctrl", .data = &tps65913_pinctrl_data}, 979 { .compatible = "ti,tps65913-pinctrl", .data = &tps65913_pinctrl_data}, 980 { .compatible = "ti,tps80036-pinctrl", .data = &tps80036_pinctrl_data}, 981 { }, 982}; 983MODULE_DEVICE_TABLE(of, palmas_pinctrl_of_match); 984 985static int palmas_pinctrl_probe(struct platform_device *pdev) 986{ 987 struct palmas_pctrl_chip_info *pci; 988 const struct palmas_pinctrl_data *pinctrl_data = &tps65913_pinctrl_data; 989 int ret; 990 bool enable_dvfs1 = false; 991 bool enable_dvfs2 = false; 992 993 if (pdev->dev.of_node) { 994 pinctrl_data = of_device_get_match_data(&pdev->dev); 995 enable_dvfs1 = of_property_read_bool(pdev->dev.of_node, 996 "ti,palmas-enable-dvfs1"); 997 enable_dvfs2 = of_property_read_bool(pdev->dev.of_node, 998 "ti,palmas-enable-dvfs2"); 999 } 1000 1001 pci = devm_kzalloc(&pdev->dev, sizeof(*pci), GFP_KERNEL); 1002 if (!pci) 1003 return -ENOMEM; 1004 1005 pci->dev = &pdev->dev; 1006 pci->palmas = dev_get_drvdata(pdev->dev.parent); 1007 1008 pci->pins = palmas_pins_desc; 1009 pci->num_pins = ARRAY_SIZE(palmas_pins_desc); 1010 pci->functions = palmas_pin_function; 1011 pci->num_functions = ARRAY_SIZE(palmas_pin_function); 1012 pci->pin_groups = pinctrl_data->pin_groups; 1013 pci->num_pin_groups = pinctrl_data->num_pin_groups; 1014 1015 platform_set_drvdata(pdev, pci); 1016 1017 palmas_pinctrl_set_dvfs1(pci, enable_dvfs1); 1018 palmas_pinctrl_set_dvfs2(pci, enable_dvfs2); 1019 ret = palmas_pinctrl_get_pin_mux(pci); 1020 if (ret < 0) { 1021 dev_err(&pdev->dev, 1022 "Reading pinctrol option register failed: %d\n", ret); 1023 return ret; 1024 } 1025 1026 palmas_pinctrl_desc.name = dev_name(&pdev->dev); 1027 palmas_pinctrl_desc.pins = palmas_pins_desc; 1028 palmas_pinctrl_desc.npins = ARRAY_SIZE(palmas_pins_desc); 1029 pci->pctl = devm_pinctrl_register(&pdev->dev, &palmas_pinctrl_desc, 1030 pci); 1031 if (IS_ERR(pci->pctl)) { 1032 dev_err(&pdev->dev, "Couldn't register pinctrl driver\n"); 1033 return PTR_ERR(pci->pctl); 1034 } 1035 return 0; 1036} 1037 1038static struct platform_driver palmas_pinctrl_driver = { 1039 .driver = { 1040 .name = "palmas-pinctrl", 1041 .of_match_table = palmas_pinctrl_of_match, 1042 }, 1043 .probe = palmas_pinctrl_probe, 1044}; 1045 1046module_platform_driver(palmas_pinctrl_driver); 1047 1048MODULE_DESCRIPTION("Palmas pin control driver"); 1049MODULE_AUTHOR("Laxman Dewangan<ldewangan@nvidia.com>"); 1050MODULE_ALIAS("platform:palmas-pinctrl"); 1051MODULE_LICENSE("GPL v2");