diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2011-05-26 17:23:25 +0530 |
---|---|---|
committer | Niket Sirsi <nsirsi@nvidia.com> | 2011-06-01 11:57:21 -0700 |
commit | e26ca39d85ba0815161123d2380a9db8a944dd44 (patch) | |
tree | 6b8627bfd2d746181855476524a9d9b1b9555b1f | |
parent | bca7dc7cec5d2a2dafe58dfa6d382c3a6ba89b98 (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.c | 22 |
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: |