Re: [PATCH 2/2 v4] asus-wmi: store backlight power status for AIO machine

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

 



On Mon, Mar 19, 2012 at 10:46 AM, AceLan Kao <acelan.kao@xxxxxxxxxxxxx> wrote:
> Due to some implementation reasons, ASUS ET2012 All-in-One machines
> can't report the correct backlight power status, it will always return
> 1. To track the backlight power status correctly, we have to store the
> status by ourselves.
>
> BTW, by the BIOS design, the backlight power will be turn on/off
> sequently, no matter what the value of the parameter will be.
> More over, the brightness adjustment command will turn on the backlight
> power. Those behaviors will make us fail to track the backlight power
> status.
> For example, While we are trying to turn on the backlight power,
> we will send out the brightness adjustment command and then trying to
> figure out if we have to turn on the backlight power, then send out
> the command. But, the real case is that, the backlight power turns on
> while sending the brightness adjustment command, and then we send out
> the command to turn on the backlight power, it actually will turn off
> the backlight power and the backlight power status we recorded becomes
> wrong. So, we have to seperate these two commands by a if statement.
>
> Signed-off-by: AceLan Kao <acelan.kao@xxxxxxxxxxxxx>
> ---
>  drivers/platform/x86/asus-wmi.c  |   33 ++++++++++++++++++++-------------
>  drivers/platform/x86/asus-wmi.h  |    2 ++
>  drivers/platform/x86/eeepc-wmi.c |   15 ++++++++++++---
>  3 files changed, 34 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
> index ea80fbe..9cd459a 100644
> --- a/drivers/platform/x86/asus-wmi.c
> +++ b/drivers/platform/x86/asus-wmi.c
> @@ -1076,7 +1076,12 @@ static int asus_wmi_hwmon_init(struct asus_wmi *asus)
>  */
>  static int read_backlight_power(struct asus_wmi *asus)
>  {
> -       int ret = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_BACKLIGHT);
> +       int ret;
> +       if (asus->driver->quirks->store_backlight_power)
> +               ret = !asus->driver->panel_power;
> +       else
> +               ret = asus_wmi_get_devstate_simple(asus,
> +                                                  ASUS_WMI_DEVID_BACKLIGHT);
>
>        if (ret < 0)
>                return ret;
> @@ -1138,24 +1143,23 @@ static int update_bl_status(struct backlight_device *bd)
>  {
>        struct asus_wmi *asus = bl_get_data(bd);
>        u32 ctrl_param;
> -       int power, err;
> -
> -       if (asus->driver->quirks->scalar_panel_brightness)
> -               ctrl_param = get_scalar_command(bd);
> -       else
> -               ctrl_param = bd->props.brightness;
> -
> -       err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
> -                                   ctrl_param, NULL);
> -
> -       if (err < 0)
> -               return err;
> +       int power, err = 0;
>
>        power = read_backlight_power(asus);
>        if (power != -ENODEV && bd->props.power != power) {
>                ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
>                err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
>                                            ctrl_param, NULL);
> +               if (asus->driver->quirks->store_backlight_power)
> +                       asus->driver->panel_power = bd->props.power;
> +       } else {
> +               if (asus->driver->quirks->scalar_panel_brightness)
> +                       ctrl_param = get_scalar_command(bd);
> +               else
> +                       ctrl_param = bd->props.brightness;
> +
> +               err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
> +                                           ctrl_param, NULL);
>        }

Something I didn't notice, why is this moved in an "else" ?
Does this break something on your hardware ?

>        return err;
>  }
> @@ -1217,6 +1221,9 @@ static int asus_wmi_backlight_init(struct asus_wmi *asus)
>
>        asus->backlight_device = bd;
>
> +       if (asus->driver->quirks->store_backlight_power)
> +               asus->driver->panel_power = power;
> +
>        bd->props.brightness = read_brightness(bd);
>        bd->props.power = power;
>        backlight_update_status(bd);
> diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h
> index ac7dd4e..35003e4 100644
> --- a/drivers/platform/x86/asus-wmi.h
> +++ b/drivers/platform/x86/asus-wmi.h
> @@ -38,11 +38,13 @@ struct asus_wmi;
>  struct quirk_entry {
>        bool hotplug_wireless;
>        bool scalar_panel_brightness;
> +       bool store_backlight_power;
>  };
>
>  struct asus_wmi_driver {
>        int                     wapf;
>        int                     brightness;
> +       int                     panel_power;
>
>        const char              *name;
>        struct module           *owner;
> diff --git a/drivers/platform/x86/eeepc-wmi.c b/drivers/platform/x86/eeepc-wmi.c
> index 6f60ef0..d3742c2 100644
> --- a/drivers/platform/x86/eeepc-wmi.c
> +++ b/drivers/platform/x86/eeepc-wmi.c
> @@ -32,6 +32,7 @@
>  #include <linux/input.h>
>  #include <linux/input/sparse-keymap.h>
>  #include <linux/dmi.h>
> +#include <linux/fb.h>
>  #include <acpi/acpi_bus.h>
>
>  #include "asus-wmi.h"
> @@ -95,8 +96,13 @@ static struct quirk_entry quirk_asus_1000h = {
>        .hotplug_wireless = true,
>  };
>
> +static struct quirk_entry quirk_asus_et2012_type1 = {
> +       .store_backlight_power = true,
> +};
> +
>  static struct quirk_entry quirk_asus_et2012_type3 = {
>        .scalar_panel_brightness = true,
> +       .store_backlight_power = true,
>  };
>
>  static int dmi_matched(const struct dmi_system_id *dmi)
> @@ -108,10 +114,12 @@ static int dmi_matched(const struct dmi_system_id *dmi)
>        if (unlikely(strncmp(model, "ET2012", 6) == 0)) {
>                const struct dmi_device *dev = NULL;
>                char oemstring[30];
> -               while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL,
> -                                             dev))) {
> +               while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
> +                                             NULL, dev))) {
>                        if (sscanf(dev->name, "AEMS%24c", oemstring) == 1) {
> -                               if (oemstring[18] == '3')
> +                               if (oemstring[18] == '1')
> +                                       quirks = &quirk_asus_et2012_type1;
> +                               else if (oemstring[18] == '3')
>                                        quirks = &quirk_asus_et2012_type3;
>                                break;
>                        }
> @@ -199,6 +207,7 @@ static int eeepc_wmi_probe(struct platform_device *pdev)
>  static void eeepc_wmi_quirks(struct asus_wmi_driver *driver)
>  {
>        driver->wapf = -1;
> +       driver->panel_power = FB_BLANK_UNBLANK;
>        driver->quirks = &quirk_asus_unknown;
>        driver->quirks->hotplug_wireless = hotplug_wireless;
>        dmi_check_system(asus_quirks);
> --
> 1.7.9.1
>



-- 
Corentin Chary
http://xf.iksaif.net
--
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