xref: /openbmc/linux/drivers/mfd/wm831x-core.c (revision 6abeae2a)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * wm831x-core.c  --  Device access for Wolfson WM831x PMICs
4  *
5  * Copyright 2009 Wolfson Microelectronics PLC.
6  *
7  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
8  */
9 
10 #include <linux/kernel.h>
11 #include <linux/init.h>
12 #include <linux/export.h>
13 #include <linux/bcd.h>
14 #include <linux/delay.h>
15 #include <linux/mfd/core.h>
16 #include <linux/slab.h>
17 #include <linux/err.h>
18 #include <linux/of.h>
19 #include <linux/of_device.h>
20 
21 #include <linux/mfd/wm831x/core.h>
22 #include <linux/mfd/wm831x/pdata.h>
23 #include <linux/mfd/wm831x/irq.h>
24 #include <linux/mfd/wm831x/auxadc.h>
25 #include <linux/mfd/wm831x/otp.h>
26 #include <linux/mfd/wm831x/pmu.h>
27 #include <linux/mfd/wm831x/regulator.h>
28 
29 /* Current settings - values are 2*2^(reg_val/4) microamps.  These are
30  * exported since they are used by multiple drivers.
31  */
32 const unsigned int wm831x_isinkv_values[WM831X_ISINK_MAX_ISEL + 1] = {
33 	2,
34 	2,
35 	3,
36 	3,
37 	4,
38 	5,
39 	6,
40 	7,
41 	8,
42 	10,
43 	11,
44 	13,
45 	16,
46 	19,
47 	23,
48 	27,
49 	32,
50 	38,
51 	45,
52 	54,
53 	64,
54 	76,
55 	91,
56 	108,
57 	128,
58 	152,
59 	181,
60 	215,
61 	256,
62 	304,
63 	362,
64 	431,
65 	512,
66 	609,
67 	724,
68 	861,
69 	1024,
70 	1218,
71 	1448,
72 	1722,
73 	2048,
74 	2435,
75 	2896,
76 	3444,
77 	4096,
78 	4871,
79 	5793,
80 	6889,
81 	8192,
82 	9742,
83 	11585,
84 	13777,
85 	16384,
86 	19484,
87 	23170,
88 	27554,
89 };
90 EXPORT_SYMBOL_GPL(wm831x_isinkv_values);
91 
92 static int wm831x_reg_locked(struct wm831x *wm831x, unsigned short reg)
93 {
94 	if (!wm831x->locked)
95 		return 0;
96 
97 	switch (reg) {
98 	case WM831X_WATCHDOG:
99 	case WM831X_DC4_CONTROL:
100 	case WM831X_ON_PIN_CONTROL:
101 	case WM831X_BACKUP_CHARGER_CONTROL:
102 	case WM831X_CHARGER_CONTROL_1:
103 	case WM831X_CHARGER_CONTROL_2:
104 		return 1;
105 
106 	default:
107 		return 0;
108 	}
109 }
110 
111 /**
112  * wm831x_reg_unlock: Unlock user keyed registers
113  *
114  * The WM831x has a user key preventing writes to particularly
115  * critical registers.  This function locks those registers,
116  * allowing writes to them.
117  *
118  * @wm831x: pointer to local driver data structure
119  */
120 void wm831x_reg_lock(struct wm831x *wm831x)
121 {
122 	int ret;
123 
124 	ret = wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0);
125 	if (ret == 0) {
126 		dev_vdbg(wm831x->dev, "Registers locked\n");
127 
128 		mutex_lock(&wm831x->io_lock);
129 		WARN_ON(wm831x->locked);
130 		wm831x->locked = 1;
131 		mutex_unlock(&wm831x->io_lock);
132 	} else {
133 		dev_err(wm831x->dev, "Failed to lock registers: %d\n", ret);
134 	}
135 
136 }
137 EXPORT_SYMBOL_GPL(wm831x_reg_lock);
138 
139 /**
140  * wm831x_reg_unlock: Unlock user keyed registers
141  *
142  * The WM831x has a user key preventing writes to particularly
143  * critical registers.  This function locks those registers,
144  * preventing spurious writes.
145  *
146  * @wm831x: pointer to local driver data structure
147  */
148 int wm831x_reg_unlock(struct wm831x *wm831x)
149 {
150 	int ret;
151 
152 	/* 0x9716 is the value required to unlock the registers */
153 	ret = wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0x9716);
154 	if (ret == 0) {
155 		dev_vdbg(wm831x->dev, "Registers unlocked\n");
156 
157 		mutex_lock(&wm831x->io_lock);
158 		WARN_ON(!wm831x->locked);
159 		wm831x->locked = 0;
160 		mutex_unlock(&wm831x->io_lock);
161 	}
162 
163 	return ret;
164 }
165 EXPORT_SYMBOL_GPL(wm831x_reg_unlock);
166 
167 static bool wm831x_reg_readable(struct device *dev, unsigned int reg)
168 {
169 	switch (reg) {
170 	case WM831X_RESET_ID:
171 	case WM831X_REVISION:
172 	case WM831X_PARENT_ID:
173 	case WM831X_SYSVDD_CONTROL:
174 	case WM831X_THERMAL_MONITORING:
175 	case WM831X_POWER_STATE:
176 	case WM831X_WATCHDOG:
177 	case WM831X_ON_PIN_CONTROL:
178 	case WM831X_RESET_CONTROL:
179 	case WM831X_CONTROL_INTERFACE:
180 	case WM831X_SECURITY_KEY:
181 	case WM831X_SOFTWARE_SCRATCH:
182 	case WM831X_OTP_CONTROL:
183 	case WM831X_GPIO_LEVEL:
184 	case WM831X_SYSTEM_STATUS:
185 	case WM831X_ON_SOURCE:
186 	case WM831X_OFF_SOURCE:
187 	case WM831X_SYSTEM_INTERRUPTS:
188 	case WM831X_INTERRUPT_STATUS_1:
189 	case WM831X_INTERRUPT_STATUS_2:
190 	case WM831X_INTERRUPT_STATUS_3:
191 	case WM831X_INTERRUPT_STATUS_4:
192 	case WM831X_INTERRUPT_STATUS_5:
193 	case WM831X_IRQ_CONFIG:
194 	case WM831X_SYSTEM_INTERRUPTS_MASK:
195 	case WM831X_INTERRUPT_STATUS_1_MASK:
196 	case WM831X_INTERRUPT_STATUS_2_MASK:
197 	case WM831X_INTERRUPT_STATUS_3_MASK:
198 	case WM831X_INTERRUPT_STATUS_4_MASK:
199 	case WM831X_INTERRUPT_STATUS_5_MASK:
200 	case WM831X_RTC_WRITE_COUNTER:
201 	case WM831X_RTC_TIME_1:
202 	case WM831X_RTC_TIME_2:
203 	case WM831X_RTC_ALARM_1:
204 	case WM831X_RTC_ALARM_2:
205 	case WM831X_RTC_CONTROL:
206 	case WM831X_RTC_TRIM:
207 	case WM831X_TOUCH_CONTROL_1:
208 	case WM831X_TOUCH_CONTROL_2:
209 	case WM831X_TOUCH_DATA_X:
210 	case WM831X_TOUCH_DATA_Y:
211 	case WM831X_TOUCH_DATA_Z:
212 	case WM831X_AUXADC_DATA:
213 	case WM831X_AUXADC_CONTROL:
214 	case WM831X_AUXADC_SOURCE:
215 	case WM831X_COMPARATOR_CONTROL:
216 	case WM831X_COMPARATOR_1:
217 	case WM831X_COMPARATOR_2:
218 	case WM831X_COMPARATOR_3:
219 	case WM831X_COMPARATOR_4:
220 	case WM831X_GPIO1_CONTROL:
221 	case WM831X_GPIO2_CONTROL:
222 	case WM831X_GPIO3_CONTROL:
223 	case WM831X_GPIO4_CONTROL:
224 	case WM831X_GPIO5_CONTROL:
225 	case WM831X_GPIO6_CONTROL:
226 	case WM831X_GPIO7_CONTROL:
227 	case WM831X_GPIO8_CONTROL:
228 	case WM831X_GPIO9_CONTROL:
229 	case WM831X_GPIO10_CONTROL:
230 	case WM831X_GPIO11_CONTROL:
231 	case WM831X_GPIO12_CONTROL:
232 	case WM831X_GPIO13_CONTROL:
233 	case WM831X_GPIO14_CONTROL:
234 	case WM831X_GPIO15_CONTROL:
235 	case WM831X_GPIO16_CONTROL:
236 	case WM831X_CHARGER_CONTROL_1:
237 	case WM831X_CHARGER_CONTROL_2:
238 	case WM831X_CHARGER_STATUS:
239 	case WM831X_BACKUP_CHARGER_CONTROL:
240 	case WM831X_STATUS_LED_1:
241 	case WM831X_STATUS_LED_2:
242 	case WM831X_CURRENT_SINK_1:
243 	case WM831X_CURRENT_SINK_2:
244 	case WM831X_DCDC_ENABLE:
245 	case WM831X_LDO_ENABLE:
246 	case WM831X_DCDC_STATUS:
247 	case WM831X_LDO_STATUS:
248 	case WM831X_DCDC_UV_STATUS:
249 	case WM831X_LDO_UV_STATUS:
250 	case WM831X_DC1_CONTROL_1:
251 	case WM831X_DC1_CONTROL_2:
252 	case WM831X_DC1_ON_CONFIG:
253 	case WM831X_DC1_SLEEP_CONTROL:
254 	case WM831X_DC1_DVS_CONTROL:
255 	case WM831X_DC2_CONTROL_1:
256 	case WM831X_DC2_CONTROL_2:
257 	case WM831X_DC2_ON_CONFIG:
258 	case WM831X_DC2_SLEEP_CONTROL:
259 	case WM831X_DC2_DVS_CONTROL:
260 	case WM831X_DC3_CONTROL_1:
261 	case WM831X_DC3_CONTROL_2:
262 	case WM831X_DC3_ON_CONFIG:
263 	case WM831X_DC3_SLEEP_CONTROL:
264 	case WM831X_DC4_CONTROL:
265 	case WM831X_DC4_SLEEP_CONTROL:
266 	case WM831X_EPE1_CONTROL:
267 	case WM831X_EPE2_CONTROL:
268 	case WM831X_LDO1_CONTROL:
269 	case WM831X_LDO1_ON_CONTROL:
270 	case WM831X_LDO1_SLEEP_CONTROL:
271 	case WM831X_LDO2_CONTROL:
272 	case WM831X_LDO2_ON_CONTROL:
273 	case WM831X_LDO2_SLEEP_CONTROL:
274 	case WM831X_LDO3_CONTROL:
275 	case WM831X_LDO3_ON_CONTROL:
276 	case WM831X_LDO3_SLEEP_CONTROL:
277 	case WM831X_LDO4_CONTROL:
278 	case WM831X_LDO4_ON_CONTROL:
279 	case WM831X_LDO4_SLEEP_CONTROL:
280 	case WM831X_LDO5_CONTROL:
281 	case WM831X_LDO5_ON_CONTROL:
282 	case WM831X_LDO5_SLEEP_CONTROL:
283 	case WM831X_LDO6_CONTROL:
284 	case WM831X_LDO6_ON_CONTROL:
285 	case WM831X_LDO6_SLEEP_CONTROL:
286 	case WM831X_LDO7_CONTROL:
287 	case WM831X_LDO7_ON_CONTROL:
288 	case WM831X_LDO7_SLEEP_CONTROL:
289 	case WM831X_LDO8_CONTROL:
290 	case WM831X_LDO8_ON_CONTROL:
291 	case WM831X_LDO8_SLEEP_CONTROL:
292 	case WM831X_LDO9_CONTROL:
293 	case WM831X_LDO9_ON_CONTROL:
294 	case WM831X_LDO9_SLEEP_CONTROL:
295 	case WM831X_LDO10_CONTROL:
296 	case WM831X_LDO10_ON_CONTROL:
297 	case WM831X_LDO10_SLEEP_CONTROL:
298 	case WM831X_LDO11_ON_CONTROL:
299 	case WM831X_LDO11_SLEEP_CONTROL:
300 	case WM831X_POWER_GOOD_SOURCE_1:
301 	case WM831X_POWER_GOOD_SOURCE_2:
302 	case WM831X_CLOCK_CONTROL_1:
303 	case WM831X_CLOCK_CONTROL_2:
304 	case WM831X_FLL_CONTROL_1:
305 	case WM831X_FLL_CONTROL_2:
306 	case WM831X_FLL_CONTROL_3:
307 	case WM831X_FLL_CONTROL_4:
308 	case WM831X_FLL_CONTROL_5:
309 	case WM831X_UNIQUE_ID_1:
310 	case WM831X_UNIQUE_ID_2:
311 	case WM831X_UNIQUE_ID_3:
312 	case WM831X_UNIQUE_ID_4:
313 	case WM831X_UNIQUE_ID_5:
314 	case WM831X_UNIQUE_ID_6:
315 	case WM831X_UNIQUE_ID_7:
316 	case WM831X_UNIQUE_ID_8:
317 	case WM831X_FACTORY_OTP_ID:
318 	case WM831X_FACTORY_OTP_1:
319 	case WM831X_FACTORY_OTP_2:
320 	case WM831X_FACTORY_OTP_3:
321 	case WM831X_FACTORY_OTP_4:
322 	case WM831X_FACTORY_OTP_5:
323 	case WM831X_CUSTOMER_OTP_ID:
324 	case WM831X_DC1_OTP_CONTROL:
325 	case WM831X_DC2_OTP_CONTROL:
326 	case WM831X_DC3_OTP_CONTROL:
327 	case WM831X_LDO1_2_OTP_CONTROL:
328 	case WM831X_LDO3_4_OTP_CONTROL:
329 	case WM831X_LDO5_6_OTP_CONTROL:
330 	case WM831X_LDO7_8_OTP_CONTROL:
331 	case WM831X_LDO9_10_OTP_CONTROL:
332 	case WM831X_LDO11_EPE_CONTROL:
333 	case WM831X_GPIO1_OTP_CONTROL:
334 	case WM831X_GPIO2_OTP_CONTROL:
335 	case WM831X_GPIO3_OTP_CONTROL:
336 	case WM831X_GPIO4_OTP_CONTROL:
337 	case WM831X_GPIO5_OTP_CONTROL:
338 	case WM831X_GPIO6_OTP_CONTROL:
339 	case WM831X_DBE_CHECK_DATA:
340 		return true;
341 	default:
342 		return false;
343 	}
344 }
345 
346 static bool wm831x_reg_writeable(struct device *dev, unsigned int reg)
347 {
348 	struct wm831x *wm831x = dev_get_drvdata(dev);
349 
350 	if (wm831x_reg_locked(wm831x, reg))
351 		return false;
352 
353 	switch (reg) {
354 	case WM831X_SYSVDD_CONTROL:
355 	case WM831X_THERMAL_MONITORING:
356 	case WM831X_POWER_STATE:
357 	case WM831X_WATCHDOG:
358 	case WM831X_ON_PIN_CONTROL:
359 	case WM831X_RESET_CONTROL:
360 	case WM831X_CONTROL_INTERFACE:
361 	case WM831X_SECURITY_KEY:
362 	case WM831X_SOFTWARE_SCRATCH:
363 	case WM831X_OTP_CONTROL:
364 	case WM831X_GPIO_LEVEL:
365 	case WM831X_INTERRUPT_STATUS_1:
366 	case WM831X_INTERRUPT_STATUS_2:
367 	case WM831X_INTERRUPT_STATUS_3:
368 	case WM831X_INTERRUPT_STATUS_4:
369 	case WM831X_INTERRUPT_STATUS_5:
370 	case WM831X_IRQ_CONFIG:
371 	case WM831X_SYSTEM_INTERRUPTS_MASK:
372 	case WM831X_INTERRUPT_STATUS_1_MASK:
373 	case WM831X_INTERRUPT_STATUS_2_MASK:
374 	case WM831X_INTERRUPT_STATUS_3_MASK:
375 	case WM831X_INTERRUPT_STATUS_4_MASK:
376 	case WM831X_INTERRUPT_STATUS_5_MASK:
377 	case WM831X_RTC_TIME_1:
378 	case WM831X_RTC_TIME_2:
379 	case WM831X_RTC_ALARM_1:
380 	case WM831X_RTC_ALARM_2:
381 	case WM831X_RTC_CONTROL:
382 	case WM831X_RTC_TRIM:
383 	case WM831X_TOUCH_CONTROL_1:
384 	case WM831X_TOUCH_CONTROL_2:
385 	case WM831X_AUXADC_CONTROL:
386 	case WM831X_AUXADC_SOURCE:
387 	case WM831X_COMPARATOR_CONTROL:
388 	case WM831X_COMPARATOR_1:
389 	case WM831X_COMPARATOR_2:
390 	case WM831X_COMPARATOR_3:
391 	case WM831X_COMPARATOR_4:
392 	case WM831X_GPIO1_CONTROL:
393 	case WM831X_GPIO2_CONTROL:
394 	case WM831X_GPIO3_CONTROL:
395 	case WM831X_GPIO4_CONTROL:
396 	case WM831X_GPIO5_CONTROL:
397 	case WM831X_GPIO6_CONTROL:
398 	case WM831X_GPIO7_CONTROL:
399 	case WM831X_GPIO8_CONTROL:
400 	case WM831X_GPIO9_CONTROL:
401 	case WM831X_GPIO10_CONTROL:
402 	case WM831X_GPIO11_CONTROL:
403 	case WM831X_GPIO12_CONTROL:
404 	case WM831X_GPIO13_CONTROL:
405 	case WM831X_GPIO14_CONTROL:
406 	case WM831X_GPIO15_CONTROL:
407 	case WM831X_GPIO16_CONTROL:
408 	case WM831X_CHARGER_CONTROL_1:
409 	case WM831X_CHARGER_CONTROL_2:
410 	case WM831X_CHARGER_STATUS:
411 	case WM831X_BACKUP_CHARGER_CONTROL:
412 	case WM831X_STATUS_LED_1:
413 	case WM831X_STATUS_LED_2:
414 	case WM831X_CURRENT_SINK_1:
415 	case WM831X_CURRENT_SINK_2:
416 	case WM831X_DCDC_ENABLE:
417 	case WM831X_LDO_ENABLE:
418 	case WM831X_DC1_CONTROL_1:
419 	case WM831X_DC1_CONTROL_2:
420 	case WM831X_DC1_ON_CONFIG:
421 	case WM831X_DC1_SLEEP_CONTROL:
422 	case WM831X_DC1_DVS_CONTROL:
423 	case WM831X_DC2_CONTROL_1:
424 	case WM831X_DC2_CONTROL_2:
425 	case WM831X_DC2_ON_CONFIG:
426 	case WM831X_DC2_SLEEP_CONTROL:
427 	case WM831X_DC2_DVS_CONTROL:
428 	case WM831X_DC3_CONTROL_1:
429 	case WM831X_DC3_CONTROL_2:
430 	case WM831X_DC3_ON_CONFIG:
431 	case WM831X_DC3_SLEEP_CONTROL:
432 	case WM831X_DC4_CONTROL:
433 	case WM831X_DC4_SLEEP_CONTROL:
434 	case WM831X_EPE1_CONTROL:
435 	case WM831X_EPE2_CONTROL:
436 	case WM831X_LDO1_CONTROL:
437 	case WM831X_LDO1_ON_CONTROL:
438 	case WM831X_LDO1_SLEEP_CONTROL:
439 	case WM831X_LDO2_CONTROL:
440 	case WM831X_LDO2_ON_CONTROL:
441 	case WM831X_LDO2_SLEEP_CONTROL:
442 	case WM831X_LDO3_CONTROL:
443 	case WM831X_LDO3_ON_CONTROL:
444 	case WM831X_LDO3_SLEEP_CONTROL:
445 	case WM831X_LDO4_CONTROL:
446 	case WM831X_LDO4_ON_CONTROL:
447 	case WM831X_LDO4_SLEEP_CONTROL:
448 	case WM831X_LDO5_CONTROL:
449 	case WM831X_LDO5_ON_CONTROL:
450 	case WM831X_LDO5_SLEEP_CONTROL:
451 	case WM831X_LDO6_CONTROL:
452 	case WM831X_LDO6_ON_CONTROL:
453 	case WM831X_LDO6_SLEEP_CONTROL:
454 	case WM831X_LDO7_CONTROL:
455 	case WM831X_LDO7_ON_CONTROL:
456 	case WM831X_LDO7_SLEEP_CONTROL:
457 	case WM831X_LDO8_CONTROL:
458 	case WM831X_LDO8_ON_CONTROL:
459 	case WM831X_LDO8_SLEEP_CONTROL:
460 	case WM831X_LDO9_CONTROL:
461 	case WM831X_LDO9_ON_CONTROL:
462 	case WM831X_LDO9_SLEEP_CONTROL:
463 	case WM831X_LDO10_CONTROL:
464 	case WM831X_LDO10_ON_CONTROL:
465 	case WM831X_LDO10_SLEEP_CONTROL:
466 	case WM831X_LDO11_ON_CONTROL:
467 	case WM831X_LDO11_SLEEP_CONTROL:
468 	case WM831X_POWER_GOOD_SOURCE_1:
469 	case WM831X_POWER_GOOD_SOURCE_2:
470 	case WM831X_CLOCK_CONTROL_1:
471 	case WM831X_CLOCK_CONTROL_2:
472 	case WM831X_FLL_CONTROL_1:
473 	case WM831X_FLL_CONTROL_2:
474 	case WM831X_FLL_CONTROL_3:
475 	case WM831X_FLL_CONTROL_4:
476 	case WM831X_FLL_CONTROL_5:
477 		return true;
478 	default:
479 		return false;
480 	}
481 }
482 
483 static bool wm831x_reg_volatile(struct device *dev, unsigned int reg)
484 {
485 	switch (reg) {
486 	case WM831X_SYSTEM_STATUS:
487 	case WM831X_ON_SOURCE:
488 	case WM831X_OFF_SOURCE:
489 	case WM831X_GPIO_LEVEL:
490 	case WM831X_SYSTEM_INTERRUPTS:
491 	case WM831X_INTERRUPT_STATUS_1:
492 	case WM831X_INTERRUPT_STATUS_2:
493 	case WM831X_INTERRUPT_STATUS_3:
494 	case WM831X_INTERRUPT_STATUS_4:
495 	case WM831X_INTERRUPT_STATUS_5:
496 	case WM831X_RTC_TIME_1:
497 	case WM831X_RTC_TIME_2:
498 	case WM831X_TOUCH_DATA_X:
499 	case WM831X_TOUCH_DATA_Y:
500 	case WM831X_TOUCH_DATA_Z:
501 	case WM831X_AUXADC_DATA:
502 	case WM831X_CHARGER_STATUS:
503 	case WM831X_DCDC_STATUS:
504 	case WM831X_LDO_STATUS:
505 	case WM831X_DCDC_UV_STATUS:
506 	case WM831X_LDO_UV_STATUS:
507 		return true;
508 	default:
509 		return false;
510 	}
511 }
512 
513 /**
514  * wm831x_reg_read: Read a single WM831x register.
515  *
516  * @wm831x: Device to read from.
517  * @reg: Register to read.
518  */
519 int wm831x_reg_read(struct wm831x *wm831x, unsigned short reg)
520 {
521 	unsigned int val;
522 	int ret;
523 
524 	ret = regmap_read(wm831x->regmap, reg, &val);
525 
526 	if (ret < 0)
527 		return ret;
528 	else
529 		return val;
530 }
531 EXPORT_SYMBOL_GPL(wm831x_reg_read);
532 
533 /**
534  * wm831x_bulk_read: Read multiple WM831x registers
535  *
536  * @wm831x: Device to read from
537  * @reg: First register
538  * @count: Number of registers
539  * @buf: Buffer to fill.
540  */
541 int wm831x_bulk_read(struct wm831x *wm831x, unsigned short reg,
542 		     int count, u16 *buf)
543 {
544 	return regmap_bulk_read(wm831x->regmap, reg, buf, count);
545 }
546 EXPORT_SYMBOL_GPL(wm831x_bulk_read);
547 
548 static int wm831x_write(struct wm831x *wm831x, unsigned short reg,
549 			int bytes, void *src)
550 {
551 	u16 *buf = src;
552 	int i, ret;
553 
554 	BUG_ON(bytes % 2);
555 	BUG_ON(bytes <= 0);
556 
557 	for (i = 0; i < bytes / 2; i++) {
558 		if (wm831x_reg_locked(wm831x, reg))
559 			return -EPERM;
560 
561 		dev_vdbg(wm831x->dev, "Write %04x to R%d(0x%x)\n",
562 			 buf[i], reg + i, reg + i);
563 		ret = regmap_write(wm831x->regmap, reg + i, buf[i]);
564 		if (ret != 0)
565 			return ret;
566 	}
567 
568 	return 0;
569 }
570 
571 /**
572  * wm831x_reg_write: Write a single WM831x register.
573  *
574  * @wm831x: Device to write to.
575  * @reg: Register to write to.
576  * @val: Value to write.
577  */
578 int wm831x_reg_write(struct wm831x *wm831x, unsigned short reg,
579 		     unsigned short val)
580 {
581 	int ret;
582 
583 	mutex_lock(&wm831x->io_lock);
584 
585 	ret = wm831x_write(wm831x, reg, 2, &val);
586 
587 	mutex_unlock(&wm831x->io_lock);
588 
589 	return ret;
590 }
591 EXPORT_SYMBOL_GPL(wm831x_reg_write);
592 
593 /**
594  * wm831x_set_bits: Set the value of a bitfield in a WM831x register
595  *
596  * @wm831x: Device to write to.
597  * @reg: Register to write to.
598  * @mask: Mask of bits to set.
599  * @val: Value to set (unshifted)
600  */
601 int wm831x_set_bits(struct wm831x *wm831x, unsigned short reg,
602 		    unsigned short mask, unsigned short val)
603 {
604 	int ret;
605 
606 	mutex_lock(&wm831x->io_lock);
607 
608 	if (!wm831x_reg_locked(wm831x, reg))
609 		ret = regmap_update_bits(wm831x->regmap, reg, mask, val);
610 	else
611 		ret = -EPERM;
612 
613 	mutex_unlock(&wm831x->io_lock);
614 
615 	return ret;
616 }
617 EXPORT_SYMBOL_GPL(wm831x_set_bits);
618 
619 static const struct resource wm831x_dcdc1_resources[] = {
620 	{
621 		.start = WM831X_DC1_CONTROL_1,
622 		.end   = WM831X_DC1_DVS_CONTROL,
623 		.flags = IORESOURCE_REG,
624 	},
625 	{
626 		.name  = "UV",
627 		.start = WM831X_IRQ_UV_DC1,
628 		.end   = WM831X_IRQ_UV_DC1,
629 		.flags = IORESOURCE_IRQ,
630 	},
631 	{
632 		.name  = "HC",
633 		.start = WM831X_IRQ_HC_DC1,
634 		.end   = WM831X_IRQ_HC_DC1,
635 		.flags = IORESOURCE_IRQ,
636 	},
637 };
638 
639 
640 static const struct resource wm831x_dcdc2_resources[] = {
641 	{
642 		.start = WM831X_DC2_CONTROL_1,
643 		.end   = WM831X_DC2_DVS_CONTROL,
644 		.flags = IORESOURCE_REG,
645 	},
646 	{
647 		.name  = "UV",
648 		.start = WM831X_IRQ_UV_DC2,
649 		.end   = WM831X_IRQ_UV_DC2,
650 		.flags = IORESOURCE_IRQ,
651 	},
652 	{
653 		.name  = "HC",
654 		.start = WM831X_IRQ_HC_DC2,
655 		.end   = WM831X_IRQ_HC_DC2,
656 		.flags = IORESOURCE_IRQ,
657 	},
658 };
659 
660 static const struct resource wm831x_dcdc3_resources[] = {
661 	{
662 		.start = WM831X_DC3_CONTROL_1,
663 		.end   = WM831X_DC3_SLEEP_CONTROL,
664 		.flags = IORESOURCE_REG,
665 	},
666 	{
667 		.name  = "UV",
668 		.start = WM831X_IRQ_UV_DC3,
669 		.end   = WM831X_IRQ_UV_DC3,
670 		.flags = IORESOURCE_IRQ,
671 	},
672 };
673 
674 static const struct resource wm831x_dcdc4_resources[] = {
675 	{
676 		.start = WM831X_DC4_CONTROL,
677 		.end   = WM831X_DC4_SLEEP_CONTROL,
678 		.flags = IORESOURCE_REG,
679 	},
680 	{
681 		.name  = "UV",
682 		.start = WM831X_IRQ_UV_DC4,
683 		.end   = WM831X_IRQ_UV_DC4,
684 		.flags = IORESOURCE_IRQ,
685 	},
686 };
687 
688 static const struct resource wm8320_dcdc4_buck_resources[] = {
689 	{
690 		.start = WM831X_DC4_CONTROL,
691 		.end   = WM832X_DC4_SLEEP_CONTROL,
692 		.flags = IORESOURCE_REG,
693 	},
694 	{
695 		.name  = "UV",
696 		.start = WM831X_IRQ_UV_DC4,
697 		.end   = WM831X_IRQ_UV_DC4,
698 		.flags = IORESOURCE_IRQ,
699 	},
700 };
701 
702 static const struct resource wm831x_gpio_resources[] = {
703 	{
704 		.start = WM831X_IRQ_GPIO_1,
705 		.end   = WM831X_IRQ_GPIO_16,
706 		.flags = IORESOURCE_IRQ,
707 	},
708 };
709 
710 static const struct resource wm831x_isink1_resources[] = {
711 	{
712 		.start = WM831X_CURRENT_SINK_1,
713 		.end   = WM831X_CURRENT_SINK_1,
714 		.flags = IORESOURCE_REG,
715 	},
716 	{
717 		.start = WM831X_IRQ_CS1,
718 		.end   = WM831X_IRQ_CS1,
719 		.flags = IORESOURCE_IRQ,
720 	},
721 };
722 
723 static const struct resource wm831x_isink2_resources[] = {
724 	{
725 		.start = WM831X_CURRENT_SINK_2,
726 		.end   = WM831X_CURRENT_SINK_2,
727 		.flags = IORESOURCE_REG,
728 	},
729 	{
730 		.start = WM831X_IRQ_CS2,
731 		.end   = WM831X_IRQ_CS2,
732 		.flags = IORESOURCE_IRQ,
733 	},
734 };
735 
736 static const struct resource wm831x_ldo1_resources[] = {
737 	{
738 		.start = WM831X_LDO1_CONTROL,
739 		.end   = WM831X_LDO1_SLEEP_CONTROL,
740 		.flags = IORESOURCE_REG,
741 	},
742 	{
743 		.name  = "UV",
744 		.start = WM831X_IRQ_UV_LDO1,
745 		.end   = WM831X_IRQ_UV_LDO1,
746 		.flags = IORESOURCE_IRQ,
747 	},
748 };
749 
750 static const struct resource wm831x_ldo2_resources[] = {
751 	{
752 		.start = WM831X_LDO2_CONTROL,
753 		.end   = WM831X_LDO2_SLEEP_CONTROL,
754 		.flags = IORESOURCE_REG,
755 	},
756 	{
757 		.name  = "UV",
758 		.start = WM831X_IRQ_UV_LDO2,
759 		.end   = WM831X_IRQ_UV_LDO2,
760 		.flags = IORESOURCE_IRQ,
761 	},
762 };
763 
764 static const struct resource wm831x_ldo3_resources[] = {
765 	{
766 		.start = WM831X_LDO3_CONTROL,
767 		.end   = WM831X_LDO3_SLEEP_CONTROL,
768 		.flags = IORESOURCE_REG,
769 	},
770 	{
771 		.name  = "UV",
772 		.start = WM831X_IRQ_UV_LDO3,
773 		.end   = WM831X_IRQ_UV_LDO3,
774 		.flags = IORESOURCE_IRQ,
775 	},
776 };
777 
778 static const struct resource wm831x_ldo4_resources[] = {
779 	{
780 		.start = WM831X_LDO4_CONTROL,
781 		.end   = WM831X_LDO4_SLEEP_CONTROL,
782 		.flags = IORESOURCE_REG,
783 	},
784 	{
785 		.name  = "UV",
786 		.start = WM831X_IRQ_UV_LDO4,
787 		.end   = WM831X_IRQ_UV_LDO4,
788 		.flags = IORESOURCE_IRQ,
789 	},
790 };
791 
792 static const struct resource wm831x_ldo5_resources[] = {
793 	{
794 		.start = WM831X_LDO5_CONTROL,
795 		.end   = WM831X_LDO5_SLEEP_CONTROL,
796 		.flags = IORESOURCE_REG,
797 	},
798 	{
799 		.name  = "UV",
800 		.start = WM831X_IRQ_UV_LDO5,
801 		.end   = WM831X_IRQ_UV_LDO5,
802 		.flags = IORESOURCE_IRQ,
803 	},
804 };
805 
806 static const struct resource wm831x_ldo6_resources[] = {
807 	{
808 		.start = WM831X_LDO6_CONTROL,
809 		.end   = WM831X_LDO6_SLEEP_CONTROL,
810 		.flags = IORESOURCE_REG,
811 	},
812 	{
813 		.name  = "UV",
814 		.start = WM831X_IRQ_UV_LDO6,
815 		.end   = WM831X_IRQ_UV_LDO6,
816 		.flags = IORESOURCE_IRQ,
817 	},
818 };
819 
820 static const struct resource wm831x_ldo7_resources[] = {
821 	{
822 		.start = WM831X_LDO7_CONTROL,
823 		.end   = WM831X_LDO7_SLEEP_CONTROL,
824 		.flags = IORESOURCE_REG,
825 	},
826 	{
827 		.name  = "UV",
828 		.start = WM831X_IRQ_UV_LDO7,
829 		.end   = WM831X_IRQ_UV_LDO7,
830 		.flags = IORESOURCE_IRQ,
831 	},
832 };
833 
834 static const struct resource wm831x_ldo8_resources[] = {
835 	{
836 		.start = WM831X_LDO8_CONTROL,
837 		.end   = WM831X_LDO8_SLEEP_CONTROL,
838 		.flags = IORESOURCE_REG,
839 	},
840 	{
841 		.name  = "UV",
842 		.start = WM831X_IRQ_UV_LDO8,
843 		.end   = WM831X_IRQ_UV_LDO8,
844 		.flags = IORESOURCE_IRQ,
845 	},
846 };
847 
848 static const struct resource wm831x_ldo9_resources[] = {
849 	{
850 		.start = WM831X_LDO9_CONTROL,
851 		.end   = WM831X_LDO9_SLEEP_CONTROL,
852 		.flags = IORESOURCE_REG,
853 	},
854 	{
855 		.name  = "UV",
856 		.start = WM831X_IRQ_UV_LDO9,
857 		.end   = WM831X_IRQ_UV_LDO9,
858 		.flags = IORESOURCE_IRQ,
859 	},
860 };
861 
862 static const struct resource wm831x_ldo10_resources[] = {
863 	{
864 		.start = WM831X_LDO10_CONTROL,
865 		.end   = WM831X_LDO10_SLEEP_CONTROL,
866 		.flags = IORESOURCE_REG,
867 	},
868 	{
869 		.name  = "UV",
870 		.start = WM831X_IRQ_UV_LDO10,
871 		.end   = WM831X_IRQ_UV_LDO10,
872 		.flags = IORESOURCE_IRQ,
873 	},
874 };
875 
876 static const struct resource wm831x_ldo11_resources[] = {
877 	{
878 		.start = WM831X_LDO11_ON_CONTROL,
879 		.end   = WM831X_LDO11_SLEEP_CONTROL,
880 		.flags = IORESOURCE_REG,
881 	},
882 };
883 
884 static const struct resource wm831x_on_resources[] = {
885 	{
886 		.start = WM831X_IRQ_ON,
887 		.end   = WM831X_IRQ_ON,
888 		.flags = IORESOURCE_IRQ,
889 	},
890 };
891 
892 
893 static const struct resource wm831x_power_resources[] = {
894 	{
895 		.name = "SYSLO",
896 		.start = WM831X_IRQ_PPM_SYSLO,
897 		.end   = WM831X_IRQ_PPM_SYSLO,
898 		.flags = IORESOURCE_IRQ,
899 	},
900 	{
901 		.name = "PWR SRC",
902 		.start = WM831X_IRQ_PPM_PWR_SRC,
903 		.end   = WM831X_IRQ_PPM_PWR_SRC,
904 		.flags = IORESOURCE_IRQ,
905 	},
906 	{
907 		.name = "USB CURR",
908 		.start = WM831X_IRQ_PPM_USB_CURR,
909 		.end   = WM831X_IRQ_PPM_USB_CURR,
910 		.flags = IORESOURCE_IRQ,
911 	},
912 	{
913 		.name = "BATT HOT",
914 		.start = WM831X_IRQ_CHG_BATT_HOT,
915 		.end   = WM831X_IRQ_CHG_BATT_HOT,
916 		.flags = IORESOURCE_IRQ,
917 	},
918 	{
919 		.name = "BATT COLD",
920 		.start = WM831X_IRQ_CHG_BATT_COLD,
921 		.end   = WM831X_IRQ_CHG_BATT_COLD,
922 		.flags = IORESOURCE_IRQ,
923 	},
924 	{
925 		.name = "BATT FAIL",
926 		.start = WM831X_IRQ_CHG_BATT_FAIL,
927 		.end   = WM831X_IRQ_CHG_BATT_FAIL,
928 		.flags = IORESOURCE_IRQ,
929 	},
930 	{
931 		.name = "OV",
932 		.start = WM831X_IRQ_CHG_OV,
933 		.end   = WM831X_IRQ_CHG_OV,
934 		.flags = IORESOURCE_IRQ,
935 	},
936 	{
937 		.name = "END",
938 		.start = WM831X_IRQ_CHG_END,
939 		.end   = WM831X_IRQ_CHG_END,
940 		.flags = IORESOURCE_IRQ,
941 	},
942 	{
943 		.name = "TO",
944 		.start = WM831X_IRQ_CHG_TO,
945 		.end   = WM831X_IRQ_CHG_TO,
946 		.flags = IORESOURCE_IRQ,
947 	},
948 	{
949 		.name = "MODE",
950 		.start = WM831X_IRQ_CHG_MODE,
951 		.end   = WM831X_IRQ_CHG_MODE,
952 		.flags = IORESOURCE_IRQ,
953 	},
954 	{
955 		.name = "START",
956 		.start = WM831X_IRQ_CHG_START,
957 		.end   = WM831X_IRQ_CHG_START,
958 		.flags = IORESOURCE_IRQ,
959 	},
960 };
961 
962 static const struct resource wm831x_rtc_resources[] = {
963 	{
964 		.name = "PER",
965 		.start = WM831X_IRQ_RTC_PER,
966 		.end   = WM831X_IRQ_RTC_PER,
967 		.flags = IORESOURCE_IRQ,
968 	},
969 	{
970 		.name = "ALM",
971 		.start = WM831X_IRQ_RTC_ALM,
972 		.end   = WM831X_IRQ_RTC_ALM,
973 		.flags = IORESOURCE_IRQ,
974 	},
975 };
976 
977 static const struct resource wm831x_status1_resources[] = {
978 	{
979 		.start = WM831X_STATUS_LED_1,
980 		.end   = WM831X_STATUS_LED_1,
981 		.flags = IORESOURCE_REG,
982 	},
983 };
984 
985 static const struct resource wm831x_status2_resources[] = {
986 	{
987 		.start = WM831X_STATUS_LED_2,
988 		.end   = WM831X_STATUS_LED_2,
989 		.flags = IORESOURCE_REG,
990 	},
991 };
992 
993 static const struct resource wm831x_touch_resources[] = {
994 	{
995 		.name = "TCHPD",
996 		.start = WM831X_IRQ_TCHPD,
997 		.end   = WM831X_IRQ_TCHPD,
998 		.flags = IORESOURCE_IRQ,
999 	},
1000 	{
1001 		.name = "TCHDATA",
1002 		.start = WM831X_IRQ_TCHDATA,
1003 		.end   = WM831X_IRQ_TCHDATA,
1004 		.flags = IORESOURCE_IRQ,
1005 	},
1006 };
1007 
1008 static const struct resource wm831x_wdt_resources[] = {
1009 	{
1010 		.start = WM831X_IRQ_WDOG_TO,
1011 		.end   = WM831X_IRQ_WDOG_TO,
1012 		.flags = IORESOURCE_IRQ,
1013 	},
1014 };
1015 
1016 static const struct mfd_cell wm8310_devs[] = {
1017 	{
1018 		.name = "wm831x-backup",
1019 	},
1020 	{
1021 		.name = "wm831x-buckv",
1022 		.id = 1,
1023 		.num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1024 		.resources = wm831x_dcdc1_resources,
1025 	},
1026 	{
1027 		.name = "wm831x-buckv",
1028 		.id = 2,
1029 		.num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1030 		.resources = wm831x_dcdc2_resources,
1031 	},
1032 	{
1033 		.name = "wm831x-buckp",
1034 		.id = 3,
1035 		.num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1036 		.resources = wm831x_dcdc3_resources,
1037 	},
1038 	{
1039 		.name = "wm831x-boostp",
1040 		.id = 4,
1041 		.num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1042 		.resources = wm831x_dcdc4_resources,
1043 	},
1044 	{
1045 		.name = "wm831x-clk",
1046 	},
1047 	{
1048 		.name = "wm831x-epe",
1049 		.id = 1,
1050 	},
1051 	{
1052 		.name = "wm831x-epe",
1053 		.id = 2,
1054 	},
1055 	{
1056 		.name = "wm831x-gpio",
1057 		.num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1058 		.resources = wm831x_gpio_resources,
1059 	},
1060 	{
1061 		.name = "wm831x-hwmon",
1062 	},
1063 	{
1064 		.name = "wm831x-isink",
1065 		.id = 1,
1066 		.num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1067 		.resources = wm831x_isink1_resources,
1068 	},
1069 	{
1070 		.name = "wm831x-isink",
1071 		.id = 2,
1072 		.num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1073 		.resources = wm831x_isink2_resources,
1074 	},
1075 	{
1076 		.name = "wm831x-ldo",
1077 		.id = 1,
1078 		.num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1079 		.resources = wm831x_ldo1_resources,
1080 	},
1081 	{
1082 		.name = "wm831x-ldo",
1083 		.id = 2,
1084 		.num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1085 		.resources = wm831x_ldo2_resources,
1086 	},
1087 	{
1088 		.name = "wm831x-ldo",
1089 		.id = 3,
1090 		.num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1091 		.resources = wm831x_ldo3_resources,
1092 	},
1093 	{
1094 		.name = "wm831x-ldo",
1095 		.id = 4,
1096 		.num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1097 		.resources = wm831x_ldo4_resources,
1098 	},
1099 	{
1100 		.name = "wm831x-ldo",
1101 		.id = 5,
1102 		.num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1103 		.resources = wm831x_ldo5_resources,
1104 	},
1105 	{
1106 		.name = "wm831x-ldo",
1107 		.id = 6,
1108 		.num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1109 		.resources = wm831x_ldo6_resources,
1110 	},
1111 	{
1112 		.name = "wm831x-aldo",
1113 		.id = 7,
1114 		.num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1115 		.resources = wm831x_ldo7_resources,
1116 	},
1117 	{
1118 		.name = "wm831x-aldo",
1119 		.id = 8,
1120 		.num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1121 		.resources = wm831x_ldo8_resources,
1122 	},
1123 	{
1124 		.name = "wm831x-aldo",
1125 		.id = 9,
1126 		.num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1127 		.resources = wm831x_ldo9_resources,
1128 	},
1129 	{
1130 		.name = "wm831x-aldo",
1131 		.id = 10,
1132 		.num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1133 		.resources = wm831x_ldo10_resources,
1134 	},
1135 	{
1136 		.name = "wm831x-alive-ldo",
1137 		.id = 11,
1138 		.num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1139 		.resources = wm831x_ldo11_resources,
1140 	},
1141 	{
1142 		.name = "wm831x-on",
1143 		.num_resources = ARRAY_SIZE(wm831x_on_resources),
1144 		.resources = wm831x_on_resources,
1145 	},
1146 	{
1147 		.name = "wm831x-power",
1148 		.num_resources = ARRAY_SIZE(wm831x_power_resources),
1149 		.resources = wm831x_power_resources,
1150 	},
1151 	{
1152 		.name = "wm831x-status",
1153 		.id = 1,
1154 		.num_resources = ARRAY_SIZE(wm831x_status1_resources),
1155 		.resources = wm831x_status1_resources,
1156 	},
1157 	{
1158 		.name = "wm831x-status",
1159 		.id = 2,
1160 		.num_resources = ARRAY_SIZE(wm831x_status2_resources),
1161 		.resources = wm831x_status2_resources,
1162 	},
1163 	{
1164 		.name = "wm831x-watchdog",
1165 		.num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1166 		.resources = wm831x_wdt_resources,
1167 	},
1168 };
1169 
1170 static const struct mfd_cell wm8311_devs[] = {
1171 	{
1172 		.name = "wm831x-backup",
1173 	},
1174 	{
1175 		.name = "wm831x-buckv",
1176 		.id = 1,
1177 		.num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1178 		.resources = wm831x_dcdc1_resources,
1179 	},
1180 	{
1181 		.name = "wm831x-buckv",
1182 		.id = 2,
1183 		.num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1184 		.resources = wm831x_dcdc2_resources,
1185 	},
1186 	{
1187 		.name = "wm831x-buckp",
1188 		.id = 3,
1189 		.num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1190 		.resources = wm831x_dcdc3_resources,
1191 	},
1192 	{
1193 		.name = "wm831x-boostp",
1194 		.id = 4,
1195 		.num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1196 		.resources = wm831x_dcdc4_resources,
1197 	},
1198 	{
1199 		.name = "wm831x-clk",
1200 	},
1201 	{
1202 		.name = "wm831x-epe",
1203 		.id = 1,
1204 	},
1205 	{
1206 		.name = "wm831x-epe",
1207 		.id = 2,
1208 	},
1209 	{
1210 		.name = "wm831x-gpio",
1211 		.num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1212 		.resources = wm831x_gpio_resources,
1213 	},
1214 	{
1215 		.name = "wm831x-hwmon",
1216 	},
1217 	{
1218 		.name = "wm831x-isink",
1219 		.id = 1,
1220 		.num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1221 		.resources = wm831x_isink1_resources,
1222 	},
1223 	{
1224 		.name = "wm831x-isink",
1225 		.id = 2,
1226 		.num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1227 		.resources = wm831x_isink2_resources,
1228 	},
1229 	{
1230 		.name = "wm831x-ldo",
1231 		.id = 1,
1232 		.num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1233 		.resources = wm831x_ldo1_resources,
1234 	},
1235 	{
1236 		.name = "wm831x-ldo",
1237 		.id = 2,
1238 		.num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1239 		.resources = wm831x_ldo2_resources,
1240 	},
1241 	{
1242 		.name = "wm831x-ldo",
1243 		.id = 3,
1244 		.num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1245 		.resources = wm831x_ldo3_resources,
1246 	},
1247 	{
1248 		.name = "wm831x-ldo",
1249 		.id = 4,
1250 		.num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1251 		.resources = wm831x_ldo4_resources,
1252 	},
1253 	{
1254 		.name = "wm831x-ldo",
1255 		.id = 5,
1256 		.num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1257 		.resources = wm831x_ldo5_resources,
1258 	},
1259 	{
1260 		.name = "wm831x-aldo",
1261 		.id = 7,
1262 		.num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1263 		.resources = wm831x_ldo7_resources,
1264 	},
1265 	{
1266 		.name = "wm831x-alive-ldo",
1267 		.id = 11,
1268 		.num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1269 		.resources = wm831x_ldo11_resources,
1270 	},
1271 	{
1272 		.name = "wm831x-on",
1273 		.num_resources = ARRAY_SIZE(wm831x_on_resources),
1274 		.resources = wm831x_on_resources,
1275 	},
1276 	{
1277 		.name = "wm831x-power",
1278 		.num_resources = ARRAY_SIZE(wm831x_power_resources),
1279 		.resources = wm831x_power_resources,
1280 	},
1281 	{
1282 		.name = "wm831x-status",
1283 		.id = 1,
1284 		.num_resources = ARRAY_SIZE(wm831x_status1_resources),
1285 		.resources = wm831x_status1_resources,
1286 	},
1287 	{
1288 		.name = "wm831x-status",
1289 		.id = 2,
1290 		.num_resources = ARRAY_SIZE(wm831x_status2_resources),
1291 		.resources = wm831x_status2_resources,
1292 	},
1293 	{
1294 		.name = "wm831x-watchdog",
1295 		.num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1296 		.resources = wm831x_wdt_resources,
1297 	},
1298 };
1299 
1300 static const struct mfd_cell wm8312_devs[] = {
1301 	{
1302 		.name = "wm831x-backup",
1303 	},
1304 	{
1305 		.name = "wm831x-buckv",
1306 		.id = 1,
1307 		.num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1308 		.resources = wm831x_dcdc1_resources,
1309 	},
1310 	{
1311 		.name = "wm831x-buckv",
1312 		.id = 2,
1313 		.num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1314 		.resources = wm831x_dcdc2_resources,
1315 	},
1316 	{
1317 		.name = "wm831x-buckp",
1318 		.id = 3,
1319 		.num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1320 		.resources = wm831x_dcdc3_resources,
1321 	},
1322 	{
1323 		.name = "wm831x-boostp",
1324 		.id = 4,
1325 		.num_resources = ARRAY_SIZE(wm831x_dcdc4_resources),
1326 		.resources = wm831x_dcdc4_resources,
1327 	},
1328 	{
1329 		.name = "wm831x-clk",
1330 	},
1331 	{
1332 		.name = "wm831x-epe",
1333 		.id = 1,
1334 	},
1335 	{
1336 		.name = "wm831x-epe",
1337 		.id = 2,
1338 	},
1339 	{
1340 		.name = "wm831x-gpio",
1341 		.num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1342 		.resources = wm831x_gpio_resources,
1343 	},
1344 	{
1345 		.name = "wm831x-hwmon",
1346 	},
1347 	{
1348 		.name = "wm831x-isink",
1349 		.id = 1,
1350 		.num_resources = ARRAY_SIZE(wm831x_isink1_resources),
1351 		.resources = wm831x_isink1_resources,
1352 	},
1353 	{
1354 		.name = "wm831x-isink",
1355 		.id = 2,
1356 		.num_resources = ARRAY_SIZE(wm831x_isink2_resources),
1357 		.resources = wm831x_isink2_resources,
1358 	},
1359 	{
1360 		.name = "wm831x-ldo",
1361 		.id = 1,
1362 		.num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1363 		.resources = wm831x_ldo1_resources,
1364 	},
1365 	{
1366 		.name = "wm831x-ldo",
1367 		.id = 2,
1368 		.num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1369 		.resources = wm831x_ldo2_resources,
1370 	},
1371 	{
1372 		.name = "wm831x-ldo",
1373 		.id = 3,
1374 		.num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1375 		.resources = wm831x_ldo3_resources,
1376 	},
1377 	{
1378 		.name = "wm831x-ldo",
1379 		.id = 4,
1380 		.num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1381 		.resources = wm831x_ldo4_resources,
1382 	},
1383 	{
1384 		.name = "wm831x-ldo",
1385 		.id = 5,
1386 		.num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1387 		.resources = wm831x_ldo5_resources,
1388 	},
1389 	{
1390 		.name = "wm831x-ldo",
1391 		.id = 6,
1392 		.num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1393 		.resources = wm831x_ldo6_resources,
1394 	},
1395 	{
1396 		.name = "wm831x-aldo",
1397 		.id = 7,
1398 		.num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1399 		.resources = wm831x_ldo7_resources,
1400 	},
1401 	{
1402 		.name = "wm831x-aldo",
1403 		.id = 8,
1404 		.num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1405 		.resources = wm831x_ldo8_resources,
1406 	},
1407 	{
1408 		.name = "wm831x-aldo",
1409 		.id = 9,
1410 		.num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1411 		.resources = wm831x_ldo9_resources,
1412 	},
1413 	{
1414 		.name = "wm831x-aldo",
1415 		.id = 10,
1416 		.num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1417 		.resources = wm831x_ldo10_resources,
1418 	},
1419 	{
1420 		.name = "wm831x-alive-ldo",
1421 		.id = 11,
1422 		.num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1423 		.resources = wm831x_ldo11_resources,
1424 	},
1425 	{
1426 		.name = "wm831x-on",
1427 		.num_resources = ARRAY_SIZE(wm831x_on_resources),
1428 		.resources = wm831x_on_resources,
1429 	},
1430 	{
1431 		.name = "wm831x-power",
1432 		.num_resources = ARRAY_SIZE(wm831x_power_resources),
1433 		.resources = wm831x_power_resources,
1434 	},
1435 	{
1436 		.name = "wm831x-status",
1437 		.id = 1,
1438 		.num_resources = ARRAY_SIZE(wm831x_status1_resources),
1439 		.resources = wm831x_status1_resources,
1440 	},
1441 	{
1442 		.name = "wm831x-status",
1443 		.id = 2,
1444 		.num_resources = ARRAY_SIZE(wm831x_status2_resources),
1445 		.resources = wm831x_status2_resources,
1446 	},
1447 	{
1448 		.name = "wm831x-watchdog",
1449 		.num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1450 		.resources = wm831x_wdt_resources,
1451 	},
1452 };
1453 
1454 static const struct mfd_cell wm8320_devs[] = {
1455 	{
1456 		.name = "wm831x-backup",
1457 	},
1458 	{
1459 		.name = "wm831x-buckv",
1460 		.id = 1,
1461 		.num_resources = ARRAY_SIZE(wm831x_dcdc1_resources),
1462 		.resources = wm831x_dcdc1_resources,
1463 	},
1464 	{
1465 		.name = "wm831x-buckv",
1466 		.id = 2,
1467 		.num_resources = ARRAY_SIZE(wm831x_dcdc2_resources),
1468 		.resources = wm831x_dcdc2_resources,
1469 	},
1470 	{
1471 		.name = "wm831x-buckp",
1472 		.id = 3,
1473 		.num_resources = ARRAY_SIZE(wm831x_dcdc3_resources),
1474 		.resources = wm831x_dcdc3_resources,
1475 	},
1476 	{
1477 		.name = "wm831x-buckp",
1478 		.id = 4,
1479 		.num_resources = ARRAY_SIZE(wm8320_dcdc4_buck_resources),
1480 		.resources = wm8320_dcdc4_buck_resources,
1481 	},
1482 	{
1483 		.name = "wm831x-clk",
1484 	},
1485 	{
1486 		.name = "wm831x-gpio",
1487 		.num_resources = ARRAY_SIZE(wm831x_gpio_resources),
1488 		.resources = wm831x_gpio_resources,
1489 	},
1490 	{
1491 		.name = "wm831x-hwmon",
1492 	},
1493 	{
1494 		.name = "wm831x-ldo",
1495 		.id = 1,
1496 		.num_resources = ARRAY_SIZE(wm831x_ldo1_resources),
1497 		.resources = wm831x_ldo1_resources,
1498 	},
1499 	{
1500 		.name = "wm831x-ldo",
1501 		.id = 2,
1502 		.num_resources = ARRAY_SIZE(wm831x_ldo2_resources),
1503 		.resources = wm831x_ldo2_resources,
1504 	},
1505 	{
1506 		.name = "wm831x-ldo",
1507 		.id = 3,
1508 		.num_resources = ARRAY_SIZE(wm831x_ldo3_resources),
1509 		.resources = wm831x_ldo3_resources,
1510 	},
1511 	{
1512 		.name = "wm831x-ldo",
1513 		.id = 4,
1514 		.num_resources = ARRAY_SIZE(wm831x_ldo4_resources),
1515 		.resources = wm831x_ldo4_resources,
1516 	},
1517 	{
1518 		.name = "wm831x-ldo",
1519 		.id = 5,
1520 		.num_resources = ARRAY_SIZE(wm831x_ldo5_resources),
1521 		.resources = wm831x_ldo5_resources,
1522 	},
1523 	{
1524 		.name = "wm831x-ldo",
1525 		.id = 6,
1526 		.num_resources = ARRAY_SIZE(wm831x_ldo6_resources),
1527 		.resources = wm831x_ldo6_resources,
1528 	},
1529 	{
1530 		.name = "wm831x-aldo",
1531 		.id = 7,
1532 		.num_resources = ARRAY_SIZE(wm831x_ldo7_resources),
1533 		.resources = wm831x_ldo7_resources,
1534 	},
1535 	{
1536 		.name = "wm831x-aldo",
1537 		.id = 8,
1538 		.num_resources = ARRAY_SIZE(wm831x_ldo8_resources),
1539 		.resources = wm831x_ldo8_resources,
1540 	},
1541 	{
1542 		.name = "wm831x-aldo",
1543 		.id = 9,
1544 		.num_resources = ARRAY_SIZE(wm831x_ldo9_resources),
1545 		.resources = wm831x_ldo9_resources,
1546 	},
1547 	{
1548 		.name = "wm831x-aldo",
1549 		.id = 10,
1550 		.num_resources = ARRAY_SIZE(wm831x_ldo10_resources),
1551 		.resources = wm831x_ldo10_resources,
1552 	},
1553 	{
1554 		.name = "wm831x-alive-ldo",
1555 		.id = 11,
1556 		.num_resources = ARRAY_SIZE(wm831x_ldo11_resources),
1557 		.resources = wm831x_ldo11_resources,
1558 	},
1559 	{
1560 		.name = "wm831x-on",
1561 		.num_resources = ARRAY_SIZE(wm831x_on_resources),
1562 		.resources = wm831x_on_resources,
1563 	},
1564 	{
1565 		.name = "wm831x-status",
1566 		.id = 1,
1567 		.num_resources = ARRAY_SIZE(wm831x_status1_resources),
1568 		.resources = wm831x_status1_resources,
1569 	},
1570 	{
1571 		.name = "wm831x-status",
1572 		.id = 2,
1573 		.num_resources = ARRAY_SIZE(wm831x_status2_resources),
1574 		.resources = wm831x_status2_resources,
1575 	},
1576 	{
1577 		.name = "wm831x-watchdog",
1578 		.num_resources = ARRAY_SIZE(wm831x_wdt_resources),
1579 		.resources = wm831x_wdt_resources,
1580 	},
1581 };
1582 
1583 static const struct mfd_cell touch_devs[] = {
1584 	{
1585 		.name = "wm831x-touch",
1586 		.num_resources = ARRAY_SIZE(wm831x_touch_resources),
1587 		.resources = wm831x_touch_resources,
1588 	},
1589 };
1590 
1591 static const struct mfd_cell rtc_devs[] = {
1592 	{
1593 		.name = "wm831x-rtc",
1594 		.num_resources = ARRAY_SIZE(wm831x_rtc_resources),
1595 		.resources = wm831x_rtc_resources,
1596 	},
1597 };
1598 
1599 static const struct mfd_cell backlight_devs[] = {
1600 	{
1601 		.name = "wm831x-backlight",
1602 	},
1603 };
1604 
1605 struct regmap_config wm831x_regmap_config = {
1606 	.reg_bits = 16,
1607 	.val_bits = 16,
1608 
1609 	.cache_type = REGCACHE_RBTREE,
1610 
1611 	.max_register = WM831X_DBE_CHECK_DATA,
1612 	.readable_reg = wm831x_reg_readable,
1613 	.writeable_reg = wm831x_reg_writeable,
1614 	.volatile_reg = wm831x_reg_volatile,
1615 };
1616 EXPORT_SYMBOL_GPL(wm831x_regmap_config);
1617 
1618 const struct of_device_id wm831x_of_match[] = {
1619 	{ .compatible = "wlf,wm8310", .data = (void *)WM8310 },
1620 	{ .compatible = "wlf,wm8311", .data = (void *)WM8311 },
1621 	{ .compatible = "wlf,wm8312", .data = (void *)WM8312 },
1622 	{ .compatible = "wlf,wm8320", .data = (void *)WM8320 },
1623 	{ .compatible = "wlf,wm8321", .data = (void *)WM8321 },
1624 	{ .compatible = "wlf,wm8325", .data = (void *)WM8325 },
1625 	{ .compatible = "wlf,wm8326", .data = (void *)WM8326 },
1626 	{ },
1627 };
1628 EXPORT_SYMBOL_GPL(wm831x_of_match);
1629 
1630 /*
1631  * Instantiate the generic non-control parts of the device.
1632  */
1633 int wm831x_device_init(struct wm831x *wm831x, int irq)
1634 {
1635 	struct wm831x_pdata *pdata = &wm831x->pdata;
1636 	int rev, wm831x_num;
1637 	enum wm831x_parent parent;
1638 	int ret, i;
1639 
1640 	mutex_init(&wm831x->io_lock);
1641 	mutex_init(&wm831x->key_lock);
1642 	dev_set_drvdata(wm831x->dev, wm831x);
1643 
1644 	wm831x->soft_shutdown = pdata->soft_shutdown;
1645 
1646 	ret = wm831x_reg_read(wm831x, WM831X_PARENT_ID);
1647 	if (ret < 0) {
1648 		dev_err(wm831x->dev, "Failed to read parent ID: %d\n", ret);
1649 		goto err;
1650 	}
1651 	switch (ret) {
1652 	case 0x6204:
1653 	case 0x6246:
1654 		break;
1655 	default:
1656 		dev_err(wm831x->dev, "Device is not a WM831x: ID %x\n", ret);
1657 		ret = -EINVAL;
1658 		goto err;
1659 	}
1660 
1661 	ret = wm831x_reg_read(wm831x, WM831X_REVISION);
1662 	if (ret < 0) {
1663 		dev_err(wm831x->dev, "Failed to read revision: %d\n", ret);
1664 		goto err;
1665 	}
1666 	rev = (ret & WM831X_PARENT_REV_MASK) >> WM831X_PARENT_REV_SHIFT;
1667 
1668 	ret = wm831x_reg_read(wm831x, WM831X_RESET_ID);
1669 	if (ret < 0) {
1670 		dev_err(wm831x->dev, "Failed to read device ID: %d\n", ret);
1671 		goto err;
1672 	}
1673 
1674 	/* Some engineering samples do not have the ID set, rely on
1675 	 * the device being registered correctly.
1676 	 */
1677 	if (ret == 0) {
1678 		dev_info(wm831x->dev, "Device is an engineering sample\n");
1679 		ret = wm831x->type;
1680 	}
1681 
1682 	switch (ret) {
1683 	case WM8310:
1684 		parent = WM8310;
1685 		wm831x->num_gpio = 16;
1686 		wm831x->charger_irq_wake = 1;
1687 		if (rev > 0) {
1688 			wm831x->has_gpio_ena = 1;
1689 			wm831x->has_cs_sts = 1;
1690 		}
1691 
1692 		dev_info(wm831x->dev, "WM8310 revision %c\n", 'A' + rev);
1693 		break;
1694 
1695 	case WM8311:
1696 		parent = WM8311;
1697 		wm831x->num_gpio = 16;
1698 		wm831x->charger_irq_wake = 1;
1699 		if (rev > 0) {
1700 			wm831x->has_gpio_ena = 1;
1701 			wm831x->has_cs_sts = 1;
1702 		}
1703 
1704 		dev_info(wm831x->dev, "WM8311 revision %c\n", 'A' + rev);
1705 		break;
1706 
1707 	case WM8312:
1708 		parent = WM8312;
1709 		wm831x->num_gpio = 16;
1710 		wm831x->charger_irq_wake = 1;
1711 		if (rev > 0) {
1712 			wm831x->has_gpio_ena = 1;
1713 			wm831x->has_cs_sts = 1;
1714 		}
1715 
1716 		dev_info(wm831x->dev, "WM8312 revision %c\n", 'A' + rev);
1717 		break;
1718 
1719 	case WM8320:
1720 		parent = WM8320;
1721 		wm831x->num_gpio = 12;
1722 		dev_info(wm831x->dev, "WM8320 revision %c\n", 'A' + rev);
1723 		break;
1724 
1725 	case WM8321:
1726 		parent = WM8321;
1727 		wm831x->num_gpio = 12;
1728 		dev_info(wm831x->dev, "WM8321 revision %c\n", 'A' + rev);
1729 		break;
1730 
1731 	case WM8325:
1732 		parent = WM8325;
1733 		wm831x->num_gpio = 12;
1734 		dev_info(wm831x->dev, "WM8325 revision %c\n", 'A' + rev);
1735 		break;
1736 
1737 	case WM8326:
1738 		parent = WM8326;
1739 		wm831x->num_gpio = 12;
1740 		dev_info(wm831x->dev, "WM8326 revision %c\n", 'A' + rev);
1741 		break;
1742 
1743 	default:
1744 		dev_err(wm831x->dev, "Unknown WM831x device %04x\n", ret);
1745 		ret = -EINVAL;
1746 		goto err;
1747 	}
1748 
1749 	/* This will need revisiting in future but is OK for all
1750 	 * current parts.
1751 	 */
1752 	if (parent != wm831x->type)
1753 		dev_warn(wm831x->dev, "Device was registered as a WM%x\n",
1754 			 wm831x->type);
1755 
1756 	/* Bootstrap the user key */
1757 	ret = wm831x_reg_read(wm831x, WM831X_SECURITY_KEY);
1758 	if (ret < 0) {
1759 		dev_err(wm831x->dev, "Failed to read security key: %d\n", ret);
1760 		goto err;
1761 	}
1762 	if (ret != 0) {
1763 		dev_warn(wm831x->dev, "Security key had non-zero value %x\n",
1764 			 ret);
1765 		wm831x_reg_write(wm831x, WM831X_SECURITY_KEY, 0);
1766 	}
1767 	wm831x->locked = 1;
1768 
1769 	if (pdata->pre_init) {
1770 		ret = pdata->pre_init(wm831x);
1771 		if (ret != 0) {
1772 			dev_err(wm831x->dev, "pre_init() failed: %d\n", ret);
1773 			goto err;
1774 		}
1775 	}
1776 
1777 	for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
1778 		if (!pdata->gpio_defaults[i])
1779 			continue;
1780 
1781 		wm831x_reg_write(wm831x,
1782 				 WM831X_GPIO1_CONTROL + i,
1783 				 pdata->gpio_defaults[i] & 0xffff);
1784 	}
1785 
1786 	/* Multiply by 10 as we have many subdevices of the same type */
1787 	if (pdata->wm831x_num)
1788 		wm831x_num = pdata->wm831x_num * 10;
1789 	else
1790 		wm831x_num = -1;
1791 
1792 	ret = wm831x_irq_init(wm831x, irq);
1793 	if (ret != 0)
1794 		goto err;
1795 
1796 	wm831x_auxadc_init(wm831x);
1797 
1798 	/* The core device is up, instantiate the subdevices. */
1799 	switch (parent) {
1800 	case WM8310:
1801 		ret = mfd_add_devices(wm831x->dev, wm831x_num,
1802 				      wm8310_devs, ARRAY_SIZE(wm8310_devs),
1803 				      NULL, 0, NULL);
1804 		break;
1805 
1806 	case WM8311:
1807 		ret = mfd_add_devices(wm831x->dev, wm831x_num,
1808 				      wm8311_devs, ARRAY_SIZE(wm8311_devs),
1809 				      NULL, 0, NULL);
1810 		if (!pdata->disable_touch)
1811 			mfd_add_devices(wm831x->dev, wm831x_num,
1812 					touch_devs, ARRAY_SIZE(touch_devs),
1813 					NULL, 0, NULL);
1814 		break;
1815 
1816 	case WM8312:
1817 		ret = mfd_add_devices(wm831x->dev, wm831x_num,
1818 				      wm8312_devs, ARRAY_SIZE(wm8312_devs),
1819 				      NULL, 0, NULL);
1820 		if (!pdata->disable_touch)
1821 			mfd_add_devices(wm831x->dev, wm831x_num,
1822 					touch_devs, ARRAY_SIZE(touch_devs),
1823 					NULL, 0, NULL);
1824 		break;
1825 
1826 	case WM8320:
1827 	case WM8321:
1828 	case WM8325:
1829 	case WM8326:
1830 		ret = mfd_add_devices(wm831x->dev, wm831x_num,
1831 				      wm8320_devs, ARRAY_SIZE(wm8320_devs),
1832 				      NULL, 0, NULL);
1833 		break;
1834 
1835 	default:
1836 		/* If this happens the bus probe function is buggy */
1837 		BUG();
1838 	}
1839 
1840 	if (ret != 0) {
1841 		dev_err(wm831x->dev, "Failed to add children\n");
1842 		goto err_irq;
1843 	}
1844 
1845 	/* The RTC can only be used if the 32.768kHz crystal is
1846 	 * enabled; this can't be controlled by software at runtime.
1847 	 */
1848 	ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2);
1849 	if (ret < 0) {
1850 		dev_err(wm831x->dev, "Failed to read clock status: %d\n", ret);
1851 		goto err_irq;
1852 	}
1853 
1854 	if (ret & WM831X_XTAL_ENA) {
1855 		ret = mfd_add_devices(wm831x->dev, wm831x_num,
1856 				      rtc_devs, ARRAY_SIZE(rtc_devs),
1857 				      NULL, 0, NULL);
1858 		if (ret != 0) {
1859 			dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret);
1860 			goto err_irq;
1861 		}
1862 	} else {
1863 		dev_info(wm831x->dev, "32.768kHz clock disabled, no RTC\n");
1864 	}
1865 
1866 	if (pdata->backlight) {
1867 		/* Treat errors as non-critical */
1868 		ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,
1869 				      ARRAY_SIZE(backlight_devs), NULL,
1870 				      0, NULL);
1871 		if (ret < 0)
1872 			dev_err(wm831x->dev, "Failed to add backlight: %d\n",
1873 				ret);
1874 	}
1875 
1876 	wm831x_otp_init(wm831x);
1877 
1878 	if (pdata->post_init) {
1879 		ret = pdata->post_init(wm831x);
1880 		if (ret != 0) {
1881 			dev_err(wm831x->dev, "post_init() failed: %d\n", ret);
1882 			goto err_irq;
1883 		}
1884 	}
1885 
1886 	return 0;
1887 
1888 err_irq:
1889 	wm831x_irq_exit(wm831x);
1890 err:
1891 	mfd_remove_devices(wm831x->dev);
1892 	return ret;
1893 }
1894 
1895 int wm831x_device_suspend(struct wm831x *wm831x)
1896 {
1897 	int reg, mask;
1898 
1899 	/* If the charger IRQs are a wake source then make sure we ack
1900 	 * them even if they're not actively being used (eg, no power
1901 	 * driver or no IRQ line wired up) then acknowledge the
1902 	 * interrupts otherwise suspend won't last very long.
1903 	 */
1904 	if (wm831x->charger_irq_wake) {
1905 		reg = wm831x_reg_read(wm831x, WM831X_INTERRUPT_STATUS_2_MASK);
1906 
1907 		mask = WM831X_CHG_BATT_HOT_EINT |
1908 			WM831X_CHG_BATT_COLD_EINT |
1909 			WM831X_CHG_BATT_FAIL_EINT |
1910 			WM831X_CHG_OV_EINT | WM831X_CHG_END_EINT |
1911 			WM831X_CHG_TO_EINT | WM831X_CHG_MODE_EINT |
1912 			WM831X_CHG_START_EINT;
1913 
1914 		/* If any of the interrupts are masked read the statuses */
1915 		if (reg & mask)
1916 			reg = wm831x_reg_read(wm831x,
1917 					      WM831X_INTERRUPT_STATUS_2);
1918 
1919 		if (reg & mask) {
1920 			dev_info(wm831x->dev,
1921 				 "Acknowledging masked charger IRQs: %x\n",
1922 				 reg & mask);
1923 			wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_2,
1924 					 reg & mask);
1925 		}
1926 	}
1927 
1928 	return 0;
1929 }
1930 
1931 void wm831x_device_shutdown(struct wm831x *wm831x)
1932 {
1933 	if (wm831x->soft_shutdown) {
1934 		dev_info(wm831x->dev, "Initiating shutdown...\n");
1935 		wm831x_set_bits(wm831x, WM831X_POWER_STATE, WM831X_CHIP_ON, 0);
1936 	}
1937 }
1938 EXPORT_SYMBOL_GPL(wm831x_device_shutdown);
1939