pm.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 697 行 · 第 1/2 页

C
697
字号
		MPUI1510_RESTORE(MPUI_CTRL);		MPUI1510_RESTORE(MPUI_DSP_BOOT_CONFIG);		MPUI1510_RESTORE(MPUI_DSP_API_CONFIG);		MPUI1510_RESTORE(EMIFS_CONFIG);		MPUI1510_RESTORE(EMIFF_SDRAM_CONFIG);		MPUI1510_RESTORE(OMAP_IH1_MIR);		MPUI1510_RESTORE(OMAP_IH2_MIR);	} else if (cpu_is_omap16xx()) {		MPUI1610_RESTORE(MPUI_CTRL);		MPUI1610_RESTORE(MPUI_DSP_BOOT_CONFIG);		MPUI1610_RESTORE(MPUI_DSP_API_CONFIG);		MPUI1610_RESTORE(EMIFS_CONFIG);		MPUI1610_RESTORE(EMIFF_SDRAM_CONFIG);		MPUI1610_RESTORE(OMAP_IH1_MIR);		MPUI1610_RESTORE(OMAP_IH2_0_MIR);		MPUI1610_RESTORE(OMAP_IH2_1_MIR);		MPUI1610_RESTORE(OMAP_IH2_2_MIR);		MPUI1610_RESTORE(OMAP_IH2_3_MIR);	}	/*	 * Reenable interrupts	 */	sti();	stf();	printk("PM: OMAP%x is re-starting from deep sleep...\n", system_rev);	if (machine_is_omap_osk()) {		/* Let LED1 (D9) blink again */		tps65010_set_led(LED1, BLINK);	}}#ifdef CONFIG_PROC_FSstatic int g_read_completed;/* * Writing to /proc/pm puts the CPU in sleep mode */static ssize_tomap_pm_write_proc(struct file * file, const char * buf, size_t count,    loff_t *ppos){	int rc;	rc = pm_send_all(PM_SUSPEND, (void *)3);	if (rc == 0) {		omap_pm_suspend();		pm_send_all(PM_RESUME, (void *)0);	}	return count;}static int omap_pm_read_proc(	char *page_buffer,	char **my_first_byte,	off_t virtual_start,	int length,	int *eof,	void *data){	int my_buffer_offset = 0;	char * const my_base = page_buffer;	ARM_SAVE(ARM_CKCTL);	ARM_SAVE(ARM_IDLECT1);	ARM_SAVE(ARM_IDLECT2);	ARM_SAVE(ARM_EWUPCT);	ARM_SAVE(ARM_RSTCT1);	ARM_SAVE(ARM_RSTCT2);	ARM_SAVE(ARM_SYSST);	ULPD_SAVE(ULPD_IT_STATUS);	ULPD_SAVE(ULPD_CLOCK_CTRL);	ULPD_SAVE(ULPD_SOFT_REQ);	ULPD_SAVE(ULPD_STATUS_REQ);	ULPD_SAVE(ULPD_DPLL_CTRL);	ULPD_SAVE(ULPD_POWER_CTRL);	if (cpu_is_omap1510()) {		MPUI1510_SAVE(MPUI_CTRL);		MPUI1510_SAVE(MPUI_DSP_STATUS);		MPUI1510_SAVE(MPUI_DSP_BOOT_CONFIG);		MPUI1510_SAVE(MPUI_DSP_API_CONFIG);		MPUI1510_SAVE(EMIFF_SDRAM_CONFIG);		MPUI1510_SAVE(EMIFS_CONFIG);	} else if (cpu_is_omap16xx()) {		MPUI1610_SAVE(MPUI_CTRL);		MPUI1610_SAVE(MPUI_DSP_STATUS);		MPUI1610_SAVE(MPUI_DSP_BOOT_CONFIG);		MPUI1610_SAVE(MPUI_DSP_API_CONFIG);		MPUI1610_SAVE(EMIFF_SDRAM_CONFIG);		MPUI1610_SAVE(EMIFS_CONFIG);	}	if (virtual_start == 0) {		g_read_completed = 0;		my_buffer_offset += sprintf(my_base + my_buffer_offset,		   "ARM_CKCTL_REG:            0x%-8x     \n"		   "ARM_IDLECT1_REG:          0x%-8x     \n"		   "ARM_IDLECT2_REG:          0x%-8x     \n"		   "ARM_EWUPCT_REG:           0x%-8x     \n"		   "ARM_RSTCT1_REG:           0x%-8x     \n"		   "ARM_RSTCT2_REG:           0x%-8x     \n"		   "ARM_SYSST_REG:            0x%-8x     \n"		   "ULPD_IT_STATUS_REG:       0x%-4x     \n"		   "ULPD_CLOCK_CTRL_REG:      0x%-4x     \n"		   "ULPD_SOFT_REQ_REG:        0x%-4x     \n"		   "ULPD_DPLL_CTRL_REG:       0x%-4x     \n"		   "ULPD_STATUS_REQ_REG:      0x%-4x     \n"		   "ULPD_POWER_CTRL_REG:      0x%-4x     \n",		   ARM_SHOW(ARM_CKCTL),		   ARM_SHOW(ARM_IDLECT1),		   ARM_SHOW(ARM_IDLECT2),		   ARM_SHOW(ARM_EWUPCT),		   ARM_SHOW(ARM_RSTCT1),		   ARM_SHOW(ARM_RSTCT2),		   ARM_SHOW(ARM_SYSST),		   ULPD_SHOW(ULPD_IT_STATUS),		   ULPD_SHOW(ULPD_CLOCK_CTRL),		   ULPD_SHOW(ULPD_SOFT_REQ),		   ULPD_SHOW(ULPD_DPLL_CTRL),		   ULPD_SHOW(ULPD_STATUS_REQ),		   ULPD_SHOW(ULPD_POWER_CTRL));		if (cpu_is_omap1510()) {			my_buffer_offset += sprintf(my_base + my_buffer_offset,			   "MPUI1510_CTRL_REG             0x%-8x \n"			   "MPUI1510_DSP_STATUS_REG:      0x%-8x \n"			   "MPUI1510_DSP_BOOT_CONFIG_REG: 0x%-8x \n"		   	   "MPUI1510_DSP_API_CONFIG_REG:  0x%-8x \n"		   	   "MPUI1510_SDRAM_CONFIG_REG:    0x%-8x \n"		   	   "MPUI1510_EMIFS_CONFIG_REG:    0x%-8x \n",		   	   MPUI1510_SHOW(MPUI_CTRL),		   	   MPUI1510_SHOW(MPUI_DSP_STATUS),		   	   MPUI1510_SHOW(MPUI_DSP_BOOT_CONFIG),		   	   MPUI1510_SHOW(MPUI_DSP_API_CONFIG),		   	   MPUI1510_SHOW(EMIFF_SDRAM_CONFIG),		   	   MPUI1510_SHOW(EMIFS_CONFIG));		} else if (cpu_is_omap16xx()) {			my_buffer_offset += sprintf(my_base + my_buffer_offset,			   "MPUI1610_CTRL_REG             0x%-8x \n"			   "MPUI1610_DSP_STATUS_REG:      0x%-8x \n"			   "MPUI1610_DSP_BOOT_CONFIG_REG: 0x%-8x \n"		   	   "MPUI1610_DSP_API_CONFIG_REG:  0x%-8x \n"		   	   "MPUI1610_SDRAM_CONFIG_REG:    0x%-8x \n"		   	   "MPUI1610_EMIFS_CONFIG_REG:    0x%-8x \n",		   	   MPUI1610_SHOW(MPUI_CTRL),		   	   MPUI1610_SHOW(MPUI_DSP_STATUS),		   	   MPUI1610_SHOW(MPUI_DSP_BOOT_CONFIG),		   	   MPUI1610_SHOW(MPUI_DSP_API_CONFIG),		   	   MPUI1610_SHOW(EMIFF_SDRAM_CONFIG),		   	   MPUI1610_SHOW(EMIFS_CONFIG));		}		g_read_completed++;	} else if (g_read_completed >= 1) {		 *eof = 1;		 return 0;	}	g_read_completed++;	*my_first_byte = page_buffer;	return  my_buffer_offset;}/* *	omap_pm_prepare - Do preliminary suspend work. *	@state:		suspend state we're entering. * */static int omap_pm_prepare(u32 state){	int error = 0;	switch (state)	{	case PM_SUSPEND_STANDBY:	case PM_SUSPEND_MEM:		break;	case PM_SUSPEND_DISK:		return -ENOTSUPP;	default:		return -EINVAL;	}	return error;}/* *	omap_pm_enter - Actually enter a sleep state. *	@state:		State we're entering. * */static int omap_pm_enter(u32 state){	switch (state)	{	case PM_SUSPEND_STANDBY:	case PM_SUSPEND_MEM:		omap_pm_suspend();		break;	case PM_SUSPEND_DISK:		return -ENOTSUPP;	default:		return -EINVAL;	}	return 0;}/** *	omap_pm_finish - Finish up suspend sequence. *	@state:		State we're coming out of. * *	This is called after we wake back up (or if entering the sleep state *	failed). */static int omap_pm_finish(u32 state){	return 0;}struct pm_ops omap_pm_ops ={	.pm_disk_mode = 0,        .prepare        = omap_pm_prepare,        .enter          = omap_pm_enter,        .finish         = omap_pm_finish,};static int __init omap_pm_init(void){	struct proc_dir_entry *entry;	printk("Power Management for TI OMAP.\n");	pm_idle = omap_pm_idle;	/*	 * We copy the assembler sleep/wakeup routines to SRAM.	 * These routines need to be in SRAM as that's the only	 * memory the MPU can see when it wakes up.	 */#ifdef	CONFIG_ARCH_OMAP1510	if (cpu_is_omap1510()) {		memcpy((void *)OMAP1510_SRAM_IDLE_SUSPEND, omap1510_idle_loop_suspend,		       omap1510_idle_loop_suspend_sz);		memcpy((void *)OMAP1510_SRAM_API_SUSPEND, omap1510_cpu_suspend,		       omap1510_cpu_suspend_sz);	} else#endif	if (cpu_is_omap1610() || cpu_is_omap1710()) {		memcpy((void *)OMAP1610_SRAM_IDLE_SUSPEND, omap1610_idle_loop_suspend,		       omap1610_idle_loop_suspend_sz);		memcpy((void *)OMAP1610_SRAM_API_SUSPEND, omap1610_cpu_suspend,		       omap1610_cpu_suspend_sz);	} else if (cpu_is_omap5912()) {		memcpy((void *)OMAP5912_SRAM_IDLE_SUSPEND, omap1610_idle_loop_suspend,		       omap1610_idle_loop_suspend_sz);		memcpy((void *)OMAP5912_SRAM_API_SUSPEND, omap1610_cpu_suspend,		       omap1610_cpu_suspend_sz);	}	pm_set_ops(&omap_pm_ops);	entry = create_proc_read_entry("pm", S_IWUSR | S_IRUGO, NULL,	    omap_pm_read_proc, 0);	if (entry) {		entry->write_proc = (write_proc_t *)omap_pm_write_proc;	}	return 0;}__initcall(omap_pm_init);#endif /* CONFIG_PROC_FS */#ifdef CONFIG_SYSCTL/* * ARGH!  ACPI people defined CTL_ACPI in linux/acpi.h rather than * linux/sysctl.h. */#define CTL_ACPI 9999#define APM_S1_SLP_TYP 19/* * Send us to sleep. */static int sysctl_omap_pm_suspend(void){	int retval;	retval = pm_send_all(PM_SUSPEND, (void *)3);	if (retval == 0) {		omap_pm_suspend();		pm_send_all(PM_RESUME, (void *)0);	}	return retval;}static struct ctl_table pm_table[] ={	{APM_S1_SLP_TYP, "suspend", NULL, 0, 0600, NULL,	    (proc_handler *)&sysctl_omap_pm_suspend},	{0}};static struct ctl_table pm_dir_table[] ={	{CTL_ACPI, "pm", NULL, 0, 0555, pm_table},	{0}};/* * Initialize power interface */static int __init pm_init(void){	register_sysctl_table(pm_dir_table, 1);	return 0;}__initcall(pm_init);#endif /* CONFIG_SYSCTL */

⌨️ 快捷键说明

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