b82b6cca48
The only place where the time is invalid is when the ACPI_CSTATE_FFH entry method is not set. Otherwise for all the drivers, the time can be correctly measured. Instead of duplicating the CPUIDLE_FLAG_TIME_VALID flag in all the drivers for all the states, just invert the logic by replacing it by the flag CPUIDLE_FLAG_TIME_INVALID, hence we can set this flag only for the acpi idle driver, remove the former flag from all the drivers and invert the logic with this flag in the different governor. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
69 lines
1.7 KiB
C
69 lines
1.7 KiB
C
/*
|
|
* based on arch/arm/mach-kirkwood/cpuidle.c
|
|
*
|
|
* CPU idle support for AT91 SoC
|
|
*
|
|
* 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 RAM self refresh in order
|
|
* to implement two idle states -
|
|
* #1 wait-for-interrupt
|
|
* #2 wait-for-interrupt and RAM self refresh
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/cpuidle.h>
|
|
#include <linux/io.h>
|
|
#include <linux/export.h>
|
|
#include <asm/proc-fns.h>
|
|
#include <asm/cpuidle.h>
|
|
|
|
#define AT91_MAX_STATES 2
|
|
|
|
static void (*at91_standby)(void);
|
|
|
|
/* Actual code that puts the SoC in different idle states */
|
|
static int at91_enter_idle(struct cpuidle_device *dev,
|
|
struct cpuidle_driver *drv,
|
|
int index)
|
|
{
|
|
at91_standby();
|
|
return index;
|
|
}
|
|
|
|
static struct cpuidle_driver at91_idle_driver = {
|
|
.name = "at91_idle",
|
|
.owner = THIS_MODULE,
|
|
.states[0] = ARM_CPUIDLE_WFI_STATE,
|
|
.states[1] = {
|
|
.enter = at91_enter_idle,
|
|
.exit_latency = 10,
|
|
.target_residency = 10000,
|
|
.name = "RAM_SR",
|
|
.desc = "WFI and DDR Self Refresh",
|
|
},
|
|
.state_count = AT91_MAX_STATES,
|
|
};
|
|
|
|
/* Initialize CPU idle by registering the idle states */
|
|
static int at91_cpuidle_probe(struct platform_device *dev)
|
|
{
|
|
at91_standby = (void *)(dev->dev.platform_data);
|
|
|
|
return cpuidle_register(&at91_idle_driver, NULL);
|
|
}
|
|
|
|
static struct platform_driver at91_cpuidle_driver = {
|
|
.driver = {
|
|
.name = "cpuidle-at91",
|
|
.owner = THIS_MODULE,
|
|
},
|
|
.probe = at91_cpuidle_probe,
|
|
};
|
|
|
|
module_platform_driver(at91_cpuidle_driver);
|