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