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; }
pgp0hhmWznWgc.pgp
Description: PGP signature