drivers: regulator: pca9420: use standard I2C API
The I2C API already provides APIs to read/modify registers, so there is no need to provide custom wrappers. Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
This commit is contained in:
parent
47518d47a2
commit
8fb0f3e3f1
1 changed files with 23 additions and 71 deletions
|
@ -11,12 +11,9 @@
|
|||
#include <zephyr/drivers/i2c.h>
|
||||
#include <zephyr/drivers/regulator.h>
|
||||
#include <zephyr/dt-bindings/regulator/pca9420.h>
|
||||
#include <zephyr/logging/log.h>
|
||||
#include <zephyr/sys/linear_range.h>
|
||||
#include <zephyr/sys/util.h>
|
||||
|
||||
LOG_MODULE_REGISTER(pca9420, CONFIG_REGULATOR_LOG_LEVEL);
|
||||
|
||||
/** Register memory map. See datasheet for more details. */
|
||||
/** General purpose registers */
|
||||
/** @brief Top level system ctrl 0 */
|
||||
|
@ -184,43 +181,6 @@ static int regulator_pca9420_is_supported_voltage(const struct device *dev,
|
|||
int32_t min_uv,
|
||||
int32_t max_uv);
|
||||
|
||||
/**
|
||||
* Reads a register from the PMIC
|
||||
* Returns 0 on success, or errno on error
|
||||
*/
|
||||
static int regulator_pca9420_read_register(const struct i2c_dt_spec *i2c,
|
||||
uint8_t reg, uint8_t *out)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = i2c_reg_read_byte_dt(i2c, reg, out);
|
||||
LOG_DBG("READ 0x%x: 0x%x", reg, *out);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifies a register within the PMIC
|
||||
* Returns 0 on success, or errno on error
|
||||
*/
|
||||
static int regulator_pca9420_modify_register(const struct i2c_dt_spec *i2c,
|
||||
uint8_t reg, uint8_t reg_mask,
|
||||
uint8_t reg_val)
|
||||
{
|
||||
uint8_t reg_current;
|
||||
int rc;
|
||||
|
||||
rc = regulator_pca9420_read_register(i2c, reg, ®_current);
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
reg_current &= ~reg_mask;
|
||||
reg_current |= (reg_val & reg_mask);
|
||||
LOG_DBG("WRITE 0x%02X to 0x%02X at I2C addr 0x%02X", reg_current,
|
||||
reg, i2c->addr);
|
||||
return i2c_reg_write_byte_dt(i2c, reg, reg_current);
|
||||
}
|
||||
|
||||
/*
|
||||
* Internal helper function- gets the voltage from a regulator, with an
|
||||
* offset applied to the vsel_reg. Useful to support reading voltages
|
||||
|
@ -235,9 +195,8 @@ static int regulator_pca9420_get_voltage_offset(const struct device *dev,
|
|||
int ret;
|
||||
uint8_t raw_reg;
|
||||
|
||||
ret = regulator_pca9420_read_register(&cconfig->i2c,
|
||||
config->desc->vsel_reg + off,
|
||||
&raw_reg);
|
||||
ret = i2c_reg_read_byte_dt(&cconfig->i2c, config->desc->vsel_reg + off,
|
||||
&raw_reg);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -272,10 +231,9 @@ static int regulator_set_voltage_offset(const struct device *dev,
|
|||
|
||||
idx <<= config->desc->vsel_pos;
|
||||
|
||||
return regulator_pca9420_modify_register(&cconfig->i2c,
|
||||
config->desc->vsel_reg + off,
|
||||
config->desc->vsel_mask,
|
||||
(uint8_t)idx);
|
||||
return i2c_reg_update_byte_dt(&cconfig->i2c,
|
||||
config->desc->vsel_reg + off,
|
||||
config->desc->vsel_mask, (uint8_t)idx);
|
||||
}
|
||||
|
||||
|
||||
|
@ -439,9 +397,9 @@ static int regulator_pca9420_mode_disable(const struct device *dev,
|
|||
}
|
||||
sel_off = ((mode & PCA9420_MODE_OFFSET_MASK) >> PCA9420_MODE_OFFSET_SHIFT);
|
||||
dis_val = config->enable_inverted ? config->desc->enable_val : 0;
|
||||
return regulator_pca9420_modify_register(
|
||||
&cconfig->i2c, config->desc->enable_reg + sel_off,
|
||||
config->desc->enable_mask, dis_val);
|
||||
return i2c_reg_update_byte_dt(&cconfig->i2c,
|
||||
config->desc->enable_reg + sel_off,
|
||||
config->desc->enable_mask, dis_val);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -472,9 +430,9 @@ static int regulator_pca9420_mode_enable(const struct device *dev,
|
|||
}
|
||||
sel_off = ((mode & PCA9420_MODE_OFFSET_MASK) >> PCA9420_MODE_OFFSET_SHIFT);
|
||||
en_val = config->enable_inverted ? 0 : config->desc->enable_val;
|
||||
return regulator_pca9420_modify_register(
|
||||
&cconfig->i2c, config->desc->enable_reg + sel_off,
|
||||
config->desc->enable_mask, en_val);
|
||||
return i2c_reg_update_byte_dt(&cconfig->i2c,
|
||||
config->desc->enable_reg + sel_off,
|
||||
config->desc->enable_mask, en_val);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -543,17 +501,15 @@ static int regulator_pca9420_set_mode(const struct device *dev, uint32_t mode)
|
|||
/* Configure mode */
|
||||
if (mode & PCA9420_MODE_FLAG_MODESEL_MULTI_REG) {
|
||||
/* Select mode with offset calculation */
|
||||
rc = regulator_pca9420_modify_register(
|
||||
&cconfig->i2c,
|
||||
cconfig->modesel_reg + sel_off,
|
||||
mode & PCA9420_MODE_SELECTOR_MASK,
|
||||
cconfig->modesel_mask);
|
||||
rc = i2c_reg_update_byte_dt(&cconfig->i2c,
|
||||
cconfig->modesel_reg + sel_off,
|
||||
mode & PCA9420_MODE_SELECTOR_MASK,
|
||||
cconfig->modesel_mask);
|
||||
} else {
|
||||
/* Select mode without offset to modesel_reg */
|
||||
rc = regulator_pca9420_modify_register(
|
||||
&cconfig->i2c, cconfig->modesel_reg,
|
||||
mode & PCA9420_MODE_SELECTOR_MASK,
|
||||
cconfig->modesel_mask);
|
||||
rc = i2c_reg_update_byte_dt(&cconfig->i2c, cconfig->modesel_reg,
|
||||
mode & PCA9420_MODE_SELECTOR_MASK,
|
||||
cconfig->modesel_mask);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
@ -565,10 +521,8 @@ static int regulator_pca9420_enable(const struct device *dev)
|
|||
uint8_t en_val;
|
||||
|
||||
en_val = config->enable_inverted ? 0 : config->desc->enable_val;
|
||||
return regulator_pca9420_modify_register(&cconfig->i2c,
|
||||
config->desc->enable_reg,
|
||||
config->desc->enable_mask,
|
||||
en_val);
|
||||
return i2c_reg_update_byte_dt(&cconfig->i2c, config->desc->enable_reg,
|
||||
config->desc->enable_mask, en_val);
|
||||
}
|
||||
|
||||
static int regulator_pca9420_disable(const struct device *dev)
|
||||
|
@ -578,10 +532,8 @@ static int regulator_pca9420_disable(const struct device *dev)
|
|||
uint8_t dis_val;
|
||||
|
||||
dis_val = config->enable_inverted ? config->desc->enable_val : 0;
|
||||
return regulator_pca9420_modify_register(&cconfig->i2c,
|
||||
config->desc->enable_reg,
|
||||
config->desc->enable_mask,
|
||||
dis_val);
|
||||
return i2c_reg_update_byte_dt(&cconfig->i2c, config->desc->enable_reg,
|
||||
config->desc->enable_mask, dis_val);
|
||||
}
|
||||
|
||||
static int regulator_pca9420_init(const struct device *dev)
|
||||
|
@ -620,7 +572,7 @@ static int regulator_pca9420_common_init(const struct device *dev)
|
|||
PCA9420_VIN_ILIM_UA_LSB;
|
||||
}
|
||||
|
||||
return regulator_pca9420_modify_register(
|
||||
return i2c_reg_update_byte_dt(
|
||||
&config->i2c, PCA9420_TOP_CNTL0,
|
||||
PCA9420_TOP_CNTL0_VIN_ILIM_SEL_MASK,
|
||||
reg_val << PCA9420_TOP_CNTL0_VIN_ILIM_SEL_POS);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue