xref: /OK3568_Linux_fs/kernel/drivers/gpio/gpio-omap.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Support functions for OMAP GPIO
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2003-2005 Nokia Corporation
6*4882a593Smuzhiyun  * Written by Juha Yrjölä <juha.yrjola@nokia.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Copyright (C) 2009 Texas Instruments
9*4882a593Smuzhiyun  * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/init.h>
13*4882a593Smuzhiyun #include <linux/module.h>
14*4882a593Smuzhiyun #include <linux/interrupt.h>
15*4882a593Smuzhiyun #include <linux/syscore_ops.h>
16*4882a593Smuzhiyun #include <linux/err.h>
17*4882a593Smuzhiyun #include <linux/clk.h>
18*4882a593Smuzhiyun #include <linux/io.h>
19*4882a593Smuzhiyun #include <linux/cpu_pm.h>
20*4882a593Smuzhiyun #include <linux/device.h>
21*4882a593Smuzhiyun #include <linux/pm_runtime.h>
22*4882a593Smuzhiyun #include <linux/pm.h>
23*4882a593Smuzhiyun #include <linux/of.h>
24*4882a593Smuzhiyun #include <linux/of_device.h>
25*4882a593Smuzhiyun #include <linux/gpio/driver.h>
26*4882a593Smuzhiyun #include <linux/bitops.h>
27*4882a593Smuzhiyun #include <linux/platform_data/gpio-omap.h>
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define OMAP4_GPIO_DEBOUNCINGTIME_MASK 0xFF
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun struct gpio_regs {
32*4882a593Smuzhiyun 	u32 sysconfig;
33*4882a593Smuzhiyun 	u32 irqenable1;
34*4882a593Smuzhiyun 	u32 irqenable2;
35*4882a593Smuzhiyun 	u32 wake_en;
36*4882a593Smuzhiyun 	u32 ctrl;
37*4882a593Smuzhiyun 	u32 oe;
38*4882a593Smuzhiyun 	u32 leveldetect0;
39*4882a593Smuzhiyun 	u32 leveldetect1;
40*4882a593Smuzhiyun 	u32 risingdetect;
41*4882a593Smuzhiyun 	u32 fallingdetect;
42*4882a593Smuzhiyun 	u32 dataout;
43*4882a593Smuzhiyun 	u32 debounce;
44*4882a593Smuzhiyun 	u32 debounce_en;
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun struct gpio_bank {
48*4882a593Smuzhiyun 	void __iomem *base;
49*4882a593Smuzhiyun 	const struct omap_gpio_reg_offs *regs;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	int irq;
52*4882a593Smuzhiyun 	u32 non_wakeup_gpios;
53*4882a593Smuzhiyun 	u32 enabled_non_wakeup_gpios;
54*4882a593Smuzhiyun 	struct gpio_regs context;
55*4882a593Smuzhiyun 	u32 saved_datain;
56*4882a593Smuzhiyun 	u32 level_mask;
57*4882a593Smuzhiyun 	u32 toggle_mask;
58*4882a593Smuzhiyun 	raw_spinlock_t lock;
59*4882a593Smuzhiyun 	raw_spinlock_t wa_lock;
60*4882a593Smuzhiyun 	struct gpio_chip chip;
61*4882a593Smuzhiyun 	struct clk *dbck;
62*4882a593Smuzhiyun 	struct notifier_block nb;
63*4882a593Smuzhiyun 	unsigned int is_suspended:1;
64*4882a593Smuzhiyun 	unsigned int needs_resume:1;
65*4882a593Smuzhiyun 	u32 mod_usage;
66*4882a593Smuzhiyun 	u32 irq_usage;
67*4882a593Smuzhiyun 	u32 dbck_enable_mask;
68*4882a593Smuzhiyun 	bool dbck_enabled;
69*4882a593Smuzhiyun 	bool is_mpuio;
70*4882a593Smuzhiyun 	bool dbck_flag;
71*4882a593Smuzhiyun 	bool loses_context;
72*4882a593Smuzhiyun 	bool context_valid;
73*4882a593Smuzhiyun 	int stride;
74*4882a593Smuzhiyun 	u32 width;
75*4882a593Smuzhiyun 	int context_loss_count;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	void (*set_dataout)(struct gpio_bank *bank, unsigned gpio, int enable);
78*4882a593Smuzhiyun 	int (*get_context_loss_count)(struct device *dev);
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define GPIO_MOD_CTRL_BIT	BIT(0)
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage)
84*4882a593Smuzhiyun #define LINE_USED(line, offset) (line & (BIT(offset)))
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun static void omap_gpio_unmask_irq(struct irq_data *d);
87*4882a593Smuzhiyun 
omap_irq_data_get_bank(struct irq_data * d)88*4882a593Smuzhiyun static inline struct gpio_bank *omap_irq_data_get_bank(struct irq_data *d)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun 	struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
91*4882a593Smuzhiyun 	return gpiochip_get_data(chip);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
omap_gpio_rmw(void __iomem * reg,u32 mask,bool set)94*4882a593Smuzhiyun static inline u32 omap_gpio_rmw(void __iomem *reg, u32 mask, bool set)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	u32 val = readl_relaxed(reg);
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	if (set)
99*4882a593Smuzhiyun 		val |= mask;
100*4882a593Smuzhiyun 	else
101*4882a593Smuzhiyun 		val &= ~mask;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	writel_relaxed(val, reg);
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	return val;
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun 
omap_set_gpio_direction(struct gpio_bank * bank,int gpio,int is_input)108*4882a593Smuzhiyun static void omap_set_gpio_direction(struct gpio_bank *bank, int gpio,
109*4882a593Smuzhiyun 				    int is_input)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun 	bank->context.oe = omap_gpio_rmw(bank->base + bank->regs->direction,
112*4882a593Smuzhiyun 					 BIT(gpio), is_input);
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* set data out value using dedicate set/clear register */
omap_set_gpio_dataout_reg(struct gpio_bank * bank,unsigned offset,int enable)117*4882a593Smuzhiyun static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, unsigned offset,
118*4882a593Smuzhiyun 				      int enable)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	void __iomem *reg = bank->base;
121*4882a593Smuzhiyun 	u32 l = BIT(offset);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	if (enable) {
124*4882a593Smuzhiyun 		reg += bank->regs->set_dataout;
125*4882a593Smuzhiyun 		bank->context.dataout |= l;
126*4882a593Smuzhiyun 	} else {
127*4882a593Smuzhiyun 		reg += bank->regs->clr_dataout;
128*4882a593Smuzhiyun 		bank->context.dataout &= ~l;
129*4882a593Smuzhiyun 	}
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	writel_relaxed(l, reg);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /* set data out value using mask register */
omap_set_gpio_dataout_mask(struct gpio_bank * bank,unsigned offset,int enable)135*4882a593Smuzhiyun static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, unsigned offset,
136*4882a593Smuzhiyun 				       int enable)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun 	bank->context.dataout = omap_gpio_rmw(bank->base + bank->regs->dataout,
139*4882a593Smuzhiyun 					      BIT(offset), enable);
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
omap_gpio_dbck_enable(struct gpio_bank * bank)142*4882a593Smuzhiyun static inline void omap_gpio_dbck_enable(struct gpio_bank *bank)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun 	if (bank->dbck_enable_mask && !bank->dbck_enabled) {
145*4882a593Smuzhiyun 		clk_enable(bank->dbck);
146*4882a593Smuzhiyun 		bank->dbck_enabled = true;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 		writel_relaxed(bank->dbck_enable_mask,
149*4882a593Smuzhiyun 			     bank->base + bank->regs->debounce_en);
150*4882a593Smuzhiyun 	}
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun 
omap_gpio_dbck_disable(struct gpio_bank * bank)153*4882a593Smuzhiyun static inline void omap_gpio_dbck_disable(struct gpio_bank *bank)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun 	if (bank->dbck_enable_mask && bank->dbck_enabled) {
156*4882a593Smuzhiyun 		/*
157*4882a593Smuzhiyun 		 * Disable debounce before cutting it's clock. If debounce is
158*4882a593Smuzhiyun 		 * enabled but the clock is not, GPIO module seems to be unable
159*4882a593Smuzhiyun 		 * to detect events and generate interrupts at least on OMAP3.
160*4882a593Smuzhiyun 		 */
161*4882a593Smuzhiyun 		writel_relaxed(0, bank->base + bank->regs->debounce_en);
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 		clk_disable(bank->dbck);
164*4882a593Smuzhiyun 		bank->dbck_enabled = false;
165*4882a593Smuzhiyun 	}
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /**
169*4882a593Smuzhiyun  * omap2_set_gpio_debounce - low level gpio debounce time
170*4882a593Smuzhiyun  * @bank: the gpio bank we're acting upon
171*4882a593Smuzhiyun  * @offset: the gpio number on this @bank
172*4882a593Smuzhiyun  * @debounce: debounce time to use
173*4882a593Smuzhiyun  *
174*4882a593Smuzhiyun  * OMAP's debounce time is in 31us steps
175*4882a593Smuzhiyun  *   <debounce time> = (GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME + 1) x 31
176*4882a593Smuzhiyun  * so we need to convert and round up to the closest unit.
177*4882a593Smuzhiyun  *
178*4882a593Smuzhiyun  * Return: 0 on success, negative error otherwise.
179*4882a593Smuzhiyun  */
omap2_set_gpio_debounce(struct gpio_bank * bank,unsigned offset,unsigned debounce)180*4882a593Smuzhiyun static int omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset,
181*4882a593Smuzhiyun 				   unsigned debounce)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	u32			val;
184*4882a593Smuzhiyun 	u32			l;
185*4882a593Smuzhiyun 	bool			enable = !!debounce;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	if (!bank->dbck_flag)
188*4882a593Smuzhiyun 		return -ENOTSUPP;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	if (enable) {
191*4882a593Smuzhiyun 		debounce = DIV_ROUND_UP(debounce, 31) - 1;
192*4882a593Smuzhiyun 		if ((debounce & OMAP4_GPIO_DEBOUNCINGTIME_MASK) != debounce)
193*4882a593Smuzhiyun 			return -EINVAL;
194*4882a593Smuzhiyun 	}
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	l = BIT(offset);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 	clk_enable(bank->dbck);
199*4882a593Smuzhiyun 	writel_relaxed(debounce, bank->base + bank->regs->debounce);
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	val = omap_gpio_rmw(bank->base + bank->regs->debounce_en, l, enable);
202*4882a593Smuzhiyun 	bank->dbck_enable_mask = val;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	clk_disable(bank->dbck);
205*4882a593Smuzhiyun 	/*
206*4882a593Smuzhiyun 	 * Enable debounce clock per module.
207*4882a593Smuzhiyun 	 * This call is mandatory because in omap_gpio_request() when
208*4882a593Smuzhiyun 	 * *_runtime_get_sync() is called,  _gpio_dbck_enable() within
209*4882a593Smuzhiyun 	 * runtime callbck fails to turn on dbck because dbck_enable_mask
210*4882a593Smuzhiyun 	 * used within _gpio_dbck_enable() is still not initialized at
211*4882a593Smuzhiyun 	 * that point. Therefore we have to enable dbck here.
212*4882a593Smuzhiyun 	 */
213*4882a593Smuzhiyun 	omap_gpio_dbck_enable(bank);
214*4882a593Smuzhiyun 	if (bank->dbck_enable_mask) {
215*4882a593Smuzhiyun 		bank->context.debounce = debounce;
216*4882a593Smuzhiyun 		bank->context.debounce_en = val;
217*4882a593Smuzhiyun 	}
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	return 0;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun /**
223*4882a593Smuzhiyun  * omap_clear_gpio_debounce - clear debounce settings for a gpio
224*4882a593Smuzhiyun  * @bank: the gpio bank we're acting upon
225*4882a593Smuzhiyun  * @offset: the gpio number on this @bank
226*4882a593Smuzhiyun  *
227*4882a593Smuzhiyun  * If a gpio is using debounce, then clear the debounce enable bit and if
228*4882a593Smuzhiyun  * this is the only gpio in this bank using debounce, then clear the debounce
229*4882a593Smuzhiyun  * time too. The debounce clock will also be disabled when calling this function
230*4882a593Smuzhiyun  * if this is the only gpio in the bank using debounce.
231*4882a593Smuzhiyun  */
omap_clear_gpio_debounce(struct gpio_bank * bank,unsigned offset)232*4882a593Smuzhiyun static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned offset)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun 	u32 gpio_bit = BIT(offset);
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	if (!bank->dbck_flag)
237*4882a593Smuzhiyun 		return;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	if (!(bank->dbck_enable_mask & gpio_bit))
240*4882a593Smuzhiyun 		return;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	bank->dbck_enable_mask &= ~gpio_bit;
243*4882a593Smuzhiyun 	bank->context.debounce_en &= ~gpio_bit;
244*4882a593Smuzhiyun         writel_relaxed(bank->context.debounce_en,
245*4882a593Smuzhiyun 		     bank->base + bank->regs->debounce_en);
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	if (!bank->dbck_enable_mask) {
248*4882a593Smuzhiyun 		bank->context.debounce = 0;
249*4882a593Smuzhiyun 		writel_relaxed(bank->context.debounce, bank->base +
250*4882a593Smuzhiyun 			     bank->regs->debounce);
251*4882a593Smuzhiyun 		clk_disable(bank->dbck);
252*4882a593Smuzhiyun 		bank->dbck_enabled = false;
253*4882a593Smuzhiyun 	}
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun /*
257*4882a593Smuzhiyun  * Off mode wake-up capable GPIOs in bank(s) that are in the wakeup domain.
258*4882a593Smuzhiyun  * See TRM section for GPIO for "Wake-Up Generation" for the list of GPIOs
259*4882a593Smuzhiyun  * in wakeup domain. If bank->non_wakeup_gpios is not configured, assume none
260*4882a593Smuzhiyun  * are capable waking up the system from off mode.
261*4882a593Smuzhiyun  */
omap_gpio_is_off_wakeup_capable(struct gpio_bank * bank,u32 gpio_mask)262*4882a593Smuzhiyun static bool omap_gpio_is_off_wakeup_capable(struct gpio_bank *bank, u32 gpio_mask)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun 	u32 no_wake = bank->non_wakeup_gpios;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	if (no_wake)
267*4882a593Smuzhiyun 		return !!(~no_wake & gpio_mask);
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	return false;
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun 
omap_set_gpio_trigger(struct gpio_bank * bank,int gpio,unsigned trigger)272*4882a593Smuzhiyun static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio,
273*4882a593Smuzhiyun 						unsigned trigger)
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun 	void __iomem *base = bank->base;
276*4882a593Smuzhiyun 	u32 gpio_bit = BIT(gpio);
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	omap_gpio_rmw(base + bank->regs->leveldetect0, gpio_bit,
279*4882a593Smuzhiyun 		      trigger & IRQ_TYPE_LEVEL_LOW);
280*4882a593Smuzhiyun 	omap_gpio_rmw(base + bank->regs->leveldetect1, gpio_bit,
281*4882a593Smuzhiyun 		      trigger & IRQ_TYPE_LEVEL_HIGH);
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	/*
284*4882a593Smuzhiyun 	 * We need the edge detection enabled for to allow the GPIO block
285*4882a593Smuzhiyun 	 * to be woken from idle state.  Set the appropriate edge detection
286*4882a593Smuzhiyun 	 * in addition to the level detection.
287*4882a593Smuzhiyun 	 */
288*4882a593Smuzhiyun 	omap_gpio_rmw(base + bank->regs->risingdetect, gpio_bit,
289*4882a593Smuzhiyun 		      trigger & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_LEVEL_HIGH));
290*4882a593Smuzhiyun 	omap_gpio_rmw(base + bank->regs->fallingdetect, gpio_bit,
291*4882a593Smuzhiyun 		      trigger & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_LEVEL_LOW));
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 	bank->context.leveldetect0 =
294*4882a593Smuzhiyun 			readl_relaxed(bank->base + bank->regs->leveldetect0);
295*4882a593Smuzhiyun 	bank->context.leveldetect1 =
296*4882a593Smuzhiyun 			readl_relaxed(bank->base + bank->regs->leveldetect1);
297*4882a593Smuzhiyun 	bank->context.risingdetect =
298*4882a593Smuzhiyun 			readl_relaxed(bank->base + bank->regs->risingdetect);
299*4882a593Smuzhiyun 	bank->context.fallingdetect =
300*4882a593Smuzhiyun 			readl_relaxed(bank->base + bank->regs->fallingdetect);
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	bank->level_mask = bank->context.leveldetect0 |
303*4882a593Smuzhiyun 			   bank->context.leveldetect1;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	/* This part needs to be executed always for OMAP{34xx, 44xx} */
306*4882a593Smuzhiyun 	if (!bank->regs->irqctrl && !omap_gpio_is_off_wakeup_capable(bank, gpio)) {
307*4882a593Smuzhiyun 		/*
308*4882a593Smuzhiyun 		 * Log the edge gpio and manually trigger the IRQ
309*4882a593Smuzhiyun 		 * after resume if the input level changes
310*4882a593Smuzhiyun 		 * to avoid irq lost during PER RET/OFF mode
311*4882a593Smuzhiyun 		 * Applies for omap2 non-wakeup gpio and all omap3 gpios
312*4882a593Smuzhiyun 		 */
313*4882a593Smuzhiyun 		if (trigger & IRQ_TYPE_EDGE_BOTH)
314*4882a593Smuzhiyun 			bank->enabled_non_wakeup_gpios |= gpio_bit;
315*4882a593Smuzhiyun 		else
316*4882a593Smuzhiyun 			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
317*4882a593Smuzhiyun 	}
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun /*
321*4882a593Smuzhiyun  * This only applies to chips that can't do both rising and falling edge
322*4882a593Smuzhiyun  * detection at once.  For all other chips, this function is a noop.
323*4882a593Smuzhiyun  */
omap_toggle_gpio_edge_triggering(struct gpio_bank * bank,int gpio)324*4882a593Smuzhiyun static void omap_toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun 	if (IS_ENABLED(CONFIG_ARCH_OMAP1) && bank->regs->irqctrl) {
327*4882a593Smuzhiyun 		void __iomem *reg = bank->base + bank->regs->irqctrl;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 		writel_relaxed(readl_relaxed(reg) ^ BIT(gpio), reg);
330*4882a593Smuzhiyun 	}
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun 
omap_set_gpio_triggering(struct gpio_bank * bank,int gpio,unsigned trigger)333*4882a593Smuzhiyun static int omap_set_gpio_triggering(struct gpio_bank *bank, int gpio,
334*4882a593Smuzhiyun 				    unsigned trigger)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun 	void __iomem *reg = bank->base;
337*4882a593Smuzhiyun 	u32 l = 0;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	if (bank->regs->leveldetect0 && bank->regs->wkup_en) {
340*4882a593Smuzhiyun 		omap_set_gpio_trigger(bank, gpio, trigger);
341*4882a593Smuzhiyun 	} else if (bank->regs->irqctrl) {
342*4882a593Smuzhiyun 		reg += bank->regs->irqctrl;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 		l = readl_relaxed(reg);
345*4882a593Smuzhiyun 		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
346*4882a593Smuzhiyun 			bank->toggle_mask |= BIT(gpio);
347*4882a593Smuzhiyun 		if (trigger & IRQ_TYPE_EDGE_RISING)
348*4882a593Smuzhiyun 			l |= BIT(gpio);
349*4882a593Smuzhiyun 		else if (trigger & IRQ_TYPE_EDGE_FALLING)
350*4882a593Smuzhiyun 			l &= ~(BIT(gpio));
351*4882a593Smuzhiyun 		else
352*4882a593Smuzhiyun 			return -EINVAL;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 		writel_relaxed(l, reg);
355*4882a593Smuzhiyun 	} else if (bank->regs->edgectrl1) {
356*4882a593Smuzhiyun 		if (gpio & 0x08)
357*4882a593Smuzhiyun 			reg += bank->regs->edgectrl2;
358*4882a593Smuzhiyun 		else
359*4882a593Smuzhiyun 			reg += bank->regs->edgectrl1;
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 		gpio &= 0x07;
362*4882a593Smuzhiyun 		l = readl_relaxed(reg);
363*4882a593Smuzhiyun 		l &= ~(3 << (gpio << 1));
364*4882a593Smuzhiyun 		if (trigger & IRQ_TYPE_EDGE_RISING)
365*4882a593Smuzhiyun 			l |= 2 << (gpio << 1);
366*4882a593Smuzhiyun 		if (trigger & IRQ_TYPE_EDGE_FALLING)
367*4882a593Smuzhiyun 			l |= BIT(gpio << 1);
368*4882a593Smuzhiyun 		writel_relaxed(l, reg);
369*4882a593Smuzhiyun 	}
370*4882a593Smuzhiyun 	return 0;
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun 
omap_enable_gpio_module(struct gpio_bank * bank,unsigned offset)373*4882a593Smuzhiyun static void omap_enable_gpio_module(struct gpio_bank *bank, unsigned offset)
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun 	if (bank->regs->pinctrl) {
376*4882a593Smuzhiyun 		void __iomem *reg = bank->base + bank->regs->pinctrl;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 		/* Claim the pin for MPU */
379*4882a593Smuzhiyun 		writel_relaxed(readl_relaxed(reg) | (BIT(offset)), reg);
380*4882a593Smuzhiyun 	}
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	if (bank->regs->ctrl && !BANK_USED(bank)) {
383*4882a593Smuzhiyun 		void __iomem *reg = bank->base + bank->regs->ctrl;
384*4882a593Smuzhiyun 		u32 ctrl;
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 		ctrl = readl_relaxed(reg);
387*4882a593Smuzhiyun 		/* Module is enabled, clocks are not gated */
388*4882a593Smuzhiyun 		ctrl &= ~GPIO_MOD_CTRL_BIT;
389*4882a593Smuzhiyun 		writel_relaxed(ctrl, reg);
390*4882a593Smuzhiyun 		bank->context.ctrl = ctrl;
391*4882a593Smuzhiyun 	}
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun 
omap_disable_gpio_module(struct gpio_bank * bank,unsigned offset)394*4882a593Smuzhiyun static void omap_disable_gpio_module(struct gpio_bank *bank, unsigned offset)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun 	if (bank->regs->ctrl && !BANK_USED(bank)) {
397*4882a593Smuzhiyun 		void __iomem *reg = bank->base + bank->regs->ctrl;
398*4882a593Smuzhiyun 		u32 ctrl;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 		ctrl = readl_relaxed(reg);
401*4882a593Smuzhiyun 		/* Module is disabled, clocks are gated */
402*4882a593Smuzhiyun 		ctrl |= GPIO_MOD_CTRL_BIT;
403*4882a593Smuzhiyun 		writel_relaxed(ctrl, reg);
404*4882a593Smuzhiyun 		bank->context.ctrl = ctrl;
405*4882a593Smuzhiyun 	}
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
omap_gpio_is_input(struct gpio_bank * bank,unsigned offset)408*4882a593Smuzhiyun static int omap_gpio_is_input(struct gpio_bank *bank, unsigned offset)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun 	void __iomem *reg = bank->base + bank->regs->direction;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	return readl_relaxed(reg) & BIT(offset);
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun 
omap_gpio_init_irq(struct gpio_bank * bank,unsigned offset)415*4882a593Smuzhiyun static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned offset)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun 	if (!LINE_USED(bank->mod_usage, offset)) {
418*4882a593Smuzhiyun 		omap_enable_gpio_module(bank, offset);
419*4882a593Smuzhiyun 		omap_set_gpio_direction(bank, offset, 1);
420*4882a593Smuzhiyun 	}
421*4882a593Smuzhiyun 	bank->irq_usage |= BIT(offset);
422*4882a593Smuzhiyun }
423*4882a593Smuzhiyun 
omap_gpio_irq_type(struct irq_data * d,unsigned type)424*4882a593Smuzhiyun static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
425*4882a593Smuzhiyun {
426*4882a593Smuzhiyun 	struct gpio_bank *bank = omap_irq_data_get_bank(d);
427*4882a593Smuzhiyun 	int retval;
428*4882a593Smuzhiyun 	unsigned long flags;
429*4882a593Smuzhiyun 	unsigned offset = d->hwirq;
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	if (type & ~IRQ_TYPE_SENSE_MASK)
432*4882a593Smuzhiyun 		return -EINVAL;
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	if (!bank->regs->leveldetect0 &&
435*4882a593Smuzhiyun 		(type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
436*4882a593Smuzhiyun 		return -EINVAL;
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
439*4882a593Smuzhiyun 	retval = omap_set_gpio_triggering(bank, offset, type);
440*4882a593Smuzhiyun 	if (retval) {
441*4882a593Smuzhiyun 		raw_spin_unlock_irqrestore(&bank->lock, flags);
442*4882a593Smuzhiyun 		goto error;
443*4882a593Smuzhiyun 	}
444*4882a593Smuzhiyun 	omap_gpio_init_irq(bank, offset);
445*4882a593Smuzhiyun 	if (!omap_gpio_is_input(bank, offset)) {
446*4882a593Smuzhiyun 		raw_spin_unlock_irqrestore(&bank->lock, flags);
447*4882a593Smuzhiyun 		retval = -EINVAL;
448*4882a593Smuzhiyun 		goto error;
449*4882a593Smuzhiyun 	}
450*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
453*4882a593Smuzhiyun 		irq_set_handler_locked(d, handle_level_irq);
454*4882a593Smuzhiyun 	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
455*4882a593Smuzhiyun 		/*
456*4882a593Smuzhiyun 		 * Edge IRQs are already cleared/acked in irq_handler and
457*4882a593Smuzhiyun 		 * not need to be masked, as result handle_edge_irq()
458*4882a593Smuzhiyun 		 * logic is excessed here and may cause lose of interrupts.
459*4882a593Smuzhiyun 		 * So just use handle_simple_irq.
460*4882a593Smuzhiyun 		 */
461*4882a593Smuzhiyun 		irq_set_handler_locked(d, handle_simple_irq);
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	return 0;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun error:
466*4882a593Smuzhiyun 	return retval;
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun 
omap_clear_gpio_irqbank(struct gpio_bank * bank,int gpio_mask)469*4882a593Smuzhiyun static void omap_clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun 	void __iomem *reg = bank->base;
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	reg += bank->regs->irqstatus;
474*4882a593Smuzhiyun 	writel_relaxed(gpio_mask, reg);
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 	/* Workaround for clearing DSP GPIO interrupts to allow retention */
477*4882a593Smuzhiyun 	if (bank->regs->irqstatus2) {
478*4882a593Smuzhiyun 		reg = bank->base + bank->regs->irqstatus2;
479*4882a593Smuzhiyun 		writel_relaxed(gpio_mask, reg);
480*4882a593Smuzhiyun 	}
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	/* Flush posted write for the irq status to avoid spurious interrupts */
483*4882a593Smuzhiyun 	readl_relaxed(reg);
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun 
omap_clear_gpio_irqstatus(struct gpio_bank * bank,unsigned offset)486*4882a593Smuzhiyun static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank,
487*4882a593Smuzhiyun 					     unsigned offset)
488*4882a593Smuzhiyun {
489*4882a593Smuzhiyun 	omap_clear_gpio_irqbank(bank, BIT(offset));
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun 
omap_get_gpio_irqbank_mask(struct gpio_bank * bank)492*4882a593Smuzhiyun static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank)
493*4882a593Smuzhiyun {
494*4882a593Smuzhiyun 	void __iomem *reg = bank->base;
495*4882a593Smuzhiyun 	u32 l;
496*4882a593Smuzhiyun 	u32 mask = (BIT(bank->width)) - 1;
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	reg += bank->regs->irqenable;
499*4882a593Smuzhiyun 	l = readl_relaxed(reg);
500*4882a593Smuzhiyun 	if (bank->regs->irqenable_inv)
501*4882a593Smuzhiyun 		l = ~l;
502*4882a593Smuzhiyun 	l &= mask;
503*4882a593Smuzhiyun 	return l;
504*4882a593Smuzhiyun }
505*4882a593Smuzhiyun 
omap_set_gpio_irqenable(struct gpio_bank * bank,unsigned offset,int enable)506*4882a593Smuzhiyun static inline void omap_set_gpio_irqenable(struct gpio_bank *bank,
507*4882a593Smuzhiyun 					   unsigned offset, int enable)
508*4882a593Smuzhiyun {
509*4882a593Smuzhiyun 	void __iomem *reg = bank->base;
510*4882a593Smuzhiyun 	u32 gpio_mask = BIT(offset);
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	if (bank->regs->set_irqenable && bank->regs->clr_irqenable) {
513*4882a593Smuzhiyun 		if (enable) {
514*4882a593Smuzhiyun 			reg += bank->regs->set_irqenable;
515*4882a593Smuzhiyun 			bank->context.irqenable1 |= gpio_mask;
516*4882a593Smuzhiyun 		} else {
517*4882a593Smuzhiyun 			reg += bank->regs->clr_irqenable;
518*4882a593Smuzhiyun 			bank->context.irqenable1 &= ~gpio_mask;
519*4882a593Smuzhiyun 		}
520*4882a593Smuzhiyun 		writel_relaxed(gpio_mask, reg);
521*4882a593Smuzhiyun 	} else {
522*4882a593Smuzhiyun 		bank->context.irqenable1 =
523*4882a593Smuzhiyun 			omap_gpio_rmw(reg + bank->regs->irqenable, gpio_mask,
524*4882a593Smuzhiyun 				      enable ^ bank->regs->irqenable_inv);
525*4882a593Smuzhiyun 	}
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun 	/*
528*4882a593Smuzhiyun 	 * Program GPIO wakeup along with IRQ enable to satisfy OMAP4430 TRM
529*4882a593Smuzhiyun 	 * note requiring correlation between the IRQ enable registers and
530*4882a593Smuzhiyun 	 * the wakeup registers.  In any case, we want wakeup from idle
531*4882a593Smuzhiyun 	 * enabled for the GPIOs which support this feature.
532*4882a593Smuzhiyun 	 */
533*4882a593Smuzhiyun 	if (bank->regs->wkup_en &&
534*4882a593Smuzhiyun 	    (bank->regs->edgectrl1 || !(bank->non_wakeup_gpios & gpio_mask))) {
535*4882a593Smuzhiyun 		bank->context.wake_en =
536*4882a593Smuzhiyun 			omap_gpio_rmw(bank->base + bank->regs->wkup_en,
537*4882a593Smuzhiyun 				      gpio_mask, enable);
538*4882a593Smuzhiyun 	}
539*4882a593Smuzhiyun }
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
omap_gpio_wake_enable(struct irq_data * d,unsigned int enable)542*4882a593Smuzhiyun static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable)
543*4882a593Smuzhiyun {
544*4882a593Smuzhiyun 	struct gpio_bank *bank = omap_irq_data_get_bank(d);
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun 	return irq_set_irq_wake(bank->irq, enable);
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun /*
550*4882a593Smuzhiyun  * We need to unmask the GPIO bank interrupt as soon as possible to
551*4882a593Smuzhiyun  * avoid missing GPIO interrupts for other lines in the bank.
552*4882a593Smuzhiyun  * Then we need to mask-read-clear-unmask the triggered GPIO lines
553*4882a593Smuzhiyun  * in the bank to avoid missing nested interrupts for a GPIO line.
554*4882a593Smuzhiyun  * If we wait to unmask individual GPIO lines in the bank after the
555*4882a593Smuzhiyun  * line's interrupt handler has been run, we may miss some nested
556*4882a593Smuzhiyun  * interrupts.
557*4882a593Smuzhiyun  */
omap_gpio_irq_handler(int irq,void * gpiobank)558*4882a593Smuzhiyun static irqreturn_t omap_gpio_irq_handler(int irq, void *gpiobank)
559*4882a593Smuzhiyun {
560*4882a593Smuzhiyun 	void __iomem *isr_reg = NULL;
561*4882a593Smuzhiyun 	u32 enabled, isr, edge;
562*4882a593Smuzhiyun 	unsigned int bit;
563*4882a593Smuzhiyun 	struct gpio_bank *bank = gpiobank;
564*4882a593Smuzhiyun 	unsigned long wa_lock_flags;
565*4882a593Smuzhiyun 	unsigned long lock_flags;
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	isr_reg = bank->base + bank->regs->irqstatus;
568*4882a593Smuzhiyun 	if (WARN_ON(!isr_reg))
569*4882a593Smuzhiyun 		goto exit;
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun 	if (WARN_ONCE(!pm_runtime_active(bank->chip.parent),
572*4882a593Smuzhiyun 		      "gpio irq%i while runtime suspended?\n", irq))
573*4882a593Smuzhiyun 		return IRQ_NONE;
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	while (1) {
576*4882a593Smuzhiyun 		raw_spin_lock_irqsave(&bank->lock, lock_flags);
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun 		enabled = omap_get_gpio_irqbank_mask(bank);
579*4882a593Smuzhiyun 		isr = readl_relaxed(isr_reg) & enabled;
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 		/*
582*4882a593Smuzhiyun 		 * Clear edge sensitive interrupts before calling handler(s)
583*4882a593Smuzhiyun 		 * so subsequent edge transitions are not missed while the
584*4882a593Smuzhiyun 		 * handlers are running.
585*4882a593Smuzhiyun 		 */
586*4882a593Smuzhiyun 		edge = isr & ~bank->level_mask;
587*4882a593Smuzhiyun 		if (edge)
588*4882a593Smuzhiyun 			omap_clear_gpio_irqbank(bank, edge);
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 		raw_spin_unlock_irqrestore(&bank->lock, lock_flags);
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 		if (!isr)
593*4882a593Smuzhiyun 			break;
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun 		while (isr) {
596*4882a593Smuzhiyun 			bit = __ffs(isr);
597*4882a593Smuzhiyun 			isr &= ~(BIT(bit));
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun 			raw_spin_lock_irqsave(&bank->lock, lock_flags);
600*4882a593Smuzhiyun 			/*
601*4882a593Smuzhiyun 			 * Some chips can't respond to both rising and falling
602*4882a593Smuzhiyun 			 * at the same time.  If this irq was requested with
603*4882a593Smuzhiyun 			 * both flags, we need to flip the ICR data for the IRQ
604*4882a593Smuzhiyun 			 * to respond to the IRQ for the opposite direction.
605*4882a593Smuzhiyun 			 * This will be indicated in the bank toggle_mask.
606*4882a593Smuzhiyun 			 */
607*4882a593Smuzhiyun 			if (bank->toggle_mask & (BIT(bit)))
608*4882a593Smuzhiyun 				omap_toggle_gpio_edge_triggering(bank, bit);
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun 			raw_spin_unlock_irqrestore(&bank->lock, lock_flags);
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun 			raw_spin_lock_irqsave(&bank->wa_lock, wa_lock_flags);
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun 			generic_handle_irq(irq_find_mapping(bank->chip.irq.domain,
615*4882a593Smuzhiyun 							    bit));
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 			raw_spin_unlock_irqrestore(&bank->wa_lock,
618*4882a593Smuzhiyun 						   wa_lock_flags);
619*4882a593Smuzhiyun 		}
620*4882a593Smuzhiyun 	}
621*4882a593Smuzhiyun exit:
622*4882a593Smuzhiyun 	return IRQ_HANDLED;
623*4882a593Smuzhiyun }
624*4882a593Smuzhiyun 
omap_gpio_irq_startup(struct irq_data * d)625*4882a593Smuzhiyun static unsigned int omap_gpio_irq_startup(struct irq_data *d)
626*4882a593Smuzhiyun {
627*4882a593Smuzhiyun 	struct gpio_bank *bank = omap_irq_data_get_bank(d);
628*4882a593Smuzhiyun 	unsigned long flags;
629*4882a593Smuzhiyun 	unsigned offset = d->hwirq;
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun 	if (!LINE_USED(bank->mod_usage, offset))
634*4882a593Smuzhiyun 		omap_set_gpio_direction(bank, offset, 1);
635*4882a593Smuzhiyun 	omap_enable_gpio_module(bank, offset);
636*4882a593Smuzhiyun 	bank->irq_usage |= BIT(offset);
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
639*4882a593Smuzhiyun 	omap_gpio_unmask_irq(d);
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun 	return 0;
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun 
omap_gpio_irq_shutdown(struct irq_data * d)644*4882a593Smuzhiyun static void omap_gpio_irq_shutdown(struct irq_data *d)
645*4882a593Smuzhiyun {
646*4882a593Smuzhiyun 	struct gpio_bank *bank = omap_irq_data_get_bank(d);
647*4882a593Smuzhiyun 	unsigned long flags;
648*4882a593Smuzhiyun 	unsigned offset = d->hwirq;
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
651*4882a593Smuzhiyun 	bank->irq_usage &= ~(BIT(offset));
652*4882a593Smuzhiyun 	omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
653*4882a593Smuzhiyun 	omap_clear_gpio_irqstatus(bank, offset);
654*4882a593Smuzhiyun 	omap_set_gpio_irqenable(bank, offset, 0);
655*4882a593Smuzhiyun 	if (!LINE_USED(bank->mod_usage, offset))
656*4882a593Smuzhiyun 		omap_clear_gpio_debounce(bank, offset);
657*4882a593Smuzhiyun 	omap_disable_gpio_module(bank, offset);
658*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
659*4882a593Smuzhiyun }
660*4882a593Smuzhiyun 
omap_gpio_irq_bus_lock(struct irq_data * data)661*4882a593Smuzhiyun static void omap_gpio_irq_bus_lock(struct irq_data *data)
662*4882a593Smuzhiyun {
663*4882a593Smuzhiyun 	struct gpio_bank *bank = omap_irq_data_get_bank(data);
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun 	pm_runtime_get_sync(bank->chip.parent);
666*4882a593Smuzhiyun }
667*4882a593Smuzhiyun 
gpio_irq_bus_sync_unlock(struct irq_data * data)668*4882a593Smuzhiyun static void gpio_irq_bus_sync_unlock(struct irq_data *data)
669*4882a593Smuzhiyun {
670*4882a593Smuzhiyun 	struct gpio_bank *bank = omap_irq_data_get_bank(data);
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 	pm_runtime_put(bank->chip.parent);
673*4882a593Smuzhiyun }
674*4882a593Smuzhiyun 
omap_gpio_mask_irq(struct irq_data * d)675*4882a593Smuzhiyun static void omap_gpio_mask_irq(struct irq_data *d)
676*4882a593Smuzhiyun {
677*4882a593Smuzhiyun 	struct gpio_bank *bank = omap_irq_data_get_bank(d);
678*4882a593Smuzhiyun 	unsigned offset = d->hwirq;
679*4882a593Smuzhiyun 	unsigned long flags;
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
682*4882a593Smuzhiyun 	omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
683*4882a593Smuzhiyun 	omap_set_gpio_irqenable(bank, offset, 0);
684*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
685*4882a593Smuzhiyun }
686*4882a593Smuzhiyun 
omap_gpio_unmask_irq(struct irq_data * d)687*4882a593Smuzhiyun static void omap_gpio_unmask_irq(struct irq_data *d)
688*4882a593Smuzhiyun {
689*4882a593Smuzhiyun 	struct gpio_bank *bank = omap_irq_data_get_bank(d);
690*4882a593Smuzhiyun 	unsigned offset = d->hwirq;
691*4882a593Smuzhiyun 	u32 trigger = irqd_get_trigger_type(d);
692*4882a593Smuzhiyun 	unsigned long flags;
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
695*4882a593Smuzhiyun 	omap_set_gpio_irqenable(bank, offset, 1);
696*4882a593Smuzhiyun 
697*4882a593Smuzhiyun 	/*
698*4882a593Smuzhiyun 	 * For level-triggered GPIOs, clearing must be done after the source
699*4882a593Smuzhiyun 	 * is cleared, thus after the handler has run. OMAP4 needs this done
700*4882a593Smuzhiyun 	 * after enabing the interrupt to clear the wakeup status.
701*4882a593Smuzhiyun 	 */
702*4882a593Smuzhiyun 	if (bank->regs->leveldetect0 && bank->regs->wkup_en &&
703*4882a593Smuzhiyun 	    trigger & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW))
704*4882a593Smuzhiyun 		omap_clear_gpio_irqstatus(bank, offset);
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun 	if (trigger)
707*4882a593Smuzhiyun 		omap_set_gpio_triggering(bank, offset, trigger);
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun /*---------------------------------------------------------------------*/
713*4882a593Smuzhiyun 
omap_mpuio_suspend_noirq(struct device * dev)714*4882a593Smuzhiyun static int omap_mpuio_suspend_noirq(struct device *dev)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun 	struct gpio_bank	*bank = dev_get_drvdata(dev);
717*4882a593Smuzhiyun 	void __iomem		*mask_reg = bank->base +
718*4882a593Smuzhiyun 					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
719*4882a593Smuzhiyun 	unsigned long		flags;
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
722*4882a593Smuzhiyun 	writel_relaxed(0xffff & ~bank->context.wake_en, mask_reg);
723*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun 	return 0;
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun 
omap_mpuio_resume_noirq(struct device * dev)728*4882a593Smuzhiyun static int omap_mpuio_resume_noirq(struct device *dev)
729*4882a593Smuzhiyun {
730*4882a593Smuzhiyun 	struct gpio_bank	*bank = dev_get_drvdata(dev);
731*4882a593Smuzhiyun 	void __iomem		*mask_reg = bank->base +
732*4882a593Smuzhiyun 					OMAP_MPUIO_GPIO_MASKIT / bank->stride;
733*4882a593Smuzhiyun 	unsigned long		flags;
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
736*4882a593Smuzhiyun 	writel_relaxed(bank->context.wake_en, mask_reg);
737*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 	return 0;
740*4882a593Smuzhiyun }
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
743*4882a593Smuzhiyun 	.suspend_noirq = omap_mpuio_suspend_noirq,
744*4882a593Smuzhiyun 	.resume_noirq = omap_mpuio_resume_noirq,
745*4882a593Smuzhiyun };
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun /* use platform_driver for this. */
748*4882a593Smuzhiyun static struct platform_driver omap_mpuio_driver = {
749*4882a593Smuzhiyun 	.driver		= {
750*4882a593Smuzhiyun 		.name	= "mpuio",
751*4882a593Smuzhiyun 		.pm	= &omap_mpuio_dev_pm_ops,
752*4882a593Smuzhiyun 	},
753*4882a593Smuzhiyun };
754*4882a593Smuzhiyun 
755*4882a593Smuzhiyun static struct platform_device omap_mpuio_device = {
756*4882a593Smuzhiyun 	.name		= "mpuio",
757*4882a593Smuzhiyun 	.id		= -1,
758*4882a593Smuzhiyun 	.dev = {
759*4882a593Smuzhiyun 		.driver = &omap_mpuio_driver.driver,
760*4882a593Smuzhiyun 	}
761*4882a593Smuzhiyun 	/* could list the /proc/iomem resources */
762*4882a593Smuzhiyun };
763*4882a593Smuzhiyun 
omap_mpuio_init(struct gpio_bank * bank)764*4882a593Smuzhiyun static inline void omap_mpuio_init(struct gpio_bank *bank)
765*4882a593Smuzhiyun {
766*4882a593Smuzhiyun 	platform_set_drvdata(&omap_mpuio_device, bank);
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun 	if (platform_driver_register(&omap_mpuio_driver) == 0)
769*4882a593Smuzhiyun 		(void) platform_device_register(&omap_mpuio_device);
770*4882a593Smuzhiyun }
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun /*---------------------------------------------------------------------*/
773*4882a593Smuzhiyun 
omap_gpio_request(struct gpio_chip * chip,unsigned offset)774*4882a593Smuzhiyun static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
775*4882a593Smuzhiyun {
776*4882a593Smuzhiyun 	struct gpio_bank *bank = gpiochip_get_data(chip);
777*4882a593Smuzhiyun 	unsigned long flags;
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 	pm_runtime_get_sync(chip->parent);
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
782*4882a593Smuzhiyun 	omap_enable_gpio_module(bank, offset);
783*4882a593Smuzhiyun 	bank->mod_usage |= BIT(offset);
784*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 	return 0;
787*4882a593Smuzhiyun }
788*4882a593Smuzhiyun 
omap_gpio_free(struct gpio_chip * chip,unsigned offset)789*4882a593Smuzhiyun static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
790*4882a593Smuzhiyun {
791*4882a593Smuzhiyun 	struct gpio_bank *bank = gpiochip_get_data(chip);
792*4882a593Smuzhiyun 	unsigned long flags;
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
795*4882a593Smuzhiyun 	bank->mod_usage &= ~(BIT(offset));
796*4882a593Smuzhiyun 	if (!LINE_USED(bank->irq_usage, offset)) {
797*4882a593Smuzhiyun 		omap_set_gpio_direction(bank, offset, 1);
798*4882a593Smuzhiyun 		omap_clear_gpio_debounce(bank, offset);
799*4882a593Smuzhiyun 	}
800*4882a593Smuzhiyun 	omap_disable_gpio_module(bank, offset);
801*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun 	pm_runtime_put(chip->parent);
804*4882a593Smuzhiyun }
805*4882a593Smuzhiyun 
omap_gpio_get_direction(struct gpio_chip * chip,unsigned offset)806*4882a593Smuzhiyun static int omap_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
807*4882a593Smuzhiyun {
808*4882a593Smuzhiyun 	struct gpio_bank *bank = gpiochip_get_data(chip);
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun 	if (readl_relaxed(bank->base + bank->regs->direction) & BIT(offset))
811*4882a593Smuzhiyun 		return GPIO_LINE_DIRECTION_IN;
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun 	return GPIO_LINE_DIRECTION_OUT;
814*4882a593Smuzhiyun }
815*4882a593Smuzhiyun 
omap_gpio_input(struct gpio_chip * chip,unsigned offset)816*4882a593Smuzhiyun static int omap_gpio_input(struct gpio_chip *chip, unsigned offset)
817*4882a593Smuzhiyun {
818*4882a593Smuzhiyun 	struct gpio_bank *bank;
819*4882a593Smuzhiyun 	unsigned long flags;
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	bank = gpiochip_get_data(chip);
822*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
823*4882a593Smuzhiyun 	omap_set_gpio_direction(bank, offset, 1);
824*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
825*4882a593Smuzhiyun 	return 0;
826*4882a593Smuzhiyun }
827*4882a593Smuzhiyun 
omap_gpio_get(struct gpio_chip * chip,unsigned offset)828*4882a593Smuzhiyun static int omap_gpio_get(struct gpio_chip *chip, unsigned offset)
829*4882a593Smuzhiyun {
830*4882a593Smuzhiyun 	struct gpio_bank *bank = gpiochip_get_data(chip);
831*4882a593Smuzhiyun 	void __iomem *reg;
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun 	if (omap_gpio_is_input(bank, offset))
834*4882a593Smuzhiyun 		reg = bank->base + bank->regs->datain;
835*4882a593Smuzhiyun 	else
836*4882a593Smuzhiyun 		reg = bank->base + bank->regs->dataout;
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun 	return (readl_relaxed(reg) & BIT(offset)) != 0;
839*4882a593Smuzhiyun }
840*4882a593Smuzhiyun 
omap_gpio_output(struct gpio_chip * chip,unsigned offset,int value)841*4882a593Smuzhiyun static int omap_gpio_output(struct gpio_chip *chip, unsigned offset, int value)
842*4882a593Smuzhiyun {
843*4882a593Smuzhiyun 	struct gpio_bank *bank;
844*4882a593Smuzhiyun 	unsigned long flags;
845*4882a593Smuzhiyun 
846*4882a593Smuzhiyun 	bank = gpiochip_get_data(chip);
847*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
848*4882a593Smuzhiyun 	bank->set_dataout(bank, offset, value);
849*4882a593Smuzhiyun 	omap_set_gpio_direction(bank, offset, 0);
850*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
851*4882a593Smuzhiyun 	return 0;
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun 
omap_gpio_get_multiple(struct gpio_chip * chip,unsigned long * mask,unsigned long * bits)854*4882a593Smuzhiyun static int omap_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
855*4882a593Smuzhiyun 				  unsigned long *bits)
856*4882a593Smuzhiyun {
857*4882a593Smuzhiyun 	struct gpio_bank *bank = gpiochip_get_data(chip);
858*4882a593Smuzhiyun 	void __iomem *base = bank->base;
859*4882a593Smuzhiyun 	u32 direction, m, val = 0;
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	direction = readl_relaxed(base + bank->regs->direction);
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun 	m = direction & *mask;
864*4882a593Smuzhiyun 	if (m)
865*4882a593Smuzhiyun 		val |= readl_relaxed(base + bank->regs->datain) & m;
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 	m = ~direction & *mask;
868*4882a593Smuzhiyun 	if (m)
869*4882a593Smuzhiyun 		val |= readl_relaxed(base + bank->regs->dataout) & m;
870*4882a593Smuzhiyun 
871*4882a593Smuzhiyun 	*bits = val;
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	return 0;
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun 
omap_gpio_debounce(struct gpio_chip * chip,unsigned offset,unsigned debounce)876*4882a593Smuzhiyun static int omap_gpio_debounce(struct gpio_chip *chip, unsigned offset,
877*4882a593Smuzhiyun 			      unsigned debounce)
878*4882a593Smuzhiyun {
879*4882a593Smuzhiyun 	struct gpio_bank *bank;
880*4882a593Smuzhiyun 	unsigned long flags;
881*4882a593Smuzhiyun 	int ret;
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun 	bank = gpiochip_get_data(chip);
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
886*4882a593Smuzhiyun 	ret = omap2_set_gpio_debounce(bank, offset, debounce);
887*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun 	if (ret)
890*4882a593Smuzhiyun 		dev_info(chip->parent,
891*4882a593Smuzhiyun 			 "Could not set line %u debounce to %u microseconds (%d)",
892*4882a593Smuzhiyun 			 offset, debounce, ret);
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun 	return ret;
895*4882a593Smuzhiyun }
896*4882a593Smuzhiyun 
omap_gpio_set_config(struct gpio_chip * chip,unsigned offset,unsigned long config)897*4882a593Smuzhiyun static int omap_gpio_set_config(struct gpio_chip *chip, unsigned offset,
898*4882a593Smuzhiyun 				unsigned long config)
899*4882a593Smuzhiyun {
900*4882a593Smuzhiyun 	u32 debounce;
901*4882a593Smuzhiyun 	int ret = -ENOTSUPP;
902*4882a593Smuzhiyun 
903*4882a593Smuzhiyun 	switch (pinconf_to_config_param(config)) {
904*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_DISABLE:
905*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_UP:
906*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_DOWN:
907*4882a593Smuzhiyun 		ret = gpiochip_generic_config(chip, offset, config);
908*4882a593Smuzhiyun 		break;
909*4882a593Smuzhiyun 	case PIN_CONFIG_INPUT_DEBOUNCE:
910*4882a593Smuzhiyun 		debounce = pinconf_to_config_argument(config);
911*4882a593Smuzhiyun 		ret = omap_gpio_debounce(chip, offset, debounce);
912*4882a593Smuzhiyun 		break;
913*4882a593Smuzhiyun 	default:
914*4882a593Smuzhiyun 		break;
915*4882a593Smuzhiyun 	}
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun 	return ret;
918*4882a593Smuzhiyun }
919*4882a593Smuzhiyun 
omap_gpio_set(struct gpio_chip * chip,unsigned offset,int value)920*4882a593Smuzhiyun static void omap_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
921*4882a593Smuzhiyun {
922*4882a593Smuzhiyun 	struct gpio_bank *bank;
923*4882a593Smuzhiyun 	unsigned long flags;
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun 	bank = gpiochip_get_data(chip);
926*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
927*4882a593Smuzhiyun 	bank->set_dataout(bank, offset, value);
928*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
929*4882a593Smuzhiyun }
930*4882a593Smuzhiyun 
omap_gpio_set_multiple(struct gpio_chip * chip,unsigned long * mask,unsigned long * bits)931*4882a593Smuzhiyun static void omap_gpio_set_multiple(struct gpio_chip *chip, unsigned long *mask,
932*4882a593Smuzhiyun 				   unsigned long *bits)
933*4882a593Smuzhiyun {
934*4882a593Smuzhiyun 	struct gpio_bank *bank = gpiochip_get_data(chip);
935*4882a593Smuzhiyun 	void __iomem *reg = bank->base + bank->regs->dataout;
936*4882a593Smuzhiyun 	unsigned long flags;
937*4882a593Smuzhiyun 	u32 l;
938*4882a593Smuzhiyun 
939*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
940*4882a593Smuzhiyun 	l = (readl_relaxed(reg) & ~*mask) | (*bits & *mask);
941*4882a593Smuzhiyun 	writel_relaxed(l, reg);
942*4882a593Smuzhiyun 	bank->context.dataout = l;
943*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun /*---------------------------------------------------------------------*/
947*4882a593Smuzhiyun 
omap_gpio_show_rev(struct gpio_bank * bank)948*4882a593Smuzhiyun static void omap_gpio_show_rev(struct gpio_bank *bank)
949*4882a593Smuzhiyun {
950*4882a593Smuzhiyun 	static bool called;
951*4882a593Smuzhiyun 	u32 rev;
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun 	if (called || bank->regs->revision == USHRT_MAX)
954*4882a593Smuzhiyun 		return;
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun 	rev = readw_relaxed(bank->base + bank->regs->revision);
957*4882a593Smuzhiyun 	pr_info("OMAP GPIO hardware version %d.%d\n",
958*4882a593Smuzhiyun 		(rev >> 4) & 0x0f, rev & 0x0f);
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun 	called = true;
961*4882a593Smuzhiyun }
962*4882a593Smuzhiyun 
omap_gpio_mod_init(struct gpio_bank * bank)963*4882a593Smuzhiyun static void omap_gpio_mod_init(struct gpio_bank *bank)
964*4882a593Smuzhiyun {
965*4882a593Smuzhiyun 	void __iomem *base = bank->base;
966*4882a593Smuzhiyun 	u32 l = 0xffffffff;
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun 	if (bank->width == 16)
969*4882a593Smuzhiyun 		l = 0xffff;
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	if (bank->is_mpuio) {
972*4882a593Smuzhiyun 		writel_relaxed(l, bank->base + bank->regs->irqenable);
973*4882a593Smuzhiyun 		return;
974*4882a593Smuzhiyun 	}
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun 	omap_gpio_rmw(base + bank->regs->irqenable, l,
977*4882a593Smuzhiyun 		      bank->regs->irqenable_inv);
978*4882a593Smuzhiyun 	omap_gpio_rmw(base + bank->regs->irqstatus, l,
979*4882a593Smuzhiyun 		      !bank->regs->irqenable_inv);
980*4882a593Smuzhiyun 	if (bank->regs->debounce_en)
981*4882a593Smuzhiyun 		writel_relaxed(0, base + bank->regs->debounce_en);
982*4882a593Smuzhiyun 
983*4882a593Smuzhiyun 	/* Save OE default value (0xffffffff) in the context */
984*4882a593Smuzhiyun 	bank->context.oe = readl_relaxed(bank->base + bank->regs->direction);
985*4882a593Smuzhiyun 	 /* Initialize interface clk ungated, module enabled */
986*4882a593Smuzhiyun 	if (bank->regs->ctrl)
987*4882a593Smuzhiyun 		writel_relaxed(0, base + bank->regs->ctrl);
988*4882a593Smuzhiyun }
989*4882a593Smuzhiyun 
omap_gpio_chip_init(struct gpio_bank * bank,struct irq_chip * irqc)990*4882a593Smuzhiyun static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
991*4882a593Smuzhiyun {
992*4882a593Smuzhiyun 	struct gpio_irq_chip *irq;
993*4882a593Smuzhiyun 	static int gpio;
994*4882a593Smuzhiyun 	const char *label;
995*4882a593Smuzhiyun 	int irq_base = 0;
996*4882a593Smuzhiyun 	int ret;
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun 	/*
999*4882a593Smuzhiyun 	 * REVISIT eventually switch from OMAP-specific gpio structs
1000*4882a593Smuzhiyun 	 * over to the generic ones
1001*4882a593Smuzhiyun 	 */
1002*4882a593Smuzhiyun 	bank->chip.request = omap_gpio_request;
1003*4882a593Smuzhiyun 	bank->chip.free = omap_gpio_free;
1004*4882a593Smuzhiyun 	bank->chip.get_direction = omap_gpio_get_direction;
1005*4882a593Smuzhiyun 	bank->chip.direction_input = omap_gpio_input;
1006*4882a593Smuzhiyun 	bank->chip.get = omap_gpio_get;
1007*4882a593Smuzhiyun 	bank->chip.get_multiple = omap_gpio_get_multiple;
1008*4882a593Smuzhiyun 	bank->chip.direction_output = omap_gpio_output;
1009*4882a593Smuzhiyun 	bank->chip.set_config = omap_gpio_set_config;
1010*4882a593Smuzhiyun 	bank->chip.set = omap_gpio_set;
1011*4882a593Smuzhiyun 	bank->chip.set_multiple = omap_gpio_set_multiple;
1012*4882a593Smuzhiyun 	if (bank->is_mpuio) {
1013*4882a593Smuzhiyun 		bank->chip.label = "mpuio";
1014*4882a593Smuzhiyun 		if (bank->regs->wkup_en)
1015*4882a593Smuzhiyun 			bank->chip.parent = &omap_mpuio_device.dev;
1016*4882a593Smuzhiyun 		bank->chip.base = OMAP_MPUIO(0);
1017*4882a593Smuzhiyun 	} else {
1018*4882a593Smuzhiyun 		label = devm_kasprintf(bank->chip.parent, GFP_KERNEL, "gpio-%d-%d",
1019*4882a593Smuzhiyun 				       gpio, gpio + bank->width - 1);
1020*4882a593Smuzhiyun 		if (!label)
1021*4882a593Smuzhiyun 			return -ENOMEM;
1022*4882a593Smuzhiyun 		bank->chip.label = label;
1023*4882a593Smuzhiyun 		bank->chip.base = gpio;
1024*4882a593Smuzhiyun 	}
1025*4882a593Smuzhiyun 	bank->chip.ngpio = bank->width;
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun #ifdef CONFIG_ARCH_OMAP1
1028*4882a593Smuzhiyun 	/*
1029*4882a593Smuzhiyun 	 * REVISIT: Once we have OMAP1 supporting SPARSE_IRQ, we can drop
1030*4882a593Smuzhiyun 	 * irq_alloc_descs() since a base IRQ offset will no longer be needed.
1031*4882a593Smuzhiyun 	 */
1032*4882a593Smuzhiyun 	irq_base = devm_irq_alloc_descs(bank->chip.parent,
1033*4882a593Smuzhiyun 					-1, 0, bank->width, 0);
1034*4882a593Smuzhiyun 	if (irq_base < 0) {
1035*4882a593Smuzhiyun 		dev_err(bank->chip.parent, "Couldn't allocate IRQ numbers\n");
1036*4882a593Smuzhiyun 		return -ENODEV;
1037*4882a593Smuzhiyun 	}
1038*4882a593Smuzhiyun #endif
1039*4882a593Smuzhiyun 
1040*4882a593Smuzhiyun 	/* MPUIO is a bit different, reading IRQ status clears it */
1041*4882a593Smuzhiyun 	if (bank->is_mpuio && !bank->regs->wkup_en)
1042*4882a593Smuzhiyun 		irqc->irq_set_wake = NULL;
1043*4882a593Smuzhiyun 
1044*4882a593Smuzhiyun 	irq = &bank->chip.irq;
1045*4882a593Smuzhiyun 	irq->chip = irqc;
1046*4882a593Smuzhiyun 	irq->handler = handle_bad_irq;
1047*4882a593Smuzhiyun 	irq->default_type = IRQ_TYPE_NONE;
1048*4882a593Smuzhiyun 	irq->num_parents = 1;
1049*4882a593Smuzhiyun 	irq->parents = &bank->irq;
1050*4882a593Smuzhiyun 	irq->first = irq_base;
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun 	ret = gpiochip_add_data(&bank->chip, bank);
1053*4882a593Smuzhiyun 	if (ret) {
1054*4882a593Smuzhiyun 		dev_err(bank->chip.parent,
1055*4882a593Smuzhiyun 			"Could not register gpio chip %d\n", ret);
1056*4882a593Smuzhiyun 		return ret;
1057*4882a593Smuzhiyun 	}
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun 	ret = devm_request_irq(bank->chip.parent, bank->irq,
1060*4882a593Smuzhiyun 			       omap_gpio_irq_handler,
1061*4882a593Smuzhiyun 			       0, dev_name(bank->chip.parent), bank);
1062*4882a593Smuzhiyun 	if (ret)
1063*4882a593Smuzhiyun 		gpiochip_remove(&bank->chip);
1064*4882a593Smuzhiyun 
1065*4882a593Smuzhiyun 	if (!bank->is_mpuio)
1066*4882a593Smuzhiyun 		gpio += bank->width;
1067*4882a593Smuzhiyun 
1068*4882a593Smuzhiyun 	return ret;
1069*4882a593Smuzhiyun }
1070*4882a593Smuzhiyun 
omap_gpio_init_context(struct gpio_bank * p)1071*4882a593Smuzhiyun static void omap_gpio_init_context(struct gpio_bank *p)
1072*4882a593Smuzhiyun {
1073*4882a593Smuzhiyun 	const struct omap_gpio_reg_offs *regs = p->regs;
1074*4882a593Smuzhiyun 	void __iomem *base = p->base;
1075*4882a593Smuzhiyun 
1076*4882a593Smuzhiyun 	p->context.sysconfig	= readl_relaxed(base + regs->sysconfig);
1077*4882a593Smuzhiyun 	p->context.ctrl		= readl_relaxed(base + regs->ctrl);
1078*4882a593Smuzhiyun 	p->context.oe		= readl_relaxed(base + regs->direction);
1079*4882a593Smuzhiyun 	p->context.wake_en	= readl_relaxed(base + regs->wkup_en);
1080*4882a593Smuzhiyun 	p->context.leveldetect0	= readl_relaxed(base + regs->leveldetect0);
1081*4882a593Smuzhiyun 	p->context.leveldetect1	= readl_relaxed(base + regs->leveldetect1);
1082*4882a593Smuzhiyun 	p->context.risingdetect	= readl_relaxed(base + regs->risingdetect);
1083*4882a593Smuzhiyun 	p->context.fallingdetect = readl_relaxed(base + regs->fallingdetect);
1084*4882a593Smuzhiyun 	p->context.irqenable1	= readl_relaxed(base + regs->irqenable);
1085*4882a593Smuzhiyun 	p->context.irqenable2	= readl_relaxed(base + regs->irqenable2);
1086*4882a593Smuzhiyun 	p->context.dataout	= readl_relaxed(base + regs->dataout);
1087*4882a593Smuzhiyun 
1088*4882a593Smuzhiyun 	p->context_valid = true;
1089*4882a593Smuzhiyun }
1090*4882a593Smuzhiyun 
omap_gpio_restore_context(struct gpio_bank * bank)1091*4882a593Smuzhiyun static void omap_gpio_restore_context(struct gpio_bank *bank)
1092*4882a593Smuzhiyun {
1093*4882a593Smuzhiyun 	const struct omap_gpio_reg_offs *regs = bank->regs;
1094*4882a593Smuzhiyun 	void __iomem *base = bank->base;
1095*4882a593Smuzhiyun 
1096*4882a593Smuzhiyun 	writel_relaxed(bank->context.sysconfig, base + regs->sysconfig);
1097*4882a593Smuzhiyun 	writel_relaxed(bank->context.wake_en, base + regs->wkup_en);
1098*4882a593Smuzhiyun 	writel_relaxed(bank->context.ctrl, base + regs->ctrl);
1099*4882a593Smuzhiyun 	writel_relaxed(bank->context.leveldetect0, base + regs->leveldetect0);
1100*4882a593Smuzhiyun 	writel_relaxed(bank->context.leveldetect1, base + regs->leveldetect1);
1101*4882a593Smuzhiyun 	writel_relaxed(bank->context.risingdetect, base + regs->risingdetect);
1102*4882a593Smuzhiyun 	writel_relaxed(bank->context.fallingdetect, base + regs->fallingdetect);
1103*4882a593Smuzhiyun 	writel_relaxed(bank->context.dataout, base + regs->dataout);
1104*4882a593Smuzhiyun 	writel_relaxed(bank->context.oe, base + regs->direction);
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun 	if (bank->dbck_enable_mask) {
1107*4882a593Smuzhiyun 		writel_relaxed(bank->context.debounce, base + regs->debounce);
1108*4882a593Smuzhiyun 		writel_relaxed(bank->context.debounce_en,
1109*4882a593Smuzhiyun 			       base + regs->debounce_en);
1110*4882a593Smuzhiyun 	}
1111*4882a593Smuzhiyun 
1112*4882a593Smuzhiyun 	writel_relaxed(bank->context.irqenable1, base + regs->irqenable);
1113*4882a593Smuzhiyun 	writel_relaxed(bank->context.irqenable2, base + regs->irqenable2);
1114*4882a593Smuzhiyun }
1115*4882a593Smuzhiyun 
omap_gpio_idle(struct gpio_bank * bank,bool may_lose_context)1116*4882a593Smuzhiyun static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context)
1117*4882a593Smuzhiyun {
1118*4882a593Smuzhiyun 	struct device *dev = bank->chip.parent;
1119*4882a593Smuzhiyun 	void __iomem *base = bank->base;
1120*4882a593Smuzhiyun 	u32 mask, nowake;
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun 	bank->saved_datain = readl_relaxed(base + bank->regs->datain);
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun 	/* Save syconfig, it's runtime value can be different from init value */
1125*4882a593Smuzhiyun 	if (bank->loses_context)
1126*4882a593Smuzhiyun 		bank->context.sysconfig = readl_relaxed(base + bank->regs->sysconfig);
1127*4882a593Smuzhiyun 
1128*4882a593Smuzhiyun 	if (!bank->enabled_non_wakeup_gpios)
1129*4882a593Smuzhiyun 		goto update_gpio_context_count;
1130*4882a593Smuzhiyun 
1131*4882a593Smuzhiyun 	/* Check for pending EDGE_FALLING, ignore EDGE_BOTH */
1132*4882a593Smuzhiyun 	mask = bank->enabled_non_wakeup_gpios & bank->context.fallingdetect;
1133*4882a593Smuzhiyun 	mask &= ~bank->context.risingdetect;
1134*4882a593Smuzhiyun 	bank->saved_datain |= mask;
1135*4882a593Smuzhiyun 
1136*4882a593Smuzhiyun 	/* Check for pending EDGE_RISING, ignore EDGE_BOTH */
1137*4882a593Smuzhiyun 	mask = bank->enabled_non_wakeup_gpios & bank->context.risingdetect;
1138*4882a593Smuzhiyun 	mask &= ~bank->context.fallingdetect;
1139*4882a593Smuzhiyun 	bank->saved_datain &= ~mask;
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun 	if (!may_lose_context)
1142*4882a593Smuzhiyun 		goto update_gpio_context_count;
1143*4882a593Smuzhiyun 
1144*4882a593Smuzhiyun 	/*
1145*4882a593Smuzhiyun 	 * If going to OFF, remove triggering for all wkup domain
1146*4882a593Smuzhiyun 	 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
1147*4882a593Smuzhiyun 	 * generated.  See OMAP2420 Errata item 1.101.
1148*4882a593Smuzhiyun 	 */
1149*4882a593Smuzhiyun 	if (!bank->loses_context && bank->enabled_non_wakeup_gpios) {
1150*4882a593Smuzhiyun 		nowake = bank->enabled_non_wakeup_gpios;
1151*4882a593Smuzhiyun 		omap_gpio_rmw(base + bank->regs->fallingdetect, nowake, ~nowake);
1152*4882a593Smuzhiyun 		omap_gpio_rmw(base + bank->regs->risingdetect, nowake, ~nowake);
1153*4882a593Smuzhiyun 	}
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun update_gpio_context_count:
1156*4882a593Smuzhiyun 	if (bank->get_context_loss_count)
1157*4882a593Smuzhiyun 		bank->context_loss_count =
1158*4882a593Smuzhiyun 				bank->get_context_loss_count(dev);
1159*4882a593Smuzhiyun 
1160*4882a593Smuzhiyun 	omap_gpio_dbck_disable(bank);
1161*4882a593Smuzhiyun }
1162*4882a593Smuzhiyun 
omap_gpio_unidle(struct gpio_bank * bank)1163*4882a593Smuzhiyun static void omap_gpio_unidle(struct gpio_bank *bank)
1164*4882a593Smuzhiyun {
1165*4882a593Smuzhiyun 	struct device *dev = bank->chip.parent;
1166*4882a593Smuzhiyun 	u32 l = 0, gen, gen0, gen1;
1167*4882a593Smuzhiyun 	int c;
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun 	/*
1170*4882a593Smuzhiyun 	 * On the first resume during the probe, the context has not
1171*4882a593Smuzhiyun 	 * been initialised and so initialise it now. Also initialise
1172*4882a593Smuzhiyun 	 * the context loss count.
1173*4882a593Smuzhiyun 	 */
1174*4882a593Smuzhiyun 	if (bank->loses_context && !bank->context_valid) {
1175*4882a593Smuzhiyun 		omap_gpio_init_context(bank);
1176*4882a593Smuzhiyun 
1177*4882a593Smuzhiyun 		if (bank->get_context_loss_count)
1178*4882a593Smuzhiyun 			bank->context_loss_count =
1179*4882a593Smuzhiyun 				bank->get_context_loss_count(dev);
1180*4882a593Smuzhiyun 	}
1181*4882a593Smuzhiyun 
1182*4882a593Smuzhiyun 	omap_gpio_dbck_enable(bank);
1183*4882a593Smuzhiyun 
1184*4882a593Smuzhiyun 	if (bank->loses_context) {
1185*4882a593Smuzhiyun 		if (!bank->get_context_loss_count) {
1186*4882a593Smuzhiyun 			omap_gpio_restore_context(bank);
1187*4882a593Smuzhiyun 		} else {
1188*4882a593Smuzhiyun 			c = bank->get_context_loss_count(dev);
1189*4882a593Smuzhiyun 			if (c != bank->context_loss_count) {
1190*4882a593Smuzhiyun 				omap_gpio_restore_context(bank);
1191*4882a593Smuzhiyun 			} else {
1192*4882a593Smuzhiyun 				return;
1193*4882a593Smuzhiyun 			}
1194*4882a593Smuzhiyun 		}
1195*4882a593Smuzhiyun 	} else {
1196*4882a593Smuzhiyun 		/* Restore changes done for OMAP2420 errata 1.101 */
1197*4882a593Smuzhiyun 		writel_relaxed(bank->context.fallingdetect,
1198*4882a593Smuzhiyun 			       bank->base + bank->regs->fallingdetect);
1199*4882a593Smuzhiyun 		writel_relaxed(bank->context.risingdetect,
1200*4882a593Smuzhiyun 			       bank->base + bank->regs->risingdetect);
1201*4882a593Smuzhiyun 	}
1202*4882a593Smuzhiyun 
1203*4882a593Smuzhiyun 	l = readl_relaxed(bank->base + bank->regs->datain);
1204*4882a593Smuzhiyun 
1205*4882a593Smuzhiyun 	/*
1206*4882a593Smuzhiyun 	 * Check if any of the non-wakeup interrupt GPIOs have changed
1207*4882a593Smuzhiyun 	 * state.  If so, generate an IRQ by software.  This is
1208*4882a593Smuzhiyun 	 * horribly racy, but it's the best we can do to work around
1209*4882a593Smuzhiyun 	 * this silicon bug.
1210*4882a593Smuzhiyun 	 */
1211*4882a593Smuzhiyun 	l ^= bank->saved_datain;
1212*4882a593Smuzhiyun 	l &= bank->enabled_non_wakeup_gpios;
1213*4882a593Smuzhiyun 
1214*4882a593Smuzhiyun 	/*
1215*4882a593Smuzhiyun 	 * No need to generate IRQs for the rising edge for gpio IRQs
1216*4882a593Smuzhiyun 	 * configured with falling edge only; and vice versa.
1217*4882a593Smuzhiyun 	 */
1218*4882a593Smuzhiyun 	gen0 = l & bank->context.fallingdetect;
1219*4882a593Smuzhiyun 	gen0 &= bank->saved_datain;
1220*4882a593Smuzhiyun 
1221*4882a593Smuzhiyun 	gen1 = l & bank->context.risingdetect;
1222*4882a593Smuzhiyun 	gen1 &= ~(bank->saved_datain);
1223*4882a593Smuzhiyun 
1224*4882a593Smuzhiyun 	/* FIXME: Consider GPIO IRQs with level detections properly! */
1225*4882a593Smuzhiyun 	gen = l & (~(bank->context.fallingdetect) &
1226*4882a593Smuzhiyun 					 ~(bank->context.risingdetect));
1227*4882a593Smuzhiyun 	/* Consider all GPIO IRQs needed to be updated */
1228*4882a593Smuzhiyun 	gen |= gen0 | gen1;
1229*4882a593Smuzhiyun 
1230*4882a593Smuzhiyun 	if (gen) {
1231*4882a593Smuzhiyun 		u32 old0, old1;
1232*4882a593Smuzhiyun 
1233*4882a593Smuzhiyun 		old0 = readl_relaxed(bank->base + bank->regs->leveldetect0);
1234*4882a593Smuzhiyun 		old1 = readl_relaxed(bank->base + bank->regs->leveldetect1);
1235*4882a593Smuzhiyun 
1236*4882a593Smuzhiyun 		if (!bank->regs->irqstatus_raw0) {
1237*4882a593Smuzhiyun 			writel_relaxed(old0 | gen, bank->base +
1238*4882a593Smuzhiyun 						bank->regs->leveldetect0);
1239*4882a593Smuzhiyun 			writel_relaxed(old1 | gen, bank->base +
1240*4882a593Smuzhiyun 						bank->regs->leveldetect1);
1241*4882a593Smuzhiyun 		}
1242*4882a593Smuzhiyun 
1243*4882a593Smuzhiyun 		if (bank->regs->irqstatus_raw0) {
1244*4882a593Smuzhiyun 			writel_relaxed(old0 | l, bank->base +
1245*4882a593Smuzhiyun 						bank->regs->leveldetect0);
1246*4882a593Smuzhiyun 			writel_relaxed(old1 | l, bank->base +
1247*4882a593Smuzhiyun 						bank->regs->leveldetect1);
1248*4882a593Smuzhiyun 		}
1249*4882a593Smuzhiyun 		writel_relaxed(old0, bank->base + bank->regs->leveldetect0);
1250*4882a593Smuzhiyun 		writel_relaxed(old1, bank->base + bank->regs->leveldetect1);
1251*4882a593Smuzhiyun 	}
1252*4882a593Smuzhiyun }
1253*4882a593Smuzhiyun 
gpio_omap_cpu_notifier(struct notifier_block * nb,unsigned long cmd,void * v)1254*4882a593Smuzhiyun static int gpio_omap_cpu_notifier(struct notifier_block *nb,
1255*4882a593Smuzhiyun 				  unsigned long cmd, void *v)
1256*4882a593Smuzhiyun {
1257*4882a593Smuzhiyun 	struct gpio_bank *bank;
1258*4882a593Smuzhiyun 	unsigned long flags;
1259*4882a593Smuzhiyun 	int ret = NOTIFY_OK;
1260*4882a593Smuzhiyun 	u32 isr, mask;
1261*4882a593Smuzhiyun 
1262*4882a593Smuzhiyun 	bank = container_of(nb, struct gpio_bank, nb);
1263*4882a593Smuzhiyun 
1264*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
1265*4882a593Smuzhiyun 	if (bank->is_suspended)
1266*4882a593Smuzhiyun 		goto out_unlock;
1267*4882a593Smuzhiyun 
1268*4882a593Smuzhiyun 	switch (cmd) {
1269*4882a593Smuzhiyun 	case CPU_CLUSTER_PM_ENTER:
1270*4882a593Smuzhiyun 		mask = omap_get_gpio_irqbank_mask(bank);
1271*4882a593Smuzhiyun 		isr = readl_relaxed(bank->base + bank->regs->irqstatus) & mask;
1272*4882a593Smuzhiyun 		if (isr) {
1273*4882a593Smuzhiyun 			ret = NOTIFY_BAD;
1274*4882a593Smuzhiyun 			break;
1275*4882a593Smuzhiyun 		}
1276*4882a593Smuzhiyun 		omap_gpio_idle(bank, true);
1277*4882a593Smuzhiyun 		break;
1278*4882a593Smuzhiyun 	case CPU_CLUSTER_PM_ENTER_FAILED:
1279*4882a593Smuzhiyun 	case CPU_CLUSTER_PM_EXIT:
1280*4882a593Smuzhiyun 		omap_gpio_unidle(bank);
1281*4882a593Smuzhiyun 		break;
1282*4882a593Smuzhiyun 	}
1283*4882a593Smuzhiyun 
1284*4882a593Smuzhiyun out_unlock:
1285*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
1286*4882a593Smuzhiyun 
1287*4882a593Smuzhiyun 	return ret;
1288*4882a593Smuzhiyun }
1289*4882a593Smuzhiyun 
1290*4882a593Smuzhiyun static const struct omap_gpio_reg_offs omap2_gpio_regs = {
1291*4882a593Smuzhiyun 	.revision =		OMAP24XX_GPIO_REVISION,
1292*4882a593Smuzhiyun 	.sysconfig =		OMAP24XX_GPIO_SYSCONFIG,
1293*4882a593Smuzhiyun 	.direction =		OMAP24XX_GPIO_OE,
1294*4882a593Smuzhiyun 	.datain =		OMAP24XX_GPIO_DATAIN,
1295*4882a593Smuzhiyun 	.dataout =		OMAP24XX_GPIO_DATAOUT,
1296*4882a593Smuzhiyun 	.set_dataout =		OMAP24XX_GPIO_SETDATAOUT,
1297*4882a593Smuzhiyun 	.clr_dataout =		OMAP24XX_GPIO_CLEARDATAOUT,
1298*4882a593Smuzhiyun 	.irqstatus =		OMAP24XX_GPIO_IRQSTATUS1,
1299*4882a593Smuzhiyun 	.irqstatus2 =		OMAP24XX_GPIO_IRQSTATUS2,
1300*4882a593Smuzhiyun 	.irqenable =		OMAP24XX_GPIO_IRQENABLE1,
1301*4882a593Smuzhiyun 	.irqenable2 =		OMAP24XX_GPIO_IRQENABLE2,
1302*4882a593Smuzhiyun 	.set_irqenable =	OMAP24XX_GPIO_SETIRQENABLE1,
1303*4882a593Smuzhiyun 	.clr_irqenable =	OMAP24XX_GPIO_CLEARIRQENABLE1,
1304*4882a593Smuzhiyun 	.debounce =		OMAP24XX_GPIO_DEBOUNCE_VAL,
1305*4882a593Smuzhiyun 	.debounce_en =		OMAP24XX_GPIO_DEBOUNCE_EN,
1306*4882a593Smuzhiyun 	.ctrl =			OMAP24XX_GPIO_CTRL,
1307*4882a593Smuzhiyun 	.wkup_en =		OMAP24XX_GPIO_WAKE_EN,
1308*4882a593Smuzhiyun 	.leveldetect0 =		OMAP24XX_GPIO_LEVELDETECT0,
1309*4882a593Smuzhiyun 	.leveldetect1 =		OMAP24XX_GPIO_LEVELDETECT1,
1310*4882a593Smuzhiyun 	.risingdetect =		OMAP24XX_GPIO_RISINGDETECT,
1311*4882a593Smuzhiyun 	.fallingdetect =	OMAP24XX_GPIO_FALLINGDETECT,
1312*4882a593Smuzhiyun };
1313*4882a593Smuzhiyun 
1314*4882a593Smuzhiyun static const struct omap_gpio_reg_offs omap4_gpio_regs = {
1315*4882a593Smuzhiyun 	.revision =		OMAP4_GPIO_REVISION,
1316*4882a593Smuzhiyun 	.sysconfig =		OMAP4_GPIO_SYSCONFIG,
1317*4882a593Smuzhiyun 	.direction =		OMAP4_GPIO_OE,
1318*4882a593Smuzhiyun 	.datain =		OMAP4_GPIO_DATAIN,
1319*4882a593Smuzhiyun 	.dataout =		OMAP4_GPIO_DATAOUT,
1320*4882a593Smuzhiyun 	.set_dataout =		OMAP4_GPIO_SETDATAOUT,
1321*4882a593Smuzhiyun 	.clr_dataout =		OMAP4_GPIO_CLEARDATAOUT,
1322*4882a593Smuzhiyun 	.irqstatus =		OMAP4_GPIO_IRQSTATUS0,
1323*4882a593Smuzhiyun 	.irqstatus2 =		OMAP4_GPIO_IRQSTATUS1,
1324*4882a593Smuzhiyun 	.irqstatus_raw0 =	OMAP4_GPIO_IRQSTATUSRAW0,
1325*4882a593Smuzhiyun 	.irqstatus_raw1 =	OMAP4_GPIO_IRQSTATUSRAW1,
1326*4882a593Smuzhiyun 	.irqenable =		OMAP4_GPIO_IRQSTATUSSET0,
1327*4882a593Smuzhiyun 	.irqenable2 =		OMAP4_GPIO_IRQSTATUSSET1,
1328*4882a593Smuzhiyun 	.set_irqenable =	OMAP4_GPIO_IRQSTATUSSET0,
1329*4882a593Smuzhiyun 	.clr_irqenable =	OMAP4_GPIO_IRQSTATUSCLR0,
1330*4882a593Smuzhiyun 	.debounce =		OMAP4_GPIO_DEBOUNCINGTIME,
1331*4882a593Smuzhiyun 	.debounce_en =		OMAP4_GPIO_DEBOUNCENABLE,
1332*4882a593Smuzhiyun 	.ctrl =			OMAP4_GPIO_CTRL,
1333*4882a593Smuzhiyun 	.wkup_en =		OMAP4_GPIO_IRQWAKEN0,
1334*4882a593Smuzhiyun 	.leveldetect0 =		OMAP4_GPIO_LEVELDETECT0,
1335*4882a593Smuzhiyun 	.leveldetect1 =		OMAP4_GPIO_LEVELDETECT1,
1336*4882a593Smuzhiyun 	.risingdetect =		OMAP4_GPIO_RISINGDETECT,
1337*4882a593Smuzhiyun 	.fallingdetect =	OMAP4_GPIO_FALLINGDETECT,
1338*4882a593Smuzhiyun };
1339*4882a593Smuzhiyun 
1340*4882a593Smuzhiyun static const struct omap_gpio_platform_data omap2_pdata = {
1341*4882a593Smuzhiyun 	.regs = &omap2_gpio_regs,
1342*4882a593Smuzhiyun 	.bank_width = 32,
1343*4882a593Smuzhiyun 	.dbck_flag = false,
1344*4882a593Smuzhiyun };
1345*4882a593Smuzhiyun 
1346*4882a593Smuzhiyun static const struct omap_gpio_platform_data omap3_pdata = {
1347*4882a593Smuzhiyun 	.regs = &omap2_gpio_regs,
1348*4882a593Smuzhiyun 	.bank_width = 32,
1349*4882a593Smuzhiyun 	.dbck_flag = true,
1350*4882a593Smuzhiyun };
1351*4882a593Smuzhiyun 
1352*4882a593Smuzhiyun static const struct omap_gpio_platform_data omap4_pdata = {
1353*4882a593Smuzhiyun 	.regs = &omap4_gpio_regs,
1354*4882a593Smuzhiyun 	.bank_width = 32,
1355*4882a593Smuzhiyun 	.dbck_flag = true,
1356*4882a593Smuzhiyun };
1357*4882a593Smuzhiyun 
1358*4882a593Smuzhiyun static const struct of_device_id omap_gpio_match[] = {
1359*4882a593Smuzhiyun 	{
1360*4882a593Smuzhiyun 		.compatible = "ti,omap4-gpio",
1361*4882a593Smuzhiyun 		.data = &omap4_pdata,
1362*4882a593Smuzhiyun 	},
1363*4882a593Smuzhiyun 	{
1364*4882a593Smuzhiyun 		.compatible = "ti,omap3-gpio",
1365*4882a593Smuzhiyun 		.data = &omap3_pdata,
1366*4882a593Smuzhiyun 	},
1367*4882a593Smuzhiyun 	{
1368*4882a593Smuzhiyun 		.compatible = "ti,omap2-gpio",
1369*4882a593Smuzhiyun 		.data = &omap2_pdata,
1370*4882a593Smuzhiyun 	},
1371*4882a593Smuzhiyun 	{ },
1372*4882a593Smuzhiyun };
1373*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, omap_gpio_match);
1374*4882a593Smuzhiyun 
omap_gpio_probe(struct platform_device * pdev)1375*4882a593Smuzhiyun static int omap_gpio_probe(struct platform_device *pdev)
1376*4882a593Smuzhiyun {
1377*4882a593Smuzhiyun 	struct device *dev = &pdev->dev;
1378*4882a593Smuzhiyun 	struct device_node *node = dev->of_node;
1379*4882a593Smuzhiyun 	const struct of_device_id *match;
1380*4882a593Smuzhiyun 	const struct omap_gpio_platform_data *pdata;
1381*4882a593Smuzhiyun 	struct gpio_bank *bank;
1382*4882a593Smuzhiyun 	struct irq_chip *irqc;
1383*4882a593Smuzhiyun 	int ret;
1384*4882a593Smuzhiyun 
1385*4882a593Smuzhiyun 	match = of_match_device(of_match_ptr(omap_gpio_match), dev);
1386*4882a593Smuzhiyun 
1387*4882a593Smuzhiyun 	pdata = match ? match->data : dev_get_platdata(dev);
1388*4882a593Smuzhiyun 	if (!pdata)
1389*4882a593Smuzhiyun 		return -EINVAL;
1390*4882a593Smuzhiyun 
1391*4882a593Smuzhiyun 	bank = devm_kzalloc(dev, sizeof(*bank), GFP_KERNEL);
1392*4882a593Smuzhiyun 	if (!bank)
1393*4882a593Smuzhiyun 		return -ENOMEM;
1394*4882a593Smuzhiyun 
1395*4882a593Smuzhiyun 	irqc = devm_kzalloc(dev, sizeof(*irqc), GFP_KERNEL);
1396*4882a593Smuzhiyun 	if (!irqc)
1397*4882a593Smuzhiyun 		return -ENOMEM;
1398*4882a593Smuzhiyun 
1399*4882a593Smuzhiyun 	irqc->irq_startup = omap_gpio_irq_startup,
1400*4882a593Smuzhiyun 	irqc->irq_shutdown = omap_gpio_irq_shutdown,
1401*4882a593Smuzhiyun 	irqc->irq_ack = dummy_irq_chip.irq_ack,
1402*4882a593Smuzhiyun 	irqc->irq_mask = omap_gpio_mask_irq,
1403*4882a593Smuzhiyun 	irqc->irq_unmask = omap_gpio_unmask_irq,
1404*4882a593Smuzhiyun 	irqc->irq_set_type = omap_gpio_irq_type,
1405*4882a593Smuzhiyun 	irqc->irq_set_wake = omap_gpio_wake_enable,
1406*4882a593Smuzhiyun 	irqc->irq_bus_lock = omap_gpio_irq_bus_lock,
1407*4882a593Smuzhiyun 	irqc->irq_bus_sync_unlock = gpio_irq_bus_sync_unlock,
1408*4882a593Smuzhiyun 	irqc->name = dev_name(&pdev->dev);
1409*4882a593Smuzhiyun 	irqc->flags = IRQCHIP_MASK_ON_SUSPEND;
1410*4882a593Smuzhiyun 	irqc->parent_device = dev;
1411*4882a593Smuzhiyun 
1412*4882a593Smuzhiyun 	bank->irq = platform_get_irq(pdev, 0);
1413*4882a593Smuzhiyun 	if (bank->irq <= 0) {
1414*4882a593Smuzhiyun 		if (!bank->irq)
1415*4882a593Smuzhiyun 			bank->irq = -ENXIO;
1416*4882a593Smuzhiyun 		return dev_err_probe(dev, bank->irq, "can't get irq resource\n");
1417*4882a593Smuzhiyun 	}
1418*4882a593Smuzhiyun 
1419*4882a593Smuzhiyun 	bank->chip.parent = dev;
1420*4882a593Smuzhiyun 	bank->chip.owner = THIS_MODULE;
1421*4882a593Smuzhiyun 	bank->dbck_flag = pdata->dbck_flag;
1422*4882a593Smuzhiyun 	bank->stride = pdata->bank_stride;
1423*4882a593Smuzhiyun 	bank->width = pdata->bank_width;
1424*4882a593Smuzhiyun 	bank->is_mpuio = pdata->is_mpuio;
1425*4882a593Smuzhiyun 	bank->non_wakeup_gpios = pdata->non_wakeup_gpios;
1426*4882a593Smuzhiyun 	bank->regs = pdata->regs;
1427*4882a593Smuzhiyun #ifdef CONFIG_OF_GPIO
1428*4882a593Smuzhiyun 	bank->chip.of_node = of_node_get(node);
1429*4882a593Smuzhiyun #endif
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun 	if (node) {
1432*4882a593Smuzhiyun 		if (!of_property_read_bool(node, "ti,gpio-always-on"))
1433*4882a593Smuzhiyun 			bank->loses_context = true;
1434*4882a593Smuzhiyun 	} else {
1435*4882a593Smuzhiyun 		bank->loses_context = pdata->loses_context;
1436*4882a593Smuzhiyun 
1437*4882a593Smuzhiyun 		if (bank->loses_context)
1438*4882a593Smuzhiyun 			bank->get_context_loss_count =
1439*4882a593Smuzhiyun 				pdata->get_context_loss_count;
1440*4882a593Smuzhiyun 	}
1441*4882a593Smuzhiyun 
1442*4882a593Smuzhiyun 	if (bank->regs->set_dataout && bank->regs->clr_dataout)
1443*4882a593Smuzhiyun 		bank->set_dataout = omap_set_gpio_dataout_reg;
1444*4882a593Smuzhiyun 	else
1445*4882a593Smuzhiyun 		bank->set_dataout = omap_set_gpio_dataout_mask;
1446*4882a593Smuzhiyun 
1447*4882a593Smuzhiyun 	raw_spin_lock_init(&bank->lock);
1448*4882a593Smuzhiyun 	raw_spin_lock_init(&bank->wa_lock);
1449*4882a593Smuzhiyun 
1450*4882a593Smuzhiyun 	/* Static mapping, never released */
1451*4882a593Smuzhiyun 	bank->base = devm_platform_ioremap_resource(pdev, 0);
1452*4882a593Smuzhiyun 	if (IS_ERR(bank->base)) {
1453*4882a593Smuzhiyun 		return PTR_ERR(bank->base);
1454*4882a593Smuzhiyun 	}
1455*4882a593Smuzhiyun 
1456*4882a593Smuzhiyun 	if (bank->dbck_flag) {
1457*4882a593Smuzhiyun 		bank->dbck = devm_clk_get(dev, "dbclk");
1458*4882a593Smuzhiyun 		if (IS_ERR(bank->dbck)) {
1459*4882a593Smuzhiyun 			dev_err(dev,
1460*4882a593Smuzhiyun 				"Could not get gpio dbck. Disable debounce\n");
1461*4882a593Smuzhiyun 			bank->dbck_flag = false;
1462*4882a593Smuzhiyun 		} else {
1463*4882a593Smuzhiyun 			clk_prepare(bank->dbck);
1464*4882a593Smuzhiyun 		}
1465*4882a593Smuzhiyun 	}
1466*4882a593Smuzhiyun 
1467*4882a593Smuzhiyun 	platform_set_drvdata(pdev, bank);
1468*4882a593Smuzhiyun 
1469*4882a593Smuzhiyun 	pm_runtime_enable(dev);
1470*4882a593Smuzhiyun 	pm_runtime_get_sync(dev);
1471*4882a593Smuzhiyun 
1472*4882a593Smuzhiyun 	if (bank->is_mpuio)
1473*4882a593Smuzhiyun 		omap_mpuio_init(bank);
1474*4882a593Smuzhiyun 
1475*4882a593Smuzhiyun 	omap_gpio_mod_init(bank);
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun 	ret = omap_gpio_chip_init(bank, irqc);
1478*4882a593Smuzhiyun 	if (ret) {
1479*4882a593Smuzhiyun 		pm_runtime_put_sync(dev);
1480*4882a593Smuzhiyun 		pm_runtime_disable(dev);
1481*4882a593Smuzhiyun 		if (bank->dbck_flag)
1482*4882a593Smuzhiyun 			clk_unprepare(bank->dbck);
1483*4882a593Smuzhiyun 		return ret;
1484*4882a593Smuzhiyun 	}
1485*4882a593Smuzhiyun 
1486*4882a593Smuzhiyun 	omap_gpio_show_rev(bank);
1487*4882a593Smuzhiyun 
1488*4882a593Smuzhiyun 	bank->nb.notifier_call = gpio_omap_cpu_notifier;
1489*4882a593Smuzhiyun 	cpu_pm_register_notifier(&bank->nb);
1490*4882a593Smuzhiyun 
1491*4882a593Smuzhiyun 	pm_runtime_put(dev);
1492*4882a593Smuzhiyun 
1493*4882a593Smuzhiyun 	return 0;
1494*4882a593Smuzhiyun }
1495*4882a593Smuzhiyun 
omap_gpio_remove(struct platform_device * pdev)1496*4882a593Smuzhiyun static int omap_gpio_remove(struct platform_device *pdev)
1497*4882a593Smuzhiyun {
1498*4882a593Smuzhiyun 	struct gpio_bank *bank = platform_get_drvdata(pdev);
1499*4882a593Smuzhiyun 
1500*4882a593Smuzhiyun 	cpu_pm_unregister_notifier(&bank->nb);
1501*4882a593Smuzhiyun 	gpiochip_remove(&bank->chip);
1502*4882a593Smuzhiyun 	pm_runtime_disable(&pdev->dev);
1503*4882a593Smuzhiyun 	if (bank->dbck_flag)
1504*4882a593Smuzhiyun 		clk_unprepare(bank->dbck);
1505*4882a593Smuzhiyun 
1506*4882a593Smuzhiyun 	return 0;
1507*4882a593Smuzhiyun }
1508*4882a593Smuzhiyun 
omap_gpio_runtime_suspend(struct device * dev)1509*4882a593Smuzhiyun static int __maybe_unused omap_gpio_runtime_suspend(struct device *dev)
1510*4882a593Smuzhiyun {
1511*4882a593Smuzhiyun 	struct gpio_bank *bank = dev_get_drvdata(dev);
1512*4882a593Smuzhiyun 	unsigned long flags;
1513*4882a593Smuzhiyun 
1514*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
1515*4882a593Smuzhiyun 	omap_gpio_idle(bank, true);
1516*4882a593Smuzhiyun 	bank->is_suspended = true;
1517*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
1518*4882a593Smuzhiyun 
1519*4882a593Smuzhiyun 	return 0;
1520*4882a593Smuzhiyun }
1521*4882a593Smuzhiyun 
omap_gpio_runtime_resume(struct device * dev)1522*4882a593Smuzhiyun static int __maybe_unused omap_gpio_runtime_resume(struct device *dev)
1523*4882a593Smuzhiyun {
1524*4882a593Smuzhiyun 	struct gpio_bank *bank = dev_get_drvdata(dev);
1525*4882a593Smuzhiyun 	unsigned long flags;
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun 	raw_spin_lock_irqsave(&bank->lock, flags);
1528*4882a593Smuzhiyun 	omap_gpio_unidle(bank);
1529*4882a593Smuzhiyun 	bank->is_suspended = false;
1530*4882a593Smuzhiyun 	raw_spin_unlock_irqrestore(&bank->lock, flags);
1531*4882a593Smuzhiyun 
1532*4882a593Smuzhiyun 	return 0;
1533*4882a593Smuzhiyun }
1534*4882a593Smuzhiyun 
omap_gpio_suspend(struct device * dev)1535*4882a593Smuzhiyun static int __maybe_unused omap_gpio_suspend(struct device *dev)
1536*4882a593Smuzhiyun {
1537*4882a593Smuzhiyun 	struct gpio_bank *bank = dev_get_drvdata(dev);
1538*4882a593Smuzhiyun 
1539*4882a593Smuzhiyun 	if (bank->is_suspended)
1540*4882a593Smuzhiyun 		return 0;
1541*4882a593Smuzhiyun 
1542*4882a593Smuzhiyun 	bank->needs_resume = 1;
1543*4882a593Smuzhiyun 
1544*4882a593Smuzhiyun 	return omap_gpio_runtime_suspend(dev);
1545*4882a593Smuzhiyun }
1546*4882a593Smuzhiyun 
omap_gpio_resume(struct device * dev)1547*4882a593Smuzhiyun static int __maybe_unused omap_gpio_resume(struct device *dev)
1548*4882a593Smuzhiyun {
1549*4882a593Smuzhiyun 	struct gpio_bank *bank = dev_get_drvdata(dev);
1550*4882a593Smuzhiyun 
1551*4882a593Smuzhiyun 	if (!bank->needs_resume)
1552*4882a593Smuzhiyun 		return 0;
1553*4882a593Smuzhiyun 
1554*4882a593Smuzhiyun 	bank->needs_resume = 0;
1555*4882a593Smuzhiyun 
1556*4882a593Smuzhiyun 	return omap_gpio_runtime_resume(dev);
1557*4882a593Smuzhiyun }
1558*4882a593Smuzhiyun 
1559*4882a593Smuzhiyun static const struct dev_pm_ops gpio_pm_ops = {
1560*4882a593Smuzhiyun 	SET_RUNTIME_PM_OPS(omap_gpio_runtime_suspend, omap_gpio_runtime_resume,
1561*4882a593Smuzhiyun 									NULL)
1562*4882a593Smuzhiyun 	SET_LATE_SYSTEM_SLEEP_PM_OPS(omap_gpio_suspend, omap_gpio_resume)
1563*4882a593Smuzhiyun };
1564*4882a593Smuzhiyun 
1565*4882a593Smuzhiyun static struct platform_driver omap_gpio_driver = {
1566*4882a593Smuzhiyun 	.probe		= omap_gpio_probe,
1567*4882a593Smuzhiyun 	.remove		= omap_gpio_remove,
1568*4882a593Smuzhiyun 	.driver		= {
1569*4882a593Smuzhiyun 		.name	= "omap_gpio",
1570*4882a593Smuzhiyun 		.pm	= &gpio_pm_ops,
1571*4882a593Smuzhiyun 		.of_match_table = omap_gpio_match,
1572*4882a593Smuzhiyun 	},
1573*4882a593Smuzhiyun };
1574*4882a593Smuzhiyun 
1575*4882a593Smuzhiyun /*
1576*4882a593Smuzhiyun  * gpio driver register needs to be done before
1577*4882a593Smuzhiyun  * machine_init functions access gpio APIs.
1578*4882a593Smuzhiyun  * Hence omap_gpio_drv_reg() is a postcore_initcall.
1579*4882a593Smuzhiyun  */
omap_gpio_drv_reg(void)1580*4882a593Smuzhiyun static int __init omap_gpio_drv_reg(void)
1581*4882a593Smuzhiyun {
1582*4882a593Smuzhiyun 	return platform_driver_register(&omap_gpio_driver);
1583*4882a593Smuzhiyun }
1584*4882a593Smuzhiyun postcore_initcall(omap_gpio_drv_reg);
1585*4882a593Smuzhiyun 
omap_gpio_exit(void)1586*4882a593Smuzhiyun static void __exit omap_gpio_exit(void)
1587*4882a593Smuzhiyun {
1588*4882a593Smuzhiyun 	platform_driver_unregister(&omap_gpio_driver);
1589*4882a593Smuzhiyun }
1590*4882a593Smuzhiyun module_exit(omap_gpio_exit);
1591*4882a593Smuzhiyun 
1592*4882a593Smuzhiyun MODULE_DESCRIPTION("omap gpio driver");
1593*4882a593Smuzhiyun MODULE_ALIAS("platform:gpio-omap");
1594*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
1595