summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2011-05-26 17:23:25 +0530
committerNiket Sirsi <nsirsi@nvidia.com>2011-06-01 11:57:21 -0700
commite26ca39d85ba0815161123d2380a9db8a944dd44 (patch)
tree6b8627bfd2d746181855476524a9d9b1b9555b1f
parentbca7dc7cec5d2a2dafe58dfa6d382c3a6ba89b98 (diff)
mfd: tps6591x: Protecting tps write register through lock
Protecting the tps6591x register writes/update/clearing bit/setting bit through lock. Also fixed some of logical error. Change-Id: I2df44d65a62027c4a03d3c770655bebe3b394b7b Reviewed-on: http://git-master/r/33145 Reviewed-by: Niket Sirsi <nsirsi@nvidia.com> Tested-by: Niket Sirsi <nsirsi@nvidia.com>
-rw-r--r--drivers/mfd/tps6591x.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/mfd/tps6591x.c b/drivers/mfd/tps6591x.c
index 20716f532a27..d194265d315f 100644
--- a/drivers/mfd/tps6591x.c
+++ b/drivers/mfd/tps6591x.c
@@ -179,13 +179,27 @@ static inline int __tps6591x_writes(struct i2c_client *client, int reg,
int tps6591x_write(struct device *dev, int reg, uint8_t val)
{
- return __tps6591x_write(to_i2c_client(dev), reg, val);
+ struct tps6591x *tps6591x = dev_get_drvdata(dev);
+ int ret = 0;
+
+ mutex_lock(&tps6591x->lock);
+ ret = __tps6591x_write(to_i2c_client(dev), reg, val);
+ mutex_unlock(&tps6591x->lock);
+
+ return ret;
}
EXPORT_SYMBOL_GPL(tps6591x_write);
int tps6591x_writes(struct device *dev, int reg, int len, uint8_t *val)
{
- return __tps6591x_writes(to_i2c_client(dev), reg, len, val);
+ struct tps6591x *tps6591x = dev_get_drvdata(dev);
+ int ret = 0;
+
+ mutex_lock(&tps6591x->lock);
+ ret = __tps6591x_writes(to_i2c_client(dev), reg, len, val);
+ mutex_unlock(&tps6591x->lock);
+
+ return ret;
}
EXPORT_SYMBOL_GPL(tps6591x_writes);
@@ -213,7 +227,7 @@ int tps6591x_set_bits(struct device *dev, int reg, uint8_t bit_mask)
if (ret)
goto out;
- if ((reg_val & bit_mask) == 0) {
+ if ((reg_val & bit_mask) != bit_mask) {
reg_val |= bit_mask;
ret = __tps6591x_write(to_i2c_client(dev), reg, reg_val);
}
@@ -258,7 +272,7 @@ int tps6591x_update(struct device *dev, int reg, uint8_t val, uint8_t mask)
goto out;
if ((reg_val & mask) != val) {
- reg_val = (reg_val & ~mask) | val;
+ reg_val = (reg_val & ~mask) | (val & mask);
ret = __tps6591x_write(tps6591x->client, reg, reg_val);
}
out: