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