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