-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ARM] 3430/1: ARM: OMAP: 5/8 Update PM
Patch from Tony Lindgren Update OMAP PM code from linux-omap tree: - Move PM code from plat-omap to mach-omap1 and mach-omap2 by Tony Lindgren - Add minimal PM support for omap24xx by Tony Lindgren and Richard Woodruff - Misc updates to omap1 PM code by Tuukka Tikkanen et al - Updates to the SRAM code needed for PM and FB by Imre Deak Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
- Loading branch information
Tony Lindgren
authored and
Russell King
committed
Apr 2, 2006
1 parent
6e60e79
commit 670c104
Showing
9 changed files
with
1,354 additions
and
51 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
/* | ||
* linux/arch/arm/mach-omap2/pm.c | ||
* | ||
* OMAP2 Power Management Routines | ||
* | ||
* Copyright (C) 2006 Nokia Corporation | ||
* Tony Lindgren <tony@atomide.com> | ||
* | ||
* Copyright (C) 2005 Texas Instruments, Inc. | ||
* Richard Woodruff <r-woodruff2@ti.com> | ||
* | ||
* Based on pm.c for omap1 | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/pm.h> | ||
#include <linux/sched.h> | ||
#include <linux/proc_fs.h> | ||
#include <linux/pm.h> | ||
#include <linux/interrupt.h> | ||
#include <linux/sysfs.h> | ||
#include <linux/module.h> | ||
|
||
#include <asm/io.h> | ||
#include <asm/irq.h> | ||
#include <asm/atomic.h> | ||
#include <asm/mach/time.h> | ||
#include <asm/mach/irq.h> | ||
#include <asm/mach-types.h> | ||
|
||
#include <asm/arch/irqs.h> | ||
#include <asm/arch/clock.h> | ||
#include <asm/arch/sram.h> | ||
#include <asm/arch/pm.h> | ||
|
||
static struct clk *vclk; | ||
static void (*omap2_sram_idle)(void); | ||
static void (*omap2_sram_suspend)(int dllctrl, int cpu_rev); | ||
static void (*saved_idle)(void); | ||
|
||
void omap2_pm_idle(void) | ||
{ | ||
local_irq_disable(); | ||
local_fiq_disable(); | ||
if (need_resched()) { | ||
local_fiq_enable(); | ||
local_irq_enable(); | ||
return; | ||
} | ||
|
||
/* | ||
* Since an interrupt may set up a timer, we don't want to | ||
* reprogram the hardware timer with interrupts enabled. | ||
* Re-enable interrupts only after returning from idle. | ||
*/ | ||
timer_dyn_reprogram(); | ||
|
||
omap2_sram_idle(); | ||
local_fiq_enable(); | ||
local_irq_enable(); | ||
} | ||
|
||
static int omap2_pm_prepare(suspend_state_t state) | ||
{ | ||
int error = 0; | ||
|
||
/* We cannot sleep in idle until we have resumed */ | ||
saved_idle = pm_idle; | ||
pm_idle = NULL; | ||
|
||
switch (state) | ||
{ | ||
case PM_SUSPEND_STANDBY: | ||
case PM_SUSPEND_MEM: | ||
break; | ||
|
||
case PM_SUSPEND_DISK: | ||
return -ENOTSUPP; | ||
|
||
default: | ||
return -EINVAL; | ||
} | ||
|
||
return error; | ||
} | ||
|
||
static int omap2_pm_enter(suspend_state_t state) | ||
{ | ||
switch (state) | ||
{ | ||
case PM_SUSPEND_STANDBY: | ||
case PM_SUSPEND_MEM: | ||
/* FIXME: Add suspend */ | ||
break; | ||
|
||
case PM_SUSPEND_DISK: | ||
return -ENOTSUPP; | ||
|
||
default: | ||
return -EINVAL; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
static int omap2_pm_finish(suspend_state_t state) | ||
{ | ||
pm_idle = saved_idle; | ||
return 0; | ||
} | ||
|
||
static struct pm_ops omap_pm_ops = { | ||
.pm_disk_mode = 0, | ||
.prepare = omap2_pm_prepare, | ||
.enter = omap2_pm_enter, | ||
.finish = omap2_pm_finish, | ||
}; | ||
|
||
int __init omap2_pm_init(void) | ||
{ | ||
printk("Power Management for TI OMAP.\n"); | ||
|
||
vclk = clk_get(NULL, "virt_prcm_set"); | ||
if (IS_ERR(vclk)) { | ||
printk(KERN_ERR "Could not get PM vclk\n"); | ||
return -ENODEV; | ||
} | ||
|
||
/* | ||
* 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. | ||
*/ | ||
omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend, | ||
omap24xx_idle_loop_suspend_sz); | ||
|
||
omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend, | ||
omap24xx_cpu_suspend_sz); | ||
|
||
pm_set_ops(&omap_pm_ops); | ||
pm_idle = omap2_pm_idle; | ||
|
||
return 0; | ||
} | ||
|
||
__initcall(omap2_pm_init); |
Oops, something went wrong.