summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShiyong Li <shiyongli@google.com>2023-02-16 00:58:10 +0000
committerTreeHugger Robot <treehugger-gerrit@google.com>2023-02-22 19:11:17 +0000
commit76a438509a4c5fbf0823a7e11e52e10aa4473f81 (patch)
tree0e0478b1caf767650e6eb731ac3ca67be3381527
parente5a3f7a78dcccf0314d1587c9d0dd1ebc6d24cc8 (diff)
downloaddisplay-76a438509a4c5fbf0823a7e11e52e10aa4473f81.tar.gz
- 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.c50
-rw-r--r--samsung/panel/panel-samsung-drv.h3
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