regulator: palmas: fix build warnings
[linux-2.6.git] / drivers / regulator / max1586.c
index a49fc95..282d2ee 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/i2c.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
+#include <linux/slab.h>
 #include <linux/regulator/max1586.h>
 
 #define MAX1586_V3_MAX_VSEL 31
@@ -62,12 +63,12 @@ static int max1586_v3_calc_voltage(struct max1586_data *max1586,
        return max1586->min_uV + (selector * range_uV / MAX1586_V3_MAX_VSEL);
 }
 
-static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV)
+static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV,
+                         unsigned *selector)
 {
        struct max1586_data *max1586 = rdev_get_drvdata(rdev);
        struct i2c_client *client = max1586->client;
        unsigned range_uV = max1586->max_uV - max1586->min_uV;
-       unsigned selector;
        u8 v3_prog;
 
        if (min_uV > max1586->max_uV || max_uV < max1586->min_uV)
@@ -75,15 +76,15 @@ static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV)
        if (min_uV < max1586->min_uV)
                min_uV = max1586->min_uV;
 
-       selector = ((min_uV - max1586->min_uV) * MAX1586_V3_MAX_VSEL +
-                       range_uV - 1) / range_uV;
-       if (max1586_v3_calc_voltage(max1586, selector) > max_uV)
+       *selector = DIV_ROUND_UP((min_uV - max1586->min_uV) *
+                                MAX1586_V3_MAX_VSEL, range_uV);
+       if (max1586_v3_calc_voltage(max1586, *selector) > max_uV)
                return -EINVAL;
 
        dev_dbg(&client->dev, "changing voltage v3 to %dmv\n",
-               max1586_v3_calc_voltage(max1586, selector) / 1000);
+               max1586_v3_calc_voltage(max1586, *selector) / 1000);
 
-       v3_prog = I2C_V3_SELECT | (u8) selector;
+       v3_prog = I2C_V3_SELECT | (u8) *selector;
        return i2c_smbus_write_byte(client, v3_prog);
 }
 
@@ -109,10 +110,10 @@ static int max1586_v6_calc_voltage(unsigned selector)
        return voltages_uv[selector];
 }
 
-static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV)
+static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV,
+                         unsigned int *selector)
 {
        struct i2c_client *client = rdev_get_drvdata(rdev);
-       unsigned selector;
        u8 v6_prog;
 
        if (min_uV < MAX1586_V6_MIN_UV || min_uV > MAX1586_V6_MAX_UV)
@@ -120,22 +121,22 @@ static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV)
        if (max_uV < MAX1586_V6_MIN_UV || max_uV > MAX1586_V6_MAX_UV)
                return -EINVAL;
 
-       if (min_uV >= 3000000)
-               selector = 3;
-       if (min_uV < 3000000)
-               selector = 2;
-       if (min_uV < 2500000)
-               selector = 1;
        if (min_uV < 1800000)
-               selector = 0;
-
-       if (max1586_v6_calc_voltage(selector) > max_uV)
+               *selector = 0;
+       else if (min_uV < 2500000)
+               *selector = 1;
+       else if (min_uV < 3000000)
+               *selector = 2;
+       else if (min_uV >= 3000000)
+               *selector = 3;
+
+       if (max1586_v6_calc_voltage(*selector) > max_uV)
                return -EINVAL;
 
        dev_dbg(&client->dev, "changing voltage v6 to %dmv\n",
-               max1586_v6_calc_voltage(selector) / 1000);
+               max1586_v6_calc_voltage(*selector) / 1000);
 
-       v6_prog = I2C_V6_SELECT | (u8) selector;
+       v6_prog = I2C_V6_SELECT | (u8) *selector;
        return i2c_smbus_write_byte(client, v6_prog);
 }
 
@@ -213,7 +214,7 @@ static int __devinit max1586_pmic_probe(struct i2c_client *client,
                }
                rdev[i] = regulator_register(&max1586_reg[id], &client->dev,
                                             pdata->subdevs[i].platform_data,
-                                            max1586);
+                                            max1586, NULL);
                if (IS_ERR(rdev[i])) {
                        ret = PTR_ERR(rdev[i]);
                        dev_err(&client->dev, "failed to register %s\n",
@@ -222,7 +223,7 @@ static int __devinit max1586_pmic_probe(struct i2c_client *client,
                }
        }
 
-       i2c_set_clientdata(client, rdev);
+       i2c_set_clientdata(client, max1586);
        dev_info(&client->dev, "Maxim 1586 regulator driver loaded\n");
        return 0;
 
@@ -237,14 +238,13 @@ out:
 
 static int __devexit max1586_pmic_remove(struct i2c_client *client)
 {
-       struct regulator_dev **rdev = i2c_get_clientdata(client);
+       struct max1586_data *max1586 = i2c_get_clientdata(client);
        int i;
 
        for (i = 0; i <= MAX1586_V6; i++)
-               if (rdev[i])
-                       regulator_unregister(rdev[i]);
-       kfree(rdev);
-       i2c_set_clientdata(client, NULL);
+               if (max1586->rdev[i])
+                       regulator_unregister(max1586->rdev[i]);
+       kfree(max1586);
 
        return 0;
 }