]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge branches 'pm-cpufreq', 'pm-cpuidle' and 'pm-domains'
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 8 Feb 2018 09:22:12 +0000 (10:22 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 8 Feb 2018 09:22:12 +0000 (10:22 +0100)
* pm-cpufreq:
  arm: imx: Add MODULE_ALIAS for cpufreq
  cpufreq: Add and use cpufreq_for_each_{valid_,}entry_idx()
  cpufreq: intel_pstate: Enable HWP during system resume on CPU0
  cpufreq: scpi: fix error return code in scpi_cpufreq_init()
  cpufreq: scpi: fix static checker warning cdev isn't an ERR_PTR
  cpufreq: remove at32ap-cpufreq
  cpufreq: AMD: Ignore the check for ProcFeedback in ST/CZ
  cpufreq: Skip cpufreq resume if it's not suspended

* pm-cpuidle:
  x86: PM: Make APM idle driver initialize polling state

* pm-domains:
  PM / domains: Fix up domain-idle-states OF parsing

arch/x86/kernel/apm_32.c
arch/x86/power/hibernate_32.c
arch/x86/power/hibernate_64.c
drivers/base/power/domain.c
include/linux/suspend.h
kernel/power/power.h

index e4b0d92b3ae067cec7f68acc76d7ac4615fe43b1..2a7fd56e67b364abd75e4d340faba01998f57b1c 100644 (file)
@@ -2389,6 +2389,7 @@ static int __init apm_init(void)
        if (HZ != 100)
                idle_period = (idle_period * HZ) / 100;
        if (idle_threshold < 100) {
+               cpuidle_poll_state_init(&apm_idle_driver);
                if (!cpuidle_register_driver(&apm_idle_driver))
                        if (cpuidle_register_device(&apm_cpuidle_device))
                                cpuidle_unregister_driver(&apm_idle_driver);
index c35fdb585c6853a1f281b043d54ca3b59c801d06..afc4ed7b1578267c0f87a858aea0de5494829ec1 100644 (file)
@@ -145,7 +145,7 @@ static inline void resume_init_first_level_page_table(pgd_t *pg_dir)
 #endif
 }
 
-int swsusp_arch_resume(void)
+asmlinkage int swsusp_arch_resume(void)
 {
        int error;
 
index f910c514438f168a5f09afbd312311498abe2c50..0ef5e520496891eefe9e30269d6dd779027223fd 100644 (file)
@@ -174,7 +174,7 @@ static int relocate_restore_code(void)
        return 0;
 }
 
-int swsusp_arch_resume(void)
+asmlinkage int swsusp_arch_resume(void)
 {
        int error;
 
index 528b24149bc708159ad52b989214364445a23b1b..1ea0e2502e8ed4db0792935be700da3909aa83b3 100644 (file)
@@ -2290,6 +2290,38 @@ static int genpd_parse_state(struct genpd_power_state *genpd_state,
        return 0;
 }
 
+static int genpd_iterate_idle_states(struct device_node *dn,
+                                    struct genpd_power_state *states)
+{
+       int ret;
+       struct of_phandle_iterator it;
+       struct device_node *np;
+       int i = 0;
+
+       ret = of_count_phandle_with_args(dn, "domain-idle-states", NULL);
+       if (ret <= 0)
+               return ret;
+
+       /* Loop over the phandles until all the requested entry is found */
+       of_for_each_phandle(&it, ret, dn, "domain-idle-states", NULL, 0) {
+               np = it.node;
+               if (!of_match_node(idle_state_match, np))
+                       continue;
+               if (states) {
+                       ret = genpd_parse_state(&states[i], np);
+                       if (ret) {
+                               pr_err("Parsing idle state node %pOF failed with err %d\n",
+                                      np, ret);
+                               of_node_put(np);
+                               return ret;
+                       }
+               }
+               i++;
+       }
+
+       return i;
+}
+
 /**
  * of_genpd_parse_idle_states: Return array of idle states for the genpd.
  *
@@ -2299,49 +2331,31 @@ static int genpd_parse_state(struct genpd_power_state *genpd_state,
  *
  * Returns the device states parsed from the OF node. The memory for the states
  * is allocated by this function and is the responsibility of the caller to
- * free the memory after use.
+ * free the memory after use. If no domain idle states is found it returns
+ * -EINVAL and in case of errors, a negative error code.
  */
 int of_genpd_parse_idle_states(struct device_node *dn,
                        struct genpd_power_state **states, int *n)
 {
        struct genpd_power_state *st;
-       struct device_node *np;
-       int i = 0;
-       int err, ret;
-       int count;
-       struct of_phandle_iterator it;
-       const struct of_device_id *match_id;
+       int ret;
 
-       count = of_count_phandle_with_args(dn, "domain-idle-states", NULL);
-       if (count <= 0)
-               return -EINVAL;
+       ret = genpd_iterate_idle_states(dn, NULL);
+       if (ret <= 0)
+               return ret < 0 ? ret : -EINVAL;
 
-       st = kcalloc(count, sizeof(*st), GFP_KERNEL);
+       st = kcalloc(ret, sizeof(*st), GFP_KERNEL);
        if (!st)
                return -ENOMEM;
 
-       /* Loop over the phandles until all the requested entry is found */
-       of_for_each_phandle(&it, err, dn, "domain-idle-states", NULL, 0) {
-               np = it.node;
-               match_id = of_match_node(idle_state_match, np);
-               if (!match_id)
-                       continue;
-               ret = genpd_parse_state(&st[i++], np);
-               if (ret) {
-                       pr_err
-                       ("Parsing idle state node %pOF failed with err %d\n",
-                                                       np, ret);
-                       of_node_put(np);
-                       kfree(st);
-                       return ret;
-               }
+       ret = genpd_iterate_idle_states(dn, st);
+       if (ret <= 0) {
+               kfree(st);
+               return ret < 0 ? ret : -EINVAL;
        }
 
-       *n = i;
-       if (!i)
-               kfree(st);
-       else
-               *states = st;
+       *states = st;
+       *n = ret;
 
        return 0;
 }
index cc22a24516d699582a639329a99df51eb5bb2fb4..440b62f7502ebe4cc2cc5161f511cc427a30e3d5 100644 (file)
@@ -384,6 +384,8 @@ extern int swsusp_page_is_forbidden(struct page *);
 extern void swsusp_set_page_free(struct page *);
 extern void swsusp_unset_page_free(struct page *);
 extern unsigned long get_safe_page(gfp_t gfp_mask);
+extern asmlinkage int swsusp_arch_suspend(void);
+extern asmlinkage int swsusp_arch_resume(void);
 
 extern void hibernation_set_ops(const struct platform_hibernation_ops *ops);
 extern int hibernate(void);
index f29cd178df90a1fbf20586702060e8a3c60a8bd9..9e58bdc8a562b935450364776b15077f60d420c3 100644 (file)
@@ -104,9 +104,6 @@ extern int in_suspend;
 extern dev_t swsusp_resume_device;
 extern sector_t swsusp_resume_block;
 
-extern asmlinkage int swsusp_arch_suspend(void);
-extern asmlinkage int swsusp_arch_resume(void);
-
 extern int create_basic_memory_bitmaps(void);
 extern void free_basic_memory_bitmaps(void);
 extern int hibernate_preallocate_memory(void);