• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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