[Intel-gfx] [PATCH] drm/i915/panel: Fix application of legacy backlight value

Chris Wilson chris at chris-wilson.co.uk
Sat Jan 29 10:30:40 CET 2011


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 <nbowler at draconx.ca>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=31803
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: stable at 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




More information about the Intel-gfx mailing list