Dear Corentin, 2012/5/18 Corentin Chary <corentincj@xxxxxxxxxx>: > On Wed, May 16, 2012 at 11:39 AM, AceLan Kao <acelan.kao@xxxxxxxxxxxxx> wrote: >> BugLink: https://bugs.launchpad.net/bugs/1000146 >> >> Some h/w that can adjust screen brightness through ACPI functions, but >> can't turn on/off the backlight power correctly. So, we list those h/w in >> quirks and try to turn on/off the backlight power through WMI. >> Signed-off-by: AceLan Kao <acelan.kao@xxxxxxxxxxxxx> >> --- >> drivers/platform/x86/asus-wmi.c | 9 ++++++++- >> drivers/platform/x86/asus-wmi.h | 1 + >> drivers/platform/x86/eeepc-wmi.c | 23 +++++++++++++++++++++++ >> 3 files changed, 32 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c >> index 77aadde..beda7fc 100644 >> --- a/drivers/platform/x86/asus-wmi.c >> +++ b/drivers/platform/x86/asus-wmi.c >> @@ -69,6 +69,7 @@ MODULE_LICENSE("GPL"); >> #define NOTIFY_BRNDOWN_MAX 0x2e >> #define NOTIFY_KBD_BRTUP 0xc4 >> #define NOTIFY_KBD_BRTDWN 0xc5 >> +#define NOTIFY_BACKLIGHT_POWER 0xe9 >> >> /* WMI Methods */ >> #define ASUS_WMI_METHODID_SPEC 0x43455053 /* BIOS SPECification */ >> @@ -1288,6 +1289,11 @@ static void asus_wmi_notify(u32 value, void *context) >> if (code == NOTIFY_BRNUP_MIN || code == NOTIFY_BRNDOWN_MIN) { >> if (!acpi_video_backlight_support()) >> asus_wmi_backlight_notify(asus, orig_code); >> + } else if (asus->driver->quirks->wmi_backlight_power && >> + code == NOTIFY_BACKLIGHT_POWER) { >> + struct backlight_device *bd = asus->backlight_device; >> + bd->props.power = !bd->props.power; >> + backlight_update_status(bd); >> } else if (!sparse_keymap_report_event(asus->inputdev, code, >> key_value, autorelease)) >> pr_info("Unknown key %x pressed\n", code); >> @@ -1681,7 +1687,8 @@ static int asus_wmi_add(struct platform_device *pdev) >> if (err) >> goto fail_rfkill; >> >> - if (!acpi_video_backlight_support()) { >> + if (!acpi_video_backlight_support() || >> + asus->driver->quirks->wmi_backlight_power) { > > So you override any acpi_backlight=[vendor|video] settings ? That > doesn't looks right. > Can't you just send KEY_DISPLAYTOGGLE when the key is pressed, and let > userspace adjust the proper /sys/class/backlight file ? Userspace app, such as gnome-settings-daemon, will use /sys/class/backlight/acpi_video0 as it's first choice if there is one. But ACPI function to toggle the backlight power is not working, and from our BIOS engineer, ACPI doesn't define the backlight power section, but ASUS WMI does. So, I think it would have less problem to turn on/off backlight power through WMI. And, yes, calling asus_wmi_backlight_init() is not a good idea here. We have to record the backlight power status by ourselves if we didn't call it. Let me show you another version of patch later. > What does the key do exactly without driver ? Does it just send a > notification or does it also poke the hardware ? It's a WMI event notify, and will be mapped to the key shown below { KE_KEY, 0xe9, { KEY_BRIGHTNESS_ZERO } }, Just a notification. > > >> err = asus_wmi_backlight_init(asus); >> if (err && err != -ENODEV) >> goto fail_backlight; >> diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h >> index d43b667..9c1da8b 100644 >> --- a/drivers/platform/x86/asus-wmi.h >> +++ b/drivers/platform/x86/asus-wmi.h >> @@ -39,6 +39,7 @@ struct quirk_entry { >> bool hotplug_wireless; >> bool scalar_panel_brightness; >> bool store_backlight_power; >> + bool wmi_backlight_power; >> int wapf; >> }; >> >> diff --git a/drivers/platform/x86/eeepc-wmi.c b/drivers/platform/x86/eeepc-wmi.c >> index 6567613..8d31f4e 100644 >> --- a/drivers/platform/x86/eeepc-wmi.c >> +++ b/drivers/platform/x86/eeepc-wmi.c >> @@ -107,6 +107,11 @@ static struct quirk_entry quirk_asus_et2012_type3 = { >> .store_backlight_power = true, >> }; >> >> +static struct quirk_entry quirk_asus_x101ch = { >> + /* We need this when ACPI function doesn't do this well */ >> + .wmi_backlight_power = true, >> +}; >> + >> static struct quirk_entry *quirks; >> >> static void et2012_quirks(void) >> @@ -157,6 +162,24 @@ static struct dmi_system_id asus_quirks[] = { >> }, >> .driver_data = &quirk_asus_unknown, >> }, >> + { >> + .callback = dmi_matched, >> + .ident = "ASUSTeK Computer INC. X101CH", >> + .matches = { >> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), >> + DMI_MATCH(DMI_PRODUCT_NAME, "X101CH"), >> + }, >> + .driver_data = &quirk_asus_x101ch, >> + }, >> + { >> + .callback = dmi_matched, >> + .ident = "ASUSTeK Computer INC. 1015CX", >> + .matches = { >> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), >> + DMI_MATCH(DMI_PRODUCT_NAME, "1015CX"), >> + }, >> + .driver_data = &quirk_asus_x101ch, >> + }, >> {}, >> }; >> >> -- >> 1.7.9.5 >> >> -- >> 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 > > > > -- > 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 -- Chia-Lin Kao(AceLan) http://blog.acelan.idv.tw/ E-Mail: acelan.kaoATcanonical.com (s/AT/@/) -- 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