From 6cb849faac0c7a88b74da3c37c599c17e6a7cc8a Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Wed, 23 Mar 2022 09:51:50 +0800 Subject: [PATCH] regulator: pwm-regulator: set init voltage before pwm enable Signed-off-by: Elaine Zhang Change-Id: I37c35eb97dd1e205a4966792acb4df2bb2bf69f1 --- drivers/regulator/pwm-regulator.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c index 38b6e83dbac6..340ebd61e919 100644 --- a/drivers/regulator/pwm-regulator.c +++ b/drivers/regulator/pwm-regulator.c @@ -47,6 +47,9 @@ struct pwm_regulator_data { /* Enable GPIO */ struct gpio_desc *enb_gpio; + + /* Init voltage */ + int init_uv; }; struct pwm_voltages { @@ -54,7 +57,11 @@ struct pwm_voltages { unsigned int dutycycle; }; -/** +static int pwm_regulator_set_voltage(struct regulator_dev *rdev, + int req_min_uV, int req_max_uV, + unsigned int *selector); + +/* * Voltage table call-backs */ static void pwm_regulator_init_state(struct regulator_dev *rdev) @@ -122,6 +129,10 @@ static int pwm_regulator_enable(struct regulator_dev *dev) { struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev); + if (drvdata->init_uv && !pwm_get_duty_cycle(drvdata->pwm)) + pwm_regulator_set_voltage(dev, drvdata->init_uv, + drvdata->init_uv, NULL); + gpiod_set_value_cansleep(drvdata->enb_gpio, 1); return pwm_enable(drvdata->pwm); @@ -332,6 +343,7 @@ static int pwm_regulator_probe(struct platform_device *pdev) struct device_node *np = pdev->dev.of_node; enum gpiod_flags gpio_flags; int ret; + u32 init_uv; if (!np) { dev_err(&pdev->dev, "Device Tree node missing\n"); @@ -351,6 +363,9 @@ static int pwm_regulator_probe(struct platform_device *pdev) if (ret) return ret; + if (!of_property_read_u32(np, "regulator-init-microvolt", &init_uv)) + drvdata->init_uv = init_uv; + init_data = of_get_regulator_init_data(&pdev->dev, np, &drvdata->desc); if (!init_data)