Commit 648fcab2 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'pm-cpuidle'

* pm-cpuidle:
  cpuidle: add MAINTAINERS entry for ARM Exynos cpuidle driver
  drivers: cpuidle: Remove cpuidle-arm64 duplicate error messages
  drivers: cpuidle: Add idle-state-name description to ARM idle states
  drivers: cpuidle: Add status property to ARM idle states
  cpuidle: Invert CPUIDLE_FLAG_TIME_VALID logic
parents 389cbf36 0c570c18
...@@ -317,6 +317,26 @@ follows: ...@@ -317,6 +317,26 @@ follows:
In such systems entry-latency-us + exit-latency-us In such systems entry-latency-us + exit-latency-us
will exceed wakeup-latency-us by this duration. will exceed wakeup-latency-us by this duration.
- status:
Usage: Optional
Value type: <string>
Definition: A standard device tree property [5] that indicates
the operational status of an idle-state.
If present, it shall be:
"okay": to indicate that the idle state is
operational.
"disabled": to indicate that the idle state has
been disabled in firmware so it is not
operational.
If the property is not present the idle-state must
be considered operational.
- idle-state-name:
Usage: Optional
Value type: <string>
Definition: A string used as a descriptive name for the idle
state.
In addition to the properties listed above, a state node may require In addition to the properties listed above, a state node may require
additional properties specifics to the entry-method defined in the additional properties specifics to the entry-method defined in the
idle-states node, please refer to the entry-method bindings idle-states node, please refer to the entry-method bindings
......
...@@ -2632,6 +2632,16 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git ...@@ -2632,6 +2632,16 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
S: Maintained S: Maintained
F: drivers/cpuidle/cpuidle-big_little.c F: drivers/cpuidle/cpuidle-big_little.c
CPUIDLE DRIVER - ARM EXYNOS
M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
M: Daniel Lezcano <daniel.lezcano@linaro.org>
M: Kukjin Kim <kgene@kernel.org>
L: linux-pm@vger.kernel.org
L: linux-samsung-soc@vger.kernel.org
S: Supported
F: drivers/cpuidle/cpuidle-exynos.c
F: arch/arm/mach-exynos/pm.c
CPUIDLE DRIVERS CPUIDLE DRIVERS
M: Rafael J. Wysocki <rjw@rjwysocki.net> M: Rafael J. Wysocki <rjw@rjwysocki.net>
M: Daniel Lezcano <daniel.lezcano@linaro.org> M: Daniel Lezcano <daniel.lezcano@linaro.org>
......
...@@ -15,7 +15,6 @@ static inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev, ...@@ -15,7 +15,6 @@ static inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev,
.exit_latency = 1,\ .exit_latency = 1,\
.target_residency = 1,\ .target_residency = 1,\
.power_usage = p,\ .power_usage = p,\
.flags = CPUIDLE_FLAG_TIME_VALID,\
.name = "WFI",\ .name = "WFI",\
.desc = "ARM WFI",\ .desc = "ARM WFI",\
} }
......
...@@ -66,7 +66,6 @@ static struct cpuidle_driver davinci_idle_driver = { ...@@ -66,7 +66,6 @@ static struct cpuidle_driver davinci_idle_driver = {
.enter = davinci_enter_idle, .enter = davinci_enter_idle,
.exit_latency = 10, .exit_latency = 10,
.target_residency = 10000, .target_residency = 10000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "DDR SR", .name = "DDR SR",
.desc = "WFI and DDR Self Refresh", .desc = "WFI and DDR Self Refresh",
}, },
......
...@@ -24,7 +24,6 @@ static struct cpuidle_driver imx5_cpuidle_driver = { ...@@ -24,7 +24,6 @@ static struct cpuidle_driver imx5_cpuidle_driver = {
.enter = imx5_cpuidle_enter, .enter = imx5_cpuidle_enter,
.exit_latency = 2, .exit_latency = 2,
.target_residency = 1, .target_residency = 1,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "IMX5 SRPG", .name = "IMX5 SRPG",
.desc = "CPU state retained,powered off", .desc = "CPU state retained,powered off",
}, },
......
...@@ -53,8 +53,7 @@ static struct cpuidle_driver imx6q_cpuidle_driver = { ...@@ -53,8 +53,7 @@ static struct cpuidle_driver imx6q_cpuidle_driver = {
{ {
.exit_latency = 50, .exit_latency = 50,
.target_residency = 75, .target_residency = 75,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = CPUIDLE_FLAG_TIMER_STOP,
CPUIDLE_FLAG_TIMER_STOP,
.enter = imx6q_enter_wait, .enter = imx6q_enter_wait,
.name = "WAIT", .name = "WAIT",
.desc = "Clock off", .desc = "Clock off",
......
...@@ -40,8 +40,7 @@ static struct cpuidle_driver imx6sl_cpuidle_driver = { ...@@ -40,8 +40,7 @@ static struct cpuidle_driver imx6sl_cpuidle_driver = {
{ {
.exit_latency = 50, .exit_latency = 50,
.target_residency = 75, .target_residency = 75,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = CPUIDLE_FLAG_TIMER_STOP,
CPUIDLE_FLAG_TIMER_STOP,
.enter = imx6sl_enter_wait, .enter = imx6sl_enter_wait,
.name = "WAIT", .name = "WAIT",
.desc = "Clock off", .desc = "Clock off",
......
...@@ -265,7 +265,6 @@ static struct cpuidle_driver omap3_idle_driver = { ...@@ -265,7 +265,6 @@ static struct cpuidle_driver omap3_idle_driver = {
.enter = omap3_enter_idle_bm, .enter = omap3_enter_idle_bm,
.exit_latency = 2 + 2, .exit_latency = 2 + 2,
.target_residency = 5, .target_residency = 5,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "C1", .name = "C1",
.desc = "MPU ON + CORE ON", .desc = "MPU ON + CORE ON",
}, },
...@@ -273,7 +272,6 @@ static struct cpuidle_driver omap3_idle_driver = { ...@@ -273,7 +272,6 @@ static struct cpuidle_driver omap3_idle_driver = {
.enter = omap3_enter_idle_bm, .enter = omap3_enter_idle_bm,
.exit_latency = 10 + 10, .exit_latency = 10 + 10,
.target_residency = 30, .target_residency = 30,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "C2", .name = "C2",
.desc = "MPU ON + CORE ON", .desc = "MPU ON + CORE ON",
}, },
...@@ -281,7 +279,6 @@ static struct cpuidle_driver omap3_idle_driver = { ...@@ -281,7 +279,6 @@ static struct cpuidle_driver omap3_idle_driver = {
.enter = omap3_enter_idle_bm, .enter = omap3_enter_idle_bm,
.exit_latency = 50 + 50, .exit_latency = 50 + 50,
.target_residency = 300, .target_residency = 300,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "C3", .name = "C3",
.desc = "MPU RET + CORE ON", .desc = "MPU RET + CORE ON",
}, },
...@@ -289,7 +286,6 @@ static struct cpuidle_driver omap3_idle_driver = { ...@@ -289,7 +286,6 @@ static struct cpuidle_driver omap3_idle_driver = {
.enter = omap3_enter_idle_bm, .enter = omap3_enter_idle_bm,
.exit_latency = 1500 + 1800, .exit_latency = 1500 + 1800,
.target_residency = 4000, .target_residency = 4000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "C4", .name = "C4",
.desc = "MPU OFF + CORE ON", .desc = "MPU OFF + CORE ON",
}, },
...@@ -297,7 +293,6 @@ static struct cpuidle_driver omap3_idle_driver = { ...@@ -297,7 +293,6 @@ static struct cpuidle_driver omap3_idle_driver = {
.enter = omap3_enter_idle_bm, .enter = omap3_enter_idle_bm,
.exit_latency = 2500 + 7500, .exit_latency = 2500 + 7500,
.target_residency = 12000, .target_residency = 12000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "C5", .name = "C5",
.desc = "MPU RET + CORE RET", .desc = "MPU RET + CORE RET",
}, },
...@@ -305,7 +300,6 @@ static struct cpuidle_driver omap3_idle_driver = { ...@@ -305,7 +300,6 @@ static struct cpuidle_driver omap3_idle_driver = {
.enter = omap3_enter_idle_bm, .enter = omap3_enter_idle_bm,
.exit_latency = 3000 + 8500, .exit_latency = 3000 + 8500,
.target_residency = 15000, .target_residency = 15000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "C6", .name = "C6",
.desc = "MPU OFF + CORE RET", .desc = "MPU OFF + CORE RET",
}, },
...@@ -313,7 +307,6 @@ static struct cpuidle_driver omap3_idle_driver = { ...@@ -313,7 +307,6 @@ static struct cpuidle_driver omap3_idle_driver = {
.enter = omap3_enter_idle_bm, .enter = omap3_enter_idle_bm,
.exit_latency = 10000 + 30000, .exit_latency = 10000 + 30000,
.target_residency = 30000, .target_residency = 30000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "C7", .name = "C7",
.desc = "MPU OFF + CORE OFF", .desc = "MPU OFF + CORE OFF",
}, },
......
...@@ -196,7 +196,6 @@ static struct cpuidle_driver omap4_idle_driver = { ...@@ -196,7 +196,6 @@ static struct cpuidle_driver omap4_idle_driver = {
/* C1 - CPU0 ON + CPU1 ON + MPU ON */ /* C1 - CPU0 ON + CPU1 ON + MPU ON */
.exit_latency = 2 + 2, .exit_latency = 2 + 2,
.target_residency = 5, .target_residency = 5,
.flags = CPUIDLE_FLAG_TIME_VALID,
.enter = omap_enter_idle_simple, .enter = omap_enter_idle_simple,
.name = "C1", .name = "C1",
.desc = "CPUx ON, MPUSS ON" .desc = "CPUx ON, MPUSS ON"
...@@ -205,7 +204,7 @@ static struct cpuidle_driver omap4_idle_driver = { ...@@ -205,7 +204,7 @@ static struct cpuidle_driver omap4_idle_driver = {
/* C2 - CPU0 OFF + CPU1 OFF + MPU CSWR */ /* C2 - CPU0 OFF + CPU1 OFF + MPU CSWR */
.exit_latency = 328 + 440, .exit_latency = 328 + 440,
.target_residency = 960, .target_residency = 960,
.flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_COUPLED, .flags = CPUIDLE_FLAG_COUPLED,
.enter = omap_enter_idle_coupled, .enter = omap_enter_idle_coupled,
.name = "C2", .name = "C2",
.desc = "CPUx OFF, MPUSS CSWR", .desc = "CPUx OFF, MPUSS CSWR",
...@@ -214,7 +213,7 @@ static struct cpuidle_driver omap4_idle_driver = { ...@@ -214,7 +213,7 @@ static struct cpuidle_driver omap4_idle_driver = {
/* C3 - CPU0 OFF + CPU1 OFF + MPU OSWR */ /* C3 - CPU0 OFF + CPU1 OFF + MPU OSWR */
.exit_latency = 460 + 518, .exit_latency = 460 + 518,
.target_residency = 1100, .target_residency = 1100,
.flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_COUPLED, .flags = CPUIDLE_FLAG_COUPLED,
.enter = omap_enter_idle_coupled, .enter = omap_enter_idle_coupled,
.name = "C3", .name = "C3",
.desc = "CPUx OFF, MPUSS OSWR", .desc = "CPUx OFF, MPUSS OSWR",
......
...@@ -48,7 +48,6 @@ static struct cpuidle_driver s3c64xx_cpuidle_driver = { ...@@ -48,7 +48,6 @@ static struct cpuidle_driver s3c64xx_cpuidle_driver = {
.enter = s3c64xx_enter_idle, .enter = s3c64xx_enter_idle,
.exit_latency = 1, .exit_latency = 1,
.target_residency = 1, .target_residency = 1,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "IDLE", .name = "IDLE",
.desc = "System active, ARM gated", .desc = "System active, ARM gated",
}, },
......
...@@ -423,7 +423,6 @@ static struct cpuidle_driver sh7372_cpuidle_driver = { ...@@ -423,7 +423,6 @@ static struct cpuidle_driver sh7372_cpuidle_driver = {
.desc = "Core Standby Mode", .desc = "Core Standby Mode",
.exit_latency = 10, .exit_latency = 10,
.target_residency = 20 + 10, .target_residency = 20 + 10,
.flags = CPUIDLE_FLAG_TIME_VALID,
.enter = sh7372_enter_core_standby, .enter = sh7372_enter_core_standby,
}, },
.states[2] = { .states[2] = {
...@@ -431,7 +430,6 @@ static struct cpuidle_driver sh7372_cpuidle_driver = { ...@@ -431,7 +430,6 @@ static struct cpuidle_driver sh7372_cpuidle_driver = {
.desc = "A3SM PLL ON", .desc = "A3SM PLL ON",
.exit_latency = 20, .exit_latency = 20,
.target_residency = 30 + 20, .target_residency = 30 + 20,
.flags = CPUIDLE_FLAG_TIME_VALID,
.enter = sh7372_enter_a3sm_pll_on, .enter = sh7372_enter_a3sm_pll_on,
}, },
.states[3] = { .states[3] = {
...@@ -439,7 +437,6 @@ static struct cpuidle_driver sh7372_cpuidle_driver = { ...@@ -439,7 +437,6 @@ static struct cpuidle_driver sh7372_cpuidle_driver = {
.desc = "A3SM PLL OFF", .desc = "A3SM PLL OFF",
.exit_latency = 120, .exit_latency = 120,
.target_residency = 30 + 120, .target_residency = 30 + 120,
.flags = CPUIDLE_FLAG_TIME_VALID,
.enter = sh7372_enter_a3sm_pll_off, .enter = sh7372_enter_a3sm_pll_off,
}, },
.states[4] = { .states[4] = {
...@@ -447,7 +444,6 @@ static struct cpuidle_driver sh7372_cpuidle_driver = { ...@@ -447,7 +444,6 @@ static struct cpuidle_driver sh7372_cpuidle_driver = {
.desc = "A4S PLL OFF", .desc = "A4S PLL OFF",
.exit_latency = 240, .exit_latency = 240,
.target_residency = 30 + 240, .target_residency = 30 + 240,
.flags = CPUIDLE_FLAG_TIME_VALID,
.enter = sh7372_enter_a4s, .enter = sh7372_enter_a4s,
.disabled = true, .disabled = true,
}, },
......
...@@ -75,7 +75,6 @@ static struct cpuidle_driver tegra_idle_driver = { ...@@ -75,7 +75,6 @@ static struct cpuidle_driver tegra_idle_driver = {
.exit_latency = 500, .exit_latency = 500,
.target_residency = 1000, .target_residency = 1000,
.power_usage = 0, .power_usage = 0,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "powered-down", .name = "powered-down",
.desc = "CPU power gated", .desc = "CPU power gated",
}, },
......
...@@ -59,8 +59,7 @@ static struct cpuidle_driver tegra_idle_driver = { ...@@ -59,8 +59,7 @@ static struct cpuidle_driver tegra_idle_driver = {
.exit_latency = 5000, .exit_latency = 5000,
.target_residency = 10000, .target_residency = 10000,
.power_usage = 0, .power_usage = 0,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = CPUIDLE_FLAG_COUPLED,
CPUIDLE_FLAG_COUPLED,
.name = "powered-down", .name = "powered-down",
.desc = "CPU power gated", .desc = "CPU power gated",
}, },
......
...@@ -56,7 +56,6 @@ static struct cpuidle_driver tegra_idle_driver = { ...@@ -56,7 +56,6 @@ static struct cpuidle_driver tegra_idle_driver = {
.exit_latency = 2000, .exit_latency = 2000,
.target_residency = 2200, .target_residency = 2200,
.power_usage = 0, .power_usage = 0,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "powered-down", .name = "powered-down",
.desc = "CPU power gated", .desc = "CPU power gated",
}, },
......
...@@ -22,7 +22,6 @@ extern int mips_cpuidle_wait_enter(struct cpuidle_device *dev, ...@@ -22,7 +22,6 @@ extern int mips_cpuidle_wait_enter(struct cpuidle_device *dev,
.exit_latency = 1,\ .exit_latency = 1,\
.target_residency = 1,\ .target_residency = 1,\
.power_usage = UINT_MAX,\ .power_usage = UINT_MAX,\
.flags = CPUIDLE_FLAG_TIME_VALID,\
.name = "wait",\ .name = "wait",\
.desc = "MIPS wait",\ .desc = "MIPS wait",\
} }
......
...@@ -59,7 +59,6 @@ static struct cpuidle_driver cpuidle_driver = { ...@@ -59,7 +59,6 @@ static struct cpuidle_driver cpuidle_driver = {
.exit_latency = 1, .exit_latency = 1,
.target_residency = 1 * 2, .target_residency = 1 * 2,
.power_usage = 3, .power_usage = 3,
.flags = CPUIDLE_FLAG_TIME_VALID,
.enter = cpuidle_sleep_enter, .enter = cpuidle_sleep_enter,
.name = "C1", .name = "C1",
.desc = "SuperH Sleep Mode", .desc = "SuperH Sleep Mode",
...@@ -68,7 +67,6 @@ static struct cpuidle_driver cpuidle_driver = { ...@@ -68,7 +67,6 @@ static struct cpuidle_driver cpuidle_driver = {
.exit_latency = 100, .exit_latency = 100,
.target_residency = 1 * 2, .target_residency = 1 * 2,
.power_usage = 1, .power_usage = 1,
.flags = CPUIDLE_FLAG_TIME_VALID,
.enter = cpuidle_sleep_enter, .enter = cpuidle_sleep_enter,
.name = "C2", .name = "C2",
.desc = "SuperH Sleep Mode [SF]", .desc = "SuperH Sleep Mode [SF]",
...@@ -78,7 +76,6 @@ static struct cpuidle_driver cpuidle_driver = { ...@@ -78,7 +76,6 @@ static struct cpuidle_driver cpuidle_driver = {
.exit_latency = 2300, .exit_latency = 2300,
.target_residency = 1 * 2, .target_residency = 1 * 2,
.power_usage = 1, .power_usage = 1,
.flags = CPUIDLE_FLAG_TIME_VALID,
.enter = cpuidle_sleep_enter, .enter = cpuidle_sleep_enter,
.name = "C3", .name = "C3",
.desc = "SuperH Mobile Standby Mode [SF]", .desc = "SuperH Mobile Standby Mode [SF]",
......
...@@ -378,7 +378,6 @@ static struct cpuidle_driver apm_idle_driver = { ...@@ -378,7 +378,6 @@ static struct cpuidle_driver apm_idle_driver = {
{ /* entry 1 is for APM idle */ { /* entry 1 is for APM idle */
.name = "APM", .name = "APM",
.desc = "APM idle", .desc = "APM idle",
.flags = CPUIDLE_FLAG_TIME_VALID,
.exit_latency = 250, /* WAG */ .exit_latency = 250, /* WAG */
.target_residency = 500, /* WAG */ .target_residency = 500, /* WAG */
.enter = &apm_cpu_idle .enter = &apm_cpu_idle
......
...@@ -985,8 +985,8 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr) ...@@ -985,8 +985,8 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr)
state->flags = 0; state->flags = 0;
switch (cx->type) { switch (cx->type) {
case ACPI_STATE_C1: case ACPI_STATE_C1:
if (cx->entry_method == ACPI_CSTATE_FFH) if (cx->entry_method != ACPI_CSTATE_FFH)
state->flags |= CPUIDLE_FLAG_TIME_VALID; state->flags |= CPUIDLE_FLAG_TIME_INVALID;
state->enter = acpi_idle_enter_c1; state->enter = acpi_idle_enter_c1;
state->enter_dead = acpi_idle_play_dead; state->enter_dead = acpi_idle_play_dead;
...@@ -994,14 +994,12 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr) ...@@ -994,14 +994,12 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr)
break; break;
case ACPI_STATE_C2: case ACPI_STATE_C2:
state->flags |= CPUIDLE_FLAG_TIME_VALID;
state->enter = acpi_idle_enter_simple; state->enter = acpi_idle_enter_simple;
state->enter_dead = acpi_idle_play_dead; state->enter_dead = acpi_idle_play_dead;
drv->safe_state_index = count; drv->safe_state_index = count;
break; break;
case ACPI_STATE_C3: case ACPI_STATE_C3:
state->flags |= CPUIDLE_FLAG_TIME_VALID;
state->enter = pr->flags.bm_check ? state->enter = pr->flags.bm_check ?
acpi_idle_enter_bm : acpi_idle_enter_bm :
acpi_idle_enter_simple; acpi_idle_enter_simple;
......
...@@ -73,7 +73,6 @@ static struct cpuidle_driver arm64_idle_driver = { ...@@ -73,7 +73,6 @@ static struct cpuidle_driver arm64_idle_driver = {
.exit_latency = 1, .exit_latency = 1,
.target_residency = 1, .target_residency = 1,
.power_usage = UINT_MAX, .power_usage = UINT_MAX,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "WFI", .name = "WFI",
.desc = "ARM64 WFI", .desc = "ARM64 WFI",
} }
...@@ -104,11 +103,8 @@ static int __init arm64_idle_init(void) ...@@ -104,11 +103,8 @@ static int __init arm64_idle_init(void)
* reason to initialize the idle driver if only wfi is supported. * reason to initialize the idle driver if only wfi is supported.
*/ */
ret = dt_init_idle_driver(drv, arm64_idle_state_match, 1); ret = dt_init_idle_driver(drv, arm64_idle_state_match, 1);
if (ret <= 0) { if (ret <= 0)
if (ret)
pr_err("failed to initialize idle states\n");
return ret ? : -ENODEV; return ret ? : -ENODEV;
}
/* /*
* Call arch CPU operations in order to initialize * Call arch CPU operations in order to initialize
...@@ -122,12 +118,6 @@ static int __init arm64_idle_init(void) ...@@ -122,12 +118,6 @@ static int __init arm64_idle_init(void)
} }
} }
ret = cpuidle_register(drv, NULL); return cpuidle_register(drv, NULL);
if (ret) {
pr_err("failed to register cpuidle driver\n");
return ret;
}
return 0;
} }
device_initcall(arm64_idle_init); device_initcall(arm64_idle_init);
...@@ -43,7 +43,6 @@ static struct cpuidle_driver at91_idle_driver = { ...@@ -43,7 +43,6 @@ static struct cpuidle_driver at91_idle_driver = {
.enter = at91_enter_idle, .enter = at91_enter_idle,
.exit_latency = 10, .exit_latency = 10,
.target_residency = 10000, .target_residency = 10000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "RAM_SR", .name = "RAM_SR",
.desc = "WFI and DDR Self Refresh", .desc = "WFI and DDR Self Refresh",
}, },
......
...@@ -67,8 +67,7 @@ static struct cpuidle_driver bl_idle_little_driver = { ...@@ -67,8 +67,7 @@ static struct cpuidle_driver bl_idle_little_driver = {
.enter = bl_enter_powerdown, .enter = bl_enter_powerdown,
.exit_latency = 700, .exit_latency = 700,
.target_residency = 2500, .target_residency = 2500,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = CPUIDLE_FLAG_TIMER_STOP,
CPUIDLE_FLAG_TIMER_STOP,
.name = "C1", .name = "C1",
.desc = "ARM little-cluster power down", .desc = "ARM little-cluster power down",
}, },
...@@ -89,8 +88,7 @@ static struct cpuidle_driver bl_idle_big_driver = { ...@@ -89,8 +88,7 @@ static struct cpuidle_driver bl_idle_big_driver = {
.enter = bl_enter_powerdown, .enter = bl_enter_powerdown,
.exit_latency = 500, .exit_latency = 500,
.target_residency = 2000, .target_residency = 2000,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = CPUIDLE_FLAG_TIMER_STOP,
CPUIDLE_FLAG_TIMER_STOP,
.name = "C1", .name = "C1",
.desc = "ARM big-cluster power down", .desc = "ARM big-cluster power down",
}, },
......
...@@ -55,7 +55,6 @@ static struct cpuidle_driver calxeda_idle_driver = { ...@@ -55,7 +55,6 @@ static struct cpuidle_driver calxeda_idle_driver = {
{ {
.name = "PG", .name = "PG",
.desc = "Power Gate", .desc = "Power Gate",
.flags = CPUIDLE_FLAG_TIME_VALID,
.exit_latency = 30, .exit_latency = 30,
.power_usage = 50, .power_usage = 50,
.target_residency = 200, .target_residency = 200,
......
...@@ -79,7 +79,6 @@ static struct cpuidle_driver cps_driver = { ...@@ -79,7 +79,6 @@ static struct cpuidle_driver cps_driver = {
.enter = cps_nc_enter, .enter = cps_nc_enter,
.exit_latency = 200, .exit_latency = 200,
.target_residency = 450, .target_residency = 450,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "nc-wait", .name = "nc-wait",
.desc = "non-coherent MIPS wait", .desc = "non-coherent MIPS wait",
}, },
...@@ -87,8 +86,7 @@ static struct cpuidle_driver cps_driver = { ...@@ -87,8 +86,7 @@ static struct cpuidle_driver cps_driver = {
.enter = cps_nc_enter, .enter = cps_nc_enter,
.exit_latency = 300, .exit_latency = 300,
.target_residency = 700, .target_residency = 700,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = CPUIDLE_FLAG_TIMER_STOP,
CPUIDLE_FLAG_TIMER_STOP,
.name = "clock-gated", .name = "clock-gated",
.desc = "core clock gated", .desc = "core clock gated",
}, },
...@@ -96,8 +94,7 @@ static struct cpuidle_driver cps_driver = { ...@@ -96,8 +94,7 @@ static struct cpuidle_driver cps_driver = {
.enter = cps_nc_enter, .enter = cps_nc_enter,
.exit_latency = 600, .exit_latency = 600,
.target_residency = 1000, .target_residency = 1000,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = CPUIDLE_FLAG_TIMER_STOP,
CPUIDLE_FLAG_TIMER_STOP,
.name = "power-gated", .name = "power-gated",
.desc = "core power gated", .desc = "core power gated",
}, },
......
...@@ -47,7 +47,6 @@ static struct cpuidle_driver exynos_idle_driver = { ...@@ -47,7 +47,6 @@ static struct cpuidle_driver exynos_idle_driver = {
.enter = exynos_enter_lowpower, .enter = exynos_enter_lowpower,
.exit_latency = 300, .exit_latency = 300,
.target_residency = 100000, .target_residency = 100000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "C1", .name = "C1",
.desc = "ARM power down", .desc = "ARM power down",
}, },
......
...@@ -47,7 +47,6 @@ static struct cpuidle_driver kirkwood_idle_driver = { ...@@ -47,7 +47,6 @@ static struct cpuidle_driver kirkwood_idle_driver = {
.enter = kirkwood_enter_idle, .enter = kirkwood_enter_idle,
.exit_latency = 10, .exit_latency = 10,
.target_residency = 100000, .target_residency = 100000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "DDR SR", .name = "DDR SR",
.desc = "WFI and DDR Self Refresh", .desc = "WFI and DDR Self Refresh",
}, },
......
...@@ -53,7 +53,6 @@ static struct cpuidle_driver armadaxp_idle_driver = { ...@@ -53,7 +53,6 @@ static struct cpuidle_driver armadaxp_idle_driver = {
.exit_latency = 10, .exit_latency = 10,
.power_usage = 50, .power_usage = 50,
.target_residency = 100, .target_residency = 100,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "MV CPU IDLE", .name = "MV CPU IDLE",
.desc = "CPU power down", .desc = "CPU power down",
}, },
...@@ -62,8 +61,7 @@ static struct cpuidle_driver armadaxp_idle_driver = { ...@@ -62,8 +61,7 @@ static struct cpuidle_driver armadaxp_idle_driver = {
.exit_latency = 100, .exit_latency = 100,
.power_usage = 5, .power_usage = 5,
.target_residency = 1000, .target_residency = 1000,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = MVEBU_V7_FLAG_DEEP_IDLE,
MVEBU_V7_FLAG_DEEP_IDLE,
.name = "MV CPU DEEP IDLE", .name = "MV CPU DEEP IDLE",
.desc = "CPU and L2 Fabric power down", .desc = "CPU and L2 Fabric power down",
}, },
...@@ -78,8 +76,7 @@ static struct cpuidle_driver armada370_idle_driver = { ...@@ -78,8 +76,7 @@ static struct cpuidle_driver armada370_idle_driver = {
.exit_latency = 100, .exit_latency = 100,
.power_usage = 5, .power_usage = 5,
.target_residency = 1000, .target_residency = 1000,
.flags = (CPUIDLE_FLAG_TIME_VALID | .flags = MVEBU_V7_FLAG_DEEP_IDLE,
MVEBU_V7_FLAG_DEEP_IDLE),
.name = "Deep Idle", .name = "Deep Idle",
.desc = "CPU and L2 Fabric power down", .desc = "CPU and L2 Fabric power down",
}, },
...@@ -94,7 +91,6 @@ static struct cpuidle_driver armada38x_idle_driver = { ...@@ -94,7 +91,6 @@ static struct cpuidle_driver armada38x_idle_driver = {
.exit_latency = 10, .exit_latency = 10,
.power_usage = 5, .power_usage = 5,
.target_residency = 100, .target_residency = 100,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "Idle", .name = "Idle",
.desc = "CPU and SCU power down", .desc = "CPU and SCU power down",
}, },
......
...@@ -93,7 +93,6 @@ static struct cpuidle_state powernv_states[MAX_POWERNV_IDLE_STATES] = { ...@@ -93,7 +93,6 @@ static struct cpuidle_state powernv_states[MAX_POWERNV_IDLE_STATES] = {
{ /* Snooze */ { /* Snooze */
.name = "snooze", .name = "snooze",
.desc = "snooze", .desc = "snooze",
.flags = CPUIDLE_FLAG_TIME_VALID,
.exit_latency = 0, .exit_latency = 0,
.target_residency = 0, .target_residency = 0,
.enter = &snooze_loop }, .enter = &snooze_loop },
...@@ -202,7 +201,7 @@ static int powernv_add_idle_states(void) ...@@ -202,7 +201,7 @@ static int powernv_add_idle_states(void)
/* Add NAP state */ /* Add NAP state */
strcpy(powernv_states[nr_idle_states].name, "Nap"); strcpy(powernv_states[nr_idle_states].name, "Nap");
strcpy(powernv_states[nr_idle_states].desc, "Nap"); strcpy(powernv_states[nr_idle_states].desc, "Nap");
powernv_states[nr_idle_states].flags = CPUIDLE_FLAG_TIME_VALID; powernv_states[nr_idle_states].flags = 0;
powernv_states[nr_idle_states].exit_latency = powernv_states[nr_idle_states].exit_latency =
((unsigned int)latency_ns) / 1000; ((unsigned int)latency_ns) / 1000;
powernv_states[nr_idle_states].target_residency = powernv_states[nr_idle_states].target_residency =
...@@ -215,8 +214,7 @@ static int powernv_add_idle_states(void) ...@@ -215,8 +214,7 @@ static int powernv_add_idle_states(void)
/* Add FASTSLEEP state */ /* Add FASTSLEEP state */
strcpy(powernv_states[nr_idle_states].name, "FastSleep"); strcpy(powernv_states[nr_idle_states].name, "FastSleep");
strcpy(powernv_states[nr_idle_states].desc, "FastSleep"); strcpy(powernv_states[nr_idle_states].desc, "FastSleep");
powernv_states[nr_idle_states].flags = powernv_states[nr_idle_states].flags = CPUIDLE_FLAG_TIMER_STOP;
CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TIMER_STOP;
powernv_states[nr_idle_states].exit_latency = powernv_states[nr_idle_states].exit_latency =
((unsigned int)latency_ns) / 1000; ((unsigned int)latency_ns) / 1000;
powernv_states[nr_idle_states].target_residency = powernv_states[nr_idle_states].target_residency =
......
...@@ -142,14 +142,12 @@ static struct cpuidle_state dedicated_states[] = { ...@@ -142,14 +142,12 @@ static struct cpuidle_state dedicated_states[] = {
{ /* Snooze */ { /* Snooze */
.name = "snooze", .name = "snooze",
.desc = "snooze", .desc = "snooze",
.flags = CPUIDLE_FLAG_TIME_VALID,
.exit_latency = 0, .exit_latency = 0,
.target_residency = 0, .target_residency = 0,
.enter = &snooze_loop }, .enter = &snooze_loop },
{ /* CEDE */ { /* CEDE */
.name = "CEDE", .name = "CEDE",
.desc = "CEDE", .desc = "CEDE",
.flags = CPUIDLE_FLAG_TIME_VALID,
.exit_latency = 10, .exit_latency = 10,
.target_residency = 100, .target_residency = 100,
.enter = &dedicated_cede_loop }, .enter = &dedicated_cede_loop },
...@@ -162,7 +160,6 @@ static struct cpuidle_state shared_states[] = { ...@@ -162,7 +160,6 @@ static struct cpuidle_state shared_states[] = {
{ /* Shared Cede */ { /* Shared Cede */
.name = "Shared Cede", .name = "Shared Cede",
.desc = "Shared Cede", .desc = "Shared Cede",
.flags = CPUIDLE_FLAG_TIME_VALID,
.exit_latency = 0, .exit_latency = 0,
.target_residency = 0, .target_residency = 0,
.enter = &shared_cede_loop }, .enter = &shared_cede_loop },
......
...@@ -101,8 +101,7 @@ static struct cpuidle_driver ux500_idle_driver = { ...@@ -101,8 +101,7 @@ static struct cpuidle_driver ux500_idle_driver = {
.enter = ux500_enter_idle, .enter = ux500_enter_idle,
.exit_latency = 70, .exit_latency = 70,
.target_residency = 260, .target_residency = 260,
.flags = CPUIDLE_FLAG_TIME_VALID | .flags = CPUIDLE_FLAG_TIMER_STOP,
CPUIDLE_FLAG_TIMER_STOP,
.name = "ApIdle", .name = "ApIdle",
.desc = "ARM Retention", .desc = "ARM Retention",
}, },
......
...@@ -52,7 +52,6 @@ static struct cpuidle_driver zynq_idle_driver = { ...@@ -52,7 +52,6 @@ static struct cpuidle_driver zynq_idle_driver = {
.enter = zynq_enter_idle, .enter = zynq_enter_idle,
.exit_latency = 10, .exit_latency = 10,
.target_residency = 10000, .target_residency = 10000,
.flags = CPUIDLE_FLAG_TIME_VALID,
.name = "RAM_SR", .name = "RAM_SR",
.desc = "WFI and RAM Self Refresh", .desc = "WFI and RAM Self Refresh",
}, },
......
...@@ -201,7 +201,6 @@ static void poll_idle_init(struct cpuidle_driver *drv) ...@@ -201,7 +201,6 @@ static void poll_idle_init(struct cpuidle_driver *drv)
state->exit_latency = 0; state->exit_latency = 0;
state->target_residency = 0; state->target_residency = 0;
state->power_usage = -1; state->power_usage = -1;
state->flags = CPUIDLE_FLAG_TIME_VALID;
state->enter = poll_idle; state->enter = poll_idle;
state->disabled = false; state->disabled = false;
} }
......
...@@ -27,6 +27,7 @@ static int init_state_node(struct cpuidle_state *idle_state, ...@@ -27,6 +27,7 @@ static int init_state_node(struct cpuidle_state *idle_state,
{ {
int err; int err;
const struct of_device_id *match_id; const struct of_device_id *match_id;
const char *desc;
match_id = of_match_node(matches, state_node); match_id = of_match_node(matches, state_node);
if (!match_id) if (!match_id)
...@@ -73,7 +74,11 @@ static int init_state_node(struct cpuidle_state *idle_state, ...@@ -73,7 +74,11 @@ static int init_state_node(struct cpuidle_state *idle_state,
return -EINVAL; return -EINVAL;
} }
idle_state->flags = CPUIDLE_FLAG_TIME_VALID; err = of_property_read_string(state_node, "idle-state-name", &desc);
if (err)
desc = state_node->name;
idle_state->flags = 0;
if (of_property_read_bool(state_node, "local-timer-stop")) if (of_property_read_bool(state_node, "local-timer-stop"))
idle_state->flags |= CPUIDLE_FLAG_TIMER_STOP; idle_state->flags |= CPUIDLE_FLAG_TIMER_STOP;
/* /*
...@@ -82,7 +87,7 @@ static int init_state_node(struct cpuidle_state *idle_state, ...@@ -82,7 +87,7 @@ static int init_state_node(struct cpuidle_state *idle_state,
* and desc become string pointers * and desc become string pointers
*/ */
strncpy(idle_state->name, state_node->name, CPUIDLE_NAME_LEN - 1); strncpy(idle_state->name, state_node->name, CPUIDLE_NAME_LEN - 1);
strncpy(idle_state->desc, state_node->name, CPUIDLE_DESC_LEN - 1); strncpy(idle_state->desc, desc, CPUIDLE_DESC_LEN - 1);
return 0; return 0;
} }
...@@ -169,6 +174,9 @@ int dt_init_idle_driver(struct cpuidle_driver *drv, ...@@ -169,6 +174,9 @@ int dt_init_idle_driver(struct cpuidle_driver *drv,
if (!state_node) if (!state_node)
break; break;
if (!of_device_is_available(state_node))
continue;
if (!idle_state_valid(state_node, i, cpumask)) { if (!idle_state_valid(state_node, i, cpumask)) {
pr_warn("%s idle state not valid, bailing out\n", pr_warn("%s idle state not valid, bailing out\n",
state_node->full_name); state_node->full_name);
......
...@@ -79,7 +79,7 @@ static int ladder_select_state(struct cpuidle_driver *drv, ...@@ -79,7 +79,7 @@ static int ladder_select_state(struct cpuidle_driver *drv,
last_state = &ldev->states[last_idx]; last_state = &ldev->states[last_idx];
if (drv->states[last_idx].flags & CPUIDLE_FLAG_TIME_VALID) { if (!(drv->states[last_idx].flags & CPUIDLE_FLAG_TIME_INVALID)) {
last_residency = cpuidle_get_last_residency(dev) - \ last_residency = cpuidle_get_last_residency(dev) - \
drv->states[last_idx].exit_latency; drv->states[last_idx].exit_latency;
} }
......
...@@ -405,7 +405,7 @@ static void menu_update(struct cpuidle_driver *drv, struct cpuidle_device *dev) ...@@ -405,7 +405,7 @@ static void menu_update(struct cpuidle_driver *drv, struct cpuidle_device *dev)
* the measured amount of time is less than the exit latency, * the measured amount of time is less than the exit latency,
* assume the state was never reached and the exit latency is 0. * assume the state was never reached and the exit latency is 0.
*/ */
if (unlikely(!(target->flags & CPUIDLE_FLAG_TIME_VALID))) { if (unlikely(target->flags & CPUIDLE_FLAG_TIME_INVALID)) {
/* Use timer value as is */ /* Use timer value as is */
measured_us = data->next_timer_us; measured_us = data->next_timer_us;
......
This diff is collapsed.
...@@ -53,7 +53,7 @@ struct cpuidle_state { ...@@ -53,7 +53,7 @@ struct cpuidle_state {
}; };
/* Idle State Flags */ /* Idle State Flags */
#define CPUIDLE_FLAG_TIME_VALID (0x01) /* is residency time measurable? */ #define CPUIDLE_FLAG_TIME_INVALID (0x01) /* is residency time measurable? */
#define CPUIDLE_FLAG_COUPLED (0x02) /* state applies to multiple cpus */ #define CPUIDLE_FLAG_COUPLED (0x02) /* state applies to multiple cpus */
#define CPUIDLE_FLAG_TIMER_STOP (0x04) /* timer is stopped on this state */ #define CPUIDLE_FLAG_TIMER_STOP (0x04) /* timer is stopped on this state */
...@@ -90,7 +90,7 @@ DECLARE_PER_CPU(struct cpuidle_device, cpuidle_dev); ...@@ -90,7 +90,7 @@ DECLARE_PER_CPU(struct cpuidle_device, cpuidle_dev);
* cpuidle_get_last_residency - retrieves the last state's residency time * cpuidle_get_last_residency - retrieves the last state's residency time
* @dev: the target CPU * @dev: the target CPU
* *
* NOTE: this value is invalid if CPUIDLE_FLAG_TIME_VALID isn't set * NOTE: this value is invalid if CPUIDLE_FLAG_TIME_INVALID is set
*/ */
static inline int cpuidle_get_last_residency(struct cpuidle_device *dev) static inline int cpuidle_get_last_residency(struct cpuidle_device *dev)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment