-
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.
yaml --- r: 149191 b: refs/heads/master c: e50b6be h: refs/heads/master i: 149189: 688ccdc 149187: 0bb08fe 149183: f6ae78e v: v3
- Loading branch information
Rabeeh Khoury
authored and
Nicolas Pitre
committed
Jun 8, 2009
1 parent
524a828
commit 5f77f2e
Showing
5 changed files
with
103 additions
and
2 deletions.
There are no files selected for viewing
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 |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: a914d4309c4cf6e7c4d0dbce4822dcad38a7cf27 | ||
refs/heads/master: e50b6befae9ea91c2d190fb78ff1e06a0b950add |
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
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,96 @@ | ||
/* | ||
* arch/arm/mach-kirkwood/cpuidle.c | ||
* | ||
* CPU idle Marvell Kirkwood SoCs | ||
* | ||
* This file is licensed under the terms of the GNU General Public | ||
* License version 2. This program is licensed "as is" without any | ||
* warranty of any kind, whether express or implied. | ||
* | ||
* The cpu idle uses wait-for-interrupt and DDR self refresh in order | ||
* to implement two idle states - | ||
* #1 wait-for-interrupt | ||
* #2 wait-for-interrupt and DDR self refresh | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/cpuidle.h> | ||
#include <linux/io.h> | ||
#include <asm/proc-fns.h> | ||
#include <mach/kirkwood.h> | ||
|
||
#define KIRKWOOD_MAX_STATES 2 | ||
|
||
static struct cpuidle_driver kirkwood_idle_driver = { | ||
.name = "kirkwood_idle", | ||
.owner = THIS_MODULE, | ||
}; | ||
|
||
static DEFINE_PER_CPU(struct cpuidle_device, kirkwood_cpuidle_device); | ||
|
||
/* Actual code that puts the SoC in different idle states */ | ||
static int kirkwood_enter_idle(struct cpuidle_device *dev, | ||
struct cpuidle_state *state) | ||
{ | ||
struct timeval before, after; | ||
int idle_time; | ||
|
||
local_irq_disable(); | ||
do_gettimeofday(&before); | ||
if (state == &dev->states[0]) | ||
/* Wait for interrupt state */ | ||
cpu_do_idle(); | ||
else if (state == &dev->states[1]) { | ||
/* | ||
* Following write will put DDR in self refresh. | ||
* Note that we have 256 cycles before DDR puts it | ||
* self in self-refresh, so the wait-for-interrupt | ||
* call afterwards won't get the DDR from self refresh | ||
* mode. | ||
*/ | ||
writel(0x7, DDR_OPERATION_BASE); | ||
cpu_do_idle(); | ||
} | ||
do_gettimeofday(&after); | ||
local_irq_enable(); | ||
idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC + | ||
(after.tv_usec - before.tv_usec); | ||
return idle_time; | ||
} | ||
|
||
/* Initialize CPU idle by registering the idle states */ | ||
static int kirkwood_init_cpuidle(void) | ||
{ | ||
struct cpuidle_device *device; | ||
|
||
cpuidle_register_driver(&kirkwood_idle_driver); | ||
|
||
device = &per_cpu(kirkwood_cpuidle_device, smp_processor_id()); | ||
device->state_count = KIRKWOOD_MAX_STATES; | ||
|
||
/* Wait for interrupt state */ | ||
device->states[0].enter = kirkwood_enter_idle; | ||
device->states[0].exit_latency = 1; | ||
device->states[0].target_residency = 10000; | ||
device->states[0].flags = CPUIDLE_FLAG_TIME_VALID; | ||
strcpy(device->states[0].name, "WFI"); | ||
strcpy(device->states[0].desc, "Wait for interrupt"); | ||
|
||
/* Wait for interrupt and DDR self refresh state */ | ||
device->states[1].enter = kirkwood_enter_idle; | ||
device->states[1].exit_latency = 10; | ||
device->states[1].target_residency = 10000; | ||
device->states[1].flags = CPUIDLE_FLAG_TIME_VALID; | ||
strcpy(device->states[1].name, "DDR SR"); | ||
strcpy(device->states[1].desc, "WFI and DDR Self Refresh"); | ||
|
||
if (cpuidle_register_device(device)) { | ||
printk(KERN_ERR "kirkwood_init_cpuidle: Failed registering\n"); | ||
return -EIO; | ||
} | ||
return 0; | ||
} | ||
|
||
device_initcall(kirkwood_init_cpuidle); |
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