a8e39c35b5
Currently cpuidle drivers are spread across different archs. As a result, there are several different paths for cpuidle patch submissions: cpuidle core changes go through linux-pm, ARM driver changes go to the arm-soc or SoC-specific trees, sh changes go through the sh arch tree, pseries changes go through the PowerPC tree and finally intel changes go through the Len's tree while ACPI idle changes go through linux-pm. That makes it difficult to consolidate code and to propagate modifications from the cpuidle core to the different drivers. Hopefully, a movement has started to put the majority of cpuidle drivers under drivers/cpuidle like cpuidle-calxeda.c and cpuidle-kirkwood.c. Add a maintainer entry for cpuidle to MAINTAINERS to clarify the situation and to indicate to new cpuidle driver authors that those drivers should not go into arch-specific directories. The upstreaming process is unchanged: Rafael takes patches for merging into his tree, but with an Acked-by: tag from the driver's maintainer, so indicate in the drivers' headers who maintains them. The arrangement will be the same as for cpufreq. [rjw: Changelog] Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Acked-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Andrew Lunn <andrew@lunn.ch> #for kirkwood Acked-by: Jason Cooper <jason@lakedaemon.net> #for kirkwood Acked-by: Kevin Hilman <khilman@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
93 lines
2.4 KiB
C
93 lines
2.4 KiB
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
|
|
*
|
|
* Maintainer: Jason Cooper <jason@lakedaemon.net>
|
|
* Maintainer: Andrew Lunn <andrew@lunn.ch>
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.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 KIRKWOOD_MAX_STATES 2
|
|
|
|
static void __iomem *ddr_operation_base;
|
|
|
|
/* Actual code that puts the SoC in different idle states */
|
|
static int kirkwood_enter_idle(struct cpuidle_device *dev,
|
|
struct cpuidle_driver *drv,
|
|
int index)
|
|
{
|
|
writel(0x7, ddr_operation_base);
|
|
cpu_do_idle();
|
|
|
|
return index;
|
|
}
|
|
|
|
static struct cpuidle_driver kirkwood_idle_driver = {
|
|
.name = "kirkwood_idle",
|
|
.owner = THIS_MODULE,
|
|
.states[0] = ARM_CPUIDLE_WFI_STATE,
|
|
.states[1] = {
|
|
.enter = kirkwood_enter_idle,
|
|
.exit_latency = 10,
|
|
.target_residency = 100000,
|
|
.flags = CPUIDLE_FLAG_TIME_VALID,
|
|
.name = "DDR SR",
|
|
.desc = "WFI and DDR Self Refresh",
|
|
},
|
|
.state_count = KIRKWOOD_MAX_STATES,
|
|
};
|
|
|
|
/* Initialize CPU idle by registering the idle states */
|
|
static int kirkwood_cpuidle_probe(struct platform_device *pdev)
|
|
{
|
|
struct resource *res;
|
|
|
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
if (res == NULL)
|
|
return -EINVAL;
|
|
|
|
ddr_operation_base = devm_ioremap_resource(&pdev->dev, res);
|
|
if (IS_ERR(ddr_operation_base))
|
|
return PTR_ERR(ddr_operation_base);
|
|
|
|
return cpuidle_register(&kirkwood_idle_driver, NULL);
|
|
}
|
|
|
|
int kirkwood_cpuidle_remove(struct platform_device *pdev)
|
|
{
|
|
cpuidle_unregister(&kirkwood_idle_driver);
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver kirkwood_cpuidle_driver = {
|
|
.probe = kirkwood_cpuidle_probe,
|
|
.remove = kirkwood_cpuidle_remove,
|
|
.driver = {
|
|
.name = "kirkwood_cpuidle",
|
|
.owner = THIS_MODULE,
|
|
},
|
|
};
|
|
|
|
module_platform_driver(kirkwood_cpuidle_driver);
|
|
|
|
MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>");
|
|
MODULE_DESCRIPTION("Kirkwood cpu idle driver");
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_ALIAS("platform:kirkwood-cpuidle");
|