Remove the spurious division by two in getting the current value, and if
the legacy value is 0xff it is unused. And whilst setting the value, fix
the rounding.

Reported-by: Nick Bowler <nbow...@draconx.ca>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=31803
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
Cc: sta...@kernel.org
---
 drivers/gpu/drm/i915/intel_panel.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_panel.c 
b/drivers/gpu/drm/i915/intel_panel.c
index c65992d..71ba046 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -205,10 +205,11 @@ u32 intel_panel_get_backlight(struct drm_device *dev)
                if (is_backlight_combination_mode(dev)){
                        u8 lbpc;
 
-                       val &= ~1;
                        pci_read_config_byte(dev->pdev, PCI_LBPC, &lbpc);
+                       /* Report the value in [0:max] i.e. always multiplied
+                        * by lbpc even if the hardware does not (0xff).
+                        */
                        val *= lbpc;
-                       val >>= 1;
                }
        }
 
@@ -237,9 +238,12 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 
level)
                u32 max = intel_panel_get_max_backlight(dev);
                u8 lpbc;
 
-               lpbc = level * 0xfe / max + 1;
-               level /= lpbc;
+               lpbc = (level * 0xfe + max-1) / max + 1;
                pci_write_config_byte(dev->pdev, PCI_LBPC, lpbc);
+
+               /* The hardware is tricksy and treats lpbc == 0xff specially */
+               max = lpbc == 0xff ? 0xff : 0xff * lpbc;
+               level = (level + max-1) / max;
        }
 
        tmp = I915_READ(BLC_PWM_CTL);
-- 
1.7.2.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to