diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/misc/thinkpad_acpi.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index 0ced9d65c6be..2155139793b1 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
@@ -117,6 +117,12 @@ IBM_BIOS_MODULE_ALIAS("K[U,X-Z]"); | |||
117 | 117 | ||
118 | #define __unused __attribute__ ((unused)) | 118 | #define __unused __attribute__ ((unused)) |
119 | 119 | ||
120 | static enum { | ||
121 | TPACPI_LIFE_INIT = 0, | ||
122 | TPACPI_LIFE_RUNNING, | ||
123 | TPACPI_LIFE_EXITING, | ||
124 | } tpacpi_lifecycle; | ||
125 | |||
120 | /**************************************************************************** | 126 | /**************************************************************************** |
121 | **************************************************************************** | 127 | **************************************************************************** |
122 | * | 128 | * |
@@ -342,6 +348,9 @@ static void dispatch_acpi_notify(acpi_handle handle, u32 event, void *data) | |||
342 | { | 348 | { |
343 | struct ibm_struct *ibm = data; | 349 | struct ibm_struct *ibm = data; |
344 | 350 | ||
351 | if (tpacpi_lifecycle != TPACPI_LIFE_RUNNING) | ||
352 | return; | ||
353 | |||
345 | if (!ibm || !ibm->acpi || !ibm->acpi->notify) | 354 | if (!ibm || !ibm->acpi || !ibm->acpi->notify) |
346 | return; | 355 | return; |
347 | 356 | ||
@@ -3899,6 +3908,9 @@ static void fan_watchdog_fire(struct work_struct *ignored) | |||
3899 | { | 3908 | { |
3900 | int rc; | 3909 | int rc; |
3901 | 3910 | ||
3911 | if (tpacpi_lifecycle != TPACPI_LIFE_RUNNING) | ||
3912 | return; | ||
3913 | |||
3902 | printk(IBM_NOTICE "fan watchdog: enabling fan\n"); | 3914 | printk(IBM_NOTICE "fan watchdog: enabling fan\n"); |
3903 | rc = fan_set_enable(); | 3915 | rc = fan_set_enable(); |
3904 | if (rc < 0) { | 3916 | if (rc < 0) { |
@@ -3919,7 +3931,8 @@ static void fan_watchdog_reset(void) | |||
3919 | if (fan_watchdog_active) | 3931 | if (fan_watchdog_active) |
3920 | cancel_delayed_work(&fan_watchdog_task); | 3932 | cancel_delayed_work(&fan_watchdog_task); |
3921 | 3933 | ||
3922 | if (fan_watchdog_maxinterval > 0) { | 3934 | if (fan_watchdog_maxinterval > 0 && |
3935 | tpacpi_lifecycle != TPACPI_LIFE_EXITING) { | ||
3923 | fan_watchdog_active = 1; | 3936 | fan_watchdog_active = 1; |
3924 | if (!schedule_delayed_work(&fan_watchdog_task, | 3937 | if (!schedule_delayed_work(&fan_watchdog_task, |
3925 | msecs_to_jiffies(fan_watchdog_maxinterval | 3938 | msecs_to_jiffies(fan_watchdog_maxinterval |
@@ -4685,6 +4698,8 @@ static int __init thinkpad_acpi_module_init(void) | |||
4685 | { | 4698 | { |
4686 | int ret, i; | 4699 | int ret, i; |
4687 | 4700 | ||
4701 | tpacpi_lifecycle = TPACPI_LIFE_INIT; | ||
4702 | |||
4688 | /* Parameter checking */ | 4703 | /* Parameter checking */ |
4689 | if (hotkey_report_mode > 2) | 4704 | if (hotkey_report_mode > 2) |
4690 | return -EINVAL; | 4705 | return -EINVAL; |
@@ -4781,6 +4796,7 @@ static int __init thinkpad_acpi_module_init(void) | |||
4781 | tp_features.input_device_registered = 1; | 4796 | tp_features.input_device_registered = 1; |
4782 | } | 4797 | } |
4783 | 4798 | ||
4799 | tpacpi_lifecycle = TPACPI_LIFE_RUNNING; | ||
4784 | return 0; | 4800 | return 0; |
4785 | } | 4801 | } |
4786 | 4802 | ||
@@ -4788,6 +4804,8 @@ static void thinkpad_acpi_module_exit(void) | |||
4788 | { | 4804 | { |
4789 | struct ibm_struct *ibm, *itmp; | 4805 | struct ibm_struct *ibm, *itmp; |
4790 | 4806 | ||
4807 | tpacpi_lifecycle = TPACPI_LIFE_EXITING; | ||
4808 | |||
4791 | list_for_each_entry_safe_reverse(ibm, itmp, | 4809 | list_for_each_entry_safe_reverse(ibm, itmp, |
4792 | &tpacpi_all_drivers, | 4810 | &tpacpi_all_drivers, |
4793 | all_drivers) { | 4811 | all_drivers) { |