diff options
Diffstat (limited to 'drivers/regulator/tps65023-regulator.c')
| -rw-r--r-- | drivers/regulator/tps65023-regulator.c | 97 | 
1 files changed, 27 insertions, 70 deletions
| diff --git a/drivers/regulator/tps65023-regulator.c b/drivers/regulator/tps65023-regulator.c index fbddc15e1811..701a5900f83f 100644 --- a/drivers/regulator/tps65023-regulator.c +++ b/drivers/regulator/tps65023-regulator.c @@ -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; | 
