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