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  */
111 struct 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 
127 struct pmic_gpio_state {
128 	struct device	*dev;
129 	struct regmap	*map;
130 	struct pinctrl_dev *ctrl;
131 	struct gpio_chip chip;
132 };
133 
134 static const struct pinconf_generic_params pmic_gpio_bindings[] = {
135 	{"qcom,pull-up-strength",	PMIC_GPIO_CONF_PULL_UP,		0},
136 	{"qcom,drive-strength",		PMIC_GPIO_CONF_STRENGTH,	0},
137 };
138 
139 #ifdef CONFIG_DEBUG_FS
140 static 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),
143 };
144 #endif
145 
146 static 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 
154 static 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 
161 static 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 
166 static 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 
181 static 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 
194 static int pmic_gpio_get_groups_count(struct pinctrl_dev *pctldev)
195 {
196 	/* Every PIN is a group */
197 	return pctldev->desc->npins;
198 }
199 
200 static const char *pmic_gpio_get_group_name(struct pinctrl_dev *pctldev,
201 					    unsigned pin)
202 {
203 	return pctldev->desc->pins[pin].name;
204 }
205 
206 static 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 
214 static 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,
218 	.dt_node_to_map		= pinconf_generic_dt_node_to_map_group,
219 	.dt_free_map		= pinctrl_utils_dt_free_map,
220 };
221 
222 static int pmic_gpio_get_functions_count(struct pinctrl_dev *pctldev)
223 {
224 	return ARRAY_SIZE(pmic_gpio_functions);
225 }
226 
227 static const char *pmic_gpio_get_function_name(struct pinctrl_dev *pctldev,
228 					       unsigned function)
229 {
230 	return pmic_gpio_functions[function];
231 }
232 
233 static 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 
243 static 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 
263 	val = val << PMIC_GPIO_REG_MODE_DIR_SHIFT;
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 
276 static 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 
283 static 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 
337 static 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;
421 	val |= pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
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 
442 static 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 
470 		if (pad->input_enabled) {
471 			ret = pmic_gpio_read(state, pad, PMIC_MPP_REG_RT_STS);
472 			if (ret < 0)
473 				return;
474 
475 			ret &= PMIC_MPP_REG_RT_STS_VAL_MASK;
476 			pad->out_value = ret;
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 
489 static const struct pinconf_ops pmic_gpio_pinconf_ops = {
490 	.is_generic			= true,
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 
496 static 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 
506 static 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 
517 static 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 
539 static 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 
549 static int pmic_gpio_of_xlate(struct gpio_chip *chip,
550 			      const struct of_phandle_args *gpio_desc,
551 			      u32 *flags)
552 {
553 	if (chip->of_gpio_n_cells < 2)
554 		return -EINVAL;
555 
556 	if (flags)
557 		*flags = gpio_desc->args[1];
558 
559 	return gpio_desc->args[0] - PMIC_GPIO_PHYSICAL_OFFSET;
560 }
561 
562 static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned pin)
563 {
564 	struct pmic_gpio_state *state = to_gpio_state(chip);
565 	struct pmic_gpio_pad *pad;
566 
567 	pad = state->ctrl->desc->pins[pin].drv_data;
568 
569 	return pad->irq;
570 }
571 
572 static void pmic_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
573 {
574 	struct pmic_gpio_state *state = to_gpio_state(chip);
575 	unsigned i;
576 
577 	for (i = 0; i < chip->ngpio; i++) {
578 		pmic_gpio_config_dbg_show(state->ctrl, s, i);
579 		seq_puts(s, "\n");
580 	}
581 }
582 
583 static const struct gpio_chip pmic_gpio_gpio_template = {
584 	.direction_input	= pmic_gpio_direction_input,
585 	.direction_output	= pmic_gpio_direction_output,
586 	.get			= pmic_gpio_get,
587 	.set			= pmic_gpio_set,
588 	.request		= gpiochip_generic_request,
589 	.free			= gpiochip_generic_free,
590 	.of_xlate		= pmic_gpio_of_xlate,
591 	.to_irq			= pmic_gpio_to_irq,
592 	.dbg_show		= pmic_gpio_dbg_show,
593 };
594 
595 static int pmic_gpio_populate(struct pmic_gpio_state *state,
596 			      struct pmic_gpio_pad *pad)
597 {
598 	int type, subtype, val, dir;
599 
600 	type = pmic_gpio_read(state, pad, PMIC_GPIO_REG_TYPE);
601 	if (type < 0)
602 		return type;
603 
604 	if (type != PMIC_GPIO_TYPE) {
605 		dev_err(state->dev, "incorrect block type 0x%x at 0x%x\n",
606 			type, pad->base);
607 		return -ENODEV;
608 	}
609 
610 	subtype = pmic_gpio_read(state, pad, PMIC_GPIO_REG_SUBTYPE);
611 	if (subtype < 0)
612 		return subtype;
613 
614 	switch (subtype) {
615 	case PMIC_GPIO_SUBTYPE_GPIO_4CH:
616 		pad->have_buffer = true;
617 	case PMIC_GPIO_SUBTYPE_GPIOC_4CH:
618 		pad->num_sources = 4;
619 		break;
620 	case PMIC_GPIO_SUBTYPE_GPIO_8CH:
621 		pad->have_buffer = true;
622 	case PMIC_GPIO_SUBTYPE_GPIOC_8CH:
623 		pad->num_sources = 8;
624 		break;
625 	default:
626 		dev_err(state->dev, "unknown GPIO type 0x%x\n", subtype);
627 		return -ENODEV;
628 	}
629 
630 	val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_MODE_CTL);
631 	if (val < 0)
632 		return val;
633 
634 	pad->out_value = val & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
635 
636 	dir = val >> PMIC_GPIO_REG_MODE_DIR_SHIFT;
637 	dir &= PMIC_GPIO_REG_MODE_DIR_MASK;
638 	switch (dir) {
639 	case 0:
640 		pad->input_enabled = true;
641 		pad->output_enabled = false;
642 		break;
643 	case 1:
644 		pad->input_enabled = false;
645 		pad->output_enabled = true;
646 		break;
647 	case 2:
648 		pad->input_enabled = true;
649 		pad->output_enabled = true;
650 		break;
651 	default:
652 		dev_err(state->dev, "unknown GPIO direction\n");
653 		return -ENODEV;
654 	}
655 
656 	pad->function = val >> PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
657 	pad->function &= PMIC_GPIO_REG_MODE_FUNCTION_MASK;
658 
659 	val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_VIN_CTL);
660 	if (val < 0)
661 		return val;
662 
663 	pad->power_source = val >> PMIC_GPIO_REG_VIN_SHIFT;
664 	pad->power_source &= PMIC_GPIO_REG_VIN_MASK;
665 
666 	val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_PULL_CTL);
667 	if (val < 0)
668 		return val;
669 
670 	pad->pullup = val >> PMIC_GPIO_REG_PULL_SHIFT;
671 	pad->pullup &= PMIC_GPIO_REG_PULL_MASK;
672 
673 	val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_OUT_CTL);
674 	if (val < 0)
675 		return val;
676 
677 	pad->strength = val >> PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
678 	pad->strength &= PMIC_GPIO_REG_OUT_STRENGTH_MASK;
679 
680 	pad->buffer_type = val >> PMIC_GPIO_REG_OUT_TYPE_SHIFT;
681 	pad->buffer_type &= PMIC_GPIO_REG_OUT_TYPE_MASK;
682 
683 	/* Pin could be disabled with PIN_CONFIG_BIAS_HIGH_IMPEDANCE */
684 	pad->is_enabled = true;
685 	return 0;
686 }
687 
688 static int pmic_gpio_probe(struct platform_device *pdev)
689 {
690 	struct device *dev = &pdev->dev;
691 	struct pinctrl_pin_desc *pindesc;
692 	struct pinctrl_desc *pctrldesc;
693 	struct pmic_gpio_pad *pad, *pads;
694 	struct pmic_gpio_state *state;
695 	int ret, npins, i;
696 	u32 res[2];
697 
698 	ret = of_property_read_u32_array(dev->of_node, "reg", res, 2);
699 	if (ret < 0) {
700 		dev_err(dev, "missing base address and/or range");
701 		return ret;
702 	}
703 
704 	npins = res[1] / PMIC_GPIO_ADDRESS_RANGE;
705 
706 	if (!npins)
707 		return -EINVAL;
708 
709 	BUG_ON(npins > ARRAY_SIZE(pmic_gpio_groups));
710 
711 	state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL);
712 	if (!state)
713 		return -ENOMEM;
714 
715 	platform_set_drvdata(pdev, state);
716 
717 	state->dev = &pdev->dev;
718 	state->map = dev_get_regmap(dev->parent, NULL);
719 
720 	pindesc = devm_kcalloc(dev, npins, sizeof(*pindesc), GFP_KERNEL);
721 	if (!pindesc)
722 		return -ENOMEM;
723 
724 	pads = devm_kcalloc(dev, npins, sizeof(*pads), GFP_KERNEL);
725 	if (!pads)
726 		return -ENOMEM;
727 
728 	pctrldesc = devm_kzalloc(dev, sizeof(*pctrldesc), GFP_KERNEL);
729 	if (!pctrldesc)
730 		return -ENOMEM;
731 
732 	pctrldesc->pctlops = &pmic_gpio_pinctrl_ops;
733 	pctrldesc->pmxops = &pmic_gpio_pinmux_ops;
734 	pctrldesc->confops = &pmic_gpio_pinconf_ops;
735 	pctrldesc->owner = THIS_MODULE;
736 	pctrldesc->name = dev_name(dev);
737 	pctrldesc->pins = pindesc;
738 	pctrldesc->npins = npins;
739 	pctrldesc->num_custom_params = ARRAY_SIZE(pmic_gpio_bindings);
740 	pctrldesc->custom_params = pmic_gpio_bindings;
741 #ifdef CONFIG_DEBUG_FS
742 	pctrldesc->custom_conf_items = pmic_conf_items;
743 #endif
744 
745 	for (i = 0; i < npins; i++, pindesc++) {
746 		pad = &pads[i];
747 		pindesc->drv_data = pad;
748 		pindesc->number = i;
749 		pindesc->name = pmic_gpio_groups[i];
750 
751 		pad->irq = platform_get_irq(pdev, i);
752 		if (pad->irq < 0)
753 			return pad->irq;
754 
755 		pad->base = res[0] + i * PMIC_GPIO_ADDRESS_RANGE;
756 
757 		ret = pmic_gpio_populate(state, pad);
758 		if (ret < 0)
759 			return ret;
760 	}
761 
762 	state->chip = pmic_gpio_gpio_template;
763 	state->chip.dev = dev;
764 	state->chip.base = -1;
765 	state->chip.ngpio = npins;
766 	state->chip.label = dev_name(dev);
767 	state->chip.of_gpio_n_cells = 2;
768 	state->chip.can_sleep = false;
769 
770 	state->ctrl = pinctrl_register(pctrldesc, dev, state);
771 	if (IS_ERR(state->ctrl))
772 		return PTR_ERR(state->ctrl);
773 
774 	ret = gpiochip_add(&state->chip);
775 	if (ret) {
776 		dev_err(state->dev, "can't add gpio chip\n");
777 		goto err_chip;
778 	}
779 
780 	ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, npins);
781 	if (ret) {
782 		dev_err(dev, "failed to add pin range\n");
783 		goto err_range;
784 	}
785 
786 	return 0;
787 
788 err_range:
789 	gpiochip_remove(&state->chip);
790 err_chip:
791 	pinctrl_unregister(state->ctrl);
792 	return ret;
793 }
794 
795 static int pmic_gpio_remove(struct platform_device *pdev)
796 {
797 	struct pmic_gpio_state *state = platform_get_drvdata(pdev);
798 
799 	gpiochip_remove(&state->chip);
800 	pinctrl_unregister(state->ctrl);
801 	return 0;
802 }
803 
804 static const struct of_device_id pmic_gpio_of_match[] = {
805 	{ .compatible = "qcom,pm8916-gpio" },	/* 4 GPIO's */
806 	{ .compatible = "qcom,pm8941-gpio" },	/* 36 GPIO's */
807 	{ .compatible = "qcom,pma8084-gpio" },	/* 22 GPIO's */
808 	{ },
809 };
810 
811 MODULE_DEVICE_TABLE(of, pmic_gpio_of_match);
812 
813 static struct platform_driver pmic_gpio_driver = {
814 	.driver = {
815 		   .name = "qcom-spmi-gpio",
816 		   .of_match_table = pmic_gpio_of_match,
817 	},
818 	.probe	= pmic_gpio_probe,
819 	.remove = pmic_gpio_remove,
820 };
821 
822 module_platform_driver(pmic_gpio_driver);
823 
824 MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");
825 MODULE_DESCRIPTION("Qualcomm SPMI PMIC GPIO pin control driver");
826 MODULE_ALIAS("platform:qcom-spmi-gpio");
827 MODULE_LICENSE("GPL v2");
828