diff options
-rw-r--r-- | drivers/base/power/sysfs.c | 2 | ||||
-rw-r--r-- | drivers/cpufreq/intel_pstate.c | 2 | ||||
-rw-r--r-- | drivers/devfreq/governor_userspace.c | 2 | ||||
-rw-r--r-- | drivers/devfreq/rk3399_dmc.c | 5 | ||||
-rw-r--r-- | drivers/devfreq/tegra-devfreq.c | 6 | ||||
-rw-r--r-- | drivers/pci/pci-driver.c | 2 | ||||
-rw-r--r-- | drivers/pci/pci.c | 16 | ||||
-rw-r--r-- | drivers/pci/pci.h | 1 | ||||
-rw-r--r-- | drivers/pci/pcie/pme.c | 35 | ||||
-rw-r--r-- | kernel/sched/cpufreq_schedutil.c | 5 |
10 files changed, 39 insertions, 37 deletions
diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c index 185a52581cfa..156ab57bca77 100644 --- a/drivers/base/power/sysfs.c +++ b/drivers/base/power/sysfs.c | |||
@@ -272,6 +272,8 @@ static ssize_t pm_qos_latency_tolerance_store(struct device *dev, | |||
272 | value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT; | 272 | value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT; |
273 | else if (!strcmp(buf, "any") || !strcmp(buf, "any\n")) | 273 | else if (!strcmp(buf, "any") || !strcmp(buf, "any\n")) |
274 | value = PM_QOS_LATENCY_ANY; | 274 | value = PM_QOS_LATENCY_ANY; |
275 | else | ||
276 | return -EINVAL; | ||
275 | } | 277 | } |
276 | ret = dev_pm_qos_update_user_latency_tolerance(dev, value); | 278 | ret = dev_pm_qos_update_user_latency_tolerance(dev, value); |
277 | return ret < 0 ? ret : n; | 279 | return ret < 0 ? ret : n; |
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index d6f323560da3..b7fb8b7c980d 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c | |||
@@ -572,7 +572,7 @@ static int min_perf_pct_min(void) | |||
572 | int turbo_pstate = cpu->pstate.turbo_pstate; | 572 | int turbo_pstate = cpu->pstate.turbo_pstate; |
573 | 573 | ||
574 | return turbo_pstate ? | 574 | return turbo_pstate ? |
575 | DIV_ROUND_UP(cpu->pstate.min_pstate * 100, turbo_pstate) : 0; | 575 | (cpu->pstate.min_pstate * 100 / turbo_pstate) : 0; |
576 | } | 576 | } |
577 | 577 | ||
578 | static s16 intel_pstate_get_epb(struct cpudata *cpu_data) | 578 | static s16 intel_pstate_get_epb(struct cpudata *cpu_data) |
diff --git a/drivers/devfreq/governor_userspace.c b/drivers/devfreq/governor_userspace.c index 176976068bcd..77028c27593c 100644 --- a/drivers/devfreq/governor_userspace.c +++ b/drivers/devfreq/governor_userspace.c | |||
@@ -86,7 +86,7 @@ static struct attribute *dev_entries[] = { | |||
86 | &dev_attr_set_freq.attr, | 86 | &dev_attr_set_freq.attr, |
87 | NULL, | 87 | NULL, |
88 | }; | 88 | }; |
89 | static struct attribute_group dev_attr_group = { | 89 | static const struct attribute_group dev_attr_group = { |
90 | .name = "userspace", | 90 | .name = "userspace", |
91 | .attrs = dev_entries, | 91 | .attrs = dev_entries, |
92 | }; | 92 | }; |
diff --git a/drivers/devfreq/rk3399_dmc.c b/drivers/devfreq/rk3399_dmc.c index 40a2499730fc..1b89ebbad02c 100644 --- a/drivers/devfreq/rk3399_dmc.c +++ b/drivers/devfreq/rk3399_dmc.c | |||
@@ -336,8 +336,9 @@ static int rk3399_dmcfreq_probe(struct platform_device *pdev) | |||
336 | 336 | ||
337 | irq = platform_get_irq(pdev, 0); | 337 | irq = platform_get_irq(pdev, 0); |
338 | if (irq < 0) { | 338 | if (irq < 0) { |
339 | dev_err(&pdev->dev, "Cannot get the dmc interrupt resource\n"); | 339 | dev_err(&pdev->dev, |
340 | return -EINVAL; | 340 | "Cannot get the dmc interrupt resource: %d\n", irq); |
341 | return irq; | ||
341 | } | 342 | } |
342 | data = devm_kzalloc(dev, sizeof(struct rk3399_dmcfreq), GFP_KERNEL); | 343 | data = devm_kzalloc(dev, sizeof(struct rk3399_dmcfreq), GFP_KERNEL); |
343 | if (!data) | 344 | if (!data) |
diff --git a/drivers/devfreq/tegra-devfreq.c b/drivers/devfreq/tegra-devfreq.c index 214fff96fa4a..ae712159246f 100644 --- a/drivers/devfreq/tegra-devfreq.c +++ b/drivers/devfreq/tegra-devfreq.c | |||
@@ -688,9 +688,9 @@ static int tegra_devfreq_probe(struct platform_device *pdev) | |||
688 | } | 688 | } |
689 | 689 | ||
690 | irq = platform_get_irq(pdev, 0); | 690 | irq = platform_get_irq(pdev, 0); |
691 | if (irq <= 0) { | 691 | if (irq < 0) { |
692 | dev_err(&pdev->dev, "Failed to get IRQ\n"); | 692 | dev_err(&pdev->dev, "Failed to get IRQ: %d\n", irq); |
693 | return -ENODEV; | 693 | return irq; |
694 | } | 694 | } |
695 | 695 | ||
696 | platform_set_drvdata(pdev, tegra); | 696 | platform_set_drvdata(pdev, tegra); |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 607f677f48d2..d51e8738f9c2 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -511,6 +511,7 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev) | |||
511 | } | 511 | } |
512 | 512 | ||
513 | pci_restore_state(pci_dev); | 513 | pci_restore_state(pci_dev); |
514 | pci_pme_restore(pci_dev); | ||
514 | return 0; | 515 | return 0; |
515 | } | 516 | } |
516 | 517 | ||
@@ -522,6 +523,7 @@ static void pci_pm_default_resume_early(struct pci_dev *pci_dev) | |||
522 | { | 523 | { |
523 | pci_power_up(pci_dev); | 524 | pci_power_up(pci_dev); |
524 | pci_restore_state(pci_dev); | 525 | pci_restore_state(pci_dev); |
526 | pci_pme_restore(pci_dev); | ||
525 | pci_fixup_device(pci_fixup_resume_early, pci_dev); | 527 | pci_fixup_device(pci_fixup_resume_early, pci_dev); |
526 | } | 528 | } |
527 | 529 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index d88edf5c563b..af0cc3456dc1 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -1801,7 +1801,11 @@ static void __pci_pme_active(struct pci_dev *dev, bool enable) | |||
1801 | pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pmcsr); | 1801 | pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pmcsr); |
1802 | } | 1802 | } |
1803 | 1803 | ||
1804 | static void pci_pme_restore(struct pci_dev *dev) | 1804 | /** |
1805 | * pci_pme_restore - Restore PME configuration after config space restore. | ||
1806 | * @dev: PCI device to update. | ||
1807 | */ | ||
1808 | void pci_pme_restore(struct pci_dev *dev) | ||
1805 | { | 1809 | { |
1806 | u16 pmcsr; | 1810 | u16 pmcsr; |
1807 | 1811 | ||
@@ -1811,6 +1815,7 @@ static void pci_pme_restore(struct pci_dev *dev) | |||
1811 | pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); | 1815 | pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); |
1812 | if (dev->wakeup_prepared) { | 1816 | if (dev->wakeup_prepared) { |
1813 | pmcsr |= PCI_PM_CTRL_PME_ENABLE; | 1817 | pmcsr |= PCI_PM_CTRL_PME_ENABLE; |
1818 | pmcsr &= ~PCI_PM_CTRL_PME_STATUS; | ||
1814 | } else { | 1819 | } else { |
1815 | pmcsr &= ~PCI_PM_CTRL_PME_ENABLE; | 1820 | pmcsr &= ~PCI_PM_CTRL_PME_ENABLE; |
1816 | pmcsr |= PCI_PM_CTRL_PME_STATUS; | 1821 | pmcsr |= PCI_PM_CTRL_PME_STATUS; |
@@ -1907,14 +1912,9 @@ int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) | |||
1907 | { | 1912 | { |
1908 | int ret = 0; | 1913 | int ret = 0; |
1909 | 1914 | ||
1910 | /* | 1915 | /* Don't do the same thing twice in a row for one device. */ |
1911 | * Don't do the same thing twice in a row for one device, but restore | 1916 | if (!!enable == !!dev->wakeup_prepared) |
1912 | * PME Enable in case it has been updated by config space restoration. | ||
1913 | */ | ||
1914 | if (!!enable == !!dev->wakeup_prepared) { | ||
1915 | pci_pme_restore(dev); | ||
1916 | return 0; | 1917 | return 0; |
1917 | } | ||
1918 | 1918 | ||
1919 | /* | 1919 | /* |
1920 | * According to "PCI System Architecture" 4th ed. by Tom Shanley & Don | 1920 | * According to "PCI System Architecture" 4th ed. by Tom Shanley & Don |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 03e3d0285aea..22e061738c6f 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -71,6 +71,7 @@ void pci_power_up(struct pci_dev *dev); | |||
71 | void pci_disable_enabled_device(struct pci_dev *dev); | 71 | void pci_disable_enabled_device(struct pci_dev *dev); |
72 | int pci_finish_runtime_suspend(struct pci_dev *dev); | 72 | int pci_finish_runtime_suspend(struct pci_dev *dev); |
73 | int __pci_pme_wakeup(struct pci_dev *dev, void *ign); | 73 | int __pci_pme_wakeup(struct pci_dev *dev, void *ign); |
74 | void pci_pme_restore(struct pci_dev *dev); | ||
74 | bool pci_dev_keep_suspended(struct pci_dev *dev); | 75 | bool pci_dev_keep_suspended(struct pci_dev *dev); |
75 | void pci_dev_complete_resume(struct pci_dev *pci_dev); | 76 | void pci_dev_complete_resume(struct pci_dev *pci_dev); |
76 | void pci_config_pm_runtime_get(struct pci_dev *dev); | 77 | void pci_config_pm_runtime_get(struct pci_dev *dev); |
diff --git a/drivers/pci/pcie/pme.c b/drivers/pci/pcie/pme.c index 80e58d25006d..fafdb165dd2e 100644 --- a/drivers/pci/pcie/pme.c +++ b/drivers/pci/pcie/pme.c | |||
@@ -40,17 +40,11 @@ static int __init pcie_pme_setup(char *str) | |||
40 | } | 40 | } |
41 | __setup("pcie_pme=", pcie_pme_setup); | 41 | __setup("pcie_pme=", pcie_pme_setup); |
42 | 42 | ||
43 | enum pme_suspend_level { | ||
44 | PME_SUSPEND_NONE = 0, | ||
45 | PME_SUSPEND_WAKEUP, | ||
46 | PME_SUSPEND_NOIRQ, | ||
47 | }; | ||
48 | |||
49 | struct pcie_pme_service_data { | 43 | struct pcie_pme_service_data { |
50 | spinlock_t lock; | 44 | spinlock_t lock; |
51 | struct pcie_device *srv; | 45 | struct pcie_device *srv; |
52 | struct work_struct work; | 46 | struct work_struct work; |
53 | enum pme_suspend_level suspend_level; | 47 | bool noirq; /* If set, keep the PME interrupt disabled. */ |
54 | }; | 48 | }; |
55 | 49 | ||
56 | /** | 50 | /** |
@@ -228,7 +222,7 @@ static void pcie_pme_work_fn(struct work_struct *work) | |||
228 | spin_lock_irq(&data->lock); | 222 | spin_lock_irq(&data->lock); |
229 | 223 | ||
230 | for (;;) { | 224 | for (;;) { |
231 | if (data->suspend_level != PME_SUSPEND_NONE) | 225 | if (data->noirq) |
232 | break; | 226 | break; |
233 | 227 | ||
234 | pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta); | 228 | pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta); |
@@ -255,7 +249,7 @@ static void pcie_pme_work_fn(struct work_struct *work) | |||
255 | spin_lock_irq(&data->lock); | 249 | spin_lock_irq(&data->lock); |
256 | } | 250 | } |
257 | 251 | ||
258 | if (data->suspend_level == PME_SUSPEND_NONE) | 252 | if (!data->noirq) |
259 | pcie_pme_interrupt_enable(port, true); | 253 | pcie_pme_interrupt_enable(port, true); |
260 | 254 | ||
261 | spin_unlock_irq(&data->lock); | 255 | spin_unlock_irq(&data->lock); |
@@ -378,7 +372,7 @@ static int pcie_pme_suspend(struct pcie_device *srv) | |||
378 | { | 372 | { |
379 | struct pcie_pme_service_data *data = get_service_data(srv); | 373 | struct pcie_pme_service_data *data = get_service_data(srv); |
380 | struct pci_dev *port = srv->port; | 374 | struct pci_dev *port = srv->port; |
381 | bool wakeup, wake_irq_enabled = false; | 375 | bool wakeup; |
382 | int ret; | 376 | int ret; |
383 | 377 | ||
384 | if (device_may_wakeup(&port->dev)) { | 378 | if (device_may_wakeup(&port->dev)) { |
@@ -388,19 +382,16 @@ static int pcie_pme_suspend(struct pcie_device *srv) | |||
388 | wakeup = pcie_pme_check_wakeup(port->subordinate); | 382 | wakeup = pcie_pme_check_wakeup(port->subordinate); |
389 | up_read(&pci_bus_sem); | 383 | up_read(&pci_bus_sem); |
390 | } | 384 | } |
391 | spin_lock_irq(&data->lock); | ||
392 | if (wakeup) { | 385 | if (wakeup) { |
393 | ret = enable_irq_wake(srv->irq); | 386 | ret = enable_irq_wake(srv->irq); |
394 | if (ret == 0) { | 387 | if (!ret) |
395 | data->suspend_level = PME_SUSPEND_WAKEUP; | 388 | return 0; |
396 | wake_irq_enabled = true; | ||
397 | } | ||
398 | } | ||
399 | if (!wake_irq_enabled) { | ||
400 | pcie_pme_interrupt_enable(port, false); | ||
401 | pcie_clear_root_pme_status(port); | ||
402 | data->suspend_level = PME_SUSPEND_NOIRQ; | ||
403 | } | 389 | } |
390 | |||
391 | spin_lock_irq(&data->lock); | ||
392 | pcie_pme_interrupt_enable(port, false); | ||
393 | pcie_clear_root_pme_status(port); | ||
394 | data->noirq = true; | ||
404 | spin_unlock_irq(&data->lock); | 395 | spin_unlock_irq(&data->lock); |
405 | 396 | ||
406 | synchronize_irq(srv->irq); | 397 | synchronize_irq(srv->irq); |
@@ -417,15 +408,15 @@ static int pcie_pme_resume(struct pcie_device *srv) | |||
417 | struct pcie_pme_service_data *data = get_service_data(srv); | 408 | struct pcie_pme_service_data *data = get_service_data(srv); |
418 | 409 | ||
419 | spin_lock_irq(&data->lock); | 410 | spin_lock_irq(&data->lock); |
420 | if (data->suspend_level == PME_SUSPEND_NOIRQ) { | 411 | if (data->noirq) { |
421 | struct pci_dev *port = srv->port; | 412 | struct pci_dev *port = srv->port; |
422 | 413 | ||
423 | pcie_clear_root_pme_status(port); | 414 | pcie_clear_root_pme_status(port); |
424 | pcie_pme_interrupt_enable(port, true); | 415 | pcie_pme_interrupt_enable(port, true); |
416 | data->noirq = false; | ||
425 | } else { | 417 | } else { |
426 | disable_irq_wake(srv->irq); | 418 | disable_irq_wake(srv->irq); |
427 | } | 419 | } |
428 | data->suspend_level = PME_SUSPEND_NONE; | ||
429 | spin_unlock_irq(&data->lock); | 420 | spin_unlock_irq(&data->lock); |
430 | 421 | ||
431 | return 0; | 422 | return 0; |
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 076a2e31951c..29a397067ffa 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c | |||
@@ -610,6 +610,11 @@ static int sugov_start(struct cpufreq_policy *policy) | |||
610 | sg_cpu->sg_policy = sg_policy; | 610 | sg_cpu->sg_policy = sg_policy; |
611 | sg_cpu->flags = SCHED_CPUFREQ_RT; | 611 | sg_cpu->flags = SCHED_CPUFREQ_RT; |
612 | sg_cpu->iowait_boost_max = policy->cpuinfo.max_freq; | 612 | sg_cpu->iowait_boost_max = policy->cpuinfo.max_freq; |
613 | } | ||
614 | |||
615 | for_each_cpu(cpu, policy->cpus) { | ||
616 | struct sugov_cpu *sg_cpu = &per_cpu(sugov_cpu, cpu); | ||
617 | |||
613 | cpufreq_add_update_util_hook(cpu, &sg_cpu->update_util, | 618 | cpufreq_add_update_util_hook(cpu, &sg_cpu->update_util, |
614 | policy_is_shared(policy) ? | 619 | policy_is_shared(policy) ? |
615 | sugov_update_shared : | 620 | sugov_update_shared : |