xref: /OK3568_Linux_fs/kernel/drivers/pinctrl/qcom/pinctrl-msm.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2013, Sony Mobile Communications AB.
4*4882a593Smuzhiyun  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/delay.h>
8*4882a593Smuzhiyun #include <linux/err.h>
9*4882a593Smuzhiyun #include <linux/io.h>
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/of.h>
12*4882a593Smuzhiyun #include <linux/platform_device.h>
13*4882a593Smuzhiyun #include <linux/pinctrl/machine.h>
14*4882a593Smuzhiyun #include <linux/pinctrl/pinctrl.h>
15*4882a593Smuzhiyun #include <linux/pinctrl/pinmux.h>
16*4882a593Smuzhiyun #include <linux/pinctrl/pinconf.h>
17*4882a593Smuzhiyun #include <linux/pinctrl/pinconf-generic.h>
18*4882a593Smuzhiyun #include <linux/slab.h>
19*4882a593Smuzhiyun #include <linux/gpio/driver.h>
20*4882a593Smuzhiyun #include <linux/interrupt.h>
21*4882a593Smuzhiyun #include <linux/spinlock.h>
22*4882a593Smuzhiyun #include <linux/reboot.h>
23*4882a593Smuzhiyun #include <linux/pm.h>
24*4882a593Smuzhiyun #include <linux/log2.h>
25*4882a593Smuzhiyun #include <linux/qcom_scm.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include <linux/soc/qcom/irq.h>
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #include "../core.h"
30*4882a593Smuzhiyun #include "../pinconf.h"
31*4882a593Smuzhiyun #include "pinctrl-msm.h"
32*4882a593Smuzhiyun #include "../pinctrl-utils.h"
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define MAX_NR_GPIO 300
35*4882a593Smuzhiyun #define MAX_NR_TILES 4
36*4882a593Smuzhiyun #define PS_HOLD_OFFSET 0x820
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /**
39*4882a593Smuzhiyun  * struct msm_pinctrl - state for a pinctrl-msm device
40*4882a593Smuzhiyun  * @dev:            device handle.
41*4882a593Smuzhiyun  * @pctrl:          pinctrl handle.
42*4882a593Smuzhiyun  * @chip:           gpiochip handle.
43*4882a593Smuzhiyun  * @desc:           pin controller descriptor
44*4882a593Smuzhiyun  * @restart_nb:     restart notifier block.
45*4882a593Smuzhiyun  * @irq_chip:       irq chip information
46*4882a593Smuzhiyun  * @irq:            parent irq for the TLMM irq_chip.
47*4882a593Smuzhiyun  * @intr_target_use_scm: route irq to application cpu using scm calls
48*4882a593Smuzhiyun  * @lock:           Spinlock to protect register resources as well
49*4882a593Smuzhiyun  *                  as msm_pinctrl data structures.
50*4882a593Smuzhiyun  * @enabled_irqs:   Bitmap of currently enabled irqs.
51*4882a593Smuzhiyun  * @dual_edge_irqs: Bitmap of irqs that need sw emulated dual edge
52*4882a593Smuzhiyun  *                  detection.
53*4882a593Smuzhiyun  * @skip_wake_irqs: Skip IRQs that are handled by wakeup interrupt controller
54*4882a593Smuzhiyun  * @disabled_for_mux: These IRQs were disabled because we muxed away.
55*4882a593Smuzhiyun  * @soc:            Reference to soc_data of platform specific data.
56*4882a593Smuzhiyun  * @regs:           Base addresses for the TLMM tiles.
57*4882a593Smuzhiyun  * @phys_base:      Physical base address
58*4882a593Smuzhiyun  */
59*4882a593Smuzhiyun struct msm_pinctrl {
60*4882a593Smuzhiyun 	struct device *dev;
61*4882a593Smuzhiyun 	struct pinctrl_dev *pctrl;
62*4882a593Smuzhiyun 	struct gpio_chip chip;
63*4882a593Smuzhiyun 	struct pinctrl_desc desc;
64*4882a593Smuzhiyun 	struct notifier_block restart_nb;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	struct irq_chip irq_chip;
67*4882a593Smuzhiyun 	int irq;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	bool intr_target_use_scm;
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	raw_spinlock_t lock;
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO);
74*4882a593Smuzhiyun 	DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO);
75*4882a593Smuzhiyun 	DECLARE_BITMAP(skip_wake_irqs, MAX_NR_GPIO);
76*4882a593Smuzhiyun 	DECLARE_BITMAP(disabled_for_mux, MAX_NR_GPIO);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	const struct msm_pinctrl_soc_data *soc;
79*4882a593Smuzhiyun 	void __iomem *regs[MAX_NR_TILES];
80*4882a593Smuzhiyun 	u32 phys_base[MAX_NR_TILES];
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define MSM_ACCESSOR(name) \
84*4882a593Smuzhiyun static u32 msm_readl_##name(struct msm_pinctrl *pctrl, \
85*4882a593Smuzhiyun 			    const struct msm_pingroup *g) \
86*4882a593Smuzhiyun { \
87*4882a593Smuzhiyun 	return readl(pctrl->regs[g->tile] + g->name##_reg); \
88*4882a593Smuzhiyun } \
89*4882a593Smuzhiyun static void msm_writel_##name(u32 val, struct msm_pinctrl *pctrl, \
90*4882a593Smuzhiyun 			      const struct msm_pingroup *g) \
91*4882a593Smuzhiyun { \
92*4882a593Smuzhiyun 	writel(val, pctrl->regs[g->tile] + g->name##_reg); \
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun MSM_ACCESSOR(ctl)
MSM_ACCESSOR(io)96*4882a593Smuzhiyun MSM_ACCESSOR(io)
97*4882a593Smuzhiyun MSM_ACCESSOR(intr_cfg)
98*4882a593Smuzhiyun MSM_ACCESSOR(intr_status)
99*4882a593Smuzhiyun MSM_ACCESSOR(intr_target)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun static void msm_ack_intr_status(struct msm_pinctrl *pctrl,
102*4882a593Smuzhiyun 				const struct msm_pingroup *g)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	u32 val = g->intr_ack_high ? BIT(g->intr_status_bit) : 0;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	msm_writel_intr_status(val, pctrl, g);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun 
msm_get_groups_count(struct pinctrl_dev * pctldev)109*4882a593Smuzhiyun static int msm_get_groups_count(struct pinctrl_dev *pctldev)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	return pctrl->soc->ngroups;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun 
msm_get_group_name(struct pinctrl_dev * pctldev,unsigned group)116*4882a593Smuzhiyun static const char *msm_get_group_name(struct pinctrl_dev *pctldev,
117*4882a593Smuzhiyun 				      unsigned group)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	return pctrl->soc->groups[group].name;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
msm_get_group_pins(struct pinctrl_dev * pctldev,unsigned group,const unsigned ** pins,unsigned * num_pins)124*4882a593Smuzhiyun static int msm_get_group_pins(struct pinctrl_dev *pctldev,
125*4882a593Smuzhiyun 			      unsigned group,
126*4882a593Smuzhiyun 			      const unsigned **pins,
127*4882a593Smuzhiyun 			      unsigned *num_pins)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	*pins = pctrl->soc->groups[group].pins;
132*4882a593Smuzhiyun 	*num_pins = pctrl->soc->groups[group].npins;
133*4882a593Smuzhiyun 	return 0;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun static const struct pinctrl_ops msm_pinctrl_ops = {
137*4882a593Smuzhiyun 	.get_groups_count	= msm_get_groups_count,
138*4882a593Smuzhiyun 	.get_group_name		= msm_get_group_name,
139*4882a593Smuzhiyun 	.get_group_pins		= msm_get_group_pins,
140*4882a593Smuzhiyun 	.dt_node_to_map		= pinconf_generic_dt_node_to_map_group,
141*4882a593Smuzhiyun 	.dt_free_map		= pinctrl_utils_free_map,
142*4882a593Smuzhiyun };
143*4882a593Smuzhiyun 
msm_pinmux_request(struct pinctrl_dev * pctldev,unsigned offset)144*4882a593Smuzhiyun static int msm_pinmux_request(struct pinctrl_dev *pctldev, unsigned offset)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
147*4882a593Smuzhiyun 	struct gpio_chip *chip = &pctrl->chip;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	return gpiochip_line_is_valid(chip, offset) ? 0 : -EINVAL;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
msm_get_functions_count(struct pinctrl_dev * pctldev)152*4882a593Smuzhiyun static int msm_get_functions_count(struct pinctrl_dev *pctldev)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	return pctrl->soc->nfunctions;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
msm_get_function_name(struct pinctrl_dev * pctldev,unsigned function)159*4882a593Smuzhiyun static const char *msm_get_function_name(struct pinctrl_dev *pctldev,
160*4882a593Smuzhiyun 					 unsigned function)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	return pctrl->soc->functions[function].name;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
msm_get_function_groups(struct pinctrl_dev * pctldev,unsigned function,const char * const ** groups,unsigned * const num_groups)167*4882a593Smuzhiyun static int msm_get_function_groups(struct pinctrl_dev *pctldev,
168*4882a593Smuzhiyun 				   unsigned function,
169*4882a593Smuzhiyun 				   const char * const **groups,
170*4882a593Smuzhiyun 				   unsigned * const num_groups)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	*groups = pctrl->soc->functions[function].groups;
175*4882a593Smuzhiyun 	*num_groups = pctrl->soc->functions[function].ngroups;
176*4882a593Smuzhiyun 	return 0;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun 
msm_pinmux_set_mux(struct pinctrl_dev * pctldev,unsigned function,unsigned group)179*4882a593Smuzhiyun static int msm_pinmux_set_mux(struct pinctrl_dev *pctldev,
180*4882a593Smuzhiyun 			      unsigned function,
181*4882a593Smuzhiyun 			      unsigned group)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
184*4882a593Smuzhiyun 	struct gpio_chip *gc = &pctrl->chip;
185*4882a593Smuzhiyun 	unsigned int irq = irq_find_mapping(gc->irq.domain, group);
186*4882a593Smuzhiyun 	struct irq_data *d = irq_get_irq_data(irq);
187*4882a593Smuzhiyun 	unsigned int gpio_func = pctrl->soc->gpio_func;
188*4882a593Smuzhiyun 	const struct msm_pingroup *g;
189*4882a593Smuzhiyun 	unsigned long flags;
190*4882a593Smuzhiyun 	u32 val, mask;
191*4882a593Smuzhiyun 	int i;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	g = &pctrl->soc->groups[group];
194*4882a593Smuzhiyun 	mask = GENMASK(g->mux_bit + order_base_2(g->nfuncs) - 1, g->mux_bit);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	for (i = 0; i < g->nfuncs; i++) {
197*4882a593Smuzhiyun 		if (g->funcs[i] == function)
198*4882a593Smuzhiyun 			break;
199*4882a593Smuzhiyun 	}
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	if (WARN_ON(i == g->nfuncs))
202*4882a593Smuzhiyun 		return -EINVAL;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	/*
205*4882a593Smuzhiyun 	 * If an GPIO interrupt is setup on this pin then we need special
206*4882a593Smuzhiyun 	 * handling.  Specifically interrupt detection logic will still see
207*4882a593Smuzhiyun 	 * the pin twiddle even when we're muxed away.
208*4882a593Smuzhiyun 	 *
209*4882a593Smuzhiyun 	 * When we see a pin with an interrupt setup on it then we'll disable
210*4882a593Smuzhiyun 	 * (mask) interrupts on it when we mux away until we mux back.  Note
211*4882a593Smuzhiyun 	 * that disable_irq() refcounts and interrupts are disabled as long as
212*4882a593Smuzhiyun 	 * at least one disable_irq() has been called.
213*4882a593Smuzhiyun 	 */
214*4882a593Smuzhiyun 	if (d && i != gpio_func &&
215*4882a593Smuzhiyun 	    !test_and_set_bit(d->hwirq, pctrl->disabled_for_mux))
216*4882a593Smuzhiyun 		disable_irq(irq);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&pctrl->lock, flags);
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	val = msm_readl_ctl(pctrl, g);
221*4882a593Smuzhiyun 	val &= ~mask;
222*4882a593Smuzhiyun 	val |= i << g->mux_bit;
223*4882a593Smuzhiyun 	msm_writel_ctl(val, pctrl, g);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&pctrl->lock, flags);
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	if (d && i == gpio_func &&
228*4882a593Smuzhiyun 	    test_and_clear_bit(d->hwirq, pctrl->disabled_for_mux)) {
229*4882a593Smuzhiyun 		/*
230*4882a593Smuzhiyun 		 * Clear interrupts detected while not GPIO since we only
231*4882a593Smuzhiyun 		 * masked things.
232*4882a593Smuzhiyun 		 */
233*4882a593Smuzhiyun 		if (d->parent_data && test_bit(d->hwirq, pctrl->skip_wake_irqs))
234*4882a593Smuzhiyun 			irq_chip_set_parent_state(d, IRQCHIP_STATE_PENDING, false);
235*4882a593Smuzhiyun 		else
236*4882a593Smuzhiyun 			msm_ack_intr_status(pctrl, g);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 		enable_irq(irq);
239*4882a593Smuzhiyun 	}
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	return 0;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun 
msm_pinmux_request_gpio(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range,unsigned offset)244*4882a593Smuzhiyun static int msm_pinmux_request_gpio(struct pinctrl_dev *pctldev,
245*4882a593Smuzhiyun 				   struct pinctrl_gpio_range *range,
246*4882a593Smuzhiyun 				   unsigned offset)
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
249*4882a593Smuzhiyun 	const struct msm_pingroup *g = &pctrl->soc->groups[offset];
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	/* No funcs? Probably ACPI so can't do anything here */
252*4882a593Smuzhiyun 	if (!g->nfuncs)
253*4882a593Smuzhiyun 		return 0;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	return msm_pinmux_set_mux(pctldev, g->funcs[pctrl->soc->gpio_func], offset);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun static const struct pinmux_ops msm_pinmux_ops = {
259*4882a593Smuzhiyun 	.request		= msm_pinmux_request,
260*4882a593Smuzhiyun 	.get_functions_count	= msm_get_functions_count,
261*4882a593Smuzhiyun 	.get_function_name	= msm_get_function_name,
262*4882a593Smuzhiyun 	.get_function_groups	= msm_get_function_groups,
263*4882a593Smuzhiyun 	.gpio_request_enable	= msm_pinmux_request_gpio,
264*4882a593Smuzhiyun 	.set_mux		= msm_pinmux_set_mux,
265*4882a593Smuzhiyun };
266*4882a593Smuzhiyun 
msm_config_reg(struct msm_pinctrl * pctrl,const struct msm_pingroup * g,unsigned param,unsigned * mask,unsigned * bit)267*4882a593Smuzhiyun static int msm_config_reg(struct msm_pinctrl *pctrl,
268*4882a593Smuzhiyun 			  const struct msm_pingroup *g,
269*4882a593Smuzhiyun 			  unsigned param,
270*4882a593Smuzhiyun 			  unsigned *mask,
271*4882a593Smuzhiyun 			  unsigned *bit)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun 	switch (param) {
274*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_DISABLE:
275*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_DOWN:
276*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_BUS_HOLD:
277*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_UP:
278*4882a593Smuzhiyun 		*bit = g->pull_bit;
279*4882a593Smuzhiyun 		*mask = 3;
280*4882a593Smuzhiyun 		break;
281*4882a593Smuzhiyun 	case PIN_CONFIG_DRIVE_OPEN_DRAIN:
282*4882a593Smuzhiyun 		*bit = g->od_bit;
283*4882a593Smuzhiyun 		*mask = 1;
284*4882a593Smuzhiyun 		break;
285*4882a593Smuzhiyun 	case PIN_CONFIG_DRIVE_STRENGTH:
286*4882a593Smuzhiyun 		*bit = g->drv_bit;
287*4882a593Smuzhiyun 		*mask = 7;
288*4882a593Smuzhiyun 		break;
289*4882a593Smuzhiyun 	case PIN_CONFIG_OUTPUT:
290*4882a593Smuzhiyun 	case PIN_CONFIG_INPUT_ENABLE:
291*4882a593Smuzhiyun 		*bit = g->oe_bit;
292*4882a593Smuzhiyun 		*mask = 1;
293*4882a593Smuzhiyun 		break;
294*4882a593Smuzhiyun 	default:
295*4882a593Smuzhiyun 		return -ENOTSUPP;
296*4882a593Smuzhiyun 	}
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	return 0;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun #define MSM_NO_PULL		0
302*4882a593Smuzhiyun #define MSM_PULL_DOWN		1
303*4882a593Smuzhiyun #define MSM_KEEPER		2
304*4882a593Smuzhiyun #define MSM_PULL_UP_NO_KEEPER	2
305*4882a593Smuzhiyun #define MSM_PULL_UP		3
306*4882a593Smuzhiyun 
msm_regval_to_drive(u32 val)307*4882a593Smuzhiyun static unsigned msm_regval_to_drive(u32 val)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun 	return (val + 1) * 2;
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun 
msm_config_group_get(struct pinctrl_dev * pctldev,unsigned int group,unsigned long * config)312*4882a593Smuzhiyun static int msm_config_group_get(struct pinctrl_dev *pctldev,
313*4882a593Smuzhiyun 				unsigned int group,
314*4882a593Smuzhiyun 				unsigned long *config)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun 	const struct msm_pingroup *g;
317*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
318*4882a593Smuzhiyun 	unsigned param = pinconf_to_config_param(*config);
319*4882a593Smuzhiyun 	unsigned mask;
320*4882a593Smuzhiyun 	unsigned arg;
321*4882a593Smuzhiyun 	unsigned bit;
322*4882a593Smuzhiyun 	int ret;
323*4882a593Smuzhiyun 	u32 val;
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 	g = &pctrl->soc->groups[group];
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	ret = msm_config_reg(pctrl, g, param, &mask, &bit);
328*4882a593Smuzhiyun 	if (ret < 0)
329*4882a593Smuzhiyun 		return ret;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	val = msm_readl_ctl(pctrl, g);
332*4882a593Smuzhiyun 	arg = (val >> bit) & mask;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	/* Convert register value to pinconf value */
335*4882a593Smuzhiyun 	switch (param) {
336*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_DISABLE:
337*4882a593Smuzhiyun 		if (arg != MSM_NO_PULL)
338*4882a593Smuzhiyun 			return -EINVAL;
339*4882a593Smuzhiyun 		arg = 1;
340*4882a593Smuzhiyun 		break;
341*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_DOWN:
342*4882a593Smuzhiyun 		if (arg != MSM_PULL_DOWN)
343*4882a593Smuzhiyun 			return -EINVAL;
344*4882a593Smuzhiyun 		arg = 1;
345*4882a593Smuzhiyun 		break;
346*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_BUS_HOLD:
347*4882a593Smuzhiyun 		if (pctrl->soc->pull_no_keeper)
348*4882a593Smuzhiyun 			return -ENOTSUPP;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 		if (arg != MSM_KEEPER)
351*4882a593Smuzhiyun 			return -EINVAL;
352*4882a593Smuzhiyun 		arg = 1;
353*4882a593Smuzhiyun 		break;
354*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_UP:
355*4882a593Smuzhiyun 		if (pctrl->soc->pull_no_keeper)
356*4882a593Smuzhiyun 			arg = arg == MSM_PULL_UP_NO_KEEPER;
357*4882a593Smuzhiyun 		else
358*4882a593Smuzhiyun 			arg = arg == MSM_PULL_UP;
359*4882a593Smuzhiyun 		if (!arg)
360*4882a593Smuzhiyun 			return -EINVAL;
361*4882a593Smuzhiyun 		break;
362*4882a593Smuzhiyun 	case PIN_CONFIG_DRIVE_OPEN_DRAIN:
363*4882a593Smuzhiyun 		/* Pin is not open-drain */
364*4882a593Smuzhiyun 		if (!arg)
365*4882a593Smuzhiyun 			return -EINVAL;
366*4882a593Smuzhiyun 		arg = 1;
367*4882a593Smuzhiyun 		break;
368*4882a593Smuzhiyun 	case PIN_CONFIG_DRIVE_STRENGTH:
369*4882a593Smuzhiyun 		arg = msm_regval_to_drive(arg);
370*4882a593Smuzhiyun 		break;
371*4882a593Smuzhiyun 	case PIN_CONFIG_OUTPUT:
372*4882a593Smuzhiyun 		/* Pin is not output */
373*4882a593Smuzhiyun 		if (!arg)
374*4882a593Smuzhiyun 			return -EINVAL;
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 		val = msm_readl_io(pctrl, g);
377*4882a593Smuzhiyun 		arg = !!(val & BIT(g->in_bit));
378*4882a593Smuzhiyun 		break;
379*4882a593Smuzhiyun 	case PIN_CONFIG_INPUT_ENABLE:
380*4882a593Smuzhiyun 		/* Pin is output */
381*4882a593Smuzhiyun 		if (arg)
382*4882a593Smuzhiyun 			return -EINVAL;
383*4882a593Smuzhiyun 		arg = 1;
384*4882a593Smuzhiyun 		break;
385*4882a593Smuzhiyun 	default:
386*4882a593Smuzhiyun 		return -ENOTSUPP;
387*4882a593Smuzhiyun 	}
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	*config = pinconf_to_config_packed(param, arg);
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	return 0;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun 
msm_config_group_set(struct pinctrl_dev * pctldev,unsigned group,unsigned long * configs,unsigned num_configs)394*4882a593Smuzhiyun static int msm_config_group_set(struct pinctrl_dev *pctldev,
395*4882a593Smuzhiyun 				unsigned group,
396*4882a593Smuzhiyun 				unsigned long *configs,
397*4882a593Smuzhiyun 				unsigned num_configs)
398*4882a593Smuzhiyun {
399*4882a593Smuzhiyun 	const struct msm_pingroup *g;
400*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
401*4882a593Smuzhiyun 	unsigned long flags;
402*4882a593Smuzhiyun 	unsigned param;
403*4882a593Smuzhiyun 	unsigned mask;
404*4882a593Smuzhiyun 	unsigned arg;
405*4882a593Smuzhiyun 	unsigned bit;
406*4882a593Smuzhiyun 	int ret;
407*4882a593Smuzhiyun 	u32 val;
408*4882a593Smuzhiyun 	int i;
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	g = &pctrl->soc->groups[group];
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	for (i = 0; i < num_configs; i++) {
413*4882a593Smuzhiyun 		param = pinconf_to_config_param(configs[i]);
414*4882a593Smuzhiyun 		arg = pinconf_to_config_argument(configs[i]);
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 		ret = msm_config_reg(pctrl, g, param, &mask, &bit);
417*4882a593Smuzhiyun 		if (ret < 0)
418*4882a593Smuzhiyun 			return ret;
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 		/* Convert pinconf values to register values */
421*4882a593Smuzhiyun 		switch (param) {
422*4882a593Smuzhiyun 		case PIN_CONFIG_BIAS_DISABLE:
423*4882a593Smuzhiyun 			arg = MSM_NO_PULL;
424*4882a593Smuzhiyun 			break;
425*4882a593Smuzhiyun 		case PIN_CONFIG_BIAS_PULL_DOWN:
426*4882a593Smuzhiyun 			arg = MSM_PULL_DOWN;
427*4882a593Smuzhiyun 			break;
428*4882a593Smuzhiyun 		case PIN_CONFIG_BIAS_BUS_HOLD:
429*4882a593Smuzhiyun 			if (pctrl->soc->pull_no_keeper)
430*4882a593Smuzhiyun 				return -ENOTSUPP;
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 			arg = MSM_KEEPER;
433*4882a593Smuzhiyun 			break;
434*4882a593Smuzhiyun 		case PIN_CONFIG_BIAS_PULL_UP:
435*4882a593Smuzhiyun 			if (pctrl->soc->pull_no_keeper)
436*4882a593Smuzhiyun 				arg = MSM_PULL_UP_NO_KEEPER;
437*4882a593Smuzhiyun 			else
438*4882a593Smuzhiyun 				arg = MSM_PULL_UP;
439*4882a593Smuzhiyun 			break;
440*4882a593Smuzhiyun 		case PIN_CONFIG_DRIVE_OPEN_DRAIN:
441*4882a593Smuzhiyun 			arg = 1;
442*4882a593Smuzhiyun 			break;
443*4882a593Smuzhiyun 		case PIN_CONFIG_DRIVE_STRENGTH:
444*4882a593Smuzhiyun 			/* Check for invalid values */
445*4882a593Smuzhiyun 			if (arg > 16 || arg < 2 || (arg % 2) != 0)
446*4882a593Smuzhiyun 				arg = -1;
447*4882a593Smuzhiyun 			else
448*4882a593Smuzhiyun 				arg = (arg / 2) - 1;
449*4882a593Smuzhiyun 			break;
450*4882a593Smuzhiyun 		case PIN_CONFIG_OUTPUT:
451*4882a593Smuzhiyun 			/* set output value */
452*4882a593Smuzhiyun 			raw_spin_lock_irqsave(&pctrl->lock, flags);
453*4882a593Smuzhiyun 			val = msm_readl_io(pctrl, g);
454*4882a593Smuzhiyun 			if (arg)
455*4882a593Smuzhiyun 				val |= BIT(g->out_bit);
456*4882a593Smuzhiyun 			else
457*4882a593Smuzhiyun 				val &= ~BIT(g->out_bit);
458*4882a593Smuzhiyun 			msm_writel_io(val, pctrl, g);
459*4882a593Smuzhiyun 			raw_spin_unlock_irqrestore(&pctrl->lock, flags);
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun 			/* enable output */
462*4882a593Smuzhiyun 			arg = 1;
463*4882a593Smuzhiyun 			break;
464*4882a593Smuzhiyun 		case PIN_CONFIG_INPUT_ENABLE:
465*4882a593Smuzhiyun 			/* disable output */
466*4882a593Smuzhiyun 			arg = 0;
467*4882a593Smuzhiyun 			break;
468*4882a593Smuzhiyun 		default:
469*4882a593Smuzhiyun 			dev_err(pctrl->dev, "Unsupported config parameter: %x\n",
470*4882a593Smuzhiyun 				param);
471*4882a593Smuzhiyun 			return -EINVAL;
472*4882a593Smuzhiyun 		}
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 		/* Range-check user-supplied value */
475*4882a593Smuzhiyun 		if (arg & ~mask) {
476*4882a593Smuzhiyun 			dev_err(pctrl->dev, "config %x: %x is invalid\n", param, arg);
477*4882a593Smuzhiyun 			return -EINVAL;
478*4882a593Smuzhiyun 		}
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun 		raw_spin_lock_irqsave(&pctrl->lock, flags);
481*4882a593Smuzhiyun 		val = msm_readl_ctl(pctrl, g);
482*4882a593Smuzhiyun 		val &= ~(mask << bit);
483*4882a593Smuzhiyun 		val |= arg << bit;
484*4882a593Smuzhiyun 		msm_writel_ctl(val, pctrl, g);
485*4882a593Smuzhiyun 		raw_spin_unlock_irqrestore(&pctrl->lock, flags);
486*4882a593Smuzhiyun 	}
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 	return 0;
489*4882a593Smuzhiyun }
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun static const struct pinconf_ops msm_pinconf_ops = {
492*4882a593Smuzhiyun 	.is_generic		= true,
493*4882a593Smuzhiyun 	.pin_config_group_get	= msm_config_group_get,
494*4882a593Smuzhiyun 	.pin_config_group_set	= msm_config_group_set,
495*4882a593Smuzhiyun };
496*4882a593Smuzhiyun 
msm_gpio_direction_input(struct gpio_chip * chip,unsigned offset)497*4882a593Smuzhiyun static int msm_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun 	const struct msm_pingroup *g;
500*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
501*4882a593Smuzhiyun 	unsigned long flags;
502*4882a593Smuzhiyun 	u32 val;
503*4882a593Smuzhiyun 
504*4882a593Smuzhiyun 	g = &pctrl->soc->groups[offset];
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&pctrl->lock, flags);
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun 	val = msm_readl_ctl(pctrl, g);
509*4882a593Smuzhiyun 	val &= ~BIT(g->oe_bit);
510*4882a593Smuzhiyun 	msm_writel_ctl(val, pctrl, g);
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&pctrl->lock, flags);
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun 	return 0;
515*4882a593Smuzhiyun }
516*4882a593Smuzhiyun 
msm_gpio_direction_output(struct gpio_chip * chip,unsigned offset,int value)517*4882a593Smuzhiyun static int msm_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
518*4882a593Smuzhiyun {
519*4882a593Smuzhiyun 	const struct msm_pingroup *g;
520*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
521*4882a593Smuzhiyun 	unsigned long flags;
522*4882a593Smuzhiyun 	u32 val;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	g = &pctrl->soc->groups[offset];
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&pctrl->lock, flags);
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun 	val = msm_readl_io(pctrl, g);
529*4882a593Smuzhiyun 	if (value)
530*4882a593Smuzhiyun 		val |= BIT(g->out_bit);
531*4882a593Smuzhiyun 	else
532*4882a593Smuzhiyun 		val &= ~BIT(g->out_bit);
533*4882a593Smuzhiyun 	msm_writel_io(val, pctrl, g);
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun 	val = msm_readl_ctl(pctrl, g);
536*4882a593Smuzhiyun 	val |= BIT(g->oe_bit);
537*4882a593Smuzhiyun 	msm_writel_ctl(val, pctrl, g);
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&pctrl->lock, flags);
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun 	return 0;
542*4882a593Smuzhiyun }
543*4882a593Smuzhiyun 
msm_gpio_get_direction(struct gpio_chip * chip,unsigned int offset)544*4882a593Smuzhiyun static int msm_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
547*4882a593Smuzhiyun 	const struct msm_pingroup *g;
548*4882a593Smuzhiyun 	u32 val;
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun 	g = &pctrl->soc->groups[offset];
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	val = msm_readl_ctl(pctrl, g);
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun 	return val & BIT(g->oe_bit) ? GPIO_LINE_DIRECTION_OUT :
555*4882a593Smuzhiyun 				      GPIO_LINE_DIRECTION_IN;
556*4882a593Smuzhiyun }
557*4882a593Smuzhiyun 
msm_gpio_get(struct gpio_chip * chip,unsigned offset)558*4882a593Smuzhiyun static int msm_gpio_get(struct gpio_chip *chip, unsigned offset)
559*4882a593Smuzhiyun {
560*4882a593Smuzhiyun 	const struct msm_pingroup *g;
561*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
562*4882a593Smuzhiyun 	u32 val;
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 	g = &pctrl->soc->groups[offset];
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	val = msm_readl_io(pctrl, g);
567*4882a593Smuzhiyun 	return !!(val & BIT(g->in_bit));
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun 
msm_gpio_set(struct gpio_chip * chip,unsigned offset,int value)570*4882a593Smuzhiyun static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
571*4882a593Smuzhiyun {
572*4882a593Smuzhiyun 	const struct msm_pingroup *g;
573*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
574*4882a593Smuzhiyun 	unsigned long flags;
575*4882a593Smuzhiyun 	u32 val;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	g = &pctrl->soc->groups[offset];
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&pctrl->lock, flags);
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	val = msm_readl_io(pctrl, g);
582*4882a593Smuzhiyun 	if (value)
583*4882a593Smuzhiyun 		val |= BIT(g->out_bit);
584*4882a593Smuzhiyun 	else
585*4882a593Smuzhiyun 		val &= ~BIT(g->out_bit);
586*4882a593Smuzhiyun 	msm_writel_io(val, pctrl, g);
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&pctrl->lock, flags);
589*4882a593Smuzhiyun }
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_FS
592*4882a593Smuzhiyun #include <linux/seq_file.h>
593*4882a593Smuzhiyun 
msm_gpio_dbg_show_one(struct seq_file * s,struct pinctrl_dev * pctldev,struct gpio_chip * chip,unsigned offset,unsigned gpio)594*4882a593Smuzhiyun static void msm_gpio_dbg_show_one(struct seq_file *s,
595*4882a593Smuzhiyun 				  struct pinctrl_dev *pctldev,
596*4882a593Smuzhiyun 				  struct gpio_chip *chip,
597*4882a593Smuzhiyun 				  unsigned offset,
598*4882a593Smuzhiyun 				  unsigned gpio)
599*4882a593Smuzhiyun {
600*4882a593Smuzhiyun 	const struct msm_pingroup *g;
601*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
602*4882a593Smuzhiyun 	unsigned func;
603*4882a593Smuzhiyun 	int is_out;
604*4882a593Smuzhiyun 	int drive;
605*4882a593Smuzhiyun 	int pull;
606*4882a593Smuzhiyun 	int val;
607*4882a593Smuzhiyun 	u32 ctl_reg, io_reg;
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun 	static const char * const pulls_keeper[] = {
610*4882a593Smuzhiyun 		"no pull",
611*4882a593Smuzhiyun 		"pull down",
612*4882a593Smuzhiyun 		"keeper",
613*4882a593Smuzhiyun 		"pull up"
614*4882a593Smuzhiyun 	};
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	static const char * const pulls_no_keeper[] = {
617*4882a593Smuzhiyun 		"no pull",
618*4882a593Smuzhiyun 		"pull down",
619*4882a593Smuzhiyun 		"pull up",
620*4882a593Smuzhiyun 	};
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun 	if (!gpiochip_line_is_valid(chip, offset))
623*4882a593Smuzhiyun 		return;
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun 	g = &pctrl->soc->groups[offset];
626*4882a593Smuzhiyun 	ctl_reg = msm_readl_ctl(pctrl, g);
627*4882a593Smuzhiyun 	io_reg = msm_readl_io(pctrl, g);
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 	is_out = !!(ctl_reg & BIT(g->oe_bit));
630*4882a593Smuzhiyun 	func = (ctl_reg >> g->mux_bit) & 7;
631*4882a593Smuzhiyun 	drive = (ctl_reg >> g->drv_bit) & 7;
632*4882a593Smuzhiyun 	pull = (ctl_reg >> g->pull_bit) & 3;
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun 	if (is_out)
635*4882a593Smuzhiyun 		val = !!(io_reg & BIT(g->out_bit));
636*4882a593Smuzhiyun 	else
637*4882a593Smuzhiyun 		val = !!(io_reg & BIT(g->in_bit));
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun 	seq_printf(s, " %-8s: %-3s", g->name, is_out ? "out" : "in");
640*4882a593Smuzhiyun 	seq_printf(s, " %-4s func%d", val ? "high" : "low", func);
641*4882a593Smuzhiyun 	seq_printf(s, " %dmA", msm_regval_to_drive(drive));
642*4882a593Smuzhiyun 	if (pctrl->soc->pull_no_keeper)
643*4882a593Smuzhiyun 		seq_printf(s, " %s", pulls_no_keeper[pull]);
644*4882a593Smuzhiyun 	else
645*4882a593Smuzhiyun 		seq_printf(s, " %s", pulls_keeper[pull]);
646*4882a593Smuzhiyun 	seq_puts(s, "\n");
647*4882a593Smuzhiyun }
648*4882a593Smuzhiyun 
msm_gpio_dbg_show(struct seq_file * s,struct gpio_chip * chip)649*4882a593Smuzhiyun static void msm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
650*4882a593Smuzhiyun {
651*4882a593Smuzhiyun 	unsigned gpio = chip->base;
652*4882a593Smuzhiyun 	unsigned i;
653*4882a593Smuzhiyun 
654*4882a593Smuzhiyun 	for (i = 0; i < chip->ngpio; i++, gpio++)
655*4882a593Smuzhiyun 		msm_gpio_dbg_show_one(s, NULL, chip, i, gpio);
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun #else
659*4882a593Smuzhiyun #define msm_gpio_dbg_show NULL
660*4882a593Smuzhiyun #endif
661*4882a593Smuzhiyun 
msm_gpio_init_valid_mask(struct gpio_chip * gc,unsigned long * valid_mask,unsigned int ngpios)662*4882a593Smuzhiyun static int msm_gpio_init_valid_mask(struct gpio_chip *gc,
663*4882a593Smuzhiyun 				    unsigned long *valid_mask,
664*4882a593Smuzhiyun 				    unsigned int ngpios)
665*4882a593Smuzhiyun {
666*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
667*4882a593Smuzhiyun 	int ret;
668*4882a593Smuzhiyun 	unsigned int len, i;
669*4882a593Smuzhiyun 	const int *reserved = pctrl->soc->reserved_gpios;
670*4882a593Smuzhiyun 	u16 *tmp;
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 	/* Driver provided reserved list overrides DT and ACPI */
673*4882a593Smuzhiyun 	if (reserved) {
674*4882a593Smuzhiyun 		bitmap_fill(valid_mask, ngpios);
675*4882a593Smuzhiyun 		for (i = 0; reserved[i] >= 0; i++) {
676*4882a593Smuzhiyun 			if (i >= ngpios || reserved[i] >= ngpios) {
677*4882a593Smuzhiyun 				dev_err(pctrl->dev, "invalid list of reserved GPIOs\n");
678*4882a593Smuzhiyun 				return -EINVAL;
679*4882a593Smuzhiyun 			}
680*4882a593Smuzhiyun 			clear_bit(reserved[i], valid_mask);
681*4882a593Smuzhiyun 		}
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun 		return 0;
684*4882a593Smuzhiyun 	}
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun 	/* The number of GPIOs in the ACPI tables */
687*4882a593Smuzhiyun 	len = ret = device_property_count_u16(pctrl->dev, "gpios");
688*4882a593Smuzhiyun 	if (ret < 0)
689*4882a593Smuzhiyun 		return 0;
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun 	if (ret > ngpios)
692*4882a593Smuzhiyun 		return -EINVAL;
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 	tmp = kmalloc_array(len, sizeof(*tmp), GFP_KERNEL);
695*4882a593Smuzhiyun 	if (!tmp)
696*4882a593Smuzhiyun 		return -ENOMEM;
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 	ret = device_property_read_u16_array(pctrl->dev, "gpios", tmp, len);
699*4882a593Smuzhiyun 	if (ret < 0) {
700*4882a593Smuzhiyun 		dev_err(pctrl->dev, "could not read list of GPIOs\n");
701*4882a593Smuzhiyun 		goto out;
702*4882a593Smuzhiyun 	}
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	bitmap_zero(valid_mask, ngpios);
705*4882a593Smuzhiyun 	for (i = 0; i < len; i++)
706*4882a593Smuzhiyun 		set_bit(tmp[i], valid_mask);
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun out:
709*4882a593Smuzhiyun 	kfree(tmp);
710*4882a593Smuzhiyun 	return ret;
711*4882a593Smuzhiyun }
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun static const struct gpio_chip msm_gpio_template = {
714*4882a593Smuzhiyun 	.direction_input  = msm_gpio_direction_input,
715*4882a593Smuzhiyun 	.direction_output = msm_gpio_direction_output,
716*4882a593Smuzhiyun 	.get_direction    = msm_gpio_get_direction,
717*4882a593Smuzhiyun 	.get              = msm_gpio_get,
718*4882a593Smuzhiyun 	.set              = msm_gpio_set,
719*4882a593Smuzhiyun 	.request          = gpiochip_generic_request,
720*4882a593Smuzhiyun 	.free             = gpiochip_generic_free,
721*4882a593Smuzhiyun 	.dbg_show         = msm_gpio_dbg_show,
722*4882a593Smuzhiyun };
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun /* For dual-edge interrupts in software, since some hardware has no
725*4882a593Smuzhiyun  * such support:
726*4882a593Smuzhiyun  *
727*4882a593Smuzhiyun  * At appropriate moments, this function may be called to flip the polarity
728*4882a593Smuzhiyun  * settings of both-edge irq lines to try and catch the next edge.
729*4882a593Smuzhiyun  *
730*4882a593Smuzhiyun  * The attempt is considered successful if:
731*4882a593Smuzhiyun  * - the status bit goes high, indicating that an edge was caught, or
732*4882a593Smuzhiyun  * - the input value of the gpio doesn't change during the attempt.
733*4882a593Smuzhiyun  * If the value changes twice during the process, that would cause the first
734*4882a593Smuzhiyun  * test to fail but would force the second, as two opposite
735*4882a593Smuzhiyun  * transitions would cause a detection no matter the polarity setting.
736*4882a593Smuzhiyun  *
737*4882a593Smuzhiyun  * The do-loop tries to sledge-hammer closed the timing hole between
738*4882a593Smuzhiyun  * the initial value-read and the polarity-write - if the line value changes
739*4882a593Smuzhiyun  * during that window, an interrupt is lost, the new polarity setting is
740*4882a593Smuzhiyun  * incorrect, and the first success test will fail, causing a retry.
741*4882a593Smuzhiyun  *
742*4882a593Smuzhiyun  * Algorithm comes from Google's msmgpio driver.
743*4882a593Smuzhiyun  */
msm_gpio_update_dual_edge_pos(struct msm_pinctrl * pctrl,const struct msm_pingroup * g,struct irq_data * d)744*4882a593Smuzhiyun static void msm_gpio_update_dual_edge_pos(struct msm_pinctrl *pctrl,
745*4882a593Smuzhiyun 					  const struct msm_pingroup *g,
746*4882a593Smuzhiyun 					  struct irq_data *d)
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun 	int loop_limit = 100;
749*4882a593Smuzhiyun 	unsigned val, val2, intstat;
750*4882a593Smuzhiyun 	unsigned pol;
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	do {
753*4882a593Smuzhiyun 		val = msm_readl_io(pctrl, g) & BIT(g->in_bit);
754*4882a593Smuzhiyun 
755*4882a593Smuzhiyun 		pol = msm_readl_intr_cfg(pctrl, g);
756*4882a593Smuzhiyun 		pol ^= BIT(g->intr_polarity_bit);
757*4882a593Smuzhiyun 		msm_writel_intr_cfg(pol, pctrl, g);
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun 		val2 = msm_readl_io(pctrl, g) & BIT(g->in_bit);
760*4882a593Smuzhiyun 		intstat = msm_readl_intr_status(pctrl, g);
761*4882a593Smuzhiyun 		if (intstat || (val == val2))
762*4882a593Smuzhiyun 			return;
763*4882a593Smuzhiyun 	} while (loop_limit-- > 0);
764*4882a593Smuzhiyun 	dev_err(pctrl->dev, "dual-edge irq failed to stabilize, %#08x != %#08x\n",
765*4882a593Smuzhiyun 		val, val2);
766*4882a593Smuzhiyun }
767*4882a593Smuzhiyun 
msm_gpio_irq_mask(struct irq_data * d)768*4882a593Smuzhiyun static void msm_gpio_irq_mask(struct irq_data *d)
769*4882a593Smuzhiyun {
770*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
771*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
772*4882a593Smuzhiyun 	const struct msm_pingroup *g;
773*4882a593Smuzhiyun 	unsigned long flags;
774*4882a593Smuzhiyun 	u32 val;
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun 	if (d->parent_data)
777*4882a593Smuzhiyun 		irq_chip_mask_parent(d);
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 	if (test_bit(d->hwirq, pctrl->skip_wake_irqs))
780*4882a593Smuzhiyun 		return;
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun 	g = &pctrl->soc->groups[d->hwirq];
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&pctrl->lock, flags);
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 	val = msm_readl_intr_cfg(pctrl, g);
787*4882a593Smuzhiyun 	/*
788*4882a593Smuzhiyun 	 * There are two bits that control interrupt forwarding to the CPU. The
789*4882a593Smuzhiyun 	 * RAW_STATUS_EN bit causes the level or edge sensed on the line to be
790*4882a593Smuzhiyun 	 * latched into the interrupt status register when the hardware detects
791*4882a593Smuzhiyun 	 * an irq that it's configured for (either edge for edge type or level
792*4882a593Smuzhiyun 	 * for level type irq). The 'non-raw' status enable bit causes the
793*4882a593Smuzhiyun 	 * hardware to assert the summary interrupt to the CPU if the latched
794*4882a593Smuzhiyun 	 * status bit is set. There's a bug though, the edge detection logic
795*4882a593Smuzhiyun 	 * seems to have a problem where toggling the RAW_STATUS_EN bit may
796*4882a593Smuzhiyun 	 * cause the status bit to latch spuriously when there isn't any edge
797*4882a593Smuzhiyun 	 * so we can't touch that bit for edge type irqs and we have to keep
798*4882a593Smuzhiyun 	 * the bit set anyway so that edges are latched while the line is masked.
799*4882a593Smuzhiyun 	 *
800*4882a593Smuzhiyun 	 * To make matters more complicated, leaving the RAW_STATUS_EN bit
801*4882a593Smuzhiyun 	 * enabled all the time causes level interrupts to re-latch into the
802*4882a593Smuzhiyun 	 * status register because the level is still present on the line after
803*4882a593Smuzhiyun 	 * we ack it. We clear the raw status enable bit during mask here and
804*4882a593Smuzhiyun 	 * set the bit on unmask so the interrupt can't latch into the hardware
805*4882a593Smuzhiyun 	 * while it's masked.
806*4882a593Smuzhiyun 	 */
807*4882a593Smuzhiyun 	if (irqd_get_trigger_type(d) & IRQ_TYPE_LEVEL_MASK)
808*4882a593Smuzhiyun 		val &= ~BIT(g->intr_raw_status_bit);
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun 	val &= ~BIT(g->intr_enable_bit);
811*4882a593Smuzhiyun 	msm_writel_intr_cfg(val, pctrl, g);
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun 	clear_bit(d->hwirq, pctrl->enabled_irqs);
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&pctrl->lock, flags);
816*4882a593Smuzhiyun }
817*4882a593Smuzhiyun 
msm_gpio_irq_unmask(struct irq_data * d)818*4882a593Smuzhiyun static void msm_gpio_irq_unmask(struct irq_data *d)
819*4882a593Smuzhiyun {
820*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
821*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
822*4882a593Smuzhiyun 	const struct msm_pingroup *g;
823*4882a593Smuzhiyun 	unsigned long flags;
824*4882a593Smuzhiyun 	u32 val;
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun 	if (d->parent_data)
827*4882a593Smuzhiyun 		irq_chip_unmask_parent(d);
828*4882a593Smuzhiyun 
829*4882a593Smuzhiyun 	if (test_bit(d->hwirq, pctrl->skip_wake_irqs))
830*4882a593Smuzhiyun 		return;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	g = &pctrl->soc->groups[d->hwirq];
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&pctrl->lock, flags);
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun 	val = msm_readl_intr_cfg(pctrl, g);
837*4882a593Smuzhiyun 	val |= BIT(g->intr_raw_status_bit);
838*4882a593Smuzhiyun 	val |= BIT(g->intr_enable_bit);
839*4882a593Smuzhiyun 	msm_writel_intr_cfg(val, pctrl, g);
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun 	set_bit(d->hwirq, pctrl->enabled_irqs);
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&pctrl->lock, flags);
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun 
msm_gpio_irq_enable(struct irq_data * d)846*4882a593Smuzhiyun static void msm_gpio_irq_enable(struct irq_data *d)
847*4882a593Smuzhiyun {
848*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
849*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 	if (d->parent_data)
852*4882a593Smuzhiyun 		irq_chip_enable_parent(d);
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun 	if (!test_bit(d->hwirq, pctrl->skip_wake_irqs))
855*4882a593Smuzhiyun 		msm_gpio_irq_unmask(d);
856*4882a593Smuzhiyun }
857*4882a593Smuzhiyun 
msm_gpio_irq_disable(struct irq_data * d)858*4882a593Smuzhiyun static void msm_gpio_irq_disable(struct irq_data *d)
859*4882a593Smuzhiyun {
860*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
861*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun 	if (d->parent_data)
864*4882a593Smuzhiyun 		irq_chip_disable_parent(d);
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun 	if (!test_bit(d->hwirq, pctrl->skip_wake_irqs))
867*4882a593Smuzhiyun 		msm_gpio_irq_mask(d);
868*4882a593Smuzhiyun }
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun /**
871*4882a593Smuzhiyun  * msm_gpio_update_dual_edge_parent() - Prime next edge for IRQs handled by parent.
872*4882a593Smuzhiyun  * @d: The irq dta.
873*4882a593Smuzhiyun  *
874*4882a593Smuzhiyun  * This is much like msm_gpio_update_dual_edge_pos() but for IRQs that are
875*4882a593Smuzhiyun  * normally handled by the parent irqchip.  The logic here is slightly
876*4882a593Smuzhiyun  * different due to what's easy to do with our parent, but in principle it's
877*4882a593Smuzhiyun  * the same.
878*4882a593Smuzhiyun  */
msm_gpio_update_dual_edge_parent(struct irq_data * d)879*4882a593Smuzhiyun static void msm_gpio_update_dual_edge_parent(struct irq_data *d)
880*4882a593Smuzhiyun {
881*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
882*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
883*4882a593Smuzhiyun 	const struct msm_pingroup *g = &pctrl->soc->groups[d->hwirq];
884*4882a593Smuzhiyun 	int loop_limit = 100;
885*4882a593Smuzhiyun 	unsigned int val;
886*4882a593Smuzhiyun 	unsigned int type;
887*4882a593Smuzhiyun 
888*4882a593Smuzhiyun 	/* Read the value and make a guess about what edge we need to catch */
889*4882a593Smuzhiyun 	val = msm_readl_io(pctrl, g) & BIT(g->in_bit);
890*4882a593Smuzhiyun 	type = val ? IRQ_TYPE_EDGE_FALLING : IRQ_TYPE_EDGE_RISING;
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun 	do {
893*4882a593Smuzhiyun 		/* Set the parent to catch the next edge */
894*4882a593Smuzhiyun 		irq_chip_set_type_parent(d, type);
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun 		/*
897*4882a593Smuzhiyun 		 * Possibly the line changed between when we last read "val"
898*4882a593Smuzhiyun 		 * (and decided what edge we needed) and when set the edge.
899*4882a593Smuzhiyun 		 * If the value didn't change (or changed and then changed
900*4882a593Smuzhiyun 		 * back) then we're done.
901*4882a593Smuzhiyun 		 */
902*4882a593Smuzhiyun 		val = msm_readl_io(pctrl, g) & BIT(g->in_bit);
903*4882a593Smuzhiyun 		if (type == IRQ_TYPE_EDGE_RISING) {
904*4882a593Smuzhiyun 			if (!val)
905*4882a593Smuzhiyun 				return;
906*4882a593Smuzhiyun 			type = IRQ_TYPE_EDGE_FALLING;
907*4882a593Smuzhiyun 		} else if (type == IRQ_TYPE_EDGE_FALLING) {
908*4882a593Smuzhiyun 			if (val)
909*4882a593Smuzhiyun 				return;
910*4882a593Smuzhiyun 			type = IRQ_TYPE_EDGE_RISING;
911*4882a593Smuzhiyun 		}
912*4882a593Smuzhiyun 	} while (loop_limit-- > 0);
913*4882a593Smuzhiyun 	dev_warn_once(pctrl->dev, "dual-edge irq failed to stabilize\n");
914*4882a593Smuzhiyun }
915*4882a593Smuzhiyun 
msm_gpio_irq_ack(struct irq_data * d)916*4882a593Smuzhiyun static void msm_gpio_irq_ack(struct irq_data *d)
917*4882a593Smuzhiyun {
918*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
919*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
920*4882a593Smuzhiyun 	const struct msm_pingroup *g;
921*4882a593Smuzhiyun 	unsigned long flags;
922*4882a593Smuzhiyun 
923*4882a593Smuzhiyun 	if (test_bit(d->hwirq, pctrl->skip_wake_irqs)) {
924*4882a593Smuzhiyun 		if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
925*4882a593Smuzhiyun 			msm_gpio_update_dual_edge_parent(d);
926*4882a593Smuzhiyun 		return;
927*4882a593Smuzhiyun 	}
928*4882a593Smuzhiyun 
929*4882a593Smuzhiyun 	g = &pctrl->soc->groups[d->hwirq];
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&pctrl->lock, flags);
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun 	msm_ack_intr_status(pctrl, g);
934*4882a593Smuzhiyun 
935*4882a593Smuzhiyun 	if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
936*4882a593Smuzhiyun 		msm_gpio_update_dual_edge_pos(pctrl, g, d);
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&pctrl->lock, flags);
939*4882a593Smuzhiyun }
940*4882a593Smuzhiyun 
msm_gpio_needs_dual_edge_parent_workaround(struct irq_data * d,unsigned int type)941*4882a593Smuzhiyun static bool msm_gpio_needs_dual_edge_parent_workaround(struct irq_data *d,
942*4882a593Smuzhiyun 						       unsigned int type)
943*4882a593Smuzhiyun {
944*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
945*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun 	return type == IRQ_TYPE_EDGE_BOTH &&
948*4882a593Smuzhiyun 	       pctrl->soc->wakeirq_dual_edge_errata && d->parent_data &&
949*4882a593Smuzhiyun 	       test_bit(d->hwirq, pctrl->skip_wake_irqs);
950*4882a593Smuzhiyun }
951*4882a593Smuzhiyun 
msm_gpio_irq_set_type(struct irq_data * d,unsigned int type)952*4882a593Smuzhiyun static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
953*4882a593Smuzhiyun {
954*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
955*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
956*4882a593Smuzhiyun 	const struct msm_pingroup *g;
957*4882a593Smuzhiyun 	unsigned long flags;
958*4882a593Smuzhiyun 	bool was_enabled;
959*4882a593Smuzhiyun 	u32 val;
960*4882a593Smuzhiyun 
961*4882a593Smuzhiyun 	if (msm_gpio_needs_dual_edge_parent_workaround(d, type)) {
962*4882a593Smuzhiyun 		set_bit(d->hwirq, pctrl->dual_edge_irqs);
963*4882a593Smuzhiyun 		irq_set_handler_locked(d, handle_fasteoi_ack_irq);
964*4882a593Smuzhiyun 		msm_gpio_update_dual_edge_parent(d);
965*4882a593Smuzhiyun 		return 0;
966*4882a593Smuzhiyun 	}
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun 	if (d->parent_data)
969*4882a593Smuzhiyun 		irq_chip_set_type_parent(d, type);
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	if (test_bit(d->hwirq, pctrl->skip_wake_irqs)) {
972*4882a593Smuzhiyun 		clear_bit(d->hwirq, pctrl->dual_edge_irqs);
973*4882a593Smuzhiyun 		irq_set_handler_locked(d, handle_fasteoi_irq);
974*4882a593Smuzhiyun 		return 0;
975*4882a593Smuzhiyun 	}
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun 	g = &pctrl->soc->groups[d->hwirq];
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&pctrl->lock, flags);
980*4882a593Smuzhiyun 
981*4882a593Smuzhiyun 	/*
982*4882a593Smuzhiyun 	 * For hw without possibility of detecting both edges
983*4882a593Smuzhiyun 	 */
984*4882a593Smuzhiyun 	if (g->intr_detection_width == 1 && type == IRQ_TYPE_EDGE_BOTH)
985*4882a593Smuzhiyun 		set_bit(d->hwirq, pctrl->dual_edge_irqs);
986*4882a593Smuzhiyun 	else
987*4882a593Smuzhiyun 		clear_bit(d->hwirq, pctrl->dual_edge_irqs);
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun 	/* Route interrupts to application cpu.
990*4882a593Smuzhiyun 	 * With intr_target_use_scm interrupts are routed to
991*4882a593Smuzhiyun 	 * application cpu using scm calls.
992*4882a593Smuzhiyun 	 */
993*4882a593Smuzhiyun 	if (pctrl->intr_target_use_scm) {
994*4882a593Smuzhiyun 		u32 addr = pctrl->phys_base[0] + g->intr_target_reg;
995*4882a593Smuzhiyun 		int ret;
996*4882a593Smuzhiyun 
997*4882a593Smuzhiyun 		qcom_scm_io_readl(addr, &val);
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun 		val &= ~(7 << g->intr_target_bit);
1000*4882a593Smuzhiyun 		val |= g->intr_target_kpss_val << g->intr_target_bit;
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun 		ret = qcom_scm_io_writel(addr, val);
1003*4882a593Smuzhiyun 		if (ret)
1004*4882a593Smuzhiyun 			dev_err(pctrl->dev,
1005*4882a593Smuzhiyun 				"Failed routing %lu interrupt to Apps proc",
1006*4882a593Smuzhiyun 				d->hwirq);
1007*4882a593Smuzhiyun 	} else {
1008*4882a593Smuzhiyun 		val = msm_readl_intr_target(pctrl, g);
1009*4882a593Smuzhiyun 		val &= ~(7 << g->intr_target_bit);
1010*4882a593Smuzhiyun 		val |= g->intr_target_kpss_val << g->intr_target_bit;
1011*4882a593Smuzhiyun 		msm_writel_intr_target(val, pctrl, g);
1012*4882a593Smuzhiyun 	}
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun 	/* Update configuration for gpio.
1015*4882a593Smuzhiyun 	 * RAW_STATUS_EN is left on for all gpio irqs. Due to the
1016*4882a593Smuzhiyun 	 * internal circuitry of TLMM, toggling the RAW_STATUS
1017*4882a593Smuzhiyun 	 * could cause the INTR_STATUS to be set for EDGE interrupts.
1018*4882a593Smuzhiyun 	 */
1019*4882a593Smuzhiyun 	val = msm_readl_intr_cfg(pctrl, g);
1020*4882a593Smuzhiyun 	was_enabled = val & BIT(g->intr_raw_status_bit);
1021*4882a593Smuzhiyun 	val |= BIT(g->intr_raw_status_bit);
1022*4882a593Smuzhiyun 	if (g->intr_detection_width == 2) {
1023*4882a593Smuzhiyun 		val &= ~(3 << g->intr_detection_bit);
1024*4882a593Smuzhiyun 		val &= ~(1 << g->intr_polarity_bit);
1025*4882a593Smuzhiyun 		switch (type) {
1026*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_RISING:
1027*4882a593Smuzhiyun 			val |= 1 << g->intr_detection_bit;
1028*4882a593Smuzhiyun 			val |= BIT(g->intr_polarity_bit);
1029*4882a593Smuzhiyun 			break;
1030*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_FALLING:
1031*4882a593Smuzhiyun 			val |= 2 << g->intr_detection_bit;
1032*4882a593Smuzhiyun 			val |= BIT(g->intr_polarity_bit);
1033*4882a593Smuzhiyun 			break;
1034*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_BOTH:
1035*4882a593Smuzhiyun 			val |= 3 << g->intr_detection_bit;
1036*4882a593Smuzhiyun 			val |= BIT(g->intr_polarity_bit);
1037*4882a593Smuzhiyun 			break;
1038*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_LOW:
1039*4882a593Smuzhiyun 			break;
1040*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_HIGH:
1041*4882a593Smuzhiyun 			val |= BIT(g->intr_polarity_bit);
1042*4882a593Smuzhiyun 			break;
1043*4882a593Smuzhiyun 		}
1044*4882a593Smuzhiyun 	} else if (g->intr_detection_width == 1) {
1045*4882a593Smuzhiyun 		val &= ~(1 << g->intr_detection_bit);
1046*4882a593Smuzhiyun 		val &= ~(1 << g->intr_polarity_bit);
1047*4882a593Smuzhiyun 		switch (type) {
1048*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_RISING:
1049*4882a593Smuzhiyun 			val |= BIT(g->intr_detection_bit);
1050*4882a593Smuzhiyun 			val |= BIT(g->intr_polarity_bit);
1051*4882a593Smuzhiyun 			break;
1052*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_FALLING:
1053*4882a593Smuzhiyun 			val |= BIT(g->intr_detection_bit);
1054*4882a593Smuzhiyun 			break;
1055*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_BOTH:
1056*4882a593Smuzhiyun 			val |= BIT(g->intr_detection_bit);
1057*4882a593Smuzhiyun 			val |= BIT(g->intr_polarity_bit);
1058*4882a593Smuzhiyun 			break;
1059*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_LOW:
1060*4882a593Smuzhiyun 			break;
1061*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_HIGH:
1062*4882a593Smuzhiyun 			val |= BIT(g->intr_polarity_bit);
1063*4882a593Smuzhiyun 			break;
1064*4882a593Smuzhiyun 		}
1065*4882a593Smuzhiyun 	} else {
1066*4882a593Smuzhiyun 		BUG();
1067*4882a593Smuzhiyun 	}
1068*4882a593Smuzhiyun 	msm_writel_intr_cfg(val, pctrl, g);
1069*4882a593Smuzhiyun 
1070*4882a593Smuzhiyun 	/*
1071*4882a593Smuzhiyun 	 * The first time we set RAW_STATUS_EN it could trigger an interrupt.
1072*4882a593Smuzhiyun 	 * Clear the interrupt.  This is safe because we have
1073*4882a593Smuzhiyun 	 * IRQCHIP_SET_TYPE_MASKED.
1074*4882a593Smuzhiyun 	 */
1075*4882a593Smuzhiyun 	if (!was_enabled)
1076*4882a593Smuzhiyun 		msm_ack_intr_status(pctrl, g);
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun 	if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
1079*4882a593Smuzhiyun 		msm_gpio_update_dual_edge_pos(pctrl, g, d);
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&pctrl->lock, flags);
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun 	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
1084*4882a593Smuzhiyun 		irq_set_handler_locked(d, handle_level_irq);
1085*4882a593Smuzhiyun 	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
1086*4882a593Smuzhiyun 		irq_set_handler_locked(d, handle_edge_irq);
1087*4882a593Smuzhiyun 
1088*4882a593Smuzhiyun 	return 0;
1089*4882a593Smuzhiyun }
1090*4882a593Smuzhiyun 
msm_gpio_irq_set_wake(struct irq_data * d,unsigned int on)1091*4882a593Smuzhiyun static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
1092*4882a593Smuzhiyun {
1093*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1094*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
1095*4882a593Smuzhiyun 
1096*4882a593Smuzhiyun 	/*
1097*4882a593Smuzhiyun 	 * While they may not wake up when the TLMM is powered off,
1098*4882a593Smuzhiyun 	 * some GPIOs would like to wakeup the system from suspend
1099*4882a593Smuzhiyun 	 * when TLMM is powered on. To allow that, enable the GPIO
1100*4882a593Smuzhiyun 	 * summary line to be wakeup capable at GIC.
1101*4882a593Smuzhiyun 	 */
1102*4882a593Smuzhiyun 	if (d->parent_data && test_bit(d->hwirq, pctrl->skip_wake_irqs))
1103*4882a593Smuzhiyun 		return irq_chip_set_wake_parent(d, on);
1104*4882a593Smuzhiyun 
1105*4882a593Smuzhiyun 	return irq_set_irq_wake(pctrl->irq, on);
1106*4882a593Smuzhiyun }
1107*4882a593Smuzhiyun 
msm_gpio_irq_reqres(struct irq_data * d)1108*4882a593Smuzhiyun static int msm_gpio_irq_reqres(struct irq_data *d)
1109*4882a593Smuzhiyun {
1110*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1111*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
1112*4882a593Smuzhiyun 	int ret;
1113*4882a593Smuzhiyun 
1114*4882a593Smuzhiyun 	if (!try_module_get(gc->owner))
1115*4882a593Smuzhiyun 		return -ENODEV;
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun 	ret = msm_pinmux_request_gpio(pctrl->pctrl, NULL, d->hwirq);
1118*4882a593Smuzhiyun 	if (ret)
1119*4882a593Smuzhiyun 		goto out;
1120*4882a593Smuzhiyun 	msm_gpio_direction_input(gc, d->hwirq);
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun 	if (gpiochip_lock_as_irq(gc, d->hwirq)) {
1123*4882a593Smuzhiyun 		dev_err(gc->parent,
1124*4882a593Smuzhiyun 			"unable to lock HW IRQ %lu for IRQ\n",
1125*4882a593Smuzhiyun 			d->hwirq);
1126*4882a593Smuzhiyun 		ret = -EINVAL;
1127*4882a593Smuzhiyun 		goto out;
1128*4882a593Smuzhiyun 	}
1129*4882a593Smuzhiyun 
1130*4882a593Smuzhiyun 	/*
1131*4882a593Smuzhiyun 	 * The disable / clear-enable workaround we do in msm_pinmux_set_mux()
1132*4882a593Smuzhiyun 	 * only works if disable is not lazy since we only clear any bogus
1133*4882a593Smuzhiyun 	 * interrupt in hardware. Explicitly mark the interrupt as UNLAZY.
1134*4882a593Smuzhiyun 	 */
1135*4882a593Smuzhiyun 	irq_set_status_flags(d->irq, IRQ_DISABLE_UNLAZY);
1136*4882a593Smuzhiyun 
1137*4882a593Smuzhiyun 	return 0;
1138*4882a593Smuzhiyun out:
1139*4882a593Smuzhiyun 	module_put(gc->owner);
1140*4882a593Smuzhiyun 	return ret;
1141*4882a593Smuzhiyun }
1142*4882a593Smuzhiyun 
msm_gpio_irq_relres(struct irq_data * d)1143*4882a593Smuzhiyun static void msm_gpio_irq_relres(struct irq_data *d)
1144*4882a593Smuzhiyun {
1145*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1146*4882a593Smuzhiyun 
1147*4882a593Smuzhiyun 	gpiochip_unlock_as_irq(gc, d->hwirq);
1148*4882a593Smuzhiyun 	module_put(gc->owner);
1149*4882a593Smuzhiyun }
1150*4882a593Smuzhiyun 
msm_gpio_irq_set_affinity(struct irq_data * d,const struct cpumask * dest,bool force)1151*4882a593Smuzhiyun static int msm_gpio_irq_set_affinity(struct irq_data *d,
1152*4882a593Smuzhiyun 				const struct cpumask *dest, bool force)
1153*4882a593Smuzhiyun {
1154*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1155*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun 	if (d->parent_data && test_bit(d->hwirq, pctrl->skip_wake_irqs))
1158*4882a593Smuzhiyun 		return irq_chip_set_affinity_parent(d, dest, force);
1159*4882a593Smuzhiyun 
1160*4882a593Smuzhiyun 	return 0;
1161*4882a593Smuzhiyun }
1162*4882a593Smuzhiyun 
msm_gpio_irq_set_vcpu_affinity(struct irq_data * d,void * vcpu_info)1163*4882a593Smuzhiyun static int msm_gpio_irq_set_vcpu_affinity(struct irq_data *d, void *vcpu_info)
1164*4882a593Smuzhiyun {
1165*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1166*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun 	if (d->parent_data && test_bit(d->hwirq, pctrl->skip_wake_irqs))
1169*4882a593Smuzhiyun 		return irq_chip_set_vcpu_affinity_parent(d, vcpu_info);
1170*4882a593Smuzhiyun 
1171*4882a593Smuzhiyun 	return 0;
1172*4882a593Smuzhiyun }
1173*4882a593Smuzhiyun 
msm_gpio_irq_handler(struct irq_desc * desc)1174*4882a593Smuzhiyun static void msm_gpio_irq_handler(struct irq_desc *desc)
1175*4882a593Smuzhiyun {
1176*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_desc_get_handler_data(desc);
1177*4882a593Smuzhiyun 	const struct msm_pingroup *g;
1178*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
1179*4882a593Smuzhiyun 	struct irq_chip *chip = irq_desc_get_chip(desc);
1180*4882a593Smuzhiyun 	int irq_pin;
1181*4882a593Smuzhiyun 	int handled = 0;
1182*4882a593Smuzhiyun 	u32 val;
1183*4882a593Smuzhiyun 	int i;
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun 	chained_irq_enter(chip, desc);
1186*4882a593Smuzhiyun 
1187*4882a593Smuzhiyun 	/*
1188*4882a593Smuzhiyun 	 * Each pin has it's own IRQ status register, so use
1189*4882a593Smuzhiyun 	 * enabled_irq bitmap to limit the number of reads.
1190*4882a593Smuzhiyun 	 */
1191*4882a593Smuzhiyun 	for_each_set_bit(i, pctrl->enabled_irqs, pctrl->chip.ngpio) {
1192*4882a593Smuzhiyun 		g = &pctrl->soc->groups[i];
1193*4882a593Smuzhiyun 		val = msm_readl_intr_status(pctrl, g);
1194*4882a593Smuzhiyun 		if (val & BIT(g->intr_status_bit)) {
1195*4882a593Smuzhiyun 			irq_pin = irq_find_mapping(gc->irq.domain, i);
1196*4882a593Smuzhiyun 			generic_handle_irq(irq_pin);
1197*4882a593Smuzhiyun 			handled++;
1198*4882a593Smuzhiyun 		}
1199*4882a593Smuzhiyun 	}
1200*4882a593Smuzhiyun 
1201*4882a593Smuzhiyun 	/* No interrupts were flagged */
1202*4882a593Smuzhiyun 	if (handled == 0)
1203*4882a593Smuzhiyun 		handle_bad_irq(desc);
1204*4882a593Smuzhiyun 
1205*4882a593Smuzhiyun 	chained_irq_exit(chip, desc);
1206*4882a593Smuzhiyun }
1207*4882a593Smuzhiyun 
msm_gpio_wakeirq(struct gpio_chip * gc,unsigned int child,unsigned int child_type,unsigned int * parent,unsigned int * parent_type)1208*4882a593Smuzhiyun static int msm_gpio_wakeirq(struct gpio_chip *gc,
1209*4882a593Smuzhiyun 			    unsigned int child,
1210*4882a593Smuzhiyun 			    unsigned int child_type,
1211*4882a593Smuzhiyun 			    unsigned int *parent,
1212*4882a593Smuzhiyun 			    unsigned int *parent_type)
1213*4882a593Smuzhiyun {
1214*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
1215*4882a593Smuzhiyun 	const struct msm_gpio_wakeirq_map *map;
1216*4882a593Smuzhiyun 	int i;
1217*4882a593Smuzhiyun 
1218*4882a593Smuzhiyun 	*parent = GPIO_NO_WAKE_IRQ;
1219*4882a593Smuzhiyun 	*parent_type = IRQ_TYPE_EDGE_RISING;
1220*4882a593Smuzhiyun 
1221*4882a593Smuzhiyun 	for (i = 0; i < pctrl->soc->nwakeirq_map; i++) {
1222*4882a593Smuzhiyun 		map = &pctrl->soc->wakeirq_map[i];
1223*4882a593Smuzhiyun 		if (map->gpio == child) {
1224*4882a593Smuzhiyun 			*parent = map->wakeirq;
1225*4882a593Smuzhiyun 			break;
1226*4882a593Smuzhiyun 		}
1227*4882a593Smuzhiyun 	}
1228*4882a593Smuzhiyun 
1229*4882a593Smuzhiyun 	return 0;
1230*4882a593Smuzhiyun }
1231*4882a593Smuzhiyun 
msm_gpio_needs_valid_mask(struct msm_pinctrl * pctrl)1232*4882a593Smuzhiyun static bool msm_gpio_needs_valid_mask(struct msm_pinctrl *pctrl)
1233*4882a593Smuzhiyun {
1234*4882a593Smuzhiyun 	if (pctrl->soc->reserved_gpios)
1235*4882a593Smuzhiyun 		return true;
1236*4882a593Smuzhiyun 
1237*4882a593Smuzhiyun 	return device_property_count_u16(pctrl->dev, "gpios") > 0;
1238*4882a593Smuzhiyun }
1239*4882a593Smuzhiyun 
msm_gpio_init(struct msm_pinctrl * pctrl)1240*4882a593Smuzhiyun static int msm_gpio_init(struct msm_pinctrl *pctrl)
1241*4882a593Smuzhiyun {
1242*4882a593Smuzhiyun 	struct gpio_chip *chip;
1243*4882a593Smuzhiyun 	struct gpio_irq_chip *girq;
1244*4882a593Smuzhiyun 	int i, ret;
1245*4882a593Smuzhiyun 	unsigned gpio, ngpio = pctrl->soc->ngpios;
1246*4882a593Smuzhiyun 	struct device_node *np;
1247*4882a593Smuzhiyun 	bool skip;
1248*4882a593Smuzhiyun 
1249*4882a593Smuzhiyun 	if (WARN_ON(ngpio > MAX_NR_GPIO))
1250*4882a593Smuzhiyun 		return -EINVAL;
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun 	chip = &pctrl->chip;
1253*4882a593Smuzhiyun 	chip->base = -1;
1254*4882a593Smuzhiyun 	chip->ngpio = ngpio;
1255*4882a593Smuzhiyun 	chip->label = dev_name(pctrl->dev);
1256*4882a593Smuzhiyun 	chip->parent = pctrl->dev;
1257*4882a593Smuzhiyun 	chip->owner = THIS_MODULE;
1258*4882a593Smuzhiyun 	chip->of_node = pctrl->dev->of_node;
1259*4882a593Smuzhiyun 	if (msm_gpio_needs_valid_mask(pctrl))
1260*4882a593Smuzhiyun 		chip->init_valid_mask = msm_gpio_init_valid_mask;
1261*4882a593Smuzhiyun 
1262*4882a593Smuzhiyun 	pctrl->irq_chip.name = "msmgpio";
1263*4882a593Smuzhiyun 	pctrl->irq_chip.irq_enable = msm_gpio_irq_enable;
1264*4882a593Smuzhiyun 	pctrl->irq_chip.irq_disable = msm_gpio_irq_disable;
1265*4882a593Smuzhiyun 	pctrl->irq_chip.irq_mask = msm_gpio_irq_mask;
1266*4882a593Smuzhiyun 	pctrl->irq_chip.irq_unmask = msm_gpio_irq_unmask;
1267*4882a593Smuzhiyun 	pctrl->irq_chip.irq_ack = msm_gpio_irq_ack;
1268*4882a593Smuzhiyun 	pctrl->irq_chip.irq_set_type = msm_gpio_irq_set_type;
1269*4882a593Smuzhiyun 	pctrl->irq_chip.irq_set_wake = msm_gpio_irq_set_wake;
1270*4882a593Smuzhiyun 	pctrl->irq_chip.irq_request_resources = msm_gpio_irq_reqres;
1271*4882a593Smuzhiyun 	pctrl->irq_chip.irq_release_resources = msm_gpio_irq_relres;
1272*4882a593Smuzhiyun 	pctrl->irq_chip.irq_set_affinity = msm_gpio_irq_set_affinity;
1273*4882a593Smuzhiyun 	pctrl->irq_chip.irq_set_vcpu_affinity = msm_gpio_irq_set_vcpu_affinity;
1274*4882a593Smuzhiyun 	pctrl->irq_chip.flags = IRQCHIP_MASK_ON_SUSPEND |
1275*4882a593Smuzhiyun 				IRQCHIP_SET_TYPE_MASKED |
1276*4882a593Smuzhiyun 				IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND;
1277*4882a593Smuzhiyun 
1278*4882a593Smuzhiyun 	np = of_parse_phandle(pctrl->dev->of_node, "wakeup-parent", 0);
1279*4882a593Smuzhiyun 	if (np) {
1280*4882a593Smuzhiyun 		chip->irq.parent_domain = irq_find_matching_host(np,
1281*4882a593Smuzhiyun 						 DOMAIN_BUS_WAKEUP);
1282*4882a593Smuzhiyun 		of_node_put(np);
1283*4882a593Smuzhiyun 		if (!chip->irq.parent_domain)
1284*4882a593Smuzhiyun 			return -EPROBE_DEFER;
1285*4882a593Smuzhiyun 		chip->irq.child_to_parent_hwirq = msm_gpio_wakeirq;
1286*4882a593Smuzhiyun 		pctrl->irq_chip.irq_eoi = irq_chip_eoi_parent;
1287*4882a593Smuzhiyun 		/*
1288*4882a593Smuzhiyun 		 * Let's skip handling the GPIOs, if the parent irqchip
1289*4882a593Smuzhiyun 		 * is handling the direct connect IRQ of the GPIO.
1290*4882a593Smuzhiyun 		 */
1291*4882a593Smuzhiyun 		skip = irq_domain_qcom_handle_wakeup(chip->irq.parent_domain);
1292*4882a593Smuzhiyun 		for (i = 0; skip && i < pctrl->soc->nwakeirq_map; i++) {
1293*4882a593Smuzhiyun 			gpio = pctrl->soc->wakeirq_map[i].gpio;
1294*4882a593Smuzhiyun 			set_bit(gpio, pctrl->skip_wake_irqs);
1295*4882a593Smuzhiyun 		}
1296*4882a593Smuzhiyun 	}
1297*4882a593Smuzhiyun 
1298*4882a593Smuzhiyun 	girq = &chip->irq;
1299*4882a593Smuzhiyun 	girq->chip = &pctrl->irq_chip;
1300*4882a593Smuzhiyun 	girq->parent_handler = msm_gpio_irq_handler;
1301*4882a593Smuzhiyun 	girq->fwnode = pctrl->dev->fwnode;
1302*4882a593Smuzhiyun 	girq->num_parents = 1;
1303*4882a593Smuzhiyun 	girq->parents = devm_kcalloc(pctrl->dev, 1, sizeof(*girq->parents),
1304*4882a593Smuzhiyun 				     GFP_KERNEL);
1305*4882a593Smuzhiyun 	if (!girq->parents)
1306*4882a593Smuzhiyun 		return -ENOMEM;
1307*4882a593Smuzhiyun 	girq->default_type = IRQ_TYPE_NONE;
1308*4882a593Smuzhiyun 	girq->handler = handle_bad_irq;
1309*4882a593Smuzhiyun 	girq->parents[0] = pctrl->irq;
1310*4882a593Smuzhiyun 
1311*4882a593Smuzhiyun 	ret = gpiochip_add_data(&pctrl->chip, pctrl);
1312*4882a593Smuzhiyun 	if (ret) {
1313*4882a593Smuzhiyun 		dev_err(pctrl->dev, "Failed register gpiochip\n");
1314*4882a593Smuzhiyun 		return ret;
1315*4882a593Smuzhiyun 	}
1316*4882a593Smuzhiyun 
1317*4882a593Smuzhiyun 	/*
1318*4882a593Smuzhiyun 	 * For DeviceTree-supported systems, the gpio core checks the
1319*4882a593Smuzhiyun 	 * pinctrl's device node for the "gpio-ranges" property.
1320*4882a593Smuzhiyun 	 * If it is present, it takes care of adding the pin ranges
1321*4882a593Smuzhiyun 	 * for the driver. In this case the driver can skip ahead.
1322*4882a593Smuzhiyun 	 *
1323*4882a593Smuzhiyun 	 * In order to remain compatible with older, existing DeviceTree
1324*4882a593Smuzhiyun 	 * files which don't set the "gpio-ranges" property or systems that
1325*4882a593Smuzhiyun 	 * utilize ACPI the driver has to call gpiochip_add_pin_range().
1326*4882a593Smuzhiyun 	 */
1327*4882a593Smuzhiyun 	if (!of_property_read_bool(pctrl->dev->of_node, "gpio-ranges")) {
1328*4882a593Smuzhiyun 		ret = gpiochip_add_pin_range(&pctrl->chip,
1329*4882a593Smuzhiyun 			dev_name(pctrl->dev), 0, 0, chip->ngpio);
1330*4882a593Smuzhiyun 		if (ret) {
1331*4882a593Smuzhiyun 			dev_err(pctrl->dev, "Failed to add pin range\n");
1332*4882a593Smuzhiyun 			gpiochip_remove(&pctrl->chip);
1333*4882a593Smuzhiyun 			return ret;
1334*4882a593Smuzhiyun 		}
1335*4882a593Smuzhiyun 	}
1336*4882a593Smuzhiyun 
1337*4882a593Smuzhiyun 	return 0;
1338*4882a593Smuzhiyun }
1339*4882a593Smuzhiyun 
msm_ps_hold_restart(struct notifier_block * nb,unsigned long action,void * data)1340*4882a593Smuzhiyun static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action,
1341*4882a593Smuzhiyun 			       void *data)
1342*4882a593Smuzhiyun {
1343*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb);
1344*4882a593Smuzhiyun 
1345*4882a593Smuzhiyun 	writel(0, pctrl->regs[0] + PS_HOLD_OFFSET);
1346*4882a593Smuzhiyun 	mdelay(1000);
1347*4882a593Smuzhiyun 	return NOTIFY_DONE;
1348*4882a593Smuzhiyun }
1349*4882a593Smuzhiyun 
1350*4882a593Smuzhiyun static struct msm_pinctrl *poweroff_pctrl;
1351*4882a593Smuzhiyun 
msm_ps_hold_poweroff(void)1352*4882a593Smuzhiyun static void msm_ps_hold_poweroff(void)
1353*4882a593Smuzhiyun {
1354*4882a593Smuzhiyun 	msm_ps_hold_restart(&poweroff_pctrl->restart_nb, 0, NULL);
1355*4882a593Smuzhiyun }
1356*4882a593Smuzhiyun 
msm_pinctrl_setup_pm_reset(struct msm_pinctrl * pctrl)1357*4882a593Smuzhiyun static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl)
1358*4882a593Smuzhiyun {
1359*4882a593Smuzhiyun 	int i;
1360*4882a593Smuzhiyun 	const struct msm_function *func = pctrl->soc->functions;
1361*4882a593Smuzhiyun 
1362*4882a593Smuzhiyun 	for (i = 0; i < pctrl->soc->nfunctions; i++)
1363*4882a593Smuzhiyun 		if (!strcmp(func[i].name, "ps_hold")) {
1364*4882a593Smuzhiyun 			pctrl->restart_nb.notifier_call = msm_ps_hold_restart;
1365*4882a593Smuzhiyun 			pctrl->restart_nb.priority = 128;
1366*4882a593Smuzhiyun 			if (register_restart_handler(&pctrl->restart_nb))
1367*4882a593Smuzhiyun 				dev_err(pctrl->dev,
1368*4882a593Smuzhiyun 					"failed to setup restart handler.\n");
1369*4882a593Smuzhiyun 			poweroff_pctrl = pctrl;
1370*4882a593Smuzhiyun 			pm_power_off = msm_ps_hold_poweroff;
1371*4882a593Smuzhiyun 			break;
1372*4882a593Smuzhiyun 		}
1373*4882a593Smuzhiyun }
1374*4882a593Smuzhiyun 
msm_pinctrl_suspend(struct device * dev)1375*4882a593Smuzhiyun static __maybe_unused int msm_pinctrl_suspend(struct device *dev)
1376*4882a593Smuzhiyun {
1377*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = dev_get_drvdata(dev);
1378*4882a593Smuzhiyun 
1379*4882a593Smuzhiyun 	return pinctrl_force_sleep(pctrl->pctrl);
1380*4882a593Smuzhiyun }
1381*4882a593Smuzhiyun 
msm_pinctrl_resume(struct device * dev)1382*4882a593Smuzhiyun static __maybe_unused int msm_pinctrl_resume(struct device *dev)
1383*4882a593Smuzhiyun {
1384*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = dev_get_drvdata(dev);
1385*4882a593Smuzhiyun 
1386*4882a593Smuzhiyun 	return pinctrl_force_default(pctrl->pctrl);
1387*4882a593Smuzhiyun }
1388*4882a593Smuzhiyun 
1389*4882a593Smuzhiyun SIMPLE_DEV_PM_OPS(msm_pinctrl_dev_pm_ops, msm_pinctrl_suspend,
1390*4882a593Smuzhiyun 		  msm_pinctrl_resume);
1391*4882a593Smuzhiyun 
1392*4882a593Smuzhiyun EXPORT_SYMBOL(msm_pinctrl_dev_pm_ops);
1393*4882a593Smuzhiyun 
msm_pinctrl_probe(struct platform_device * pdev,const struct msm_pinctrl_soc_data * soc_data)1394*4882a593Smuzhiyun int msm_pinctrl_probe(struct platform_device *pdev,
1395*4882a593Smuzhiyun 		      const struct msm_pinctrl_soc_data *soc_data)
1396*4882a593Smuzhiyun {
1397*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl;
1398*4882a593Smuzhiyun 	struct resource *res;
1399*4882a593Smuzhiyun 	int ret;
1400*4882a593Smuzhiyun 	int i;
1401*4882a593Smuzhiyun 
1402*4882a593Smuzhiyun 	pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
1403*4882a593Smuzhiyun 	if (!pctrl)
1404*4882a593Smuzhiyun 		return -ENOMEM;
1405*4882a593Smuzhiyun 
1406*4882a593Smuzhiyun 	pctrl->dev = &pdev->dev;
1407*4882a593Smuzhiyun 	pctrl->soc = soc_data;
1408*4882a593Smuzhiyun 	pctrl->chip = msm_gpio_template;
1409*4882a593Smuzhiyun 	pctrl->intr_target_use_scm = of_device_is_compatible(
1410*4882a593Smuzhiyun 					pctrl->dev->of_node,
1411*4882a593Smuzhiyun 					"qcom,ipq8064-pinctrl");
1412*4882a593Smuzhiyun 
1413*4882a593Smuzhiyun 	raw_spin_lock_init(&pctrl->lock);
1414*4882a593Smuzhiyun 
1415*4882a593Smuzhiyun 	if (soc_data->tiles) {
1416*4882a593Smuzhiyun 		for (i = 0; i < soc_data->ntiles; i++) {
1417*4882a593Smuzhiyun 			res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1418*4882a593Smuzhiyun 							   soc_data->tiles[i]);
1419*4882a593Smuzhiyun 			pctrl->regs[i] = devm_ioremap_resource(&pdev->dev, res);
1420*4882a593Smuzhiyun 			if (IS_ERR(pctrl->regs[i]))
1421*4882a593Smuzhiyun 				return PTR_ERR(pctrl->regs[i]);
1422*4882a593Smuzhiyun 		}
1423*4882a593Smuzhiyun 	} else {
1424*4882a593Smuzhiyun 		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1425*4882a593Smuzhiyun 		pctrl->regs[0] = devm_ioremap_resource(&pdev->dev, res);
1426*4882a593Smuzhiyun 		if (IS_ERR(pctrl->regs[0]))
1427*4882a593Smuzhiyun 			return PTR_ERR(pctrl->regs[0]);
1428*4882a593Smuzhiyun 
1429*4882a593Smuzhiyun 		pctrl->phys_base[0] = res->start;
1430*4882a593Smuzhiyun 	}
1431*4882a593Smuzhiyun 
1432*4882a593Smuzhiyun 	msm_pinctrl_setup_pm_reset(pctrl);
1433*4882a593Smuzhiyun 
1434*4882a593Smuzhiyun 	pctrl->irq = platform_get_irq(pdev, 0);
1435*4882a593Smuzhiyun 	if (pctrl->irq < 0)
1436*4882a593Smuzhiyun 		return pctrl->irq;
1437*4882a593Smuzhiyun 
1438*4882a593Smuzhiyun 	pctrl->desc.owner = THIS_MODULE;
1439*4882a593Smuzhiyun 	pctrl->desc.pctlops = &msm_pinctrl_ops;
1440*4882a593Smuzhiyun 	pctrl->desc.pmxops = &msm_pinmux_ops;
1441*4882a593Smuzhiyun 	pctrl->desc.confops = &msm_pinconf_ops;
1442*4882a593Smuzhiyun 	pctrl->desc.name = dev_name(&pdev->dev);
1443*4882a593Smuzhiyun 	pctrl->desc.pins = pctrl->soc->pins;
1444*4882a593Smuzhiyun 	pctrl->desc.npins = pctrl->soc->npins;
1445*4882a593Smuzhiyun 
1446*4882a593Smuzhiyun 	pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &pctrl->desc, pctrl);
1447*4882a593Smuzhiyun 	if (IS_ERR(pctrl->pctrl)) {
1448*4882a593Smuzhiyun 		dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
1449*4882a593Smuzhiyun 		return PTR_ERR(pctrl->pctrl);
1450*4882a593Smuzhiyun 	}
1451*4882a593Smuzhiyun 
1452*4882a593Smuzhiyun 	ret = msm_gpio_init(pctrl);
1453*4882a593Smuzhiyun 	if (ret)
1454*4882a593Smuzhiyun 		return ret;
1455*4882a593Smuzhiyun 
1456*4882a593Smuzhiyun 	platform_set_drvdata(pdev, pctrl);
1457*4882a593Smuzhiyun 
1458*4882a593Smuzhiyun 	dev_dbg(&pdev->dev, "Probed Qualcomm pinctrl driver\n");
1459*4882a593Smuzhiyun 
1460*4882a593Smuzhiyun 	return 0;
1461*4882a593Smuzhiyun }
1462*4882a593Smuzhiyun EXPORT_SYMBOL(msm_pinctrl_probe);
1463*4882a593Smuzhiyun 
msm_pinctrl_remove(struct platform_device * pdev)1464*4882a593Smuzhiyun int msm_pinctrl_remove(struct platform_device *pdev)
1465*4882a593Smuzhiyun {
1466*4882a593Smuzhiyun 	struct msm_pinctrl *pctrl = platform_get_drvdata(pdev);
1467*4882a593Smuzhiyun 
1468*4882a593Smuzhiyun 	gpiochip_remove(&pctrl->chip);
1469*4882a593Smuzhiyun 
1470*4882a593Smuzhiyun 	unregister_restart_handler(&pctrl->restart_nb);
1471*4882a593Smuzhiyun 
1472*4882a593Smuzhiyun 	return 0;
1473*4882a593Smuzhiyun }
1474*4882a593Smuzhiyun EXPORT_SYMBOL(msm_pinctrl_remove);
1475*4882a593Smuzhiyun 
1476*4882a593Smuzhiyun MODULE_DESCRIPTION("Qualcomm Technologies, Inc. pinctrl-msm driver");
1477*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
1478*4882a593Smuzhiyun 
1479