Commit 90923351 authored by Mark Brown's avatar Mark Brown

regulator: Convert tps65023 to use regmap API

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: default avatarLiam Girdwood <lrg@ti.com>
Acked-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent a676f083
...@@ -235,6 +235,7 @@ config REGULATOR_TPS6105X ...@@ -235,6 +235,7 @@ config REGULATOR_TPS6105X
config REGULATOR_TPS65023 config REGULATOR_TPS65023
tristate "TI TPS65023 Power regulators" tristate "TI TPS65023 Power regulators"
depends on I2C depends on I2C
select REGMAP_I2C
help help
This driver supports TPS65023 voltage regulator chips. TPS65023 provides This driver supports TPS65023 voltage regulator chips. TPS65023 provides
three step-down converters and two general-purpose LDO voltage regulators. three step-down converters and two general-purpose LDO voltage regulators.
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/regmap.h>
/* Register definitions */ /* Register definitions */
#define TPS65023_REG_VERSION 0 #define TPS65023_REG_VERSION 0
...@@ -125,93 +126,35 @@ struct tps_pmic { ...@@ -125,93 +126,35 @@ struct tps_pmic {
struct i2c_client *client; struct i2c_client *client;
struct regulator_dev *rdev[TPS65023_NUM_REGULATOR]; struct regulator_dev *rdev[TPS65023_NUM_REGULATOR];
const struct tps_info *info[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) static int tps_65023_set_bits(struct tps_pmic *tps, u8 reg, u8 mask)
{ {
int err, data; return regmap_update_bits(tps->regmap, reg, mask, mask);
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;
} }
static int tps_65023_clear_bits(struct tps_pmic *tps, u8 reg, u8 mask) static int tps_65023_clear_bits(struct tps_pmic *tps, u8 reg, u8 mask)
{ {
int err, data; return regmap_update_bits(tps->regmap, reg, mask, 0);
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;
} }
static int tps_65023_reg_read(struct tps_pmic *tps, u8 reg) 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 (ret != 0)
if (data < 0) return ret;
dev_err(&tps->client->dev, "Read from reg 0x%x failed\n", reg); else
return val;
mutex_unlock(&tps->io_lock);
return data;
} }
static int tps_65023_reg_write(struct tps_pmic *tps, u8 reg, u8 val) static int tps_65023_reg_write(struct tps_pmic *tps, u8 reg, u8 val)
{ {
int err; return regmap_write(tps->regmap, reg, val);
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;
} }
static int tps65023_dcdc_is_enabled(struct regulator_dev *dev) static int tps65023_dcdc_is_enabled(struct regulator_dev *dev)
...@@ -463,6 +406,11 @@ static struct regulator_ops tps65023_ldo_ops = { ...@@ -463,6 +406,11 @@ static struct regulator_ops tps65023_ldo_ops = {
.list_voltage = tps65023_ldo_list_voltage, .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, static int __devinit tps_65023_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
...@@ -488,7 +436,13 @@ static int __devinit tps_65023_probe(struct i2c_client *client, ...@@ -488,7 +436,13 @@ static int __devinit tps_65023_probe(struct i2c_client *client,
if (!tps) if (!tps)
return -ENOMEM; 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 */ /* common for all regulators */
tps->client = client; tps->client = client;
...@@ -527,6 +481,8 @@ static int __devinit tps_65023_probe(struct i2c_client *client, ...@@ -527,6 +481,8 @@ static int __devinit tps_65023_probe(struct i2c_client *client,
while (--i >= 0) while (--i >= 0)
regulator_unregister(tps->rdev[i]); regulator_unregister(tps->rdev[i]);
regmap_exit(tps->regmap);
fail_alloc:
kfree(tps); kfree(tps);
return error; return error;
} }
...@@ -545,6 +501,7 @@ static int __devexit tps_65023_remove(struct i2c_client *client) ...@@ -545,6 +501,7 @@ static int __devexit tps_65023_remove(struct i2c_client *client)
for (i = 0; i < TPS65023_NUM_REGULATOR; i++) for (i = 0; i < TPS65023_NUM_REGULATOR; i++)
regulator_unregister(tps->rdev[i]); regulator_unregister(tps->rdev[i]);
regmap_exit(tps->regmap);
kfree(tps); kfree(tps);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment