Re: [PATCH] Rationalise ACPI backlight implementation

From: Zhang Rui
Date: Tue Jan 22 2008 - 03:28:19 EST


On Wed, 2007-12-26 at 02:03 +0000, Matthew Garrett wrote:
> The sysfs backlight class provides no mechanism for querying the
> acceptable brightness for a backlight. The ACPI spec states that values
> are only valid if they are reported as available by the firmware. Since
> we can't provide that information to userspace, instead collapse the
> range to the number of actual values that can be set.
>
There is another patch which round the bd->props.brightness to the
nearest but larger acceptable brightness level.
Please refer to http://bugzilla.kernel.org/show_bug.cgi?id=9277

I have no obvious objection on either of these two proposals.
But one thing to mention is that
both of these two patches is written on the assumption that the
brightness levels listed in _BCL method are in ascending order, while
this is not stated in the ACPI spec.
Is this a problem?

Thanks,
Rui

> Signed-off-by: Matthew Garrett <mjg59@xxxxxxxxxxxxx>
>
> ---
>
> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
> index 521645e..12b2adb 100644
> --- a/drivers/acpi/video.c
> +++ b/drivers/acpi/video.c
> @@ -296,18 +296,26 @@ static int acpi_video_device_set_state(struct acpi_video_device *device, int sta
> static int acpi_video_get_brightness(struct backlight_device *bd)
> {
> unsigned long cur_level;
> + int i;
> struct acpi_video_device *vd =
> (struct acpi_video_device *)bl_get_data(bd);
> acpi_video_device_lcd_get_level_current(vd, &cur_level);
> - return (int) cur_level;
> + for (i=2; i<vd->brightness->count; i++) {
> + if (vd->brightness->levels[i] == cur_level)
> + /* The first two entries are special - see page 575
> + of the ACPI spec 3.0 */
> + return i-2;
> + }
> + return 0;
> }
>
> static int acpi_video_set_brightness(struct backlight_device *bd)
> {
> - int request_level = bd->props.brightness;
> + int request_level = bd->props.brightness+2;
> struct acpi_video_device *vd =
> (struct acpi_video_device *)bl_get_data(bd);
> - acpi_video_device_lcd_set_level(vd, request_level);
> + acpi_video_device_lcd_set_level(vd,
> + vd->brightness->levels[request_level]);
> return 0;
> }
>
> @@ -656,7 +664,6 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
> kfree(obj);
>
> if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){
> - unsigned long tmp;
> static int count = 0;
> char *name;
> name = kzalloc(MAX_NAME_LEN, GFP_KERNEL);
> @@ -664,11 +671,10 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
> return;
>
> sprintf(name, "acpi_video%d", count++);
> - acpi_video_device_lcd_get_level_current(device, &tmp);
> device->backlight = backlight_device_register(name,
> NULL, device, &acpi_backlight_ops);
> - device->backlight->props.max_brightness = max_level;
> - device->backlight->props.brightness = (int)tmp;
> + device->backlight->props.max_brightness = device->brightness->count-3;
> + device->backlight->props.brightness = acpi_video_get_brightness(device->backlight);
> backlight_update_status(device->backlight);
>
> kfree(name);
>

--
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/