diff mbox

drm/i915: do not expose a dysfunctional backlight interface to userspace

Message ID 1346678712-30513-1-git-send-email-jani.nikula@intel.com (mailing list archive)
State Accepted
Headers show

Commit Message

Jani Nikula Sept. 3, 2012, 1:25 p.m. UTC
Previously intel_panel_setup_backlight() would create a sysfs backlight
interface with max brightness of 1 if it was unable to figure out the max
backlight brightness. This rendered the backlight interface useless.

Do not create a dysfunctional backlight interface to begin with.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>

---

See https://bugzilla.redhat.com/show_bug.cgi?id=752595

There's still a bug somewhere in the userspace as well; it should always
prefer the platform backlight interface over the raw one. This patch might
have the effect of hiding that particular userspace issue, but we shouldn't
be exporting a backlight interface that's useless no matter what.
---
 drivers/gpu/drm/i915/intel_panel.c |   31 ++++++++++++++++++++++---------
 1 file changed, 22 insertions(+), 9 deletions(-)

Comments

Chris Wilson Sept. 3, 2012, 5:51 p.m. UTC | #1
On Mon,  3 Sep 2012 16:25:12 +0300, Jani Nikula <jani.nikula@intel.com> wrote:
> Previously intel_panel_setup_backlight() would create a sysfs backlight
> interface with max brightness of 1 if it was unable to figure out the max
> backlight brightness. This rendered the backlight interface useless.
> 
> Do not create a dysfunctional backlight interface to begin with.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

> ---
> 
> See https://bugzilla.redhat.com/show_bug.cgi?id=752595
> 
> There's still a bug somewhere in the userspace as well; it should always
> prefer the platform backlight interface over the raw one. This patch might
> have the effect of hiding that particular userspace issue, but we shouldn't
> be exporting a backlight interface that's useless no matter what.

It was fixed. UXA uses a hardcoded set of preferred platform drivers,
SNA looks at all the backlights under /sys/class/backlight and sorts
them by type. We still have the issue of multi-panel or just multiple
backlight interfaces and choosing the wrong one randomly. libbacklight's
idea was to expose some more details through the kernel to be able to
link device + connector to a particular backlight interface. However,
userspace has the Option "Backlight" for fine tuning.
-Chris
Daniel Vetter Sept. 3, 2012, 6:42 p.m. UTC | #2
On Mon, Sep 03, 2012 at 06:51:31PM +0100, Chris Wilson wrote:
> On Mon,  3 Sep 2012 16:25:12 +0300, Jani Nikula <jani.nikula@intel.com> wrote:
> > Previously intel_panel_setup_backlight() would create a sysfs backlight
> > interface with max brightness of 1 if it was unable to figure out the max
> > backlight brightness. This rendered the backlight interface useless.
> > 
> > Do not create a dysfunctional backlight interface to begin with.
> > 
> > Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Picked up for -fixes, thanks for the patch.
-Daniel
Jani Nikula Sept. 4, 2012, 7:39 a.m. UTC | #3
On Mon, 03 Sep 2012, "Woodhouse, David" <david.woodhouse@intel.com> wrote:
> There was a Tested-by: David Woodhouse <David.Woodhouse@intel.com> in
> there somewhere too, but the broken list config ate it.

Thanks again for testing. Your Tested-by was not lost:

http://cgit.freedesktop.org/~danvet/drm-intel/commit/?id=28dcc2d60cb570d9f549c329b2f51400553412a1

BR,
Jani.
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 3df4f5f..e019b23 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -162,19 +162,12 @@  static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv)
 	return val;
 }
 
-u32 intel_panel_get_max_backlight(struct drm_device *dev)
+static u32 _intel_panel_get_max_backlight(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	u32 max;
 
 	max = i915_read_blc_pwm_ctl(dev_priv);
-	if (max == 0) {
-		/* XXX add code here to query mode clock or hardware clock
-		 * and program max PWM appropriately.
-		 */
-		pr_warn_once("fixme: max PWM is zero\n");
-		return 1;
-	}
 
 	if (HAS_PCH_SPLIT(dev)) {
 		max >>= 16;
@@ -188,6 +181,22 @@  u32 intel_panel_get_max_backlight(struct drm_device *dev)
 			max *= 0xff;
 	}
 
+	return max;
+}
+
+u32 intel_panel_get_max_backlight(struct drm_device *dev)
+{
+	u32 max;
+
+	max = _intel_panel_get_max_backlight(dev);
+	if (max == 0) {
+		/* XXX add code here to query mode clock or hardware clock
+		 * and program max PWM appropriately.
+		 */
+		pr_warn_once("fixme: max PWM is zero\n");
+		return 1;
+	}
+
 	DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max);
 	return max;
 }
@@ -424,7 +433,11 @@  int intel_panel_setup_backlight(struct drm_device *dev)
 
 	memset(&props, 0, sizeof(props));
 	props.type = BACKLIGHT_RAW;
-	props.max_brightness = intel_panel_get_max_backlight(dev);
+	props.max_brightness = _intel_panel_get_max_backlight(dev);
+	if (props.max_brightness == 0) {
+		DRM_ERROR("Failed to get maximum backlight value\n");
+		return -ENODEV;
+	}
 	dev_priv->backlight =
 		backlight_device_register("intel_backlight",
 					  &connector->kdev, dev,