From 777fa1c6cd60026bc8c11c4cce62723157f6eedf Mon Sep 17 00:00:00 2001 From: Carlos Corbacho Date: Wed, 21 Nov 2007 14:43:55 +0000 Subject: [PATCH] wmi-acer: Convert upstream work back to a module Upstream work is currently a built-in driver only, due to ACPI not exporting a symbol needed for the sysfs interface. Convert wmi-acer back to a module, as we don't bother with the sysfs interface. --- wmi-acer.c | 30 ++++++++++++++++++++++++++++-- wmi-acer.h | 21 ++++++++++++++------- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/wmi-acer.c b/wmi-acer.c index 830c308..f02bef9 100644 --- a/wmi-acer.c +++ b/wmi-acer.c @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -642,6 +643,14 @@ static int __init acpi_wmi_add(struct acpi_device *device) return result; } +static int acpi_wmi_remove(struct acpi_device *device, int type) +{ + acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, + acpi_wmi_notify); + + return 0; +} + static int __init acpi_wmi_init(void) { acpi_status result; @@ -656,10 +665,27 @@ static int __init acpi_wmi_init(void) if (ACPI_FAILURE(result)) printk(KERN_INFO PREFIX "Interface device not found\n"); - printk(KERN_INFO PREFIX "Interface device found\n"); printk(KERN_INFO PREFIX "Mapper loaded\n"); return result; } -subsys_initcall(acpi_wmi_init); +static void __exit acpi_wmi_exit(void) +{ + struct list_head *p; + struct wmi_block *wblock; + + acpi_bus_unregister_driver(&acpi_wmi_driver); + + list_for_each(p, &wmi_blocks.list) { + wblock = list_entry(p, struct wmi_block, list); + + list_del(&wblock->list); + kfree(wblock); + } + + printk(KERN_INFO PREFIX "Mapper unloaded\n"); +} + +module_init(acpi_wmi_init); +module_exit(acpi_wmi_exit); diff --git a/wmi-acer.h b/wmi-acer.h index 75d5548..e7848c6 100644 --- a/wmi-acer.h +++ b/wmi-acer.h @@ -27,11 +27,18 @@ #define bool int #endif -acpi_status wmi_acer_evaluate_method(const char *guid, u32 instance, u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out); -acpi_status wmi_acer_query_block(const char *guid, u32 instance, u32 method_id, struct acpi_buffer *out); -acpi_status wmi_acer_set_block(const char *guid, u32 instance, u32 method_id, const struct acpi_buffer *in); +typedef void (*wmi_notify_handler) (u32 value, void *context); -acpi_status wmi_install_notify_handler(acpi_notify_handler handler, struct acpi_buffer *data); -acpi_status wmi_remove_notify_handler(void); - -bool wmi_acer_has_guid(char *guid); +extern acpi_status wmi_acer_evaluate_method(const char *guid, u8 instance, + u32 method_id, + const struct acpi_buffer *in, + struct acpi_buffer *out); +extern acpi_status wmi_acer_query_block(const char *guid, u8 instance, + struct acpi_buffer *out); +extern acpi_status wmi_acer_set_block(const char *guid, u8 instance, + const struct acpi_buffer *in); +extern acpi_status wmi_acer_install_notify_handler(wmi_notify_handler handler, + void *data); +extern acpi_status wmi_acer_remove_notify_handler(void); +extern acpi_status wmi_acer_get_event_data(u32 event, struct acpi_buffer *out); +extern bool wmi_acer_has_guid(const char *guid); -- 2.11.4.GIT