drm/i915/skl WaDisableSbeCacheDispatchPortSharing
[deliverable/linux.git] / drivers / pinctrl / qcom / pinctrl-spmi-gpio.c
CommitLineData
eadff302
II
1/*
2 * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <linux/gpio.h>
15#include <linux/module.h>
16#include <linux/of.h>
17#include <linux/pinctrl/pinconf-generic.h>
18#include <linux/pinctrl/pinconf.h>
19#include <linux/pinctrl/pinmux.h>
20#include <linux/platform_device.h>
21#include <linux/regmap.h>
22#include <linux/slab.h>
23#include <linux/types.h>
24
25#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
26
27#include "../core.h"
28#include "../pinctrl-utils.h"
29
30#define PMIC_GPIO_ADDRESS_RANGE 0x100
31
32/* type and subtype registers base address offsets */
33#define PMIC_GPIO_REG_TYPE 0x4
34#define PMIC_GPIO_REG_SUBTYPE 0x5
35
36/* GPIO peripheral type and subtype out_values */
37#define PMIC_GPIO_TYPE 0x10
38#define PMIC_GPIO_SUBTYPE_GPIO_4CH 0x1
39#define PMIC_GPIO_SUBTYPE_GPIOC_4CH 0x5
40#define PMIC_GPIO_SUBTYPE_GPIO_8CH 0x9
41#define PMIC_GPIO_SUBTYPE_GPIOC_8CH 0xd
42
43#define PMIC_MPP_REG_RT_STS 0x10
44#define PMIC_MPP_REG_RT_STS_VAL_MASK 0x1
45
46/* control register base address offsets */
47#define PMIC_GPIO_REG_MODE_CTL 0x40
48#define PMIC_GPIO_REG_DIG_VIN_CTL 0x41
49#define PMIC_GPIO_REG_DIG_PULL_CTL 0x42
50#define PMIC_GPIO_REG_DIG_OUT_CTL 0x45
51#define PMIC_GPIO_REG_EN_CTL 0x46
52
53/* PMIC_GPIO_REG_MODE_CTL */
54#define PMIC_GPIO_REG_MODE_VALUE_SHIFT 0x1
55#define PMIC_GPIO_REG_MODE_FUNCTION_SHIFT 1
56#define PMIC_GPIO_REG_MODE_FUNCTION_MASK 0x7
57#define PMIC_GPIO_REG_MODE_DIR_SHIFT 4
58#define PMIC_GPIO_REG_MODE_DIR_MASK 0x7
59
60/* PMIC_GPIO_REG_DIG_VIN_CTL */
61#define PMIC_GPIO_REG_VIN_SHIFT 0
62#define PMIC_GPIO_REG_VIN_MASK 0x7
63
64/* PMIC_GPIO_REG_DIG_PULL_CTL */
65#define PMIC_GPIO_REG_PULL_SHIFT 0
66#define PMIC_GPIO_REG_PULL_MASK 0x7
67
68#define PMIC_GPIO_PULL_DOWN 4
69#define PMIC_GPIO_PULL_DISABLE 5
70
71/* PMIC_GPIO_REG_DIG_OUT_CTL */
72#define PMIC_GPIO_REG_OUT_STRENGTH_SHIFT 0
73#define PMIC_GPIO_REG_OUT_STRENGTH_MASK 0x3
74#define PMIC_GPIO_REG_OUT_TYPE_SHIFT 4
75#define PMIC_GPIO_REG_OUT_TYPE_MASK 0x3
76
77/*
78 * Output type - indicates pin should be configured as push-pull,
79 * open drain or open source.
80 */
81#define PMIC_GPIO_OUT_BUF_CMOS 0
82#define PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS 1
83#define PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS 2
84
85/* PMIC_GPIO_REG_EN_CTL */
86#define PMIC_GPIO_REG_MASTER_EN_SHIFT 7
87
88#define PMIC_GPIO_PHYSICAL_OFFSET 1
89
90/* Qualcomm specific pin configurations */
91#define PMIC_GPIO_CONF_PULL_UP (PIN_CONFIG_END + 1)
92#define PMIC_GPIO_CONF_STRENGTH (PIN_CONFIG_END + 2)
93
94/**
95 * struct pmic_gpio_pad - keep current GPIO settings
96 * @base: Address base in SPMI device.
97 * @irq: IRQ number which this GPIO generate.
98 * @is_enabled: Set to false when GPIO should be put in high Z state.
99 * @out_value: Cached pin output value
100 * @have_buffer: Set to true if GPIO output could be configured in push-pull,
101 * open-drain or open-source mode.
102 * @output_enabled: Set to true if GPIO output logic is enabled.
103 * @input_enabled: Set to true if GPIO input buffer logic is enabled.
104 * @num_sources: Number of power-sources supported by this GPIO.
105 * @power_source: Current power-source used.
106 * @buffer_type: Push-pull, open-drain or open-source.
107 * @pullup: Constant current which flow trough GPIO output buffer.
108 * @strength: No, Low, Medium, High
109 * @function: See pmic_gpio_functions[]
110 */
111struct pmic_gpio_pad {
112 u16 base;
113 int irq;
114 bool is_enabled;
115 bool out_value;
116 bool have_buffer;
117 bool output_enabled;
118 bool input_enabled;
119 unsigned int num_sources;
120 unsigned int power_source;
121 unsigned int buffer_type;
122 unsigned int pullup;
123 unsigned int strength;
124 unsigned int function;
125};
126
127struct pmic_gpio_state {
128 struct device *dev;
129 struct regmap *map;
130 struct pinctrl_dev *ctrl;
131 struct gpio_chip chip;
132};
133
f684e4ac 134static const struct pinconf_generic_params pmic_gpio_bindings[] = {
7382b623
SB
135 {"qcom,pull-up-strength", PMIC_GPIO_CONF_PULL_UP, 0},
136 {"qcom,drive-strength", PMIC_GPIO_CONF_STRENGTH, 0},
eadff302
II
137};
138
4f06266a 139#ifdef CONFIG_DEBUG_FS
7382b623
SB
140static const struct pin_config_item pmic_conf_items[ARRAY_SIZE(pmic_gpio_bindings)] = {
141 PCONFDUMP(PMIC_GPIO_CONF_PULL_UP, "pull up strength", NULL, true),
142 PCONFDUMP(PMIC_GPIO_CONF_STRENGTH, "drive-strength", NULL, true),
eadff302 143};
4f06266a 144#endif
eadff302
II
145
146static const char *const pmic_gpio_groups[] = {
147 "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8",
148 "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15",
149 "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", "gpio22",
150 "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", "gpio29",
151 "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35", "gpio36",
152};
153
154static const char *const pmic_gpio_functions[] = {
155 PMIC_GPIO_FUNC_NORMAL, PMIC_GPIO_FUNC_PAIRED,
156 PMIC_GPIO_FUNC_FUNC1, PMIC_GPIO_FUNC_FUNC2,
157 PMIC_GPIO_FUNC_DTEST1, PMIC_GPIO_FUNC_DTEST2,
158 PMIC_GPIO_FUNC_DTEST3, PMIC_GPIO_FUNC_DTEST4,
159};
160
161static inline struct pmic_gpio_state *to_gpio_state(struct gpio_chip *chip)
162{
163 return container_of(chip, struct pmic_gpio_state, chip);
164};
165
166static int pmic_gpio_read(struct pmic_gpio_state *state,
167 struct pmic_gpio_pad *pad, unsigned int addr)
168{
169 unsigned int val;
170 int ret;
171
172 ret = regmap_read(state->map, pad->base + addr, &val);
173 if (ret < 0)
174 dev_err(state->dev, "read 0x%x failed\n", addr);
175 else
176 ret = val;
177
178 return ret;
179}
180
181static int pmic_gpio_write(struct pmic_gpio_state *state,
182 struct pmic_gpio_pad *pad, unsigned int addr,
183 unsigned int val)
184{
185 int ret;
186
187 ret = regmap_write(state->map, pad->base + addr, val);
188 if (ret < 0)
189 dev_err(state->dev, "write 0x%x failed\n", addr);
190
191 return ret;
192}
193
194static int pmic_gpio_get_groups_count(struct pinctrl_dev *pctldev)
195{
196 /* Every PIN is a group */
197 return pctldev->desc->npins;
198}
199
200static const char *pmic_gpio_get_group_name(struct pinctrl_dev *pctldev,
201 unsigned pin)
202{
203 return pctldev->desc->pins[pin].name;
204}
205
206static int pmic_gpio_get_group_pins(struct pinctrl_dev *pctldev, unsigned pin,
207 const unsigned **pins, unsigned *num_pins)
208{
209 *pins = &pctldev->desc->pins[pin].number;
210 *num_pins = 1;
211 return 0;
212}
213
eadff302
II
214static const struct pinctrl_ops pmic_gpio_pinctrl_ops = {
215 .get_groups_count = pmic_gpio_get_groups_count,
216 .get_group_name = pmic_gpio_get_group_name,
217 .get_group_pins = pmic_gpio_get_group_pins,
7382b623 218 .dt_node_to_map = pinconf_generic_dt_node_to_map_group,
eadff302
II
219 .dt_free_map = pinctrl_utils_dt_free_map,
220};
221
222static int pmic_gpio_get_functions_count(struct pinctrl_dev *pctldev)
223{
224 return ARRAY_SIZE(pmic_gpio_functions);
225}
226
227static const char *pmic_gpio_get_function_name(struct pinctrl_dev *pctldev,
228 unsigned function)
229{
230 return pmic_gpio_functions[function];
231}
232
233static int pmic_gpio_get_function_groups(struct pinctrl_dev *pctldev,
234 unsigned function,
235 const char *const **groups,
236 unsigned *const num_qgroups)
237{
238 *groups = pmic_gpio_groups;
239 *num_qgroups = pctldev->desc->npins;
240 return 0;
241}
242
243static int pmic_gpio_set_mux(struct pinctrl_dev *pctldev, unsigned function,
244 unsigned pin)
245{
246 struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
247 struct pmic_gpio_pad *pad;
248 unsigned int val;
249 int ret;
250
251 pad = pctldev->desc->pins[pin].drv_data;
252
253 pad->function = function;
254
255 val = 0;
256 if (pad->output_enabled) {
257 if (pad->input_enabled)
258 val = 2;
259 else
260 val = 1;
261 }
262
dc391502 263 val = val << PMIC_GPIO_REG_MODE_DIR_SHIFT;
eadff302
II
264 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
265 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
266
267 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_MODE_CTL, val);
268 if (ret < 0)
269 return ret;
270
271 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT;
272
273 return pmic_gpio_write(state, pad, PMIC_GPIO_REG_EN_CTL, val);
274}
275
276static const struct pinmux_ops pmic_gpio_pinmux_ops = {
277 .get_functions_count = pmic_gpio_get_functions_count,
278 .get_function_name = pmic_gpio_get_function_name,
279 .get_function_groups = pmic_gpio_get_function_groups,
280 .set_mux = pmic_gpio_set_mux,
281};
282
283static int pmic_gpio_config_get(struct pinctrl_dev *pctldev,
284 unsigned int pin, unsigned long *config)
285{
286 unsigned param = pinconf_to_config_param(*config);
287 struct pmic_gpio_pad *pad;
288 unsigned arg;
289
290 pad = pctldev->desc->pins[pin].drv_data;
291
292 switch (param) {
293 case PIN_CONFIG_DRIVE_PUSH_PULL:
294 arg = pad->buffer_type == PMIC_GPIO_OUT_BUF_CMOS;
295 break;
296 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
297 arg = pad->buffer_type == PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS;
298 break;
299 case PIN_CONFIG_DRIVE_OPEN_SOURCE:
300 arg = pad->buffer_type == PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS;
301 break;
302 case PIN_CONFIG_BIAS_PULL_DOWN:
303 arg = pad->pullup == PMIC_GPIO_PULL_DOWN;
304 break;
305 case PIN_CONFIG_BIAS_DISABLE:
306 arg = pad->pullup = PMIC_GPIO_PULL_DISABLE;
307 break;
308 case PIN_CONFIG_BIAS_PULL_UP:
309 arg = pad->pullup == PMIC_GPIO_PULL_UP_30;
310 break;
311 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
312 arg = !pad->is_enabled;
313 break;
314 case PIN_CONFIG_POWER_SOURCE:
315 arg = pad->power_source;
316 break;
317 case PIN_CONFIG_INPUT_ENABLE:
318 arg = pad->input_enabled;
319 break;
320 case PIN_CONFIG_OUTPUT:
321 arg = pad->out_value;
322 break;
323 case PMIC_GPIO_CONF_PULL_UP:
324 arg = pad->pullup;
325 break;
326 case PMIC_GPIO_CONF_STRENGTH:
327 arg = pad->strength;
328 break;
329 default:
330 return -EINVAL;
331 }
332
333 *config = pinconf_to_config_packed(param, arg);
334 return 0;
335}
336
337static int pmic_gpio_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
338 unsigned long *configs, unsigned nconfs)
339{
340 struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
341 struct pmic_gpio_pad *pad;
342 unsigned param, arg;
343 unsigned int val;
344 int i, ret;
345
346 pad = pctldev->desc->pins[pin].drv_data;
347
348 for (i = 0; i < nconfs; i++) {
349 param = pinconf_to_config_param(configs[i]);
350 arg = pinconf_to_config_argument(configs[i]);
351
352 switch (param) {
353 case PIN_CONFIG_DRIVE_PUSH_PULL:
354 pad->buffer_type = PMIC_GPIO_OUT_BUF_CMOS;
355 break;
356 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
357 if (!pad->have_buffer)
358 return -EINVAL;
359 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS;
360 break;
361 case PIN_CONFIG_DRIVE_OPEN_SOURCE:
362 if (!pad->have_buffer)
363 return -EINVAL;
364 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS;
365 break;
366 case PIN_CONFIG_BIAS_DISABLE:
367 pad->pullup = PMIC_GPIO_PULL_DISABLE;
368 break;
369 case PIN_CONFIG_BIAS_PULL_UP:
370 pad->pullup = PMIC_GPIO_PULL_UP_30;
371 break;
372 case PIN_CONFIG_BIAS_PULL_DOWN:
373 if (arg)
374 pad->pullup = PMIC_GPIO_PULL_DOWN;
375 else
376 pad->pullup = PMIC_GPIO_PULL_DISABLE;
377 break;
378 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
379 pad->is_enabled = false;
380 break;
381 case PIN_CONFIG_POWER_SOURCE:
382 if (arg > pad->num_sources)
383 return -EINVAL;
384 pad->power_source = arg;
385 break;
386 case PIN_CONFIG_INPUT_ENABLE:
387 pad->input_enabled = arg ? true : false;
388 break;
389 case PIN_CONFIG_OUTPUT:
390 pad->output_enabled = true;
391 pad->out_value = arg;
392 break;
393 case PMIC_GPIO_CONF_PULL_UP:
394 if (arg > PMIC_GPIO_PULL_UP_1P5_30)
395 return -EINVAL;
396 pad->pullup = arg;
397 break;
398 case PMIC_GPIO_CONF_STRENGTH:
399 if (arg > PMIC_GPIO_STRENGTH_LOW)
400 return -EINVAL;
401 pad->strength = arg;
402 break;
403 default:
404 return -EINVAL;
405 }
406 }
407
408 val = pad->power_source << PMIC_GPIO_REG_VIN_SHIFT;
409
410 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_VIN_CTL, val);
411 if (ret < 0)
412 return ret;
413
414 val = pad->pullup << PMIC_GPIO_REG_PULL_SHIFT;
415
416 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_PULL_CTL, val);
417 if (ret < 0)
418 return ret;
419
420 val = pad->buffer_type << PMIC_GPIO_REG_OUT_TYPE_SHIFT;
982df6ae 421 val |= pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
eadff302
II
422
423 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_OUT_CTL, val);
424 if (ret < 0)
425 return ret;
426
427 val = 0;
428 if (pad->output_enabled) {
429 if (pad->input_enabled)
430 val = 2;
431 else
432 val = 1;
433 }
434
435 val = val << PMIC_GPIO_REG_MODE_DIR_SHIFT;
436 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
437 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
438
439 return pmic_gpio_write(state, pad, PMIC_GPIO_REG_MODE_CTL, val);
440}
441
442static void pmic_gpio_config_dbg_show(struct pinctrl_dev *pctldev,
443 struct seq_file *s, unsigned pin)
444{
445 struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
446 struct pmic_gpio_pad *pad;
447 int ret, val;
448
449 static const char *const biases[] = {
450 "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA",
451 "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull"
452 };
453 static const char *const buffer_types[] = {
454 "push-pull", "open-drain", "open-source"
455 };
456 static const char *const strengths[] = {
457 "no", "high", "medium", "low"
458 };
459
460 pad = pctldev->desc->pins[pin].drv_data;
461
462 seq_printf(s, " gpio%-2d:", pin + PMIC_GPIO_PHYSICAL_OFFSET);
463
464 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_EN_CTL);
465
466 if (val < 0 || !(val >> PMIC_GPIO_REG_MASTER_EN_SHIFT)) {
467 seq_puts(s, " ---");
468 } else {
469
24a66618 470 if (pad->input_enabled) {
eadff302 471 ret = pmic_gpio_read(state, pad, PMIC_MPP_REG_RT_STS);
24a66618
II
472 if (ret < 0)
473 return;
474
475 ret &= PMIC_MPP_REG_RT_STS_VAL_MASK;
476 pad->out_value = ret;
eadff302
II
477 }
478
479 seq_printf(s, " %-4s", pad->output_enabled ? "out" : "in");
480 seq_printf(s, " %-7s", pmic_gpio_functions[pad->function]);
481 seq_printf(s, " vin-%d", pad->power_source);
482 seq_printf(s, " %-27s", biases[pad->pullup]);
483 seq_printf(s, " %-10s", buffer_types[pad->buffer_type]);
484 seq_printf(s, " %-4s", pad->out_value ? "high" : "low");
485 seq_printf(s, " %-7s", strengths[pad->strength]);
486 }
487}
488
489static const struct pinconf_ops pmic_gpio_pinconf_ops = {
7382b623 490 .is_generic = true,
eadff302
II
491 .pin_config_group_get = pmic_gpio_config_get,
492 .pin_config_group_set = pmic_gpio_config_set,
493 .pin_config_group_dbg_show = pmic_gpio_config_dbg_show,
494};
495
496static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
497{
498 struct pmic_gpio_state *state = to_gpio_state(chip);
499 unsigned long config;
500
501 config = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1);
502
503 return pmic_gpio_config_set(state->ctrl, pin, &config, 1);
504}
505
506static int pmic_gpio_direction_output(struct gpio_chip *chip,
507 unsigned pin, int val)
508{
509 struct pmic_gpio_state *state = to_gpio_state(chip);
510 unsigned long config;
511
512 config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, val);
513
514 return pmic_gpio_config_set(state->ctrl, pin, &config, 1);
515}
516
517static int pmic_gpio_get(struct gpio_chip *chip, unsigned pin)
518{
519 struct pmic_gpio_state *state = to_gpio_state(chip);
520 struct pmic_gpio_pad *pad;
521 int ret;
522
523 pad = state->ctrl->desc->pins[pin].drv_data;
524
525 if (!pad->is_enabled)
526 return -EINVAL;
527
528 if (pad->input_enabled) {
529 ret = pmic_gpio_read(state, pad, PMIC_MPP_REG_RT_STS);
530 if (ret < 0)
531 return ret;
532
533 pad->out_value = ret & PMIC_MPP_REG_RT_STS_VAL_MASK;
534 }
535
536 return pad->out_value;
537}
538
539static void pmic_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
540{
541 struct pmic_gpio_state *state = to_gpio_state(chip);
542 unsigned long config;
543
544 config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, value);
545
546 pmic_gpio_config_set(state->ctrl, pin, &config, 1);
547}
548
549static int pmic_gpio_request(struct gpio_chip *chip, unsigned base)
550{
551 return pinctrl_request_gpio(chip->base + base);
552}
553
554static void pmic_gpio_free(struct gpio_chip *chip, unsigned base)
555{
556 pinctrl_free_gpio(chip->base + base);
557}
558
559static int pmic_gpio_of_xlate(struct gpio_chip *chip,
560 const struct of_phandle_args *gpio_desc,
561 u32 *flags)
562{
563 if (chip->of_gpio_n_cells < 2)
564 return -EINVAL;
565
566 if (flags)
567 *flags = gpio_desc->args[1];
568
569 return gpio_desc->args[0] - PMIC_GPIO_PHYSICAL_OFFSET;
570}
571
572static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned pin)
573{
574 struct pmic_gpio_state *state = to_gpio_state(chip);
575 struct pmic_gpio_pad *pad;
576
577 pad = state->ctrl->desc->pins[pin].drv_data;
578
579 return pad->irq;
580}
581
582static void pmic_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
583{
584 struct pmic_gpio_state *state = to_gpio_state(chip);
585 unsigned i;
586
587 for (i = 0; i < chip->ngpio; i++) {
588 pmic_gpio_config_dbg_show(state->ctrl, s, i);
589 seq_puts(s, "\n");
590 }
591}
592
593static const struct gpio_chip pmic_gpio_gpio_template = {
594 .direction_input = pmic_gpio_direction_input,
595 .direction_output = pmic_gpio_direction_output,
596 .get = pmic_gpio_get,
597 .set = pmic_gpio_set,
598 .request = pmic_gpio_request,
599 .free = pmic_gpio_free,
600 .of_xlate = pmic_gpio_of_xlate,
601 .to_irq = pmic_gpio_to_irq,
602 .dbg_show = pmic_gpio_dbg_show,
603};
604
605static int pmic_gpio_populate(struct pmic_gpio_state *state,
606 struct pmic_gpio_pad *pad)
607{
608 int type, subtype, val, dir;
609
610 type = pmic_gpio_read(state, pad, PMIC_GPIO_REG_TYPE);
611 if (type < 0)
612 return type;
613
614 if (type != PMIC_GPIO_TYPE) {
615 dev_err(state->dev, "incorrect block type 0x%x at 0x%x\n",
616 type, pad->base);
617 return -ENODEV;
618 }
619
620 subtype = pmic_gpio_read(state, pad, PMIC_GPIO_REG_SUBTYPE);
621 if (subtype < 0)
622 return subtype;
623
624 switch (subtype) {
625 case PMIC_GPIO_SUBTYPE_GPIO_4CH:
626 pad->have_buffer = true;
627 case PMIC_GPIO_SUBTYPE_GPIOC_4CH:
628 pad->num_sources = 4;
629 break;
630 case PMIC_GPIO_SUBTYPE_GPIO_8CH:
631 pad->have_buffer = true;
632 case PMIC_GPIO_SUBTYPE_GPIOC_8CH:
633 pad->num_sources = 8;
634 break;
635 default:
636 dev_err(state->dev, "unknown GPIO type 0x%x\n", subtype);
637 return -ENODEV;
638 }
639
640 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_MODE_CTL);
641 if (val < 0)
642 return val;
643
644 pad->out_value = val & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
645
646 dir = val >> PMIC_GPIO_REG_MODE_DIR_SHIFT;
647 dir &= PMIC_GPIO_REG_MODE_DIR_MASK;
648 switch (dir) {
649 case 0:
650 pad->input_enabled = true;
651 pad->output_enabled = false;
652 break;
653 case 1:
654 pad->input_enabled = false;
655 pad->output_enabled = true;
656 break;
657 case 2:
658 pad->input_enabled = true;
659 pad->output_enabled = true;
660 break;
661 default:
662 dev_err(state->dev, "unknown GPIO direction\n");
663 return -ENODEV;
664 }
665
666 pad->function = val >> PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
667 pad->function &= PMIC_GPIO_REG_MODE_FUNCTION_MASK;
668
669 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_VIN_CTL);
670 if (val < 0)
671 return val;
672
673 pad->power_source = val >> PMIC_GPIO_REG_VIN_SHIFT;
674 pad->power_source &= PMIC_GPIO_REG_VIN_MASK;
675
676 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_PULL_CTL);
677 if (val < 0)
678 return val;
679
680 pad->pullup = val >> PMIC_GPIO_REG_PULL_SHIFT;
681 pad->pullup &= PMIC_GPIO_REG_PULL_MASK;
682
683 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_OUT_CTL);
684 if (val < 0)
685 return val;
686
687 pad->strength = val >> PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
688 pad->strength &= PMIC_GPIO_REG_OUT_STRENGTH_MASK;
689
690 pad->buffer_type = val >> PMIC_GPIO_REG_OUT_TYPE_SHIFT;
691 pad->buffer_type &= PMIC_GPIO_REG_OUT_TYPE_MASK;
692
693 /* Pin could be disabled with PIN_CONFIG_BIAS_HIGH_IMPEDANCE */
694 pad->is_enabled = true;
695 return 0;
696}
697
698static int pmic_gpio_probe(struct platform_device *pdev)
699{
700 struct device *dev = &pdev->dev;
701 struct pinctrl_pin_desc *pindesc;
702 struct pinctrl_desc *pctrldesc;
703 struct pmic_gpio_pad *pad, *pads;
704 struct pmic_gpio_state *state;
705 int ret, npins, i;
706 u32 res[2];
707
708 ret = of_property_read_u32_array(dev->of_node, "reg", res, 2);
709 if (ret < 0) {
710 dev_err(dev, "missing base address and/or range");
711 return ret;
712 }
713
714 npins = res[1] / PMIC_GPIO_ADDRESS_RANGE;
715
716 if (!npins)
717 return -EINVAL;
718
719 BUG_ON(npins > ARRAY_SIZE(pmic_gpio_groups));
720
721 state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL);
722 if (!state)
723 return -ENOMEM;
724
725 platform_set_drvdata(pdev, state);
726
727 state->dev = &pdev->dev;
728 state->map = dev_get_regmap(dev->parent, NULL);
729
730 pindesc = devm_kcalloc(dev, npins, sizeof(*pindesc), GFP_KERNEL);
731 if (!pindesc)
732 return -ENOMEM;
733
734 pads = devm_kcalloc(dev, npins, sizeof(*pads), GFP_KERNEL);
735 if (!pads)
736 return -ENOMEM;
737
738 pctrldesc = devm_kzalloc(dev, sizeof(*pctrldesc), GFP_KERNEL);
739 if (!pctrldesc)
740 return -ENOMEM;
741
742 pctrldesc->pctlops = &pmic_gpio_pinctrl_ops;
743 pctrldesc->pmxops = &pmic_gpio_pinmux_ops;
744 pctrldesc->confops = &pmic_gpio_pinconf_ops;
745 pctrldesc->owner = THIS_MODULE;
746 pctrldesc->name = dev_name(dev);
747 pctrldesc->pins = pindesc;
748 pctrldesc->npins = npins;
f684e4ac
LW
749 pctrldesc->num_custom_params = ARRAY_SIZE(pmic_gpio_bindings);
750 pctrldesc->custom_params = pmic_gpio_bindings;
4f06266a 751#ifdef CONFIG_DEBUG_FS
f684e4ac 752 pctrldesc->custom_conf_items = pmic_conf_items;
4f06266a 753#endif
eadff302
II
754
755 for (i = 0; i < npins; i++, pindesc++) {
756 pad = &pads[i];
757 pindesc->drv_data = pad;
758 pindesc->number = i;
759 pindesc->name = pmic_gpio_groups[i];
760
761 pad->irq = platform_get_irq(pdev, i);
762 if (pad->irq < 0)
763 return pad->irq;
764
765 pad->base = res[0] + i * PMIC_GPIO_ADDRESS_RANGE;
766
767 ret = pmic_gpio_populate(state, pad);
768 if (ret < 0)
769 return ret;
770 }
771
772 state->chip = pmic_gpio_gpio_template;
773 state->chip.dev = dev;
774 state->chip.base = -1;
775 state->chip.ngpio = npins;
776 state->chip.label = dev_name(dev);
777 state->chip.of_gpio_n_cells = 2;
778 state->chip.can_sleep = false;
779
780 state->ctrl = pinctrl_register(pctrldesc, dev, state);
323de9ef
MY
781 if (IS_ERR(state->ctrl))
782 return PTR_ERR(state->ctrl);
eadff302
II
783
784 ret = gpiochip_add(&state->chip);
785 if (ret) {
786 dev_err(state->dev, "can't add gpio chip\n");
787 goto err_chip;
788 }
789
790 ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, npins);
791 if (ret) {
792 dev_err(dev, "failed to add pin range\n");
793 goto err_range;
794 }
795
796 return 0;
797
798err_range:
799 gpiochip_remove(&state->chip);
800err_chip:
801 pinctrl_unregister(state->ctrl);
802 return ret;
803}
804
805static int pmic_gpio_remove(struct platform_device *pdev)
806{
807 struct pmic_gpio_state *state = platform_get_drvdata(pdev);
808
809 gpiochip_remove(&state->chip);
810 pinctrl_unregister(state->ctrl);
811 return 0;
812}
813
814static const struct of_device_id pmic_gpio_of_match[] = {
7414b099 815 { .compatible = "qcom,pm8916-gpio" }, /* 4 GPIO's */
eadff302
II
816 { .compatible = "qcom,pm8941-gpio" }, /* 36 GPIO's */
817 { .compatible = "qcom,pma8084-gpio" }, /* 22 GPIO's */
818 { },
819};
820
821MODULE_DEVICE_TABLE(of, pmic_gpio_of_match);
822
823static struct platform_driver pmic_gpio_driver = {
824 .driver = {
825 .name = "qcom-spmi-gpio",
826 .of_match_table = pmic_gpio_of_match,
827 },
828 .probe = pmic_gpio_probe,
829 .remove = pmic_gpio_remove,
830};
831
832module_platform_driver(pmic_gpio_driver);
833
834MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");
835MODULE_DESCRIPTION("Qualcomm SPMI PMIC GPIO pin control driver");
836MODULE_ALIAS("platform:qcom-spmi-gpio");
837MODULE_LICENSE("GPL v2");
This page took 0.084078 seconds and 5 git commands to generate.