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