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:
parent
7feb008c85
commit
a6575e5834
1 changed files with 44 additions and 20 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue