aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/base/power/sysfs.c2
-rw-r--r--drivers/cpufreq/intel_pstate.c2
-rw-r--r--drivers/devfreq/governor_userspace.c2
-rw-r--r--drivers/devfreq/rk3399_dmc.c5
-rw-r--r--drivers/devfreq/tegra-devfreq.c6
-rw-r--r--drivers/pci/pci-driver.c2
-rw-r--r--drivers/pci/pci.c16
-rw-r--r--drivers/pci/pci.h1
-rw-r--r--drivers/pci/pcie/pme.c35
-rw-r--r--kernel/sched/cpufreq_schedutil.c5
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
578static s16 intel_pstate_get_epb(struct cpudata *cpu_data) 578static 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};
89static struct attribute_group dev_attr_group = { 89static 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
1804static 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 */
1808void 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);
71void pci_disable_enabled_device(struct pci_dev *dev); 71void pci_disable_enabled_device(struct pci_dev *dev);
72int pci_finish_runtime_suspend(struct pci_dev *dev); 72int pci_finish_runtime_suspend(struct pci_dev *dev);
73int __pci_pme_wakeup(struct pci_dev *dev, void *ign); 73int __pci_pme_wakeup(struct pci_dev *dev, void *ign);
74void pci_pme_restore(struct pci_dev *dev);
74bool pci_dev_keep_suspended(struct pci_dev *dev); 75bool pci_dev_keep_suspended(struct pci_dev *dev);
75void pci_dev_complete_resume(struct pci_dev *pci_dev); 76void pci_dev_complete_resume(struct pci_dev *pci_dev);
76void pci_config_pm_runtime_get(struct pci_dev *dev); 77void 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
43enum pme_suspend_level {
44 PME_SUSPEND_NONE = 0,
45 PME_SUSPEND_WAKEUP,
46 PME_SUSPEND_NOIRQ,
47};
48
49struct pcie_pme_service_data { 43struct 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 :