drivers: regulator: remove mode awareness from PMIC
Remove mode awareness from PMIC voltage setting, current setting, and enable/disable functions. Concepts such as regulator consumers do not work well with multiple modes, so support for changing voltages or disabling regulators in each mode has been removed. Signed-off-by: Daniel DeGrasse <daniel.degrasse@nxp.com>
This commit is contained in:
parent
d354179a68
commit
92c40db91f
2 changed files with 5 additions and 32 deletions
|
@ -39,7 +39,6 @@ struct regulator_data {
|
||||||
struct onoff_sync_service srv;
|
struct onoff_sync_service srv;
|
||||||
const struct voltage_range *voltages;
|
const struct voltage_range *voltages;
|
||||||
const struct current_range *current_levels;
|
const struct current_range *current_levels;
|
||||||
uint8_t reg_offset;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct regulator_config {
|
struct regulator_config {
|
||||||
|
@ -74,11 +73,8 @@ static int regulator_read_register(const struct device *dev,
|
||||||
uint8_t reg, uint8_t *out)
|
uint8_t reg, uint8_t *out)
|
||||||
{
|
{
|
||||||
const struct regulator_config *conf = dev->config;
|
const struct regulator_config *conf = dev->config;
|
||||||
struct regulator_data *data = dev->data;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Apply mode offset to register */
|
|
||||||
reg += data->reg_offset;
|
|
||||||
ret = i2c_reg_read_byte_dt(&conf->i2c, reg, out);
|
ret = i2c_reg_read_byte_dt(&conf->i2c, reg, out);
|
||||||
LOG_DBG("READ 0x%x: 0x%x", reg, *out);
|
LOG_DBG("READ 0x%x: 0x%x", reg, *out);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -92,7 +88,6 @@ static int regulator_modify_register(const struct device *dev,
|
||||||
uint8_t reg, uint8_t reg_mask, uint8_t reg_val)
|
uint8_t reg, uint8_t reg_mask, uint8_t reg_val)
|
||||||
{
|
{
|
||||||
const struct regulator_config *conf = dev->config;
|
const struct regulator_config *conf = dev->config;
|
||||||
struct regulator_data *data = dev->data;
|
|
||||||
uint8_t reg_current;
|
uint8_t reg_current;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
@ -101,8 +96,6 @@ static int regulator_modify_register(const struct device *dev,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Apply mode offset to register */
|
|
||||||
reg += data->reg_offset;
|
|
||||||
reg_current &= ~reg_mask;
|
reg_current &= ~reg_mask;
|
||||||
reg_current |= (reg_val & reg_mask);
|
reg_current |= (reg_val & reg_mask);
|
||||||
LOG_DBG("WRITE 0x%02X to 0x%02X at I2C addr 0x%02X", reg_current,
|
LOG_DBG("WRITE 0x%02X to 0x%02X at I2C addr 0x%02X", reg_current,
|
||||||
|
@ -281,14 +274,11 @@ int regulator_get_current_limit(const struct device *dev)
|
||||||
/*
|
/*
|
||||||
* Part of the extended regulator consumer API
|
* Part of the extended regulator consumer API
|
||||||
* switches the regulator to a given mode. This API will apply a mode for
|
* switches the regulator to a given mode. This API will apply a mode for
|
||||||
* the regulator, and also configure the remainder of the regulator APIs,
|
* the regulator.
|
||||||
* such as those disabling, changing voltage/current targets, or querying
|
|
||||||
* voltage/current targets to target that mode.
|
|
||||||
*/
|
*/
|
||||||
int regulator_set_mode(const struct device *dev, uint32_t mode)
|
int regulator_set_mode(const struct device *dev, uint32_t mode)
|
||||||
{
|
{
|
||||||
const struct regulator_config *config = dev->config;
|
const struct regulator_config *config = dev->config;
|
||||||
struct regulator_data *data = dev->data;
|
|
||||||
int rc;
|
int rc;
|
||||||
uint8_t i, sel_off;
|
uint8_t i, sel_off;
|
||||||
|
|
||||||
|
@ -310,26 +300,13 @@ int regulator_set_mode(const struct device *dev, uint32_t mode)
|
||||||
/* Configure mode */
|
/* Configure mode */
|
||||||
if (mode & PMIC_MODE_FLAG_MODESEL_MULTI_REG) {
|
if (mode & PMIC_MODE_FLAG_MODESEL_MULTI_REG) {
|
||||||
/* Select mode with offset calculation */
|
/* Select mode with offset calculation */
|
||||||
/* Set reg_offset here so it takes effect for the write
|
rc = regulator_modify_register(dev,
|
||||||
* to modesel_reg
|
config->modesel_reg + sel_off,
|
||||||
*/
|
|
||||||
data->reg_offset = sel_off;
|
|
||||||
rc = regulator_modify_register(dev, config->modesel_reg,
|
|
||||||
mode & PMIC_MODE_SELECTOR_MASK, config->modesel_mask);
|
mode & PMIC_MODE_SELECTOR_MASK, config->modesel_mask);
|
||||||
} else {
|
} else {
|
||||||
/* Select mode without offset to modesel_reg */
|
/* Select mode without offset to modesel_reg */
|
||||||
/* Clear register offset */
|
|
||||||
data->reg_offset = 0;
|
|
||||||
rc = regulator_modify_register(dev, config->modesel_reg,
|
rc = regulator_modify_register(dev, config->modesel_reg,
|
||||||
mode & PMIC_MODE_SELECTOR_MASK, config->modesel_mask);
|
mode & PMIC_MODE_SELECTOR_MASK, config->modesel_mask);
|
||||||
if (rc) {
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
/* Since we did not use a register offset when selecting the
|
|
||||||
* mode, but we now are targeting a specific mode's bank
|
|
||||||
* of registers, we must still set the register offset here
|
|
||||||
*/
|
|
||||||
data->reg_offset = sel_off;
|
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -421,9 +398,7 @@ static const struct regulator_driver_api api = {
|
||||||
DT_PROP(node, voltage_range); \
|
DT_PROP(node, voltage_range); \
|
||||||
static uint16_t pmic_reg_##ord##_allowed_modes[] = \
|
static uint16_t pmic_reg_##ord##_allowed_modes[] = \
|
||||||
DT_PROP_OR(DT_PARENT(node), regulator_allowed_modes, {}); \
|
DT_PROP_OR(DT_PARENT(node), regulator_allowed_modes, {}); \
|
||||||
static struct regulator_data pmic_reg_##ord##_data = { \
|
static struct regulator_data pmic_reg_##ord##_data; \
|
||||||
.reg_offset = 0, \
|
|
||||||
}; \
|
|
||||||
static struct regulator_config pmic_reg_##ord##_cfg = { \
|
static struct regulator_config pmic_reg_##ord##_cfg = { \
|
||||||
.vsel_mask = DT_PROP(node, vsel_mask), \
|
.vsel_mask = DT_PROP(node, vsel_mask), \
|
||||||
.vsel_reg = DT_PROP(node, vsel_reg), \
|
.vsel_reg = DT_PROP(node, vsel_reg), \
|
||||||
|
|
|
@ -106,9 +106,7 @@ int regulator_get_current_limit(const struct device *dev);
|
||||||
* @brief Select mode of regulator
|
* @brief Select mode of regulator
|
||||||
* Regulators can support multiple modes in order to permit different voltage
|
* Regulators can support multiple modes in order to permit different voltage
|
||||||
* configuration or better power savings. This API will apply a mode for
|
* configuration or better power savings. This API will apply a mode for
|
||||||
* the regulator, and also configure the remainder of the regulator APIs,
|
* the regulator.
|
||||||
* such as those disabling, changing voltage/current targets, or querying
|
|
||||||
* voltage/current targets to target that mode.
|
|
||||||
* @param dev: regulator to switch mode for
|
* @param dev: regulator to switch mode for
|
||||||
* @param mode: Mode to select for this regulator. Only modes present
|
* @param mode: Mode to select for this regulator. Only modes present
|
||||||
* in the regulator-allowed-modes property are permitted.
|
* in the regulator-allowed-modes property are permitted.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue