[PATCH v2 3/4] ACPI: EC: Make query handlers private

From: Armin Wolf
Date: Sat Feb 25 2023 - 06:52:13 EST


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@xxxxxx>
---
drivers/acpi/ec.c | 36 ++++++++----------------------------
drivers/acpi/internal.h | 5 -----
2 files changed, 8 insertions(+), 33 deletions(-)

diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index dc7860a825a0..825493d38a4f 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -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)
+static 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);
}
}
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 6f41d42375ab..72ce5a9ba57f 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -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);
--
2.30.2