diff options
Diffstat (limited to 'drivers/platform/x86/acer-wmi.c')
| -rw-r--r-- | drivers/platform/x86/acer-wmi.c | 47 | 
1 files changed, 29 insertions, 18 deletions
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 005417bd429..e1c4938b301 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c @@ -1156,9 +1156,9 @@ static acpi_status wmid3_set_device_status(u32 value, u16 device)  	struct wmid3_gds_input_param params = {  		.function_num = 0x1,  		.hotkey_number = 0x01, -		.devices = ACER_WMID3_GDS_WIRELESS & -				ACER_WMID3_GDS_THREEG & -				ACER_WMID3_GDS_WIMAX & +		.devices = ACER_WMID3_GDS_WIRELESS | +				ACER_WMID3_GDS_THREEG | +				ACER_WMID3_GDS_WIMAX |  				ACER_WMID3_GDS_BLUETOOTH,  	};  	struct acpi_buffer input = { @@ -1445,6 +1445,8 @@ static void acer_wmi_notify(u32 value, void *context)  	union acpi_object *obj;  	struct event_return_value return_value;  	acpi_status status; +	u16 device_state; +	const struct key_entry *key;  	status = wmi_get_event_data(value, &response);  	if (status != AE_OK) { @@ -1472,23 +1474,32 @@ static void acer_wmi_notify(u32 value, void *context)  	switch (return_value.function) {  	case WMID_HOTKEY_EVENT: -		if (return_value.device_state) { -			u16 device_state = return_value.device_state; -			pr_debug("device state: 0x%x\n", device_state); -			if (has_cap(ACER_CAP_WIRELESS)) -				rfkill_set_sw_state(wireless_rfkill, -				!(device_state & ACER_WMID3_GDS_WIRELESS)); -			if (has_cap(ACER_CAP_BLUETOOTH)) -				rfkill_set_sw_state(bluetooth_rfkill, -				!(device_state & ACER_WMID3_GDS_BLUETOOTH)); -			if (has_cap(ACER_CAP_THREEG)) -				rfkill_set_sw_state(threeg_rfkill, -				!(device_state & ACER_WMID3_GDS_THREEG)); -		} -		if (!sparse_keymap_report_event(acer_wmi_input_dev, -				return_value.key_num, 1, true)) +		device_state = return_value.device_state; +		pr_debug("device state: 0x%x\n", device_state); + +		key = sparse_keymap_entry_from_scancode(acer_wmi_input_dev, +							return_value.key_num); +		if (!key) {  			pr_warn("Unknown key number - 0x%x\n",  				return_value.key_num); +		} else { +			switch (key->keycode) { +			case KEY_WLAN: +			case KEY_BLUETOOTH: +				if (has_cap(ACER_CAP_WIRELESS)) +					rfkill_set_sw_state(wireless_rfkill, +						!(device_state & ACER_WMID3_GDS_WIRELESS)); +				if (has_cap(ACER_CAP_THREEG)) +					rfkill_set_sw_state(threeg_rfkill, +						!(device_state & ACER_WMID3_GDS_THREEG)); +				if (has_cap(ACER_CAP_BLUETOOTH)) +					rfkill_set_sw_state(bluetooth_rfkill, +						!(device_state & ACER_WMID3_GDS_BLUETOOTH)); +				break; +			} +			sparse_keymap_report_entry(acer_wmi_input_dev, key, +						   1, true); +		}  		break;  	default:  		pr_warn("Unknown function number - %d - %d\n",  |