Re: [PATCH] Platform: Brightness quirk for samsung laptop driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Aug 26, 2011 at 11:58 AM, Jason Stubbs <jasonbstubbs@xxxxxxxxx> wrote:
> From: Jason Stubbs <jasonbstubbs@xxxxxxxxx>
>
> On some Samsung laptops the brightness regulation works slightly different.
> All SABI commands except for set_brightness work as expected. The behaviour
> of set_brightness is as follows:
>
> - Setting a new brightness will only step one level toward the new brightness
>  level. For example, setting a level of 5 when the current level is 2 will
>  result in a brightness level of 3.
> - A spurious KEY_BRIGHTNESS_UP or KEY_BRIGHTNESS_DOWN event is also generated
>  along with the change in brightness.
> - Neither of the above two issues occur when changing from/to brightness
>  level 0.
>
> This patch adds detection and a non-intrusive workaround for the above issues.
>
> Signed-off-by: Jason Stubbs <jasonbstubbs@xxxxxxxxx>
>
> ---
>
> diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c
> index ee68c1c..b193bf0 100644
> --- a/drivers/platform/x86/samsung-laptop.c
> +++ b/drivers/platform/x86/samsung-laptop.c
> @@ -226,6 +226,7 @@ static struct backlight_device *backlight_device;
>  static struct mutex sabi_mutex;
>  static struct platform_device *sdev;
>  static struct rfkill *rfk;
> +static bool has_stepping_quirk;
>
>  static int force;
>  module_param(force, bool, 0);
> @@ -382,6 +383,17 @@ static void set_brightness(u8 user_brightness)
>  {
>        u8 user_level = user_brightness + sabi_config->min_brightness;
>
> +       if (has_stepping_quirk && user_level != 0) {
> +               /*
> +                * short circuit if the specified level is what's already set
> +                * to prevent the screen from flickering needlessly
> +                */
> +               if (user_brightness == read_brightness())
> +                       return;
> +
> +               sabi_set_command(sabi_config->commands.set_brightness, 0);
> +       }
> +
>        sabi_set_command(sabi_config->commands.set_brightness, user_level);
>  }
>
> @@ -390,6 +402,34 @@ static int get_brightness(struct backlight_device *bd)
>        return (int)read_brightness();
>  }
>
> +static void check_for_stepping_quirk(void)
> +{
> +       u8 initial_level = read_brightness();
> +       u8 check_level;
> +
> +       /*
> +        * Some laptops exhibit the strange behaviour of stepping toward
> +        * (rather than setting) the brightness except when changing to/from
> +        * brightness level 0. This behaviour is checked for here and worked
> +        * around in set_brightness.
> +        */
> +
> +       if (initial_level <= 2)
> +               check_level = initial_level + 2;
> +       else
> +               check_level = initial_level - 2;
> +
> +       has_stepping_quirk = false;
> +       set_brightness(check_level);
> +
> +       if (read_brightness() != check_level) {
> +               has_stepping_quirk = true;
> +               pr_info("enabled workaround for brightness stepping quirk\n");
> +       }
> +
> +       set_brightness(initial_level);
> +}
> +
>  static int update_status(struct backlight_device *bd)
>  {
>        set_brightness(bd->props.brightness);
> @@ -796,6 +836,9 @@ static int __init samsung_init(void)
>                }
>        }
>
> +       /* Check for stepping quirk */
> +       check_for_stepping_quirk();
> +
>        /* knock up a platform device to hang stuff off of */
>        sdev = platform_device_register_simple("samsung", -1, NULL, 0);
>        if (IS_ERR(sdev))
>
>

Thank you, Jason.
Tested-by: David Herrmann <dh.herrmann@xxxxxxxxxxxxxx>

And Greg, could you actually "git add" the new samsung patches in your
repository? You added them to "series" but didn't submit the actual
patch files. That would be great.

Thank you and cheers
David
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux