Explorar o código

disp: msm: set voltage to min before disable

This change sets the regulator voltage to zero for all
those regulators which support voltage scaling before
disabling the regulator. Failing to do so causes the regulator
vote to set to the last min value specified in the previous
set voltage call.
Additionally modified the config regulator api and renamed to
get regulator because of the above change.

Change-Id: Ie4c4842db0c08a4d98926ed79503cf84e4d5762a
Signed-off-by: Abhijit Kulkarni <[email protected]>
Abhijit Kulkarni %!s(int64=5) %!d(string=hai) anos
pai
achega
96e8b6819c
Modificáronse 5 ficheiros con 32 adicións e 55 borrados
  1. 3 3
      include/linux/sde_io_util.h
  2. 3 3
      msm/dp/dp_power.c
  3. 7 6
      msm/dsi/dsi_pwr.c
  4. 15 39
      msm/sde_io_util.c
  5. 4 4
      msm/sde_power_handle.c

+ 3 - 3
include/linux/sde_io_util.h

@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2012, 2017-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012, 2017-2020, The Linux Foundation. All rights reserved.
  */
 
 #ifndef __SDE_IO_UTIL_H__
@@ -89,8 +89,8 @@ void msm_dss_iounmap(struct dss_io_data *io_data);
 int msm_dss_enable_gpio(struct dss_gpio *in_gpio, int num_gpio, int enable);
 int msm_dss_gpio_enable(struct dss_gpio *in_gpio, int num_gpio, int enable);
 
-int msm_dss_config_vreg(struct device *dev, struct dss_vreg *in_vreg,
-	int num_vreg, int config);
+int msm_dss_get_vreg(struct device *dev, struct dss_vreg *in_vreg,
+	int num_vreg, int enable);
 int msm_dss_enable_vreg(struct dss_vreg *in_vreg, int num_vreg,	int enable);
 
 int msm_dss_get_clk(struct device *dev, struct dss_clk *clk_arry, int num_clk);

+ 3 - 3
msm/dp/dp_power.c

@@ -39,14 +39,14 @@ static int dp_power_regulator_init(struct dp_power_private *power)
 	pdev = power->pdev;
 
 	for (i = DP_CORE_PM; !rc && (i < DP_MAX_PM); i++) {
-		rc = msm_dss_config_vreg(&pdev->dev,
+		rc = msm_dss_get_vreg(&pdev->dev,
 			parser->mp[i].vreg_config,
 			parser->mp[i].num_vreg, 1);
 		if (rc) {
 			DP_ERR("failed to init vregs for %s\n",
 				dp_parser_pm_name(i));
 			for (j = i - 1; j >= DP_CORE_PM; j--) {
-				msm_dss_config_vreg(&pdev->dev,
+				msm_dss_get_vreg(&pdev->dev,
 				parser->mp[j].vreg_config,
 				parser->mp[j].num_vreg, 0);
 			}
@@ -68,7 +68,7 @@ static void dp_power_regulator_deinit(struct dp_power_private *power)
 	pdev = power->pdev;
 
 	for (i = DP_CORE_PM; (i < DP_MAX_PM); i++) {
-		rc = msm_dss_config_vreg(&pdev->dev,
+		rc = msm_dss_get_vreg(&pdev->dev,
 			parser->mp[i].vreg_config,
 			parser->mp[i].num_vreg, 0);
 		if (rc)

+ 7 - 6
msm/dsi/dsi_pwr.c

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/of.h>
@@ -179,15 +179,16 @@ static int dsi_pwr_enable_vregs(struct dsi_regulator_info *regs, bool enable)
 				usleep_range((pre_off_ms * 1000),
 						(pre_off_ms * 1000) + 10);
 
-			if (regs->vregs[i].off_min_voltage)
-				(void)regulator_set_voltage(regs->vregs[i].vreg,
-						regs->vregs[i].off_min_voltage,
-						regs->vregs[i].max_voltage);
-
 			(void)regulator_set_load(regs->vregs[i].vreg,
 						regs->vregs[i].disable_load);
 			(void)regulator_disable(regs->vregs[i].vreg);
 
+			num_of_v = regulator_count_voltages(vreg->vreg);
+			if (num_of_v > 0)
+				(void)regulator_set_voltage(regs->vregs[i].vreg,
+						regs->vregs[i].off_min_voltage,
+						regs->vregs[i].max_voltage);
+
 			if (post_off_ms)
 				usleep_range((post_off_ms * 1000),
 						(post_off_ms * 1000) + 10);

+ 15 - 39
msm/sde_io_util.c

@@ -129,17 +129,16 @@ void msm_dss_iounmap(struct dss_io_data *io_data)
 } /* msm_dss_iounmap */
 EXPORT_SYMBOL(msm_dss_iounmap);
 
-int msm_dss_config_vreg(struct device *dev, struct dss_vreg *in_vreg,
-	int num_vreg, int config)
+int msm_dss_get_vreg(struct device *dev, struct dss_vreg *in_vreg,
+	int num_vreg, int enable)
 {
 	int i = 0, rc = 0;
 	struct dss_vreg *curr_vreg = NULL;
-	enum dss_vreg_type type;
 
 	if (!in_vreg || !num_vreg)
 		return rc;
 
-	if (config) {
+	if (enable) {
 		for (i = 0; i < num_vreg; i++) {
 			curr_vreg = &in_vreg[i];
 			curr_vreg->vreg = regulator_get(dev,
@@ -152,33 +151,11 @@ int msm_dss_config_vreg(struct device *dev, struct dss_vreg *in_vreg,
 				curr_vreg->vreg = NULL;
 				goto vreg_get_fail;
 			}
-			type = (regulator_count_voltages(curr_vreg->vreg) > 0)
-					? DSS_REG_LDO : DSS_REG_VS;
-			if (type == DSS_REG_LDO) {
-				rc = regulator_set_voltage(
-					curr_vreg->vreg,
-					curr_vreg->min_voltage,
-					curr_vreg->max_voltage);
-				if (rc < 0) {
-					DEV_ERR("%pS->%s: %s set vltg fail\n",
-						__builtin_return_address(0),
-						__func__,
-						curr_vreg->vreg_name);
-					goto vreg_set_voltage_fail;
-				}
-			}
 		}
 	} else {
 		for (i = num_vreg-1; i >= 0; i--) {
 			curr_vreg = &in_vreg[i];
 			if (curr_vreg->vreg) {
-				type = (regulator_count_voltages(
-					curr_vreg->vreg) > 0)
-					? DSS_REG_LDO : DSS_REG_VS;
-				if (type == DSS_REG_LDO) {
-					regulator_set_voltage(curr_vreg->vreg,
-						0, curr_vreg->max_voltage);
-				}
 				regulator_put(curr_vreg->vreg);
 				curr_vreg->vreg = NULL;
 			}
@@ -186,24 +163,16 @@ int msm_dss_config_vreg(struct device *dev, struct dss_vreg *in_vreg,
 	}
 	return 0;
 
-vreg_unconfig:
-if (type == DSS_REG_LDO)
-	regulator_set_load(curr_vreg->vreg, 0);
-
-vreg_set_voltage_fail:
-	regulator_put(curr_vreg->vreg);
-	curr_vreg->vreg = NULL;
-
 vreg_get_fail:
 	for (i--; i >= 0; i--) {
 		curr_vreg = &in_vreg[i];
-		type = (regulator_count_voltages(curr_vreg->vreg) > 0)
-			? DSS_REG_LDO : DSS_REG_VS;
-		goto vreg_unconfig;
+		regulator_set_load(curr_vreg->vreg, 0);
+		regulator_put(curr_vreg->vreg);
+		curr_vreg->vreg = NULL;
 	}
 	return rc;
-} /* msm_dss_config_vreg */
-EXPORT_SYMBOL(msm_dss_config_vreg);
+} /* msm_dss_get_vreg */
+EXPORT_SYMBOL(msm_dss_get_vreg);
 
 static bool msm_dss_is_hw_controlled(struct dss_vreg in_vreg)
 {
@@ -255,6 +224,10 @@ int msm_dss_enable_vreg(struct dss_vreg *in_vreg, int num_vreg, int enable)
 					in_vreg[i].vreg_name);
 				goto vreg_set_opt_mode_fail;
 			}
+			if (regulator_count_voltages(in_vreg[i].vreg) > 0)
+				regulator_set_voltage(in_vreg[i].vreg,
+						in_vreg[i].min_voltage,
+						in_vreg[i].max_voltage);
 			rc = regulator_enable(in_vreg[i].vreg);
 			if (in_vreg[i].post_on_sleep && need_sleep)
 				usleep_range(in_vreg[i].post_on_sleep * 1000,
@@ -277,6 +250,9 @@ int msm_dss_enable_vreg(struct dss_vreg *in_vreg, int num_vreg, int enable)
 			regulator_set_load(in_vreg[i].vreg,
 				in_vreg[i].disable_load);
 			regulator_disable(in_vreg[i].vreg);
+			if (regulator_count_voltages(in_vreg[i].vreg) > 0)
+				regulator_set_voltage(in_vreg[i].vreg, 0,
+						in_vreg[i].max_voltage);
 			if (in_vreg[i].post_off_sleep)
 				usleep_range(in_vreg[i].post_off_sleep * 1000,
 				(in_vreg[i].post_off_sleep * 1000) + 10);

+ 4 - 4
msm/sde_power_handle.c

@@ -574,10 +574,10 @@ int sde_power_resource_init(struct platform_device *pdev,
 		goto parse_vreg_err;
 	}
 
-	rc = msm_dss_config_vreg(&pdev->dev,
+	rc = msm_dss_get_vreg(&pdev->dev,
 				mp->vreg_config, mp->num_vreg, 1);
 	if (rc) {
-		pr_err("vreg config failed rc=%d\n", rc);
+		pr_err("get config failed rc=%d\n", rc);
 		goto vreg_err;
 	}
 
@@ -613,7 +613,7 @@ bus_err:
 clkset_err:
 	msm_dss_put_clk(mp->clk_config, mp->num_clk);
 clkget_err:
-	msm_dss_config_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg, 0);
+	msm_dss_get_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg, 0);
 vreg_err:
 	if (mp->vreg_config)
 		devm_kfree(&pdev->dev, mp->vreg_config);
@@ -653,7 +653,7 @@ void sde_power_resource_deinit(struct platform_device *pdev,
 
 	msm_dss_put_clk(mp->clk_config, mp->num_clk);
 
-	msm_dss_config_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg, 0);
+	msm_dss_get_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg, 0);
 
 	if (mp->clk_config)
 		devm_kfree(&pdev->dev, mp->clk_config);