summaryrefslogtreecommitdiff
path: root/samsung/panel/panel-samsung-drv.c
diff options
context:
space:
mode:
authorgilliu <gilliu@google.com>2022-06-14 03:22:56 +0000
committerGil Liu <gilliu@google.com>2022-10-12 03:50:33 +0000
commitf38a21beeb0af15b77cc8a3da5d43e2c367b2bf2 (patch)
tree8030bda5af204dd7d4ce4153733cabb8f75519ed /samsung/panel/panel-samsung-drv.c
parent22df4dc93e587712c99124406036d07c23cacc5c (diff)
downloaddisplay-f38a21beeb0af15b77cc8a3da5d43e2c367b2bf2.tar.gz
panel: Update CABC function to support force off
Support CABC force off when min_brightness Bug: 236927968 Test: Dump CABC state when min brightness Change-Id: I94bccb1a1cd4d8cec0fa4a34ffa9c56f0b7d2669 Signed-off-by: Gil <gilliu@google.com> (cherry picked from commit 655d6b3586be3a158a407f802adc85474c0c7c3c)
Diffstat (limited to 'samsung/panel/panel-samsung-drv.c')
-rw-r--r--samsung/panel/panel-samsung-drv.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/samsung/panel/panel-samsung-drv.c b/samsung/panel/panel-samsung-drv.c
index 283ad94..cd53602 100644
--- a/samsung/panel/panel-samsung-drv.c
+++ b/samsung/panel/panel-samsung-drv.c
@@ -851,6 +851,23 @@ static int exynos_get_brightness(struct backlight_device *bl)
return bl->props.brightness;
}
+static void exynos_panel_set_cabc(struct exynos_panel *ctx, enum exynos_cabc_mode cabc_mode)
+{
+ const struct exynos_panel_funcs *funcs = ctx->desc->exynos_panel_func;
+ struct backlight_device *bl = ctx->bl;
+ u8 mode;
+ bool force_off = (bl->props.brightness <= ctx->desc->min_brightness);
+
+ if (!funcs || !funcs->set_cabc_mode)
+ return;
+
+ /* force off will not change the cabc_mode node */
+ mode = !force_off ? cabc_mode : CABC_OFF;
+ funcs->set_cabc_mode(ctx, mode);
+ ctx->cabc_mode = cabc_mode;
+ dev_dbg(ctx->dev, "set cabc mode: %d, force_off: %d\n", cabc_mode, force_off);
+}
+
static int exynos_bl_find_range(struct exynos_panel *ctx,
int brightness, u32 *range)
{
@@ -923,6 +940,9 @@ static int exynos_update_status(struct backlight_device *bl)
dev_dbg(ctx->dev, "bl range is changed to %d\n",
ctx->bl_notifier.current_range);
}
+
+ if (ctx->cabc_mode && brightness)
+ exynos_panel_set_cabc(ctx, ctx->cabc_mode);
mutex_unlock(&ctx->mode_lock);
return 0;
}
@@ -1674,20 +1694,6 @@ static void exynos_panel_set_dimming(struct exynos_panel *ctx, bool dimming_on)
mutex_unlock(&ctx->mode_lock);
}
-static void exynos_panel_set_cabc(struct exynos_panel *ctx, enum exynos_cabc_mode cabc_mode)
-{
- const struct exynos_panel_funcs *funcs = ctx->desc->exynos_panel_func;
-
- if (!funcs || !funcs->set_cabc_mode)
- return;
-
- mutex_lock(&ctx->mode_lock);
- if (cabc_mode != ctx->cabc_mode)
- funcs->set_cabc_mode(ctx, cabc_mode);
-
- mutex_unlock(&ctx->mode_lock);
-}
-
static void exynos_panel_pre_commit_properties(
struct exynos_panel *ctx,
struct exynos_drm_connector_state *conn_state)
@@ -2556,7 +2562,9 @@ static ssize_t cabc_mode_store(struct device *dev, struct device_attribute *attr
return -EINVAL;
}
+ mutex_lock(&ctx->mode_lock);
exynos_panel_set_cabc(ctx, cabc_mode);
+ mutex_unlock(&ctx->mode_lock);
return count;
}