aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2013-08-06 09:12:35 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-08-14 15:00:42 -0400
commit0a8d3e2412841c6b1dab1006fd5f7ab5b689db21 (patch)
tree85073dffb6f90054e59446578315ec3a67ffc5e8 /drivers
parente81c8f18afc4fdd6e34d8c83814b8b5134dbb30f (diff)
pinctrl: palmas: add pincontrol driver
TI Palmas series Power Management IC have multiple pins which can be configured for different functionality. This pins can be configured for different function. Also their properties like pull up/down, open drain enable/disable are configurable. Add support for pincontrol driver Palmas series device like TPS65913, TPS80036. The driver supports to be register from DT only. Changes from V1: - Add generic property for pins and functions in pinconf-generic. - Add APIs to map the DT and subnode. - Move common utils APIs to the pinctrl-utils from this file. - Update the binding document accordingly. Changes from V2: - Add ack by Lee. - Correct the binding docs. Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Acked-by: Lee Jones <lee.jones@linaro.org> Reviewed-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pinctrl/Kconfig10
-rw-r--r--drivers/pinctrl/Makefile1
-rw-r--r--drivers/pinctrl/pinctrl-palmas.c1085
3 files changed, 1096 insertions, 0 deletions
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index bc830af1b23d..8542cd4a176a 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -261,6 +261,16 @@ config PINCTRL_EXYNOS5440
261 select PINMUX 261 select PINMUX
262 select PINCONF 262 select PINCONF
263 263
264config PINCTRL_PALMAS
265 bool "Pinctrl driver for the PALMA Series MFD devices"
266 depends on OF && MFD_PALMAS
267 select GENERIC_PINCONF
268 help
269 Palmas device supports the configuration of pins for different
270 functionality. This driver supports the pinmux, push-pull and
271 open drain configuration for the Palmas series devices like
272 TPS65913, TPS80036 etc.
273
264config PINCTRL_S3C24XX 274config PINCTRL_S3C24XX
265 bool "Samsung S3C24XX SoC pinctrl driver" 275 bool "Samsung S3C24XX SoC pinctrl driver"
266 depends on ARCH_S3C24XX 276 depends on ARCH_S3C24XX
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
index bc03a6eb8255..496d9bf9e1b9 100644
--- a/drivers/pinctrl/Makefile
+++ b/drivers/pinctrl/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_PINCTRL_NOMADIK) += pinctrl-nomadik.o
32obj-$(CONFIG_PINCTRL_STN8815) += pinctrl-nomadik-stn8815.o 32obj-$(CONFIG_PINCTRL_STN8815) += pinctrl-nomadik-stn8815.o
33obj-$(CONFIG_PINCTRL_DB8500) += pinctrl-nomadik-db8500.o 33obj-$(CONFIG_PINCTRL_DB8500) += pinctrl-nomadik-db8500.o
34obj-$(CONFIG_PINCTRL_DB8540) += pinctrl-nomadik-db8540.o 34obj-$(CONFIG_PINCTRL_DB8540) += pinctrl-nomadik-db8540.o
35obj-$(CONFIG_PINCTRL_PALMAS) += pinctrl-palmas.o
35obj-$(CONFIG_PINCTRL_ROCKCHIP) += pinctrl-rockchip.o 36obj-$(CONFIG_PINCTRL_ROCKCHIP) += pinctrl-rockchip.o
36obj-$(CONFIG_PINCTRL_SINGLE) += pinctrl-single.o 37obj-$(CONFIG_PINCTRL_SINGLE) += pinctrl-single.o
37obj-$(CONFIG_PINCTRL_SIRF) += sirf/ 38obj-$(CONFIG_PINCTRL_SIRF) += sirf/
diff --git a/drivers/pinctrl/pinctrl-palmas.c b/drivers/pinctrl/pinctrl-palmas.c
new file mode 100644
index 000000000000..2697c2efd74b
--- /dev/null
+++ b/drivers/pinctrl/pinctrl-palmas.c
@@ -0,0 +1,1085 @@
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
69struct palmas_pin_function {
70 const char *name;
71 const char * const *groups;
72 unsigned ngroups;
73};
74
75struct 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
88static 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
117static 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
146static 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
165static const char * const opt2_groups[] = {
166 "gpio1",
167 "gpio2",
168 "gpio5",
169 "gpio7",
170};
171
172static const char * const opt3_groups[] = {
173 "gpio1",
174 "gpio2",
175};
176
177static 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
196static const char * const led_groups[] = {
197 "gpio1",
198 "gpio2",
199};
200
201static const char * const pwm_groups[] = {
202 "gpio1",
203 "gpio2",
204};
205
206static const char * const regen_groups[] = {
207 "gpio2",
208};
209
210static const char * const sysen_groups[] = {
211 "gpio4",
212 "gpio6",
213};
214
215static const char * const clk32kgaudio_groups[] = {
216 "gpio5",
217};
218
219static const char * const id_groups[] = {
220 "gpio0",
221};
222
223static const char * const vbus_det_groups[] = {
224 "gpio1",
225};
226
227static const char * const chrg_det_groups[] = {
228 "gpio3",
229};
230
231static const char * const vac_groups[] = {
232 "vac",
233};
234
235static const char * const vacok_groups[] = {
236 "vac",
237};
238
239static const char * const powergood_groups[] = {
240 "powergood",
241};
242
243static const char * const usb_psel_groups[] = {
244 "gpio5",
245 "powergood",
246};
247
248static const char * const msecure_groups[] = {
249 "gpio7",
250};
251
252static const char * const pwrhold_groups[] = {
253 "gpio7",
254};
255
256static const char * const int_groups[] = {
257 "int",
258};
259
260static const char * const nreswarm_groups[] = {
261 "nreswarm",
262};
263
264static const char * const simrsto_groups[] = {
265 "gpio12",
266};
267
268static const char * const simrsti_groups[] = {
269 "gpio8",
270 "gpio15",
271};
272
273static const char * const low_vbat_groups[] = {
274 "gpio9",
275};
276
277static const char * const wireless_chrg1_groups[] = {
278 "gpio10",
279};
280
281static const char * const rcm_groups[] = {
282 "gpio11",
283};
284
285static const char * const pwrdown_groups[] = {
286 "pwrdown",
287};
288
289static const char * const gpadc_start_groups[] = {
290 "gpadc_start",
291};
292
293static const char * const reset_in_groups[] = {
294 "reset_in",
295};
296
297static const char * const nsleep_groups[] = {
298 "nsleep",
299};
300
301static 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
339static 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
351enum 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
358struct 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
367struct 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
375struct 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
381struct 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) \
393static 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
402PULL_UP_DN(nreswarm, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL1, 0x2, 0x0, 0x2, -1);
403PULL_UP_DN(pwrdown, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL1, 0x4, 0x0, -1, 0x4);
404PULL_UP_DN(gpadc_start, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL1, 0x30, 0x0, 0x20, 0x10);
405PULL_UP_DN(reset_in, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL1, 0x40, 0x0, -1, 0x40);
406PULL_UP_DN(nsleep, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL2, 0x3, 0x0, 0x2, 0x1);
407PULL_UP_DN(enable1, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL2, 0xC, 0x0, 0x8, 0x4);
408PULL_UP_DN(enable2, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL2, 0x30, 0x0, 0x20, 0x10);
409PULL_UP_DN(vacok, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL3, 0x40, 0x0, -1, 0x40);
410PULL_UP_DN(chrg_det, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL3, 0x10, 0x0, -1, 0x10);
411PULL_UP_DN(pwrhold, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL3, 0x4, 0x0, -1, 0x4);
412PULL_UP_DN(msecure, PU_PD_OD, PALMAS_PU_PD_INPUT_CTRL3, 0x1, 0x0, -1, 0x1);
413PULL_UP_DN(id, USB_OTG, PALMAS_USB_ID_CTRL_SET, 0x40, 0x0, 0x40, -1);
414PULL_UP_DN(gpio0, GPIO, PALMAS_PU_PD_GPIO_CTRL1, 0x04, 0, -1, 1);
415PULL_UP_DN(gpio1, GPIO, PALMAS_PU_PD_GPIO_CTRL1, 0x0C, 0, 0x8, 0x4);
416PULL_UP_DN(gpio2, GPIO, PALMAS_PU_PD_GPIO_CTRL1, 0x30, 0x0, 0x20, 0x10);
417PULL_UP_DN(gpio3, GPIO, PALMAS_PU_PD_GPIO_CTRL1, 0x40, 0x0, -1, 0x40);
418PULL_UP_DN(gpio4, GPIO, PALMAS_PU_PD_GPIO_CTRL2, 0x03, 0x0, 0x2, 0x1);
419PULL_UP_DN(gpio5, GPIO, PALMAS_PU_PD_GPIO_CTRL2, 0x0c, 0x0, 0x8, 0x4);
420PULL_UP_DN(gpio6, GPIO, PALMAS_PU_PD_GPIO_CTRL2, 0x30, 0x0, 0x20, 0x10);
421PULL_UP_DN(gpio7, GPIO, PALMAS_PU_PD_GPIO_CTRL2, 0x40, 0x0, -1, 0x40);
422PULL_UP_DN(gpio9, GPIO, PALMAS_PU_PD_GPIO_CTRL3, 0x0C, 0x0, 0x8, 0x4);
423PULL_UP_DN(gpio10, GPIO, PALMAS_PU_PD_GPIO_CTRL3, 0x30, 0x0, 0x20, 0x10);
424PULL_UP_DN(gpio11, GPIO, PALMAS_PU_PD_GPIO_CTRL3, 0xC0, 0x0, 0x80, 0x40);
425PULL_UP_DN(gpio13, GPIO, PALMAS_PU_PD_GPIO_CTRL4, 0x04, 0x0, -1, 0x04);
426PULL_UP_DN(gpio14, GPIO, PALMAS_PU_PD_GPIO_CTRL4, 0x30, 0x0, 0x20, 0x10);
427
428#define OD_INFO(_name, _rbase, _add, _mask, _ev, _dv) \
429static 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
437OD_INFO(gpio1, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL, 0x1, 0x1, 0x0);
438OD_INFO(gpio2, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL, 0x2, 0x2, 0x0);
439OD_INFO(gpio5, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL, 0x20, 0x20, 0x0);
440OD_INFO(gpio10, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL2, 0x04, 0x04, 0x0);
441OD_INFO(gpio13, GPIO, PALMAS_OD_OUTPUT_GPIO_CTRL2, 0x20, 0x20, 0x0);
442OD_INFO(int, PU_PD_OD, PALMAS_OD_OUTPUT_CTRL, 0x8, 0x8, 0x0);
443OD_INFO(pwm1, PU_PD_OD, PALMAS_OD_OUTPUT_CTRL, 0x20, 0x20, 0x0);
444OD_INFO(pwm2, PU_PD_OD, PALMAS_OD_OUTPUT_CTRL, 0x80, 0x80, 0x0);
445OD_INFO(vbus_det, PU_PD_OD, PALMAS_OD_OUTPUT_CTRL, 0x40, 0x40, 0x0);
446
447#define PIN_INFO(_name, _id, _pud_info, _od_info) \
448static 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
454PIN_INFO(gpio0, GPIO, &pud_gpio0_info, NULL);
455PIN_INFO(gpio1, GPIO, &pud_gpio1_info, &od_gpio1_info);
456PIN_INFO(gpio2, GPIO, &pud_gpio2_info, &od_gpio2_info);
457PIN_INFO(gpio3, GPIO, &pud_gpio3_info, NULL);
458PIN_INFO(gpio4, GPIO, &pud_gpio4_info, NULL);
459PIN_INFO(gpio5, GPIO, &pud_gpio5_info, &od_gpio5_info);
460PIN_INFO(gpio6, GPIO, &pud_gpio6_info, NULL);
461PIN_INFO(gpio7, GPIO, &pud_gpio7_info, NULL);
462PIN_INFO(gpio8, GPIO, NULL, NULL);
463PIN_INFO(gpio9, GPIO, &pud_gpio9_info, NULL);
464PIN_INFO(gpio10, GPIO, &pud_gpio10_info, &od_gpio10_info);
465PIN_INFO(gpio11, GPIO, &pud_gpio11_info, NULL);
466PIN_INFO(gpio12, GPIO, NULL, NULL);
467PIN_INFO(gpio13, GPIO, &pud_gpio13_info, &od_gpio13_info);
468PIN_INFO(gpio14, GPIO, &pud_gpio14_info, NULL);
469PIN_INFO(gpio15, GPIO, NULL, NULL);
470PIN_INFO(id, ID, &pud_id_info, NULL);
471PIN_INFO(led1, LED, NULL, NULL);
472PIN_INFO(led2, LED, NULL, NULL);
473PIN_INFO(regen, REGEN, NULL, NULL);
474PIN_INFO(sysen1, SYSEN, NULL, NULL);
475PIN_INFO(sysen2, SYSEN, NULL, NULL);
476PIN_INFO(int, INT, NULL, &od_int_info);
477PIN_INFO(pwm1, PWM, NULL, &od_pwm1_info);
478PIN_INFO(pwm2, PWM, NULL, &od_pwm2_info);
479PIN_INFO(vacok, VACOK, &pud_vacok_info, NULL);
480PIN_INFO(chrg_det, CHRG_DET, &pud_chrg_det_info, NULL);
481PIN_INFO(pwrhold, PWRHOLD, &pud_pwrhold_info, NULL);
482PIN_INFO(msecure, MSECURE, &pud_msecure_info, NULL);
483PIN_INFO(nreswarm, NA, &pud_nreswarm_info, NULL);
484PIN_INFO(pwrdown, NA, &pud_pwrdown_info, NULL);
485PIN_INFO(gpadc_start, NA, &pud_gpadc_start_info, NULL);
486PIN_INFO(reset_in, NA, &pud_reset_in_info, NULL);
487PIN_INFO(nsleep, NA, &pud_nsleep_info, NULL);
488PIN_INFO(enable1, NA, &pud_enable1_info, NULL);
489PIN_INFO(enable2, NA, &pud_enable2_info, NULL);
490PIN_INFO(clk32kgaudio, CLK32KGAUDIO, NULL, NULL);
491PIN_INFO(usb_psel, USB_PSEL, NULL, NULL);
492PIN_INFO(vac, VAC, NULL, NULL);
493PIN_INFO(powergood, POWERGOOD, NULL, NULL);
494PIN_INFO(vbus_det, VBUS_DET, NULL, &od_vbus_det_info);
495PIN_INFO(sim1rsti, SIMRSTI, NULL, NULL);
496PIN_INFO(low_vbat, LOW_VBAT, NULL, NULL);
497PIN_INFO(rcm, RCM, NULL, NULL);
498PIN_INFO(sim2rsto, SIMRSTO, NULL, NULL);
499PIN_INFO(sim2rsti, SIMRSTI, NULL, NULL);
500PIN_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
523static 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
544static 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
573static 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
599static 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
614static 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
629static 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
636static 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
644static 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
654static 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,
659 .dt_free_map = pinctrl_utils_dt_free_map,
660};
661
662static 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
669static 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
677static 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
688static int palmas_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function,
689 unsigned group)
690{
691 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev);
692 const struct palmas_pingroup *g;
693 int i;
694 int ret;
695
696 g = &pci->pin_groups[group];
697
698 /* If direct option is provided here */
699 if (function <= PALMAS_PINMUX_OPTION3) {
700 if (!g->opt[function]) {
701 dev_err(pci->dev, "Pin %s does not support option %d\n",
702 g->name, function);
703 return -EINVAL;
704 }
705 i = function;
706 } else {
707 for (i = 0; i < ARRAY_SIZE(g->opt); i++) {
708 if (!g->opt[i])
709 continue;
710 if (g->opt[i]->mux_opt == function)
711 break;
712 }
713 if (WARN_ON(i == ARRAY_SIZE(g->opt))) {
714 dev_err(pci->dev, "Pin %s does not support option %d\n",
715 g->name, function);
716 return -EINVAL;
717 }
718 }
719
720 if (g->mux_reg_base == PALMAS_NONE_BASE) {
721 if (WARN_ON(i != 0))
722 return -EINVAL;
723 return 0;
724 }
725
726 dev_dbg(pci->dev, "%s(): Base0x%02x:0x%02x:0x%02x:0x%02x\n",
727 __func__, g->mux_reg_base, g->mux_reg_add,
728 g->mux_reg_mask, i << g->mux_bit_shift);
729
730 ret = palmas_update_bits(pci->palmas, g->mux_reg_base, g->mux_reg_add,
731 g->mux_reg_mask, i << g->mux_bit_shift);
732 if (ret < 0) {
733 dev_err(pci->dev, "Reg 0x%02x update failed: %d\n",
734 g->mux_reg_add, ret);
735 return ret;
736 }
737 pci->pins_current_opt[group] = i;
738 return 0;
739}
740
741static const struct pinmux_ops palmas_pinmux_ops = {
742 .get_functions_count = palmas_pinctrl_get_funcs_count,
743 .get_function_name = palmas_pinctrl_get_func_name,
744 .get_function_groups = palmas_pinctrl_get_func_groups,
745 .enable = palmas_pinctrl_enable,
746};
747
748static int palmas_pinconf_get(struct pinctrl_dev *pctldev,
749 unsigned pin, unsigned long *config)
750{
751 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev);
752 enum pin_config_param param = pinconf_to_config_param(*config);
753 const struct palmas_pingroup *g;
754 const struct palmas_pin_info *opt;
755 unsigned int val;
756 int ret;
757 int base, add;
758 int rval;
759 int arg;
760 int group_nr;
761
762 for (group_nr = 0; group_nr < pci->num_pin_groups; ++group_nr) {
763 if (pci->pin_groups[group_nr].pins[0] == pin)
764 break;
765 }
766
767 if (group_nr == pci->num_pin_groups) {
768 dev_err(pci->dev,
769 "Pinconf is not supported for pin-id %d\n", pin);
770 return -ENOTSUPP;
771 }
772
773 g = &pci->pin_groups[group_nr];
774 opt = g->opt[pci->pins_current_opt[group_nr]];
775 if (!opt) {
776 dev_err(pci->dev,
777 "Pinconf is not supported for pin %s\n", g->name);
778 return -ENOTSUPP;
779 }
780
781 switch (param) {
782 case PIN_CONFIG_BIAS_DISABLE:
783 case PIN_CONFIG_BIAS_PULL_UP:
784 case PIN_CONFIG_BIAS_PULL_DOWN:
785 if (!opt->pud_info) {
786 dev_err(pci->dev,
787 "PULL control not supported for pin %s\n",
788 g->name);
789 return -ENOTSUPP;
790 }
791 base = opt->pud_info->pullup_dn_reg_base;
792 add = opt->pud_info->pullup_dn_reg_add;
793 ret = palmas_read(pci->palmas, base, add, &val);
794 if (ret < 0) {
795 dev_err(pci->dev, "Reg 0x%02x read failed: %d\n",
796 add, ret);
797 return ret;
798 }
799
800 rval = val & opt->pud_info->pullup_dn_mask;
801 arg = 0;
802 if ((opt->pud_info->normal_val >= 0) &&
803 (opt->pud_info->normal_val == rval) &&
804 (param == PIN_CONFIG_BIAS_DISABLE))
805 arg = 1;
806 else if ((opt->pud_info->pull_up_val >= 0) &&
807 (opt->pud_info->pull_up_val == rval) &&
808 (param == PIN_CONFIG_BIAS_PULL_UP))
809 arg = 1;
810 else if ((opt->pud_info->pull_dn_val >= 0) &&
811 (opt->pud_info->pull_dn_val == rval) &&
812 (param == PIN_CONFIG_BIAS_PULL_DOWN))
813 arg = 1;
814 break;
815
816 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
817 if (!opt->od_info) {
818 dev_err(pci->dev,
819 "OD control not supported for pin %s\n",
820 g->name);
821 return -ENOTSUPP;
822 }
823 base = opt->od_info->od_reg_base;
824 add = opt->od_info->od_reg_add;
825 ret = palmas_read(pci->palmas, base, add, &val);
826 if (ret < 0) {
827 dev_err(pci->dev, "Reg 0x%02x read failed: %d\n",
828 add, ret);
829 return ret;
830 }
831 rval = val & opt->od_info->od_mask;
832 arg = -1;
833 if ((opt->od_info->od_disable >= 0) &&
834 (opt->od_info->od_disable == rval))
835 arg = 0;
836 else if ((opt->od_info->od_enable >= 0) &&
837 (opt->od_info->od_enable == rval))
838 arg = 1;
839 if (arg < 0) {
840 dev_err(pci->dev,
841 "OD control not supported for pin %s\n",
842 g->name);
843 return -ENOTSUPP;
844 }
845 break;
846
847 default:
848 dev_err(pci->dev, "Properties not supported\n");
849 return -ENOTSUPP;
850 }
851
852 *config = pinconf_to_config_packed(param, (u16)arg);
853 return 0;
854}
855
856static int palmas_pinconf_set(struct pinctrl_dev *pctldev,
857 unsigned pin, unsigned long config)
858{
859 struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev);
860 enum pin_config_param param = pinconf_to_config_param(config);
861 u16 param_val = pinconf_to_config_argument(config);
862 const struct palmas_pingroup *g;
863 const struct palmas_pin_info *opt;
864 int ret;
865 int base, add, mask;
866 int rval;
867 int group_nr;
868
869 for (group_nr = 0; group_nr < pci->num_pin_groups; ++group_nr) {
870 if (pci->pin_groups[group_nr].pins[0] == pin)
871 break;
872 }
873
874 if (group_nr == pci->num_pin_groups) {
875 dev_err(pci->dev,
876 "Pinconf is not supported for pin-id %d\n", pin);
877 return -ENOTSUPP;
878 }
879
880 g = &pci->pin_groups[group_nr];
881 opt = g->opt[pci->pins_current_opt[group_nr]];
882 if (!opt) {
883 dev_err(pci->dev,
884 "Pinconf is not supported for pin %s\n", g->name);
885 return -ENOTSUPP;
886 }
887
888 switch (param) {
889 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
890 return 0;
891 case PIN_CONFIG_BIAS_DISABLE:
892 case PIN_CONFIG_BIAS_PULL_UP:
893 case PIN_CONFIG_BIAS_PULL_DOWN:
894 if (!opt->pud_info) {
895 dev_err(pci->dev,
896 "PULL control not supported for pin %s\n",
897 g->name);
898 return -ENOTSUPP;
899 }
900 base = opt->pud_info->pullup_dn_reg_base;
901 add = opt->pud_info->pullup_dn_reg_add;
902 mask = opt->pud_info->pullup_dn_mask;
903
904 if (param == PIN_CONFIG_BIAS_DISABLE)
905 rval = opt->pud_info->normal_val;
906 else if (param == PIN_CONFIG_BIAS_PULL_UP)
907 rval = opt->pud_info->pull_up_val;
908 else
909 rval = opt->pud_info->pull_dn_val;
910
911 if (rval < 0) {
912 dev_err(pci->dev,
913 "PULL control not supported for pin %s\n",
914 g->name);
915 return -ENOTSUPP;
916 }
917 break;
918
919 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
920 if (!opt->od_info) {
921 dev_err(pci->dev,
922 "OD control not supported for pin %s\n",
923 g->name);
924 return -ENOTSUPP;
925 }
926 base = opt->od_info->od_reg_base;
927 add = opt->od_info->od_reg_add;
928 mask = opt->od_info->od_mask;
929 if (param_val == 0)
930 rval = opt->od_info->od_disable;
931 else
932 rval = opt->od_info->od_enable;
933 if (rval < 0) {
934 dev_err(pci->dev,
935 "OD control not supported for pin %s\n",
936 g->name);
937 return -ENOTSUPP;
938 }
939 break;
940 default:
941 dev_err(pci->dev, "Properties not supported\n");
942 return -ENOTSUPP;
943 }
944
945 dev_dbg(pci->dev, "%s(): Add0x%02x:0x%02x:0x%02x:0x%02x\n",
946 __func__, base, add, mask, rval);
947 ret = palmas_update_bits(pci->palmas, base, add, mask, rval);
948 if (ret < 0) {
949 dev_err(pci->dev, "Reg 0x%02x update failed: %d\n", add, ret);
950 return ret;
951 }
952 return 0;
953}
954
955static int palmas_pinconf_group_get(struct pinctrl_dev *pctldev,
956 unsigned group, unsigned long *config)
957{
958 dev_err(pctldev->dev, "palmas_pinconf_group_get op not supported\n");
959 return -ENOTSUPP;
960}
961
962static int palmas_pinconf_group_set(struct pinctrl_dev *pctldev,
963 unsigned group, unsigned long config)
964{
965 dev_err(pctldev->dev, "palmas_pinconf_group_set op not supported\n");
966 return -ENOTSUPP;
967}
968
969static const struct pinconf_ops palmas_pinconf_ops = {
970 .pin_config_get = palmas_pinconf_get,
971 .pin_config_set = palmas_pinconf_set,
972 .pin_config_group_get = palmas_pinconf_group_get,
973 .pin_config_group_set = palmas_pinconf_group_set,
974};
975
976static struct pinctrl_desc palmas_pinctrl_desc = {
977 .pctlops = &palmas_pinctrl_ops,
978 .pmxops = &palmas_pinmux_ops,
979 .confops = &palmas_pinconf_ops,
980 .owner = THIS_MODULE,
981};
982
983struct palmas_pinctrl_data {
984 const struct palmas_pingroup *pin_groups;
985 int num_pin_groups;
986};
987
988static struct palmas_pinctrl_data tps65913_pinctrl_data = {
989 .pin_groups = tps65913_pingroups,
990 .num_pin_groups = ARRAY_SIZE(tps65913_pingroups),
991};
992
993static struct palmas_pinctrl_data tps80036_pinctrl_data = {
994 .pin_groups = tps80036_pingroups,
995 .num_pin_groups = ARRAY_SIZE(tps80036_pingroups),
996};
997
998static struct of_device_id palmas_pinctrl_of_match[] = {
999 { .compatible = "ti,palmas-pinctrl", .data = &tps65913_pinctrl_data},
1000 { .compatible = "ti,tps65913-pinctrl", .data = &tps65913_pinctrl_data},
1001 { .compatible = "ti,tps80036-pinctrl", .data = &tps80036_pinctrl_data},
1002 { },
1003};
1004MODULE_DEVICE_TABLE(of, palmas_pinctrl_of_match);
1005
1006static int palmas_pinctrl_probe(struct platform_device *pdev)
1007{
1008 struct palmas_pctrl_chip_info *pci;
1009 const struct palmas_pinctrl_data *pinctrl_data = &tps65913_pinctrl_data;
1010 int ret;
1011 bool enable_dvfs1 = false;
1012 bool enable_dvfs2 = false;
1013
1014 if (pdev->dev.of_node) {
1015 const struct of_device_id *match;
1016 match = of_match_device(palmas_pinctrl_of_match, &pdev->dev);
1017 pinctrl_data = match->data;
1018 enable_dvfs1 = of_property_read_bool(pdev->dev.of_node,
1019 "ti,palmas-enable-dvfs1");
1020 enable_dvfs2 = of_property_read_bool(pdev->dev.of_node,
1021 "ti,palmas-enable-dvfs2");
1022 }
1023
1024 pci = devm_kzalloc(&pdev->dev, sizeof(*pci), GFP_KERNEL);
1025 if (!pci) {
1026 dev_err(&pdev->dev, "Malloc for pci failed\n");
1027 return -ENOMEM;
1028 }
1029
1030 pci->dev = &pdev->dev;
1031 pci->palmas = dev_get_drvdata(pdev->dev.parent);
1032
1033 pci->pins = palmas_pins_desc;
1034 pci->num_pins = ARRAY_SIZE(palmas_pins_desc);
1035 pci->functions = palmas_pin_function;
1036 pci->num_functions = ARRAY_SIZE(palmas_pin_function);
1037 pci->pin_groups = pinctrl_data->pin_groups;
1038 pci->num_pin_groups = pinctrl_data->num_pin_groups;
1039
1040 platform_set_drvdata(pdev, pci);
1041
1042 palmas_pinctrl_set_dvfs1(pci, enable_dvfs1);
1043 palmas_pinctrl_set_dvfs2(pci, enable_dvfs2);
1044 ret = palmas_pinctrl_get_pin_mux(pci);
1045 if (ret < 0) {
1046 dev_err(&pdev->dev,
1047 "Reading pinctrol option register failed: %d\n", ret);
1048 return ret;
1049 }
1050
1051 palmas_pinctrl_desc.name = dev_name(&pdev->dev);
1052 palmas_pinctrl_desc.pins = palmas_pins_desc;
1053 palmas_pinctrl_desc.npins = ARRAY_SIZE(palmas_pins_desc);
1054 pci->pctl = pinctrl_register(&palmas_pinctrl_desc, &pdev->dev, pci);
1055 if (!pci->pctl) {
1056 dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
1057 return -ENODEV;
1058 }
1059 return 0;
1060}
1061
1062static int palmas_pinctrl_remove(struct platform_device *pdev)
1063{
1064 struct palmas_pctrl_chip_info *pci = platform_get_drvdata(pdev);
1065
1066 pinctrl_unregister(pci->pctl);
1067 return 0;
1068}
1069
1070static struct platform_driver palmas_pinctrl_driver = {
1071 .driver = {
1072 .name = "palmas-pinctrl",
1073 .owner = THIS_MODULE,
1074 .of_match_table = palmas_pinctrl_of_match,
1075 },
1076 .probe = palmas_pinctrl_probe,
1077 .remove = palmas_pinctrl_remove,
1078};
1079
1080module_platform_driver(palmas_pinctrl_driver);
1081
1082MODULE_DESCRIPTION("Palmas pin control driver");
1083MODULE_AUTHOR("Laxman Dewangan<ldewangan@nvidia.com>");
1084MODULE_ALIAS("platform:palmas-pinctrl");
1085MODULE_LICENSE("GPL v2");