msm: mdss: control avdd enable gpio when doing panel reset
Avdd enable gpio maybe used for AMOLED panel to control avdd output. This gpio should be enabled/disabled when panel does unblank/blank once to avoid panel electric leakage. Change-Id: I18f0f6491f0ff97df5556e74a686a18b262708df Signed-off-by: Yahui Wang <yahuiw@codeaurora.org>
This commit is contained in:
parent
c5685ec0f3
commit
41f27c5716
4 changed files with 49 additions and 1 deletions
|
@ -105,7 +105,9 @@ Optional properties:
|
|||
- qcom,platform-reset-gpio: Specifies the panel reset gpio.
|
||||
- qcom,platform-te-gpio: Specifies the gpio used for TE.
|
||||
- qcom,platform-bklight-en-gpio: Specifies the gpio used to enable display back-light
|
||||
- qcom,platform-bklight-en-gpio-invert: Invert the gpio used to enable display back-light
|
||||
- qcom,platform-bklight-en-gpio-invert: Boolean to invert the gpio used to enable display back-light
|
||||
- qcom,platform-avdd-en-gpio: Specifies the gpio used to enable AMOLED AVDD
|
||||
- qcom,platform-avdd-en-gpio-invert: Boolean to invert the gpio used to enable AMOLED AVDD
|
||||
- qcom,panel-mode-gpio: Specifies the GPIO to select video/command/single-port/dual-port
|
||||
mode of panel through gpio when it supports these modes.
|
||||
- pinctrl-names: List of names to assign mdss pin states defined in pinctrl device node
|
||||
|
|
|
@ -4267,6 +4267,15 @@ static int mdss_dsi_parse_gpio_params(struct platform_device *ctrl_pdev,
|
|||
of_property_read_bool(ctrl_pdev->dev.of_node,
|
||||
"qcom,platform-bklight-en-gpio-invert");
|
||||
|
||||
ctrl_pdata->avdd_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
|
||||
"qcom,platform-avdd-en-gpio", 0);
|
||||
if (!gpio_is_valid(ctrl_pdata->avdd_en_gpio))
|
||||
pr_info("%s: avdd_en gpio not specified\n", __func__);
|
||||
|
||||
ctrl_pdata->avdd_en_gpio_invert =
|
||||
of_property_read_bool(ctrl_pdev->dev.of_node,
|
||||
"qcom,platform-avdd-en-gpio-invert");
|
||||
|
||||
ctrl_pdata->rst_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
|
||||
"qcom,platform-reset-gpio", 0);
|
||||
if (!gpio_is_valid(ctrl_pdata->rst_gpio))
|
||||
|
|
|
@ -455,6 +455,8 @@ struct mdss_dsi_ctrl_pdata {
|
|||
int bklt_en_gpio;
|
||||
bool bklt_en_gpio_invert;
|
||||
bool bklt_en_gpio_state;
|
||||
int avdd_en_gpio;
|
||||
bool avdd_en_gpio_invert;
|
||||
int lcd_mode_sel_gpio;
|
||||
int bklt_ctrl; /* backlight ctrl */
|
||||
bool pwm_pmi;
|
||||
|
|
|
@ -260,6 +260,15 @@ static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
|
|||
rc);
|
||||
goto rst_gpio_err;
|
||||
}
|
||||
if (gpio_is_valid(ctrl_pdata->avdd_en_gpio)) {
|
||||
rc = gpio_request(ctrl_pdata->avdd_en_gpio,
|
||||
"avdd_enable");
|
||||
if (rc) {
|
||||
pr_err("request avdd_en gpio failed, rc=%d\n",
|
||||
rc);
|
||||
goto avdd_en_gpio_err;
|
||||
}
|
||||
}
|
||||
if (gpio_is_valid(ctrl_pdata->lcd_mode_sel_gpio)) {
|
||||
rc = gpio_request(ctrl_pdata->lcd_mode_sel_gpio, "mode_sel");
|
||||
if (rc) {
|
||||
|
@ -272,6 +281,9 @@ static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
|
|||
return rc;
|
||||
|
||||
lcd_mode_sel_gpio_err:
|
||||
if (gpio_is_valid(ctrl_pdata->avdd_en_gpio))
|
||||
gpio_free(ctrl_pdata->avdd_en_gpio);
|
||||
avdd_en_gpio_err:
|
||||
gpio_free(ctrl_pdata->rst_gpio);
|
||||
rst_gpio_err:
|
||||
if (gpio_is_valid(ctrl_pdata->disp_en_gpio))
|
||||
|
@ -424,6 +436,21 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable)
|
|||
if (pdata->panel_info.rst_seq[++i])
|
||||
usleep_range(pinfo->rst_seq[i] * 1000, pinfo->rst_seq[i] * 1000);
|
||||
}
|
||||
|
||||
if (gpio_is_valid(ctrl_pdata->avdd_en_gpio)) {
|
||||
if (ctrl_pdata->avdd_en_gpio_invert) {
|
||||
rc = gpio_direction_output(
|
||||
ctrl_pdata->avdd_en_gpio, 0);
|
||||
} else {
|
||||
rc = gpio_direction_output(
|
||||
ctrl_pdata->avdd_en_gpio, 1);
|
||||
}
|
||||
if (rc) {
|
||||
pr_err("%s: unable to set dir for avdd_en gpio\n",
|
||||
__func__);
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gpio_is_valid(ctrl_pdata->lcd_mode_sel_gpio)) {
|
||||
|
@ -452,6 +479,14 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable)
|
|||
pr_debug("%s: Reset panel done\n", __func__);
|
||||
}
|
||||
} else {
|
||||
if (gpio_is_valid(ctrl_pdata->avdd_en_gpio)) {
|
||||
if (ctrl_pdata->avdd_en_gpio_invert)
|
||||
gpio_set_value((ctrl_pdata->avdd_en_gpio), 1);
|
||||
else
|
||||
gpio_set_value((ctrl_pdata->avdd_en_gpio), 0);
|
||||
|
||||
gpio_free(ctrl_pdata->avdd_en_gpio);
|
||||
}
|
||||
if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) {
|
||||
gpio_set_value((ctrl_pdata->disp_en_gpio), 0);
|
||||
gpio_free(ctrl_pdata->disp_en_gpio);
|
||||
|
|
Loading…
Add table
Reference in a new issue