summaryrefslogtreecommitdiff
path: root/drivers/mfd
diff options
context:
space:
mode:
authorJin Park <jinyoungp@nvidia.com>2011-06-25 17:00:03 +0900
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:47:17 -0800
commit524a1168d335d4c9e21fad1249777822d576aa00 (patch)
tree991ca785640b0ee65bd562ba0d550cfeb30c4e02 /drivers/mfd
parent938b7b59ffab98ca69681a36705130517409b92d (diff)
arm: mfd/regulator: tps80031: Adding force_update for status register
The state register is read and write register, if read, it returned current state, not current written value in register. So if it want to write the value into state register, it must unconditional write the value, don't use update(read and compare and then write). Bug 838189 Original-Change-Id: I2555875a822f159e664b0834af2d00073c859acd Signed-off-by: Jin Park <jinyoungp@nvidia.com> Reviewed-on: http://git-master/r/38396 Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com> Rebase-Id: Ra90d4ccbe0373bbdad44422e8ff6798eea96019a
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/tps80031.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/mfd/tps80031.c b/drivers/mfd/tps80031.c
index 4b80f65cc924..39f7f2ee3149 100644
--- a/drivers/mfd/tps80031.c
+++ b/drivers/mfd/tps80031.c
@@ -313,6 +313,29 @@ out:
}
EXPORT_SYMBOL_GPL(tps80031_update);
+int tps80031_force_update(struct device *dev, int sid, int reg, uint8_t val,
+ uint8_t mask)
+{
+ struct tps80031 *tps80031 = dev_get_drvdata(dev);
+ struct tps80031_client *tps = &tps80031->tps_clients[sid];
+ uint8_t reg_val;
+ int ret = 0;
+
+ mutex_lock(&tps->lock);
+
+ ret = __tps80031_read(tps->client, reg, &reg_val);
+ if (ret)
+ goto out;
+
+ reg_val = (reg_val & ~mask) | (val & mask);
+ ret = __tps80031_write(tps->client, reg, reg_val);
+
+out:
+ mutex_unlock(&tps->lock);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(tps80031_force_update);
+
static struct tps80031 *tps80031_dev;
int tps80031_power_off(void)
{