xref: /openbmc/linux/drivers/mfd/wm8350-irq.c (revision e0a3389a)
1 /*
2  * wm8350-irq.c  --  IRQ support for Wolfson WM8350
3  *
4  * Copyright 2007, 2008, 2009 Wolfson Microelectronics PLC.
5  *
6  * Author: Liam Girdwood, Mark Brown
7  *
8  *  This program is free software; you can redistribute  it and/or modify it
9  *  under  the terms of  the GNU General  Public License as published by the
10  *  Free Software Foundation;  either version 2 of the  License, or (at your
11  *  option) any later version.
12  *
13  */
14 
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/init.h>
18 #include <linux/bug.h>
19 #include <linux/device.h>
20 #include <linux/interrupt.h>
21 #include <linux/workqueue.h>
22 
23 #include <linux/mfd/wm8350/core.h>
24 #include <linux/mfd/wm8350/audio.h>
25 #include <linux/mfd/wm8350/comparator.h>
26 #include <linux/mfd/wm8350/gpio.h>
27 #include <linux/mfd/wm8350/pmic.h>
28 #include <linux/mfd/wm8350/rtc.h>
29 #include <linux/mfd/wm8350/supply.h>
30 #include <linux/mfd/wm8350/wdt.h>
31 
32 static void wm8350_irq_call_handler(struct wm8350 *wm8350, int irq)
33 {
34 	mutex_lock(&wm8350->irq_mutex);
35 
36 	if (wm8350->irq[irq].handler)
37 		wm8350->irq[irq].handler(wm8350, irq, wm8350->irq[irq].data);
38 	else {
39 		dev_err(wm8350->dev, "irq %d nobody cared. now masked.\n",
40 			irq);
41 		wm8350_mask_irq(wm8350, irq);
42 	}
43 
44 	mutex_unlock(&wm8350->irq_mutex);
45 }
46 
47 /*
48  * This is a threaded IRQ handler so can access I2C/SPI.  Since all
49  * interrupts are clear on read the IRQ line will be reasserted and
50  * the physical IRQ will be handled again if another interrupt is
51  * asserted while we run - in the normal course of events this is a
52  * rare occurrence so we save I2C/SPI reads.
53  */
54 static irqreturn_t wm8350_irq(int irq, void *data)
55 {
56 	struct wm8350 *wm8350 = data;
57 	u16 level_one, status1, status2, comp;
58 
59 	/* TODO: Use block reads to improve performance? */
60 	level_one = wm8350_reg_read(wm8350, WM8350_SYSTEM_INTERRUPTS)
61 		& ~wm8350_reg_read(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK);
62 	status1 = wm8350_reg_read(wm8350, WM8350_INT_STATUS_1)
63 		& ~wm8350_reg_read(wm8350, WM8350_INT_STATUS_1_MASK);
64 	status2 = wm8350_reg_read(wm8350, WM8350_INT_STATUS_2)
65 		& ~wm8350_reg_read(wm8350, WM8350_INT_STATUS_2_MASK);
66 	comp = wm8350_reg_read(wm8350, WM8350_COMPARATOR_INT_STATUS)
67 		& ~wm8350_reg_read(wm8350, WM8350_COMPARATOR_INT_STATUS_MASK);
68 
69 	/* over current */
70 	if (level_one & WM8350_OC_INT) {
71 		u16 oc;
72 
73 		oc = wm8350_reg_read(wm8350, WM8350_OVER_CURRENT_INT_STATUS);
74 		oc &= ~wm8350_reg_read(wm8350,
75 				       WM8350_OVER_CURRENT_INT_STATUS_MASK);
76 
77 		if (oc & WM8350_OC_LS_EINT)	/* limit switch */
78 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_OC_LS);
79 	}
80 
81 	/* under voltage */
82 	if (level_one & WM8350_UV_INT) {
83 		u16 uv;
84 
85 		uv = wm8350_reg_read(wm8350, WM8350_UNDER_VOLTAGE_INT_STATUS);
86 		uv &= ~wm8350_reg_read(wm8350,
87 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK);
88 
89 		if (uv & WM8350_UV_DC1_EINT)
90 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC1);
91 		if (uv & WM8350_UV_DC2_EINT)
92 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC2);
93 		if (uv & WM8350_UV_DC3_EINT)
94 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC3);
95 		if (uv & WM8350_UV_DC4_EINT)
96 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC4);
97 		if (uv & WM8350_UV_DC5_EINT)
98 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC5);
99 		if (uv & WM8350_UV_DC6_EINT)
100 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC6);
101 		if (uv & WM8350_UV_LDO1_EINT)
102 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_LDO1);
103 		if (uv & WM8350_UV_LDO2_EINT)
104 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_LDO2);
105 		if (uv & WM8350_UV_LDO3_EINT)
106 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_LDO3);
107 		if (uv & WM8350_UV_LDO4_EINT)
108 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_LDO4);
109 	}
110 
111 	/* charger, RTC */
112 	if (status1) {
113 		if (status1 & WM8350_CHG_BAT_HOT_EINT)
114 			wm8350_irq_call_handler(wm8350,
115 						WM8350_IRQ_CHG_BAT_HOT);
116 		if (status1 & WM8350_CHG_BAT_COLD_EINT)
117 			wm8350_irq_call_handler(wm8350,
118 						WM8350_IRQ_CHG_BAT_COLD);
119 		if (status1 & WM8350_CHG_BAT_FAIL_EINT)
120 			wm8350_irq_call_handler(wm8350,
121 						WM8350_IRQ_CHG_BAT_FAIL);
122 		if (status1 & WM8350_CHG_TO_EINT)
123 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_CHG_TO);
124 		if (status1 & WM8350_CHG_END_EINT)
125 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_CHG_END);
126 		if (status1 & WM8350_CHG_START_EINT)
127 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_CHG_START);
128 		if (status1 & WM8350_CHG_FAST_RDY_EINT)
129 			wm8350_irq_call_handler(wm8350,
130 						WM8350_IRQ_CHG_FAST_RDY);
131 		if (status1 & WM8350_CHG_VBATT_LT_3P9_EINT)
132 			wm8350_irq_call_handler(wm8350,
133 						WM8350_IRQ_CHG_VBATT_LT_3P9);
134 		if (status1 & WM8350_CHG_VBATT_LT_3P1_EINT)
135 			wm8350_irq_call_handler(wm8350,
136 						WM8350_IRQ_CHG_VBATT_LT_3P1);
137 		if (status1 & WM8350_CHG_VBATT_LT_2P85_EINT)
138 			wm8350_irq_call_handler(wm8350,
139 						WM8350_IRQ_CHG_VBATT_LT_2P85);
140 		if (status1 & WM8350_RTC_ALM_EINT)
141 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_RTC_ALM);
142 		if (status1 & WM8350_RTC_SEC_EINT)
143 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_RTC_SEC);
144 		if (status1 & WM8350_RTC_PER_EINT)
145 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_RTC_PER);
146 	}
147 
148 	/* current sink, system, aux adc */
149 	if (status2) {
150 		if (status2 & WM8350_CS1_EINT)
151 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_CS1);
152 		if (status2 & WM8350_CS2_EINT)
153 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_CS2);
154 
155 		if (status2 & WM8350_SYS_HYST_COMP_FAIL_EINT)
156 			wm8350_irq_call_handler(wm8350,
157 						WM8350_IRQ_SYS_HYST_COMP_FAIL);
158 		if (status2 & WM8350_SYS_CHIP_GT115_EINT)
159 			wm8350_irq_call_handler(wm8350,
160 						WM8350_IRQ_SYS_CHIP_GT115);
161 		if (status2 & WM8350_SYS_CHIP_GT140_EINT)
162 			wm8350_irq_call_handler(wm8350,
163 						WM8350_IRQ_SYS_CHIP_GT140);
164 		if (status2 & WM8350_SYS_WDOG_TO_EINT)
165 			wm8350_irq_call_handler(wm8350,
166 						WM8350_IRQ_SYS_WDOG_TO);
167 
168 		if (status2 & WM8350_AUXADC_DATARDY_EINT)
169 			wm8350_irq_call_handler(wm8350,
170 						WM8350_IRQ_AUXADC_DATARDY);
171 		if (status2 & WM8350_AUXADC_DCOMP4_EINT)
172 			wm8350_irq_call_handler(wm8350,
173 						WM8350_IRQ_AUXADC_DCOMP4);
174 		if (status2 & WM8350_AUXADC_DCOMP3_EINT)
175 			wm8350_irq_call_handler(wm8350,
176 						WM8350_IRQ_AUXADC_DCOMP3);
177 		if (status2 & WM8350_AUXADC_DCOMP2_EINT)
178 			wm8350_irq_call_handler(wm8350,
179 						WM8350_IRQ_AUXADC_DCOMP2);
180 		if (status2 & WM8350_AUXADC_DCOMP1_EINT)
181 			wm8350_irq_call_handler(wm8350,
182 						WM8350_IRQ_AUXADC_DCOMP1);
183 
184 		if (status2 & WM8350_USB_LIMIT_EINT)
185 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_USB_LIMIT);
186 	}
187 
188 	/* wake, codec, ext */
189 	if (comp) {
190 		if (comp & WM8350_WKUP_OFF_STATE_EINT)
191 			wm8350_irq_call_handler(wm8350,
192 						WM8350_IRQ_WKUP_OFF_STATE);
193 		if (comp & WM8350_WKUP_HIB_STATE_EINT)
194 			wm8350_irq_call_handler(wm8350,
195 						WM8350_IRQ_WKUP_HIB_STATE);
196 		if (comp & WM8350_WKUP_CONV_FAULT_EINT)
197 			wm8350_irq_call_handler(wm8350,
198 						WM8350_IRQ_WKUP_CONV_FAULT);
199 		if (comp & WM8350_WKUP_WDOG_RST_EINT)
200 			wm8350_irq_call_handler(wm8350,
201 						WM8350_IRQ_WKUP_WDOG_RST);
202 		if (comp & WM8350_WKUP_GP_PWR_ON_EINT)
203 			wm8350_irq_call_handler(wm8350,
204 						WM8350_IRQ_WKUP_GP_PWR_ON);
205 		if (comp & WM8350_WKUP_ONKEY_EINT)
206 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_WKUP_ONKEY);
207 		if (comp & WM8350_WKUP_GP_WAKEUP_EINT)
208 			wm8350_irq_call_handler(wm8350,
209 						WM8350_IRQ_WKUP_GP_WAKEUP);
210 
211 		if (comp & WM8350_CODEC_JCK_DET_L_EINT)
212 			wm8350_irq_call_handler(wm8350,
213 						WM8350_IRQ_CODEC_JCK_DET_L);
214 		if (comp & WM8350_CODEC_JCK_DET_R_EINT)
215 			wm8350_irq_call_handler(wm8350,
216 						WM8350_IRQ_CODEC_JCK_DET_R);
217 		if (comp & WM8350_CODEC_MICSCD_EINT)
218 			wm8350_irq_call_handler(wm8350,
219 						WM8350_IRQ_CODEC_MICSCD);
220 		if (comp & WM8350_CODEC_MICD_EINT)
221 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_CODEC_MICD);
222 
223 		if (comp & WM8350_EXT_USB_FB_EINT)
224 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_EXT_USB_FB);
225 		if (comp & WM8350_EXT_WALL_FB_EINT)
226 			wm8350_irq_call_handler(wm8350,
227 						WM8350_IRQ_EXT_WALL_FB);
228 		if (comp & WM8350_EXT_BAT_FB_EINT)
229 			wm8350_irq_call_handler(wm8350, WM8350_IRQ_EXT_BAT_FB);
230 	}
231 
232 	if (level_one & WM8350_GP_INT) {
233 		int i;
234 		u16 gpio;
235 
236 		gpio = wm8350_reg_read(wm8350, WM8350_GPIO_INT_STATUS);
237 		gpio &= ~wm8350_reg_read(wm8350,
238 					 WM8350_GPIO_INT_STATUS_MASK);
239 
240 		for (i = 0; i < 12; i++) {
241 			if (gpio & (1 << i))
242 				wm8350_irq_call_handler(wm8350,
243 							WM8350_IRQ_GPIO(i));
244 		}
245 	}
246 
247 	return IRQ_HANDLED;
248 }
249 
250 int wm8350_register_irq(struct wm8350 *wm8350, int irq,
251 			void (*handler) (struct wm8350 *, int, void *),
252 			void *data)
253 {
254 	if (irq < 0 || irq > WM8350_NUM_IRQ || !handler)
255 		return -EINVAL;
256 
257 	if (wm8350->irq[irq].handler)
258 		return -EBUSY;
259 
260 	mutex_lock(&wm8350->irq_mutex);
261 	wm8350->irq[irq].handler = handler;
262 	wm8350->irq[irq].data = data;
263 	mutex_unlock(&wm8350->irq_mutex);
264 
265 	return 0;
266 }
267 EXPORT_SYMBOL_GPL(wm8350_register_irq);
268 
269 int wm8350_free_irq(struct wm8350 *wm8350, int irq)
270 {
271 	if (irq < 0 || irq > WM8350_NUM_IRQ)
272 		return -EINVAL;
273 
274 	mutex_lock(&wm8350->irq_mutex);
275 	wm8350->irq[irq].handler = NULL;
276 	mutex_unlock(&wm8350->irq_mutex);
277 	return 0;
278 }
279 EXPORT_SYMBOL_GPL(wm8350_free_irq);
280 
281 int wm8350_mask_irq(struct wm8350 *wm8350, int irq)
282 {
283 	switch (irq) {
284 	case WM8350_IRQ_CHG_BAT_HOT:
285 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
286 				       WM8350_IM_CHG_BAT_HOT_EINT);
287 	case WM8350_IRQ_CHG_BAT_COLD:
288 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
289 				       WM8350_IM_CHG_BAT_COLD_EINT);
290 	case WM8350_IRQ_CHG_BAT_FAIL:
291 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
292 				       WM8350_IM_CHG_BAT_FAIL_EINT);
293 	case WM8350_IRQ_CHG_TO:
294 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
295 				       WM8350_IM_CHG_TO_EINT);
296 	case WM8350_IRQ_CHG_END:
297 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
298 				       WM8350_IM_CHG_END_EINT);
299 	case WM8350_IRQ_CHG_START:
300 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
301 				       WM8350_IM_CHG_START_EINT);
302 	case WM8350_IRQ_CHG_FAST_RDY:
303 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
304 				       WM8350_IM_CHG_FAST_RDY_EINT);
305 	case WM8350_IRQ_RTC_PER:
306 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
307 				       WM8350_IM_RTC_PER_EINT);
308 	case WM8350_IRQ_RTC_SEC:
309 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
310 				       WM8350_IM_RTC_SEC_EINT);
311 	case WM8350_IRQ_RTC_ALM:
312 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
313 				       WM8350_IM_RTC_ALM_EINT);
314 	case WM8350_IRQ_CHG_VBATT_LT_3P9:
315 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
316 				       WM8350_IM_CHG_VBATT_LT_3P9_EINT);
317 	case WM8350_IRQ_CHG_VBATT_LT_3P1:
318 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
319 				       WM8350_IM_CHG_VBATT_LT_3P1_EINT);
320 	case WM8350_IRQ_CHG_VBATT_LT_2P85:
321 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
322 				       WM8350_IM_CHG_VBATT_LT_2P85_EINT);
323 	case WM8350_IRQ_CS1:
324 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
325 				       WM8350_IM_CS1_EINT);
326 	case WM8350_IRQ_CS2:
327 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
328 				       WM8350_IM_CS2_EINT);
329 	case WM8350_IRQ_USB_LIMIT:
330 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
331 				       WM8350_IM_USB_LIMIT_EINT);
332 	case WM8350_IRQ_AUXADC_DATARDY:
333 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
334 				       WM8350_IM_AUXADC_DATARDY_EINT);
335 	case WM8350_IRQ_AUXADC_DCOMP4:
336 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
337 				       WM8350_IM_AUXADC_DCOMP4_EINT);
338 	case WM8350_IRQ_AUXADC_DCOMP3:
339 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
340 				       WM8350_IM_AUXADC_DCOMP3_EINT);
341 	case WM8350_IRQ_AUXADC_DCOMP2:
342 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
343 				       WM8350_IM_AUXADC_DCOMP2_EINT);
344 	case WM8350_IRQ_AUXADC_DCOMP1:
345 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
346 				       WM8350_IM_AUXADC_DCOMP1_EINT);
347 	case WM8350_IRQ_SYS_HYST_COMP_FAIL:
348 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
349 				       WM8350_IM_SYS_HYST_COMP_FAIL_EINT);
350 	case WM8350_IRQ_SYS_CHIP_GT115:
351 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
352 				       WM8350_IM_SYS_CHIP_GT115_EINT);
353 	case WM8350_IRQ_SYS_CHIP_GT140:
354 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
355 				       WM8350_IM_SYS_CHIP_GT140_EINT);
356 	case WM8350_IRQ_SYS_WDOG_TO:
357 		return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
358 				       WM8350_IM_SYS_WDOG_TO_EINT);
359 	case WM8350_IRQ_UV_LDO4:
360 		return wm8350_set_bits(wm8350,
361 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
362 				       WM8350_IM_UV_LDO4_EINT);
363 	case WM8350_IRQ_UV_LDO3:
364 		return wm8350_set_bits(wm8350,
365 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
366 				       WM8350_IM_UV_LDO3_EINT);
367 	case WM8350_IRQ_UV_LDO2:
368 		return wm8350_set_bits(wm8350,
369 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
370 				       WM8350_IM_UV_LDO2_EINT);
371 	case WM8350_IRQ_UV_LDO1:
372 		return wm8350_set_bits(wm8350,
373 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
374 				       WM8350_IM_UV_LDO1_EINT);
375 	case WM8350_IRQ_UV_DC6:
376 		return wm8350_set_bits(wm8350,
377 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
378 				       WM8350_IM_UV_DC6_EINT);
379 	case WM8350_IRQ_UV_DC5:
380 		return wm8350_set_bits(wm8350,
381 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
382 				       WM8350_IM_UV_DC5_EINT);
383 	case WM8350_IRQ_UV_DC4:
384 		return wm8350_set_bits(wm8350,
385 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
386 				       WM8350_IM_UV_DC4_EINT);
387 	case WM8350_IRQ_UV_DC3:
388 		return wm8350_set_bits(wm8350,
389 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
390 				       WM8350_IM_UV_DC3_EINT);
391 	case WM8350_IRQ_UV_DC2:
392 		return wm8350_set_bits(wm8350,
393 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
394 				       WM8350_IM_UV_DC2_EINT);
395 	case WM8350_IRQ_UV_DC1:
396 		return wm8350_set_bits(wm8350,
397 				       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
398 				       WM8350_IM_UV_DC1_EINT);
399 	case WM8350_IRQ_OC_LS:
400 		return wm8350_set_bits(wm8350,
401 				       WM8350_OVER_CURRENT_INT_STATUS_MASK,
402 				       WM8350_IM_OC_LS_EINT);
403 	case WM8350_IRQ_EXT_USB_FB:
404 		return wm8350_set_bits(wm8350,
405 				       WM8350_COMPARATOR_INT_STATUS_MASK,
406 				       WM8350_IM_EXT_USB_FB_EINT);
407 	case WM8350_IRQ_EXT_WALL_FB:
408 		return wm8350_set_bits(wm8350,
409 				       WM8350_COMPARATOR_INT_STATUS_MASK,
410 				       WM8350_IM_EXT_WALL_FB_EINT);
411 	case WM8350_IRQ_EXT_BAT_FB:
412 		return wm8350_set_bits(wm8350,
413 				       WM8350_COMPARATOR_INT_STATUS_MASK,
414 				       WM8350_IM_EXT_BAT_FB_EINT);
415 	case WM8350_IRQ_CODEC_JCK_DET_L:
416 		return wm8350_set_bits(wm8350,
417 				       WM8350_COMPARATOR_INT_STATUS_MASK,
418 				       WM8350_IM_CODEC_JCK_DET_L_EINT);
419 	case WM8350_IRQ_CODEC_JCK_DET_R:
420 		return wm8350_set_bits(wm8350,
421 				       WM8350_COMPARATOR_INT_STATUS_MASK,
422 				       WM8350_IM_CODEC_JCK_DET_R_EINT);
423 	case WM8350_IRQ_CODEC_MICSCD:
424 		return wm8350_set_bits(wm8350,
425 				       WM8350_COMPARATOR_INT_STATUS_MASK,
426 				       WM8350_IM_CODEC_MICSCD_EINT);
427 	case WM8350_IRQ_CODEC_MICD:
428 		return wm8350_set_bits(wm8350,
429 				       WM8350_COMPARATOR_INT_STATUS_MASK,
430 				       WM8350_IM_CODEC_MICD_EINT);
431 	case WM8350_IRQ_WKUP_OFF_STATE:
432 		return wm8350_set_bits(wm8350,
433 				       WM8350_COMPARATOR_INT_STATUS_MASK,
434 				       WM8350_IM_WKUP_OFF_STATE_EINT);
435 	case WM8350_IRQ_WKUP_HIB_STATE:
436 		return wm8350_set_bits(wm8350,
437 				       WM8350_COMPARATOR_INT_STATUS_MASK,
438 				       WM8350_IM_WKUP_HIB_STATE_EINT);
439 	case WM8350_IRQ_WKUP_CONV_FAULT:
440 		return wm8350_set_bits(wm8350,
441 				       WM8350_COMPARATOR_INT_STATUS_MASK,
442 				       WM8350_IM_WKUP_CONV_FAULT_EINT);
443 	case WM8350_IRQ_WKUP_WDOG_RST:
444 		return wm8350_set_bits(wm8350,
445 				       WM8350_COMPARATOR_INT_STATUS_MASK,
446 				       WM8350_IM_WKUP_OFF_STATE_EINT);
447 	case WM8350_IRQ_WKUP_GP_PWR_ON:
448 		return wm8350_set_bits(wm8350,
449 				       WM8350_COMPARATOR_INT_STATUS_MASK,
450 				       WM8350_IM_WKUP_GP_PWR_ON_EINT);
451 	case WM8350_IRQ_WKUP_ONKEY:
452 		return wm8350_set_bits(wm8350,
453 				       WM8350_COMPARATOR_INT_STATUS_MASK,
454 				       WM8350_IM_WKUP_ONKEY_EINT);
455 	case WM8350_IRQ_WKUP_GP_WAKEUP:
456 		return wm8350_set_bits(wm8350,
457 				       WM8350_COMPARATOR_INT_STATUS_MASK,
458 				       WM8350_IM_WKUP_GP_WAKEUP_EINT);
459 	case WM8350_IRQ_GPIO(0):
460 		return wm8350_set_bits(wm8350,
461 				       WM8350_GPIO_INT_STATUS_MASK,
462 				       WM8350_IM_GP0_EINT);
463 	case WM8350_IRQ_GPIO(1):
464 		return wm8350_set_bits(wm8350,
465 				       WM8350_GPIO_INT_STATUS_MASK,
466 				       WM8350_IM_GP1_EINT);
467 	case WM8350_IRQ_GPIO(2):
468 		return wm8350_set_bits(wm8350,
469 				       WM8350_GPIO_INT_STATUS_MASK,
470 				       WM8350_IM_GP2_EINT);
471 	case WM8350_IRQ_GPIO(3):
472 		return wm8350_set_bits(wm8350,
473 				       WM8350_GPIO_INT_STATUS_MASK,
474 				       WM8350_IM_GP3_EINT);
475 	case WM8350_IRQ_GPIO(4):
476 		return wm8350_set_bits(wm8350,
477 				       WM8350_GPIO_INT_STATUS_MASK,
478 				       WM8350_IM_GP4_EINT);
479 	case WM8350_IRQ_GPIO(5):
480 		return wm8350_set_bits(wm8350,
481 				       WM8350_GPIO_INT_STATUS_MASK,
482 				       WM8350_IM_GP5_EINT);
483 	case WM8350_IRQ_GPIO(6):
484 		return wm8350_set_bits(wm8350,
485 				       WM8350_GPIO_INT_STATUS_MASK,
486 				       WM8350_IM_GP6_EINT);
487 	case WM8350_IRQ_GPIO(7):
488 		return wm8350_set_bits(wm8350,
489 				       WM8350_GPIO_INT_STATUS_MASK,
490 				       WM8350_IM_GP7_EINT);
491 	case WM8350_IRQ_GPIO(8):
492 		return wm8350_set_bits(wm8350,
493 				       WM8350_GPIO_INT_STATUS_MASK,
494 				       WM8350_IM_GP8_EINT);
495 	case WM8350_IRQ_GPIO(9):
496 		return wm8350_set_bits(wm8350,
497 				       WM8350_GPIO_INT_STATUS_MASK,
498 				       WM8350_IM_GP9_EINT);
499 	case WM8350_IRQ_GPIO(10):
500 		return wm8350_set_bits(wm8350,
501 				       WM8350_GPIO_INT_STATUS_MASK,
502 				       WM8350_IM_GP10_EINT);
503 	case WM8350_IRQ_GPIO(11):
504 		return wm8350_set_bits(wm8350,
505 				       WM8350_GPIO_INT_STATUS_MASK,
506 				       WM8350_IM_GP11_EINT);
507 	case WM8350_IRQ_GPIO(12):
508 		return wm8350_set_bits(wm8350,
509 				       WM8350_GPIO_INT_STATUS_MASK,
510 				       WM8350_IM_GP12_EINT);
511 	default:
512 		dev_warn(wm8350->dev, "Attempting to mask unknown IRQ %d\n",
513 			 irq);
514 		return -EINVAL;
515 	}
516 	return 0;
517 }
518 EXPORT_SYMBOL_GPL(wm8350_mask_irq);
519 
520 int wm8350_unmask_irq(struct wm8350 *wm8350, int irq)
521 {
522 	switch (irq) {
523 	case WM8350_IRQ_CHG_BAT_HOT:
524 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
525 					 WM8350_IM_CHG_BAT_HOT_EINT);
526 	case WM8350_IRQ_CHG_BAT_COLD:
527 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
528 					 WM8350_IM_CHG_BAT_COLD_EINT);
529 	case WM8350_IRQ_CHG_BAT_FAIL:
530 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
531 					 WM8350_IM_CHG_BAT_FAIL_EINT);
532 	case WM8350_IRQ_CHG_TO:
533 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
534 					 WM8350_IM_CHG_TO_EINT);
535 	case WM8350_IRQ_CHG_END:
536 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
537 					 WM8350_IM_CHG_END_EINT);
538 	case WM8350_IRQ_CHG_START:
539 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
540 					 WM8350_IM_CHG_START_EINT);
541 	case WM8350_IRQ_CHG_FAST_RDY:
542 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
543 					 WM8350_IM_CHG_FAST_RDY_EINT);
544 	case WM8350_IRQ_RTC_PER:
545 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
546 					 WM8350_IM_RTC_PER_EINT);
547 	case WM8350_IRQ_RTC_SEC:
548 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
549 					 WM8350_IM_RTC_SEC_EINT);
550 	case WM8350_IRQ_RTC_ALM:
551 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
552 					 WM8350_IM_RTC_ALM_EINT);
553 	case WM8350_IRQ_CHG_VBATT_LT_3P9:
554 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
555 					 WM8350_IM_CHG_VBATT_LT_3P9_EINT);
556 	case WM8350_IRQ_CHG_VBATT_LT_3P1:
557 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
558 					 WM8350_IM_CHG_VBATT_LT_3P1_EINT);
559 	case WM8350_IRQ_CHG_VBATT_LT_2P85:
560 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
561 					 WM8350_IM_CHG_VBATT_LT_2P85_EINT);
562 	case WM8350_IRQ_CS1:
563 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
564 					 WM8350_IM_CS1_EINT);
565 	case WM8350_IRQ_CS2:
566 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
567 					 WM8350_IM_CS2_EINT);
568 	case WM8350_IRQ_USB_LIMIT:
569 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
570 					 WM8350_IM_USB_LIMIT_EINT);
571 	case WM8350_IRQ_AUXADC_DATARDY:
572 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
573 					 WM8350_IM_AUXADC_DATARDY_EINT);
574 	case WM8350_IRQ_AUXADC_DCOMP4:
575 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
576 					 WM8350_IM_AUXADC_DCOMP4_EINT);
577 	case WM8350_IRQ_AUXADC_DCOMP3:
578 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
579 					 WM8350_IM_AUXADC_DCOMP3_EINT);
580 	case WM8350_IRQ_AUXADC_DCOMP2:
581 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
582 					 WM8350_IM_AUXADC_DCOMP2_EINT);
583 	case WM8350_IRQ_AUXADC_DCOMP1:
584 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
585 					 WM8350_IM_AUXADC_DCOMP1_EINT);
586 	case WM8350_IRQ_SYS_HYST_COMP_FAIL:
587 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
588 					 WM8350_IM_SYS_HYST_COMP_FAIL_EINT);
589 	case WM8350_IRQ_SYS_CHIP_GT115:
590 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
591 					 WM8350_IM_SYS_CHIP_GT115_EINT);
592 	case WM8350_IRQ_SYS_CHIP_GT140:
593 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
594 					 WM8350_IM_SYS_CHIP_GT140_EINT);
595 	case WM8350_IRQ_SYS_WDOG_TO:
596 		return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
597 					 WM8350_IM_SYS_WDOG_TO_EINT);
598 	case WM8350_IRQ_UV_LDO4:
599 		return wm8350_clear_bits(wm8350,
600 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
601 					 WM8350_IM_UV_LDO4_EINT);
602 	case WM8350_IRQ_UV_LDO3:
603 		return wm8350_clear_bits(wm8350,
604 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
605 					 WM8350_IM_UV_LDO3_EINT);
606 	case WM8350_IRQ_UV_LDO2:
607 		return wm8350_clear_bits(wm8350,
608 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
609 					 WM8350_IM_UV_LDO2_EINT);
610 	case WM8350_IRQ_UV_LDO1:
611 		return wm8350_clear_bits(wm8350,
612 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
613 					 WM8350_IM_UV_LDO1_EINT);
614 	case WM8350_IRQ_UV_DC6:
615 		return wm8350_clear_bits(wm8350,
616 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
617 					 WM8350_IM_UV_DC6_EINT);
618 	case WM8350_IRQ_UV_DC5:
619 		return wm8350_clear_bits(wm8350,
620 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
621 					 WM8350_IM_UV_DC5_EINT);
622 	case WM8350_IRQ_UV_DC4:
623 		return wm8350_clear_bits(wm8350,
624 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
625 					 WM8350_IM_UV_DC4_EINT);
626 	case WM8350_IRQ_UV_DC3:
627 		return wm8350_clear_bits(wm8350,
628 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
629 					 WM8350_IM_UV_DC3_EINT);
630 	case WM8350_IRQ_UV_DC2:
631 		return wm8350_clear_bits(wm8350,
632 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
633 					 WM8350_IM_UV_DC2_EINT);
634 	case WM8350_IRQ_UV_DC1:
635 		return wm8350_clear_bits(wm8350,
636 					 WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
637 					 WM8350_IM_UV_DC1_EINT);
638 	case WM8350_IRQ_OC_LS:
639 		return wm8350_clear_bits(wm8350,
640 					 WM8350_OVER_CURRENT_INT_STATUS_MASK,
641 					 WM8350_IM_OC_LS_EINT);
642 	case WM8350_IRQ_EXT_USB_FB:
643 		return wm8350_clear_bits(wm8350,
644 					 WM8350_COMPARATOR_INT_STATUS_MASK,
645 					 WM8350_IM_EXT_USB_FB_EINT);
646 	case WM8350_IRQ_EXT_WALL_FB:
647 		return wm8350_clear_bits(wm8350,
648 					 WM8350_COMPARATOR_INT_STATUS_MASK,
649 					 WM8350_IM_EXT_WALL_FB_EINT);
650 	case WM8350_IRQ_EXT_BAT_FB:
651 		return wm8350_clear_bits(wm8350,
652 					 WM8350_COMPARATOR_INT_STATUS_MASK,
653 					 WM8350_IM_EXT_BAT_FB_EINT);
654 	case WM8350_IRQ_CODEC_JCK_DET_L:
655 		return wm8350_clear_bits(wm8350,
656 					 WM8350_COMPARATOR_INT_STATUS_MASK,
657 					 WM8350_IM_CODEC_JCK_DET_L_EINT);
658 	case WM8350_IRQ_CODEC_JCK_DET_R:
659 		return wm8350_clear_bits(wm8350,
660 					 WM8350_COMPARATOR_INT_STATUS_MASK,
661 					 WM8350_IM_CODEC_JCK_DET_R_EINT);
662 	case WM8350_IRQ_CODEC_MICSCD:
663 		return wm8350_clear_bits(wm8350,
664 					 WM8350_COMPARATOR_INT_STATUS_MASK,
665 					 WM8350_IM_CODEC_MICSCD_EINT);
666 	case WM8350_IRQ_CODEC_MICD:
667 		return wm8350_clear_bits(wm8350,
668 					 WM8350_COMPARATOR_INT_STATUS_MASK,
669 					 WM8350_IM_CODEC_MICD_EINT);
670 	case WM8350_IRQ_WKUP_OFF_STATE:
671 		return wm8350_clear_bits(wm8350,
672 					 WM8350_COMPARATOR_INT_STATUS_MASK,
673 					 WM8350_IM_WKUP_OFF_STATE_EINT);
674 	case WM8350_IRQ_WKUP_HIB_STATE:
675 		return wm8350_clear_bits(wm8350,
676 					 WM8350_COMPARATOR_INT_STATUS_MASK,
677 					 WM8350_IM_WKUP_HIB_STATE_EINT);
678 	case WM8350_IRQ_WKUP_CONV_FAULT:
679 		return wm8350_clear_bits(wm8350,
680 					 WM8350_COMPARATOR_INT_STATUS_MASK,
681 					 WM8350_IM_WKUP_CONV_FAULT_EINT);
682 	case WM8350_IRQ_WKUP_WDOG_RST:
683 		return wm8350_clear_bits(wm8350,
684 					 WM8350_COMPARATOR_INT_STATUS_MASK,
685 					 WM8350_IM_WKUP_OFF_STATE_EINT);
686 	case WM8350_IRQ_WKUP_GP_PWR_ON:
687 		return wm8350_clear_bits(wm8350,
688 					 WM8350_COMPARATOR_INT_STATUS_MASK,
689 					 WM8350_IM_WKUP_GP_PWR_ON_EINT);
690 	case WM8350_IRQ_WKUP_ONKEY:
691 		return wm8350_clear_bits(wm8350,
692 					 WM8350_COMPARATOR_INT_STATUS_MASK,
693 					 WM8350_IM_WKUP_ONKEY_EINT);
694 	case WM8350_IRQ_WKUP_GP_WAKEUP:
695 		return wm8350_clear_bits(wm8350,
696 					 WM8350_COMPARATOR_INT_STATUS_MASK,
697 					 WM8350_IM_WKUP_GP_WAKEUP_EINT);
698 	case WM8350_IRQ_GPIO(0):
699 		return wm8350_clear_bits(wm8350,
700 					 WM8350_GPIO_INT_STATUS_MASK,
701 					 WM8350_IM_GP0_EINT);
702 	case WM8350_IRQ_GPIO(1):
703 		return wm8350_clear_bits(wm8350,
704 					 WM8350_GPIO_INT_STATUS_MASK,
705 					 WM8350_IM_GP1_EINT);
706 	case WM8350_IRQ_GPIO(2):
707 		return wm8350_clear_bits(wm8350,
708 					 WM8350_GPIO_INT_STATUS_MASK,
709 					 WM8350_IM_GP2_EINT);
710 	case WM8350_IRQ_GPIO(3):
711 		return wm8350_clear_bits(wm8350,
712 					 WM8350_GPIO_INT_STATUS_MASK,
713 					 WM8350_IM_GP3_EINT);
714 	case WM8350_IRQ_GPIO(4):
715 		return wm8350_clear_bits(wm8350,
716 					 WM8350_GPIO_INT_STATUS_MASK,
717 					 WM8350_IM_GP4_EINT);
718 	case WM8350_IRQ_GPIO(5):
719 		return wm8350_clear_bits(wm8350,
720 					 WM8350_GPIO_INT_STATUS_MASK,
721 					 WM8350_IM_GP5_EINT);
722 	case WM8350_IRQ_GPIO(6):
723 		return wm8350_clear_bits(wm8350,
724 					 WM8350_GPIO_INT_STATUS_MASK,
725 					 WM8350_IM_GP6_EINT);
726 	case WM8350_IRQ_GPIO(7):
727 		return wm8350_clear_bits(wm8350,
728 					 WM8350_GPIO_INT_STATUS_MASK,
729 					 WM8350_IM_GP7_EINT);
730 	case WM8350_IRQ_GPIO(8):
731 		return wm8350_clear_bits(wm8350,
732 					 WM8350_GPIO_INT_STATUS_MASK,
733 					 WM8350_IM_GP8_EINT);
734 	case WM8350_IRQ_GPIO(9):
735 		return wm8350_clear_bits(wm8350,
736 					 WM8350_GPIO_INT_STATUS_MASK,
737 					 WM8350_IM_GP9_EINT);
738 	case WM8350_IRQ_GPIO(10):
739 		return wm8350_clear_bits(wm8350,
740 					 WM8350_GPIO_INT_STATUS_MASK,
741 					 WM8350_IM_GP10_EINT);
742 	case WM8350_IRQ_GPIO(11):
743 		return wm8350_clear_bits(wm8350,
744 					 WM8350_GPIO_INT_STATUS_MASK,
745 					 WM8350_IM_GP11_EINT);
746 	case WM8350_IRQ_GPIO(12):
747 		return wm8350_clear_bits(wm8350,
748 					 WM8350_GPIO_INT_STATUS_MASK,
749 					 WM8350_IM_GP12_EINT);
750 	default:
751 		dev_warn(wm8350->dev, "Attempting to unmask unknown IRQ %d\n",
752 			 irq);
753 		return -EINVAL;
754 	}
755 	return 0;
756 }
757 EXPORT_SYMBOL_GPL(wm8350_unmask_irq);
758 
759 int wm8350_irq_init(struct wm8350 *wm8350, int irq,
760 		    struct wm8350_platform_data *pdata)
761 {
762 	int ret;
763 	int flags = IRQF_ONESHOT;
764 
765 	if (!irq) {
766 		dev_err(wm8350->dev, "No IRQ configured\n");
767 		return -EINVAL;
768 	}
769 
770 	wm8350_reg_write(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK, 0xFFFF);
771 	wm8350_reg_write(wm8350, WM8350_INT_STATUS_1_MASK, 0xFFFF);
772 	wm8350_reg_write(wm8350, WM8350_INT_STATUS_2_MASK, 0xFFFF);
773 	wm8350_reg_write(wm8350, WM8350_UNDER_VOLTAGE_INT_STATUS_MASK, 0xFFFF);
774 	wm8350_reg_write(wm8350, WM8350_GPIO_INT_STATUS_MASK, 0xFFFF);
775 	wm8350_reg_write(wm8350, WM8350_COMPARATOR_INT_STATUS_MASK, 0xFFFF);
776 
777 	mutex_init(&wm8350->irq_mutex);
778 	wm8350->chip_irq = irq;
779 
780 	if (pdata && pdata->irq_high) {
781 		flags |= IRQF_TRIGGER_HIGH;
782 
783 		wm8350_set_bits(wm8350, WM8350_SYSTEM_CONTROL_1,
784 				WM8350_IRQ_POL);
785 	} else {
786 		flags |= IRQF_TRIGGER_LOW;
787 
788 		wm8350_clear_bits(wm8350, WM8350_SYSTEM_CONTROL_1,
789 				  WM8350_IRQ_POL);
790 	}
791 
792 	ret = request_threaded_irq(irq, NULL, wm8350_irq, flags,
793 				   "wm8350", wm8350);
794 	if (ret != 0)
795 		dev_err(wm8350->dev, "Failed to request IRQ: %d\n", ret);
796 
797 	return ret;
798 }
799 
800 int wm8350_irq_exit(struct wm8350 *wm8350)
801 {
802 	free_irq(wm8350->chip_irq, wm8350);
803 	return 0;
804 }
805