diff --git a/drivers/regulator/regulator_npm6001.c b/drivers/regulator/regulator_npm6001.c index 95af7a6b3de..c1ee79a888b 100644 --- a/drivers/regulator/regulator_npm6001.c +++ b/drivers/regulator/regulator_npm6001.c @@ -49,6 +49,7 @@ enum npm6001_sources { #define NPM6001_BUCK3CONFPWMMODE 0x4DU #define NPM6001_BUCKMODEPADCONF 0x4EU #define NPM6001_PADDRIVESTRENGTH 0x53U +#define NPM6001_OVERRIDEPWRUPBUCK 0xABU /* nPM6001 LDO0VOUT values */ #define NPM6001_LDO0VOUT_SET1V8 0x06U @@ -76,6 +77,12 @@ enum npm6001_sources { #define NPM6001_PADDRIVESTRENGTH_NINT_HIGH BIT(3) #define NPM6001_PADDRIVESTRENGTH_SDA_HIGH BIT(5) +/* nPM6001 OVERRIDEPWRUPBUCK fields */ +#define NPM6001_OVERRIDEPWRUPBUCK_BUCK1DISABLE_MSK 0x22U +#define NPM6001_OVERRIDEPWRUPBUCK_BUCK2DISABLE_MSK 0x44U +#define NPM6001_OVERRIDEPWRUPBUCK_BUCK1DISABLE BIT(1) +#define NPM6001_OVERRIDEPWRUPBUCK_BUCK2DISABLE BIT(2) + struct regulator_npm6001_pconfig { struct i2c_dt_spec i2c; uint8_t buck_pad_val; @@ -488,47 +495,58 @@ static int regulator_npm6001_enable(const struct device *dev) { const struct regulator_npm6001_config *config = dev->config; const struct regulator_npm6001_pconfig *pconfig = config->p->config; - uint8_t start_reg; switch (config->source) { + case NPM6001_SOURCE_BUCK1: + return i2c_reg_update_byte_dt( + &pconfig->i2c, NPM6001_OVERRIDEPWRUPBUCK, + NPM6001_OVERRIDEPWRUPBUCK_BUCK1DISABLE_MSK, 0U); + case NPM6001_SOURCE_BUCK2: + return i2c_reg_update_byte_dt( + &pconfig->i2c, NPM6001_OVERRIDEPWRUPBUCK, + NPM6001_OVERRIDEPWRUPBUCK_BUCK2DISABLE_MSK, 0U); case NPM6001_SOURCE_BUCK3: - start_reg = NPM6001_TASKS_START_BUCK3; - break; + return i2c_reg_write_byte_dt(&pconfig->i2c, + NPM6001_TASKS_START_BUCK3, 1U); case NPM6001_SOURCE_LDO0: - start_reg = NPM6001_TASKS_START_LDO0; - break; + return i2c_reg_write_byte_dt(&pconfig->i2c, + NPM6001_TASKS_START_LDO0, 1U); case NPM6001_SOURCE_LDO1: - start_reg = NPM6001_TASKS_START_LDO1; - break; + return i2c_reg_write_byte_dt(&pconfig->i2c, + NPM6001_TASKS_START_LDO1, 1U); default: return 0; } - - /* TASKS_START_(BUCK3|LDO0|LDO1) */ - return i2c_reg_write_byte_dt(&pconfig->i2c, start_reg, 1U); } static int regulator_npm6001_disable(const struct device *dev) { const struct regulator_npm6001_config *config = dev->config; const struct regulator_npm6001_pconfig *pconfig = config->p->config; - uint8_t stop_reg; switch (config->source) { + case NPM6001_SOURCE_BUCK1: + return i2c_reg_update_byte_dt( + &pconfig->i2c, NPM6001_OVERRIDEPWRUPBUCK, + NPM6001_OVERRIDEPWRUPBUCK_BUCK1DISABLE_MSK, + NPM6001_OVERRIDEPWRUPBUCK_BUCK1DISABLE); + case NPM6001_SOURCE_BUCK2: + return i2c_reg_update_byte_dt( + &pconfig->i2c, NPM6001_OVERRIDEPWRUPBUCK, + NPM6001_OVERRIDEPWRUPBUCK_BUCK2DISABLE_MSK, + NPM6001_OVERRIDEPWRUPBUCK_BUCK2DISABLE); case NPM6001_SOURCE_BUCK3: - stop_reg = NPM6001_TASKS_STOP_BUCK3; - break; + return i2c_reg_write_byte_dt(&pconfig->i2c, + NPM6001_TASKS_STOP_BUCK3, 1U); case NPM6001_SOURCE_LDO0: - stop_reg = NPM6001_TASKS_STOP_LDO0; - break; + return i2c_reg_write_byte_dt(&pconfig->i2c, + NPM6001_TASKS_STOP_LDO0, 1U); case NPM6001_SOURCE_LDO1: - stop_reg = NPM6001_TASKS_STOP_LDO1; - break; + return i2c_reg_write_byte_dt(&pconfig->i2c, + NPM6001_TASKS_STOP_LDO1, 1U); default: return 0; } - - return i2c_reg_write_byte_dt(&pconfig->i2c, stop_reg, 1U); } static int regulator_npm6001_get_error_flags(const struct device *dev, @@ -597,13 +615,19 @@ static int regulator_npm6001_get_error_flags(const struct device *dev, static int regulator_npm6001_init(const struct device *dev) { const struct regulator_npm6001_config *config = dev->config; + bool is_enabled; regulator_common_data_init(dev); if (!device_is_ready(config->p)) { return -ENODEV; } - return regulator_common_init(dev, false); + + /* BUCK1/2 are ON by default */ + is_enabled = (config->source == NPM6001_SOURCE_BUCK1) || + (config->source == NPM6001_SOURCE_BUCK2); + + return regulator_common_init(dev, is_enabled); } static int regulator_npm6001_common_init(const struct device *dev)