aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/processor_idle.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/processor_idle.c')
-rw-r--r--drivers/acpi/processor_idle.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index d592dbb1d12..283c08f5f4d 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -272,6 +272,8 @@ static atomic_t c3_cpu_count;
272/* Common C-state entry for C2, C3, .. */ 272/* Common C-state entry for C2, C3, .. */
273static void acpi_cstate_enter(struct acpi_processor_cx *cstate) 273static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
274{ 274{
275 /* Don't trace irqs off for idle */
276 stop_critical_timings();
275 if (cstate->entry_method == ACPI_CSTATE_FFH) { 277 if (cstate->entry_method == ACPI_CSTATE_FFH) {
276 /* Call into architectural FFH based C-state */ 278 /* Call into architectural FFH based C-state */
277 acpi_processor_ffh_cstate_enter(cstate); 279 acpi_processor_ffh_cstate_enter(cstate);
@@ -284,6 +286,7 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
284 gets asserted in time to freeze execution properly. */ 286 gets asserted in time to freeze execution properly. */
285 unused = inl(acpi_gbl_FADT.xpm_timer_block.address); 287 unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
286 } 288 }
289 start_critical_timings();
287} 290}
288#endif /* !CONFIG_CPU_IDLE */ 291#endif /* !CONFIG_CPU_IDLE */
289 292
@@ -1329,9 +1332,15 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr)
1329 if (!pr->flags.power_setup_done) 1332 if (!pr->flags.power_setup_done)
1330 return -ENODEV; 1333 return -ENODEV;
1331 1334
1332 /* Fall back to the default idle loop */ 1335 /*
1333 pm_idle = pm_idle_save; 1336 * Fall back to the default idle loop, when pm_idle_save had
1334 synchronize_sched(); /* Relies on interrupts forcing exit from idle. */ 1337 * been initialized.
1338 */
1339 if (pm_idle_save) {
1340 pm_idle = pm_idle_save;
1341 /* Relies on interrupts forcing exit from idle. */
1342 synchronize_sched();
1343 }
1335 1344
1336 pr->flags.power = 0; 1345 pr->flags.power = 0;
1337 result = acpi_processor_get_power_info(pr); 1346 result = acpi_processor_get_power_info(pr);
@@ -1418,6 +1427,8 @@ static inline void acpi_idle_update_bm_rld(struct acpi_processor *pr,
1418 */ 1427 */
1419static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx) 1428static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
1420{ 1429{
1430 /* Don't trace irqs off for idle */
1431 stop_critical_timings();
1421 if (cx->entry_method == ACPI_CSTATE_FFH) { 1432 if (cx->entry_method == ACPI_CSTATE_FFH) {
1422 /* Call into architectural FFH based C-state */ 1433 /* Call into architectural FFH based C-state */
1423 acpi_processor_ffh_cstate_enter(cx); 1434 acpi_processor_ffh_cstate_enter(cx);
@@ -1432,6 +1443,7 @@ static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
1432 gets asserted in time to freeze execution properly. */ 1443 gets asserted in time to freeze execution properly. */
1433 unused = inl(acpi_gbl_FADT.xpm_timer_block.address); 1444 unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
1434 } 1445 }
1446 start_critical_timings();
1435} 1447}
1436 1448
1437/** 1449/**
@@ -1890,7 +1902,8 @@ int acpi_processor_power_exit(struct acpi_processor *pr,
1890 1902
1891 /* Unregister the idle handler when processor #0 is removed. */ 1903 /* Unregister the idle handler when processor #0 is removed. */
1892 if (pr->id == 0) { 1904 if (pr->id == 0) {
1893 pm_idle = pm_idle_save; 1905 if (pm_idle_save)
1906 pm_idle = pm_idle_save;
1894 1907
1895 /* 1908 /*
1896 * We are about to unload the current idle thread pm callback 1909 * We are about to unload the current idle thread pm callback