1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun //
3*4882a593Smuzhiyun // Copyright (c) 2011-2014 Samsung Electronics Co., Ltd
4*4882a593Smuzhiyun // http://www.samsung.com
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <linux/device.h>
7*4882a593Smuzhiyun #include <linux/interrupt.h>
8*4882a593Smuzhiyun #include <linux/irq.h>
9*4882a593Smuzhiyun #include <linux/module.h>
10*4882a593Smuzhiyun #include <linux/regmap.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/mfd/samsung/core.h>
13*4882a593Smuzhiyun #include <linux/mfd/samsung/irq.h>
14*4882a593Smuzhiyun #include <linux/mfd/samsung/s2mps11.h>
15*4882a593Smuzhiyun #include <linux/mfd/samsung/s2mps14.h>
16*4882a593Smuzhiyun #include <linux/mfd/samsung/s2mpu02.h>
17*4882a593Smuzhiyun #include <linux/mfd/samsung/s5m8763.h>
18*4882a593Smuzhiyun #include <linux/mfd/samsung/s5m8767.h>
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun static const struct regmap_irq s2mps11_irqs[] = {
21*4882a593Smuzhiyun [S2MPS11_IRQ_PWRONF] = {
22*4882a593Smuzhiyun .reg_offset = 0,
23*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRONF_MASK,
24*4882a593Smuzhiyun },
25*4882a593Smuzhiyun [S2MPS11_IRQ_PWRONR] = {
26*4882a593Smuzhiyun .reg_offset = 0,
27*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRONR_MASK,
28*4882a593Smuzhiyun },
29*4882a593Smuzhiyun [S2MPS11_IRQ_JIGONBF] = {
30*4882a593Smuzhiyun .reg_offset = 0,
31*4882a593Smuzhiyun .mask = S2MPS11_IRQ_JIGONBF_MASK,
32*4882a593Smuzhiyun },
33*4882a593Smuzhiyun [S2MPS11_IRQ_JIGONBR] = {
34*4882a593Smuzhiyun .reg_offset = 0,
35*4882a593Smuzhiyun .mask = S2MPS11_IRQ_JIGONBR_MASK,
36*4882a593Smuzhiyun },
37*4882a593Smuzhiyun [S2MPS11_IRQ_ACOKBF] = {
38*4882a593Smuzhiyun .reg_offset = 0,
39*4882a593Smuzhiyun .mask = S2MPS11_IRQ_ACOKBF_MASK,
40*4882a593Smuzhiyun },
41*4882a593Smuzhiyun [S2MPS11_IRQ_ACOKBR] = {
42*4882a593Smuzhiyun .reg_offset = 0,
43*4882a593Smuzhiyun .mask = S2MPS11_IRQ_ACOKBR_MASK,
44*4882a593Smuzhiyun },
45*4882a593Smuzhiyun [S2MPS11_IRQ_PWRON1S] = {
46*4882a593Smuzhiyun .reg_offset = 0,
47*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRON1S_MASK,
48*4882a593Smuzhiyun },
49*4882a593Smuzhiyun [S2MPS11_IRQ_MRB] = {
50*4882a593Smuzhiyun .reg_offset = 0,
51*4882a593Smuzhiyun .mask = S2MPS11_IRQ_MRB_MASK,
52*4882a593Smuzhiyun },
53*4882a593Smuzhiyun [S2MPS11_IRQ_RTC60S] = {
54*4882a593Smuzhiyun .reg_offset = 1,
55*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTC60S_MASK,
56*4882a593Smuzhiyun },
57*4882a593Smuzhiyun [S2MPS11_IRQ_RTCA1] = {
58*4882a593Smuzhiyun .reg_offset = 1,
59*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTCA1_MASK,
60*4882a593Smuzhiyun },
61*4882a593Smuzhiyun [S2MPS11_IRQ_RTCA0] = {
62*4882a593Smuzhiyun .reg_offset = 1,
63*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTCA0_MASK,
64*4882a593Smuzhiyun },
65*4882a593Smuzhiyun [S2MPS11_IRQ_SMPL] = {
66*4882a593Smuzhiyun .reg_offset = 1,
67*4882a593Smuzhiyun .mask = S2MPS11_IRQ_SMPL_MASK,
68*4882a593Smuzhiyun },
69*4882a593Smuzhiyun [S2MPS11_IRQ_RTC1S] = {
70*4882a593Smuzhiyun .reg_offset = 1,
71*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTC1S_MASK,
72*4882a593Smuzhiyun },
73*4882a593Smuzhiyun [S2MPS11_IRQ_WTSR] = {
74*4882a593Smuzhiyun .reg_offset = 1,
75*4882a593Smuzhiyun .mask = S2MPS11_IRQ_WTSR_MASK,
76*4882a593Smuzhiyun },
77*4882a593Smuzhiyun [S2MPS11_IRQ_INT120C] = {
78*4882a593Smuzhiyun .reg_offset = 2,
79*4882a593Smuzhiyun .mask = S2MPS11_IRQ_INT120C_MASK,
80*4882a593Smuzhiyun },
81*4882a593Smuzhiyun [S2MPS11_IRQ_INT140C] = {
82*4882a593Smuzhiyun .reg_offset = 2,
83*4882a593Smuzhiyun .mask = S2MPS11_IRQ_INT140C_MASK,
84*4882a593Smuzhiyun },
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun static const struct regmap_irq s2mps14_irqs[] = {
88*4882a593Smuzhiyun [S2MPS14_IRQ_PWRONF] = {
89*4882a593Smuzhiyun .reg_offset = 0,
90*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRONF_MASK,
91*4882a593Smuzhiyun },
92*4882a593Smuzhiyun [S2MPS14_IRQ_PWRONR] = {
93*4882a593Smuzhiyun .reg_offset = 0,
94*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRONR_MASK,
95*4882a593Smuzhiyun },
96*4882a593Smuzhiyun [S2MPS14_IRQ_JIGONBF] = {
97*4882a593Smuzhiyun .reg_offset = 0,
98*4882a593Smuzhiyun .mask = S2MPS11_IRQ_JIGONBF_MASK,
99*4882a593Smuzhiyun },
100*4882a593Smuzhiyun [S2MPS14_IRQ_JIGONBR] = {
101*4882a593Smuzhiyun .reg_offset = 0,
102*4882a593Smuzhiyun .mask = S2MPS11_IRQ_JIGONBR_MASK,
103*4882a593Smuzhiyun },
104*4882a593Smuzhiyun [S2MPS14_IRQ_ACOKBF] = {
105*4882a593Smuzhiyun .reg_offset = 0,
106*4882a593Smuzhiyun .mask = S2MPS11_IRQ_ACOKBF_MASK,
107*4882a593Smuzhiyun },
108*4882a593Smuzhiyun [S2MPS14_IRQ_ACOKBR] = {
109*4882a593Smuzhiyun .reg_offset = 0,
110*4882a593Smuzhiyun .mask = S2MPS11_IRQ_ACOKBR_MASK,
111*4882a593Smuzhiyun },
112*4882a593Smuzhiyun [S2MPS14_IRQ_PWRON1S] = {
113*4882a593Smuzhiyun .reg_offset = 0,
114*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRON1S_MASK,
115*4882a593Smuzhiyun },
116*4882a593Smuzhiyun [S2MPS14_IRQ_MRB] = {
117*4882a593Smuzhiyun .reg_offset = 0,
118*4882a593Smuzhiyun .mask = S2MPS11_IRQ_MRB_MASK,
119*4882a593Smuzhiyun },
120*4882a593Smuzhiyun [S2MPS14_IRQ_RTC60S] = {
121*4882a593Smuzhiyun .reg_offset = 1,
122*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTC60S_MASK,
123*4882a593Smuzhiyun },
124*4882a593Smuzhiyun [S2MPS14_IRQ_RTCA1] = {
125*4882a593Smuzhiyun .reg_offset = 1,
126*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTCA1_MASK,
127*4882a593Smuzhiyun },
128*4882a593Smuzhiyun [S2MPS14_IRQ_RTCA0] = {
129*4882a593Smuzhiyun .reg_offset = 1,
130*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTCA0_MASK,
131*4882a593Smuzhiyun },
132*4882a593Smuzhiyun [S2MPS14_IRQ_SMPL] = {
133*4882a593Smuzhiyun .reg_offset = 1,
134*4882a593Smuzhiyun .mask = S2MPS11_IRQ_SMPL_MASK,
135*4882a593Smuzhiyun },
136*4882a593Smuzhiyun [S2MPS14_IRQ_RTC1S] = {
137*4882a593Smuzhiyun .reg_offset = 1,
138*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTC1S_MASK,
139*4882a593Smuzhiyun },
140*4882a593Smuzhiyun [S2MPS14_IRQ_WTSR] = {
141*4882a593Smuzhiyun .reg_offset = 1,
142*4882a593Smuzhiyun .mask = S2MPS11_IRQ_WTSR_MASK,
143*4882a593Smuzhiyun },
144*4882a593Smuzhiyun [S2MPS14_IRQ_INT120C] = {
145*4882a593Smuzhiyun .reg_offset = 2,
146*4882a593Smuzhiyun .mask = S2MPS11_IRQ_INT120C_MASK,
147*4882a593Smuzhiyun },
148*4882a593Smuzhiyun [S2MPS14_IRQ_INT140C] = {
149*4882a593Smuzhiyun .reg_offset = 2,
150*4882a593Smuzhiyun .mask = S2MPS11_IRQ_INT140C_MASK,
151*4882a593Smuzhiyun },
152*4882a593Smuzhiyun [S2MPS14_IRQ_TSD] = {
153*4882a593Smuzhiyun .reg_offset = 2,
154*4882a593Smuzhiyun .mask = S2MPS14_IRQ_TSD_MASK,
155*4882a593Smuzhiyun },
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun static const struct regmap_irq s2mpu02_irqs[] = {
159*4882a593Smuzhiyun [S2MPU02_IRQ_PWRONF] = {
160*4882a593Smuzhiyun .reg_offset = 0,
161*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRONF_MASK,
162*4882a593Smuzhiyun },
163*4882a593Smuzhiyun [S2MPU02_IRQ_PWRONR] = {
164*4882a593Smuzhiyun .reg_offset = 0,
165*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRONR_MASK,
166*4882a593Smuzhiyun },
167*4882a593Smuzhiyun [S2MPU02_IRQ_JIGONBF] = {
168*4882a593Smuzhiyun .reg_offset = 0,
169*4882a593Smuzhiyun .mask = S2MPS11_IRQ_JIGONBF_MASK,
170*4882a593Smuzhiyun },
171*4882a593Smuzhiyun [S2MPU02_IRQ_JIGONBR] = {
172*4882a593Smuzhiyun .reg_offset = 0,
173*4882a593Smuzhiyun .mask = S2MPS11_IRQ_JIGONBR_MASK,
174*4882a593Smuzhiyun },
175*4882a593Smuzhiyun [S2MPU02_IRQ_ACOKBF] = {
176*4882a593Smuzhiyun .reg_offset = 0,
177*4882a593Smuzhiyun .mask = S2MPS11_IRQ_ACOKBF_MASK,
178*4882a593Smuzhiyun },
179*4882a593Smuzhiyun [S2MPU02_IRQ_ACOKBR] = {
180*4882a593Smuzhiyun .reg_offset = 0,
181*4882a593Smuzhiyun .mask = S2MPS11_IRQ_ACOKBR_MASK,
182*4882a593Smuzhiyun },
183*4882a593Smuzhiyun [S2MPU02_IRQ_PWRON1S] = {
184*4882a593Smuzhiyun .reg_offset = 0,
185*4882a593Smuzhiyun .mask = S2MPS11_IRQ_PWRON1S_MASK,
186*4882a593Smuzhiyun },
187*4882a593Smuzhiyun [S2MPU02_IRQ_MRB] = {
188*4882a593Smuzhiyun .reg_offset = 0,
189*4882a593Smuzhiyun .mask = S2MPS11_IRQ_MRB_MASK,
190*4882a593Smuzhiyun },
191*4882a593Smuzhiyun [S2MPU02_IRQ_RTC60S] = {
192*4882a593Smuzhiyun .reg_offset = 1,
193*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTC60S_MASK,
194*4882a593Smuzhiyun },
195*4882a593Smuzhiyun [S2MPU02_IRQ_RTCA1] = {
196*4882a593Smuzhiyun .reg_offset = 1,
197*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTCA1_MASK,
198*4882a593Smuzhiyun },
199*4882a593Smuzhiyun [S2MPU02_IRQ_RTCA0] = {
200*4882a593Smuzhiyun .reg_offset = 1,
201*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTCA0_MASK,
202*4882a593Smuzhiyun },
203*4882a593Smuzhiyun [S2MPU02_IRQ_SMPL] = {
204*4882a593Smuzhiyun .reg_offset = 1,
205*4882a593Smuzhiyun .mask = S2MPS11_IRQ_SMPL_MASK,
206*4882a593Smuzhiyun },
207*4882a593Smuzhiyun [S2MPU02_IRQ_RTC1S] = {
208*4882a593Smuzhiyun .reg_offset = 1,
209*4882a593Smuzhiyun .mask = S2MPS11_IRQ_RTC1S_MASK,
210*4882a593Smuzhiyun },
211*4882a593Smuzhiyun [S2MPU02_IRQ_WTSR] = {
212*4882a593Smuzhiyun .reg_offset = 1,
213*4882a593Smuzhiyun .mask = S2MPS11_IRQ_WTSR_MASK,
214*4882a593Smuzhiyun },
215*4882a593Smuzhiyun [S2MPU02_IRQ_INT120C] = {
216*4882a593Smuzhiyun .reg_offset = 2,
217*4882a593Smuzhiyun .mask = S2MPS11_IRQ_INT120C_MASK,
218*4882a593Smuzhiyun },
219*4882a593Smuzhiyun [S2MPU02_IRQ_INT140C] = {
220*4882a593Smuzhiyun .reg_offset = 2,
221*4882a593Smuzhiyun .mask = S2MPS11_IRQ_INT140C_MASK,
222*4882a593Smuzhiyun },
223*4882a593Smuzhiyun [S2MPU02_IRQ_TSD] = {
224*4882a593Smuzhiyun .reg_offset = 2,
225*4882a593Smuzhiyun .mask = S2MPS14_IRQ_TSD_MASK,
226*4882a593Smuzhiyun },
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun static const struct regmap_irq s5m8767_irqs[] = {
230*4882a593Smuzhiyun [S5M8767_IRQ_PWRR] = {
231*4882a593Smuzhiyun .reg_offset = 0,
232*4882a593Smuzhiyun .mask = S5M8767_IRQ_PWRR_MASK,
233*4882a593Smuzhiyun },
234*4882a593Smuzhiyun [S5M8767_IRQ_PWRF] = {
235*4882a593Smuzhiyun .reg_offset = 0,
236*4882a593Smuzhiyun .mask = S5M8767_IRQ_PWRF_MASK,
237*4882a593Smuzhiyun },
238*4882a593Smuzhiyun [S5M8767_IRQ_PWR1S] = {
239*4882a593Smuzhiyun .reg_offset = 0,
240*4882a593Smuzhiyun .mask = S5M8767_IRQ_PWR1S_MASK,
241*4882a593Smuzhiyun },
242*4882a593Smuzhiyun [S5M8767_IRQ_JIGR] = {
243*4882a593Smuzhiyun .reg_offset = 0,
244*4882a593Smuzhiyun .mask = S5M8767_IRQ_JIGR_MASK,
245*4882a593Smuzhiyun },
246*4882a593Smuzhiyun [S5M8767_IRQ_JIGF] = {
247*4882a593Smuzhiyun .reg_offset = 0,
248*4882a593Smuzhiyun .mask = S5M8767_IRQ_JIGF_MASK,
249*4882a593Smuzhiyun },
250*4882a593Smuzhiyun [S5M8767_IRQ_LOWBAT2] = {
251*4882a593Smuzhiyun .reg_offset = 0,
252*4882a593Smuzhiyun .mask = S5M8767_IRQ_LOWBAT2_MASK,
253*4882a593Smuzhiyun },
254*4882a593Smuzhiyun [S5M8767_IRQ_LOWBAT1] = {
255*4882a593Smuzhiyun .reg_offset = 0,
256*4882a593Smuzhiyun .mask = S5M8767_IRQ_LOWBAT1_MASK,
257*4882a593Smuzhiyun },
258*4882a593Smuzhiyun [S5M8767_IRQ_MRB] = {
259*4882a593Smuzhiyun .reg_offset = 1,
260*4882a593Smuzhiyun .mask = S5M8767_IRQ_MRB_MASK,
261*4882a593Smuzhiyun },
262*4882a593Smuzhiyun [S5M8767_IRQ_DVSOK2] = {
263*4882a593Smuzhiyun .reg_offset = 1,
264*4882a593Smuzhiyun .mask = S5M8767_IRQ_DVSOK2_MASK,
265*4882a593Smuzhiyun },
266*4882a593Smuzhiyun [S5M8767_IRQ_DVSOK3] = {
267*4882a593Smuzhiyun .reg_offset = 1,
268*4882a593Smuzhiyun .mask = S5M8767_IRQ_DVSOK3_MASK,
269*4882a593Smuzhiyun },
270*4882a593Smuzhiyun [S5M8767_IRQ_DVSOK4] = {
271*4882a593Smuzhiyun .reg_offset = 1,
272*4882a593Smuzhiyun .mask = S5M8767_IRQ_DVSOK4_MASK,
273*4882a593Smuzhiyun },
274*4882a593Smuzhiyun [S5M8767_IRQ_RTC60S] = {
275*4882a593Smuzhiyun .reg_offset = 2,
276*4882a593Smuzhiyun .mask = S5M8767_IRQ_RTC60S_MASK,
277*4882a593Smuzhiyun },
278*4882a593Smuzhiyun [S5M8767_IRQ_RTCA1] = {
279*4882a593Smuzhiyun .reg_offset = 2,
280*4882a593Smuzhiyun .mask = S5M8767_IRQ_RTCA1_MASK,
281*4882a593Smuzhiyun },
282*4882a593Smuzhiyun [S5M8767_IRQ_RTCA2] = {
283*4882a593Smuzhiyun .reg_offset = 2,
284*4882a593Smuzhiyun .mask = S5M8767_IRQ_RTCA2_MASK,
285*4882a593Smuzhiyun },
286*4882a593Smuzhiyun [S5M8767_IRQ_SMPL] = {
287*4882a593Smuzhiyun .reg_offset = 2,
288*4882a593Smuzhiyun .mask = S5M8767_IRQ_SMPL_MASK,
289*4882a593Smuzhiyun },
290*4882a593Smuzhiyun [S5M8767_IRQ_RTC1S] = {
291*4882a593Smuzhiyun .reg_offset = 2,
292*4882a593Smuzhiyun .mask = S5M8767_IRQ_RTC1S_MASK,
293*4882a593Smuzhiyun },
294*4882a593Smuzhiyun [S5M8767_IRQ_WTSR] = {
295*4882a593Smuzhiyun .reg_offset = 2,
296*4882a593Smuzhiyun .mask = S5M8767_IRQ_WTSR_MASK,
297*4882a593Smuzhiyun },
298*4882a593Smuzhiyun };
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun static const struct regmap_irq s5m8763_irqs[] = {
301*4882a593Smuzhiyun [S5M8763_IRQ_DCINF] = {
302*4882a593Smuzhiyun .reg_offset = 0,
303*4882a593Smuzhiyun .mask = S5M8763_IRQ_DCINF_MASK,
304*4882a593Smuzhiyun },
305*4882a593Smuzhiyun [S5M8763_IRQ_DCINR] = {
306*4882a593Smuzhiyun .reg_offset = 0,
307*4882a593Smuzhiyun .mask = S5M8763_IRQ_DCINR_MASK,
308*4882a593Smuzhiyun },
309*4882a593Smuzhiyun [S5M8763_IRQ_JIGF] = {
310*4882a593Smuzhiyun .reg_offset = 0,
311*4882a593Smuzhiyun .mask = S5M8763_IRQ_JIGF_MASK,
312*4882a593Smuzhiyun },
313*4882a593Smuzhiyun [S5M8763_IRQ_JIGR] = {
314*4882a593Smuzhiyun .reg_offset = 0,
315*4882a593Smuzhiyun .mask = S5M8763_IRQ_JIGR_MASK,
316*4882a593Smuzhiyun },
317*4882a593Smuzhiyun [S5M8763_IRQ_PWRONF] = {
318*4882a593Smuzhiyun .reg_offset = 0,
319*4882a593Smuzhiyun .mask = S5M8763_IRQ_PWRONF_MASK,
320*4882a593Smuzhiyun },
321*4882a593Smuzhiyun [S5M8763_IRQ_PWRONR] = {
322*4882a593Smuzhiyun .reg_offset = 0,
323*4882a593Smuzhiyun .mask = S5M8763_IRQ_PWRONR_MASK,
324*4882a593Smuzhiyun },
325*4882a593Smuzhiyun [S5M8763_IRQ_WTSREVNT] = {
326*4882a593Smuzhiyun .reg_offset = 1,
327*4882a593Smuzhiyun .mask = S5M8763_IRQ_WTSREVNT_MASK,
328*4882a593Smuzhiyun },
329*4882a593Smuzhiyun [S5M8763_IRQ_SMPLEVNT] = {
330*4882a593Smuzhiyun .reg_offset = 1,
331*4882a593Smuzhiyun .mask = S5M8763_IRQ_SMPLEVNT_MASK,
332*4882a593Smuzhiyun },
333*4882a593Smuzhiyun [S5M8763_IRQ_ALARM1] = {
334*4882a593Smuzhiyun .reg_offset = 1,
335*4882a593Smuzhiyun .mask = S5M8763_IRQ_ALARM1_MASK,
336*4882a593Smuzhiyun },
337*4882a593Smuzhiyun [S5M8763_IRQ_ALARM0] = {
338*4882a593Smuzhiyun .reg_offset = 1,
339*4882a593Smuzhiyun .mask = S5M8763_IRQ_ALARM0_MASK,
340*4882a593Smuzhiyun },
341*4882a593Smuzhiyun [S5M8763_IRQ_ONKEY1S] = {
342*4882a593Smuzhiyun .reg_offset = 2,
343*4882a593Smuzhiyun .mask = S5M8763_IRQ_ONKEY1S_MASK,
344*4882a593Smuzhiyun },
345*4882a593Smuzhiyun [S5M8763_IRQ_TOPOFFR] = {
346*4882a593Smuzhiyun .reg_offset = 2,
347*4882a593Smuzhiyun .mask = S5M8763_IRQ_TOPOFFR_MASK,
348*4882a593Smuzhiyun },
349*4882a593Smuzhiyun [S5M8763_IRQ_DCINOVPR] = {
350*4882a593Smuzhiyun .reg_offset = 2,
351*4882a593Smuzhiyun .mask = S5M8763_IRQ_DCINOVPR_MASK,
352*4882a593Smuzhiyun },
353*4882a593Smuzhiyun [S5M8763_IRQ_CHGRSTF] = {
354*4882a593Smuzhiyun .reg_offset = 2,
355*4882a593Smuzhiyun .mask = S5M8763_IRQ_CHGRSTF_MASK,
356*4882a593Smuzhiyun },
357*4882a593Smuzhiyun [S5M8763_IRQ_DONER] = {
358*4882a593Smuzhiyun .reg_offset = 2,
359*4882a593Smuzhiyun .mask = S5M8763_IRQ_DONER_MASK,
360*4882a593Smuzhiyun },
361*4882a593Smuzhiyun [S5M8763_IRQ_CHGFAULT] = {
362*4882a593Smuzhiyun .reg_offset = 2,
363*4882a593Smuzhiyun .mask = S5M8763_IRQ_CHGFAULT_MASK,
364*4882a593Smuzhiyun },
365*4882a593Smuzhiyun [S5M8763_IRQ_LOBAT1] = {
366*4882a593Smuzhiyun .reg_offset = 3,
367*4882a593Smuzhiyun .mask = S5M8763_IRQ_LOBAT1_MASK,
368*4882a593Smuzhiyun },
369*4882a593Smuzhiyun [S5M8763_IRQ_LOBAT2] = {
370*4882a593Smuzhiyun .reg_offset = 3,
371*4882a593Smuzhiyun .mask = S5M8763_IRQ_LOBAT2_MASK,
372*4882a593Smuzhiyun },
373*4882a593Smuzhiyun };
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun static const struct regmap_irq_chip s2mps11_irq_chip = {
376*4882a593Smuzhiyun .name = "s2mps11",
377*4882a593Smuzhiyun .irqs = s2mps11_irqs,
378*4882a593Smuzhiyun .num_irqs = ARRAY_SIZE(s2mps11_irqs),
379*4882a593Smuzhiyun .num_regs = 3,
380*4882a593Smuzhiyun .status_base = S2MPS11_REG_INT1,
381*4882a593Smuzhiyun .mask_base = S2MPS11_REG_INT1M,
382*4882a593Smuzhiyun .ack_base = S2MPS11_REG_INT1,
383*4882a593Smuzhiyun };
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun #define S2MPS1X_IRQ_CHIP_COMMON_DATA \
386*4882a593Smuzhiyun .irqs = s2mps14_irqs, \
387*4882a593Smuzhiyun .num_irqs = ARRAY_SIZE(s2mps14_irqs), \
388*4882a593Smuzhiyun .num_regs = 3, \
389*4882a593Smuzhiyun .status_base = S2MPS14_REG_INT1, \
390*4882a593Smuzhiyun .mask_base = S2MPS14_REG_INT1M, \
391*4882a593Smuzhiyun .ack_base = S2MPS14_REG_INT1 \
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun static const struct regmap_irq_chip s2mps13_irq_chip = {
394*4882a593Smuzhiyun .name = "s2mps13",
395*4882a593Smuzhiyun S2MPS1X_IRQ_CHIP_COMMON_DATA,
396*4882a593Smuzhiyun };
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun static const struct regmap_irq_chip s2mps14_irq_chip = {
399*4882a593Smuzhiyun .name = "s2mps14",
400*4882a593Smuzhiyun S2MPS1X_IRQ_CHIP_COMMON_DATA,
401*4882a593Smuzhiyun };
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun static const struct regmap_irq_chip s2mps15_irq_chip = {
404*4882a593Smuzhiyun .name = "s2mps15",
405*4882a593Smuzhiyun S2MPS1X_IRQ_CHIP_COMMON_DATA,
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun static const struct regmap_irq_chip s2mpu02_irq_chip = {
409*4882a593Smuzhiyun .name = "s2mpu02",
410*4882a593Smuzhiyun .irqs = s2mpu02_irqs,
411*4882a593Smuzhiyun .num_irqs = ARRAY_SIZE(s2mpu02_irqs),
412*4882a593Smuzhiyun .num_regs = 3,
413*4882a593Smuzhiyun .status_base = S2MPU02_REG_INT1,
414*4882a593Smuzhiyun .mask_base = S2MPU02_REG_INT1M,
415*4882a593Smuzhiyun .ack_base = S2MPU02_REG_INT1,
416*4882a593Smuzhiyun };
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun static const struct regmap_irq_chip s5m8767_irq_chip = {
419*4882a593Smuzhiyun .name = "s5m8767",
420*4882a593Smuzhiyun .irqs = s5m8767_irqs,
421*4882a593Smuzhiyun .num_irqs = ARRAY_SIZE(s5m8767_irqs),
422*4882a593Smuzhiyun .num_regs = 3,
423*4882a593Smuzhiyun .status_base = S5M8767_REG_INT1,
424*4882a593Smuzhiyun .mask_base = S5M8767_REG_INT1M,
425*4882a593Smuzhiyun .ack_base = S5M8767_REG_INT1,
426*4882a593Smuzhiyun };
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun static const struct regmap_irq_chip s5m8763_irq_chip = {
429*4882a593Smuzhiyun .name = "s5m8763",
430*4882a593Smuzhiyun .irqs = s5m8763_irqs,
431*4882a593Smuzhiyun .num_irqs = ARRAY_SIZE(s5m8763_irqs),
432*4882a593Smuzhiyun .num_regs = 4,
433*4882a593Smuzhiyun .status_base = S5M8763_REG_IRQ1,
434*4882a593Smuzhiyun .mask_base = S5M8763_REG_IRQM1,
435*4882a593Smuzhiyun .ack_base = S5M8763_REG_IRQ1,
436*4882a593Smuzhiyun };
437*4882a593Smuzhiyun
sec_irq_init(struct sec_pmic_dev * sec_pmic)438*4882a593Smuzhiyun int sec_irq_init(struct sec_pmic_dev *sec_pmic)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun int ret = 0;
441*4882a593Smuzhiyun int type = sec_pmic->device_type;
442*4882a593Smuzhiyun const struct regmap_irq_chip *sec_irq_chip;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun if (!sec_pmic->irq) {
445*4882a593Smuzhiyun dev_warn(sec_pmic->dev,
446*4882a593Smuzhiyun "No interrupt specified, no interrupts\n");
447*4882a593Smuzhiyun sec_pmic->irq_base = 0;
448*4882a593Smuzhiyun return 0;
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun switch (type) {
452*4882a593Smuzhiyun case S5M8763X:
453*4882a593Smuzhiyun sec_irq_chip = &s5m8763_irq_chip;
454*4882a593Smuzhiyun break;
455*4882a593Smuzhiyun case S5M8767X:
456*4882a593Smuzhiyun sec_irq_chip = &s5m8767_irq_chip;
457*4882a593Smuzhiyun break;
458*4882a593Smuzhiyun case S2MPA01:
459*4882a593Smuzhiyun sec_irq_chip = &s2mps14_irq_chip;
460*4882a593Smuzhiyun break;
461*4882a593Smuzhiyun case S2MPS11X:
462*4882a593Smuzhiyun sec_irq_chip = &s2mps11_irq_chip;
463*4882a593Smuzhiyun break;
464*4882a593Smuzhiyun case S2MPS13X:
465*4882a593Smuzhiyun sec_irq_chip = &s2mps13_irq_chip;
466*4882a593Smuzhiyun break;
467*4882a593Smuzhiyun case S2MPS14X:
468*4882a593Smuzhiyun sec_irq_chip = &s2mps14_irq_chip;
469*4882a593Smuzhiyun break;
470*4882a593Smuzhiyun case S2MPS15X:
471*4882a593Smuzhiyun sec_irq_chip = &s2mps15_irq_chip;
472*4882a593Smuzhiyun break;
473*4882a593Smuzhiyun case S2MPU02:
474*4882a593Smuzhiyun sec_irq_chip = &s2mpu02_irq_chip;
475*4882a593Smuzhiyun break;
476*4882a593Smuzhiyun default:
477*4882a593Smuzhiyun dev_err(sec_pmic->dev, "Unknown device type %lu\n",
478*4882a593Smuzhiyun sec_pmic->device_type);
479*4882a593Smuzhiyun return -EINVAL;
480*4882a593Smuzhiyun }
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun ret = devm_regmap_add_irq_chip(sec_pmic->dev, sec_pmic->regmap_pmic,
483*4882a593Smuzhiyun sec_pmic->irq,
484*4882a593Smuzhiyun IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
485*4882a593Smuzhiyun sec_pmic->irq_base, sec_irq_chip,
486*4882a593Smuzhiyun &sec_pmic->irq_data);
487*4882a593Smuzhiyun if (ret != 0) {
488*4882a593Smuzhiyun dev_err(sec_pmic->dev, "Failed to register IRQ chip: %d\n", ret);
489*4882a593Smuzhiyun return ret;
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun /*
493*4882a593Smuzhiyun * The rtc-s5m driver requests S2MPS14_IRQ_RTCA0 also for S2MPS11
494*4882a593Smuzhiyun * so the interrupt number must be consistent.
495*4882a593Smuzhiyun */
496*4882a593Smuzhiyun BUILD_BUG_ON(((enum s2mps14_irq)S2MPS11_IRQ_RTCA0) != S2MPS14_IRQ_RTCA0);
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun return 0;
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sec_irq_init);
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
503*4882a593Smuzhiyun MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
504*4882a593Smuzhiyun MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
505*4882a593Smuzhiyun MODULE_DESCRIPTION("Interrupt support for the S5M MFD");
506*4882a593Smuzhiyun MODULE_LICENSE("GPL");
507