mfd: Add WM1811 support
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 24 May 2011 09:35:40 +0000 (17:35 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 4 Oct 2011 10:59:02 +0000 (11:59 +0100)
The WM1811 is mostly register compatible with the WM8994 and WM8958,
providing a high performance audio hub CODEC in a small form factor
suitable for ultra compact system designs.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/wm8994-core.c
include/linux/mfd/wm8994/core.h

index 96479c9b1728918e8672a6aa9d03847365594263..7c13ab2c64a47e6d35cef5e4543bc201100ef308 100644 (file)
@@ -243,6 +243,18 @@ static struct mfd_cell wm8994_devs[] = {
  * and should be handled via the standard regulator API supply
  * management.
  */
+static const char *wm1811_main_supplies[] = {
+       "DBVDD1",
+       "DBVDD2",
+       "DBVDD3",
+       "DCVDD",
+       "AVDD1",
+       "AVDD2",
+       "CPVDD",
+       "SPKVDD1",
+       "SPKVDD2",
+};
+
 static const char *wm8994_main_supplies[] = {
        "DBVDD",
        "DCVDD",
@@ -401,6 +413,9 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
        }
 
        switch (wm8994->type) {
+       case WM1811:
+               wm8994->num_supplies = ARRAY_SIZE(wm1811_main_supplies);
+               break;
        case WM8994:
                wm8994->num_supplies = ARRAY_SIZE(wm8994_main_supplies);
                break;
@@ -421,6 +436,10 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
        }
 
        switch (wm8994->type) {
+       case WM1811:
+               for (i = 0; i < ARRAY_SIZE(wm1811_main_supplies); i++)
+                       wm8994->supplies[i].supply = wm1811_main_supplies[i];
+               break;
        case WM8994:
                for (i = 0; i < ARRAY_SIZE(wm8994_main_supplies); i++)
                        wm8994->supplies[i].supply = wm8994_main_supplies[i];
@@ -454,6 +473,13 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
                goto err_enable;
        }
        switch (ret) {
+       case 0x1811:
+               devname = "WM1811";
+               if (wm8994->type != WM1811)
+                       dev_warn(wm8994->dev, "Device registered as type %d\n",
+                                wm8994->type);
+               wm8994->type = WM1811;
+               break;
        case 0x8994:
                devname = "WM8994";
                if (wm8994->type != WM8994)
@@ -651,6 +677,7 @@ static int wm8994_i2c_remove(struct i2c_client *i2c)
 }
 
 static const struct i2c_device_id wm8994_i2c_id[] = {
+       { "wm1811", WM1811 },
        { "wm8994", WM8994 },
        { "wm8958", WM8958 },
        { }
index f0b69cdae41cc94f24c995d9812301d9eb711451..bfb221b3abf7d90079efbcb05b4c0073401c480a 100644 (file)
@@ -20,6 +20,7 @@
 enum wm8994_type {
        WM8994 = 0,
        WM8958 = 1,
+       WM1811 = 2,
 };
 
 struct regulator_dev;