int pxa_pm_enter(suspend_state_t state) { unsigned long sleep_save_checksum = 0, checksum = 0; int i; #ifdef CONFIG_IWMMXT /* force any iWMMXt context to ram **/ if (elf_hwcap & HWCAP_IWMMXT) iwmmxt_task_disable(NULL); #endif /* skip registers saving for standby */ if (state != PM_SUSPEND_STANDBY) { pxa_cpu_pm_fns->save(sleep_save); /* before sleeping, calculate and save a checksum */ for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++) sleep_save_checksum += sleep_save[i]; } /* *** go zzz *** */ pxa_cpu_pm_fns->enter(state); cpu_init(); if (state != PM_SUSPEND_STANDBY) { /* after sleeping, validate the checksum */ for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++) checksum += sleep_save[i]; /* if invalid, display message and wait for a hardware reset */ if (checksum != sleep_save_checksum) { lubbock_set_hexled(0xbadbadc5); while (1) pxa_cpu_pm_fns->enter(state); } pxa_cpu_pm_fns->restore(sleep_save); } pr_debug("*** made it back from resume\n"); return 0; }
int pxa_pm_enter(suspend_state_t state) { unsigned long sleep_save_checksum = 0, checksum = 0; int i; #ifdef CONFIG_IWMMXT if (elf_hwcap & HWCAP_IWMMXT) iwmmxt_task_disable(NULL); #endif if (state != PM_SUSPEND_STANDBY && pxa_cpu_pm_fns->save) { pxa_cpu_pm_fns->save(sleep_save); for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++) sleep_save_checksum += sleep_save[i]; } pxa_cpu_pm_fns->enter(state); if (state != PM_SUSPEND_STANDBY && pxa_cpu_pm_fns->restore) { for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++) checksum += sleep_save[i]; if (checksum != sleep_save_checksum) { lubbock_set_hexled(0xbadbadc5); while (1) pxa_cpu_pm_fns->enter(state); } pxa_cpu_pm_fns->restore(sleep_save); } pr_debug("*** made it back from resume\n"); return 0; }