diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 5fdc05795d19..4bbcf367ffe9 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -6406,8 +6406,54 @@ static struct platform_driver dsi_display_driver = { .of_match_table = dsi_display_dt_match, .suppress_bind_attrs = true, }, + .shutdown = dsi_display_dev_shutdown, }; +void dsi_display_dev_shutdown(struct platform_device *pdev) +{ + int rc = 0; + struct dsi_display *display; + struct dsi_panel *panel; + + if (!pdev) { + DSI_ERR("Invalid device\n"); + return; + } + + display = platform_get_drvdata(pdev); + + if (display == NULL || display->panel == NULL) { + DSI_ERR("Invalid device\n"); + return; + } + + panel = display->panel; + + if (!panel->need_execute_shutdown) { + return; + } + + if (gpio_is_valid(panel->reset_config.disp_en_gpio)) + gpio_set_value(panel->reset_config.disp_en_gpio, 0); + + if (gpio_is_valid(panel->reset_config.reset_gpio)) + gpio_set_value(panel->reset_config.reset_gpio, 0); + + if (gpio_is_valid(panel->reset_config.lcd_mode_sel_gpio)) + gpio_set_value(panel->reset_config.lcd_mode_sel_gpio, 0); + + if (gpio_is_valid(panel->panel_test_gpio)) { + rc = gpio_direction_input(panel->panel_test_gpio); + if (rc) + DSI_WARN("set dir for panel test gpio failed rc=%d\n", rc); + } + + rc = dsi_pwr_enable_regulator(&panel->power_info, false); + if (rc) + DSI_ERR("[%s] failed to enable vregs, rc=%d\n", panel->name, rc); + +} + static int dsi_display_init(struct dsi_display *display) { int rc = 0; diff --git a/msm/dsi/dsi_display.h b/msm/dsi/dsi_display.h index f8d67ac8759f..3c8e7a5ec36e 100644 --- a/msm/dsi/dsi_display.h +++ b/msm/dsi/dsi_display.h @@ -308,6 +308,7 @@ struct dsi_display { int dsi_display_dev_probe(struct platform_device *pdev); int dsi_display_dev_remove(struct platform_device *pdev); +void dsi_display_dev_shutdown(struct platform_device *pdev); /** * dsi_display_get_num_of_displays() - returns number of display devices diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 3b91987ec417..a9ccf8db0b16 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -2609,6 +2609,9 @@ static int dsi_panel_parse_misc_features(struct dsi_panel *panel) panel->skip_panel_off = utils->read_bool(utils->data, "qcom,skip-panel-power-off"); + panel->need_execute_shutdown = utils->read_bool(utils->data, + "qcom,platform-need-execute-shutdown"); + panel->spr_info.enable = false; panel->spr_info.pack_type = MSM_DISPLAY_SPR_TYPE_MAX; diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index 9016b3da25f0..8fd611f63701 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -332,6 +332,7 @@ struct dsi_panel { bool ulps_suspend_enabled; bool allow_phy_power_off; bool reset_gpio_always_on; + bool need_execute_shutdown; atomic_t esd_recovery_pending; bool is_twm_en;