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