⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pm.c

📁 优龙2410linux2.6.8内核源代码
💻 C
字号:
/* * SA1100 Power Management Routines * * Copyright (c) 2001 Cliff Brake <cbrake@accelent.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License. * * History: * * 2001-02-06:	Cliff Brake         Initial code * * 2001-02-25:	Sukjae Cho <sjcho@east.isi.edu> & * 		Chester Kuo <chester@linux.org.tw> * 			Save more value for the resume function! Support * 			Bitsy/Assabet/Freebird board * * 2001-08-29:	Nicolas Pitre <nico@cam.org> * 			Cleaned up, pushed platform dependent stuff * 			in the platform specific files. * * 2002-05-27:	Nicolas Pitre	Killed sleep.h and the kmalloced save array. * 				Storage is local on the stack now. */#include <linux/init.h>#include <linux/suspend.h>#include <linux/errno.h>#include <linux/time.h>#include <asm/hardware.h>#include <asm/memory.h>#include <asm/system.h>extern void sa1100_cpu_suspend(void);extern void sa1100_cpu_resume(void);#define SAVE(x)		sleep_save[SLEEP_SAVE_##x] = x#define RESTORE(x)	x = sleep_save[SLEEP_SAVE_##x]/* * List of global SA11x0 peripheral registers to preserve. * More ones like CP and general purpose register values are preserved * on the stack and then the stack pointer is stored last in sleep.S. */enum {	SLEEP_SAVE_SP = 0,	SLEEP_SAVE_OSCR, SLEEP_SAVE_OIER,	SLEEP_SAVE_OSMR0, SLEEP_SAVE_OSMR1, SLEEP_SAVE_OSMR2, SLEEP_SAVE_OSMR3,	SLEEP_SAVE_GPDR, SLEEP_SAVE_GAFR,	SLEEP_SAVE_PPDR, SLEEP_SAVE_PPSR, SLEEP_SAVE_PPAR, SLEEP_SAVE_PSDR,	SLEEP_SAVE_Ser1SDCR0,	SLEEP_SAVE_SIZE};static int sa11x0_pm_enter(u32 state){	unsigned long sleep_save[SLEEP_SAVE_SIZE];	unsigned long delta, gpio;	if (state != PM_SUSPEND_MEM)		return -EINVAL;	/* preserve current time */	delta = xtime.tv_sec - RCNR;	gpio = GPLR;	/* save vital registers */	SAVE(OSCR);	SAVE(OSMR0);	SAVE(OSMR1);	SAVE(OSMR2);	SAVE(OSMR3);	SAVE(OIER);	SAVE(GPDR);	SAVE(GAFR);	SAVE(PPDR);	SAVE(PPSR);	SAVE(PPAR);	SAVE(PSDR);	SAVE(Ser1SDCR0);	/* Clear previous reset status */	RCSR = RCSR_HWR | RCSR_SWR | RCSR_WDR | RCSR_SMR;	/* set resume return address */	PSPR = virt_to_phys(sa1100_cpu_resume);	/* go zzz */	sa1100_cpu_suspend();	/*	 * Ensure not to come back here if it wasn't intended	 */	PSPR = 0;	/*	 * Ensure interrupt sources are disabled; we will re-init	 * the interrupt subsystem via the device manager.	 */	ICLR = 0;	ICCR = 1;	ICMR = 0;	/* restore registers */	RESTORE(GPDR);	RESTORE(GAFR);	RESTORE(PPDR);	RESTORE(PPSR);	RESTORE(PPAR);	RESTORE(PSDR);	RESTORE(Ser1SDCR0);	GPSR = gpio;	GPCR = ~gpio;	/*	 * Clear the peripheral sleep-hold bit.	 */	PSSR = PSSR_PH;	RESTORE(OSMR0);	RESTORE(OSMR1);	RESTORE(OSMR2);	RESTORE(OSMR3);	RESTORE(OSCR);	RESTORE(OIER);	/* restore current time */	xtime.tv_sec = RCNR + delta;	return 0;}unsigned long sleep_phys_sp(void *sp){	return virt_to_phys(sp);}/* * Called after processes are frozen, but before we shut down devices. */static int sa11x0_pm_prepare(u32 state){	return 0;}/* * Called after devices are re-setup, but before processes are thawed. */static int sa11x0_pm_finish(u32 state){	return 0;}/* * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk. */static struct pm_ops sa11x0_pm_ops = {	.pm_disk_mode	= PM_DISK_FIRMWARE,	.prepare	= sa11x0_pm_prepare,	.enter		= sa11x0_pm_enter,	.finish		= sa11x0_pm_finish,};static int __init sa11x0_pm_init(void){	pm_set_ops(&sa11x0_pm_ops);	return 0;}late_initcall(sa11x0_pm_init);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -