Due to scaling, the userspace and hardware brightness ranges might not
have a 1:1 mapping, causing the backlight class sysfs actual_brightness
not match the brightness attribute just written. While this is not a
strict requirement per Documentation/ABI/stable/sysfs-class-backlight,
try the userspace->hardware scaling for a match first and return the
cached value to not confuse userspace.

The problem was already mitigated by

commit 673e7bbdb3920b62cfc6c710bea626b0a9b0f43a
Author: U. Artie Eoff <[email protected]>
Date:   Mon Sep 29 15:49:32 2014 -0700

    drm/i915: intel_backlight scale() math WA

but this should be more robust for cases where the userspace expects
actual_brightness to match the just written brightness.

Reference: 
http://mid.gmane.org/[email protected]
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=85861
Cc: U. Artie Eoff <[email protected]>
Signed-off-by: Jani Nikula <[email protected]>
---
 drivers/gpu/drm/i915/intel_panel.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_panel.c 
b/drivers/gpu/drm/i915/intel_panel.c
index 4d63839bd9b4..675b56e105e7 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -1024,7 +1024,17 @@ static int intel_backlight_device_get_brightness(struct 
backlight_device *bd)
        drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
 
        hw_level = intel_panel_get_backlight(connector);
-       ret = scale_hw_to_user(connector, hw_level, bd->props.max_brightness);
+
+       /*
+        * Check the userspace->hardware scaling for a match first to avoid
+        * scaling errors in the userspace->hardware->userspace round-trip.
+        */
+       if (hw_level == scale_user_to_hw(connector, bd->props.brightness,
+                                        bd->props.max_brightness))
+               ret = bd->props.brightness;
+       else
+               ret = scale_hw_to_user(connector, hw_level,
+                                      bd->props.max_brightness);
 
        drm_modeset_unlock(&dev->mode_config.connection_mutex);
        intel_runtime_pm_put(dev_priv);
-- 
2.1.3

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to