Merge "disp: msm: set voltage to min before disable"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
7116441b24
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* 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__
|
#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_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_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 msm_dss_get_vreg(struct device *dev, struct dss_vreg *in_vreg,
|
||||||
int num_vreg, int config);
|
int num_vreg, int enable);
|
||||||
int msm_dss_enable_vreg(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);
|
int msm_dss_get_clk(struct device *dev, struct dss_clk *clk_arry, int num_clk);
|
||||||
|
@@ -39,14 +39,14 @@ static int dp_power_regulator_init(struct dp_power_private *power)
|
|||||||
pdev = power->pdev;
|
pdev = power->pdev;
|
||||||
|
|
||||||
for (i = DP_CORE_PM; !rc && (i < DP_MAX_PM); i++) {
|
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].vreg_config,
|
||||||
parser->mp[i].num_vreg, 1);
|
parser->mp[i].num_vreg, 1);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
DP_ERR("failed to init vregs for %s\n",
|
DP_ERR("failed to init vregs for %s\n",
|
||||||
dp_parser_pm_name(i));
|
dp_parser_pm_name(i));
|
||||||
for (j = i - 1; j >= DP_CORE_PM; j--) {
|
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].vreg_config,
|
||||||
parser->mp[j].num_vreg, 0);
|
parser->mp[j].num_vreg, 0);
|
||||||
}
|
}
|
||||||
@@ -68,7 +68,7 @@ static void dp_power_regulator_deinit(struct dp_power_private *power)
|
|||||||
pdev = power->pdev;
|
pdev = power->pdev;
|
||||||
|
|
||||||
for (i = DP_CORE_PM; (i < DP_MAX_PM); i++) {
|
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].vreg_config,
|
||||||
parser->mp[i].num_vreg, 0);
|
parser->mp[i].num_vreg, 0);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// 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>
|
#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),
|
usleep_range((pre_off_ms * 1000),
|
||||||
(pre_off_ms * 1000) + 10);
|
(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,
|
(void)regulator_set_load(regs->vregs[i].vreg,
|
||||||
regs->vregs[i].disable_load);
|
regs->vregs[i].disable_load);
|
||||||
(void)regulator_disable(regs->vregs[i].vreg);
|
(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)
|
if (post_off_ms)
|
||||||
usleep_range((post_off_ms * 1000),
|
usleep_range((post_off_ms * 1000),
|
||||||
(post_off_ms * 1000) + 10);
|
(post_off_ms * 1000) + 10);
|
||||||
|
@@ -129,17 +129,16 @@ void msm_dss_iounmap(struct dss_io_data *io_data)
|
|||||||
} /* msm_dss_iounmap */
|
} /* msm_dss_iounmap */
|
||||||
EXPORT_SYMBOL(msm_dss_iounmap);
|
EXPORT_SYMBOL(msm_dss_iounmap);
|
||||||
|
|
||||||
int msm_dss_config_vreg(struct device *dev, struct dss_vreg *in_vreg,
|
int msm_dss_get_vreg(struct device *dev, struct dss_vreg *in_vreg,
|
||||||
int num_vreg, int config)
|
int num_vreg, int enable)
|
||||||
{
|
{
|
||||||
int i = 0, rc = 0;
|
int i = 0, rc = 0;
|
||||||
struct dss_vreg *curr_vreg = NULL;
|
struct dss_vreg *curr_vreg = NULL;
|
||||||
enum dss_vreg_type type;
|
|
||||||
|
|
||||||
if (!in_vreg || !num_vreg)
|
if (!in_vreg || !num_vreg)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if (config) {
|
if (enable) {
|
||||||
for (i = 0; i < num_vreg; i++) {
|
for (i = 0; i < num_vreg; i++) {
|
||||||
curr_vreg = &in_vreg[i];
|
curr_vreg = &in_vreg[i];
|
||||||
curr_vreg->vreg = regulator_get(dev,
|
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;
|
curr_vreg->vreg = NULL;
|
||||||
goto vreg_get_fail;
|
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 {
|
} else {
|
||||||
for (i = num_vreg-1; i >= 0; i--) {
|
for (i = num_vreg-1; i >= 0; i--) {
|
||||||
curr_vreg = &in_vreg[i];
|
curr_vreg = &in_vreg[i];
|
||||||
if (curr_vreg->vreg) {
|
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);
|
regulator_put(curr_vreg->vreg);
|
||||||
curr_vreg->vreg = NULL;
|
curr_vreg->vreg = NULL;
|
||||||
}
|
}
|
||||||
@@ -186,24 +163,16 @@ int msm_dss_config_vreg(struct device *dev, struct dss_vreg *in_vreg,
|
|||||||
}
|
}
|
||||||
return 0;
|
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:
|
vreg_get_fail:
|
||||||
for (i--; i >= 0; i--) {
|
for (i--; i >= 0; i--) {
|
||||||
curr_vreg = &in_vreg[i];
|
curr_vreg = &in_vreg[i];
|
||||||
type = (regulator_count_voltages(curr_vreg->vreg) > 0)
|
regulator_set_load(curr_vreg->vreg, 0);
|
||||||
? DSS_REG_LDO : DSS_REG_VS;
|
regulator_put(curr_vreg->vreg);
|
||||||
goto vreg_unconfig;
|
curr_vreg->vreg = NULL;
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
} /* msm_dss_config_vreg */
|
} /* msm_dss_get_vreg */
|
||||||
EXPORT_SYMBOL(msm_dss_config_vreg);
|
EXPORT_SYMBOL(msm_dss_get_vreg);
|
||||||
|
|
||||||
static bool msm_dss_is_hw_controlled(struct dss_vreg in_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);
|
in_vreg[i].vreg_name);
|
||||||
goto vreg_set_opt_mode_fail;
|
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);
|
rc = regulator_enable(in_vreg[i].vreg);
|
||||||
if (in_vreg[i].post_on_sleep && need_sleep)
|
if (in_vreg[i].post_on_sleep && need_sleep)
|
||||||
usleep_range(in_vreg[i].post_on_sleep * 1000,
|
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,
|
regulator_set_load(in_vreg[i].vreg,
|
||||||
in_vreg[i].disable_load);
|
in_vreg[i].disable_load);
|
||||||
regulator_disable(in_vreg[i].vreg);
|
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)
|
if (in_vreg[i].post_off_sleep)
|
||||||
usleep_range(in_vreg[i].post_off_sleep * 1000,
|
usleep_range(in_vreg[i].post_off_sleep * 1000,
|
||||||
(in_vreg[i].post_off_sleep * 1000) + 10);
|
(in_vreg[i].post_off_sleep * 1000) + 10);
|
||||||
|
@@ -574,10 +574,10 @@ int sde_power_resource_init(struct platform_device *pdev,
|
|||||||
goto parse_vreg_err;
|
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);
|
mp->vreg_config, mp->num_vreg, 1);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
pr_err("vreg config failed rc=%d\n", rc);
|
pr_err("get config failed rc=%d\n", rc);
|
||||||
goto vreg_err;
|
goto vreg_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -613,7 +613,7 @@ bus_err:
|
|||||||
clkset_err:
|
clkset_err:
|
||||||
msm_dss_put_clk(mp->clk_config, mp->num_clk);
|
msm_dss_put_clk(mp->clk_config, mp->num_clk);
|
||||||
clkget_err:
|
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:
|
vreg_err:
|
||||||
if (mp->vreg_config)
|
if (mp->vreg_config)
|
||||||
devm_kfree(&pdev->dev, 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_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)
|
if (mp->clk_config)
|
||||||
devm_kfree(&pdev->dev, mp->clk_config);
|
devm_kfree(&pdev->dev, mp->clk_config);
|
||||||
|
Reference in New Issue
Block a user