From: Linus Torvalds Date: Mon, 7 Nov 2011 18:13:52 +0000 (-0800) Subject: Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=3c00303206c3a1ccd86579efdc90bc35f140962e;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git Merge branch 'release' of git://git./linux/kernel/git/lenb/linux * 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux: cpuidle: Single/Global registration of idle states cpuidle: Split cpuidle_state structure and move per-cpu statistics fields cpuidle: Remove CPUIDLE_FLAG_IGNORE and dev->prepare() cpuidle: Move dev->last_residency update to driver enter routine; remove dev->last_state ACPI: Fix CONFIG_ACPI_DOCK=n compiler warning ACPI: Export FADT pm_profile integer value to userspace thermal: Prevent polling from happening during system suspend ACPI: Drop ACPI_NO_HARDWARE_INIT ACPI atomicio: Convert width in bits to bytes in __acpi_ioremap_fast() PNPACPI: Simplify disabled resource registration ACPI: Fix possible recursive locking in hwregs.c ACPI: use kstrdup() mrst pmu: update comment tools/power turbostat: less verbose debugging --- 3c00303206c3a1ccd86579efdc90bc35f140962e diff --cc arch/arm/mach-exynos/cpuidle.c index bf7e96f2793a,000000000000..35f6502144ae mode 100644,000000..100644 --- a/arch/arm/mach-exynos/cpuidle.c +++ b/arch/arm/mach-exynos/cpuidle.c @@@ -1,86 -1,0 +1,90 @@@ +/* linux/arch/arm/mach-exynos4/cpuidle.c + * + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ + +#include +#include +#include +#include + +#include + +static int exynos4_enter_idle(struct cpuidle_device *dev, - struct cpuidle_state *state); ++ struct cpuidle_driver *drv, ++ int index); + +static struct cpuidle_state exynos4_cpuidle_set[] = { + [0] = { + .enter = exynos4_enter_idle, + .exit_latency = 1, + .target_residency = 100000, + .flags = CPUIDLE_FLAG_TIME_VALID, + .name = "IDLE", + .desc = "ARM clock gating(WFI)", + }, +}; + +static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device); + +static struct cpuidle_driver exynos4_idle_driver = { + .name = "exynos4_idle", + .owner = THIS_MODULE, +}; + +static int exynos4_enter_idle(struct cpuidle_device *dev, - struct cpuidle_state *state) ++ struct cpuidle_driver *drv, ++ int index) +{ + struct timeval before, after; + int idle_time; + + local_irq_disable(); + do_gettimeofday(&before); + + cpu_do_idle(); + + do_gettimeofday(&after); + local_irq_enable(); + idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC + + (after.tv_usec - before.tv_usec); + - return idle_time; ++ dev->last_residency = idle_time; ++ return index; +} + +static int __init exynos4_init_cpuidle(void) +{ + int i, max_cpuidle_state, cpu_id; + struct cpuidle_device *device; - ++ struct cpuidle_driver *drv = &exynos4_idle_driver; ++ ++ /* 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)); ++ } + 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; + - device->state_count = (sizeof(exynos4_cpuidle_set) / - sizeof(struct cpuidle_state)); - - max_cpuidle_state = device->state_count; - - for (i = 0; i < max_cpuidle_state; i++) { - memcpy(&device->states[i], &exynos4_cpuidle_set[i], - sizeof(struct cpuidle_state)); - } ++ device->state_count = drv->state_count; + + if (cpuidle_register_device(device)) { + printk(KERN_ERR "CPUidle register device failed\n,"); + return -EIO; + } + } + return 0; +} +device_initcall(exynos4_init_cpuidle); diff --cc include/linux/cpuidle.h index 583baf22cad2,c90418822f40..7408af843b8a --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@@ -20,9 -21,8 +20,10 @@@ #define CPUIDLE_NAME_LEN 16 #define CPUIDLE_DESC_LEN 32 +struct module; + struct cpuidle_device; + struct cpuidle_driver; /****************************