package xserver-xorg-video-intel
tags 651741 + patch
quit

Kalle Olavi Niemitalo <k...@iki.fi> writes:

> (b) PCI subsystem.  Here, lspci -vn shows:
>
>     00:02.0 0300: 8086:0046 (rev 02) (prog-if 00 [VGA controller])
>             Subsystem: 104d:907c
>
>     intel_driver.h defines the SUBVENDOR_ID and SUBSYS_ID macros,
>     which intel_output_backlight_init could use on
>     intel_get_screen_private(output->scrn)->PciInfo.

I implemented this in the following patch.  It makes
xserver-xorg-video-intel correctly use intel_backlight on
my Sony VAIO VPCYA1V9E, so that gnome-power-manager can then
control the brightness.  I have not tested on other computers,
especially not on other VAIO models.

Perhaps the upstream maintainer will eventually choose a
different solution; but until then, I think including this patch
in the Debian package would help VAIO users.

Index: xserver-xorg-video-intel-2.17.0/src/intel_display.c
===================================================================
--- xserver-xorg-video-intel-2.17.0.orig/src/intel_display.c    2012-01-15 
15:38:03.000000000 +0200
+++ xserver-xorg-video-intel-2.17.0/src/intel_display.c 2012-01-15 
15:56:32.000000000 +0200
@@ -118,7 +118,8 @@
 #define BACKLIGHT_CLASS "/sys/class/backlight"
 
 /*
- * List of available kernel interfaces in priority order
+ * List of available kernel interfaces in priority order.
+ * May be overridden by a model-specific workaround.
  */
 static const char *backlight_interfaces[] = {
        "asus-laptop",
@@ -240,28 +241,55 @@
        return max;
 }
 
+static Bool
+intel_output_backlight_probe(xf86OutputPtr output, const char *iface)
+{
+       struct intel_output *intel_output = output->driver_private;
+       char path[BACKLIGHT_PATH_LEN];
+       struct stat buf;
+
+       sprintf(path, "%s/%s", BACKLIGHT_CLASS, iface);
+       if (!stat(path, &buf)) {
+               intel_output->backlight_iface = iface;
+               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;
 
-       for (i = 0; backlight_interfaces[i] != NULL; i++) {
-               char path[BACKLIGHT_PATH_LEN];
-               struct stat buf;
+       /* Debian bug 651741: With Linux 3.1.0 on Sony VAIO VPCYA1V9E,
+        * both acpi_video0 and intel_backlight exist and can be
+        * adjusted, but only intel_backlight affects the display.
+        */
+       if (VENDOR_ID(intel->PciInfo) == 0x8086 /* Intel */
+           && DEVICE_ID(intel->PciInfo) == PCI_CHIP_IRONLAKE_M_G
+           && CHIP_REVISION(intel->PciInfo) == 0x02
+           && SUBVENDOR_ID(intel->PciInfo) == 0x104d /* Sony */
+           && SUBSYS_ID(intel->PciInfo) == 0x907c) {
+               xf86DrvMsg(output->scrn->scrnIndex, X_INFO,
+                          "will prefer intel_backlight on this Sony VAIO 
model\n");
+               if (intel_output_backlight_probe(output, "intel_backlight"))
+                       return;
+       }
 
-               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;
-                       }
-               }
+       for (i = 0; backlight_interfaces[i] != NULL; i++) {
+               if (intel_output_backlight_probe(output, 
backlight_interfaces[i]))
+                       return;
        }
+
        intel_output->backlight_iface = NULL;
 }
 

Attachment: pgpOZ7AnesZmm.pgp
Description: PGP signature

Reply via email to