Merge git://git.infradead.org/~dwmw2/ideapad-2.6
[sfrench/cifs-2.6.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");