mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-30 14:34:51 +08:00
090d1cf103
All these drivers are configured with Kconfig options that are declared as bool. Hence it is not possible for the code to be built as modular. However the code is currently using the module_platform_driver() macro for driver registration. While this currently works, we really don't want to be including the module.h header in non-modular code, which we'll be forced to do, pending some upcoming code relocation from init.h into module.h. So we fix it now by using the non-modular equivalent. Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: Michal Simek <michal.simek@xilinx.com> Cc: linux-pm@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
66 lines
1.6 KiB
C
66 lines
1.6 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/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",
|
|
},
|
|
.probe = at91_cpuidle_probe,
|
|
};
|
|
builtin_platform_driver(at91_cpuidle_driver);
|