mfd: Support software initiated shutdown of WM831x PMICs
[linux-2.6.git] / drivers / mfd / wm8400-core.c
index 7c21bf7..597f82e 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/mfd/core.h>
 #include <linux/mfd/wm8400-private.h>
 #include <linux/mfd/wm8400-audio.h>
+#include <linux/slab.h>
 
 static struct {
        u16  readable;    /* Mask of readable bits */
@@ -117,7 +118,7 @@ static int wm8400_read(struct wm8400 *wm8400, u8 reg, int num_regs, u16 *dest)
 {
        int i, ret = 0;
 
-       BUG_ON(reg + num_regs - 1 > ARRAY_SIZE(wm8400->reg_cache));
+       BUG_ON(reg + num_regs > ARRAY_SIZE(wm8400->reg_cache));
 
        /* If there are any volatile reads then read back the entire block */
        for (i = reg; i < reg + num_regs; i++)
@@ -143,7 +144,7 @@ static int wm8400_write(struct wm8400 *wm8400, u8 reg, int num_regs,
 {
        int ret, i;
 
-       BUG_ON(reg + num_regs - 1 > ARRAY_SIZE(wm8400->reg_cache));
+       BUG_ON(reg + num_regs > ARRAY_SIZE(wm8400->reg_cache));
 
        for (i = 0; i < num_regs; i++) {
                BUG_ON(!reg_data[reg + i].writable);
@@ -244,7 +245,8 @@ static int wm8400_register_codec(struct wm8400 *wm8400)
 {
        struct mfd_cell cell = {
                .name = "wm8400-codec",
-               .driver_data = wm8400,
+               .platform_data = wm8400,
+               .pdata_size = sizeof(*wm8400),
        };
 
        return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0);
@@ -414,7 +416,6 @@ static int wm8400_i2c_probe(struct i2c_client *i2c,
        return 0;
 
 struct_err:
-       i2c_set_clientdata(i2c, NULL);
        kfree(wm8400);
 err:
        return ret;
@@ -425,7 +426,6 @@ static int wm8400_i2c_remove(struct i2c_client *i2c)
        struct wm8400 *wm8400 = i2c_get_clientdata(i2c);
 
        wm8400_release(wm8400);
-       i2c_set_clientdata(i2c, NULL);
        kfree(wm8400);
 
        return 0;
@@ -460,7 +460,7 @@ static int __init wm8400_module_init(void)
 
        return ret;
 }
-module_init(wm8400_module_init);
+subsys_initcall(wm8400_module_init);
 
 static void __exit wm8400_module_exit(void)
 {