performed. If any entry has the value 0xffffffff, that GPIO's
     configuration will not be modified.
 
+  - AVDD-supply : Analog power supply regulator on the AVDD pin.
+
+  - CPVDD-supply : Charge pump supply regulator on the CPVDD pin.
+
+  - DBVDD-supply : Digital buffer supply regulator for the DBVDD pin.
+
+  - DCVDD-supply : Digital core supply regulator for the DCVDD pin.
+
 Pins on the device (for linking into audio routes):
 
   * IN1L
        reg = <0x1a>;
        interrupts = < 347 >;
 
+       AVDD-supply = <&fooreg_a>;
+       CPVDD-supply = <&fooreg_b>;
+       DBVDD-supply = <&fooreg_c>;
+       DCVDC-supply = <&fooreg_d>;
+
        gpio-controller;
        #gpio-cells = <2>;
 
 
 #include <linux/pm.h>
 #include <linux/i2c.h>
 #include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 #include <linux/irq.h>
 #include <linux/mutex.h>
        { 172, 0x0000 },    /* R172 - Analogue Output Bias 0 */
 };
 
+#define WM8903_NUM_SUPPLIES 4
+static const char *wm8903_supply_names[WM8903_NUM_SUPPLIES] = {
+       "AVDD",
+       "CPVDD",
+       "DBVDD",
+       "DCVDD",
+};
+
 struct wm8903_priv {
        struct wm8903_platform_data *pdata;
        struct device *dev;
        struct regmap *regmap;
+       struct regulator_bulk_data supplies[WM8903_NUM_SUPPLIES];
 
        int sysclk;
        int irq;
 
        pdata = wm8903->pdata;
 
+       for (i = 0; i < ARRAY_SIZE(wm8903->supplies); i++)
+               wm8903->supplies[i].supply = wm8903_supply_names[i];
+
+       ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8903->supplies),
+                                     wm8903->supplies);
+       if (ret != 0) {
+               dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
+               return ret;
+       }
+
+       ret = regulator_bulk_enable(ARRAY_SIZE(wm8903->supplies),
+                                   wm8903->supplies);
+       if (ret != 0) {
+               dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
+               return ret;
+       }
+
        ret = regmap_read(wm8903->regmap, WM8903_SW_RESET_AND_ID, &val);
        if (ret != 0) {
                dev_err(&i2c->dev, "Failed to read chip ID: %d\n", ret);
 
        return 0;
 err:
+       regulator_bulk_disable(ARRAY_SIZE(wm8903->supplies),
+                              wm8903->supplies);
        return ret;
 }
 
 {
        struct wm8903_priv *wm8903 = i2c_get_clientdata(client);
 
+       regulator_bulk_disable(ARRAY_SIZE(wm8903->supplies),
+                              wm8903->supplies);
        if (client->irq)
                free_irq(client->irq, wm8903);
        wm8903_free_gpio(wm8903);