lkml.org 
[lkml]   [2009]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 49/56] ACPI: video: Fix reversed brightness behavior on ThinkPad SL series
    2.6.27-stable review patch.  If anyone has any objections, please let us know.
    ------------------

    From: Zhang Rui <rui.zhang@intel.com>

    commit 935e5f290ec1eb0f1c15004421f5fd3154380fd5 upstream.

    Section B.6.2 of ACPI 3.0b specification that defines _BCL method
    doesn't require the brightness levels returned to be sorted.
    At least ThinkPad SL300 (and probably all IdeaPads) returns the
    array reversed (i.e. bightest levels have lowest indexes), which
    causes the brightness management behave in completely reversed
    manner on these machines (brightness increases when the laptop is
    idle, while the display dims when used).

    Sorting the array by brightness level values after reading the list
    fixes the issue.

    http://bugzilla.kernel.org/show_bug.cgi?id=12037

    Signed-off-by: Zhang Rui <rui.zhang@intel.com>
    Tested-by: Lubomir Rintel <lkundrak@v3.sk>
    Signed-off-by: Len Brown <len.brown@intel.com>
    Signed-off-by: Thomas Renninger <trenn@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/acpi/video.c | 15 +++++++++++++++
    1 file changed, 15 insertions(+)

    --- a/drivers/acpi/video.c
    +++ b/drivers/acpi/video.c
    @@ -36,6 +36,7 @@
    #include <linux/backlight.h>
    #include <linux/thermal.h>
    #include <linux/video_output.h>
    +#include <linux/sort.h>
    #include <asm/uaccess.h>

    #include <acpi/acpi_bus.h>
    @@ -632,6 +633,16 @@ acpi_video_bus_DOS(struct acpi_video_bus
    }

    /*
    + * Simple comparison function used to sort backlight levels.
    + */
    +
    +static int
    +acpi_video_cmp_level(const void *a, const void *b)
    +{
    + return *(int *)a - *(int *)b;
    +}
    +
    +/*
    * Arg:
    * device : video output device (LCD, CRT, ..)
    *
    @@ -682,6 +693,10 @@ acpi_video_init_brightness(struct acpi_v
    count++;
    }

    + /* don't sort the first two brightness levels */
    + sort(&br->levels[2], count - 2, sizeof(br->levels[2]),
    + acpi_video_cmp_level, NULL);
    +
    if (count < 2)
    goto out_free_levels;



    \
     
     \ /
      Last update: 2009-02-11 01:49    [W:0.024 / U:60.432 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site