From ea08eeccae9297f7aabd2ef7f0c2517ac4549acc Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Tue, 20 Feb 2024 01:18:26 +0000
Subject: [PATCH] write in 30M
---
kernel/drivers/regulator/xz3216.c | 178 ++++++++++++----------------------------------------------
1 files changed, 38 insertions(+), 140 deletions(-)
diff --git a/kernel/drivers/regulator/xz3216.c b/kernel/drivers/regulator/xz3216.c
index e3edd10..5418255 100644
--- a/kernel/drivers/regulator/xz3216.c
+++ b/kernel/drivers/regulator/xz3216.c
@@ -66,19 +66,15 @@
struct i2c_client *i2c;
int num_regulators;
struct regulator_dev *rdev;
- struct regulator_desc desc;
struct regulator_init_data *regulator;
struct regmap *regmap;
/* Voltage setting register */
unsigned int vol_reg;
unsigned int sleep_reg;
- unsigned int en_reg;
- unsigned int sleep_en_reg;
/* Voltage range and step(linear) */
unsigned int vsel_min;
unsigned int vsel_step;
unsigned int sleep_vol_cache;
- unsigned int sleep_vsel_id;
};
struct xz3216_regulator {
@@ -90,14 +86,7 @@
struct xz3216_board {
struct regulator_init_data *xz3216_init_data;
struct device_node *of_node;
- unsigned int sleep_vsel_id;
};
-
-static unsigned int xz3216_map_mode(unsigned int mode)
-{
- return mode == REGULATOR_MODE_FAST ?
- REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
-}
static unsigned int xz3216_dcdc_get_mode(struct regulator_dev *dev)
{
@@ -131,51 +120,19 @@
}
}
-static int xz3216_dcdc_is_enable(struct regulator_dev *dev)
-{
- struct xz3216 *xz3216 = rdev_get_drvdata(dev);
- int ret = 0;
- unsigned int val;
-
- ret = regmap_read(xz3216->regmap, xz3216->en_reg, &val);
- if (ret < 0)
- return ret;
- if (val & VSEL_BUCK_EN)
- return 1;
- else
- return 0;
-}
-
-static int xz3216_dcdc_enable(struct regulator_dev *dev)
-{
- struct xz3216 *xz3216 = rdev_get_drvdata(dev);
-
- return regmap_update_bits(xz3216->regmap, xz3216->en_reg,
- VSEL_BUCK_EN, VSEL_BUCK_EN);
-}
-
-static int xz3216_dcdc_disable(struct regulator_dev *dev)
-{
- struct xz3216 *xz3216 = rdev_get_drvdata(dev);
-
- return regmap_update_bits(xz3216->regmap, xz3216->en_reg,
- VSEL_BUCK_EN, 0);
-}
-
static int xz3216_dcdc_suspend_enable(struct regulator_dev *dev)
{
struct xz3216 *xz3216 = rdev_get_drvdata(dev);
-
- return regmap_update_bits(xz3216->regmap, xz3216->sleep_en_reg,
- VSEL_BUCK_EN, VSEL_BUCK_EN);
+ return regmap_update_bits(xz3216->regmap, XZ3216_BUCK1_SLP_VOL_BASE,
+ VSEL_BUCK_EN, VSEL_BUCK_EN);
}
static int xz3216_dcdc_suspend_disable(struct regulator_dev *dev)
{
struct xz3216 *xz3216 = rdev_get_drvdata(dev);
+ return regmap_update_bits(xz3216->regmap, XZ3216_BUCK1_SLP_VOL_BASE,
+ VSEL_BUCK_EN, 0);
- return regmap_update_bits(xz3216->regmap, xz3216->sleep_en_reg,
- VSEL_BUCK_EN, 0);
}
static int xz3216_dcdc_set_sleep_voltage(struct regulator_dev *dev,
@@ -189,13 +146,13 @@
ret = regulator_map_voltage_linear(dev, uV, uV);
if (ret < 0)
return ret;
- ret = regmap_update_bits(xz3216->regmap, xz3216->sleep_reg,
+ ret = regmap_update_bits(xz3216->regmap, XZ3216_BUCK1_SLP_VOL_BASE,
VSEL_NSEL_MASK, ret);
if (ret < 0)
return ret;
xz3216->sleep_vol_cache = uV;
-
return 0;
+
}
static int xz3216_dcdc_set_suspend_mode(struct regulator_dev *dev,
@@ -205,29 +162,15 @@
switch (mode) {
case REGULATOR_MODE_FAST:
- return regmap_update_bits(xz3216->regmap, xz3216->sleep_reg,
- VSEL_MODE, VSEL_MODE);
+ return regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
+ VSEL_MODE, VSEL_MODE);
case REGULATOR_MODE_NORMAL:
- return regmap_update_bits(xz3216->regmap, xz3216->sleep_reg,
- VSEL_MODE, 0);
+ return regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
+ VSEL_MODE, 0);
default:
DBG_ERR("error:dcdc_xz3216 only auto and pwm mode\n");
return -EINVAL;
}
-}
-
-static int xz3216_resume(struct regulator_dev *rdev)
-{
- int ret;
-
- if (!rdev->constraints->state_mem.changeable)
- return 0;
-
- ret = xz3216_dcdc_suspend_enable(rdev);
- if (ret)
- return ret;
-
- return regulator_suspend_enable(rdev, PM_SUSPEND_MEM);
}
static const int slew_rates[] = {
@@ -266,9 +209,9 @@
.get_voltage_sel = regulator_get_voltage_sel_regmap,
.list_voltage = regulator_list_voltage_linear,
.map_voltage = regulator_map_voltage_linear,
- .is_enabled = xz3216_dcdc_is_enable,
- .enable = xz3216_dcdc_enable,
- .disable = xz3216_dcdc_disable,
+ .is_enabled = regulator_is_enabled_regmap,
+ .enable = regulator_enable_regmap,
+ .disable = regulator_disable_regmap,
.get_mode = xz3216_dcdc_get_mode,
.set_mode = xz3216_dcdc_set_mode,
.set_suspend_voltage = xz3216_dcdc_set_sleep_voltage,
@@ -277,47 +220,26 @@
.set_suspend_mode = xz3216_dcdc_set_suspend_mode,
.set_ramp_delay = xz3216_set_ramp,
.set_voltage_time_sel = regulator_set_voltage_time_sel,
- .resume = xz3216_resume,
};
-static int xz3216_regulator_register(struct xz3216 *xz3216, struct regulator_config *config)
-{
- struct regulator_desc *rdesc = &xz3216->desc;
-
- rdesc->name = "XZ_DCDC1";
- rdesc->supply_name = "vin";
- rdesc->id = 0;
- rdesc->ops = &xz3216_dcdc_ops;
- rdesc->type = REGULATOR_VOLTAGE;
- rdesc->n_voltages = 64;
- rdesc->enable_mask = VSEL_BUCK_EN;
- rdesc->min_uV = 600000;
- rdesc->uV_step = 12500;
- rdesc->vsel_mask = VSEL_NSEL_MASK;
- rdesc->owner = THIS_MODULE;
- rdesc->enable_time = 400;
-
- if (xz3216->sleep_vsel_id) {
- rdesc->vsel_reg = XZ3216_BUCK1_SET_VOL_BASE;
- rdesc->enable_reg = XZ3216_BUCK1_SET_VOL_BASE;
-
- xz3216->vol_reg = rdesc->vsel_reg;
- xz3216->en_reg = rdesc->vsel_reg;
- xz3216->sleep_reg = XZ3216_BUCK1_SLP_VOL_BASE;
- xz3216->sleep_en_reg = xz3216->sleep_reg;
- } else {
- rdesc->vsel_reg = XZ3216_BUCK1_SLP_VOL_BASE;
- rdesc->enable_reg = XZ3216_BUCK1_SLP_VOL_BASE;
-
- xz3216->vol_reg = rdesc->vsel_reg;
- xz3216->en_reg = rdesc->vsel_reg;
- xz3216->sleep_reg = XZ3216_BUCK1_SET_VOL_BASE;
- xz3216->sleep_en_reg = xz3216->sleep_reg;
- }
- xz3216->rdev = devm_regulator_register(xz3216->dev, &xz3216->desc, config);
-
- return PTR_ERR_OR_ZERO(xz3216->rdev);
-}
+static struct regulator_desc regulators[] = {
+ {
+ .name = "XZ_DCDC1",
+ .supply_name = "vin",
+ .id = 0,
+ .ops = &xz3216_dcdc_ops,
+ .n_voltages = 64,
+ .type = REGULATOR_VOLTAGE,
+ .enable_time = 400,
+ .enable_reg = XZ3216_BUCK1_SET_VOL_BASE,
+ .enable_mask = VSEL_BUCK_EN,
+ .min_uV = 600000,
+ .uV_step = 12500,
+ .vsel_reg = XZ3216_BUCK1_SET_VOL_BASE,
+ .vsel_mask = VSEL_NSEL_MASK,
+ .owner = THIS_MODULE,
+ },
+};
static const struct regmap_config xz3216_regmap_config = {
.reg_bits = 8,
@@ -343,49 +265,26 @@
struct device_node *regs;
struct device_node *xz3216_np;
int count;
- u32 tmp;
-
- pdata = devm_kzalloc(xz3216->dev, sizeof(*pdata), GFP_KERNEL);
- if (!pdata)
- return NULL;
xz3216_np = of_node_get(xz3216->dev->of_node);
if (!xz3216_np) {
DBG_ERR("could not find pmic sub-node\n");
return NULL;
}
-
- regs = of_find_node_by_name(xz3216_np, "regulator");
- if (!regs) {
- DBG_ERR("can not found regulator node\n");
- return NULL;
- }
- count = of_property_read_u32(regs, "fcs,suspend-voltage-selector",
- &tmp);
- if (!count) {
- pdata->sleep_vsel_id = tmp;
- pr_info("xz3216, suspend-voltage-selector = %d\n", pdata->sleep_vsel_id);
- } else {
- pdata->sleep_vsel_id = 0;
- pr_info("xz3216, get suspend-voltage-selector failed, use default value\n");
- }
- of_node_put(regs);
-
regs = of_find_node_by_name(xz3216_np, "regulators");
if (!regs)
return NULL;
-
- xz3216_reg_matches[0].desc = &xz3216->desc;
count = of_regulator_match(xz3216->dev, regs, xz3216_reg_matches,
XZ3216_NUM_REGULATORS);
of_node_put(regs);
- if (!count)
+ pdata = devm_kzalloc(xz3216->dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
return NULL;
pdata->xz3216_init_data = xz3216_reg_matches[0].init_data;
pdata->of_node = xz3216_reg_matches[0].of_node;
-
return pdata;
}
+
#else
static struct xz3216_board *xz3216_parse_dt(struct i2c_client *i2c)
{
@@ -401,7 +300,7 @@
const struct of_device_id *match;
struct regulator_config config = { };
int ret;
-
+ DBG("%s, line=%d\n", __func__, __LINE__);
xz3216 = devm_kzalloc(&i2c->dev, sizeof(struct xz3216),
GFP_KERNEL);
if (!xz3216) {
@@ -417,7 +316,6 @@
}
}
- xz3216->desc.of_map_mode = xz3216_map_mode;
xz3216->regmap = devm_regmap_init_i2c(i2c, &xz3216_regmap_config);
if (IS_ERR(xz3216->regmap)) {
dev_err(&i2c->dev, "Failed to allocate regmap!\n");
@@ -431,7 +329,6 @@
if (!pdev)
pdev = xz3216_parse_dt(xz3216);
if (pdev) {
- xz3216->sleep_vsel_id = pdev->sleep_vsel_id;
xz3216->num_regulators = XZ3216_NUM_REGULATORS;
xz3216->rdev = kcalloc(XZ3216_NUM_REGULATORS,
sizeof(struct regulator_dev),
@@ -445,8 +342,9 @@
config.dev = xz3216->dev;
config.driver_data = xz3216;
config.init_data = xz3216->regulator;
- config.regmap = xz3216->regmap;
- ret = xz3216_regulator_register(xz3216, &config);
+ xz3216->rdev = devm_regulator_register(xz3216->dev,
+ ®ulators[0], &config);
+ ret = PTR_ERR_OR_ZERO(xz3216->rdev);
if (ret < 0)
dev_err(&i2c->dev, "Failed to register regulator!\n");
return ret;
--
Gitblit v1.6.2