@@ -1083,9 +1083,12 @@ int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
10831083 acpi_handle handle , acpi_ec_query_func func ,
10841084 void * data )
10851085{
1086- struct acpi_ec_query_handler * handler =
1087- kzalloc (sizeof (struct acpi_ec_query_handler ), GFP_KERNEL );
1086+ struct acpi_ec_query_handler * handler ;
1087+
1088+ if (!handle && !func )
1089+ return - EINVAL ;
10881090
1091+ handler = kzalloc (sizeof (* handler ), GFP_KERNEL );
10891092 if (!handler )
10901093 return - ENOMEM ;
10911094
@@ -1097,6 +1100,7 @@ int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
10971100 kref_init (& handler -> kref );
10981101 list_add (& handler -> node , & ec -> list );
10991102 mutex_unlock (& ec -> mutex );
1103+
11001104 return 0 ;
11011105}
11021106EXPORT_SYMBOL_GPL (acpi_ec_add_query_handler );
@@ -1109,9 +1113,16 @@ static void acpi_ec_remove_query_handlers(struct acpi_ec *ec,
11091113
11101114 mutex_lock (& ec -> mutex );
11111115 list_for_each_entry_safe (handler , tmp , & ec -> list , node ) {
1112- if (remove_all || query_bit == handler -> query_bit ) {
1116+ /*
1117+ * When remove_all is false, only remove custom query handlers
1118+ * which have handler->func set. This is done to preserve query
1119+ * handlers discovered thru ACPI, as they should continue handling
1120+ * EC queries.
1121+ */
1122+ if (remove_all || (handler -> func && handler -> query_bit == query_bit )) {
11131123 list_del_init (& handler -> node );
11141124 list_add (& handler -> node , & free_list );
1125+
11151126 }
11161127 }
11171128 mutex_unlock (& ec -> mutex );
@@ -1122,6 +1133,7 @@ static void acpi_ec_remove_query_handlers(struct acpi_ec *ec,
11221133void acpi_ec_remove_query_handler (struct acpi_ec * ec , u8 query_bit )
11231134{
11241135 acpi_ec_remove_query_handlers (ec , false, query_bit );
1136+ flush_workqueue (ec_query_wq );
11251137}
11261138EXPORT_SYMBOL_GPL (acpi_ec_remove_query_handler );
11271139
0 commit comments