From f70575805708cabdedea7498aaa3f710fde4d920 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 31 Jan 2024 03:29:01 +0000
Subject: [PATCH] add lvds1024*800

---
 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,
+						&regulators[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