aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/osl.c23
1 files changed, 5 insertions, 18 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index c5b4f1ed9b71..d753206f0734 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -58,6 +58,7 @@ struct acpi_os_dpc {
58 acpi_osd_exec_callback function; 58 acpi_osd_exec_callback function;
59 void *context; 59 void *context;
60 struct work_struct work; 60 struct work_struct work;
61 int wait;
61}; 62};
62 63
63#ifdef CONFIG_ACPI_CUSTOM_DSDT 64#ifdef CONFIG_ACPI_CUSTOM_DSDT
@@ -703,21 +704,8 @@ static void acpi_os_execute_deferred(struct work_struct *work)
703 return; 704 return;
704 } 705 }
705 706
706 dpc->function(dpc->context); 707 if (dpc->wait)
707 kfree(dpc); 708 acpi_os_wait_events_complete(NULL);
708
709 return;
710}
711
712static void acpi_os_execute_hp_deferred(struct work_struct *work)
713{
714 struct acpi_os_dpc *dpc = container_of(work, struct acpi_os_dpc, work);
715 if (!dpc) {
716 printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
717 return;
718 }
719
720 acpi_os_wait_events_complete(NULL);
721 709
722 dpc->function(dpc->context); 710 dpc->function(dpc->context);
723 kfree(dpc); 711 kfree(dpc);
@@ -746,7 +734,6 @@ static acpi_status __acpi_os_execute(acpi_execute_type type,
746 acpi_status status = AE_OK; 734 acpi_status status = AE_OK;
747 struct acpi_os_dpc *dpc; 735 struct acpi_os_dpc *dpc;
748 struct workqueue_struct *queue; 736 struct workqueue_struct *queue;
749 work_func_t func;
750 int ret; 737 int ret;
751 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 738 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
752 "Scheduling function [%p(%p)] for deferred execution.\n", 739 "Scheduling function [%p(%p)] for deferred execution.\n",
@@ -779,8 +766,8 @@ static acpi_status __acpi_os_execute(acpi_execute_type type,
779 */ 766 */
780 queue = hp ? kacpi_hotplug_wq : 767 queue = hp ? kacpi_hotplug_wq :
781 (type == OSL_NOTIFY_HANDLER ? kacpi_notify_wq : kacpid_wq); 768 (type == OSL_NOTIFY_HANDLER ? kacpi_notify_wq : kacpid_wq);
782 func = hp ? acpi_os_execute_hp_deferred : acpi_os_execute_deferred; 769 dpc->wait = hp ? 1 : 0;
783 INIT_WORK(&dpc->work, func); 770 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
784 ret = queue_work(queue, &dpc->work); 771 ret = queue_work(queue, &dpc->work);
785 772
786 if (!ret) { 773 if (!ret) {