diff options
author | gilliu <gilliu@google.com> | 2022-06-14 03:22:56 +0000 |
---|---|---|
committer | Gil Liu <gilliu@google.com> | 2022-10-12 03:50:33 +0000 |
commit | f38a21beeb0af15b77cc8a3da5d43e2c367b2bf2 (patch) | |
tree | 8030bda5af204dd7d4ce4153733cabb8f75519ed /samsung/panel/panel-samsung-drv.c | |
parent | 22df4dc93e587712c99124406036d07c23cacc5c (diff) | |
download | display-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.c | 36 |
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; } |