diff options
| author | Olof Johansson <olof@lixom.net> | 2013-01-27 22:07:11 -0800 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2013-01-27 22:07:20 -0800 | 
| commit | 6b914c998787d65022e80d6262dfd0edef58cadb (patch) | |
| tree | ec9d9605ae08e6e40664c4302a181979ab4fe1d3 /drivers/platform/x86/acer-wmi.c | |
| parent | 1f87a404d02a96519284e1928445ca5cfe9667db (diff) | |
| parent | 949db153b6466c6f7cad5a427ecea94985927311 (diff) | |
| download | olio-linux-3.10-6b914c998787d65022e80d6262dfd0edef58cadb.tar.xz olio-linux-3.10-6b914c998787d65022e80d6262dfd0edef58cadb.zip  | |
Merge tag 'v3.8-rc5' into next/cleanup
Linux 3.8-rc5
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/platform/x86/acer-wmi.c')
| -rw-r--r-- | drivers/platform/x86/acer-wmi.c | 60 | 
1 files changed, 36 insertions, 24 deletions
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 06f4eb7ab87..afed7018a2b 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c @@ -125,8 +125,11 @@ static const struct key_entry acer_wmi_keymap[] = {  	{KE_IGNORE, 0x63, {KEY_BRIGHTNESSDOWN} },  	{KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} },	/* Display Switch */  	{KE_IGNORE, 0x81, {KEY_SLEEP} }, -	{KE_KEY, 0x82, {KEY_TOUCHPAD_TOGGLE} },	/* Touch Pad On/Off */ +	{KE_KEY, 0x82, {KEY_TOUCHPAD_TOGGLE} },	/* Touch Pad Toggle */ +	{KE_KEY, KEY_TOUCHPAD_ON, {KEY_TOUCHPAD_ON} }, +	{KE_KEY, KEY_TOUCHPAD_OFF, {KEY_TOUCHPAD_OFF} },  	{KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} }, +	{KE_KEY, 0x85, {KEY_TOUCHPAD_TOGGLE} },  	{KE_END, 0}  }; @@ -147,6 +150,7 @@ struct event_return_value {  #define ACER_WMID3_GDS_THREEG		(1<<6)	/* 3G */  #define ACER_WMID3_GDS_WIMAX		(1<<7)	/* WiMAX */  #define ACER_WMID3_GDS_BLUETOOTH	(1<<11)	/* BT */ +#define ACER_WMID3_GDS_TOUCHPAD		(1<<1)	/* Touchpad */  struct lm_input_params {  	u8 function_num;        /* Function Number */ @@ -875,7 +879,7 @@ WMI_execute_u32(u32 method_id, u32 in, u32 *out)  	struct acpi_buffer input = { (acpi_size) sizeof(u32), (void *)(&in) };  	struct acpi_buffer result = { ACPI_ALLOCATE_BUFFER, NULL };  	union acpi_object *obj; -	u32 tmp; +	u32 tmp = 0;  	acpi_status status;  	status = wmi_evaluate_method(WMID_GUID1, 1, method_id, &input, &result); @@ -884,14 +888,14 @@ WMI_execute_u32(u32 method_id, u32 in, u32 *out)  		return status;  	obj = (union acpi_object *) result.pointer; -	if (obj && obj->type == ACPI_TYPE_BUFFER && -		(obj->buffer.length == sizeof(u32) || -		obj->buffer.length == sizeof(u64))) { -		tmp = *((u32 *) obj->buffer.pointer); -	} else if (obj->type == ACPI_TYPE_INTEGER) { -		tmp = (u32) obj->integer.value; -	} else { -		tmp = 0; +	if (obj) { +		if (obj->type == ACPI_TYPE_BUFFER && +			(obj->buffer.length == sizeof(u32) || +			obj->buffer.length == sizeof(u64))) { +			tmp = *((u32 *) obj->buffer.pointer); +		} else if (obj->type == ACPI_TYPE_INTEGER) { +			tmp = (u32) obj->integer.value; +		}  	}  	if (out) @@ -1193,12 +1197,14 @@ static acpi_status WMID_set_capabilities(void)  		return status;  	obj = (union acpi_object *) out.pointer; -	if (obj && obj->type == ACPI_TYPE_BUFFER && -		(obj->buffer.length == sizeof(u32) || -		obj->buffer.length == sizeof(u64))) { -		devices = *((u32 *) obj->buffer.pointer); -	} else if (obj->type == ACPI_TYPE_INTEGER) { -		devices = (u32) obj->integer.value; +	if (obj) { +		if (obj->type == ACPI_TYPE_BUFFER && +			(obj->buffer.length == sizeof(u32) || +			obj->buffer.length == sizeof(u64))) { +			devices = *((u32 *) obj->buffer.pointer); +		} else if (obj->type == ACPI_TYPE_INTEGER) { +			devices = (u32) obj->integer.value; +		}  	} else {  		kfree(out.pointer);  		return AE_ERROR; @@ -1676,6 +1682,7 @@ static void acer_wmi_notify(u32 value, void *context)  	acpi_status status;  	u16 device_state;  	const struct key_entry *key; +	u32 scancode;  	status = wmi_get_event_data(value, &response);  	if (status != AE_OK) { @@ -1712,6 +1719,7 @@ static void acer_wmi_notify(u32 value, void *context)  			pr_warn("Unknown key number - 0x%x\n",  				return_value.key_num);  		} else { +			scancode = return_value.key_num;  			switch (key->keycode) {  			case KEY_WLAN:  			case KEY_BLUETOOTH: @@ -1725,9 +1733,11 @@ static void acer_wmi_notify(u32 value, void *context)  					rfkill_set_sw_state(bluetooth_rfkill,  						!(device_state & ACER_WMID3_GDS_BLUETOOTH));  				break; +			case KEY_TOUCHPAD_TOGGLE: +				scancode = (device_state & ACER_WMID3_GDS_TOUCHPAD) ? +						KEY_TOUCHPAD_ON : KEY_TOUCHPAD_OFF;  			} -			sparse_keymap_report_entry(acer_wmi_input_dev, key, -						   1, true); +			sparse_keymap_report_event(acer_wmi_input_dev, scancode, 1, true);  		}  		break;  	case WMID_ACCEL_EVENT: @@ -1946,12 +1956,14 @@ static u32 get_wmid_devices(void)  		return 0;  	obj = (union acpi_object *) out.pointer; -	if (obj && obj->type == ACPI_TYPE_BUFFER && -		(obj->buffer.length == sizeof(u32) || -		obj->buffer.length == sizeof(u64))) { -		devices = *((u32 *) obj->buffer.pointer); -	} else if (obj->type == ACPI_TYPE_INTEGER) { -		devices = (u32) obj->integer.value; +	if (obj) { +		if (obj->type == ACPI_TYPE_BUFFER && +			(obj->buffer.length == sizeof(u32) || +			obj->buffer.length == sizeof(u64))) { +			devices = *((u32 *) obj->buffer.pointer); +		} else if (obj->type == ACPI_TYPE_INTEGER) { +			devices = (u32) obj->integer.value; +		}  	}  	kfree(out.pointer);  |