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 <psraditya30@codeaurora.org>
This commit is contained in:
Satya Rama Aditya Pinapala
2020-05-29 17:29:59 -07:00
committed by Gerrit - the friendly Code Review server
parent 4d45309328
commit 182d88e3b9
2 changed files with 23 additions and 17 deletions

View File

@@ -29,6 +29,7 @@
#define ESD_TRIGGER_STRING_MAX_LEN 10 #define ESD_TRIGGER_STRING_MAX_LEN 10
#define MAX_NAME_SIZE 64 #define MAX_NAME_SIZE 64
#define MAX_TE_RECHECKS 5
#define DSI_CLOCK_BITRATE_RADIX 10 #define DSI_CLOCK_BITRATE_RADIX 10
#define MAX_TE_SOURCE_ID 2 #define MAX_TE_SOURCE_ID 2
@@ -764,18 +765,22 @@ static int dsi_display_status_bta_request(struct dsi_display *display)
return rc; 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); int const esd_te_timeout = msecs_to_jiffies(3*20);
dsi_display_change_te_irq_status(display, true); dsi_display_change_te_irq_status(display, true);
reinit_completion(&display->esd_te_gate); for (i = 0; i < rechecks; i++) {
if (!wait_for_completion_timeout(&display->esd_te_gate, reinit_completion(&display->esd_te_gate);
esd_te_timeout)) { if (!wait_for_completion_timeout(&display->esd_te_gate,
DSI_ERR("TE check failed\n"); esd_te_timeout)) {
rc = -EINVAL; DSI_ERR("TE check failed\n");
dsi_display_change_te_irq_status(display, false);
return -EINVAL;
}
} }
dsi_display_change_te_irq_status(display, false); 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; u32 status_mode;
int rc = 0x1, ret; int rc = 0x1, ret;
u32 mask; u32 mask;
int te_rechecks = 1;
if (!dsi_display || !dsi_display->panel) if (!dsi_display || !dsi_display->panel)
return -EINVAL; return -EINVAL;
@@ -819,13 +825,8 @@ int dsi_display_check_status(struct drm_connector *connector, void *display,
} }
SDE_EVT32(SDE_EVTLOG_FUNC_ENTRY); SDE_EVT32(SDE_EVTLOG_FUNC_ENTRY);
if (te_check_override && gpio_is_valid(dsi_display->disp_te_gpio)) if (te_check_override)
status_mode = ESD_MODE_PANEL_TE; te_rechecks = MAX_TE_RECHECKS;
if (status_mode == ESD_MODE_PANEL_TE) {
rc = dsi_display_status_check_te(dsi_display);
goto exit;
}
ret = dsi_display_clk_ctrl(dsi_display->dsi_clk_handle, ret = dsi_display_clk_ctrl(dsi_display->dsi_clk_handle,
DSI_ALL_CLKS, DSI_CLK_ON); 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) { } else if (status_mode == ESD_MODE_SW_BTA) {
rc = dsi_display_status_bta_request(dsi_display); rc = dsi_display_status_bta_request(dsi_display);
} else if (status_mode == ESD_MODE_PANEL_TE) { } 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 { } else {
DSI_WARN("Unsupported check status mode: %d\n", status_mode); DSI_WARN("Unsupported check status mode: %d\n", status_mode);
panel->esd_config.esd_enabled = false; 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*/ /* Unmask error interrupts if check passed*/
if (rc > 0) { if (rc > 0) {
dsi_display_set_ctrl_esd_check_flag(dsi_display, false); dsi_display_set_ctrl_esd_check_flag(dsi_display, false);
dsi_display_mask_ctrl_error_interrupts(dsi_display, mask, dsi_display_mask_ctrl_error_interrupts(dsi_display, mask,
false); 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_display_clk_ctrl(dsi_display->dsi_clk_handle,
DSI_ALL_CLKS, DSI_CLK_OFF); DSI_ALL_CLKS, DSI_CLK_OFF);
exit:
/* Handle Panel failures during display disable sequence */ /* Handle Panel failures during display disable sequence */
if (rc <=0) if (rc <=0)
atomic_set(&panel->esd_recovery_pending, 1); atomic_set(&panel->esd_recovery_pending, 1);

View File

@@ -2189,7 +2189,7 @@ int sde_connector_esd_status(struct drm_connector *conn)
return -ETIMEDOUT; return -ETIMEDOUT;
} }
ret = sde_conn->ops.check_status(&sde_conn->base, ret = sde_conn->ops.check_status(&sde_conn->base,
sde_conn->display, false); sde_conn->display, true);
mutex_unlock(&sde_conn->lock); mutex_unlock(&sde_conn->lock);
if (ret <= 0) { if (ret <= 0) {