diff options
Diffstat (limited to 'drivers/acpi')
| -rw-r--r-- | drivers/acpi/processor_core.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/processor_idle.c | 7 | ||||
| -rw-r--r-- | drivers/acpi/sbshc.c | 1 | ||||
| -rw-r--r-- | drivers/acpi/scan.c | 18 | ||||
| -rw-r--r-- | drivers/acpi/sleep/main.c | 71 | ||||
| -rw-r--r-- | drivers/acpi/thermal.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/video.c | 2 |
7 files changed, 34 insertions, 69 deletions
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 36a68fa114e3..a825b431b64f 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -822,7 +822,7 @@ static int acpi_processor_remove(struct acpi_device *device, int type) | |||
| 822 | } | 822 | } |
| 823 | 823 | ||
| 824 | processors[pr->id] = NULL; | 824 | processors[pr->id] = NULL; |
| 825 | 825 | processor_device_array[pr->id] = NULL; | |
| 826 | kfree(pr); | 826 | kfree(pr); |
| 827 | 827 | ||
| 828 | return 0; | 828 | return 0; |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index e8e2d8869236..788da9781f80 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -1487,7 +1487,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | |||
| 1487 | return 0; | 1487 | return 0; |
| 1488 | } | 1488 | } |
| 1489 | 1489 | ||
| 1490 | acpi_unlazy_tlb(smp_processor_id()); | ||
| 1491 | /* | 1490 | /* |
| 1492 | * Must be done before busmaster disable as we might need to | 1491 | * Must be done before busmaster disable as we might need to |
| 1493 | * access HPET ! | 1492 | * access HPET ! |
| @@ -1577,6 +1576,8 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | |||
| 1577 | return 0; | 1576 | return 0; |
| 1578 | } | 1577 | } |
| 1579 | 1578 | ||
| 1579 | acpi_unlazy_tlb(smp_processor_id()); | ||
| 1580 | |||
| 1580 | /* Tell the scheduler that we are going deep-idle: */ | 1581 | /* Tell the scheduler that we are going deep-idle: */ |
| 1581 | sched_clock_idle_sleep_event(); | 1582 | sched_clock_idle_sleep_event(); |
| 1582 | /* | 1583 | /* |
| @@ -1692,7 +1693,9 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr) | |||
| 1692 | switch (cx->type) { | 1693 | switch (cx->type) { |
| 1693 | case ACPI_STATE_C1: | 1694 | case ACPI_STATE_C1: |
| 1694 | state->flags |= CPUIDLE_FLAG_SHALLOW; | 1695 | state->flags |= CPUIDLE_FLAG_SHALLOW; |
| 1695 | state->flags |= CPUIDLE_FLAG_TIME_VALID; | 1696 | if (cx->entry_method == ACPI_CSTATE_FFH) |
| 1697 | state->flags |= CPUIDLE_FLAG_TIME_VALID; | ||
| 1698 | |||
| 1696 | state->enter = acpi_idle_enter_c1; | 1699 | state->enter = acpi_idle_enter_c1; |
| 1697 | dev->safe_state = state; | 1700 | dev->safe_state = state; |
| 1698 | break; | 1701 | break; |
diff --git a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c index a2cf3008ce6c..bcf2c70fca87 100644 --- a/drivers/acpi/sbshc.c +++ b/drivers/acpi/sbshc.c | |||
| @@ -130,7 +130,6 @@ static int acpi_smbus_transaction(struct acpi_smb_hc *hc, u8 protocol, | |||
| 130 | goto end; | 130 | goto end; |
| 131 | } | 131 | } |
| 132 | smb_hc_write(hc, ACPI_SMB_COMMAND, command); | 132 | smb_hc_write(hc, ACPI_SMB_COMMAND, command); |
| 133 | smb_hc_write(hc, ACPI_SMB_COMMAND, command); | ||
| 134 | if (!(protocol & 0x01)) { | 133 | if (!(protocol & 0x01)) { |
| 135 | smb_hc_write(hc, ACPI_SMB_BLOCK_COUNT, length); | 134 | smb_hc_write(hc, ACPI_SMB_BLOCK_COUNT, length); |
| 136 | for (i = 0; i < length; ++i) | 135 | for (i = 0; i < length; ++i) |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 57570ac47803..e6ce262b5d44 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -39,20 +39,26 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias, | |||
| 39 | int size) | 39 | int size) |
| 40 | { | 40 | { |
| 41 | int len; | 41 | int len; |
| 42 | int count; | ||
| 42 | 43 | ||
| 43 | if (!acpi_dev->flags.hardware_id) | 44 | if (!acpi_dev->flags.hardware_id && !acpi_dev->flags.compatible_ids) |
| 44 | return -ENODEV; | 45 | return -ENODEV; |
| 45 | 46 | ||
| 46 | len = snprintf(modalias, size, "acpi:%s:", | 47 | len = snprintf(modalias, size, "acpi:"); |
| 47 | acpi_dev->pnp.hardware_id); | ||
| 48 | if (len < 0 || len >= size) | ||
| 49 | return -EINVAL; | ||
| 50 | size -= len; | 48 | size -= len; |
| 51 | 49 | ||
| 50 | if (acpi_dev->flags.hardware_id) { | ||
| 51 | count = snprintf(&modalias[len], size, "%s:", | ||
| 52 | acpi_dev->pnp.hardware_id); | ||
| 53 | if (count < 0 || count >= size) | ||
| 54 | return -EINVAL; | ||
| 55 | len += count; | ||
| 56 | size -= count; | ||
| 57 | } | ||
| 58 | |||
| 52 | if (acpi_dev->flags.compatible_ids) { | 59 | if (acpi_dev->flags.compatible_ids) { |
| 53 | struct acpi_compatible_id_list *cid_list; | 60 | struct acpi_compatible_id_list *cid_list; |
| 54 | int i; | 61 | int i; |
| 55 | int count; | ||
| 56 | 62 | ||
| 57 | cid_list = acpi_dev->pnp.cid_list; | 63 | cid_list = acpi_dev->pnp.cid_list; |
| 58 | for (i = 0; i < cid_list->count; i++) { | 64 | for (i = 0; i < cid_list->count; i++) { |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index d2f71a54726c..71183eea7906 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
| @@ -26,21 +26,6 @@ u8 sleep_states[ACPI_S_STATE_COUNT]; | |||
| 26 | 26 | ||
| 27 | #ifdef CONFIG_PM_SLEEP | 27 | #ifdef CONFIG_PM_SLEEP |
| 28 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; | 28 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; |
| 29 | static bool acpi_sleep_finish_wake_up; | ||
| 30 | |||
| 31 | /* | ||
| 32 | * ACPI 2.0 and later want us to execute _PTS after suspending devices, so we | ||
| 33 | * allow the user to request that behavior by using the 'acpi_new_pts_ordering' | ||
| 34 | * kernel command line option that causes the following variable to be set. | ||
| 35 | */ | ||
| 36 | static bool new_pts_ordering; | ||
| 37 | |||
| 38 | static int __init acpi_new_pts_ordering(char *str) | ||
| 39 | { | ||
| 40 | new_pts_ordering = true; | ||
| 41 | return 1; | ||
| 42 | } | ||
| 43 | __setup("acpi_new_pts_ordering", acpi_new_pts_ordering); | ||
| 44 | #endif | 29 | #endif |
| 45 | 30 | ||
| 46 | static int acpi_sleep_prepare(u32 acpi_state) | 31 | static int acpi_sleep_prepare(u32 acpi_state) |
| @@ -91,14 +76,6 @@ static int acpi_pm_begin(suspend_state_t pm_state) | |||
| 91 | 76 | ||
| 92 | if (sleep_states[acpi_state]) { | 77 | if (sleep_states[acpi_state]) { |
| 93 | acpi_target_sleep_state = acpi_state; | 78 | acpi_target_sleep_state = acpi_state; |
| 94 | if (new_pts_ordering) | ||
| 95 | return 0; | ||
| 96 | |||
| 97 | error = acpi_sleep_prepare(acpi_state); | ||
| 98 | if (error) | ||
| 99 | acpi_target_sleep_state = ACPI_STATE_S0; | ||
| 100 | else | ||
| 101 | acpi_sleep_finish_wake_up = true; | ||
| 102 | } else { | 79 | } else { |
| 103 | printk(KERN_ERR "ACPI does not support this state: %d\n", | 80 | printk(KERN_ERR "ACPI does not support this state: %d\n", |
| 104 | pm_state); | 81 | pm_state); |
| @@ -116,14 +93,11 @@ static int acpi_pm_begin(suspend_state_t pm_state) | |||
| 116 | 93 | ||
| 117 | static int acpi_pm_prepare(void) | 94 | static int acpi_pm_prepare(void) |
| 118 | { | 95 | { |
| 119 | if (new_pts_ordering) { | 96 | int error = acpi_sleep_prepare(acpi_target_sleep_state); |
| 120 | int error = acpi_sleep_prepare(acpi_target_sleep_state); | ||
| 121 | 97 | ||
| 122 | if (error) { | 98 | if (error) { |
| 123 | acpi_target_sleep_state = ACPI_STATE_S0; | 99 | acpi_target_sleep_state = ACPI_STATE_S0; |
| 124 | return error; | 100 | return error; |
| 125 | } | ||
| 126 | acpi_sleep_finish_wake_up = true; | ||
| 127 | } | 101 | } |
| 128 | 102 | ||
| 129 | return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT; | 103 | return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT; |
| @@ -212,7 +186,6 @@ static void acpi_pm_finish(void) | |||
| 212 | acpi_set_firmware_waking_vector((acpi_physical_address) 0); | 186 | acpi_set_firmware_waking_vector((acpi_physical_address) 0); |
| 213 | 187 | ||
| 214 | acpi_target_sleep_state = ACPI_STATE_S0; | 188 | acpi_target_sleep_state = ACPI_STATE_S0; |
| 215 | acpi_sleep_finish_wake_up = false; | ||
| 216 | 189 | ||
| 217 | #ifdef CONFIG_X86 | 190 | #ifdef CONFIG_X86 |
| 218 | if (init_8259A_after_S1) { | 191 | if (init_8259A_after_S1) { |
| @@ -229,11 +202,10 @@ static void acpi_pm_finish(void) | |||
| 229 | static void acpi_pm_end(void) | 202 | static void acpi_pm_end(void) |
| 230 | { | 203 | { |
| 231 | /* | 204 | /* |
| 232 | * This is necessary in case acpi_pm_finish() is not called directly | 205 | * This is necessary in case acpi_pm_finish() is not called during a |
| 233 | * during a failing transition to a sleep state. | 206 | * failing transition to a sleep state. |
| 234 | */ | 207 | */ |
| 235 | if (acpi_sleep_finish_wake_up) | 208 | acpi_target_sleep_state = ACPI_STATE_S0; |
| 236 | acpi_pm_finish(); | ||
| 237 | } | 209 | } |
| 238 | 210 | ||
| 239 | static int acpi_pm_state_valid(suspend_state_t pm_state) | 211 | static int acpi_pm_state_valid(suspend_state_t pm_state) |
| @@ -285,31 +257,18 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
| 285 | #ifdef CONFIG_HIBERNATION | 257 | #ifdef CONFIG_HIBERNATION |
| 286 | static int acpi_hibernation_begin(void) | 258 | static int acpi_hibernation_begin(void) |
| 287 | { | 259 | { |
| 288 | int error; | ||
| 289 | |||
| 290 | acpi_target_sleep_state = ACPI_STATE_S4; | 260 | acpi_target_sleep_state = ACPI_STATE_S4; |
| 291 | if (new_pts_ordering) | ||
| 292 | return 0; | ||
| 293 | 261 | ||
| 294 | error = acpi_sleep_prepare(ACPI_STATE_S4); | 262 | return 0; |
| 295 | if (error) | ||
| 296 | acpi_target_sleep_state = ACPI_STATE_S0; | ||
| 297 | else | ||
| 298 | acpi_sleep_finish_wake_up = true; | ||
| 299 | |||
| 300 | return error; | ||
| 301 | } | 263 | } |
| 302 | 264 | ||
| 303 | static int acpi_hibernation_prepare(void) | 265 | static int acpi_hibernation_prepare(void) |
| 304 | { | 266 | { |
| 305 | if (new_pts_ordering) { | 267 | int error = acpi_sleep_prepare(ACPI_STATE_S4); |
| 306 | int error = acpi_sleep_prepare(ACPI_STATE_S4); | ||
| 307 | 268 | ||
| 308 | if (error) { | 269 | if (error) { |
| 309 | acpi_target_sleep_state = ACPI_STATE_S0; | 270 | acpi_target_sleep_state = ACPI_STATE_S0; |
| 310 | return error; | 271 | return error; |
| 311 | } | ||
| 312 | acpi_sleep_finish_wake_up = true; | ||
| 313 | } | 272 | } |
| 314 | 273 | ||
| 315 | return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT; | 274 | return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT; |
| @@ -353,17 +312,15 @@ static void acpi_hibernation_finish(void) | |||
| 353 | acpi_set_firmware_waking_vector((acpi_physical_address) 0); | 312 | acpi_set_firmware_waking_vector((acpi_physical_address) 0); |
| 354 | 313 | ||
| 355 | acpi_target_sleep_state = ACPI_STATE_S0; | 314 | acpi_target_sleep_state = ACPI_STATE_S0; |
| 356 | acpi_sleep_finish_wake_up = false; | ||
| 357 | } | 315 | } |
| 358 | 316 | ||
| 359 | static void acpi_hibernation_end(void) | 317 | static void acpi_hibernation_end(void) |
| 360 | { | 318 | { |
| 361 | /* | 319 | /* |
| 362 | * This is necessary in case acpi_hibernation_finish() is not called | 320 | * This is necessary in case acpi_hibernation_finish() is not called |
| 363 | * directly during a failing transition to the sleep state. | 321 | * during a failing transition to the sleep state. |
| 364 | */ | 322 | */ |
| 365 | if (acpi_sleep_finish_wake_up) | 323 | acpi_target_sleep_state = ACPI_STATE_S0; |
| 366 | acpi_hibernation_finish(); | ||
| 367 | } | 324 | } |
| 368 | 325 | ||
| 369 | static int acpi_hibernation_pre_restore(void) | 326 | static int acpi_hibernation_pre_restore(void) |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index c4e00ac8ea85..1bcecc7dd2ca 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
| @@ -1125,7 +1125,7 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz) | |||
| 1125 | tz->trips.active[i].flags.valid; i++, trips++); | 1125 | tz->trips.active[i].flags.valid; i++, trips++); |
| 1126 | tz->thermal_zone = thermal_zone_device_register("ACPI thermal zone", | 1126 | tz->thermal_zone = thermal_zone_device_register("ACPI thermal zone", |
| 1127 | trips, tz, &acpi_thermal_zone_ops); | 1127 | trips, tz, &acpi_thermal_zone_ops); |
| 1128 | if (!tz->thermal_zone) | 1128 | if (IS_ERR(tz->thermal_zone)) |
| 1129 | return -ENODEV; | 1129 | return -ENODEV; |
| 1130 | 1130 | ||
| 1131 | result = sysfs_create_link(&tz->device->dev.kobj, | 1131 | result = sysfs_create_link(&tz->device->dev.kobj, |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 12fb44f16766..980a74188781 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -713,7 +713,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
| 713 | 713 | ||
| 714 | kfree(obj); | 714 | kfree(obj); |
| 715 | 715 | ||
| 716 | if (device->cap._BCL && device->cap._BCM && max_level > 0) { | 716 | if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){ |
| 717 | int result; | 717 | int result; |
| 718 | static int count = 0; | 718 | static int count = 0; |
| 719 | char *name; | 719 | char *name; |
