diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index afa73fa3e013..d67f9f3c83c4 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -2466,10 +2466,30 @@ static void dp_display_update_dsc_resources(struct dp_display_private *dp, } } +static int dp_display_set_pinctrl_state(struct dp_pinctrl *pinctrl, + struct pinctrl_state *state) +{ + int rc = 0; + + if (pinctrl && !IS_ERR_OR_NULL(state)) { + rc = pinctrl_select_state(pinctrl->pin, state); + if (rc) { + DP_ERR("failed to set pin state, rc=%d\n", rc); + } + } else { + rc = -EINVAL; + DP_DEBUG("pinctrl state does not exist\n"); + } + + return rc; +} + static int dp_display_enable(struct dp_display *dp_display, void *panel) { int rc = 0; struct dp_display_private *dp; + struct dp_parser *parser; + struct dp_pinctrl *pinctrl; if (!dp_display || !panel) { DP_ERR("invalid input\n"); @@ -2520,6 +2540,24 @@ static int dp_display_enable(struct dp_display *dp_display, void *panel) DP_ERR("Cannot turn edp PWM on "); goto end; } + + parser = dp->parser; + if (!parser) { + DP_ERR("failed to get parser"); + } else { + pinctrl = &parser->pinctrl; + pinctrl->pin = devm_pinctrl_get(&dp->parser->pdev->dev); + + if (!IS_ERR_OR_NULL(pinctrl->pin)) { + pinctrl->state_bl_pwm = pinctrl_lookup_state(pinctrl->pin, + "mdss_edp_bl_pwm"); + rc = dp_display_set_pinctrl_state(pinctrl, pinctrl->state_bl_pwm); + if (rc) + DP_DEBUG("failed to set pinctrl, rc=%d\n", rc); + } else { + DP_DEBUG("failed to get pinctrl"); + } + } } dp_display_update_dsc_resources(dp, panel, true); diff --git a/msm/dp/dp_parser.h b/msm/dp/dp_parser.h index 4404930d255a..f23b195947fc 100644 --- a/msm/dp/dp_parser.h +++ b/msm/dp/dp_parser.h @@ -100,6 +100,7 @@ struct dp_io { * @state_active: active state pin control * @state_hpd_active: hpd active state pin control * @state_suspend: suspend state pin control + * @state_bl_pwm: backlight pwm pin control */ struct dp_pinctrl { struct pinctrl *pin; @@ -108,6 +109,7 @@ struct dp_pinctrl { struct pinctrl_state *state_hpd_tlmm; struct pinctrl_state *state_hpd_ctrl; struct pinctrl_state *state_suspend; + struct pinctrl_state *state_bl_pwm; }; #define DP_ENUM_STR(x) #x