diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index eb114f8d39e7..c4ad76ee7b5f 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); } 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 ac7dd4eaebd0..35003e4f1316 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 67186e6ca28d..9f8ccf9f590d 100644 --- a/drivers/platform/x86/eeepc-wmi.c +++ b/drivers/platform/x86/eeepc-wmi.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include "asus-wmi.h" @@ -98,8 +99,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) @@ -111,10 +117,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; } @@ -202,6 +210,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);