}
 }
 
+#define WM8960_NUM_SUPPLIES 5
+static const char *wm8960_supply_names[WM8960_NUM_SUPPLIES] = {
+       "DCVDD",
+       "DBVDD",
+       "AVDD",
+       "SPKVDD1",
+       "SPKVDD2",
+};
+
 struct wm8960_priv {
        struct clk *mclk;
        struct regmap *regmap;
        bool is_stream_in_use[2];
        struct wm8960_data pdata;
        ktime_t dsch_start;
+       struct regulator_bulk_data supplies[WM8960_NUM_SUPPLIES];
 };
 
 #define wm8960_reset(c)        regmap_write(c, WM8960_RESET, 0)
 {
        struct wm8960_data *pdata = dev_get_platdata(&i2c->dev);
        struct wm8960_priv *wm8960;
+       unsigned int i;
        int ret;
        u8 val;
 
                }
        }
 
+       for (i = 0; i < ARRAY_SIZE(wm8960->supplies); i++)
+               wm8960->supplies[i].supply = wm8960_supply_names[i];
+
+       ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8960->supplies),
+                                wm8960->supplies);
+       if (ret <  0) {
+               dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
+               return ret;
+       }
+
+       ret = regulator_bulk_enable(ARRAY_SIZE(wm8960->supplies),
+                                   wm8960->supplies);
+       if (ret < 0) {
+               dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
+               return ret;
+       }
+
        wm8960->regmap = devm_regmap_init_i2c(i2c, &wm8960_regmap);
        if (IS_ERR(wm8960->regmap))
                return PTR_ERR(wm8960->regmap);
 }
 
 static void wm8960_i2c_remove(struct i2c_client *client)
-{}
+{
+       struct wm8960_priv *wm8960 = i2c_get_clientdata(client);
+
+       regulator_bulk_disable(ARRAY_SIZE(wm8960->supplies), wm8960->supplies);
+}
 
 static const struct i2c_device_id wm8960_i2c_id[] = {
        { "wm8960", 0 },