Ryan May wrote:
> Ryan May wrote:
>> Hi,
>>
>> I recently updated the BIOS on my HP Pavilion dv2125nr laptop to F.34
>> (to enable the virtualization instructions).  Since I did this, the Fn
>> keys to control brightness have failed to work properly under Linux,
>> though they work fine before booting (ie. at Grub).  Hitting the Fn keys
>> caused the brightness to change to the minimum possible.  In fact,
>> /proc/acpi/video/VGA/LCD/brightness would show that the level was set to
>> 0 (though 20 was the lowest available).  I was still able to control the
>> brightness manually via /proc interface however.
>>
>> My investigations seem to indicate that HP, in their wisdom, seem to
>> have removed the _BQC method from their BIOS code.  It seems that the
>> ACPI code in Linux that handles the key events to change the brightness
>> use the _BQC method without checking for success, which explains why the
>> level being set was garbage.  However, the /proc interface for
>> brightness seems to only use device->brightness->curr to get the current
>> level.
>>
>> The attached patch, which I'm sure isn't correct, fixes my problems by
>> making use of the brightness->curr field to track the current brightness.
>>
>> I'd love to know your opinion(s) on the problem and a proper fix
>> (including perhaps sysfs backlight support?).
>>
>> Thanks,
>>
>> Ryan
>>
>>
> 
> Just a bump here to see if anyone can help me get my (admittedly) broken
> HP backlight working in a stock kernel.  I have a patch (attached) that
> fixes my problem, though I am by no means a kernel hacker.
> 
> Any help would be greatly appreciated.
> 
> Thanks,
> 
> Ryan
Video.c has flags showing presence or absence of _BQC, etc. Updated your patch 
to use these.
Also, patch conforms (mostly) to patch guidelines :)
Regards,
Alex.




[PATCH] ACPI: video: Don't call absent methods

From: Alexey Starikovskiy <[EMAIL PROTECTED]>

Signed-off-by: Ryan May <rmay.ou.edu>
Signed-off-by: Alexey Starikovskiy <[EMAIL PROTECTED]>
---

 drivers/acpi/video.c |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index 3c9bb85..83aa41c 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -409,14 +409,16 @@ acpi_video_device_lcd_query_levels(struct acpi_video_device *device,
 static int
 acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
 {
-	int status;
+	int status = AE_OK;
 	union acpi_object arg0 = { ACPI_TYPE_INTEGER };
 	struct acpi_object_list args = { 1, &arg0 };
 
 
 	arg0.integer.value = level;
-	status = acpi_evaluate_object(device->dev->handle, "_BCM", &args, NULL);
-
+	if (device->cap._BCM)
+		status = acpi_evaluate_object(device->dev->handle, "_BCM",
+					      &args, NULL);
+	device->brightness->curr = level;
 	printk(KERN_DEBUG "set_level status: %x\n", status);
 	return status;
 }
@@ -425,11 +427,11 @@ static int
 acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
 					unsigned long *level)
 {
-	int status;
-
-	status = acpi_evaluate_integer(device->dev->handle, "_BQC", NULL, level);
-
-	return status;
+	if (device->cap._BQC)
+		return acpi_evaluate_integer(device->dev->handle, "_BQC", NULL,
+					     level);
+	*level = device->brightness->curr;
+	return AE_OK;
 }
 
 static int

Reply via email to