Commit a977e59c authored by João Paulo Rechi Vita's avatar João Paulo Rechi Vita Committed by Darren Hart

asus-wmi: Create quirk for airplane_mode LED

Some Asus laptops that have an airplane-mode indicator LED, also have
the WMI WLAN user bit set, and the following bits in their DSDT:

Scope (_SB)
{
  (...)
  Device (ATKD)
  {
    (...)
    Method (WMNB, 3, Serialized)
    {
      (...)
      If (LEqual (IIA0, 0x00010002))
      {
        OWGD (IIA1)
        Return (One)
      }
    }
  }
}

So when asus-wmi uses ASUS_WMI_DEVID_WLAN_LED (0x00010002) to store the
wlan state, it drives the airplane-mode indicator LED (through the call
to OWGD) in an inverted fashion: the LED is ON when airplane mode is OFF
(since wlan is ON), and vice-versa.

This commit creates a quirk to not register a RFKill switch at all for
these laptops, to allow the asus-wireless driver to drive the airplane
mode LED correctly through the ASHS ACPI device. It also adds a match to
that quirk for the Asus X555UB, which is affected by this problem.
Signed-off-by: default avatarJoão Paulo Rechi Vita <jprvita@endlessm.com>
Reviewed-by: default avatarCorentin Chary <corentin.chary@gmail.com>
Signed-off-by: default avatarDarren Hart <dvhart@linux.intel.com>
parent 2c1a49c9
...@@ -78,6 +78,10 @@ static struct quirk_entry quirk_asus_x200ca = { ...@@ -78,6 +78,10 @@ static struct quirk_entry quirk_asus_x200ca = {
.wapf = 2, .wapf = 2,
}; };
static struct quirk_entry quirk_no_rfkill = {
.no_rfkill = true,
};
static int dmi_matched(const struct dmi_system_id *dmi) static int dmi_matched(const struct dmi_system_id *dmi)
{ {
quirks = dmi->driver_data; quirks = dmi->driver_data;
...@@ -306,6 +310,15 @@ static const struct dmi_system_id asus_quirks[] = { ...@@ -306,6 +310,15 @@ static const struct dmi_system_id asus_quirks[] = {
}, },
.driver_data = &quirk_asus_x200ca, .driver_data = &quirk_asus_x200ca,
}, },
{
.callback = dmi_matched,
.ident = "ASUSTeK COMPUTER INC. X555UB",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_PRODUCT_NAME, "X555UB"),
},
.driver_data = &quirk_no_rfkill,
},
{}, {},
}; };
......
...@@ -2069,9 +2069,11 @@ static int asus_wmi_add(struct platform_device *pdev) ...@@ -2069,9 +2069,11 @@ static int asus_wmi_add(struct platform_device *pdev)
if (err) if (err)
goto fail_leds; goto fail_leds;
err = asus_wmi_rfkill_init(asus); if (!asus->driver->quirks->no_rfkill) {
if (err) err = asus_wmi_rfkill_init(asus);
goto fail_rfkill; if (err)
goto fail_rfkill;
}
/* Some Asus desktop boards export an acpi-video backlight interface, /* Some Asus desktop boards export an acpi-video backlight interface,
stop this from showing up */ stop this from showing up */
......
...@@ -38,6 +38,7 @@ struct key_entry; ...@@ -38,6 +38,7 @@ struct key_entry;
struct asus_wmi; struct asus_wmi;
struct quirk_entry { struct quirk_entry {
bool no_rfkill;
bool hotplug_wireless; bool hotplug_wireless;
bool scalar_panel_brightness; bool scalar_panel_brightness;
bool store_backlight_power; bool store_backlight_power;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment