config: tegra3: enable /dev mount with ACL
[linux-2.6.git] / drivers / mfd / wm8350-i2c.c
index 2b0569c..5fe5de1 100644 (file)
@@ -1,8 +1,6 @@
 /*
  * wm8350-i2c.c  --  Generic I2C driver for Wolfson WM8350 PMIC
  *
- * This driver defines and configures the WM8350 for the Freescale i.MX32ADS.
- *
  * Copyright 2007, 2008 Wolfson Microelectronics PLC.
  *
  * Author: Liam Girdwood
@@ -21,6 +19,7 @@
 #include <linux/i2c.h>
 #include <linux/platform_device.h>
 #include <linux/mfd/wm8350/core.h>
+#include <linux/slab.h>
 
 static int wm8350_i2c_read_device(struct wm8350 *wm8350, char reg,
                                  int bytes, void *dest)
@@ -30,7 +29,12 @@ static int wm8350_i2c_read_device(struct wm8350 *wm8350, char reg,
        ret = i2c_master_send(wm8350->i2c_client, &reg, 1);
        if (ret < 0)
                return ret;
-       return i2c_master_recv(wm8350->i2c_client, dest, bytes);
+       ret = i2c_master_recv(wm8350->i2c_client, dest, bytes);
+       if (ret < 0)
+               return ret;
+       if (ret != bytes)
+               return -EIO;
+       return 0;
 }
 
 static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg,
@@ -38,13 +42,19 @@ static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg,
 {
        /* we add 1 byte for device register */
        u8 msg[(WM8350_MAX_REGISTER << 1) + 1];
+       int ret;
 
        if (bytes > ((WM8350_MAX_REGISTER << 1) + 1))
                return -EINVAL;
 
        msg[0] = reg;
        memcpy(&msg[1], src, bytes);
-       return i2c_master_send(wm8350->i2c_client, msg, bytes + 1);
+       ret = i2c_master_send(wm8350->i2c_client, msg, bytes + 1);
+       if (ret < 0)
+               return ret;
+       if (ret != bytes + 1)
+               return -EIO;
+       return 0;
 }
 
 static int wm8350_i2c_probe(struct i2c_client *i2c,
@@ -54,10 +64,8 @@ static int wm8350_i2c_probe(struct i2c_client *i2c,
        int ret = 0;
 
        wm8350 = kzalloc(sizeof(struct wm8350), GFP_KERNEL);
-       if (wm8350 == NULL) {
-               kfree(i2c);
+       if (wm8350 == NULL)
                return -ENOMEM;
-       }
 
        i2c_set_clientdata(i2c, wm8350);
        wm8350->dev = &i2c->dev;
@@ -65,7 +73,7 @@ static int wm8350_i2c_probe(struct i2c_client *i2c,
        wm8350->read_dev = wm8350_i2c_read_device;
        wm8350->write_dev = wm8350_i2c_write_device;
 
-       ret = wm8350_device_init(wm8350);
+       ret = wm8350_device_init(wm8350, i2c->irq, i2c->dev.platform_data);
        if (ret < 0)
                goto err;
 
@@ -88,6 +96,8 @@ static int wm8350_i2c_remove(struct i2c_client *i2c)
 
 static const struct i2c_device_id wm8350_i2c_id[] = {
        { "wm8350", 0 },
+       { "wm8351", 0 },
+       { "wm8352", 0 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, wm8350_i2c_id);