ARM: EXYNOS: factor out the idle states
The states are defined in the driver. We can get rid of the intermediate cpuidle states initialization and the memcpy by directly initializing the driver states. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Acked-by: Amit Daniel Kachhap <amit.daniel@samsung.com> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
This commit is contained in:
parent
d9cdeb814f
commit
2eb89f893e
|
@ -41,24 +41,25 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev,
|
|||
struct cpuidle_driver *drv,
|
||||
int index);
|
||||
|
||||
static struct cpuidle_state exynos4_cpuidle_set[] __initdata = {
|
||||
[0] = ARM_CPUIDLE_WFI_STATE,
|
||||
[1] = {
|
||||
.enter = exynos4_enter_lowpower,
|
||||
.exit_latency = 300,
|
||||
.target_residency = 100000,
|
||||
.flags = CPUIDLE_FLAG_TIME_VALID,
|
||||
.name = "C1",
|
||||
.desc = "ARM power down",
|
||||
},
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device);
|
||||
|
||||
static struct cpuidle_driver exynos4_idle_driver = {
|
||||
.name = "exynos4_idle",
|
||||
.owner = THIS_MODULE,
|
||||
.en_core_tk_irqen = 1,
|
||||
.states = {
|
||||
[0] = ARM_CPUIDLE_WFI_STATE,
|
||||
[1] = {
|
||||
.enter = exynos4_enter_lowpower,
|
||||
.exit_latency = 300,
|
||||
.target_residency = 100000,
|
||||
.flags = CPUIDLE_FLAG_TIME_VALID,
|
||||
.name = "C1",
|
||||
.desc = "ARM power down",
|
||||
},
|
||||
},
|
||||
.state_count = 2,
|
||||
.safe_state_index = 0,
|
||||
};
|
||||
|
||||
/* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */
|
||||
|
@ -193,33 +194,21 @@ static void __init exynos5_core_down_clk(void)
|
|||
|
||||
static int __init exynos4_init_cpuidle(void)
|
||||
{
|
||||
int i, max_cpuidle_state, cpu_id;
|
||||
int cpu_id;
|
||||
struct cpuidle_device *device;
|
||||
struct cpuidle_driver *drv = &exynos4_idle_driver;
|
||||
|
||||
if (soc_is_exynos5250())
|
||||
exynos5_core_down_clk();
|
||||
|
||||
/* Setup cpuidle driver */
|
||||
drv->state_count = (sizeof(exynos4_cpuidle_set) /
|
||||
sizeof(struct cpuidle_state));
|
||||
max_cpuidle_state = drv->state_count;
|
||||
for (i = 0; i < max_cpuidle_state; i++) {
|
||||
memcpy(&drv->states[i], &exynos4_cpuidle_set[i],
|
||||
sizeof(struct cpuidle_state));
|
||||
}
|
||||
drv->safe_state_index = 0;
|
||||
cpuidle_register_driver(&exynos4_idle_driver);
|
||||
|
||||
for_each_cpu(cpu_id, cpu_online_mask) {
|
||||
device = &per_cpu(exynos4_cpuidle_device, cpu_id);
|
||||
device->cpu = cpu_id;
|
||||
|
||||
if (cpu_id == 0)
|
||||
device->state_count = (sizeof(exynos4_cpuidle_set) /
|
||||
sizeof(struct cpuidle_state));
|
||||
else
|
||||
device->state_count = 1; /* Support IDLE only */
|
||||
/* Support IDLE only */
|
||||
if (cpu_id != 0)
|
||||
device->state_count = 1;
|
||||
|
||||
if (cpuidle_register_device(device)) {
|
||||
printk(KERN_ERR "CPUidle register device failed\n,");
|
||||
|
|
Loading…
Reference in New Issue