From dd52908fcf1a6c82599657d027d96b3491f609f7 Mon Sep 17 00:00:00 2001 From: Andy Sinclair Date: Wed, 30 Aug 2023 15:26:02 +0100 Subject: [PATCH] drivers: regulator: npm1300: Set voltage checks existing setting Regulator voltage setting is not applied if the device output is already configured for the requested voltage. This change is needed to ensure correct device behaviour. Signed-off-by: Andy Sinclair --- drivers/regulator/regulator_npm1300.c | 48 +++++++++++++++++---------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/drivers/regulator/regulator_npm1300.c b/drivers/regulator/regulator_npm1300.c index 95c6b8a4d02..84ea5b68263 100644 --- a/drivers/regulator/regulator_npm1300.c +++ b/drivers/regulator/regulator_npm1300.c @@ -141,10 +141,33 @@ static int retention_set_voltage(const struct device *dev, int32_t retention_uv) idx); } +static int buck_get_voltage_index(const struct device *dev, uint8_t chan, uint8_t *idx) +{ + const struct regulator_npm1300_config *config = dev->config; + uint8_t sel; + int ret; + + ret = mfd_npm1300_reg_read(config->mfd, BUCK_BASE, BUCK_OFFSET_SW_CTRL, &sel); + + if (ret < 0) { + return ret; + } + + if ((sel >> chan) & 1U) { + /* SW control */ + return mfd_npm1300_reg_read(config->mfd, BUCK_BASE, + BUCK_OFFSET_VOUT_NORM + (chan * 2U), idx); + } + + /* VSET pin control */ + return mfd_npm1300_reg_read(config->mfd, BUCK_BASE, BUCK_OFFSET_VOUT_STAT + chan, idx); +} + static int buck_set_voltage(const struct device *dev, uint8_t chan, int32_t min_uv, int32_t max_uv) { const struct regulator_npm1300_config *config = dev->config; uint8_t mask; + uint8_t curr_idx; uint16_t idx; int ret; @@ -154,6 +177,13 @@ static int buck_set_voltage(const struct device *dev, uint8_t chan, int32_t min_ return ret; } + /* Get current setting, and return if current and new index match */ + ret = buck_get_voltage_index(dev, chan, &curr_idx); + + if ((ret < 0) || (idx == curr_idx)) { + return ret; + } + ret = mfd_npm1300_reg_write(config->mfd, BUCK_BASE, BUCK_OFFSET_VOUT_NORM + (chan * 2U), idx); @@ -201,26 +231,10 @@ int regulator_npm1300_set_voltage(const struct device *dev, int32_t min_uv, int3 static int buck_get_voltage(const struct device *dev, uint8_t chan, int32_t *volt_uv) { - const struct regulator_npm1300_config *config = dev->config; - uint8_t sel; uint8_t idx; int ret; - ret = mfd_npm1300_reg_read(config->mfd, BUCK_BASE, BUCK_OFFSET_SW_CTRL, &sel); - - if (ret < 0) { - return ret; - } - - if ((sel >> chan) & 1U) { - /* SW control */ - ret = mfd_npm1300_reg_read(config->mfd, BUCK_BASE, - BUCK_OFFSET_VOUT_NORM + (chan * 2U), &idx); - } else { - /* VSET pin control */ - ret = mfd_npm1300_reg_read(config->mfd, BUCK_BASE, BUCK_OFFSET_VOUT_STAT + chan, - &idx); - } + ret = buck_get_voltage_index(dev, chan, &idx); if (ret < 0) { return ret;