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 */
32const 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};
90EXPORT_SYMBOL_GPL(wm831x_isinkv_values);
91
92static 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 */
120void 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}
137EXPORT_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 */
148int 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}
165EXPORT_SYMBOL_GPL(wm831x_reg_unlock);
166
167static 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
346static 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
483static 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 */
519int 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}
531EXPORT_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 */
541int 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}
546EXPORT_SYMBOL_GPL(wm831x_bulk_read);
547
548static 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 */
578int 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}
591EXPORT_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 */
601int 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}
617EXPORT_SYMBOL_GPL(wm831x_set_bits);
618
619static 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
640static 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
660static 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
674static 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
688static 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
702static 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
710static 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
723static 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
736static 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
750static 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
764static 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
778static 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
792static 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
806static 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
820static 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
834static 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
848static 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
862static 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
876static 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
884static struct resource wm831x_on_resources[] = {
885	{
886		.start = WM831X_IRQ_ON,
887		.end   = WM831X_IRQ_ON,
888		.flags = IORESOURCE_IRQ,
889	},
890};
891
892
893static 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
962static 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
977static 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
985static 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
993static 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
1008static 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
1016static 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
1170static 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
1300static 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
1454static 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
1583static 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
1591static 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
1599static const struct mfd_cell backlight_devs[] = {
1600	{
1601		.name = "wm831x-backlight",
1602	},
1603};
1604
1605struct 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};
1616EXPORT_SYMBOL_GPL(wm831x_regmap_config);
1617
1618const 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};
1628EXPORT_SYMBOL_GPL(wm831x_of_match);
1629
1630/*
1631 * Instantiate the generic non-control parts of the device.
1632 */
1633int 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
1888err_irq:
1889	wm831x_irq_exit(wm831x);
1890err:
1891	mfd_remove_devices(wm831x->dev);
1892	return ret;
1893}
1894
1895int 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
1931void 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}
1938EXPORT_SYMBOL_GPL(wm831x_device_shutdown);
1939