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