From cf526d3224460b047f9e9794ec75c6e0935e1ccb Mon Sep 17 00:00:00 2001 From: houdz1 Date: Fri, 10 Sep 2021 11:37:57 +0800 Subject: [PATCH] msm/dsi: add shutdown function to power down panel When shut down phone, it will call shutdown function to shut down device. That can meet the power down timing requirements of panel. Change-Id: If5f5eb57934559d8c6aa979431d434bf89d33de9 Signed-off-by: houdz1 Reviewed-on: https://gerrit.mot.com/2063775 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Yeqing Wang Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- msm/dsi/dsi_display.c | 46 +++++++++++++++++++++++++++++++++++++++++++ msm/dsi/dsi_display.h | 1 + msm/dsi/dsi_panel.c | 3 +++ msm/dsi/dsi_panel.h | 1 + 4 files changed, 51 insertions(+) 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;