mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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: João Paulo Rechi Vita <jprvita@endlessm.com>
Reviewed-by: Corentin Chary <corentin.chary@gmail.com>
Signed-off-by: Darren Hart <dvhart@linux.intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									2c1a49c961
								
							
						
					
					
						commit
						a977e59c0c
					
				
					 3 changed files with 19 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -78,6 +78,10 @@ static struct quirk_entry quirk_asus_x200ca = {
 | 
			
		|||
	.wapf = 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct quirk_entry quirk_no_rfkill = {
 | 
			
		||||
	.no_rfkill = true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int dmi_matched(const struct dmi_system_id *dmi)
 | 
			
		||||
{
 | 
			
		||||
	quirks = dmi->driver_data;
 | 
			
		||||
| 
						 | 
				
			
			@ -306,6 +310,15 @@ static const struct dmi_system_id asus_quirks[] = {
 | 
			
		|||
		},
 | 
			
		||||
		.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)
 | 
			
		|||
	if (err)
 | 
			
		||||
		goto fail_leds;
 | 
			
		||||
 | 
			
		||||
	err = asus_wmi_rfkill_init(asus);
 | 
			
		||||
	if (err)
 | 
			
		||||
		goto fail_rfkill;
 | 
			
		||||
	if (!asus->driver->quirks->no_rfkill) {
 | 
			
		||||
		err = asus_wmi_rfkill_init(asus);
 | 
			
		||||
		if (err)
 | 
			
		||||
			goto fail_rfkill;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Some Asus desktop boards export an acpi-video backlight interface,
 | 
			
		||||
	   stop this from showing up */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,7 @@ struct key_entry;
 | 
			
		|||
struct asus_wmi;
 | 
			
		||||
 | 
			
		||||
struct quirk_entry {
 | 
			
		||||
	bool no_rfkill;
 | 
			
		||||
	bool hotplug_wireless;
 | 
			
		||||
	bool scalar_panel_brightness;
 | 
			
		||||
	bool store_backlight_power;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue