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