summaryrefslogtreecommitdiffstats
path: root/drivers/mfd
diff options
context:
space:
mode:
authorEnrico Scholz <enrico.scholz@sigma-chemnitz.de>2016-08-03 16:14:52 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2018-04-12 09:20:14 +0200
commit13ce6c24f0b5217bb9f787b0ddd82a8eceb8894a (patch)
treea1afe6256a946864915071af20d103aeecbfacba /drivers/mfd
parentcc2c60c531572ac27f42f419d3da1a65e4e67262 (diff)
downloadbarebox-13ce6c24f0b5217bb9f787b0ddd82a8eceb8894a.tar.gz
barebox-13ce6c24f0b5217bb9f787b0ddd82a8eceb8894a.tar.xz
mfd: da9063: added generic reg_update() function
Used to set or clear bits of a register. The calculation of 'client' might look odd and unnecessary complicated. But style prepares access to other register banks which is added in following patches. Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de> Tested-by: Stefan Christ <s.christ@phytec.de> Signed-off-by: Christian Hemp <c.hemp@phytec.de>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/da9063.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/mfd/da9063.c b/drivers/mfd/da9063.c
index 74ad5bfdab..68b0723b61 100644
--- a/drivers/mfd/da9063.c
+++ b/drivers/mfd/da9063.c
@@ -52,6 +52,43 @@ struct da9063 {
#define DA9063_WATCHDOG 0x01
#define DA9063_SHUTDOWN 0x02
+static int da906x_reg_update(struct da9063 *priv, unsigned int reg,
+ uint8_t mask, uint8_t val)
+{
+ struct i2c_client *client;
+ uint8_t tmp;
+ int ret;
+
+ if (reg < 0x100)
+ client = priv->client;
+ else
+ /* this should/can not happen because function is usually
+ * called with a static register number; warn about it
+ * below */
+ client = NULL;
+
+ if (WARN_ON(!client))
+ return -EINVAL;
+
+ ret = i2c_read_reg(client, reg & 0xffu, &tmp, 1);
+ if (ret < 0) {
+ dev_warn(priv->dev, "failed to read reg %02x\n", reg);
+ return ret;
+ }
+
+ tmp &= ~mask;
+ tmp |= val;
+
+ ret = i2c_write_reg(client, reg & 0xffu, &tmp, 1);
+ if (ret < 0) {
+ dev_warn(priv->dev, "failed to write %02x into reg %02x\n",
+ tmp, reg);
+ return ret;
+ }
+
+ return 0;
+}
+
static int da9063_watchdog_ping(struct da9063 *priv)
{
int ret;