From 182d88e3b9147ef4213bd1a3560656791ab1a346 Mon Sep 17 00:00:00 2001 From: Satya Rama Aditya Pinapala Date: Fri, 29 May 2020 17:29:59 -0700 Subject: [PATCH] disp: msm: handle panel detection after a pp done timeout The change allows for multiple TE checks during a pp done timeout. With this change, when a timeout occurs the panel status is checked using the default ESD check status method followed by multiple TE checks. Change-Id: If813964bab55c5e8113721060aa5b279f30fa5e0 Signed-off-by: Satya Rama Aditya Pinapala --- msm/dsi/dsi_display.c | 38 ++++++++++++++++++++++---------------- msm/sde/sde_connector.c | 2 +- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 8d70d882616a..20fc8c7b107c 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -29,6 +29,7 @@ #define ESD_TRIGGER_STRING_MAX_LEN 10 #define MAX_NAME_SIZE 64 +#define MAX_TE_RECHECKS 5 #define DSI_CLOCK_BITRATE_RADIX 10 #define MAX_TE_SOURCE_ID 2 @@ -764,18 +765,22 @@ static int dsi_display_status_bta_request(struct dsi_display *display) return rc; } -static int dsi_display_status_check_te(struct dsi_display *display) +static int dsi_display_status_check_te(struct dsi_display *display, + int rechecks) { - int rc = 1; + int rc = 1, i = 0; int const esd_te_timeout = msecs_to_jiffies(3*20); dsi_display_change_te_irq_status(display, true); - reinit_completion(&display->esd_te_gate); - if (!wait_for_completion_timeout(&display->esd_te_gate, - esd_te_timeout)) { - DSI_ERR("TE check failed\n"); - rc = -EINVAL; + for (i = 0; i < rechecks; i++) { + reinit_completion(&display->esd_te_gate); + if (!wait_for_completion_timeout(&display->esd_te_gate, + esd_te_timeout)) { + DSI_ERR("TE check failed\n"); + dsi_display_change_te_irq_status(display, false); + return -EINVAL; + } } dsi_display_change_te_irq_status(display, false); @@ -791,6 +796,7 @@ int dsi_display_check_status(struct drm_connector *connector, void *display, u32 status_mode; int rc = 0x1, ret; u32 mask; + int te_rechecks = 1; if (!dsi_display || !dsi_display->panel) return -EINVAL; @@ -819,13 +825,8 @@ int dsi_display_check_status(struct drm_connector *connector, void *display, } SDE_EVT32(SDE_EVTLOG_FUNC_ENTRY); - if (te_check_override && gpio_is_valid(dsi_display->disp_te_gpio)) - status_mode = ESD_MODE_PANEL_TE; - - if (status_mode == ESD_MODE_PANEL_TE) { - rc = dsi_display_status_check_te(dsi_display); - goto exit; - } + if (te_check_override) + te_rechecks = MAX_TE_RECHECKS; ret = dsi_display_clk_ctrl(dsi_display->dsi_clk_handle, DSI_ALL_CLKS, DSI_CLK_ON); @@ -842,23 +843,28 @@ int dsi_display_check_status(struct drm_connector *connector, void *display, } else if (status_mode == ESD_MODE_SW_BTA) { rc = dsi_display_status_bta_request(dsi_display); } else if (status_mode == ESD_MODE_PANEL_TE) { - rc = dsi_display_status_check_te(dsi_display); + rc = dsi_display_status_check_te(dsi_display, te_rechecks); + te_check_override = false; } else { DSI_WARN("Unsupported check status mode: %d\n", status_mode); panel->esd_config.esd_enabled = false; } + if (rc <= 0 && te_check_override) + rc = dsi_display_status_check_te(dsi_display, te_rechecks); /* Unmask error interrupts if check passed*/ if (rc > 0) { dsi_display_set_ctrl_esd_check_flag(dsi_display, false); dsi_display_mask_ctrl_error_interrupts(dsi_display, mask, false); + if (te_check_override && panel->esd_config.esd_enabled == false) + rc = dsi_display_status_check_te(dsi_display, + te_rechecks); } dsi_display_clk_ctrl(dsi_display->dsi_clk_handle, DSI_ALL_CLKS, DSI_CLK_OFF); -exit: /* Handle Panel failures during display disable sequence */ if (rc <=0) atomic_set(&panel->esd_recovery_pending, 1); diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index c212b00d0519..d785bf8c9089 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -2189,7 +2189,7 @@ int sde_connector_esd_status(struct drm_connector *conn) return -ETIMEDOUT; } ret = sde_conn->ops.check_status(&sde_conn->base, - sde_conn->display, false); + sde_conn->display, true); mutex_unlock(&sde_conn->lock); if (ret <= 0) {