Hi, Is it what you want? And I don't remember we have suffered this issue before. We have many duplicate brightness events issues, but for the display toggle, I think it's the first time we met it. Best regards, AceLan Kao. 2012/9/18 AceLan Kao <acelan.kao@xxxxxxxxxxxxx>: > For machines with AMD graphic chips, it will send out WMI event and ACPI > interrupt at the same time while hitting the hotkey. BIOS will notify the > system the next display output mode throught WMI event code, so that > windows' application can show an OSD to tell the user which mode will be > taken effect. User can hit the display toggle key many times within 2 > seconds to choose the mode they want. After 2 seconds, WMI dirver should > send a WMIMethod(SDSP) command to tell the BIOS which mode the user chose. > And then BIOS will raise another ACPI interrupt to tell the system to > really switch the display mode. > > In Linux desktop, we don't have this kind of OSD to let users to choose > the mode they want, so we don't need to call WMIMethod(SDSP) to have > another ACPI interrupt. To simplify the problem, we just have to ignore > the WMI event, and let the first ACPI interrupt to send out the key event. > > For the need, here comes another quirk to add machines with this kind of > behavior. When the WMI driver receives the display toggle WMI event, and > found the machin is in the list, it will do nothing and let ACPI video > driver to report the key event. > > Signed-off-by: AceLan Kao <acelan.kao@xxxxxxxxxxxxx> > --- > drivers/platform/x86/asus-nb-wmi.c | 31 ++++++++++++++++++++++++++++++- > drivers/platform/x86/asus-wmi.c | 20 ++++++++++++++++++++ > drivers/platform/x86/asus-wmi.h | 7 +++++++ > 3 files changed, 57 insertions(+), 1 deletion(-) > > diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c > index 6b0ebde..8da51cf 100644 > --- a/drivers/platform/x86/asus-nb-wmi.c > +++ b/drivers/platform/x86/asus-nb-wmi.c > @@ -59,6 +59,17 @@ static struct quirk_entry quirk_asus_unknown = { > .wapf = 0, > }; > > +/* > + * For those machines that need software to control bt/wifi status > + * and can't adjust brightness through ACPI interface > + * and have duplicate events(ACPI and WMI) for display toggle > + */ > +static struct quirk_entry quirk_asus_x55u = { > + .wapf = 4, > + .wmi_backlight_power = true, > + .no_display_toggle = true, > +}; > + > static struct quirk_entry quirk_asus_x401u = { > .wapf = 4, > }; > @@ -77,6 +88,15 @@ static struct dmi_system_id asus_quirks[] = { > DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), > DMI_MATCH(DMI_PRODUCT_NAME, "X401U"), > }, > + .driver_data = &quirk_asus_x55u, > + }, > + { > + .callback = dmi_matched, > + .ident = "ASUSTeK COMPUTER INC. X401A", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), > + DMI_MATCH(DMI_PRODUCT_NAME, "X401A"), > + }, > .driver_data = &quirk_asus_x401u, > }, > { > @@ -95,6 +115,15 @@ static struct dmi_system_id asus_quirks[] = { > DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), > DMI_MATCH(DMI_PRODUCT_NAME, "X501U"), > }, > + .driver_data = &quirk_asus_x55u, > + }, > + { > + .callback = dmi_matched, > + .ident = "ASUSTeK COMPUTER INC. X501A", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), > + DMI_MATCH(DMI_PRODUCT_NAME, "X501A"), > + }, > .driver_data = &quirk_asus_x401u, > }, > { > @@ -131,7 +160,7 @@ static struct dmi_system_id asus_quirks[] = { > DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), > DMI_MATCH(DMI_PRODUCT_NAME, "X55U"), > }, > - .driver_data = &quirk_asus_x401u, > + .driver_data = &quirk_asus_x55u, > }, > { > .callback = dmi_matched, > diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c > index 18f5169..9598f62 100644 > --- a/drivers/platform/x86/asus-wmi.c > +++ b/drivers/platform/x86/asus-wmi.c > @@ -1341,6 +1341,23 @@ static void asus_wmi_backlight_exit(struct asus_wmi *asus) > asus->backlight_device = NULL; > } > > +static int is_display_toggle(int code) > +{ > + /* display toggle keys */ > + if ((code >= 0x61 && code <= 0x67) || > + (code >= 0x8c && code <= 0x93) || > + (code >= 0xa0 && code <= 0xa7) || > + (code >= 0xd0 && code <= 0xd5)) > + return 1; > + > + return 0; > +} > + > +static void do_nothing(void) > +{ > + return; > +} > + > static void asus_wmi_notify(u32 value, void *context) > { > struct asus_wmi *asus = context; > @@ -1382,6 +1399,9 @@ 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 (is_display_toggle(code) && > + asus->driver->quirks->no_display_toggle) { > + do_nothing(); > } else if (!sparse_keymap_report_event(asus->inputdev, code, > key_value, autorelease)) > pr_info("Unknown key %x pressed\n", code); > diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h > index 4c9bd38..776524c 100644 > --- a/drivers/platform/x86/asus-wmi.h > +++ b/drivers/platform/x86/asus-wmi.h > @@ -41,6 +41,13 @@ struct quirk_entry { > bool store_backlight_power; > bool wmi_backlight_power; > int wapf; > + /* > + * For machines with AMD graphic chips, it will send out WMI event > + * and ACPI interrupt at the same time while hitting the hotkey. > + * To simplify the problem, we just have to ignore the WMI event, > + * and let the ACPI interrupt to send out the key event. > + */ > + int no_display_toggle; > }; > > struct asus_wmi_driver { > -- > 1.7.10.4 > -- 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