display: Modify LDO driver initialization voltage compatibility

1. During startup, judge whether to register the LDO driver
   for the first time. If it is the first time, it is not
   necessary to disable all LDOS;

2. When different pmics are used, different initialization
   voltages are used for initialization;

Change-Id: Ic22e2c05fb9edcb48f93f51add369cb71997741f
Signed-off-by: huaqin79 <huaqin79@motorola.com>
Reviewed-on: https://gerrit.mot.com/2138715
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Hua Tan <tanhua1@motorola.com>
Reviewed-by: Xiangpo Zhao <zhaoxp3@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
huaqin79 authored and Gilberto Gambugge committed 2023-06-01 00:48:50 -03:00
1 parent ee4fd45d57
commit 58d8c425e8
2 files changed
+69 -37

No files matched your search

+68 -37
View File
@@ -20,7 +20,17 @@
#include <linux/regulator/machine.h>
#include <linux/regulator/of_regulator.h>
#include "wl2868c-regulator.h"
static int ldo_chipid = -1;
static int first_init_flag = 0;
static int ldo_driver_id = 0;
enum ldo_device_id {
WL2868C_ID = 0,
FAN53870_ID,
ET5907_ID,
};
enum slg51000_regulators {
WL2868C_REGULATOR_LDO1 = 0,
WL2868C_REGULATOR_LDO2,
@@ -96,19 +106,19 @@ static int wl2868c_get_error_flags(struct regulator_dev *rdev, unsigned int *fla
uint8_t reg_idx;
unsigned int val = 0;
printk("************ start dump wl2868c register ************\n");
printk("register 0x00: chip version\n");
printk("register 0x01: LDO CL\n");
printk("register 0x03~0x09: LDO1~LDO7 OUT Voltage\n");
printk("register 0x0e: Bit[6:0] LDO7~LDO1 EN\n");
dev_err(chip->dev, "************ start dump wl2868c register ************\n");
dev_err(chip->dev, "register 0x00: chip version\n");
dev_err(chip->dev, "register 0x01: LDO CL\n");
dev_err(chip->dev, "register 0x03~0x09: LDO1~LDO7 OUT Voltage\n");
dev_err(chip->dev, "register 0x0e: Bit[6:0] LDO7~LDO1 EN\n");
for (reg_idx = 0; reg_idx < WL2868C_REG_NUM; reg_idx++) {
regmap_read(chip->regmap, reg_idx, &val);
reg_dump[reg_idx] = val;
printk("Reg[0x%02x] = 0x%x", reg_idx, reg_dump[reg_idx]);
printk("Reg[0x%02x] = 0x%x", reg_idx, reg_dump[reg_idx]);
dev_err(chip->dev, "Reg[0x%02x] = 0x%x", reg_idx, reg_dump[reg_idx]);
}
printk("************ end dump wl2868c register ************\n");
dev_err(chip->dev, "************ end dump wl2868c register ************\n");
if (flags != NULL) {
*flags = 0;
}
@@ -124,8 +134,7 @@ static int wl2868c_get_status(struct regulator_dev *rdev)
ret = regulator_is_enabled_regmap(rdev);
if (ret < 0) {
printk("Failed to read enable register(%d)\n", ret);
dev_err(chip->dev, "Failed to read enable register(%d)\n", ret);
return ret;
}
@@ -139,7 +148,7 @@ static int wl2868c_get_status(struct regulator_dev *rdev)
}
ret = regmap_read(chip->regmap, wl2868c_status_reg, &status);
if (ret < 0) {
printk("Failed to read status register(%d)\n", ret);
dev_err(chip->dev, "Failed to read status register(%d)\n", ret);
return ret;
}
@@ -225,29 +234,47 @@ static int wl2868c_regulator_init(struct wl2868c *chip)
WL2868C_LDO7_VOUT,
};
unsigned int initial_voltage[WL2868C_MAX_REGULATORS] = {
0x24,//LDO1 1.05V
unsigned int initial_voltage[LDO_DEVICE_MAX][WL2868C_MAX_REGULATORS] = {
{0x24,//LDO1 1.05V
0x5D,//LDO2 1.24V
0x80,//LDO3 2.8V
0x80,//LDO4 2.8V
0x80,//LDO5 2.8V
0xA2,//LDO6 2.8V
0xA2,//LDO6 3.0V
0x30,//LDO7 1.8V
},//wl2868c init voltage
{0x24,//LDO1 1.05V
0x9A,//LDO2 1.24V
0x80,//LDO3 2.8V
0x80,//LDO4 2.8V
0x80,//LDO5 2.8V
0xB2,//LDO6 3.0V
0x30,//LDO7 1.8V
},//fan53870 init voltage
{0x24,//LDO1 1.05V
0x6A,//LDO2 1.24V
0x80,//LDO3 2.8V
0x80,//LDO4 2.8V
0x80,//LDO5 2.8V
0xA0,//LDO6 3.0V
0x30,//LDO7 1.8V
},//et5907 init voltage
};
/*Disable all ldo output by default*/
if (ldo_chipid == 0x33)
{
ret = regmap_write(chip->regmap, WL2868C_LDO_EN, 0x80);
}
else if((ldo_chipid == 0x01) ||(ldo_chipid == 0x00))
{
ret = regmap_write(chip->regmap, fan53870_LDO_EN, 0);
}
if (first_init_flag == 1) {
if (ldo_chipid == 0x33)
{
ret = regmap_write(chip->regmap, WL2868C_LDO_EN, 0x80);
}
else if((ldo_chipid == 0x01) ||(ldo_chipid == 0x00))
{
ret = regmap_write(chip->regmap, fan53870_LDO_EN, 0);
}
if (ret < 0) {
printk("Disable all LDO output failed!!!\n");
return ret;
if (ret < 0) {
dev_err(chip->dev, "Disable all LDO output failed!!!\n");
return ret;
}
}
//ET5907 chipid is 0x00,Fan53870 chipid is 0x01.for change min_uV and step by chip
@@ -303,23 +330,23 @@ static int wl2868c_regulator_init(struct wl2868c *chip)
ret = regmap_bulk_read(chip->regmap, ldo_regs[id], vsel_range, 1);
pr_err("wl2868c_regulator_init: LDO%d, ldo_regs=0x%x default value:0x%x", (id+1),ldo_regs[id],vsel_range[0]);
if (ret < 0) {
printk("Failed to read the ldo register\n");
dev_err(chip->dev, "Failed to read the ldo register\n");
return ret;
}
pr_err("wl2868c_regulator_init: enable_reg0x%x, enable_mask:0x%x", wl2868c_regls_desc[id].enable_reg, wl2868c_regls_desc[id].enable_mask);
ret = regmap_write(chip->regmap, ldo_regs[id], initial_voltage[id]);
ret = regmap_write(chip->regmap, ldo_regs[id], initial_voltage[ldo_driver_id][id]);
if (ret < 0) {
printk("Failed to write inital voltage register\n");
dev_err(chip->dev, "Failed to write inital voltage register\n");
return ret;
}
pr_err("wl2868c_regulator_init: LDO%d, initial value:0x%x", (id+1), initial_voltage[id]);
pr_err("wl2868c_regulator_init: ldo_driver_id=%d LDO%d, initial value:0x%x", ldo_driver_id, (id+1), initial_voltage[ldo_driver_id][id]);
chip->rdev[id] = devm_regulator_register(chip->dev, rdesc, &config);
if (IS_ERR(chip->rdev[id])) {
ret = PTR_ERR(chip->rdev[id]);
printk("Failed to register regulator(%s):%d\n", chip->rdesc[id]->name, ret);
dev_err(chip->dev, "Failed to register regulator(%s):%d\n", chip->rdesc[id]->name, ret);
return ret;
}
}
@@ -334,7 +361,7 @@ static int wl2868c_i2c_probe(struct i2c_client *client, const struct i2c_device_
int error, cs_gpio, ret;
chip = devm_kzalloc(dev, sizeof(struct wl2868c), GFP_KERNEL);
if (!chip) {
printk("wl2868c_i2c_probe Memory error...\n");
dev_err(chip->dev, "wl2868c_i2c_probe Memory error...\n");
return -ENOMEM;
}
@@ -343,13 +370,13 @@ static int wl2868c_i2c_probe(struct i2c_client *client, const struct i2c_device_
cs_gpio = of_get_named_gpio(dev->of_node, "semi,cs-gpios", 0);
if (cs_gpio > 0) {
if (!gpio_is_valid(cs_gpio)) {
printk("Invalid chip select pin\n");
dev_err(dev, "Invalid chip select pin\n");
return -EPERM;
}
ret = devm_gpio_request_one(dev, cs_gpio, GPIOF_OUT_INIT_HIGH, "wl2868c_cs_pin");
if (ret) {
printk("GPIO(%d) request failed(%d)\n", cs_gpio, ret);
dev_err(dev, "GPIO(%d) request failed(%d)\n", cs_gpio, ret);
return ret;
}
@@ -377,7 +404,7 @@ static int wl2868c_i2c_probe(struct i2c_client *client, const struct i2c_device_
regmap_read(chip->regmap, WL2868C_CHIP_REV, &ldo_chipid);
if (IS_ERR(chip->regmap)) {
error = PTR_ERR(chip->regmap);
printk("Failed to allocate register map: %d\n",
dev_err(dev, "Failed to allocate register map: %d\n",
error);
return error;
}
@@ -386,19 +413,22 @@ static int wl2868c_i2c_probe(struct i2c_client *client, const struct i2c_device_
ret = regmap_read(chip->regmap, WL2868C_CHIP_REV, &ldo_chipid);
if (0x33 == ldo_chipid)
{
ldo_driver_id = WL2868C_ID;
dev_info(chip->dev, "wl2868c chipid=:0x%x\n", ldo_chipid);
}
else if (0x01 == ldo_chipid)
{
ldo_driver_id = FAN53870_ID;
dev_info(chip->dev, "fan53870 chipid=:0x%x\n", ldo_chipid);
}
else if (0x00 == ldo_chipid)
{
ldo_driver_id = ET5907_ID;
dev_info(chip->dev, "et5907 chipid=:0x%x\n", ldo_chipid);
}
else
{
printk("ldo read chipid error...chipid=:0x%x\n",ldo_chipid);
dev_err(chip->dev, "ldo read chipid error...chipid=:0x%x\n",ldo_chipid);
return -ENOMEM;
}
@@ -411,10 +441,11 @@ static int wl2868c_i2c_probe(struct i2c_client *client, const struct i2c_device_
ret = wl2868c_regulator_init(chip);
if (ret < 0) {
printk("Failed to init regulator(%d)\n", ret);
dev_err(chip->dev, "Failed to init regulator(%d)\n", ret);
return ret;
}
dev_info(chip->dev, "wl2868c_i2c_probe Exit...\n");
first_init_flag = 1;
return ret;
}
@@ -59,4 +59,5 @@
#define WL2868C_VSEL_SHIFT 0
#define WL2868C_VSEL_MASK (0xff << 0)
#define LDO_DEVICE_MAX 3
#endif /* __WL2868C_REGISTERS_H__ */