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