diff options
author | Shiyong Li <shiyongli@google.com> | 2023-02-16 00:58:10 +0000 |
---|---|---|
committer | TreeHugger Robot <treehugger-gerrit@google.com> | 2023-02-22 19:11:17 +0000 |
commit | 76a438509a4c5fbf0823a7e11e52e10aa4473f81 (patch) | |
tree | 0e0478b1caf767650e6eb731ac3ca67be3381527 | |
parent | e5a3f7a78dcccf0314d1587c9d0dd1ebc6d24cc8 (diff) | |
download | display-76a438509a4c5fbf0823a7e11e52e10aa4473f81.tar.gz |
samsung: panel: don't duplicate setting brightness=0android-t-qpr3-beta-2_r0.5android-t-qpr3-beta-1_r0.5android-gs-pantah-5.10-t-qpr3-beta-2android-gs-pantah-5.10-android13-qpr3-beta1
- as backlight is off after resetting panel, don't duplicate setting it.
- some panel could show artifacts if setting brightness from zero to non-zero.
Bug: 269425859
Change-Id: Id49253eb5cec96d4268a22ff6a6480da06154a2e
Signed-off-by: Shiyong Li <shiyongli@google.com>
-rw-r--r-- | samsung/panel/panel-samsung-drv.c | 50 | ||||
-rw-r--r-- | samsung/panel/panel-samsung-drv.h | 3 |
2 files changed, 44 insertions, 9 deletions
diff --git a/samsung/panel/panel-samsung-drv.c b/samsung/panel/panel-samsung-drv.c index 78c08f0..593e1d3 100644 --- a/samsung/panel/panel-samsung-drv.c +++ b/samsung/panel/panel-samsung-drv.c @@ -429,6 +429,7 @@ void exynos_panel_reset(struct exynos_panel *ctx) dev_dbg(ctx->dev, "%s -\n", __func__); + ctx->is_brightness_initialized = false; exynos_panel_init(ctx); } EXPORT_SYMBOL(exynos_panel_reset); @@ -574,6 +575,7 @@ static void exynos_panel_handoff(struct exynos_panel *ctx) if (ctx->enabled) { dev_info(ctx->dev, "panel enabled at boot\n"); ctx->panel_state = PANEL_STATE_HANDOFF; + ctx->is_brightness_initialized = true; exynos_panel_set_power(ctx, true); } else { ctx->panel_state = PANEL_STATE_UNINITIALIZED; @@ -904,6 +906,30 @@ static int exynos_bl_find_range(struct exynos_panel *ctx, return -EINVAL; } +/** + * exynos_panel_get_state_str - get readable string for panel state + * @state: panel state enum + * + * convert enum exynos_panel_state into readable panel state string. + */ +static const char *exynos_panel_get_state_str(enum exynos_panel_state state) +{ + static const char *state_str[PANEL_STATE_COUNT] = { + [PANEL_STATE_UNINITIALIZED] = "UN-INIT", + [PANEL_STATE_HANDOFF] = "HANDOFF", + [PANEL_STATE_HANDOFF_MODESET] = "HANDOFF-MODESET", + [PANEL_STATE_OFF] = "OFF", + [PANEL_STATE_NORMAL] = "ON", + [PANEL_STATE_LP] = "LP", + [PANEL_STATE_MODESET] = "MODESET", + [PANEL_STATE_BLANK] = "BLANK", + }; + + if (state >= PANEL_STATE_COUNT) + return "UNKNOWN"; + return state_str[state]; +} + static int exynos_update_status(struct backlight_device *bl) { struct exynos_panel *ctx = bl_get_data(bl); @@ -916,6 +942,11 @@ static int exynos_update_status(struct backlight_device *bl) return -EPERM; } + if (!ctx->is_brightness_initialized) { + if (brightness == 0) + return 0; + ctx->is_brightness_initialized = true; + } /* check if backlight is forced off */ if (bl->props.power != FB_BLANK_UNBLANK) brightness = 0; @@ -1513,7 +1544,7 @@ static void exynos_panel_connector_print_state(struct drm_printer *p, if (ret) return; - drm_printf(p, "\tpanel_state: %d\n", ctx->panel_state); + drm_printf(p, "\tpanel_state: %s\n", exynos_panel_get_state_str(ctx->panel_state)); drm_printf(p, "\tidle: %s (%s)\n", ctx->panel_idle_vrefresh ? "active" : "inactive", ctx->panel_idle_enabled ? "enabled" : "disabled"); @@ -1718,21 +1749,21 @@ static void exynos_panel_pre_commit_properties( if (!conn_state->pending_update_flags) return; - dev_info(ctx->dev, "%s: mipi_sync(0x%lx) pending_update_flags(0x%x)\n", __func__, - conn_state->mipi_sync, conn_state->pending_update_flags); DPU_ATRACE_BEGIN(__func__); mipi_sync = conn_state->mipi_sync & (MIPI_CMD_SYNC_LHBM | MIPI_CMD_SYNC_GHBM | MIPI_CMD_SYNC_BL); if ((conn_state->mipi_sync & (MIPI_CMD_SYNC_LHBM | MIPI_CMD_SYNC_GHBM)) && ctx->current_mode->exynos_mode.is_lp_mode) { - conn_state->pending_update_flags &= - ~(HBM_FLAG_LHBM_UPDATE | HBM_FLAG_GHBM_UPDATE | HBM_FLAG_BL_UPDATE); - dev_warn(ctx->dev, "%s: avoid LHBM/GHBM/BL updates during lp mode\n", - __func__); + dev_warn(ctx->dev, + "%s: skip LHBM/GHBM updates during lp mode, pending_update_flags(0x%x)\n", + __func__, conn_state->pending_update_flags); + conn_state->pending_update_flags &= ~(HBM_FLAG_LHBM_UPDATE | HBM_FLAG_GHBM_UPDATE); } if (mipi_sync) { + dev_info(ctx->dev, "%s: mipi_sync(0x%lx) pending_update_flags(0x%x)\n", __func__, + conn_state->mipi_sync, conn_state->pending_update_flags); exynos_panel_check_mipi_sync_timing(conn_state->base.crtc, ctx->current_mode, ctx); exynos_dsi_dcs_write_buffer_force_batch_begin(dsi); @@ -3055,8 +3086,9 @@ static void exynos_panel_set_backlight_state(struct exynos_panel *ctx, if (state_changed) { backlight_state_changed(bl); - dev_info(ctx->dev, "%s: panel:%d, bl:0x%x\n", __func__, - panel_state, bl->props.state); + dev_info(ctx->dev, "panel: %s | bl: brightness@%u, state@0x%x\n", + exynos_panel_get_state_str(panel_state), bl->props.brightness, + bl->props.state); } } diff --git a/samsung/panel/panel-samsung-drv.h b/samsung/panel/panel-samsung-drv.h index 4e2688e..f91f801 100644 --- a/samsung/panel/panel-samsung-drv.h +++ b/samsung/panel/panel-samsung-drv.h @@ -107,6 +107,7 @@ enum exynos_panel_state { PANEL_STATE_LP, PANEL_STATE_MODESET, PANEL_STATE_BLANK, + PANEL_STATE_COUNT, }; /** @@ -573,6 +574,8 @@ struct exynos_panel { bool panel_need_handle_idle_exit; /* indicates self refresh is active */ bool self_refresh_active; + /* indicates if panel brightness is set or not after reset */ + bool is_brightness_initialized; /** * refresh rate in panel idle mode * 0 means not in idle mode or not specified |