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_BUCK3CONFPWMMODE 0x4DU
|
||||||
#define NPM6001_BUCKMODEPADCONF 0x4EU
|
#define NPM6001_BUCKMODEPADCONF 0x4EU
|
||||||
#define NPM6001_PADDRIVESTRENGTH 0x53U
|
#define NPM6001_PADDRIVESTRENGTH 0x53U
|
||||||
|
#define NPM6001_OVERRIDEPWRUPBUCK 0xABU
|
||||||
|
|
||||||
/* nPM6001 LDO0VOUT values */
|
/* nPM6001 LDO0VOUT values */
|
||||||
#define NPM6001_LDO0VOUT_SET1V8 0x06U
|
#define NPM6001_LDO0VOUT_SET1V8 0x06U
|
||||||
|
@ -76,6 +77,12 @@ enum npm6001_sources {
|
||||||
#define NPM6001_PADDRIVESTRENGTH_NINT_HIGH BIT(3)
|
#define NPM6001_PADDRIVESTRENGTH_NINT_HIGH BIT(3)
|
||||||
#define NPM6001_PADDRIVESTRENGTH_SDA_HIGH BIT(5)
|
#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 regulator_npm6001_pconfig {
|
||||||
struct i2c_dt_spec i2c;
|
struct i2c_dt_spec i2c;
|
||||||
uint8_t buck_pad_val;
|
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_config *config = dev->config;
|
||||||
const struct regulator_npm6001_pconfig *pconfig = config->p->config;
|
const struct regulator_npm6001_pconfig *pconfig = config->p->config;
|
||||||
uint8_t start_reg;
|
|
||||||
|
|
||||||
switch (config->source) {
|
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:
|
case NPM6001_SOURCE_BUCK3:
|
||||||
start_reg = NPM6001_TASKS_START_BUCK3;
|
return i2c_reg_write_byte_dt(&pconfig->i2c,
|
||||||
break;
|
NPM6001_TASKS_START_BUCK3, 1U);
|
||||||
case NPM6001_SOURCE_LDO0:
|
case NPM6001_SOURCE_LDO0:
|
||||||
start_reg = NPM6001_TASKS_START_LDO0;
|
return i2c_reg_write_byte_dt(&pconfig->i2c,
|
||||||
break;
|
NPM6001_TASKS_START_LDO0, 1U);
|
||||||
case NPM6001_SOURCE_LDO1:
|
case NPM6001_SOURCE_LDO1:
|
||||||
start_reg = NPM6001_TASKS_START_LDO1;
|
return i2c_reg_write_byte_dt(&pconfig->i2c,
|
||||||
break;
|
NPM6001_TASKS_START_LDO1, 1U);
|
||||||
default:
|
default:
|
||||||
return 0;
|
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)
|
static int regulator_npm6001_disable(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct regulator_npm6001_config *config = dev->config;
|
const struct regulator_npm6001_config *config = dev->config;
|
||||||
const struct regulator_npm6001_pconfig *pconfig = config->p->config;
|
const struct regulator_npm6001_pconfig *pconfig = config->p->config;
|
||||||
uint8_t stop_reg;
|
|
||||||
|
|
||||||
switch (config->source) {
|
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:
|
case NPM6001_SOURCE_BUCK3:
|
||||||
stop_reg = NPM6001_TASKS_STOP_BUCK3;
|
return i2c_reg_write_byte_dt(&pconfig->i2c,
|
||||||
break;
|
NPM6001_TASKS_STOP_BUCK3, 1U);
|
||||||
case NPM6001_SOURCE_LDO0:
|
case NPM6001_SOURCE_LDO0:
|
||||||
stop_reg = NPM6001_TASKS_STOP_LDO0;
|
return i2c_reg_write_byte_dt(&pconfig->i2c,
|
||||||
break;
|
NPM6001_TASKS_STOP_LDO0, 1U);
|
||||||
case NPM6001_SOURCE_LDO1:
|
case NPM6001_SOURCE_LDO1:
|
||||||
stop_reg = NPM6001_TASKS_STOP_LDO1;
|
return i2c_reg_write_byte_dt(&pconfig->i2c,
|
||||||
break;
|
NPM6001_TASKS_STOP_LDO1, 1U);
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return i2c_reg_write_byte_dt(&pconfig->i2c, stop_reg, 1U);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int regulator_npm6001_get_error_flags(const struct device *dev,
|
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)
|
static int regulator_npm6001_init(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct regulator_npm6001_config *config = dev->config;
|
const struct regulator_npm6001_config *config = dev->config;
|
||||||
|
bool is_enabled;
|
||||||
|
|
||||||
regulator_common_data_init(dev);
|
regulator_common_data_init(dev);
|
||||||
|
|
||||||
if (!device_is_ready(config->p)) {
|
if (!device_is_ready(config->p)) {
|
||||||
return -ENODEV;
|
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)
|
static int regulator_npm6001_common_init(const struct device *dev)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue