xref: /linux/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c (revision e5c86679d5e864947a52fb31e45a425dea3e7fa9)
1 /*
2  * Copyright (c) 2015, Sony Mobile Communications AB.
3  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 and
7  * only version 2 as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14 
15 #include <linux/module.h>
16 #include <linux/platform_device.h>
17 #include <linux/pinctrl/pinctrl.h>
18 #include <linux/pinctrl/pinmux.h>
19 #include <linux/pinctrl/pinconf.h>
20 #include <linux/pinctrl/pinconf-generic.h>
21 #include <linux/slab.h>
22 #include <linux/regmap.h>
23 #include <linux/gpio.h>
24 #include <linux/interrupt.h>
25 #include <linux/of_device.h>
26 #include <linux/of_irq.h>
27 
28 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
29 
30 #include "../core.h"
31 #include "../pinctrl-utils.h"
32 
33 /* mode */
34 #define PM8XXX_GPIO_MODE_ENABLED	BIT(0)
35 #define PM8XXX_GPIO_MODE_INPUT		0
36 #define PM8XXX_GPIO_MODE_OUTPUT		2
37 
38 /* output buffer */
39 #define PM8XXX_GPIO_PUSH_PULL		0
40 #define PM8XXX_GPIO_OPEN_DRAIN		1
41 
42 /* bias */
43 #define PM8XXX_GPIO_BIAS_PU_30		0
44 #define PM8XXX_GPIO_BIAS_PU_1P5		1
45 #define PM8XXX_GPIO_BIAS_PU_31P5	2
46 #define PM8XXX_GPIO_BIAS_PU_1P5_30	3
47 #define PM8XXX_GPIO_BIAS_PD		4
48 #define PM8XXX_GPIO_BIAS_NP		5
49 
50 /* GPIO registers */
51 #define SSBI_REG_ADDR_GPIO_BASE		0x150
52 #define SSBI_REG_ADDR_GPIO(n)		(SSBI_REG_ADDR_GPIO_BASE + n)
53 
54 #define PM8XXX_BANK_WRITE		BIT(7)
55 
56 #define PM8XXX_MAX_GPIOS               44
57 
58 /* custom pinconf parameters */
59 #define PM8XXX_QCOM_DRIVE_STRENGH      (PIN_CONFIG_END + 1)
60 #define PM8XXX_QCOM_PULL_UP_STRENGTH   (PIN_CONFIG_END + 2)
61 
62 /**
63  * struct pm8xxx_pin_data - dynamic configuration for a pin
64  * @reg:               address of the control register
65  * @irq:               IRQ from the PMIC interrupt controller
66  * @power_source:      logical selected voltage source, mapping in static data
67  *                     is used translate to register values
68  * @mode:              operating mode for the pin (input/output)
69  * @open_drain:        output buffer configured as open-drain (vs push-pull)
70  * @output_value:      configured output value
71  * @bias:              register view of configured bias
72  * @pull_up_strength:  placeholder for selected pull up strength
73  *                     only used to configure bias when pull up is selected
74  * @output_strength:   selector of output-strength
75  * @disable:           pin disabled / configured as tristate
76  * @function:          pinmux selector
77  * @inverted:          pin logic is inverted
78  */
79 struct pm8xxx_pin_data {
80 	unsigned reg;
81 	int irq;
82 	u8 power_source;
83 	u8 mode;
84 	bool open_drain;
85 	bool output_value;
86 	u8 bias;
87 	u8 pull_up_strength;
88 	u8 output_strength;
89 	bool disable;
90 	u8 function;
91 	bool inverted;
92 };
93 
94 struct pm8xxx_gpio {
95 	struct device *dev;
96 	struct regmap *regmap;
97 	struct pinctrl_dev *pctrl;
98 	struct gpio_chip chip;
99 
100 	struct pinctrl_desc desc;
101 	unsigned npins;
102 };
103 
104 static const struct pinconf_generic_params pm8xxx_gpio_bindings[] = {
105 	{"qcom,drive-strength",		PM8XXX_QCOM_DRIVE_STRENGH,	0},
106 	{"qcom,pull-up-strength",	PM8XXX_QCOM_PULL_UP_STRENGTH,	0},
107 };
108 
109 #ifdef CONFIG_DEBUG_FS
110 static const struct pin_config_item pm8xxx_conf_items[ARRAY_SIZE(pm8xxx_gpio_bindings)] = {
111 	PCONFDUMP(PM8XXX_QCOM_DRIVE_STRENGH, "drive-strength", NULL, true),
112 	PCONFDUMP(PM8XXX_QCOM_PULL_UP_STRENGTH,  "pull up strength", NULL, true),
113 };
114 #endif
115 
116 static const char * const pm8xxx_groups[PM8XXX_MAX_GPIOS] = {
117 	"gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8",
118 	"gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15",
119 	"gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", "gpio22",
120 	"gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", "gpio29",
121 	"gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35", "gpio36",
122 	"gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42", "gpio43",
123 	"gpio44",
124 };
125 
126 static const char * const pm8xxx_gpio_functions[] = {
127 	PMIC_GPIO_FUNC_NORMAL, PMIC_GPIO_FUNC_PAIRED,
128 	PMIC_GPIO_FUNC_FUNC1, PMIC_GPIO_FUNC_FUNC2,
129 	PMIC_GPIO_FUNC_DTEST1, PMIC_GPIO_FUNC_DTEST2,
130 	PMIC_GPIO_FUNC_DTEST3, PMIC_GPIO_FUNC_DTEST4,
131 };
132 
133 static int pm8xxx_read_bank(struct pm8xxx_gpio *pctrl,
134 			    struct pm8xxx_pin_data *pin, int bank)
135 {
136 	unsigned int val = bank << 4;
137 	int ret;
138 
139 	ret = regmap_write(pctrl->regmap, pin->reg, val);
140 	if (ret) {
141 		dev_err(pctrl->dev, "failed to select bank %d\n", bank);
142 		return ret;
143 	}
144 
145 	ret = regmap_read(pctrl->regmap, pin->reg, &val);
146 	if (ret) {
147 		dev_err(pctrl->dev, "failed to read register %d\n", bank);
148 		return ret;
149 	}
150 
151 	return val;
152 }
153 
154 static int pm8xxx_write_bank(struct pm8xxx_gpio *pctrl,
155 			     struct pm8xxx_pin_data *pin,
156 			     int bank,
157 			     u8 val)
158 {
159 	int ret;
160 
161 	val |= PM8XXX_BANK_WRITE;
162 	val |= bank << 4;
163 
164 	ret = regmap_write(pctrl->regmap, pin->reg, val);
165 	if (ret)
166 		dev_err(pctrl->dev, "failed to write register\n");
167 
168 	return ret;
169 }
170 
171 static int pm8xxx_get_groups_count(struct pinctrl_dev *pctldev)
172 {
173 	struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
174 
175 	return pctrl->npins;
176 }
177 
178 static const char *pm8xxx_get_group_name(struct pinctrl_dev *pctldev,
179 					 unsigned group)
180 {
181 	return pm8xxx_groups[group];
182 }
183 
184 
185 static int pm8xxx_get_group_pins(struct pinctrl_dev *pctldev,
186 				 unsigned group,
187 				 const unsigned **pins,
188 				 unsigned *num_pins)
189 {
190 	struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
191 
192 	*pins = &pctrl->desc.pins[group].number;
193 	*num_pins = 1;
194 
195 	return 0;
196 }
197 
198 static const struct pinctrl_ops pm8xxx_pinctrl_ops = {
199 	.get_groups_count	= pm8xxx_get_groups_count,
200 	.get_group_name		= pm8xxx_get_group_name,
201 	.get_group_pins         = pm8xxx_get_group_pins,
202 	.dt_node_to_map		= pinconf_generic_dt_node_to_map_group,
203 	.dt_free_map		= pinctrl_utils_free_map,
204 };
205 
206 static int pm8xxx_get_functions_count(struct pinctrl_dev *pctldev)
207 {
208 	return ARRAY_SIZE(pm8xxx_gpio_functions);
209 }
210 
211 static const char *pm8xxx_get_function_name(struct pinctrl_dev *pctldev,
212 					    unsigned function)
213 {
214 	return pm8xxx_gpio_functions[function];
215 }
216 
217 static int pm8xxx_get_function_groups(struct pinctrl_dev *pctldev,
218 				      unsigned function,
219 				      const char * const **groups,
220 				      unsigned * const num_groups)
221 {
222 	struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
223 
224 	*groups = pm8xxx_groups;
225 	*num_groups = pctrl->npins;
226 	return 0;
227 }
228 
229 static int pm8xxx_pinmux_set_mux(struct pinctrl_dev *pctldev,
230 				 unsigned function,
231 				 unsigned group)
232 {
233 	struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
234 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[group].drv_data;
235 	u8 val;
236 
237 	pin->function = function;
238 	val = pin->function << 1;
239 
240 	pm8xxx_write_bank(pctrl, pin, 4, val);
241 
242 	return 0;
243 }
244 
245 static const struct pinmux_ops pm8xxx_pinmux_ops = {
246 	.get_functions_count	= pm8xxx_get_functions_count,
247 	.get_function_name	= pm8xxx_get_function_name,
248 	.get_function_groups	= pm8xxx_get_function_groups,
249 	.set_mux		= pm8xxx_pinmux_set_mux,
250 };
251 
252 static int pm8xxx_pin_config_get(struct pinctrl_dev *pctldev,
253 				 unsigned int offset,
254 				 unsigned long *config)
255 {
256 	struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
257 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
258 	unsigned param = pinconf_to_config_param(*config);
259 	unsigned arg;
260 
261 	switch (param) {
262 	case PIN_CONFIG_BIAS_DISABLE:
263 		arg = pin->bias == PM8XXX_GPIO_BIAS_NP;
264 		break;
265 	case PIN_CONFIG_BIAS_PULL_DOWN:
266 		arg = pin->bias == PM8XXX_GPIO_BIAS_PD;
267 		break;
268 	case PIN_CONFIG_BIAS_PULL_UP:
269 		arg = pin->bias <= PM8XXX_GPIO_BIAS_PU_1P5_30;
270 		break;
271 	case PM8XXX_QCOM_PULL_UP_STRENGTH:
272 		arg = pin->pull_up_strength;
273 		break;
274 	case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
275 		arg = pin->disable;
276 		break;
277 	case PIN_CONFIG_INPUT_ENABLE:
278 		arg = pin->mode == PM8XXX_GPIO_MODE_INPUT;
279 		break;
280 	case PIN_CONFIG_OUTPUT:
281 		if (pin->mode & PM8XXX_GPIO_MODE_OUTPUT)
282 			arg = pin->output_value;
283 		else
284 			arg = 0;
285 		break;
286 	case PIN_CONFIG_POWER_SOURCE:
287 		arg = pin->power_source;
288 		break;
289 	case PM8XXX_QCOM_DRIVE_STRENGH:
290 		arg = pin->output_strength;
291 		break;
292 	case PIN_CONFIG_DRIVE_PUSH_PULL:
293 		arg = !pin->open_drain;
294 		break;
295 	case PIN_CONFIG_DRIVE_OPEN_DRAIN:
296 		arg = pin->open_drain;
297 		break;
298 	default:
299 		return -EINVAL;
300 	}
301 
302 	*config = pinconf_to_config_packed(param, arg);
303 
304 	return 0;
305 }
306 
307 static int pm8xxx_pin_config_set(struct pinctrl_dev *pctldev,
308 				 unsigned int offset,
309 				 unsigned long *configs,
310 				 unsigned num_configs)
311 {
312 	struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
313 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
314 	unsigned param;
315 	unsigned arg;
316 	unsigned i;
317 	u8 banks = 0;
318 	u8 val;
319 
320 	for (i = 0; i < num_configs; i++) {
321 		param = pinconf_to_config_param(configs[i]);
322 		arg = pinconf_to_config_argument(configs[i]);
323 
324 		switch (param) {
325 		case PIN_CONFIG_BIAS_DISABLE:
326 			pin->bias = PM8XXX_GPIO_BIAS_NP;
327 			banks |= BIT(2);
328 			pin->disable = 0;
329 			banks |= BIT(3);
330 			break;
331 		case PIN_CONFIG_BIAS_PULL_DOWN:
332 			pin->bias = PM8XXX_GPIO_BIAS_PD;
333 			banks |= BIT(2);
334 			pin->disable = 0;
335 			banks |= BIT(3);
336 			break;
337 		case PM8XXX_QCOM_PULL_UP_STRENGTH:
338 			if (arg > PM8XXX_GPIO_BIAS_PU_1P5_30) {
339 				dev_err(pctrl->dev, "invalid pull-up strength\n");
340 				return -EINVAL;
341 			}
342 			pin->pull_up_strength = arg;
343 			/* FALLTHROUGH */
344 		case PIN_CONFIG_BIAS_PULL_UP:
345 			pin->bias = pin->pull_up_strength;
346 			banks |= BIT(2);
347 			pin->disable = 0;
348 			banks |= BIT(3);
349 			break;
350 		case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
351 			pin->disable = 1;
352 			banks |= BIT(3);
353 			break;
354 		case PIN_CONFIG_INPUT_ENABLE:
355 			pin->mode = PM8XXX_GPIO_MODE_INPUT;
356 			banks |= BIT(0) | BIT(1);
357 			break;
358 		case PIN_CONFIG_OUTPUT:
359 			pin->mode = PM8XXX_GPIO_MODE_OUTPUT;
360 			pin->output_value = !!arg;
361 			banks |= BIT(0) | BIT(1);
362 			break;
363 		case PIN_CONFIG_POWER_SOURCE:
364 			pin->power_source = arg;
365 			banks |= BIT(0);
366 			break;
367 		case PM8XXX_QCOM_DRIVE_STRENGH:
368 			if (arg > PMIC_GPIO_STRENGTH_LOW) {
369 				dev_err(pctrl->dev, "invalid drive strength\n");
370 				return -EINVAL;
371 			}
372 			pin->output_strength = arg;
373 			banks |= BIT(3);
374 			break;
375 		case PIN_CONFIG_DRIVE_PUSH_PULL:
376 			pin->open_drain = 0;
377 			banks |= BIT(1);
378 			break;
379 		case PIN_CONFIG_DRIVE_OPEN_DRAIN:
380 			pin->open_drain = 1;
381 			banks |= BIT(1);
382 			break;
383 		default:
384 			dev_err(pctrl->dev,
385 				"unsupported config parameter: %x\n",
386 				param);
387 			return -EINVAL;
388 		}
389 	}
390 
391 	if (banks & BIT(0)) {
392 		val = pin->power_source << 1;
393 		val |= PM8XXX_GPIO_MODE_ENABLED;
394 		pm8xxx_write_bank(pctrl, pin, 0, val);
395 	}
396 
397 	if (banks & BIT(1)) {
398 		val = pin->mode << 2;
399 		val |= pin->open_drain << 1;
400 		val |= pin->output_value;
401 		pm8xxx_write_bank(pctrl, pin, 1, val);
402 	}
403 
404 	if (banks & BIT(2)) {
405 		val = pin->bias << 1;
406 		pm8xxx_write_bank(pctrl, pin, 2, val);
407 	}
408 
409 	if (banks & BIT(3)) {
410 		val = pin->output_strength << 2;
411 		val |= pin->disable;
412 		pm8xxx_write_bank(pctrl, pin, 3, val);
413 	}
414 
415 	if (banks & BIT(4)) {
416 		val = pin->function << 1;
417 		pm8xxx_write_bank(pctrl, pin, 4, val);
418 	}
419 
420 	if (banks & BIT(5)) {
421 		val = 0;
422 		if (!pin->inverted)
423 			val |= BIT(3);
424 		pm8xxx_write_bank(pctrl, pin, 5, val);
425 	}
426 
427 	return 0;
428 }
429 
430 static const struct pinconf_ops pm8xxx_pinconf_ops = {
431 	.is_generic = true,
432 	.pin_config_group_get = pm8xxx_pin_config_get,
433 	.pin_config_group_set = pm8xxx_pin_config_set,
434 };
435 
436 static struct pinctrl_desc pm8xxx_pinctrl_desc = {
437 	.name = "pm8xxx_gpio",
438 	.pctlops = &pm8xxx_pinctrl_ops,
439 	.pmxops = &pm8xxx_pinmux_ops,
440 	.confops = &pm8xxx_pinconf_ops,
441 	.owner = THIS_MODULE,
442 };
443 
444 static int pm8xxx_gpio_direction_input(struct gpio_chip *chip,
445 				       unsigned offset)
446 {
447 	struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
448 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
449 	u8 val;
450 
451 	pin->mode = PM8XXX_GPIO_MODE_INPUT;
452 	val = pin->mode << 2;
453 
454 	pm8xxx_write_bank(pctrl, pin, 1, val);
455 
456 	return 0;
457 }
458 
459 static int pm8xxx_gpio_direction_output(struct gpio_chip *chip,
460 					unsigned offset,
461 					int value)
462 {
463 	struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
464 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
465 	u8 val;
466 
467 	pin->mode = PM8XXX_GPIO_MODE_OUTPUT;
468 	pin->output_value = !!value;
469 
470 	val = pin->mode << 2;
471 	val |= pin->open_drain << 1;
472 	val |= pin->output_value;
473 
474 	pm8xxx_write_bank(pctrl, pin, 1, val);
475 
476 	return 0;
477 }
478 
479 static int pm8xxx_gpio_get(struct gpio_chip *chip, unsigned offset)
480 {
481 	struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
482 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
483 	bool state;
484 	int ret;
485 
486 	if (pin->mode == PM8XXX_GPIO_MODE_OUTPUT) {
487 		ret = pin->output_value;
488 	} else {
489 		ret = irq_get_irqchip_state(pin->irq, IRQCHIP_STATE_LINE_LEVEL, &state);
490 		if (!ret)
491 			ret = !!state;
492 	}
493 
494 	return ret;
495 }
496 
497 static void pm8xxx_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
498 {
499 	struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
500 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
501 	u8 val;
502 
503 	pin->output_value = !!value;
504 
505 	val = pin->mode << 2;
506 	val |= pin->open_drain << 1;
507 	val |= pin->output_value;
508 
509 	pm8xxx_write_bank(pctrl, pin, 1, val);
510 }
511 
512 static int pm8xxx_gpio_of_xlate(struct gpio_chip *chip,
513 				const struct of_phandle_args *gpio_desc,
514 				u32 *flags)
515 {
516 	if (chip->of_gpio_n_cells < 2)
517 		return -EINVAL;
518 
519 	if (flags)
520 		*flags = gpio_desc->args[1];
521 
522 	return gpio_desc->args[0] - 1;
523 }
524 
525 
526 static int pm8xxx_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
527 {
528 	struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
529 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
530 
531 	return pin->irq;
532 }
533 
534 #ifdef CONFIG_DEBUG_FS
535 #include <linux/seq_file.h>
536 
537 static void pm8xxx_gpio_dbg_show_one(struct seq_file *s,
538 				  struct pinctrl_dev *pctldev,
539 				  struct gpio_chip *chip,
540 				  unsigned offset,
541 				  unsigned gpio)
542 {
543 	struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
544 	struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
545 
546 	static const char * const modes[] = {
547 		"in", "both", "out", "off"
548 	};
549 	static const char * const biases[] = {
550 		"pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA",
551 		"pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull"
552 	};
553 	static const char * const buffer_types[] = {
554 		"push-pull", "open-drain"
555 	};
556 	static const char * const strengths[] = {
557 		"no", "high", "medium", "low"
558 	};
559 
560 	seq_printf(s, " gpio%-2d:", offset + 1);
561 	if (pin->disable) {
562 		seq_puts(s, " ---");
563 	} else {
564 		seq_printf(s, " %-4s", modes[pin->mode]);
565 		seq_printf(s, " %-7s", pm8xxx_gpio_functions[pin->function]);
566 		seq_printf(s, " VIN%d", pin->power_source);
567 		seq_printf(s, " %-27s", biases[pin->bias]);
568 		seq_printf(s, " %-10s", buffer_types[pin->open_drain]);
569 		seq_printf(s, " %-4s", pin->output_value ? "high" : "low");
570 		seq_printf(s, " %-7s", strengths[pin->output_strength]);
571 		if (pin->inverted)
572 			seq_puts(s, " inverted");
573 	}
574 }
575 
576 static void pm8xxx_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
577 {
578 	unsigned gpio = chip->base;
579 	unsigned i;
580 
581 	for (i = 0; i < chip->ngpio; i++, gpio++) {
582 		pm8xxx_gpio_dbg_show_one(s, NULL, chip, i, gpio);
583 		seq_puts(s, "\n");
584 	}
585 }
586 
587 #else
588 #define pm8xxx_gpio_dbg_show NULL
589 #endif
590 
591 static struct gpio_chip pm8xxx_gpio_template = {
592 	.direction_input = pm8xxx_gpio_direction_input,
593 	.direction_output = pm8xxx_gpio_direction_output,
594 	.get = pm8xxx_gpio_get,
595 	.set = pm8xxx_gpio_set,
596 	.of_xlate = pm8xxx_gpio_of_xlate,
597 	.to_irq = pm8xxx_gpio_to_irq,
598 	.dbg_show = pm8xxx_gpio_dbg_show,
599 	.owner = THIS_MODULE,
600 };
601 
602 static int pm8xxx_pin_populate(struct pm8xxx_gpio *pctrl,
603 			       struct pm8xxx_pin_data *pin)
604 {
605 	int val;
606 
607 	val = pm8xxx_read_bank(pctrl, pin, 0);
608 	if (val < 0)
609 		return val;
610 
611 	pin->power_source = (val >> 1) & 0x7;
612 
613 	val = pm8xxx_read_bank(pctrl, pin, 1);
614 	if (val < 0)
615 		return val;
616 
617 	pin->mode = (val >> 2) & 0x3;
618 	pin->open_drain = !!(val & BIT(1));
619 	pin->output_value = val & BIT(0);
620 
621 	val = pm8xxx_read_bank(pctrl, pin, 2);
622 	if (val < 0)
623 		return val;
624 
625 	pin->bias = (val >> 1) & 0x7;
626 	if (pin->bias <= PM8XXX_GPIO_BIAS_PU_1P5_30)
627 		pin->pull_up_strength = pin->bias;
628 	else
629 		pin->pull_up_strength = PM8XXX_GPIO_BIAS_PU_30;
630 
631 	val = pm8xxx_read_bank(pctrl, pin, 3);
632 	if (val < 0)
633 		return val;
634 
635 	pin->output_strength = (val >> 2) & 0x3;
636 	pin->disable = val & BIT(0);
637 
638 	val = pm8xxx_read_bank(pctrl, pin, 4);
639 	if (val < 0)
640 		return val;
641 
642 	pin->function = (val >> 1) & 0x7;
643 
644 	val = pm8xxx_read_bank(pctrl, pin, 5);
645 	if (val < 0)
646 		return val;
647 
648 	pin->inverted = !(val & BIT(3));
649 
650 	return 0;
651 }
652 
653 static const struct of_device_id pm8xxx_gpio_of_match[] = {
654 	{ .compatible = "qcom,pm8018-gpio" },
655 	{ .compatible = "qcom,pm8038-gpio" },
656 	{ .compatible = "qcom,pm8058-gpio" },
657 	{ .compatible = "qcom,pm8917-gpio" },
658 	{ .compatible = "qcom,pm8921-gpio" },
659 	{ .compatible = "qcom,ssbi-gpio" },
660 	{ },
661 };
662 MODULE_DEVICE_TABLE(of, pm8xxx_gpio_of_match);
663 
664 static int pm8xxx_gpio_probe(struct platform_device *pdev)
665 {
666 	struct pm8xxx_pin_data *pin_data;
667 	struct pinctrl_pin_desc *pins;
668 	struct pm8xxx_gpio *pctrl;
669 	int ret;
670 	int i, npins;
671 
672 	pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
673 	if (!pctrl)
674 		return -ENOMEM;
675 
676 	pctrl->dev = &pdev->dev;
677 	npins = platform_irq_count(pdev);
678 	if (!npins)
679 		return -EINVAL;
680 	if (npins < 0)
681 		return npins;
682 	pctrl->npins = npins;
683 
684 	pctrl->regmap = dev_get_regmap(pdev->dev.parent, NULL);
685 	if (!pctrl->regmap) {
686 		dev_err(&pdev->dev, "parent regmap unavailable\n");
687 		return -ENXIO;
688 	}
689 
690 	pctrl->desc = pm8xxx_pinctrl_desc;
691 	pctrl->desc.npins = pctrl->npins;
692 
693 	pins = devm_kcalloc(&pdev->dev,
694 			    pctrl->desc.npins,
695 			    sizeof(struct pinctrl_pin_desc),
696 			    GFP_KERNEL);
697 	if (!pins)
698 		return -ENOMEM;
699 
700 	pin_data = devm_kcalloc(&pdev->dev,
701 				pctrl->desc.npins,
702 				sizeof(struct pm8xxx_pin_data),
703 				GFP_KERNEL);
704 	if (!pin_data)
705 		return -ENOMEM;
706 
707 	for (i = 0; i < pctrl->desc.npins; i++) {
708 		pin_data[i].reg = SSBI_REG_ADDR_GPIO(i);
709 		pin_data[i].irq = platform_get_irq(pdev, i);
710 		if (pin_data[i].irq < 0) {
711 			dev_err(&pdev->dev,
712 				"missing interrupts for pin %d\n", i);
713 			return pin_data[i].irq;
714 		}
715 
716 		ret = pm8xxx_pin_populate(pctrl, &pin_data[i]);
717 		if (ret)
718 			return ret;
719 
720 		pins[i].number = i;
721 		pins[i].name = pm8xxx_groups[i];
722 		pins[i].drv_data = &pin_data[i];
723 	}
724 	pctrl->desc.pins = pins;
725 
726 	pctrl->desc.num_custom_params = ARRAY_SIZE(pm8xxx_gpio_bindings);
727 	pctrl->desc.custom_params = pm8xxx_gpio_bindings;
728 #ifdef CONFIG_DEBUG_FS
729 	pctrl->desc.custom_conf_items = pm8xxx_conf_items;
730 #endif
731 
732 	pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &pctrl->desc, pctrl);
733 	if (IS_ERR(pctrl->pctrl)) {
734 		dev_err(&pdev->dev, "couldn't register pm8xxx gpio driver\n");
735 		return PTR_ERR(pctrl->pctrl);
736 	}
737 
738 	pctrl->chip = pm8xxx_gpio_template;
739 	pctrl->chip.base = -1;
740 	pctrl->chip.parent = &pdev->dev;
741 	pctrl->chip.of_node = pdev->dev.of_node;
742 	pctrl->chip.of_gpio_n_cells = 2;
743 	pctrl->chip.label = dev_name(pctrl->dev);
744 	pctrl->chip.ngpio = pctrl->npins;
745 	ret = gpiochip_add_data(&pctrl->chip, pctrl);
746 	if (ret) {
747 		dev_err(&pdev->dev, "failed register gpiochip\n");
748 		return ret;
749 	}
750 
751 	ret = gpiochip_add_pin_range(&pctrl->chip,
752 				     dev_name(pctrl->dev),
753 				     0, 0, pctrl->chip.ngpio);
754 	if (ret) {
755 		dev_err(pctrl->dev, "failed to add pin range\n");
756 		goto unregister_gpiochip;
757 	}
758 
759 	platform_set_drvdata(pdev, pctrl);
760 
761 	dev_dbg(&pdev->dev, "Qualcomm pm8xxx gpio driver probed\n");
762 
763 	return 0;
764 
765 unregister_gpiochip:
766 	gpiochip_remove(&pctrl->chip);
767 
768 	return ret;
769 }
770 
771 static int pm8xxx_gpio_remove(struct platform_device *pdev)
772 {
773 	struct pm8xxx_gpio *pctrl = platform_get_drvdata(pdev);
774 
775 	gpiochip_remove(&pctrl->chip);
776 
777 	return 0;
778 }
779 
780 static struct platform_driver pm8xxx_gpio_driver = {
781 	.driver = {
782 		.name = "qcom-ssbi-gpio",
783 		.of_match_table = pm8xxx_gpio_of_match,
784 	},
785 	.probe = pm8xxx_gpio_probe,
786 	.remove = pm8xxx_gpio_remove,
787 };
788 
789 module_platform_driver(pm8xxx_gpio_driver);
790 
791 MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
792 MODULE_DESCRIPTION("Qualcomm PM8xxx GPIO driver");
793 MODULE_LICENSE("GPL v2");
794