*/
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;
{
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;
}
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);
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;
#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"
.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)
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;
}
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);