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