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