Commit f70ac0e9 authored by Danny Kukawka's avatar Danny Kukawka Committed by Len Brown

ACPI video: Don't export sysfs backlight interface if query _BCL fail

Currently the acpi video module export the backlight interface to sysfs
also if acpi_video_device_lcd_query_levels() fails to read _BLC method
(e.g.  because the method is not available).  In this case the userspace
don't know which brightness level are supported and can't set a brightness
level (echo return with: "write error: Invalid Argument").  This happend
e.g.  on a ASUS RF1 (correct supported by the asus-laptop module).

The video module should not export the backlight interface if query _BLC fail,
because you can't set anything from userspace and this make it useless.

http://bugzilla.kernel.org/show_bug.cgi?id=8375Signed-off-by: default avatarDanny Kukawka <dkukawka@suse.de>
Acked-by: default avatarLuming Yu <luming.yu@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 23b0f015
...@@ -559,7 +559,6 @@ acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) ...@@ -559,7 +559,6 @@ acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
static void acpi_video_device_find_cap(struct acpi_video_device *device) static void acpi_video_device_find_cap(struct acpi_video_device *device)
{ {
acpi_integer status;
acpi_handle h_dummy1; acpi_handle h_dummy1;
int i; int i;
u32 max_level = 0; u32 max_level = 0;
...@@ -593,50 +592,55 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) ...@@ -593,50 +592,55 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
device->cap._DSS = 1; device->cap._DSS = 1;
} }
status = acpi_video_device_lcd_query_levels(device, &obj); if (ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) {
if (obj && obj->type == ACPI_TYPE_PACKAGE && obj->package.count >= 2) { if (obj->package.count >= 2) {
int count = 0; int count = 0;
union acpi_object *o; union acpi_object *o;
br = kzalloc(sizeof(*br), GFP_KERNEL); br = kzalloc(sizeof(*br), GFP_KERNEL);
if (!br) { if (!br) {
printk(KERN_ERR "can't allocate memory\n"); printk(KERN_ERR "can't allocate memory\n");
} else {
br->levels = kmalloc(obj->package.count *
sizeof *(br->levels), GFP_KERNEL);
if (!br->levels)
goto out;
for (i = 0; i < obj->package.count; i++) {
o = (union acpi_object *)&obj->package.
elements[i];
if (o->type != ACPI_TYPE_INTEGER) {
printk(KERN_ERR PREFIX "Invalid data\n");
continue;
}
br->levels[count] = (u32) o->integer.value;
if (br->levels[count] > max_level)
max_level = br->levels[count];
count++;
}
out:
if (count < 2) {
kfree(br->levels);
kfree(br);
} else { } else {
br->count = count; br->levels = kmalloc(obj->package.count *
device->brightness = br; sizeof *(br->levels), GFP_KERNEL);
ACPI_DEBUG_PRINT((ACPI_DB_INFO, if (!br->levels)
"found %d brightness levels\n", goto out;
count));
for (i = 0; i < obj->package.count; i++) {
o = (union acpi_object *)&obj->package.
elements[i];
if (o->type != ACPI_TYPE_INTEGER) {
printk(KERN_ERR PREFIX "Invalid data\n");
continue;
}
br->levels[count] = (u32) o->integer.value;
if (br->levels[count] > max_level)
max_level = br->levels[count];
count++;
}
out:
if (count < 2) {
kfree(br->levels);
kfree(br);
} else {
br->count = count;
device->brightness = br;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"found %d brightness levels\n",
count));
}
} }
} }
} else {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available LCD brightness level\n"));
} }
kfree(obj); kfree(obj);
if (device->cap._BCL && device->cap._BCM && device->cap._BQC){ if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){
unsigned long tmp; unsigned long tmp;
static int count = 0; static int count = 0;
char *name; char *name;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment