mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-31 22:15:38 +00:00
Merge branch 'wmi' into release
This commit is contained in:
commit
1ae22af7d7
@ -202,8 +202,13 @@ static void dell_wmi_notify(u32 value, void *context)
|
|||||||
struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
|
struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||||
static struct key_entry *key;
|
static struct key_entry *key;
|
||||||
union acpi_object *obj;
|
union acpi_object *obj;
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
wmi_get_event_data(value, &response);
|
status = wmi_get_event_data(value, &response);
|
||||||
|
if (status != AE_OK) {
|
||||||
|
printk(KERN_INFO "dell-wmi: bad event status 0x%x\n", status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
obj = (union acpi_object *)response.pointer;
|
obj = (union acpi_object *)response.pointer;
|
||||||
|
|
||||||
@ -323,8 +328,9 @@ static int __init dell_wmi_input_setup(void)
|
|||||||
static int __init dell_wmi_init(void)
|
static int __init dell_wmi_init(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
if (wmi_has_guid(DELL_EVENT_GUID)) {
|
if (!wmi_has_guid(DELL_EVENT_GUID)) {
|
||||||
printk(KERN_WARNING "dell-wmi: No known WMI GUID found\n");
|
printk(KERN_WARNING "dell-wmi: No known WMI GUID found\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
@ -336,14 +342,14 @@ static int __init dell_wmi_init(void)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = wmi_install_notify_handler(DELL_EVENT_GUID,
|
status = wmi_install_notify_handler(DELL_EVENT_GUID,
|
||||||
dell_wmi_notify, NULL);
|
dell_wmi_notify, NULL);
|
||||||
if (err) {
|
if (ACPI_FAILURE(status)) {
|
||||||
input_unregister_device(dell_wmi_input_dev);
|
input_unregister_device(dell_wmi_input_dev);
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"dell-wmi: Unable to register notify handler - %d\n",
|
"dell-wmi: Unable to register notify handler - %d\n",
|
||||||
err);
|
status);
|
||||||
return err;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -338,8 +338,13 @@ static void hp_wmi_notify(u32 value, void *context)
|
|||||||
static struct key_entry *key;
|
static struct key_entry *key;
|
||||||
union acpi_object *obj;
|
union acpi_object *obj;
|
||||||
int eventcode;
|
int eventcode;
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
wmi_get_event_data(value, &response);
|
status = wmi_get_event_data(value, &response);
|
||||||
|
if (status != AE_OK) {
|
||||||
|
printk(KERN_INFO "hp-wmi: bad event status 0x%x\n", status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
obj = (union acpi_object *)response.pointer;
|
obj = (union acpi_object *)response.pointer;
|
||||||
|
|
||||||
@ -581,7 +586,7 @@ static int __init hp_wmi_init(void)
|
|||||||
if (wmi_has_guid(HPWMI_EVENT_GUID)) {
|
if (wmi_has_guid(HPWMI_EVENT_GUID)) {
|
||||||
err = wmi_install_notify_handler(HPWMI_EVENT_GUID,
|
err = wmi_install_notify_handler(HPWMI_EVENT_GUID,
|
||||||
hp_wmi_notify, NULL);
|
hp_wmi_notify, NULL);
|
||||||
if (!err)
|
if (ACPI_SUCCESS(err))
|
||||||
hp_wmi_input_setup();
|
hp_wmi_input_setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,8 +149,13 @@ static void msi_wmi_notify(u32 value, void *context)
|
|||||||
static struct key_entry *key;
|
static struct key_entry *key;
|
||||||
union acpi_object *obj;
|
union acpi_object *obj;
|
||||||
ktime_t cur;
|
ktime_t cur;
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
wmi_get_event_data(value, &response);
|
status = wmi_get_event_data(value, &response);
|
||||||
|
if (status != AE_OK) {
|
||||||
|
printk(KERN_INFO DRV_PFX "bad event status 0x%x\n", status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
obj = (union acpi_object *)response.pointer;
|
obj = (union acpi_object *)response.pointer;
|
||||||
|
|
||||||
@ -236,7 +241,7 @@ static int __init msi_wmi_init(void)
|
|||||||
}
|
}
|
||||||
err = wmi_install_notify_handler(MSIWMI_EVENT_GUID,
|
err = wmi_install_notify_handler(MSIWMI_EVENT_GUID,
|
||||||
msi_wmi_notify, NULL);
|
msi_wmi_notify, NULL);
|
||||||
if (err)
|
if (ACPI_FAILURE(err))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = msi_wmi_input_setup();
|
err = msi_wmi_input_setup();
|
||||||
|
@ -492,8 +492,7 @@ wmi_notify_handler handler, void *data)
|
|||||||
if (!guid || !handler)
|
if (!guid || !handler)
|
||||||
return AE_BAD_PARAMETER;
|
return AE_BAD_PARAMETER;
|
||||||
|
|
||||||
find_guid(guid, &block);
|
if (!find_guid(guid, &block))
|
||||||
if (!block)
|
|
||||||
return AE_NOT_EXIST;
|
return AE_NOT_EXIST;
|
||||||
|
|
||||||
if (block->handler)
|
if (block->handler)
|
||||||
@ -521,8 +520,7 @@ acpi_status wmi_remove_notify_handler(const char *guid)
|
|||||||
if (!guid)
|
if (!guid)
|
||||||
return AE_BAD_PARAMETER;
|
return AE_BAD_PARAMETER;
|
||||||
|
|
||||||
find_guid(guid, &block);
|
if (!find_guid(guid, &block))
|
||||||
if (!block)
|
|
||||||
return AE_NOT_EXIST;
|
return AE_NOT_EXIST;
|
||||||
|
|
||||||
if (!block->handler)
|
if (!block->handler)
|
||||||
@ -716,6 +714,22 @@ static int wmi_class_init(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool guid_already_parsed(const char *guid_string)
|
||||||
|
{
|
||||||
|
struct guid_block *gblock;
|
||||||
|
struct wmi_block *wblock;
|
||||||
|
struct list_head *p;
|
||||||
|
|
||||||
|
list_for_each(p, &wmi_blocks.list) {
|
||||||
|
wblock = list_entry(p, struct wmi_block, list);
|
||||||
|
gblock = &wblock->gblock;
|
||||||
|
|
||||||
|
if (strncmp(gblock->guid, guid_string, 16) == 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse the _WDG method for the GUID data blocks
|
* Parse the _WDG method for the GUID data blocks
|
||||||
*/
|
*/
|
||||||
@ -725,6 +739,7 @@ static __init acpi_status parse_wdg(acpi_handle handle)
|
|||||||
union acpi_object *obj;
|
union acpi_object *obj;
|
||||||
struct guid_block *gblock;
|
struct guid_block *gblock;
|
||||||
struct wmi_block *wblock;
|
struct wmi_block *wblock;
|
||||||
|
char guid_string[37];
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
u32 i, total;
|
u32 i, total;
|
||||||
|
|
||||||
@ -747,6 +762,19 @@ static __init acpi_status parse_wdg(acpi_handle handle)
|
|||||||
memcpy(gblock, obj->buffer.pointer, obj->buffer.length);
|
memcpy(gblock, obj->buffer.pointer, obj->buffer.length);
|
||||||
|
|
||||||
for (i = 0; i < total; i++) {
|
for (i = 0; i < total; i++) {
|
||||||
|
/*
|
||||||
|
Some WMI devices, like those for nVidia hooks, have a
|
||||||
|
duplicate GUID. It's not clear what we should do in this
|
||||||
|
case yet, so for now, we'll just ignore the duplicate.
|
||||||
|
Anyone who wants to add support for that device can come
|
||||||
|
up with a better workaround for the mess then.
|
||||||
|
*/
|
||||||
|
if (guid_already_parsed(gblock[i].guid) == true) {
|
||||||
|
wmi_gtoa(gblock[i].guid, guid_string);
|
||||||
|
printk(KERN_INFO PREFIX "Skipping duplicate GUID %s\n",
|
||||||
|
guid_string);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL);
|
wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL);
|
||||||
if (!wblock)
|
if (!wblock)
|
||||||
return AE_NO_MEMORY;
|
return AE_NO_MEMORY;
|
||||||
|
Loading…
Reference in New Issue
Block a user