@@ -143,9 +143,7 @@ MODULE_PARM_DESC(ec_no_wakeup, "Do not wake up from suspend-to-idle");
struct acpi_ec_query_handler {
struct list_head node;
- acpi_ec_query_func func;
acpi_handle handle;
- void *data;
u8 query_bit;
struct kref kref;
};
@@ -1082,9 +1080,7 @@ static void acpi_ec_put_query_handler(struct acpi_ec_query_handler *handler)
kref_put(&handler->kref, acpi_ec_query_handler_release);
}
-int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
- acpi_handle handle, acpi_ec_query_func func,
- void *data)
+int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, acpi_handle handle)
{
struct acpi_ec_query_handler *handler =
kzalloc(sizeof(struct acpi_ec_query_handler), GFP_KERNEL);
@@ -1094,40 +1090,28 @@ int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
handler->query_bit = query_bit;
handler->handle = handle;
- handler->func = func;
- handler->data = data;
mutex_lock(&ec->mutex);
kref_init(&handler->kref);
list_add(&handler->node, &ec->list);
mutex_unlock(&ec->mutex);
return 0;
}
-EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler);
-static void acpi_ec_remove_query_handlers(struct acpi_ec *ec,
- bool remove_all, u8 query_bit)
+static void acpi_ec_remove_query_handlers(struct acpi_ec *ec)
{
struct acpi_ec_query_handler *handler, *tmp;
LIST_HEAD(free_list);
mutex_lock(&ec->mutex);
list_for_each_entry_safe(handler, tmp, &ec->list, node) {
- if (remove_all || query_bit == handler->query_bit) {
- list_del_init(&handler->node);
- list_add(&handler->node, &free_list);
- }
+ list_del_init(&handler->node);
+ list_add(&handler->node, &free_list);
}
mutex_unlock(&ec->mutex);
list_for_each_entry_safe(handler, tmp, &free_list, node)
acpi_ec_put_query_handler(handler);
}
-void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit)
-{
- acpi_ec_remove_query_handlers(ec, false, query_bit);
-}
-EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler);
-
int register_acpi_ec_query_notifier(struct notifier_block *nb)
{
return blocking_notifier_chain_register(&acpi_ec_chain_head, nb);
@@ -1151,12 +1135,8 @@ static void acpi_ec_event_processor(struct work_struct *work)
/* Allow notifier handlers to override query handlers */
ret = blocking_notifier_call_chain(&acpi_ec_chain_head, handler->query_bit, ec);
- if (ret != NOTIFY_BAD) {
- if (handler->func)
- handler->func(handler->data);
- else if (handler->handle)
- acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
- }
+ if (ret != NOTIFY_BAD && handler->handle)
+ acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
ec_dbg_evt("Query(0x%02x) stopped", handler->query_bit);
@@ -1402,7 +1382,7 @@ acpi_ec_register_query_methods(acpi_handle handle, u32 level,
status = acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer);
if (ACPI_SUCCESS(status) && sscanf(node_name, "_Q%x", &value) == 1)
- acpi_ec_add_query_handler(ec, value, handle, NULL, NULL);
+ acpi_ec_add_query_handler(ec, value, handle);
return AE_OK;
}
@@ -1587,7 +1567,7 @@ static void ec_remove_handlers(struct acpi_ec *ec)
clear_bit(EC_FLAGS_EVENT_HANDLER_INSTALLED, &ec->flags);
}
if (test_bit(EC_FLAGS_QUERY_METHODS_INSTALLED, &ec->flags)) {
- acpi_ec_remove_query_handlers(ec, true, 0);
+ acpi_ec_remove_query_handlers(ec);
clear_bit(EC_FLAGS_QUERY_METHODS_INSTALLED, &ec->flags);
}
}
@@ -202,17 +202,12 @@ extern struct acpi_ec *first_ec;
/* If we find an EC via the ECDT, we need to keep a ptr to its context */
/* External interfaces use first EC only, so remember */
-typedef int (*acpi_ec_query_func) (void *data);
void acpi_ec_init(void);
void acpi_ec_ecdt_probe(void);
void acpi_ec_dsdt_probe(void);
void acpi_ec_block_transactions(void);
void acpi_ec_unblock_transactions(void);
-int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
- acpi_handle handle, acpi_ec_query_func func,
- void *data);
-void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit);
int register_acpi_ec_query_notifier(struct notifier_block *nb);
int unregister_acpi_ec_query_notifier(struct notifier_block *nb);
The ability for external modules to register query handlers was broken for a long time due to having only a single user. With the only user (sbshc) having been converted to use the more robust query notifier call chain, the query handler functionality can be made private. This also allows for some cleanups. Tested on a Acer Travelmate 4000WLMi. Signed-off-by: Armin Wolf <W_Armin@gmx.de> --- drivers/acpi/ec.c | 36 ++++++++---------------------------- drivers/acpi/internal.h | 5 ----- 2 files changed, 8 insertions(+), 33 deletions(-) -- 2.30.2