On Sun, Aug 26, 2012 at 12:51:44PM +0100, Chris Wilson wrote:
> On Sun, 26 Aug 2012 21:46:01 +1000, Dave Airlie <[email protected]> wrote:
> > On Sun, Aug 26, 2012 at 9:43 PM, Alon Levy <[email protected]> wrote:
> > > ACPI is meant as a fallback, so it should be last.
> > 
> > eh no, acpi is never the fallback, its always the preferred way.

I guess I was confused by the comment:
 "acpi_video1", /* finally fallback to the generic acpi drivers */

> 
> Right, acpi works on far more machines than intel_backlight. If you want
> to override the automaticlly choose interface, how about an
>    Option "backlight" "intel_backlight"
> ?

Works for me, patch below. But I'm confused - wouldn't the
intel_backlight sys directory be non existant if the kernel found the
machine didn't support it? at least I thought that was the point - then
checking acpi last makes sense.

> -Chris
> 
> -- 
> Chris Wilson, Intel Open Source Technology Centre

commit 26abd7bb55f0962bd2cac0f7ed25c82dff746534
Author: Alon Levy <[email protected]>
Date:   Sun Aug 26 13:15:29 2012 +0200

    add OPTION_INTEL_BACKLIGHT
    
    Allow setting intel_backlight as the preferred backlight interface.
    
    This allows my Lenovo T510 to reach the minimal backlight (switched
    off), by using intel_backlight instead of acpi.
    
    Signed-off-by: Alon Levy <[email protected]>

diff --git a/src/intel_display.c b/src/intel_display.c
index 6580c8c..a3934bb 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -41,6 +41,7 @@
 
 #include "intel.h"
 #include "intel_bufmgr.h"
+#include "intel_options.h"
 #include "xf86drm.h"
 #include "xf86drmMode.h"
 #include "X11/Xatom.h"
@@ -248,26 +249,43 @@ intel_output_backlight_get_max(xf86OutputPtr output)
        return max;
 }
 
+static Bool
+intel_output_try_backlight(xf86OutputPtr output, const char *interface)
+{
+       struct intel_output *intel_output = output->driver_private;
+       char path[BACKLIGHT_PATH_LEN];
+       struct stat buf;
+
+       sprintf(path, "%s/%s", BACKLIGHT_CLASS, interface);
+       if (!stat(path, &buf)) {
+               intel_output->backlight_iface = interface;
+               intel_output->backlight_max = 
intel_output_backlight_get_max(output);
+               if (intel_output->backlight_max > 0) {
+                       intel_output->backlight_active_level = 
intel_output_backlight_get(output);
+                       xf86DrvMsg(output->scrn->scrnIndex, X_INFO,
+                                  "found backlight control interface %s\n", 
path);
+                       return TRUE;
+               }
+       }
+       return FALSE;
+}
+
 static void
 intel_output_backlight_init(xf86OutputPtr output)
 {
        struct intel_output *intel_output = output->driver_private;
+       intel_screen_private *intel = intel_get_screen_private(output->scrn);
        int i;
 
+       if (xf86ReturnOptValBool(intel->Options, OPTION_INTEL_BACKLIGHT, 
FALSE)) {
+               if (intel_output_try_backlight(output, "intel_backlight")) {
+                       return;
+               }
+       }
+
        for (i = 0; backlight_interfaces[i] != NULL; i++) {
-               char path[BACKLIGHT_PATH_LEN];
-               struct stat buf;
-
-               sprintf(path, "%s/%s", BACKLIGHT_CLASS, 
backlight_interfaces[i]);
-               if (!stat(path, &buf)) {
-                       intel_output->backlight_iface = backlight_interfaces[i];
-                       intel_output->backlight_max = 
intel_output_backlight_get_max(output);
-                       if (intel_output->backlight_max > 0) {
-                               intel_output->backlight_active_level = 
intel_output_backlight_get(output);
-                               xf86DrvMsg(output->scrn->scrnIndex, X_INFO,
-                                          "found backlight control interface 
%s\n", path);
-                               return;
-                       }
+               if (intel_output_try_backlight(output, 
backlight_interfaces[i])) {
+                       return;
                }
        }
        intel_output->backlight_iface = NULL;
diff --git a/src/intel_options.c b/src/intel_options.c
index 7dbbc7e..c15b661 100644
--- a/src/intel_options.c
+++ b/src/intel_options.c
@@ -15,7 +15,8 @@ const OptionInfoRec intel_options[] = {
        {OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,      {0},    
1},
        {OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, 0},
        {OPTION_HOTPLUG,        "HotPlug",      OPTV_BOOLEAN,   {0},    1},
-       {OPTION_RELAXED_FENCING,"RelaxedFencing",       OPTV_BOOLEAN,   {0},    
1},
+       {OPTION_RELAXED_FENCING,    "RelaxedFencing",   OPTV_BOOLEAN,   {0},    
1},
+    {OPTION_INTEL_BACKLIGHT,    "IntelBacklight",   OPTV_BOOLEAN,   {0},    0},
 #ifdef INTEL_XVMC
        {OPTION_XVMC,   "XvMC",         OPTV_BOOLEAN,   {0},    1},
 #endif
diff --git a/src/intel_options.h b/src/intel_options.h
index 6c16a07..0d6f4f6 100644
--- a/src/intel_options.h
+++ b/src/intel_options.h
@@ -22,6 +22,7 @@ enum intel_options {
        OPTION_PREFER_OVERLAY,
        OPTION_HOTPLUG,
        OPTION_RELAXED_FENCING,
+    OPTION_INTEL_BACKLIGHT,
 #ifdef INTEL_XVMC
        OPTION_XVMC,
 #endif
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to