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