mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 19:23:57 +08:00
f50ee82471
This driver will be able to manage the cpuidle for more SoCs than just Armada 370 and XP. It will also support Armada 38x and potentially other SoC of the Marvell Armada EBU family. To take this into account, this patch renames the driver and its symbols. It also changes the driver name from cpuidle-armada-370-xp to cpuidle-armada-xp, because separate platform drivers will be registered for the other SoC types. This change must be done simultaneously in the cpuidle driver and in the PMSU code in order to remain bisectable. Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org> Link: https://lkml.kernel.org/r/1406120453-29291-12-git-send-email-thomas.petazzoni@free-electrons.com Signed-off-by: Jason Cooper <jason@lakedaemon.net>
93 lines
2.2 KiB
C
93 lines
2.2 KiB
C
/*
|
|
* Marvell Armada 370 and Armada XP SoC cpuidle driver
|
|
*
|
|
* Copyright (C) 2014 Marvell
|
|
*
|
|
* Nadav Haklai <nadavh@marvell.com>
|
|
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
|
*
|
|
* 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.
|
|
*
|
|
* Maintainer: Gregory CLEMENT <gregory.clement@free-electrons.com>
|
|
*/
|
|
|
|
#include <linux/cpu_pm.h>
|
|
#include <linux/cpuidle.h>
|
|
#include <linux/module.h>
|
|
#include <linux/of.h>
|
|
#include <linux/suspend.h>
|
|
#include <linux/platform_device.h>
|
|
#include <asm/cpuidle.h>
|
|
|
|
#define MVEBU_V7_FLAG_DEEP_IDLE 0x10000
|
|
|
|
static int (*mvebu_v7_cpu_suspend)(int);
|
|
|
|
static int mvebu_v7_enter_idle(struct cpuidle_device *dev,
|
|
struct cpuidle_driver *drv,
|
|
int index)
|
|
{
|
|
int ret;
|
|
bool deepidle = false;
|
|
cpu_pm_enter();
|
|
|
|
if (drv->states[index].flags & MVEBU_V7_FLAG_DEEP_IDLE)
|
|
deepidle = true;
|
|
|
|
ret = mvebu_v7_cpu_suspend(deepidle);
|
|
if (ret)
|
|
return ret;
|
|
|
|
cpu_pm_exit();
|
|
|
|
return index;
|
|
}
|
|
|
|
static struct cpuidle_driver armadaxp_idle_driver = {
|
|
.name = "armada_xp_idle",
|
|
.states[0] = ARM_CPUIDLE_WFI_STATE,
|
|
.states[1] = {
|
|
.enter = mvebu_v7_enter_idle,
|
|
.exit_latency = 10,
|
|
.power_usage = 50,
|
|
.target_residency = 100,
|
|
.flags = CPUIDLE_FLAG_TIME_VALID,
|
|
.name = "MV CPU IDLE",
|
|
.desc = "CPU power down",
|
|
},
|
|
.states[2] = {
|
|
.enter = mvebu_v7_enter_idle,
|
|
.exit_latency = 100,
|
|
.power_usage = 5,
|
|
.target_residency = 1000,
|
|
.flags = CPUIDLE_FLAG_TIME_VALID |
|
|
MVEBU_V7_FLAG_DEEP_IDLE,
|
|
.name = "MV CPU DEEP IDLE",
|
|
.desc = "CPU and L2 Fabric power down",
|
|
},
|
|
.state_count = 3,
|
|
};
|
|
|
|
static int mvebu_v7_cpuidle_probe(struct platform_device *pdev)
|
|
{
|
|
|
|
mvebu_v7_cpu_suspend = pdev->dev.platform_data;
|
|
return cpuidle_register(&armadaxp_idle_driver, NULL);
|
|
}
|
|
|
|
static struct platform_driver armadaxp_cpuidle_plat_driver = {
|
|
.driver = {
|
|
.name = "cpuidle-armada-xp",
|
|
.owner = THIS_MODULE,
|
|
},
|
|
.probe = mvebu_v7_cpuidle_probe,
|
|
};
|
|
|
|
module_platform_driver(armadaxp_cpuidle_plat_driver);
|
|
|
|
MODULE_AUTHOR("Gregory CLEMENT <gregory.clement@free-electrons.com>");
|
|
MODULE_DESCRIPTION("Marvell EBU v7 cpuidle driver");
|
|
MODULE_LICENSE("GPL");
|