]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/regulator/max8660.c
regulator: fix dangling pointers
[net-next-2.6.git] / drivers / regulator / max8660.c
index acc2fb7b6087783912110796243c99ee7f6fd8c1..47f90b2fc290208eb302e8b9ef44ed6fe7f53a1d 100644 (file)
@@ -345,8 +345,8 @@ static struct regulator_desc max8660_reg[] = {
        },
 };
 
-static int max8660_probe(struct i2c_client *client,
-                             const struct i2c_device_id *i2c_id)
+static int __devinit max8660_probe(struct i2c_client *client,
+                                  const struct i2c_device_id *i2c_id)
 {
        struct regulator_dev **rdev;
        struct max8660_platform_data *pdata = client->dev.platform_data;
@@ -354,7 +354,7 @@ static int max8660_probe(struct i2c_client *client,
        int boot_on, i, id, ret = -EINVAL;
 
        if (pdata->num_subdevs > MAX8660_V_END) {
-               dev_err(&client->dev, "Too much regulators found!\n");
+               dev_err(&client->dev, "Too many regulators found!\n");
                goto out;
        }
 
@@ -462,7 +462,7 @@ out:
        return ret;
 }
 
-static int max8660_remove(struct i2c_client *client)
+static int __devexit max8660_remove(struct i2c_client *client)
 {
        struct regulator_dev **rdev = i2c_get_clientdata(client);
        int i;
@@ -470,8 +470,8 @@ static int max8660_remove(struct i2c_client *client)
        for (i = 0; i < MAX8660_V_END; i++)
                if (rdev[i])
                        regulator_unregister(rdev[i]);
-       kfree(rdev);
        i2c_set_clientdata(client, NULL);
+       kfree(rdev);
 
        return 0;
 }
@@ -485,9 +485,10 @@ MODULE_DEVICE_TABLE(i2c, max8660_id);
 
 static struct i2c_driver max8660_driver = {
        .probe = max8660_probe,
-       .remove = max8660_remove,
+       .remove = __devexit_p(max8660_remove),
        .driver         = {
                .name   = "max8660",
+               .owner  = THIS_MODULE,
        },
        .id_table       = max8660_id,
 };