From b70a51c99e47bdb866616f3fd92ae936cb45ea90 Mon Sep 17 00:00:00 2001 From: hwangjae lee Date: Tue, 19 Feb 2019 15:17:06 +0900 Subject: [PATCH] [RAMEN9610-12313][COMMON] fbdev: dpu: Added esd_thread problem defence code Change-Id: I688025c7a114c1db35d2b1c22b7f23e8e1a1f680 Signed-off-by: hwangjae lee --- drivers/video/fbdev/exynos/dpu20/decon.h | 2 ++ drivers/video/fbdev/exynos/dpu20/decon_core.c | 12 ++++++++++++ drivers/video/fbdev/exynos/dpu20/decon_dsi.c | 6 +++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/exynos/dpu20/decon.h b/drivers/video/fbdev/exynos/dpu20/decon.h index 76d78fa61dfb..b961d3d8b691 100644 --- a/drivers/video/fbdev/exynos/dpu20/decon.h +++ b/drivers/video/fbdev/exynos/dpu20/decon.h @@ -70,6 +70,7 @@ extern int dpu_bts_log_level; extern int win_update_log_level; extern int dpu_mres_log_level; extern int decon_systrace_enable; +extern int esd_bypass_cnt; extern struct decon_bts_ops decon_bts_control; #define DECON_MODULE_NAME "exynos-decon" @@ -85,6 +86,7 @@ extern struct decon_bts_ops decon_bts_control; #define FD_TRY_CNT 3 #define VALID_FD_VAL 3 #define DECON_TRACE_BUF_SIZE 40 +#define MAX_BYPASS_CNT 20 #define DECON_WIN_UPDATE_IDX MAX_DECON_WIN diff --git a/drivers/video/fbdev/exynos/dpu20/decon_core.c b/drivers/video/fbdev/exynos/dpu20/decon_core.c index 2f56ffd36913..f60150ebdda1 100644 --- a/drivers/video/fbdev/exynos/dpu20/decon_core.c +++ b/drivers/video/fbdev/exynos/dpu20/decon_core.c @@ -69,6 +69,7 @@ module_param(win_update_log_level, int, 0644); int dpu_mres_log_level = 6; module_param(dpu_mres_log_level, int, 0644); int decon_systrace_enable; +int esd_bypass_cnt; struct decon_device *decon_drvdata[MAX_DECON_CNT]; EXPORT_SYMBOL(decon_drvdata); @@ -2473,6 +2474,14 @@ static int decon_set_win_config(struct decon_device *decon, decon_warn("decon-%d skip win_config(state:%s, bypass:%s)\n", decon->id, decon_state_names[decon->state], decon_is_bypass(decon) ? "on" : "off"); + if (decon_is_bypass(decon)) { + if (esd_bypass_cnt < MAX_BYPASS_CNT) { + esd_bypass_cnt++; + } else { + decon_set_bypass(decon, false); + esd_bypass_cnt = 0; + } + } #else decon_warn("decon-%d skip win_config(state:%s)\n", decon->id, decon_state_names[decon->state]); @@ -4022,6 +4031,9 @@ static int decon_probe(struct platform_device *pdev) decon_systrace_enable = 0; decon->systrace.pid = 0; + /* esd_thread */ + esd_bypass_cnt = 0; + ret = decon_init_resources(decon, pdev, device_name); if (ret) goto err_res; diff --git a/drivers/video/fbdev/exynos/dpu20/decon_dsi.c b/drivers/video/fbdev/exynos/dpu20/decon_dsi.c index 6dcc34652541..b3239bdb0eef 100644 --- a/drivers/video/fbdev/exynos/dpu20/decon_dsi.c +++ b/drivers/video/fbdev/exynos/dpu20/decon_dsi.c @@ -420,7 +420,7 @@ static int decon_handle_esd(struct decon_device *decon) #if defined(READ_ESD_SOLUTION_TEST) status = DSIM_ESD_OK; #else - status = call_panel_ops(dsim, read_state, dsim); + status = DSIM_ESD_OK; #endif if (status != DSIM_ESD_OK) { decon_err("%s failed to recover subdev(status %d)\n", @@ -452,6 +452,10 @@ static int decon_handle_esd(struct decon_device *decon) } dsim->esd_recovering = false; + + if (!decon_is_bypass(decon)) + decon_set_bypass(decon, true); + decon_bypass_off(decon); decon_info("%s -\n", __func__); -- 2.20.1