diff options
| author | Sandeep Panda <spanda@codeaurora.org> | 2016-01-22 14:10:03 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:17:46 -0700 |
| commit | ca37cab98f68743c47bf12fd113eda482f8b663a (patch) | |
| tree | 379bebca25967ffae763404cd73cbddae035a41f | |
| parent | 0542dc68325c5fe7920d9721e5beeb6d5bb270c0 (diff) | |
msm: mdss: adv: handle adv regulator configuration properly
In the current implementation adv regulator get is called
from DBA driver but regulator enable or disable is never getting
called. So because of this there is power leakage in the
HDMI path. This change fixes the issue by properly configuring
the adv regulator in DBA driver.
CRs-fixed: 965732
Change-Id: If73d48fc1b34811e8b7ec4fbce91f43b5bb9285d
Signed-off-by: Sandeep Panda <spanda@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/msm_dba/adv7533.c | 123 |
1 files changed, 83 insertions, 40 deletions
diff --git a/drivers/video/fbdev/msm/msm_dba/adv7533.c b/drivers/video/fbdev/msm/msm_dba/adv7533.c index 591a69cae1b8..e27f3b97471a 100644 --- a/drivers/video/fbdev/msm/msm_dba/adv7533.c +++ b/drivers/video/fbdev/msm/msm_dba/adv7533.c @@ -1415,6 +1415,86 @@ static void adv7533_video_setup(struct adv7533 *pdata, adv7533_write(pdata, I2C_ADDR_CEC_DSI, 0x37, ((vbp & 0xF) << 4)); } +static int adv7533_config_vreg(struct adv7533 *pdata, int enable) +{ + int rc = 0; + struct dss_module_power *power_data = NULL; + + if (!pdata) { + pr_err("invalid input\n"); + rc = -EINVAL; + goto exit; + } + + power_data = &pdata->power_data; + if (!power_data || !power_data->num_vreg) { + pr_warn("%s: Error: invalid power data\n", __func__); + return 0; + } + + if (enable) { + rc = msm_dss_config_vreg(&pdata->i2c_client->dev, + power_data->vreg_config, + power_data->num_vreg, 1); + if (rc) { + pr_err("%s: Failed to config vreg. Err=%d\n", + __func__, rc); + goto exit; + } + } else { + rc = msm_dss_config_vreg(&pdata->i2c_client->dev, + power_data->vreg_config, + power_data->num_vreg, 0); + if (rc) { + pr_err("%s: Failed to deconfig vreg. Err=%d\n", + __func__, rc); + goto exit; + } + } +exit: + return rc; + +} + +static int adv7533_enable_vreg(struct adv7533 *pdata, int enable) +{ + int rc = 0; + struct dss_module_power *power_data = NULL; + + if (!pdata) { + pr_err("invalid input\n"); + rc = -EINVAL; + goto exit; + } + + power_data = &pdata->power_data; + if (!power_data || !power_data->num_vreg) { + pr_warn("%s: Error: invalid power data\n", __func__); + return 0; + } + + if (enable) { + rc = msm_dss_enable_vreg(power_data->vreg_config, + power_data->num_vreg, 1); + if (rc) { + pr_err("%s: Failed to enable vreg. Err=%d\n", + __func__, rc); + goto exit; + } + } else { + rc = msm_dss_enable_vreg(power_data->vreg_config, + power_data->num_vreg, 0); + if (rc) { + pr_err("%s: Failed to disable vreg. Err=%d\n", + __func__, rc); + goto exit; + } + } +exit: + return rc; + +} + static int adv7533_video_on(void *client, bool on, struct msm_dba_video_cfg *cfg, u32 flags) { @@ -1825,46 +1905,6 @@ static void adv7533_unregister_dba(struct adv7533 *pdata) msm_dba_remove_probed_device(&pdata->dev_info); } -static int adv7533_config_vreg(struct adv7533 *pdata, int enable) -{ - int rc = 0; - struct dss_module_power *power_data = NULL; - - if (!pdata) { - pr_err("invalid input\n"); - rc = -EINVAL; - goto exit; - } - - power_data = &pdata->power_data; - if (!power_data || !power_data->num_vreg) { - pr_warn("%s: Error: invalid power data\n", __func__); - return 0; - } - - if (enable) { - rc = msm_dss_config_vreg(&pdata->i2c_client->dev, - power_data->vreg_config, - power_data->num_vreg, 1); - if (rc) { - pr_err("%s: Failed to config vreg. Err=%d\n", - __func__, rc); - goto exit; - } - } else { - rc = msm_dss_config_vreg(&pdata->i2c_client->dev, - power_data->vreg_config, - power_data->num_vreg, 0); - if (rc) { - pr_err("%s: Failed to config vreg. Err=%d\n", - __func__, rc); - goto exit; - } - } -exit: - return rc; - -} static int adv7533_probe(struct i2c_client *client, const struct i2c_device_id *id) @@ -1895,6 +1935,7 @@ static int adv7533_probe(struct i2c_client *client, pr_err("%s: Failed to config vreg\n", __func__); return -EPROBE_DEFER; } + adv7533_enable_vreg(pdata, 1); mutex_init(&pdata->ops_mutex); @@ -1982,6 +2023,7 @@ err_gpio_cfg: adv7533_unregister_dba(pdata); err_dba_reg: err_i2c_prog: + adv7533_enable_vreg(pdata, 0); adv7533_config_vreg(pdata, 0); err_dt_parse: devm_kfree(&client->dev, pdata); @@ -2009,6 +2051,7 @@ static int adv7533_remove(struct i2c_client *client) disable_irq(pdata->irq); free_irq(pdata->irq, pdata); + adv7533_config_vreg(pdata, 0); ret = adv7533_gpio_configure(pdata, false); mutex_destroy(&pdata->ops_mutex); |
