xref: /OK3568_Linux_fs/kernel/drivers/gpio/gpio-eic-sprd.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2018 Spreadtrum Communications Inc.
4*4882a593Smuzhiyun  * Copyright (C) 2018 Linaro Ltd.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/bitops.h>
8*4882a593Smuzhiyun #include <linux/gpio/driver.h>
9*4882a593Smuzhiyun #include <linux/interrupt.h>
10*4882a593Smuzhiyun #include <linux/kernel.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/of_device.h>
13*4882a593Smuzhiyun #include <linux/platform_device.h>
14*4882a593Smuzhiyun #include <linux/spinlock.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* EIC registers definition */
17*4882a593Smuzhiyun #define SPRD_EIC_DBNC_DATA		0x0
18*4882a593Smuzhiyun #define SPRD_EIC_DBNC_DMSK		0x4
19*4882a593Smuzhiyun #define SPRD_EIC_DBNC_IEV		0x14
20*4882a593Smuzhiyun #define SPRD_EIC_DBNC_IE		0x18
21*4882a593Smuzhiyun #define SPRD_EIC_DBNC_RIS		0x1c
22*4882a593Smuzhiyun #define SPRD_EIC_DBNC_MIS		0x20
23*4882a593Smuzhiyun #define SPRD_EIC_DBNC_IC		0x24
24*4882a593Smuzhiyun #define SPRD_EIC_DBNC_TRIG		0x28
25*4882a593Smuzhiyun #define SPRD_EIC_DBNC_CTRL0		0x40
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define SPRD_EIC_LATCH_INTEN		0x0
28*4882a593Smuzhiyun #define SPRD_EIC_LATCH_INTRAW		0x4
29*4882a593Smuzhiyun #define SPRD_EIC_LATCH_INTMSK		0x8
30*4882a593Smuzhiyun #define SPRD_EIC_LATCH_INTCLR		0xc
31*4882a593Smuzhiyun #define SPRD_EIC_LATCH_INTPOL		0x10
32*4882a593Smuzhiyun #define SPRD_EIC_LATCH_INTMODE		0x14
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define SPRD_EIC_ASYNC_INTIE		0x0
35*4882a593Smuzhiyun #define SPRD_EIC_ASYNC_INTRAW		0x4
36*4882a593Smuzhiyun #define SPRD_EIC_ASYNC_INTMSK		0x8
37*4882a593Smuzhiyun #define SPRD_EIC_ASYNC_INTCLR		0xc
38*4882a593Smuzhiyun #define SPRD_EIC_ASYNC_INTMODE		0x10
39*4882a593Smuzhiyun #define SPRD_EIC_ASYNC_INTBOTH		0x14
40*4882a593Smuzhiyun #define SPRD_EIC_ASYNC_INTPOL		0x18
41*4882a593Smuzhiyun #define SPRD_EIC_ASYNC_DATA		0x1c
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define SPRD_EIC_SYNC_INTIE		0x0
44*4882a593Smuzhiyun #define SPRD_EIC_SYNC_INTRAW		0x4
45*4882a593Smuzhiyun #define SPRD_EIC_SYNC_INTMSK		0x8
46*4882a593Smuzhiyun #define SPRD_EIC_SYNC_INTCLR		0xc
47*4882a593Smuzhiyun #define SPRD_EIC_SYNC_INTMODE		0x10
48*4882a593Smuzhiyun #define SPRD_EIC_SYNC_INTBOTH		0x14
49*4882a593Smuzhiyun #define SPRD_EIC_SYNC_INTPOL		0x18
50*4882a593Smuzhiyun #define SPRD_EIC_SYNC_DATA		0x1c
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /*
53*4882a593Smuzhiyun  * The digital-chip EIC controller can support maximum 3 banks, and each bank
54*4882a593Smuzhiyun  * contains 8 EICs.
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun #define SPRD_EIC_MAX_BANK		3
57*4882a593Smuzhiyun #define SPRD_EIC_PER_BANK_NR		8
58*4882a593Smuzhiyun #define SPRD_EIC_DATA_MASK		GENMASK(7, 0)
59*4882a593Smuzhiyun #define SPRD_EIC_BIT(x)			((x) & (SPRD_EIC_PER_BANK_NR - 1))
60*4882a593Smuzhiyun #define SPRD_EIC_DBNC_MASK		GENMASK(11, 0)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun  * The Spreadtrum EIC (external interrupt controller) can be used only in
64*4882a593Smuzhiyun  * input mode to generate interrupts if detecting input signals.
65*4882a593Smuzhiyun  *
66*4882a593Smuzhiyun  * The Spreadtrum digital-chip EIC controller contains 4 sub-modules:
67*4882a593Smuzhiyun  * debounce EIC, latch EIC, async EIC and sync EIC,
68*4882a593Smuzhiyun  *
69*4882a593Smuzhiyun  * The debounce EIC is used to capture the input signals' stable status
70*4882a593Smuzhiyun  * (millisecond resolution) and a single-trigger mechanism is introduced
71*4882a593Smuzhiyun  * into this sub-module to enhance the input event detection reliability.
72*4882a593Smuzhiyun  * The debounce range is from 1ms to 4s with a step size of 1ms.
73*4882a593Smuzhiyun  *
74*4882a593Smuzhiyun  * The latch EIC is used to latch some special power down signals and
75*4882a593Smuzhiyun  * generate interrupts, since the latch EIC does not depend on the APB clock
76*4882a593Smuzhiyun  * to capture signals.
77*4882a593Smuzhiyun  *
78*4882a593Smuzhiyun  * The async EIC uses a 32k clock to capture the short signals (microsecond
79*4882a593Smuzhiyun  * resolution) to generate interrupts by level or edge trigger.
80*4882a593Smuzhiyun  *
81*4882a593Smuzhiyun  * The EIC-sync is similar with GPIO's input function, which is a synchronized
82*4882a593Smuzhiyun  * signal input register.
83*4882a593Smuzhiyun  */
84*4882a593Smuzhiyun enum sprd_eic_type {
85*4882a593Smuzhiyun 	SPRD_EIC_DEBOUNCE,
86*4882a593Smuzhiyun 	SPRD_EIC_LATCH,
87*4882a593Smuzhiyun 	SPRD_EIC_ASYNC,
88*4882a593Smuzhiyun 	SPRD_EIC_SYNC,
89*4882a593Smuzhiyun 	SPRD_EIC_MAX,
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun struct sprd_eic {
93*4882a593Smuzhiyun 	struct gpio_chip chip;
94*4882a593Smuzhiyun 	struct irq_chip intc;
95*4882a593Smuzhiyun 	void __iomem *base[SPRD_EIC_MAX_BANK];
96*4882a593Smuzhiyun 	enum sprd_eic_type type;
97*4882a593Smuzhiyun 	spinlock_t lock;
98*4882a593Smuzhiyun 	int irq;
99*4882a593Smuzhiyun };
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun struct sprd_eic_variant_data {
102*4882a593Smuzhiyun 	enum sprd_eic_type type;
103*4882a593Smuzhiyun 	u32 num_eics;
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun static const char *sprd_eic_label_name[SPRD_EIC_MAX] = {
107*4882a593Smuzhiyun 	"eic-debounce", "eic-latch", "eic-async",
108*4882a593Smuzhiyun 	"eic-sync",
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun static const struct sprd_eic_variant_data sc9860_eic_dbnc_data = {
112*4882a593Smuzhiyun 	.type = SPRD_EIC_DEBOUNCE,
113*4882a593Smuzhiyun 	.num_eics = 8,
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun static const struct sprd_eic_variant_data sc9860_eic_latch_data = {
117*4882a593Smuzhiyun 	.type = SPRD_EIC_LATCH,
118*4882a593Smuzhiyun 	.num_eics = 8,
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun static const struct sprd_eic_variant_data sc9860_eic_async_data = {
122*4882a593Smuzhiyun 	.type = SPRD_EIC_ASYNC,
123*4882a593Smuzhiyun 	.num_eics = 8,
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun static const struct sprd_eic_variant_data sc9860_eic_sync_data = {
127*4882a593Smuzhiyun 	.type = SPRD_EIC_SYNC,
128*4882a593Smuzhiyun 	.num_eics = 8,
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
sprd_eic_offset_base(struct sprd_eic * sprd_eic,unsigned int bank)131*4882a593Smuzhiyun static inline void __iomem *sprd_eic_offset_base(struct sprd_eic *sprd_eic,
132*4882a593Smuzhiyun 						 unsigned int bank)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun 	if (bank >= SPRD_EIC_MAX_BANK)
135*4882a593Smuzhiyun 		return NULL;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	return sprd_eic->base[bank];
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
sprd_eic_update(struct gpio_chip * chip,unsigned int offset,u16 reg,unsigned int val)140*4882a593Smuzhiyun static void sprd_eic_update(struct gpio_chip *chip, unsigned int offset,
141*4882a593Smuzhiyun 			    u16 reg, unsigned int val)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
144*4882a593Smuzhiyun 	void __iomem *base =
145*4882a593Smuzhiyun 		sprd_eic_offset_base(sprd_eic, offset / SPRD_EIC_PER_BANK_NR);
146*4882a593Smuzhiyun 	unsigned long flags;
147*4882a593Smuzhiyun 	u32 tmp;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	spin_lock_irqsave(&sprd_eic->lock, flags);
150*4882a593Smuzhiyun 	tmp = readl_relaxed(base + reg);
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	if (val)
153*4882a593Smuzhiyun 		tmp |= BIT(SPRD_EIC_BIT(offset));
154*4882a593Smuzhiyun 	else
155*4882a593Smuzhiyun 		tmp &= ~BIT(SPRD_EIC_BIT(offset));
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	writel_relaxed(tmp, base + reg);
158*4882a593Smuzhiyun 	spin_unlock_irqrestore(&sprd_eic->lock, flags);
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun 
sprd_eic_read(struct gpio_chip * chip,unsigned int offset,u16 reg)161*4882a593Smuzhiyun static int sprd_eic_read(struct gpio_chip *chip, unsigned int offset, u16 reg)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
164*4882a593Smuzhiyun 	void __iomem *base =
165*4882a593Smuzhiyun 		sprd_eic_offset_base(sprd_eic, offset / SPRD_EIC_PER_BANK_NR);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	return !!(readl_relaxed(base + reg) & BIT(SPRD_EIC_BIT(offset)));
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun 
sprd_eic_request(struct gpio_chip * chip,unsigned int offset)170*4882a593Smuzhiyun static int sprd_eic_request(struct gpio_chip *chip, unsigned int offset)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun 	sprd_eic_update(chip, offset, SPRD_EIC_DBNC_DMSK, 1);
173*4882a593Smuzhiyun 	return 0;
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun 
sprd_eic_free(struct gpio_chip * chip,unsigned int offset)176*4882a593Smuzhiyun static void sprd_eic_free(struct gpio_chip *chip, unsigned int offset)
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun 	sprd_eic_update(chip, offset, SPRD_EIC_DBNC_DMSK, 0);
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
sprd_eic_get(struct gpio_chip * chip,unsigned int offset)181*4882a593Smuzhiyun static int sprd_eic_get(struct gpio_chip *chip, unsigned int offset)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	switch (sprd_eic->type) {
186*4882a593Smuzhiyun 	case SPRD_EIC_DEBOUNCE:
187*4882a593Smuzhiyun 		return sprd_eic_read(chip, offset, SPRD_EIC_DBNC_DATA);
188*4882a593Smuzhiyun 	case SPRD_EIC_ASYNC:
189*4882a593Smuzhiyun 		return sprd_eic_read(chip, offset, SPRD_EIC_ASYNC_DATA);
190*4882a593Smuzhiyun 	case SPRD_EIC_SYNC:
191*4882a593Smuzhiyun 		return sprd_eic_read(chip, offset, SPRD_EIC_SYNC_DATA);
192*4882a593Smuzhiyun 	default:
193*4882a593Smuzhiyun 		return -ENOTSUPP;
194*4882a593Smuzhiyun 	}
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun 
sprd_eic_direction_input(struct gpio_chip * chip,unsigned int offset)197*4882a593Smuzhiyun static int sprd_eic_direction_input(struct gpio_chip *chip, unsigned int offset)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun 	/* EICs are always input, nothing need to do here. */
200*4882a593Smuzhiyun 	return 0;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
sprd_eic_set(struct gpio_chip * chip,unsigned int offset,int value)203*4882a593Smuzhiyun static void sprd_eic_set(struct gpio_chip *chip, unsigned int offset, int value)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	/* EICs are always input, nothing need to do here. */
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun 
sprd_eic_set_debounce(struct gpio_chip * chip,unsigned int offset,unsigned int debounce)208*4882a593Smuzhiyun static int sprd_eic_set_debounce(struct gpio_chip *chip, unsigned int offset,
209*4882a593Smuzhiyun 				 unsigned int debounce)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
212*4882a593Smuzhiyun 	void __iomem *base =
213*4882a593Smuzhiyun 		sprd_eic_offset_base(sprd_eic, offset / SPRD_EIC_PER_BANK_NR);
214*4882a593Smuzhiyun 	u32 reg = SPRD_EIC_DBNC_CTRL0 + SPRD_EIC_BIT(offset) * 0x4;
215*4882a593Smuzhiyun 	u32 value = readl_relaxed(base + reg) & ~SPRD_EIC_DBNC_MASK;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	value |= (debounce / 1000) & SPRD_EIC_DBNC_MASK;
218*4882a593Smuzhiyun 	writel_relaxed(value, base + reg);
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	return 0;
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun 
sprd_eic_set_config(struct gpio_chip * chip,unsigned int offset,unsigned long config)223*4882a593Smuzhiyun static int sprd_eic_set_config(struct gpio_chip *chip, unsigned int offset,
224*4882a593Smuzhiyun 			       unsigned long config)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun 	unsigned long param = pinconf_to_config_param(config);
227*4882a593Smuzhiyun 	u32 arg = pinconf_to_config_argument(config);
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	if (param == PIN_CONFIG_INPUT_DEBOUNCE)
230*4882a593Smuzhiyun 		return sprd_eic_set_debounce(chip, offset, arg);
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	return -ENOTSUPP;
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun 
sprd_eic_irq_mask(struct irq_data * data)235*4882a593Smuzhiyun static void sprd_eic_irq_mask(struct irq_data *data)
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
238*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
239*4882a593Smuzhiyun 	u32 offset = irqd_to_hwirq(data);
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	switch (sprd_eic->type) {
242*4882a593Smuzhiyun 	case SPRD_EIC_DEBOUNCE:
243*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IE, 0);
244*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_DBNC_TRIG, 0);
245*4882a593Smuzhiyun 		break;
246*4882a593Smuzhiyun 	case SPRD_EIC_LATCH:
247*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTEN, 0);
248*4882a593Smuzhiyun 		break;
249*4882a593Smuzhiyun 	case SPRD_EIC_ASYNC:
250*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTIE, 0);
251*4882a593Smuzhiyun 		break;
252*4882a593Smuzhiyun 	case SPRD_EIC_SYNC:
253*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTIE, 0);
254*4882a593Smuzhiyun 		break;
255*4882a593Smuzhiyun 	default:
256*4882a593Smuzhiyun 		dev_err(chip->parent, "Unsupported EIC type.\n");
257*4882a593Smuzhiyun 	}
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
sprd_eic_irq_unmask(struct irq_data * data)260*4882a593Smuzhiyun static void sprd_eic_irq_unmask(struct irq_data *data)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
263*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
264*4882a593Smuzhiyun 	u32 offset = irqd_to_hwirq(data);
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	switch (sprd_eic->type) {
267*4882a593Smuzhiyun 	case SPRD_EIC_DEBOUNCE:
268*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IE, 1);
269*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_DBNC_TRIG, 1);
270*4882a593Smuzhiyun 		break;
271*4882a593Smuzhiyun 	case SPRD_EIC_LATCH:
272*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTEN, 1);
273*4882a593Smuzhiyun 		break;
274*4882a593Smuzhiyun 	case SPRD_EIC_ASYNC:
275*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTIE, 1);
276*4882a593Smuzhiyun 		break;
277*4882a593Smuzhiyun 	case SPRD_EIC_SYNC:
278*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTIE, 1);
279*4882a593Smuzhiyun 		break;
280*4882a593Smuzhiyun 	default:
281*4882a593Smuzhiyun 		dev_err(chip->parent, "Unsupported EIC type.\n");
282*4882a593Smuzhiyun 	}
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun 
sprd_eic_irq_ack(struct irq_data * data)285*4882a593Smuzhiyun static void sprd_eic_irq_ack(struct irq_data *data)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
288*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
289*4882a593Smuzhiyun 	u32 offset = irqd_to_hwirq(data);
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	switch (sprd_eic->type) {
292*4882a593Smuzhiyun 	case SPRD_EIC_DEBOUNCE:
293*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IC, 1);
294*4882a593Smuzhiyun 		break;
295*4882a593Smuzhiyun 	case SPRD_EIC_LATCH:
296*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTCLR, 1);
297*4882a593Smuzhiyun 		break;
298*4882a593Smuzhiyun 	case SPRD_EIC_ASYNC:
299*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTCLR, 1);
300*4882a593Smuzhiyun 		break;
301*4882a593Smuzhiyun 	case SPRD_EIC_SYNC:
302*4882a593Smuzhiyun 		sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTCLR, 1);
303*4882a593Smuzhiyun 		break;
304*4882a593Smuzhiyun 	default:
305*4882a593Smuzhiyun 		dev_err(chip->parent, "Unsupported EIC type.\n");
306*4882a593Smuzhiyun 	}
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun 
sprd_eic_irq_set_type(struct irq_data * data,unsigned int flow_type)309*4882a593Smuzhiyun static int sprd_eic_irq_set_type(struct irq_data *data, unsigned int flow_type)
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
312*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
313*4882a593Smuzhiyun 	u32 offset = irqd_to_hwirq(data);
314*4882a593Smuzhiyun 	int state;
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	switch (sprd_eic->type) {
317*4882a593Smuzhiyun 	case SPRD_EIC_DEBOUNCE:
318*4882a593Smuzhiyun 		switch (flow_type) {
319*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_HIGH:
320*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IEV, 1);
321*4882a593Smuzhiyun 			break;
322*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_LOW:
323*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IEV, 0);
324*4882a593Smuzhiyun 			break;
325*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_RISING:
326*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_FALLING:
327*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_BOTH:
328*4882a593Smuzhiyun 			state = sprd_eic_get(chip, offset);
329*4882a593Smuzhiyun 			if (state)
330*4882a593Smuzhiyun 				sprd_eic_update(chip, offset,
331*4882a593Smuzhiyun 						SPRD_EIC_DBNC_IEV, 0);
332*4882a593Smuzhiyun 			else
333*4882a593Smuzhiyun 				sprd_eic_update(chip, offset,
334*4882a593Smuzhiyun 						SPRD_EIC_DBNC_IEV, 1);
335*4882a593Smuzhiyun 			break;
336*4882a593Smuzhiyun 		default:
337*4882a593Smuzhiyun 			return -ENOTSUPP;
338*4882a593Smuzhiyun 		}
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 		irq_set_handler_locked(data, handle_level_irq);
341*4882a593Smuzhiyun 		break;
342*4882a593Smuzhiyun 	case SPRD_EIC_LATCH:
343*4882a593Smuzhiyun 		switch (flow_type) {
344*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_HIGH:
345*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTPOL, 0);
346*4882a593Smuzhiyun 			break;
347*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_LOW:
348*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTPOL, 1);
349*4882a593Smuzhiyun 			break;
350*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_RISING:
351*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_FALLING:
352*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_BOTH:
353*4882a593Smuzhiyun 			state = sprd_eic_get(chip, offset);
354*4882a593Smuzhiyun 			if (state)
355*4882a593Smuzhiyun 				sprd_eic_update(chip, offset,
356*4882a593Smuzhiyun 						SPRD_EIC_LATCH_INTPOL, 0);
357*4882a593Smuzhiyun 			else
358*4882a593Smuzhiyun 				sprd_eic_update(chip, offset,
359*4882a593Smuzhiyun 						SPRD_EIC_LATCH_INTPOL, 1);
360*4882a593Smuzhiyun 			break;
361*4882a593Smuzhiyun 		default:
362*4882a593Smuzhiyun 			return -ENOTSUPP;
363*4882a593Smuzhiyun 		}
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 		irq_set_handler_locked(data, handle_level_irq);
366*4882a593Smuzhiyun 		break;
367*4882a593Smuzhiyun 	case SPRD_EIC_ASYNC:
368*4882a593Smuzhiyun 		switch (flow_type) {
369*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_RISING:
370*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 0);
371*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 0);
372*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTPOL, 1);
373*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_edge_irq);
374*4882a593Smuzhiyun 			break;
375*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_FALLING:
376*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 0);
377*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 0);
378*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTPOL, 0);
379*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_edge_irq);
380*4882a593Smuzhiyun 			break;
381*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_BOTH:
382*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 0);
383*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 1);
384*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_edge_irq);
385*4882a593Smuzhiyun 			break;
386*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_HIGH:
387*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 0);
388*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 1);
389*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTPOL, 1);
390*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_level_irq);
391*4882a593Smuzhiyun 			break;
392*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_LOW:
393*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 0);
394*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 1);
395*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTPOL, 0);
396*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_level_irq);
397*4882a593Smuzhiyun 			break;
398*4882a593Smuzhiyun 		default:
399*4882a593Smuzhiyun 			return -ENOTSUPP;
400*4882a593Smuzhiyun 		}
401*4882a593Smuzhiyun 		break;
402*4882a593Smuzhiyun 	case SPRD_EIC_SYNC:
403*4882a593Smuzhiyun 		switch (flow_type) {
404*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_RISING:
405*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 0);
406*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 0);
407*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTPOL, 1);
408*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_edge_irq);
409*4882a593Smuzhiyun 			break;
410*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_FALLING:
411*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 0);
412*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 0);
413*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTPOL, 0);
414*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_edge_irq);
415*4882a593Smuzhiyun 			break;
416*4882a593Smuzhiyun 		case IRQ_TYPE_EDGE_BOTH:
417*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 0);
418*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 1);
419*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_edge_irq);
420*4882a593Smuzhiyun 			break;
421*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_HIGH:
422*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 0);
423*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 1);
424*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTPOL, 1);
425*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_level_irq);
426*4882a593Smuzhiyun 			break;
427*4882a593Smuzhiyun 		case IRQ_TYPE_LEVEL_LOW:
428*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 0);
429*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 1);
430*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTPOL, 0);
431*4882a593Smuzhiyun 			irq_set_handler_locked(data, handle_level_irq);
432*4882a593Smuzhiyun 			break;
433*4882a593Smuzhiyun 		default:
434*4882a593Smuzhiyun 			return -ENOTSUPP;
435*4882a593Smuzhiyun 		}
436*4882a593Smuzhiyun 		break;
437*4882a593Smuzhiyun 	default:
438*4882a593Smuzhiyun 		dev_err(chip->parent, "Unsupported EIC type.\n");
439*4882a593Smuzhiyun 		return -ENOTSUPP;
440*4882a593Smuzhiyun 	}
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	return 0;
443*4882a593Smuzhiyun }
444*4882a593Smuzhiyun 
sprd_eic_toggle_trigger(struct gpio_chip * chip,unsigned int irq,unsigned int offset)445*4882a593Smuzhiyun static void sprd_eic_toggle_trigger(struct gpio_chip *chip, unsigned int irq,
446*4882a593Smuzhiyun 				    unsigned int offset)
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
449*4882a593Smuzhiyun 	struct irq_data *data = irq_get_irq_data(irq);
450*4882a593Smuzhiyun 	u32 trigger = irqd_get_trigger_type(data);
451*4882a593Smuzhiyun 	int state, post_state;
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	/*
454*4882a593Smuzhiyun 	 * The debounce EIC and latch EIC can only support level trigger, so we
455*4882a593Smuzhiyun 	 * can toggle the level trigger to emulate the edge trigger.
456*4882a593Smuzhiyun 	 */
457*4882a593Smuzhiyun 	if ((sprd_eic->type != SPRD_EIC_DEBOUNCE &&
458*4882a593Smuzhiyun 	     sprd_eic->type != SPRD_EIC_LATCH) ||
459*4882a593Smuzhiyun 	    !(trigger & IRQ_TYPE_EDGE_BOTH))
460*4882a593Smuzhiyun 		return;
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	sprd_eic_irq_mask(data);
463*4882a593Smuzhiyun 	state = sprd_eic_get(chip, offset);
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun retry:
466*4882a593Smuzhiyun 	switch (sprd_eic->type) {
467*4882a593Smuzhiyun 	case SPRD_EIC_DEBOUNCE:
468*4882a593Smuzhiyun 		if (state)
469*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IEV, 0);
470*4882a593Smuzhiyun 		else
471*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IEV, 1);
472*4882a593Smuzhiyun 		break;
473*4882a593Smuzhiyun 	case SPRD_EIC_LATCH:
474*4882a593Smuzhiyun 		if (state)
475*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTPOL, 0);
476*4882a593Smuzhiyun 		else
477*4882a593Smuzhiyun 			sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTPOL, 1);
478*4882a593Smuzhiyun 		break;
479*4882a593Smuzhiyun 	default:
480*4882a593Smuzhiyun 		sprd_eic_irq_unmask(data);
481*4882a593Smuzhiyun 		return;
482*4882a593Smuzhiyun 	}
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun 	post_state = sprd_eic_get(chip, offset);
485*4882a593Smuzhiyun 	if (state != post_state) {
486*4882a593Smuzhiyun 		dev_warn(chip->parent, "EIC level was changed.\n");
487*4882a593Smuzhiyun 		state = post_state;
488*4882a593Smuzhiyun 		goto retry;
489*4882a593Smuzhiyun 	}
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun 	sprd_eic_irq_unmask(data);
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun 
sprd_eic_match_chip_by_type(struct gpio_chip * chip,void * data)494*4882a593Smuzhiyun static int sprd_eic_match_chip_by_type(struct gpio_chip *chip, void *data)
495*4882a593Smuzhiyun {
496*4882a593Smuzhiyun 	enum sprd_eic_type type = *(enum sprd_eic_type *)data;
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	return !strcmp(chip->label, sprd_eic_label_name[type]);
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun 
sprd_eic_handle_one_type(struct gpio_chip * chip)501*4882a593Smuzhiyun static void sprd_eic_handle_one_type(struct gpio_chip *chip)
502*4882a593Smuzhiyun {
503*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic = gpiochip_get_data(chip);
504*4882a593Smuzhiyun 	u32 bank, n, girq;
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	for (bank = 0; bank * SPRD_EIC_PER_BANK_NR < chip->ngpio; bank++) {
507*4882a593Smuzhiyun 		void __iomem *base = sprd_eic_offset_base(sprd_eic, bank);
508*4882a593Smuzhiyun 		unsigned long reg;
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun 		switch (sprd_eic->type) {
511*4882a593Smuzhiyun 		case SPRD_EIC_DEBOUNCE:
512*4882a593Smuzhiyun 			reg = readl_relaxed(base + SPRD_EIC_DBNC_MIS) &
513*4882a593Smuzhiyun 				SPRD_EIC_DATA_MASK;
514*4882a593Smuzhiyun 			break;
515*4882a593Smuzhiyun 		case SPRD_EIC_LATCH:
516*4882a593Smuzhiyun 			reg = readl_relaxed(base + SPRD_EIC_LATCH_INTMSK) &
517*4882a593Smuzhiyun 				SPRD_EIC_DATA_MASK;
518*4882a593Smuzhiyun 			break;
519*4882a593Smuzhiyun 		case SPRD_EIC_ASYNC:
520*4882a593Smuzhiyun 			reg = readl_relaxed(base + SPRD_EIC_ASYNC_INTMSK) &
521*4882a593Smuzhiyun 				SPRD_EIC_DATA_MASK;
522*4882a593Smuzhiyun 			break;
523*4882a593Smuzhiyun 		case SPRD_EIC_SYNC:
524*4882a593Smuzhiyun 			reg = readl_relaxed(base + SPRD_EIC_SYNC_INTMSK) &
525*4882a593Smuzhiyun 				SPRD_EIC_DATA_MASK;
526*4882a593Smuzhiyun 			break;
527*4882a593Smuzhiyun 		default:
528*4882a593Smuzhiyun 			dev_err(chip->parent, "Unsupported EIC type.\n");
529*4882a593Smuzhiyun 			return;
530*4882a593Smuzhiyun 		}
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun 		for_each_set_bit(n, &reg, SPRD_EIC_PER_BANK_NR) {
533*4882a593Smuzhiyun 			u32 offset = bank * SPRD_EIC_PER_BANK_NR + n;
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun 			girq = irq_find_mapping(chip->irq.domain, offset);
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 			generic_handle_irq(girq);
538*4882a593Smuzhiyun 			sprd_eic_toggle_trigger(chip, girq, offset);
539*4882a593Smuzhiyun 		}
540*4882a593Smuzhiyun 	}
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun 
sprd_eic_irq_handler(struct irq_desc * desc)543*4882a593Smuzhiyun static void sprd_eic_irq_handler(struct irq_desc *desc)
544*4882a593Smuzhiyun {
545*4882a593Smuzhiyun 	struct irq_chip *ic = irq_desc_get_chip(desc);
546*4882a593Smuzhiyun 	struct gpio_chip *chip;
547*4882a593Smuzhiyun 	enum sprd_eic_type type;
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	chained_irq_enter(ic, desc);
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 	/*
552*4882a593Smuzhiyun 	 * Since the digital-chip EIC 4 sub-modules (debounce, latch, async
553*4882a593Smuzhiyun 	 * and sync) share one same interrupt line, we should iterate each
554*4882a593Smuzhiyun 	 * EIC module to check if there are EIC interrupts were triggered.
555*4882a593Smuzhiyun 	 */
556*4882a593Smuzhiyun 	for (type = SPRD_EIC_DEBOUNCE; type < SPRD_EIC_MAX; type++) {
557*4882a593Smuzhiyun 		chip = gpiochip_find(&type, sprd_eic_match_chip_by_type);
558*4882a593Smuzhiyun 		if (!chip)
559*4882a593Smuzhiyun 			continue;
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 		sprd_eic_handle_one_type(chip);
562*4882a593Smuzhiyun 	}
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 	chained_irq_exit(ic, desc);
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun 
sprd_eic_probe(struct platform_device * pdev)567*4882a593Smuzhiyun static int sprd_eic_probe(struct platform_device *pdev)
568*4882a593Smuzhiyun {
569*4882a593Smuzhiyun 	const struct sprd_eic_variant_data *pdata;
570*4882a593Smuzhiyun 	struct gpio_irq_chip *irq;
571*4882a593Smuzhiyun 	struct sprd_eic *sprd_eic;
572*4882a593Smuzhiyun 	struct resource *res;
573*4882a593Smuzhiyun 	int ret, i;
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	pdata = of_device_get_match_data(&pdev->dev);
576*4882a593Smuzhiyun 	if (!pdata) {
577*4882a593Smuzhiyun 		dev_err(&pdev->dev, "No matching driver data found.\n");
578*4882a593Smuzhiyun 		return -EINVAL;
579*4882a593Smuzhiyun 	}
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	sprd_eic = devm_kzalloc(&pdev->dev, sizeof(*sprd_eic), GFP_KERNEL);
582*4882a593Smuzhiyun 	if (!sprd_eic)
583*4882a593Smuzhiyun 		return -ENOMEM;
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	spin_lock_init(&sprd_eic->lock);
586*4882a593Smuzhiyun 	sprd_eic->type = pdata->type;
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	sprd_eic->irq = platform_get_irq(pdev, 0);
589*4882a593Smuzhiyun 	if (sprd_eic->irq < 0)
590*4882a593Smuzhiyun 		return sprd_eic->irq;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	for (i = 0; i < SPRD_EIC_MAX_BANK; i++) {
593*4882a593Smuzhiyun 		/*
594*4882a593Smuzhiyun 		 * We can have maximum 3 banks EICs, and each EIC has
595*4882a593Smuzhiyun 		 * its own base address. But some platform maybe only
596*4882a593Smuzhiyun 		 * have one bank EIC, thus base[1] and base[2] can be
597*4882a593Smuzhiyun 		 * optional.
598*4882a593Smuzhiyun 		 */
599*4882a593Smuzhiyun 		res = platform_get_resource(pdev, IORESOURCE_MEM, i);
600*4882a593Smuzhiyun 		if (!res)
601*4882a593Smuzhiyun 			break;
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun 		sprd_eic->base[i] = devm_ioremap_resource(&pdev->dev, res);
604*4882a593Smuzhiyun 		if (IS_ERR(sprd_eic->base[i]))
605*4882a593Smuzhiyun 			return PTR_ERR(sprd_eic->base[i]);
606*4882a593Smuzhiyun 	}
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun 	sprd_eic->chip.label = sprd_eic_label_name[sprd_eic->type];
609*4882a593Smuzhiyun 	sprd_eic->chip.ngpio = pdata->num_eics;
610*4882a593Smuzhiyun 	sprd_eic->chip.base = -1;
611*4882a593Smuzhiyun 	sprd_eic->chip.parent = &pdev->dev;
612*4882a593Smuzhiyun 	sprd_eic->chip.of_node = pdev->dev.of_node;
613*4882a593Smuzhiyun 	sprd_eic->chip.direction_input = sprd_eic_direction_input;
614*4882a593Smuzhiyun 	switch (sprd_eic->type) {
615*4882a593Smuzhiyun 	case SPRD_EIC_DEBOUNCE:
616*4882a593Smuzhiyun 		sprd_eic->chip.request = sprd_eic_request;
617*4882a593Smuzhiyun 		sprd_eic->chip.free = sprd_eic_free;
618*4882a593Smuzhiyun 		sprd_eic->chip.set_config = sprd_eic_set_config;
619*4882a593Smuzhiyun 		sprd_eic->chip.set = sprd_eic_set;
620*4882a593Smuzhiyun 		fallthrough;
621*4882a593Smuzhiyun 	case SPRD_EIC_ASYNC:
622*4882a593Smuzhiyun 	case SPRD_EIC_SYNC:
623*4882a593Smuzhiyun 		sprd_eic->chip.get = sprd_eic_get;
624*4882a593Smuzhiyun 		break;
625*4882a593Smuzhiyun 	case SPRD_EIC_LATCH:
626*4882a593Smuzhiyun 	default:
627*4882a593Smuzhiyun 		break;
628*4882a593Smuzhiyun 	}
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	sprd_eic->intc.name = dev_name(&pdev->dev);
631*4882a593Smuzhiyun 	sprd_eic->intc.irq_ack = sprd_eic_irq_ack;
632*4882a593Smuzhiyun 	sprd_eic->intc.irq_mask = sprd_eic_irq_mask;
633*4882a593Smuzhiyun 	sprd_eic->intc.irq_unmask = sprd_eic_irq_unmask;
634*4882a593Smuzhiyun 	sprd_eic->intc.irq_set_type = sprd_eic_irq_set_type;
635*4882a593Smuzhiyun 	sprd_eic->intc.flags = IRQCHIP_SKIP_SET_WAKE;
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 	irq = &sprd_eic->chip.irq;
638*4882a593Smuzhiyun 	irq->chip = &sprd_eic->intc;
639*4882a593Smuzhiyun 	irq->handler = handle_bad_irq;
640*4882a593Smuzhiyun 	irq->default_type = IRQ_TYPE_NONE;
641*4882a593Smuzhiyun 	irq->parent_handler = sprd_eic_irq_handler;
642*4882a593Smuzhiyun 	irq->parent_handler_data = sprd_eic;
643*4882a593Smuzhiyun 	irq->num_parents = 1;
644*4882a593Smuzhiyun 	irq->parents = &sprd_eic->irq;
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun 	ret = devm_gpiochip_add_data(&pdev->dev, &sprd_eic->chip, sprd_eic);
647*4882a593Smuzhiyun 	if (ret < 0) {
648*4882a593Smuzhiyun 		dev_err(&pdev->dev, "Could not register gpiochip %d.\n", ret);
649*4882a593Smuzhiyun 		return ret;
650*4882a593Smuzhiyun 	}
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun 	platform_set_drvdata(pdev, sprd_eic);
653*4882a593Smuzhiyun 	return 0;
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun static const struct of_device_id sprd_eic_of_match[] = {
657*4882a593Smuzhiyun 	{
658*4882a593Smuzhiyun 		.compatible = "sprd,sc9860-eic-debounce",
659*4882a593Smuzhiyun 		.data = &sc9860_eic_dbnc_data,
660*4882a593Smuzhiyun 	},
661*4882a593Smuzhiyun 	{
662*4882a593Smuzhiyun 		.compatible = "sprd,sc9860-eic-latch",
663*4882a593Smuzhiyun 		.data = &sc9860_eic_latch_data,
664*4882a593Smuzhiyun 	},
665*4882a593Smuzhiyun 	{
666*4882a593Smuzhiyun 		.compatible = "sprd,sc9860-eic-async",
667*4882a593Smuzhiyun 		.data = &sc9860_eic_async_data,
668*4882a593Smuzhiyun 	},
669*4882a593Smuzhiyun 	{
670*4882a593Smuzhiyun 		.compatible = "sprd,sc9860-eic-sync",
671*4882a593Smuzhiyun 		.data = &sc9860_eic_sync_data,
672*4882a593Smuzhiyun 	},
673*4882a593Smuzhiyun 	{
674*4882a593Smuzhiyun 		/* end of list */
675*4882a593Smuzhiyun 	}
676*4882a593Smuzhiyun };
677*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, sprd_eic_of_match);
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun static struct platform_driver sprd_eic_driver = {
680*4882a593Smuzhiyun 	.probe = sprd_eic_probe,
681*4882a593Smuzhiyun 	.driver = {
682*4882a593Smuzhiyun 		.name = "sprd-eic",
683*4882a593Smuzhiyun 		.of_match_table	= sprd_eic_of_match,
684*4882a593Smuzhiyun 	},
685*4882a593Smuzhiyun };
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun module_platform_driver(sprd_eic_driver);
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun MODULE_DESCRIPTION("Spreadtrum EIC driver");
690*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
691