3.5.0-rc2 bisected regression: Can't change brightness on Vaio laptop

From: Carlos R. Mafra
Date: Sun Jun 10 2012 - 12:37:48 EST


Commit ea9f8856bd6d4 ("ACPI video: Harden video bus adding") breaks the
backlight controls on my Vaio laptop.

After this patch the folder /sys/class/backlight becomes empty and
I can't change the lcd brightness anymore.

This regression is present in v3.4.2 as well as in the current
v3.5.0-rc2.

I tried to manually revert that commit from v3.5.0-rc2, and the resulting
patch below fixes the issue for me.

My config is here:
http://www.damtp.cam.ac.uk/user/crm66/config-3.5-rc1

and the dmesg of v3.5.0-rc2 plus the patch below is here:
http://www.damtp.cam.ac.uk/user/crm66/dmesg_v3.5-rc2+patch.txt

diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index a576575..4612b1c 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -548,27 +548,27 @@ acpi_video_device_EDID(struct acpi_video_device *device,
* 1. The system BIOS should NOT automatically control the brightness
* level of the LCD when the power changes from AC to DC.
* Return Value:
- * -EINVAL wrong arg.
+ * -1 wrong arg.
*/

static int
acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
{
- acpi_status status;
+ u64 status = 0;
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
struct acpi_object_list args = { 1, &arg0 };


- if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1)
- return -EINVAL;
+ if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1) {
+ status = -1;
+ goto Failed;
+ }
arg0.integer.value = (lcd_flag << 2) | bios_flag;
video->dos_setting = arg0.integer.value;
- status = acpi_evaluate_object(video->device->handle, "_DOS",
- &args, NULL);
- if (ACPI_FAILURE(status))
- return -EIO;
+ acpi_evaluate_object(video->device->handle, "_DOS", &args, NULL);

- return 0;
+ Failed:
+ return status;
}

/*
@@ -1343,17 +1343,15 @@ static int
acpi_video_bus_get_devices(struct acpi_video_bus *video,
struct acpi_device *device)
{
- int status;
+ int status = 0;
struct acpi_device *dev;

- status = acpi_video_device_enumerate(video);
- if (status)
- return status;
+ acpi_video_device_enumerate(video);

list_for_each_entry(dev, &device->children, node) {

status = acpi_video_bus_get_one_device(dev, video);
- if (status) {
+ if (ACPI_FAILURE(status)) {
printk(KERN_WARNING PREFIX
"Can't attach device\n");
continue;
@@ -1655,9 +1653,8 @@ static int acpi_video_bus_add(struct acpi_device *device)
mutex_init(&video->device_list_lock);
INIT_LIST_HEAD(&video->video_device_list);

- error = acpi_video_bus_get_devices(video, device);
- if (error)
- goto err_free_video;
+ acpi_video_bus_get_devices(video, device);
+ acpi_video_bus_start_devices(video);

video->input = input = input_allocate_device();
if (!input) {
@@ -1695,13 +1692,9 @@ static int acpi_video_bus_add(struct acpi_device *device)

video->pm_nb.notifier_call = acpi_video_resume;
video->pm_nb.priority = 0;
- error = register_pm_notifier(&video->pm_nb);
- if (error)
- goto err_stop_video;

- error = input_register_device(input);
- if (error)
- goto err_unregister_pm_notifier;
+ register_pm_notifier(&video->pm_nb);
+ input_register_device(input);

return 0;


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/