diff options
Diffstat (limited to 'drivers/platform/x86/acer-wmi.c')
| -rw-r--r-- | drivers/platform/x86/acer-wmi.c | 68 | 
1 files changed, 40 insertions, 28 deletions
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 934d861a323..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 */ @@ -335,7 +339,7 @@ static struct quirk_entry quirk_lenovo_ideapad_s205 = {  };  /* The Aspire One has a dummy ACPI-WMI interface - disable it */ -static struct dmi_system_id __devinitdata acer_blacklist[] = { +static struct dmi_system_id acer_blacklist[] = {  	{  		.ident = "Acer Aspire One (SSD)",  		.matches = { @@ -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; @@ -1330,7 +1336,7 @@ static struct led_classdev mail_led = {  	.brightness_set = mail_led_set,  }; -static int __devinit acer_led_init(struct device *dev) +static int acer_led_init(struct device *dev)  {  	return led_classdev_register(dev, &mail_led);  } @@ -1372,7 +1378,7 @@ static const struct backlight_ops acer_bl_ops = {  	.update_status = update_bl_status,  }; -static int __devinit acer_backlight_init(struct device *dev) +static int acer_backlight_init(struct device *dev)  {  	struct backlight_properties props;  	struct backlight_device *bd; @@ -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); @@ -1961,7 +1973,7 @@ static u32 get_wmid_devices(void)  /*   * Platform device   */ -static int __devinit acer_platform_probe(struct platform_device *device) +static int acer_platform_probe(struct platform_device *device)  {  	int err;  |