Commit 309b51e8 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pm+acpi-for-3.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI and power management fixes from Rafael Wysocki:

 - cpuidle regression fix related to the initialization of state
   kobjects from Krzysztof Mazur.

 - cpuidle fix removing some not very useful code and making some
   user-visible problems go away at the same time.  From Daniel Lezcano.

 - ACPI build fix from Yinghai Lu.

* tag 'pm+acpi-for-3.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  cpuidle: remove the power_specified field in the driver
  ACPI / glue: Fix build with ACPI_GLUE_DEBUG set
  cpuidle: fix number of initialized/destroyed states
parents 3a55fb0d 8aef33a7
...@@ -297,7 +297,7 @@ static int acpi_platform_notify(struct device *dev) ...@@ -297,7 +297,7 @@ static int acpi_platform_notify(struct device *dev)
if (!ret) { if (!ret) {
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
acpi_get_name(dev->acpi_handle, ACPI_FULL_PATHNAME, &buffer); acpi_get_name(ACPI_HANDLE(dev), ACPI_FULL_PATHNAME, &buffer);
DBG("Device %s -> %s\n", dev_name(dev), (char *)buffer.pointer); DBG("Device %s -> %s\n", dev_name(dev), (char *)buffer.pointer);
kfree(buffer.pointer); kfree(buffer.pointer);
} else } else
......
...@@ -69,24 +69,15 @@ int cpuidle_play_dead(void) ...@@ -69,24 +69,15 @@ int cpuidle_play_dead(void)
{ {
struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices); struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
int i, dead_state = -1; int i;
int power_usage = INT_MAX;
if (!drv) if (!drv)
return -ENODEV; return -ENODEV;
/* Find lowest-power state that supports long-term idle */ /* Find lowest-power state that supports long-term idle */
for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { for (i = drv->state_count - 1; i >= CPUIDLE_DRIVER_STATE_START; i--)
struct cpuidle_state *s = &drv->states[i]; if (drv->states[i].enter_dead)
return drv->states[i].enter_dead(dev, i);
if (s->power_usage < power_usage && s->enter_dead) {
power_usage = s->power_usage;
dead_state = i;
}
}
if (dead_state != -1)
return drv->states[dead_state].enter_dead(dev, dead_state);
return -ENODEV; return -ENODEV;
} }
......
...@@ -19,34 +19,9 @@ DEFINE_SPINLOCK(cpuidle_driver_lock); ...@@ -19,34 +19,9 @@ DEFINE_SPINLOCK(cpuidle_driver_lock);
static void __cpuidle_set_cpu_driver(struct cpuidle_driver *drv, int cpu); static void __cpuidle_set_cpu_driver(struct cpuidle_driver *drv, int cpu);
static struct cpuidle_driver * __cpuidle_get_cpu_driver(int cpu); static struct cpuidle_driver * __cpuidle_get_cpu_driver(int cpu);
static void set_power_states(struct cpuidle_driver *drv)
{
int i;
/*
* cpuidle driver should set the drv->power_specified bit
* before registering if the driver provides
* power_usage numbers.
*
* If power_specified is not set,
* we fill in power_usage with decreasing values as the
* cpuidle code has an implicit assumption that state Cn
* uses less power than C(n-1).
*
* With CONFIG_ARCH_HAS_CPU_RELAX, C0 is already assigned
* an power value of -1. So we use -2, -3, etc, for other
* c-states.
*/
for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++)
drv->states[i].power_usage = -1 - i;
}
static void __cpuidle_driver_init(struct cpuidle_driver *drv) static void __cpuidle_driver_init(struct cpuidle_driver *drv)
{ {
drv->refcnt = 0; drv->refcnt = 0;
if (!drv->power_specified)
set_power_states(drv);
} }
static int __cpuidle_register_driver(struct cpuidle_driver *drv, int cpu) static int __cpuidle_register_driver(struct cpuidle_driver *drv, int cpu)
......
...@@ -312,7 +312,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) ...@@ -312,7 +312,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
{ {
struct menu_device *data = &__get_cpu_var(menu_devices); struct menu_device *data = &__get_cpu_var(menu_devices);
int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);
int power_usage = INT_MAX;
int i; int i;
int multiplier; int multiplier;
struct timespec t; struct timespec t;
...@@ -383,11 +382,8 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) ...@@ -383,11 +382,8 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
if (s->exit_latency * multiplier > data->predicted_us) if (s->exit_latency * multiplier > data->predicted_us)
continue; continue;
if (s->power_usage < power_usage) { data->last_state_idx = i;
power_usage = s->power_usage; data->exit_us = s->exit_latency;
data->last_state_idx = i;
data->exit_us = s->exit_latency;
}
} }
/* not deepest C-state chosen for low predicted residency */ /* not deepest C-state chosen for low predicted residency */
......
...@@ -374,7 +374,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device) ...@@ -374,7 +374,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device); struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
/* state statistics */ /* state statistics */
for (i = 0; i < drv->state_count; i++) { for (i = 0; i < device->state_count; i++) {
kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL); kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL);
if (!kobj) if (!kobj)
goto error_state; goto error_state;
......
...@@ -126,9 +126,9 @@ struct cpuidle_driver { ...@@ -126,9 +126,9 @@ struct cpuidle_driver {
struct module *owner; struct module *owner;
int refcnt; int refcnt;
unsigned int power_specified:1;
/* set to 1 to use the core cpuidle time keeping (for all states). */ /* set to 1 to use the core cpuidle time keeping (for all states). */
unsigned int en_core_tk_irqen:1; unsigned int en_core_tk_irqen:1;
/* states array must be ordered in decreasing power consumption */
struct cpuidle_state states[CPUIDLE_STATE_MAX]; struct cpuidle_state states[CPUIDLE_STATE_MAX];
int state_count; int state_count;
int safe_state_index; int safe_state_index;
......
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