diff options
Diffstat (limited to 'drivers/platform/x86/asus-wmi.c')
| -rw-r--r-- | drivers/platform/x86/asus-wmi.c | 24 | 
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index 6f81b2844dcb..1038dfdcdd32 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -225,6 +225,7 @@ struct asus_wmi {  	int tablet_switch_event_code;  	u32 tablet_switch_dev_id; +	bool tablet_switch_inverted;  	enum fan_type fan_type;  	enum fan_type gpu_fan_type; @@ -493,6 +494,13 @@ static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id)  }  /* Input **********************************************************************/ +static void asus_wmi_tablet_sw_report(struct asus_wmi *asus, bool value) +{ +	input_report_switch(asus->inputdev, SW_TABLET_MODE, +			    asus->tablet_switch_inverted ? !value : value); +	input_sync(asus->inputdev); +} +  static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event_code)  {  	struct device *dev = &asus->platform_device->dev; @@ -501,7 +509,7 @@ static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event  	result = asus_wmi_get_devstate_simple(asus, dev_id);  	if (result >= 0) {  		input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE); -		input_report_switch(asus->inputdev, SW_TABLET_MODE, result); +		asus_wmi_tablet_sw_report(asus, result);  		asus->tablet_switch_dev_id = dev_id;  		asus->tablet_switch_event_code = event_code;  	} else if (result == -ENODEV) { @@ -534,6 +542,7 @@ static int asus_wmi_input_init(struct asus_wmi *asus)  	case asus_wmi_no_tablet_switch:  		break;  	case asus_wmi_kbd_dock_devid: +		asus->tablet_switch_inverted = true;  		asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_KBD_DOCK, NOTIFY_KBD_DOCK_CHANGE);  		break;  	case asus_wmi_lid_flip_devid: @@ -573,10 +582,8 @@ static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus)  		return;  	result = asus_wmi_get_devstate_simple(asus, asus->tablet_switch_dev_id); -	if (result >= 0) { -		input_report_switch(asus->inputdev, SW_TABLET_MODE, result); -		input_sync(asus->inputdev); -	} +	if (result >= 0) +		asus_wmi_tablet_sw_report(asus, result);  }  /* dGPU ********************************************************************/ @@ -2243,7 +2250,9 @@ static int asus_wmi_fan_init(struct asus_wmi *asus)  	asus->fan_type = FAN_TYPE_NONE;  	asus->agfn_pwm = -1; -	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL)) +	if (asus->driver->quirks->wmi_ignore_fan) +		asus->fan_type = FAN_TYPE_NONE; +	else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL))  		asus->fan_type = FAN_TYPE_SPEC83;  	else if (asus_wmi_has_agfn_fan(asus))  		asus->fan_type = FAN_TYPE_AGFN; @@ -2436,6 +2445,9 @@ static int fan_curve_check_present(struct asus_wmi *asus, bool *available,  	*available = false; +	if (asus->fan_type == FAN_TYPE_NONE) +		return 0; +  	err = fan_curve_get_factory_default(asus, fan_dev);  	if (err) {  		return 0;  | 
