drivers: regulator: pca9420: refactor voltage range handling

Voltage ranges were hardcoded in Devicetree, however, things can be
significantly simplified by using the recently introduce linear ranges
API. All values are now computed using information stored in the driver,
so there is no need to store any lookup table in ROM. Code should now
both be faster in average and consume less ROM.

Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
This commit is contained in:
Gerard Marull-Paretas 2022-11-17 10:24:05 +01:00 committed by Carles Cufí
commit dcd63d288f
5 changed files with 92 additions and 261 deletions

View file

@ -182,9 +182,7 @@ arduino_serial: &flexcomm12 {
modesel-reg = <PCA9420_MODECFG_0_0>;
modesel-mask = <PCA9420_MODECFG_0_MODE_CTRL_SEL_MASK>;
BUCK1 {
voltage-range = <PCA9420_SW1_VOLTAGE_RANGE>;
current-levels = <PCA9420_CURRENT_LIMIT_LEVELS>;
num-voltages = <42>;
num-current-levels = <7>;
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1800000>;
@ -193,8 +191,6 @@ arduino_serial: &flexcomm12 {
};
BUCK2 {
voltage-range = <PCA9420_SW2_VOLTAGE_RANGE>;
num-voltages = <50>;
current-levels = <PCA9420_CURRENT_LIMIT_LEVELS>;
num-current-levels = <7>;
regulator-min-microvolt = <1500000>;
@ -204,8 +200,6 @@ arduino_serial: &flexcomm12 {
};
LDO1 {
voltage-range = <PCA9420_LDO1_VOLTAGE_RANGE>;
num-voltages = <9>;
current-levels = <PCA9420_CURRENT_LIMIT_LEVELS>;
num-current-levels = <7>;
regulator-min-microvolt = <1700000>;
@ -215,8 +209,6 @@ arduino_serial: &flexcomm12 {
};
LDO2 {
voltage-range = <PCA9420_LDO2_VOLTAGE_RANGE>;
num-voltages = <51>;
current-levels = <PCA9420_CURRENT_LIMIT_LEVELS>;
num-current-levels = <7>;
regulator-min-microvolt = <1500000>;

View file

@ -252,9 +252,7 @@ i2s1: &flexcomm3 {
modesel-reg = <PCA9420_MODECFG_0_0>;
modesel-mask = <PCA9420_MODECFG_0_MODE_CTRL_SEL_MASK>;
BUCK1 {
voltage-range = <PCA9420_SW1_VOLTAGE_RANGE>;
current-levels = <PCA9420_CURRENT_LIMIT_LEVELS>;
num-voltages = <42>;
num-current-levels = <7>;
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1800000>;
@ -263,8 +261,6 @@ i2s1: &flexcomm3 {
};
BUCK2 {
voltage-range = <PCA9420_SW2_VOLTAGE_RANGE>;
num-voltages = <50>;
current-levels = <PCA9420_CURRENT_LIMIT_LEVELS>;
num-current-levels = <7>;
regulator-min-microvolt = <1500000>;
@ -274,8 +270,6 @@ i2s1: &flexcomm3 {
};
LDO1 {
voltage-range = <PCA9420_LDO1_VOLTAGE_RANGE>;
num-voltages = <9>;
current-levels = <PCA9420_CURRENT_LIMIT_LEVELS>;
num-current-levels = <7>;
regulator-min-microvolt = <1700000>;
@ -285,8 +279,6 @@ i2s1: &flexcomm3 {
};
LDO2 {
voltage-range = <PCA9420_LDO2_VOLTAGE_RANGE>;
num-voltages = <51>;
current-levels = <PCA9420_CURRENT_LIMIT_LEVELS>;
num-current-levels = <7>;
regulator-min-microvolt = <1500000>;

View file

@ -12,6 +12,7 @@
#include <zephyr/drivers/regulator.h>
#include <zephyr/dt-bindings/regulator/pmic_i2c.h>
#include <zephyr/logging/log.h>
#include <zephyr/sys/linear_range.h>
#include <zephyr/sys/util_macro.h>
LOG_MODULE_REGISTER(pca9420, CONFIG_REGULATOR_LOG_LEVEL);
@ -47,10 +48,13 @@ LOG_MODULE_REGISTER(pca9420, CONFIG_REGULATOR_LOG_LEVEL);
*/
/** @brief Mode output voltage mask */
#define PCA9420_MODECFG_0_SW1_OUT_MASK 0x3FU
#define PCA9420_MODECFG_0_SW1_OUT_POS 0U
/** @brief SW2_OUT offset and voltage level mask */
#define PCA9420_MODECFG_1_SW2_OUT_MASK 0x3FU
#define PCA9420_MODECFG_1_SW2_OUT_POS 0U
/** @brief LDO1_OUT voltage level mask */
#define PCA9420_MODECFG_2_LDO1_OUT_MASK 0xF0U
#define PCA9420_MODECFG_2_LDO1_OUT_POS 4U
/** @brief SW1 Enable */
#define PCA9420_MODECFG_2_SW1_EN_MASK 0x08U
#define PCA9420_MODECFG_2_SW1_EN_VAL 0x08U
@ -65,17 +69,12 @@ LOG_MODULE_REGISTER(pca9420, CONFIG_REGULATOR_LOG_LEVEL);
#define PCA9420_MODECFG_2_LDO2_EN_VAL 0x01U
/** @brief LDO2_OUT offset and voltage level mask */
#define PCA9420_MODECFG_3_LDO2_OUT_MASK 0x3FU
struct voltage_range {
int32_t uV; /* Voltage in uV */
uint8_t reg_val; /* Register value for voltage */
};
#define PCA9420_MODECFG_3_LDO2_OUT_POS 0U
struct current_range {
int32_t uA; /* Current limit in uA */
uint8_t reg_val; /* Register value for current limit */
};
struct regulator_pca9420_desc {
uint8_t enable_reg;
uint8_t enable_mask;
@ -84,25 +83,23 @@ struct regulator_pca9420_desc {
uint8_t ilim_mask;
uint8_t vsel_reg;
uint8_t vsel_mask;
uint8_t vsel_pos;
uint8_t num_ranges;
const struct linear_range *ranges;
};
struct regulator_pca9420_data {
struct onoff_sync_service srv;
const struct voltage_range *voltages;
const struct current_range *current_levels;
};
struct regulator_pca9420_config {
int num_voltages;
int num_current_levels;
int num_modes;
int32_t max_uv;
int32_t min_uv;
bool enable_inverted;
bool boot_on;
struct i2c_dt_spec i2c;
uint16_t initial_mode;
const uint32_t *voltage_array;
const uint32_t *current_array;
const uint16_t *allowed_modes;
uint8_t modesel_reg;
@ -110,6 +107,31 @@ struct regulator_pca9420_config {
const struct regulator_pca9420_desc *desc;
};
static const struct linear_range buck1_ranges[] = {
LINEAR_RANGE_INIT(500000, 25000U, 0x0U, 0x28U),
LINEAR_RANGE_INIT(1500000, 0U, 0x29U, 0x3E),
LINEAR_RANGE_INIT(1800000, 0U, 0x3FU, 0x3FU),
};
static const struct linear_range buck2_ranges[] = {
LINEAR_RANGE_INIT(1500000, 25000U, 0x0U, 0x18U),
LINEAR_RANGE_INIT(2100000, 0U, 0x19U, 0x1F),
LINEAR_RANGE_INIT(2700000, 25000U, 0x20U, 0x38U),
LINEAR_RANGE_INIT(3300000, 0U, 0x39U, 0x3F),
};
static const struct linear_range ldo1_ranges[] = {
LINEAR_RANGE_INIT(1700000, 25000U, 0x0U, 0x9U),
LINEAR_RANGE_INIT(1900000, 0U, 0x9U, 0xFU),
};
static const struct linear_range ldo2_ranges[] = {
LINEAR_RANGE_INIT(1500000, 25000U, 0x0U, 0x18U),
LINEAR_RANGE_INIT(2100000, 0U, 0x19U, 0x1FU),
LINEAR_RANGE_INIT(2700000, 25000U, 0x20U, 0x38U),
LINEAR_RANGE_INIT(3300000, 0U, 0x39U, 0x3FU),
};
static const struct regulator_pca9420_desc buck1_desc = {
.enable_reg = PCA9420_MODECFG_0_2,
.enable_mask = PCA9420_MODECFG_2_SW1_EN_MASK,
@ -117,7 +139,10 @@ static const struct regulator_pca9420_desc buck1_desc = {
.ilim_reg = PCA9420_TOP_CNTL0,
.ilim_mask = PCA9420_TOP_CNTL0_VIN_ILIM_SEL_MASK,
.vsel_mask = PCA9420_MODECFG_0_SW1_OUT_MASK,
.vsel_pos = PCA9420_MODECFG_0_SW1_OUT_POS,
.vsel_reg = PCA9420_MODECFG_0_0,
.ranges = buck1_ranges,
.num_ranges = ARRAY_SIZE(buck1_ranges),
};
static const struct regulator_pca9420_desc buck2_desc = {
@ -125,9 +150,12 @@ static const struct regulator_pca9420_desc buck2_desc = {
.enable_mask = PCA9420_MODECFG_2_SW2_EN_MASK,
.enable_val = PCA9420_MODECFG_2_SW2_EN_VAL,
.vsel_mask = PCA9420_MODECFG_1_SW2_OUT_MASK,
.vsel_pos = PCA9420_MODECFG_1_SW2_OUT_POS,
.vsel_reg = PCA9420_MODECFG_0_1,
.ilim_reg = PCA9420_TOP_CNTL0,
.ilim_mask = PCA9420_TOP_CNTL0_VIN_ILIM_SEL_MASK,
.ranges = buck2_ranges,
.num_ranges = ARRAY_SIZE(buck2_ranges),
};
static const struct regulator_pca9420_desc ldo1_desc = {
@ -135,9 +163,12 @@ static const struct regulator_pca9420_desc ldo1_desc = {
.enable_mask = PCA9420_MODECFG_2_LDO1_EN_MASK,
.enable_val = PCA9420_MODECFG_2_LDO1_EN_VAL,
.vsel_mask = PCA9420_MODECFG_2_LDO1_OUT_MASK,
.vsel_pos = PCA9420_MODECFG_2_LDO1_OUT_POS,
.vsel_reg = PCA9420_MODECFG_0_2,
.ilim_reg = PCA9420_TOP_CNTL0,
.ilim_mask = PCA9420_TOP_CNTL0_VIN_ILIM_SEL_MASK,
.ranges = ldo1_ranges,
.num_ranges = ARRAY_SIZE(ldo1_ranges),
};
static const struct regulator_pca9420_desc ldo2_desc = {
@ -146,8 +177,11 @@ static const struct regulator_pca9420_desc ldo2_desc = {
.enable_val = PCA9420_MODECFG_2_LDO2_EN_VAL,
.vsel_reg = PCA9420_MODECFG_0_3,
.vsel_mask = PCA9420_MODECFG_3_LDO2_OUT_MASK,
.vsel_pos = PCA9420_MODECFG_3_LDO2_OUT_POS,
.ilim_reg = PCA9420_TOP_CNTL0,
.ilim_mask = PCA9420_TOP_CNTL0_VIN_ILIM_SEL_MASK,
.ranges = ldo2_ranges,
.num_ranges = ARRAY_SIZE(ldo2_ranges),
};
static int regulator_pca9420_is_supported_voltage(const struct device *dev,
@ -198,30 +232,24 @@ static int regulator_pca9420_modify_register(const struct device *dev,
* offset applied to the vsel_reg. Useful to support reading voltages
* in another target mode
*/
static int32_t regulator_pca9420_get_voltage_offset(const struct device *dev,
uint32_t off)
static int regulator_pca9420_get_voltage_offset(const struct device *dev,
uint32_t off, int32_t *voltage)
{
const struct regulator_pca9420_config *config = dev->config;
struct regulator_pca9420_data *data = dev->data;
int rc, i = 0;
int ret;
uint8_t raw_reg;
rc = regulator_pca9420_read_register(dev, config->desc->vsel_reg + off,
&raw_reg);
if (rc) {
return rc;
ret = regulator_pca9420_read_register(dev, config->desc->vsel_reg + off,
&raw_reg);
if (ret < 0) {
return ret;
}
raw_reg &= config->desc->vsel_mask;
/* Locate the voltage value in the voltage table */
while (i < config->num_voltages &&
raw_reg != data->voltages[i].reg_val){
i++;
}
if (i == config->num_voltages) {
LOG_WRN("Regulator vsel reg has unknown value");
return -EIO;
}
return data->voltages[i].uV;
raw_reg = (raw_reg & config->desc->vsel_mask) >> config->desc->vsel_pos;
return linear_range_group_get_value(config->desc->ranges,
config->desc->num_ranges, raw_reg,
voltage);
}
/**
@ -234,32 +262,22 @@ static int regulator_set_voltage_offset(const struct device *dev,
uint32_t off)
{
const struct regulator_pca9420_config *config = dev->config;
struct regulator_pca9420_data *data = dev->data;
int i = 0;
uint16_t idx;
int ret;
if (!regulator_pca9420_is_supported_voltage(dev, min_uv, max_uv) ||
min_uv > max_uv) {
return -EINVAL;
ret = linear_range_group_get_win_index(config->desc->ranges,
config->desc->num_ranges, min_uv,
max_uv, &idx);
if (ret < 0) {
return ret;
}
/* Find closest supported voltage */
while (i < config->num_voltages && min_uv > data->voltages[i].uV) {
i++;
}
if (data->voltages[i].uV > max_uv) {
LOG_DBG("Regulator could not satisfy voltage range, too narrow");
return -EINVAL;
}
if (i == config->num_voltages) {
LOG_WRN("Regulator could not locate supported voltage,"
"but voltage is in range.");
return -EINVAL;
}
LOG_DBG("Setting regulator %s to %duV", dev->name,
data->voltages[i].uV);
idx <<= config->desc->vsel_pos;
return regulator_pca9420_modify_register(dev,
config->desc->vsel_reg + off,
config->desc->vsel_mask,
data->voltages[i].reg_val);
(uint8_t)idx);
}
@ -271,7 +289,8 @@ static int regulator_pca9420_count_voltages(const struct device *dev)
{
const struct regulator_pca9420_config *config = dev->config;
return config->num_voltages;
return linear_range_group_values_count(config->desc->ranges,
config->desc->num_ranges);
}
/**
@ -293,12 +312,15 @@ static int32_t regulator_pca9420_list_voltages(const struct device *dev,
unsigned int selector)
{
const struct regulator_pca9420_config *config = dev->config;
struct regulator_pca9420_data *data = dev->data;
int32_t value;
if (config->num_voltages <= selector) {
return -ENODEV;
if (linear_range_group_get_value(config->desc->ranges,
config->desc->num_ranges, selector,
&value) < 0) {
return 0;
}
return data->voltages[selector].uV;
return value;
}
/**
@ -310,8 +332,11 @@ static int regulator_pca9420_is_supported_voltage(const struct device *dev,
int32_t max_uv)
{
const struct regulator_pca9420_config *config = dev->config;
uint16_t idx;
return !((config->max_uv < min_uv) || (config->min_uv > max_uv));
return linear_range_group_get_win_index(config->desc->ranges,
config->desc->num_ranges,
min_uv, max_uv, &idx);
}
/**
@ -331,7 +356,11 @@ static int regulator_pca9420_set_voltage(const struct device *dev,
*/
static int32_t regulator_pca9420_get_voltage(const struct device *dev)
{
return regulator_pca9420_get_voltage_offset(dev, 0);
int32_t voltage = 0;
(void)regulator_pca9420_get_voltage_offset(dev, 0, &voltage);
return voltage;
}
/**
@ -501,6 +530,7 @@ static int32_t regulator_pca9420_get_mode_voltage(const struct device *dev,
{
const struct regulator_pca9420_config *config = dev->config;
uint8_t i, sel_off;
int32_t voltage;
if (config->num_modes == 0) {
return -ENOTSUP;
@ -517,7 +547,10 @@ static int32_t regulator_pca9420_get_mode_voltage(const struct device *dev,
return -EINVAL;
}
sel_off = ((mode & PMIC_MODE_OFFSET_MASK) >> PMIC_MODE_OFFSET_SHIFT);
return regulator_pca9420_get_voltage_offset(dev, sel_off);
(void)regulator_pca9420_get_voltage_offset(dev, sel_off, &voltage);
return voltage;
}
/*
@ -615,10 +648,6 @@ static int regulator_pca9420_init(const struct device *dev)
struct regulator_pca9420_data *data = dev->data;
int rc = 0;
/* Cast the voltage array set at compile time to the voltage range
* struct
*/
data->voltages = (struct voltage_range *)config->voltage_array;
/* Do the same cast for current limit ranges */
data->current_levels = (struct current_range *)config->current_array;
/* Check to verify we have a valid I2C device */
@ -656,25 +685,19 @@ static const struct regulator_driver_api api = {
#define REGULATOR_PCA9420_DEFINE(node_id, id, name) \
static const uint32_t curr_limits_##id[] = \
DT_PROP_OR(node_id, current_levels, {}); \
static const uint32_t vol_range_##id[] = \
DT_PROP(node_id, voltage_range); \
static const uint16_t allowed_modes_##id[] = \
DT_PROP_OR(DT_PARENT(node_id), regulator_allowed_modes, {}); \
\
static struct regulator_pca9420_data data_##id; \
\
static const struct regulator_pca9420_config config_##id = { \
.num_voltages = DT_PROP(node_id, num_voltages), \
.num_current_levels = DT_PROP(node_id, num_current_levels), \
.min_uv = DT_PROP(node_id, regulator_min_microvolt), \
.max_uv = DT_PROP(node_id, regulator_max_microvolt), \
.enable_inverted = DT_PROP(node_id, enable_inverted), \
.boot_on = DT_PROP(node_id, regulator_boot_on), \
.num_modes = ARRAY_SIZE(allowed_modes_##id), \
.initial_mode = DT_PROP_OR(DT_PARENT(node_id), \
regulator_initial_mode, 0), \
.i2c = I2C_DT_SPEC_GET(DT_PARENT(node_id)), \
.voltage_array = vol_range_##id, \
.current_array = curr_limits_##id, \
.allowed_modes = allowed_modes_##id, \
.modesel_reg = DT_PROP_OR(DT_PARENT(node_id), modesel_reg, 0), \

View file

@ -68,17 +68,6 @@ child-binding:
regulator-max-microamp:
required: true
voltage-range:
type: array
required: true
description: |
array of voltage values in uV, followed by the register value that
must be written to enable the voltage. For example, [3300000, 0x3]
denotes a value of 0x3 must be written to the register to set 3.3V
num-voltages:
type: int
required: true
description: number of voltages present in the voltage-range array.
enable-inverted:
type: boolean
description: |

View file

@ -9,171 +9,6 @@
#include "pmic_i2c.h"
/*
* Voltage Ranges should be defined without commas, spaces, or brackets. These
* ranges will be inserted directly into the devicetree as arrays, so that the
* driver can parse them.
*/
#define PCA9420_SW1_VOLTAGE_RANGE \
500000 0x00 /* SW1 output voltage 0.500V. */\
525000 0x01 /* SW1 output voltage 0.525V. */\
550000 0x02 /* SW1 output voltage 0.550V. */\
575000 0x03 /* SW1 output voltage 0.575V. */\
600000 0x04 /* SW1 output voltage 0.600V. */\
625000 0x05 /* SW1 output voltage 0.625V. */\
650000 0x06 /* SW1 output voltage 0.650V. */\
675000 0x07 /* SW1 output voltage 0.675V. */\
700000 0x08 /* SW1 output voltage 0.700V. */\
725000 0x09 /* SW1 output voltage 0.725V. */\
750000 0x0A /* SW1 output voltage 0.750V. */\
775000 0x0B /* SW1 output voltage 0.775V. */\
800000 0x0C /* SW1 output voltage 0.800V. */\
825000 0x0D /* SW1 output voltage 0.825V. */\
850000 0x0E /* SW1 output voltage 0.850V. */\
875000 0x0F /* SW1 output voltage 0.875V. */\
900000 0x10 /* SW1 output voltage 0.900V. */\
925000 0x11 /* SW1 output voltage 0.925V. */\
950000 0x12 /* SW1 output voltage 0.950V. */\
975000 0x13 /* SW1 output voltage 0.975V. */\
1000000 0x14 /* SW1 output voltage 1.000V. (Default) */\
1025000 0x15 /* SW1 output voltage 1.025V. */\
1050000 0x16 /* SW1 output voltage 1.050V. */\
1075000 0x17 /* SW1 output voltage 1.075V. */\
1100000 0x18 /* SW1 output voltage 1.100V. */\
1125000 0x19 /* SW1 output voltage 1.125V. */\
1150000 0x1A /* SW1 output voltage 1.150V. */\
1175000 0x1B /* SW1 output voltage 1.175V. */\
1200000 0x1C /* SW1 output voltage 1.200V. */\
1225000 0x1D /* SW1 output voltage 1.225V. */\
1250000 0x1E /* SW1 output voltage 1.250V. */\
1275000 0x1F /* SW1 output voltage 1.275V. */\
1300000 0x20 /* SW1 output voltage 1.300V. */\
1325000 0x21 /* SW1 output voltage 1.325V. */\
1350000 0x22 /* SW1 output voltage 1.350V. */\
1375000 0x23 /* SW1 output voltage 1.375V. */\
1400000 0x24 /* SW1 output voltage 1.400V. */\
1425000 0x25 /* SW1 output voltage 1.425V. */\
1450000 0x26 /* SW1 output voltage 1.450V. */\
1475000 0x27 /* SW1 output voltage 1.475V. */\
1500000 0x28 /* SW1 output voltage 1.500V. */\
1800000 0x3F /* SW1 output voltage 1.800V. */\
#define PCA9420_SW2_VOLTAGE_RANGE \
1500000 0x00 /* SW2 output voltage 1.500V. */\
1525000 0x01 /* SW2 output voltage 1.525V. */\
1550000 0x02 /* SW2 output voltage 1.550V. */\
1575000 0x03 /* SW2 output voltage 1.575V. */\
1600000 0x04 /* SW2 output voltage 1.600V. */\
1625000 0x05 /* SW2 output voltage 1.625V. */\
1650000 0x06 /* SW2 output voltage 1.650V. */\
1675000 0x07 /* SW2 output voltage 1.675V. */\
1700000 0x08 /* SW2 output voltage 1.700V. */\
1725000 0x09 /* SW2 output voltage 1.725V. */\
1750000 0x0A /* SW2 output voltage 1.750V. */\
1775000 0x0B /* SW2 output voltage 1.775V. */\
1800000 0x0C /* SW2 output voltage 1.800V. (Default) */\
1825000 0x0D /* SW2 output voltage 1.825V. */\
1850000 0x0E /* SW2 output voltage 1.850V. */\
1875000 0x0F /* SW2 output voltage 1.875V. */\
1900000 0x10 /* SW2 output voltage 1.900V. */\
1925000 0x11 /* SW2 output voltage 1.925V. */\
1950000 0x12 /* SW2 output voltage 1.950V. */\
1975000 0x13 /* SW2 output voltage 1.975V. */\
2000000 0x14 /* SW2 output voltage 2.000V. */\
2025000 0x15 /* SW2 output voltage 2.025V. */\
2050000 0x16 /* SW2 output voltage 2.050V. */\
2075000 0x17 /* SW2 output voltage 2.075V. */\
2100000 0x18 /* SW2 output voltage 2.100V. */\
2700000 0x20 /* SW2 output voltage 2.700V. */\
2725000 0x21 /* SW2 output voltage 2.725V. */\
2750000 0x22 /* SW2 output voltage 2.750V. */\
2775000 0x23 /* SW2 output voltage 2.775V. */\
2800000 0x24 /* SW2 output voltage 2.800V. */\
2825000 0x25 /* SW2 output voltage 2.825V. */\
2850000 0x26 /* SW2 output voltage 2.850V. */\
2875000 0x27 /* SW2 output voltage 2.875V. */\
2900000 0x28 /* SW2 output voltage 2.900V. */\
2925000 0x29 /* SW2 output voltage 2.925V. */\
2950000 0x2A /* SW2 output voltage 2.950V. */\
2975000 0x2B /* SW2 output voltage 2.975V. */\
3000000 0x2C /* SW2 output voltage 3.000V. */\
3025000 0x2D /* SW2 output voltage 3.025V. */\
3050000 0x2E /* SW2 output voltage 3.050V. */\
3075000 0x2F /* SW2 output voltage 3.075V. */\
3100000 0x30 /* SW2 output voltage 3.100V. */\
3125000 0x31 /* SW2 output voltage 3.125V. */\
3150000 0x32 /* SW2 output voltage 3.150V. */\
3175000 0x33 /* SW2 output voltage 3.175V. */\
3200000 0x34 /* SW2 output voltage 3.200V. */\
3225000 0x35 /* SW2 output voltage 3.225V. */\
3250000 0x36 /* SW2 output voltage 3.250V. */\
3275000 0x37 /* SW2 output voltage 3.275V. */\
3300000 0x38 /* SW2 output voltage 3.300V. */\
#define PCA9420_LDO1_VOLTAGE_RANGE \
1700000 0x00 /* LDO1 output voltage 1.700V. */\
1725000 0x10 /* LDO1 output voltage 1.725V. */\
1750000 0x20 /* LDO1 output voltage 1.750V. */\
1775000 0x30 /* LDO1 output voltage 1.775V. */\
1800000 0x40 /* LDO1 output voltage 1.800V. (Default) */\
1825000 0x50 /* LDO1 output voltage 1.825V. */\
1850000 0x60 /* LDO1 output voltage 1.850V. */\
1875000 0x70 /* LDO1 output voltage 1.875V. */\
1900000 0x80 /* LDO1 output voltage 1.900V. */\
#define PCA9420_LDO2_VOLTAGE_RANGE \
1500000 0x00 /* LDO2 output voltage 1.500V. */\
1525000 0x01 /* LDO2 output voltage 1.525V. */\
1550000 0x02 /* LDO2 output voltage 1.550V. */\
1575000 0x03 /* LDO2 output voltage 1.575V. */\
1600000 0x04 /* LDO2 output voltage 1.600V. */\
1625000 0x05 /* LDO2 output voltage 1.625V. */\
1650000 0x06 /* LDO2 output voltage 1.650V. */\
1675000 0x07 /* LDO2 output voltage 1.675V. */\
1700000 0x08 /* LDO2 output voltage 1.700V. */\
1725000 0x09 /* LDO2 output voltage 1.725V. */\
1750000 0x0A /* LDO2 output voltage 1.750V. */\
1775000 0x0B /* LDO2 output voltage 1.775V. */\
1800000 0x0C /* LDO2 output voltage 1.800V. */\
1825000 0x0D /* LDO2 output voltage 1.825V. */\
1850000 0x0E /* LDO2 output voltage 1.850V. */\
1875000 0x0F /* LDO2 output voltage 1.875V. */\
1900000 0x10 /* LDO2 output voltage 1.900V. */\
1925000 0x11 /* LDO2 output voltage 1.925V. */\
1950000 0x12 /* LDO2 output voltage 1.950V. */\
1975000 0x13 /* LDO2 output voltage 1.975V. */\
2000000 0x14 /* LDO2 output voltage 2.000V. */\
2025000 0x15 /* LDO2 output voltage 2.025V. */\
2050000 0x16 /* LDO2 output voltage 2.050V. */\
2075000 0x17 /* LDO2 output voltage 2.075V. */\
2100000 0x18 /* LDO2 output voltage 2.100V. */\
2700000 0x20 /* LDO2 output voltage 2.700V. */\
2725000 0x21 /* LDO2 output voltage 2.725V. */\
2750000 0x22 /* LDO2 output voltage 2.750V. */\
2775000 0x23 /* LDO2 output voltage 2.775V. */\
2800000 0x24 /* LDO2 output voltage 2.800V. */\
2825000 0x25 /* LDO2 output voltage 2.825V. */\
2850000 0x26 /* LDO2 output voltage 2.850V. */\
2875000 0x27 /* LDO2 output voltage 2.875V. */\
2900000 0x28 /* LDO2 output voltage 2.900V. */\
2925000 0x29 /* LDO2 output voltage 2.925V. */\
2950000 0x2A /* LDO2 output voltage 2.950V. */\
2975000 0x2B /* LDO2 output voltage 2.975V. */\
3000000 0x2C /* LDO2 output voltage 3.000V. */\
3025000 0x2D /* LDO2 output voltage 3.025V. */\
3050000 0x2E /* LDO2 output voltage 3.050V. */\
3075000 0x2F /* LDO2 output voltage 3.075V. */\
3100000 0x30 /* LDO2 output voltage 3.100V. */\
3125000 0x31 /* LDO2 output voltage 3.125V. */\
3150000 0x32 /* LDO2 output voltage 3.150V. */\
3175000 0x33 /* LDO2 output voltage 3.175V. */\
3200000 0x34 /* LDO2 output voltage 3.200V. */\
3225000 0x35 /* LDO2 output voltage 3.225V. */\
3250000 0x36 /* LDO2 output voltage 3.250V. */\
3275000 0x37 /* LDO2 output voltage 3.275V. */\
3300000 0x38 /* LDO2 output voltage 3.300V. */\
3300000 0x39 /* LDO2 output voltage 3.300V. (Default) */\
#define PCA9420_CURRENT_LIMIT_LEVELS \
85000 0x00 /* min: 74mA, typ: 85mA, max: 98mA */\
225000 0x20 /* min: 222mA, typ: 225mA, max: 293mA */\