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 + -
显示快捷键?