drivers: regulator: npm6001: add support for BUCK1/2 disable

BUCK1/2 are defined as "always on" regulators, however, there is a
special override register that allows to turn them on/off.

Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
This commit is contained in:
Gerard Marull-Paretas 2023-01-09 11:07:49 +01:00 committed by Fabio Baltieri
commit a6575e5834

View file

@ -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)