diff options
Diffstat (limited to 'drivers/acpi/dock.c')
-rw-r--r-- | drivers/acpi/dock.c | 25 |
1 files changed, 3 insertions, 22 deletions
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index ca86c1ce7c8a..dcd73ccb514c 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
@@ -669,39 +669,20 @@ static void dock_notify(struct dock_station *ds, u32 event) | |||
669 | } | 669 | } |
670 | } | 670 | } |
671 | 671 | ||
672 | struct dock_data { | 672 | static void acpi_dock_deferred_cb(void *data, u32 event) |
673 | struct dock_station *ds; | ||
674 | u32 event; | ||
675 | }; | ||
676 | |||
677 | static void acpi_dock_deferred_cb(void *context) | ||
678 | { | 673 | { |
679 | struct dock_data *data = context; | ||
680 | |||
681 | acpi_scan_lock_acquire(); | 674 | acpi_scan_lock_acquire(); |
682 | dock_notify(data->ds, data->event); | 675 | dock_notify(data, event); |
683 | acpi_scan_lock_release(); | 676 | acpi_scan_lock_release(); |
684 | kfree(data); | ||
685 | } | 677 | } |
686 | 678 | ||
687 | static void dock_notify_handler(acpi_handle handle, u32 event, void *data) | 679 | static void dock_notify_handler(acpi_handle handle, u32 event, void *data) |
688 | { | 680 | { |
689 | struct dock_data *dd; | ||
690 | |||
691 | if (event != ACPI_NOTIFY_BUS_CHECK && event != ACPI_NOTIFY_DEVICE_CHECK | 681 | if (event != ACPI_NOTIFY_BUS_CHECK && event != ACPI_NOTIFY_DEVICE_CHECK |
692 | && event != ACPI_NOTIFY_EJECT_REQUEST) | 682 | && event != ACPI_NOTIFY_EJECT_REQUEST) |
693 | return; | 683 | return; |
694 | 684 | ||
695 | dd = kmalloc(sizeof(*dd), GFP_KERNEL); | 685 | acpi_hotplug_execute(acpi_dock_deferred_cb, data, event); |
696 | if (dd) { | ||
697 | acpi_status status; | ||
698 | |||
699 | dd->ds = data; | ||
700 | dd->event = event; | ||
701 | status = acpi_os_hotplug_execute(acpi_dock_deferred_cb, dd); | ||
702 | if (ACPI_FAILURE(status)) | ||
703 | kfree(dd); | ||
704 | } | ||
705 | } | 686 | } |
706 | 687 | ||
707 | /** | 688 | /** |