regulator: Convert tps65023 to use regmap API
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Sat, 18 Jun 2011 00:18:51 +0000 (01:18 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sat, 23 Jul 2011 06:57:02 +0000 (07:57 +0100)
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@ti.com>
Acked-by: Grant Likely <grant.likely@secretlab.ca>
drivers/regulator/Kconfig
drivers/regulator/tps65023-regulator.c

index d7ed20f293d7f4af578d8d8098fae6bc609fb8b7..118eb213eb3a7ea8e5731fdf7004f2b50b672b82 100644 (file)
@@ -235,6 +235,7 @@ config REGULATOR_TPS6105X
 config REGULATOR_TPS65023
        tristate "TI TPS65023 Power regulators"
        depends on I2C
+       select REGMAP_I2C
        help
          This driver supports TPS65023 voltage regulator chips. TPS65023 provides
          three step-down converters and two general-purpose LDO voltage regulators.
index fbddc15e1811fefdec139965a425f45a5c05d473..701a5900f83f64b6a645bf8d98ae16b0597ead08 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/i2c.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
+#include <linux/regmap.h>
 
 /* Register definitions */
 #define        TPS65023_REG_VERSION            0
@@ -125,93 +126,35 @@ struct tps_pmic {
        struct i2c_client *client;
        struct regulator_dev *rdev[TPS65023_NUM_REGULATOR];
        const struct tps_info *info[TPS65023_NUM_REGULATOR];
-       struct mutex io_lock;
+       struct regmap *regmap;
 };
 
-static inline int tps_65023_read(struct tps_pmic *tps, u8 reg)
-{
-       return i2c_smbus_read_byte_data(tps->client, reg);
-}
-
-static inline int tps_65023_write(struct tps_pmic *tps, u8 reg, u8 val)
-{
-       return i2c_smbus_write_byte_data(tps->client, reg, val);
-}
-
 static int tps_65023_set_bits(struct tps_pmic *tps, u8 reg, u8 mask)
 {
-       int err, data;
-
-       mutex_lock(&tps->io_lock);
-
-       data = tps_65023_read(tps, reg);
-       if (data < 0) {
-               dev_err(&tps->client->dev, "Read from reg 0x%x failed\n", reg);
-               err = data;
-               goto out;
-       }
-
-       data |= mask;
-       err = tps_65023_write(tps, reg, data);
-       if (err)
-               dev_err(&tps->client->dev, "Write for reg 0x%x failed\n", reg);
-
-out:
-       mutex_unlock(&tps->io_lock);
-       return err;
+       return regmap_update_bits(tps->regmap, reg, mask, mask);
 }
 
 static int tps_65023_clear_bits(struct tps_pmic *tps, u8 reg, u8 mask)
 {
-       int err, data;
-
-       mutex_lock(&tps->io_lock);
-
-       data = tps_65023_read(tps, reg);
-       if (data < 0) {
-               dev_err(&tps->client->dev, "Read from reg 0x%x failed\n", reg);
-               err = data;
-               goto out;
-       }
-
-       data &= ~mask;
-
-       err = tps_65023_write(tps, reg, data);
-       if (err)
-               dev_err(&tps->client->dev, "Write for reg 0x%x failed\n", reg);
-
-out:
-       mutex_unlock(&tps->io_lock);
-       return err;
-
+       return regmap_update_bits(tps->regmap, reg, mask, 0);
 }
 
 static int tps_65023_reg_read(struct tps_pmic *tps, u8 reg)
 {
-       int data;
+       unsigned int val;
+       int ret;
 
-       mutex_lock(&tps->io_lock);
+       ret = regmap_read(tps->regmap, reg, &val);
 
-       data = tps_65023_read(tps, reg);
-       if (data < 0)
-               dev_err(&tps->client->dev, "Read from reg 0x%x failed\n", reg);
-
-       mutex_unlock(&tps->io_lock);
-       return data;
+       if (ret != 0)
+               return ret;
+       else
+               return val;
 }
 
 static int tps_65023_reg_write(struct tps_pmic *tps, u8 reg, u8 val)
 {
-       int err;
-
-       mutex_lock(&tps->io_lock);
-
-       err = tps_65023_write(tps, reg, val);
-       if (err < 0)
-               dev_err(&tps->client->dev, "Write for reg 0x%x failed\n", reg);
-
-       mutex_unlock(&tps->io_lock);
-       return err;
+       return regmap_write(tps->regmap, reg, val);
 }
 
 static int tps65023_dcdc_is_enabled(struct regulator_dev *dev)
@@ -463,6 +406,11 @@ static struct regulator_ops tps65023_ldo_ops = {
        .list_voltage = tps65023_ldo_list_voltage,
 };
 
+static struct regmap_config tps65023_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+};
+
 static int __devinit tps_65023_probe(struct i2c_client *client,
                                     const struct i2c_device_id *id)
 {
@@ -488,7 +436,13 @@ static int __devinit tps_65023_probe(struct i2c_client *client,
        if (!tps)
                return -ENOMEM;
 
-       mutex_init(&tps->io_lock);
+       tps->regmap = regmap_init_i2c(client, &tps65023_regmap_config);
+       if (IS_ERR(tps->regmap)) {
+               error = PTR_ERR(tps->regmap);
+               dev_err(&client->dev, "Failed to allocate register map: %d\n",
+                       error);
+               goto fail_alloc;
+       }
 
        /* common for all regulators */
        tps->client = client;
@@ -527,6 +481,8 @@ static int __devinit tps_65023_probe(struct i2c_client *client,
        while (--i >= 0)
                regulator_unregister(tps->rdev[i]);
 
+       regmap_exit(tps->regmap);
+ fail_alloc:
        kfree(tps);
        return error;
 }
@@ -545,6 +501,7 @@ static int __devexit tps_65023_remove(struct i2c_client *client)
        for (i = 0; i < TPS65023_NUM_REGULATOR; i++)
                regulator_unregister(tps->rdev[i]);
 
+       regmap_exit(tps->regmap);
        kfree(tps);
 
        return 0;