diff options
| -rw-r--r-- | drivers/acpi/glue.c | 2 | ||||
| -rw-r--r-- | drivers/cpuidle/cpuidle.c | 17 | ||||
| -rw-r--r-- | drivers/cpuidle/driver.c | 25 | ||||
| -rw-r--r-- | drivers/cpuidle/governors/menu.c | 8 | ||||
| -rw-r--r-- | drivers/cpuidle/sysfs.c | 2 | ||||
| -rw-r--r-- | include/linux/cpuidle.h | 2 |
6 files changed, 9 insertions, 47 deletions
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 95af6f674a6c..35da18113216 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -297,7 +297,7 @@ static int acpi_platform_notify(struct device *dev) | |||
| 297 | if (!ret) { | 297 | if (!ret) { |
| 298 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 298 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 299 | 299 | ||
| 300 | acpi_get_name(dev->acpi_handle, ACPI_FULL_PATHNAME, &buffer); | 300 | acpi_get_name(ACPI_HANDLE(dev), ACPI_FULL_PATHNAME, &buffer); |
| 301 | DBG("Device %s -> %s\n", dev_name(dev), (char *)buffer.pointer); | 301 | DBG("Device %s -> %s\n", dev_name(dev), (char *)buffer.pointer); |
| 302 | kfree(buffer.pointer); | 302 | kfree(buffer.pointer); |
| 303 | } else | 303 | } else |
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index fb4a7dd57f94..e1f6860e069c 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -69,24 +69,15 @@ int cpuidle_play_dead(void) | |||
| 69 | { | 69 | { |
| 70 | struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices); | 70 | struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices); |
| 71 | struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); | 71 | struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); |
| 72 | int i, dead_state = -1; | 72 | int i; |
| 73 | int power_usage = INT_MAX; | ||
| 74 | 73 | ||
| 75 | if (!drv) | 74 | if (!drv) |
| 76 | return -ENODEV; | 75 | return -ENODEV; |
| 77 | 76 | ||
| 78 | /* Find lowest-power state that supports long-term idle */ | 77 | /* Find lowest-power state that supports long-term idle */ |
| 79 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { | 78 | for (i = drv->state_count - 1; i >= CPUIDLE_DRIVER_STATE_START; i--) |
| 80 | struct cpuidle_state *s = &drv->states[i]; | 79 | if (drv->states[i].enter_dead) |
| 81 | 80 | return drv->states[i].enter_dead(dev, i); | |
| 82 | if (s->power_usage < power_usage && s->enter_dead) { | ||
| 83 | power_usage = s->power_usage; | ||
| 84 | dead_state = i; | ||
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 88 | if (dead_state != -1) | ||
| 89 | return drv->states[dead_state].enter_dead(dev, dead_state); | ||
| 90 | 81 | ||
| 91 | return -ENODEV; | 82 | return -ENODEV; |
| 92 | } | 83 | } |
diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c index c2b281afe0ed..422c7b69ba7c 100644 --- a/drivers/cpuidle/driver.c +++ b/drivers/cpuidle/driver.c | |||
| @@ -19,34 +19,9 @@ DEFINE_SPINLOCK(cpuidle_driver_lock); | |||
| 19 | static void __cpuidle_set_cpu_driver(struct cpuidle_driver *drv, int cpu); | 19 | static void __cpuidle_set_cpu_driver(struct cpuidle_driver *drv, int cpu); |
| 20 | static struct cpuidle_driver * __cpuidle_get_cpu_driver(int cpu); | 20 | static struct cpuidle_driver * __cpuidle_get_cpu_driver(int cpu); |
| 21 | 21 | ||
| 22 | static void set_power_states(struct cpuidle_driver *drv) | ||
| 23 | { | ||
| 24 | int i; | ||
| 25 | |||
| 26 | /* | ||
| 27 | * cpuidle driver should set the drv->power_specified bit | ||
| 28 | * before registering if the driver provides | ||
| 29 | * power_usage numbers. | ||
| 30 | * | ||
| 31 | * If power_specified is not set, | ||
| 32 | * we fill in power_usage with decreasing values as the | ||
| 33 | * cpuidle code has an implicit assumption that state Cn | ||
| 34 | * uses less power than C(n-1). | ||
| 35 | * | ||
| 36 | * With CONFIG_ARCH_HAS_CPU_RELAX, C0 is already assigned | ||
| 37 | * an power value of -1. So we use -2, -3, etc, for other | ||
| 38 | * c-states. | ||
| 39 | */ | ||
| 40 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) | ||
| 41 | drv->states[i].power_usage = -1 - i; | ||
| 42 | } | ||
| 43 | |||
| 44 | static void __cpuidle_driver_init(struct cpuidle_driver *drv) | 22 | static void __cpuidle_driver_init(struct cpuidle_driver *drv) |
| 45 | { | 23 | { |
| 46 | drv->refcnt = 0; | 24 | drv->refcnt = 0; |
| 47 | |||
| 48 | if (!drv->power_specified) | ||
| 49 | set_power_states(drv); | ||
| 50 | } | 25 | } |
| 51 | 26 | ||
| 52 | static int __cpuidle_register_driver(struct cpuidle_driver *drv, int cpu) | 27 | static int __cpuidle_register_driver(struct cpuidle_driver *drv, int cpu) |
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 20ea33afdda1..fe343a06b7da 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
| @@ -312,7 +312,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) | |||
| 312 | { | 312 | { |
| 313 | struct menu_device *data = &__get_cpu_var(menu_devices); | 313 | struct menu_device *data = &__get_cpu_var(menu_devices); |
| 314 | int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); | 314 | int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); |
| 315 | int power_usage = INT_MAX; | ||
| 316 | int i; | 315 | int i; |
| 317 | int multiplier; | 316 | int multiplier; |
| 318 | struct timespec t; | 317 | struct timespec t; |
| @@ -383,11 +382,8 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) | |||
| 383 | if (s->exit_latency * multiplier > data->predicted_us) | 382 | if (s->exit_latency * multiplier > data->predicted_us) |
| 384 | continue; | 383 | continue; |
| 385 | 384 | ||
| 386 | if (s->power_usage < power_usage) { | 385 | data->last_state_idx = i; |
| 387 | power_usage = s->power_usage; | 386 | data->exit_us = s->exit_latency; |
| 388 | data->last_state_idx = i; | ||
| 389 | data->exit_us = s->exit_latency; | ||
| 390 | } | ||
| 391 | } | 387 | } |
| 392 | 388 | ||
| 393 | /* not deepest C-state chosen for low predicted residency */ | 389 | /* not deepest C-state chosen for low predicted residency */ |
diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c index 340942946106..428754af6236 100644 --- a/drivers/cpuidle/sysfs.c +++ b/drivers/cpuidle/sysfs.c | |||
| @@ -374,7 +374,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device) | |||
| 374 | struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device); | 374 | struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device); |
| 375 | 375 | ||
| 376 | /* state statistics */ | 376 | /* state statistics */ |
| 377 | for (i = 0; i < drv->state_count; i++) { | 377 | for (i = 0; i < device->state_count; i++) { |
| 378 | kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL); | 378 | kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL); |
| 379 | if (!kobj) | 379 | if (!kobj) |
| 380 | goto error_state; | 380 | goto error_state; |
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 3711b34dc4f9..24cd1037b6d6 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h | |||
| @@ -126,9 +126,9 @@ struct cpuidle_driver { | |||
| 126 | struct module *owner; | 126 | struct module *owner; |
| 127 | int refcnt; | 127 | int refcnt; |
| 128 | 128 | ||
| 129 | unsigned int power_specified:1; | ||
| 130 | /* set to 1 to use the core cpuidle time keeping (for all states). */ | 129 | /* set to 1 to use the core cpuidle time keeping (for all states). */ |
| 131 | unsigned int en_core_tk_irqen:1; | 130 | unsigned int en_core_tk_irqen:1; |
| 131 | /* states array must be ordered in decreasing power consumption */ | ||
| 132 | struct cpuidle_state states[CPUIDLE_STATE_MAX]; | 132 | struct cpuidle_state states[CPUIDLE_STATE_MAX]; |
| 133 | int state_count; | 133 | int state_count; |
| 134 | int safe_state_index; | 134 | int safe_state_index; |
