#include <linux/cpu_pm.h>
#include <linux/init.h>
#include <asm/dsp.h>
#include <asm/fpu.h>
#include <asm/mmu_context.h>
#include <asm/pm.h>
#include <asm/watch.h>
struct mips_static_suspend_state mips_static_suspend_state;
static int mips_cpu_save(void)
{
lose_fpu(1);
save_dsp(current);
return 0;
}
static void mips_cpu_restore(void)
{
unsigned int cpu = smp_processor_id();
if (current->mm)
write_c0_entryhi(cpu_asid(cpu, current->mm));
restore_dsp(current);
if (cpu_has_userlocal)
write_c0_userlocal(current_thread_info()->tp_value);
__restore_watch(current);
}
static int mips_pm_notifier(struct notifier_block *self, unsigned long cmd,
void *v)
{
int ret;
switch (cmd) {
case CPU_PM_ENTER:
ret = mips_cpu_save();
if (ret)
return NOTIFY_STOP;
break;
case CPU_PM_ENTER_FAILED:
case CPU_PM_EXIT:
mips_cpu_restore();
break;
}
return NOTIFY_OK;
}
static struct notifier_block mips_pm_notifier_block = {
.notifier_call = mips_pm_notifier,
};
static int __init mips_pm_init(void)
{
return cpu_pm_register_notifier(&mips_pm_notifier_block);
}
arch_initcall(mips_pm_init);