diff options
| -rw-r--r-- | drivers/acpi/processor_idle.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/video.c | 17 | ||||
| -rw-r--r-- | drivers/base/power/domain.c | 3 | ||||
| -rw-r--r-- | drivers/base/power/opp.c | 39 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq-dt.c | 11 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 6 | ||||
| -rw-r--r-- | drivers/cpuidle/governors/ladder.c | 7 | ||||
| -rw-r--r-- | drivers/cpuidle/governors/menu.c | 25 | ||||
| -rw-r--r-- | drivers/powercap/intel_rapl.c | 1 | ||||
| -rw-r--r-- | include/linux/cpuidle.h | 3 | ||||
| -rw-r--r-- | include/linux/pm_domain.h | 8 | ||||
| -rw-r--r-- | tools/power/cpupower/utils/cpupower.c | 2 | ||||
| -rw-r--r-- | tools/power/cpupower/utils/helpers/sysfs.c | 2 |
13 files changed, 89 insertions, 37 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 499536504698..87b704e41877 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -985,8 +985,6 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr) | |||
| 985 | state->flags = 0; | 985 | state->flags = 0; |
| 986 | switch (cx->type) { | 986 | switch (cx->type) { |
| 987 | case ACPI_STATE_C1: | 987 | case ACPI_STATE_C1: |
| 988 | if (cx->entry_method != ACPI_CSTATE_FFH) | ||
| 989 | state->flags |= CPUIDLE_FLAG_TIME_INVALID; | ||
| 990 | 988 | ||
| 991 | state->enter = acpi_idle_enter_c1; | 989 | state->enter = acpi_idle_enter_c1; |
| 992 | state->enter_dead = acpi_idle_play_dead; | 990 | state->enter_dead = acpi_idle_play_dead; |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 1eaadff2e198..c72e79d2c5ad 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -505,6 +505,23 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
| 505 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"), | 505 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"), |
| 506 | }, | 506 | }, |
| 507 | }, | 507 | }, |
| 508 | |||
| 509 | { | ||
| 510 | .callback = video_disable_native_backlight, | ||
| 511 | .ident = "SAMSUNG 870Z5E/880Z5E/680Z5E", | ||
| 512 | .matches = { | ||
| 513 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
| 514 | DMI_MATCH(DMI_PRODUCT_NAME, "870Z5E/880Z5E/680Z5E"), | ||
| 515 | }, | ||
| 516 | }, | ||
| 517 | { | ||
| 518 | .callback = video_disable_native_backlight, | ||
| 519 | .ident = "SAMSUNG 370R4E/370R4V/370R5E/3570RE/370R5V", | ||
| 520 | .matches = { | ||
| 521 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
| 522 | DMI_MATCH(DMI_PRODUCT_NAME, "370R4E/370R4V/370R5E/3570RE/370R5V"), | ||
| 523 | }, | ||
| 524 | }, | ||
| 508 | {} | 525 | {} |
| 509 | }; | 526 | }; |
| 510 | 527 | ||
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 6a103a35ea9b..0d8780c04a5e 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
| @@ -2088,7 +2088,7 @@ EXPORT_SYMBOL_GPL(of_genpd_del_provider); | |||
| 2088 | * Returns a valid pointer to struct generic_pm_domain on success or ERR_PTR() | 2088 | * Returns a valid pointer to struct generic_pm_domain on success or ERR_PTR() |
| 2089 | * on failure. | 2089 | * on failure. |
| 2090 | */ | 2090 | */ |
| 2091 | static struct generic_pm_domain *of_genpd_get_from_provider( | 2091 | struct generic_pm_domain *of_genpd_get_from_provider( |
| 2092 | struct of_phandle_args *genpdspec) | 2092 | struct of_phandle_args *genpdspec) |
| 2093 | { | 2093 | { |
| 2094 | struct generic_pm_domain *genpd = ERR_PTR(-ENOENT); | 2094 | struct generic_pm_domain *genpd = ERR_PTR(-ENOENT); |
| @@ -2108,6 +2108,7 @@ static struct generic_pm_domain *of_genpd_get_from_provider( | |||
| 2108 | 2108 | ||
| 2109 | return genpd; | 2109 | return genpd; |
| 2110 | } | 2110 | } |
| 2111 | EXPORT_SYMBOL_GPL(of_genpd_get_from_provider); | ||
| 2111 | 2112 | ||
| 2112 | /** | 2113 | /** |
| 2113 | * genpd_dev_pm_detach - Detach a device from its PM domain. | 2114 | * genpd_dev_pm_detach - Detach a device from its PM domain. |
diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c index d24dd614a0bd..106c69359306 100644 --- a/drivers/base/power/opp.c +++ b/drivers/base/power/opp.c | |||
| @@ -108,6 +108,14 @@ static LIST_HEAD(dev_opp_list); | |||
| 108 | /* Lock to allow exclusive modification to the device and opp lists */ | 108 | /* Lock to allow exclusive modification to the device and opp lists */ |
| 109 | static DEFINE_MUTEX(dev_opp_list_lock); | 109 | static DEFINE_MUTEX(dev_opp_list_lock); |
| 110 | 110 | ||
| 111 | #define opp_rcu_lockdep_assert() \ | ||
| 112 | do { \ | ||
| 113 | rcu_lockdep_assert(rcu_read_lock_held() || \ | ||
| 114 | lockdep_is_held(&dev_opp_list_lock), \ | ||
| 115 | "Missing rcu_read_lock() or " \ | ||
| 116 | "dev_opp_list_lock protection"); \ | ||
| 117 | } while (0) | ||
| 118 | |||
| 111 | /** | 119 | /** |
| 112 | * find_device_opp() - find device_opp struct using device pointer | 120 | * find_device_opp() - find device_opp struct using device pointer |
| 113 | * @dev: device pointer used to lookup device OPPs | 121 | * @dev: device pointer used to lookup device OPPs |
| @@ -208,9 +216,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_get_freq); | |||
| 208 | * This function returns the number of available opps if there are any, | 216 | * This function returns the number of available opps if there are any, |
| 209 | * else returns 0 if none or the corresponding error value. | 217 | * else returns 0 if none or the corresponding error value. |
| 210 | * | 218 | * |
| 211 | * Locking: This function must be called under rcu_read_lock(). This function | 219 | * Locking: This function takes rcu_read_lock(). |
| 212 | * internally references two RCU protected structures: device_opp and opp which | ||
| 213 | * are safe as long as we are under a common RCU locked section. | ||
| 214 | */ | 220 | */ |
| 215 | int dev_pm_opp_get_opp_count(struct device *dev) | 221 | int dev_pm_opp_get_opp_count(struct device *dev) |
| 216 | { | 222 | { |
| @@ -218,11 +224,14 @@ int dev_pm_opp_get_opp_count(struct device *dev) | |||
| 218 | struct dev_pm_opp *temp_opp; | 224 | struct dev_pm_opp *temp_opp; |
| 219 | int count = 0; | 225 | int count = 0; |
| 220 | 226 | ||
| 227 | rcu_read_lock(); | ||
| 228 | |||
| 221 | dev_opp = find_device_opp(dev); | 229 | dev_opp = find_device_opp(dev); |
| 222 | if (IS_ERR(dev_opp)) { | 230 | if (IS_ERR(dev_opp)) { |
| 223 | int r = PTR_ERR(dev_opp); | 231 | count = PTR_ERR(dev_opp); |
| 224 | dev_err(dev, "%s: device OPP not found (%d)\n", __func__, r); | 232 | dev_err(dev, "%s: device OPP not found (%d)\n", |
| 225 | return r; | 233 | __func__, count); |
| 234 | goto out_unlock; | ||
| 226 | } | 235 | } |
| 227 | 236 | ||
| 228 | list_for_each_entry_rcu(temp_opp, &dev_opp->opp_list, node) { | 237 | list_for_each_entry_rcu(temp_opp, &dev_opp->opp_list, node) { |
| @@ -230,6 +239,8 @@ int dev_pm_opp_get_opp_count(struct device *dev) | |||
| 230 | count++; | 239 | count++; |
| 231 | } | 240 | } |
| 232 | 241 | ||
| 242 | out_unlock: | ||
| 243 | rcu_read_unlock(); | ||
| 233 | return count; | 244 | return count; |
| 234 | } | 245 | } |
| 235 | EXPORT_SYMBOL_GPL(dev_pm_opp_get_opp_count); | 246 | EXPORT_SYMBOL_GPL(dev_pm_opp_get_opp_count); |
| @@ -267,6 +278,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, | |||
| 267 | struct device_opp *dev_opp; | 278 | struct device_opp *dev_opp; |
| 268 | struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); | 279 | struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); |
| 269 | 280 | ||
| 281 | opp_rcu_lockdep_assert(); | ||
| 282 | |||
| 270 | dev_opp = find_device_opp(dev); | 283 | dev_opp = find_device_opp(dev); |
| 271 | if (IS_ERR(dev_opp)) { | 284 | if (IS_ERR(dev_opp)) { |
| 272 | int r = PTR_ERR(dev_opp); | 285 | int r = PTR_ERR(dev_opp); |
| @@ -313,6 +326,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, | |||
| 313 | struct device_opp *dev_opp; | 326 | struct device_opp *dev_opp; |
| 314 | struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); | 327 | struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); |
| 315 | 328 | ||
| 329 | opp_rcu_lockdep_assert(); | ||
| 330 | |||
| 316 | if (!dev || !freq) { | 331 | if (!dev || !freq) { |
| 317 | dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq); | 332 | dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq); |
| 318 | return ERR_PTR(-EINVAL); | 333 | return ERR_PTR(-EINVAL); |
| @@ -361,6 +376,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, | |||
| 361 | struct device_opp *dev_opp; | 376 | struct device_opp *dev_opp; |
| 362 | struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); | 377 | struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); |
| 363 | 378 | ||
| 379 | opp_rcu_lockdep_assert(); | ||
| 380 | |||
| 364 | if (!dev || !freq) { | 381 | if (!dev || !freq) { |
| 365 | dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq); | 382 | dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq); |
| 366 | return ERR_PTR(-EINVAL); | 383 | return ERR_PTR(-EINVAL); |
| @@ -783,9 +800,15 @@ void of_free_opp_table(struct device *dev) | |||
| 783 | 800 | ||
| 784 | /* Check for existing list for 'dev' */ | 801 | /* Check for existing list for 'dev' */ |
| 785 | dev_opp = find_device_opp(dev); | 802 | dev_opp = find_device_opp(dev); |
| 786 | if (WARN(IS_ERR(dev_opp), "%s: dev_opp: %ld\n", dev_name(dev), | 803 | if (IS_ERR(dev_opp)) { |
| 787 | PTR_ERR(dev_opp))) | 804 | int error = PTR_ERR(dev_opp); |
| 805 | if (error != -ENODEV) | ||
| 806 | WARN(1, "%s: dev_opp: %d\n", | ||
| 807 | IS_ERR_OR_NULL(dev) ? | ||
| 808 | "Invalid device" : dev_name(dev), | ||
| 809 | error); | ||
| 788 | return; | 810 | return; |
