summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShiyong Li <shiyongli@google.com>2023-02-16 00:58:10 +0000
committerShiyong Li <shiyongli@google.com>2023-02-23 22:45:53 +0000
commit07cef87338adaebda76d243553762e2c4a3604e4 (patch)
tree3182fb115d4e5846dcd0144ad91d1cc7d63e1be1
parent619b0ab002688e718c4fca85c24314d863d30625 (diff)
downloaddisplay-07cef87338adaebda76d243553762e2c4a3604e4.tar.gz
samsung: panel: don't duplicate setting brightness=0
- 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> (cherry picked from commit 76a438509a4c5fbf0823a7e11e52e10aa4473f81) (cherry picked from commit e4306382ad52932072282d72b7636610010c0157)
-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 a6853ea..32aca6c 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;
@@ -1532,7 +1563,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");
@@ -1737,21 +1768,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);
@@ -3074,8 +3105,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 cff7b57..a9b4c38 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,
};
/**
@@ -580,6 +581,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