cpufreq: Return index from cpufreq_frequency_table_target()
authorViresh Kumar <viresh.kumar@linaro.org>
Fri, 3 Jun 2016 05:28:51 +0000 (10:58 +0530)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 8 Jun 2016 22:58:06 +0000 (00:58 +0200)
This routine can't fail unless the frequency table is invalid and
doesn't contain any valid entries.

Make it return the index and WARN() in case it is used for an invalid
table.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Documentation/cpu-freq/cpu-drivers.txt
drivers/cpufreq/amd_freq_sensitivity.c
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_ondemand.c
drivers/cpufreq/freq_table.c
drivers/cpufreq/powernv-cpufreq.c
drivers/cpufreq/s3c24xx-cpufreq.c
drivers/cpufreq/s5pv210-cpufreq.c
include/linux/cpufreq.h

index 74e812f0719c4b8181e966ec6a75eb2015e530f0..772b94fde2640a956db760fe8408af82d6ab1450 100644 (file)
@@ -245,12 +245,11 @@ policy->max, and all other criteria are met. This is helpful for the
 
 int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
                                    unsigned int target_freq,
-                                   unsigned int relation,
-                                   unsigned int *index);
+                                   unsigned int relation);
 
 is the corresponding frequency table helper for the ->target
-stage. Just pass the values to this function, and the unsigned int
-index returns the number of the frequency table entry which contains
+stage. Just pass the values to this function, and this function
+returns the number of the frequency table entry which contains
 the frequency the CPU shall be set to.
 
 The following macros can be used as iterators over cpufreq_frequency_table:
index 3bea1bb791a94188299fcbf2c8c7c4278b7f83d7..6d5dc04c3a3762b665cc549dc0c974edffc931da 100644 (file)
@@ -91,8 +91,8 @@ static unsigned int amd_powersave_bias_target(struct cpufreq_policy *policy,
                else {
                        unsigned int index;
 
-                       cpufreq_frequency_table_target(policy,
-                               policy->cur - 1, CPUFREQ_RELATION_H, &index);
+                       index = cpufreq_frequency_table_target(policy,
+                               policy->cur - 1, CPUFREQ_RELATION_H);
                        freq_next = policy->freq_table[index].frequency;
                }
 
index 1685e930770f4fced719b4f154526895274d0c15..07c933c6c29a163410b568d2558fd88bde73c4ff 100644 (file)
@@ -1914,7 +1914,7 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
                            unsigned int relation)
 {
        unsigned int old_target_freq = target_freq;
-       int index, retval;
+       int index;
 
        if (cpufreq_disabled())
                return -ENODEV;
@@ -1943,12 +1943,7 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
        if (!cpufreq_driver->target_index)
                return -EINVAL;
 
-       retval = cpufreq_frequency_table_target(policy, target_freq, relation,
-                                               &index);
-       if (unlikely(retval)) {
-               pr_err("%s: Unable to find matching freq\n", __func__);
-               return retval;
-       }
+       index = cpufreq_frequency_table_target(policy, target_freq, relation);
 
        return __target_index(policy, index);
 }
index 2ee476f5a2bdb23ee3633a5dd9334e7ba1247b0c..0c93cd9dee996f28fa5b080f2a89cb5ad2a6add3 100644 (file)
@@ -65,7 +65,7 @@ static unsigned int generic_powersave_bias_target(struct cpufreq_policy *policy,
 {
        unsigned int freq_req, freq_reduc, freq_avg;
        unsigned int freq_hi, freq_lo;
-       unsigned int index = 0;
+       unsigned int index;
        unsigned int delay_hi_us;
        struct policy_dbs_info *policy_dbs = policy->governor_data;
        struct od_policy_dbs_info *dbs_info = to_dbs_info(policy_dbs);
@@ -79,19 +79,17 @@ static unsigned int generic_powersave_bias_target(struct cpufreq_policy *policy,
                return freq_next;
        }
 
-       cpufreq_frequency_table_target(policy, freq_next, relation, &index);
+       index = cpufreq_frequency_table_target(policy, freq_next, relation);
        freq_req = freq_table[index].frequency;
        freq_reduc = freq_req * od_tuners->powersave_bias / 1000;
        freq_avg = freq_req - freq_reduc;
 
        /* Find freq bounds for freq_avg in freq_table */
-       index = 0;
-       cpufreq_frequency_table_target(policy, freq_avg, CPUFREQ_RELATION_H,
-                                      &index);
+       index = cpufreq_frequency_table_target(policy, freq_avg,
+                                              CPUFREQ_RELATION_H);
        freq_lo = freq_table[index].frequency;
-       index = 0;
-       cpufreq_frequency_table_target(policy, freq_avg, CPUFREQ_RELATION_L,
-                                      &index);
+       index = cpufreq_frequency_table_target(policy, freq_avg,
+                                              CPUFREQ_RELATION_L);
        freq_hi = freq_table[index].frequency;
 
        /* Find out how long we have to be in hi and lo freqs */
index f145b64649ef762ea61c1ec7d342678617c573ab..eac8bcbdaad1b161b66d60094822de80b9bde42e 100644 (file)
@@ -114,9 +114,8 @@ int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy)
 EXPORT_SYMBOL_GPL(cpufreq_generic_frequency_table_verify);
 
 int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
-                                  unsigned int target_freq,
-                                  unsigned int relation,
-                                  unsigned int *index)
+                                   unsigned int target_freq,
+                                   unsigned int relation)
 {
        struct cpufreq_frequency_table optimal = {
                .driver_data = ~0,
@@ -129,6 +128,7 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
        struct cpufreq_frequency_table *pos;
        struct cpufreq_frequency_table *table = policy->freq_table;
        unsigned int freq, diff, i = 0;
+       int index;
 
        pr_debug("request for target %u kHz (relation: %u) for cpu %u\n",
                                        target_freq, relation, policy->cpu);
@@ -192,16 +192,18 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
                }
        }
        if (optimal.driver_data > i) {
-               if (suboptimal.driver_data > i)
-                       return -EINVAL;
-               *index = suboptimal.driver_data;
-       } else
-               *index = optimal.driver_data;
+               if (suboptimal.driver_data > i) {
+                       WARN(1, "Invalid frequency table: %d\n", policy->cpu);
+                       return 0;
+               }
 
-       pr_debug("target index is %u, freq is:%u kHz\n", *index,
-                table[*index].frequency);
+               index = suboptimal.driver_data;
+       } else
+               index = optimal.driver_data;
 
-       return 0;
+       pr_debug("target index is %u, freq is:%u kHz\n", index,
+                table[index].frequency);
+       return index;
 }
 EXPORT_SYMBOL_GPL(cpufreq_frequency_table_target);
 
index bf267c2dfe20957fc6142a4d9ca079790079bfac..b29c5c20c3a1c5fcd60ce05b4cadc6198f7c480b 100644 (file)
@@ -760,8 +760,8 @@ void powernv_cpufreq_work_fn(struct work_struct *work)
                struct cpufreq_policy policy;
 
                cpufreq_get_policy(&policy, cpu);
-               cpufreq_frequency_table_target(&policy, policy.cur,
-                                              CPUFREQ_RELATION_C, &index);
+               index = cpufreq_frequency_table_target(&policy, policy.cur,
+                                              CPUFREQ_RELATION_C);
                powernv_cpufreq_target_index(&policy, index);
                cpumask_andnot(&mask, &mask, policy.cpus);
        }
index 05a9737278f3764bc5d9d9c26a6b393facc72e65..7b596fa38ad2de4b7d9cf075ce69a876b4f2e35f 100644 (file)
@@ -293,11 +293,8 @@ static int s3c_cpufreq_target(struct cpufreq_policy *policy,
                     __func__, policy, target_freq, relation);
 
        if (ftab) {
-               if (cpufreq_frequency_table_target(policy, target_freq,
-                                                  relation, &index)) {
-                       s3c_freq_dbg("%s: table failed\n", __func__);
-                       return -EINVAL;
-               }
+               index = cpufreq_frequency_table_target(policy, target_freq,
+                                                      relation);
 
                s3c_freq_dbg("%s: adjust %d to entry %d (%u)\n", __func__,
                             target_freq, index, ftab[index].frequency);
@@ -314,7 +311,6 @@ static int s3c_cpufreq_target(struct cpufreq_policy *policy,
                pll = NULL;
        } else {
                struct cpufreq_policy tmp_policy;
-               int ret;
 
                /* we keep the cpu pll table in Hz, to ensure we get an
                 * accurate value for the PLL output. */
@@ -324,18 +320,12 @@ static int s3c_cpufreq_target(struct cpufreq_policy *policy,
                tmp_policy.cpu = policy->cpu;
                tmp_policy.freq_table = pll_reg;
 
-               /* cpufreq_frequency_table_target uses a pointer to 'index'
-                * which is the number of the table entry, not the value of
+               /* cpufreq_frequency_table_target returns the index
+                * of the table entry, not the value of
                 * the table entry's index field. */
 
-               ret = cpufreq_frequency_table_target(&tmp_policy, target_freq,
-                                                    relation, &index);
-
-               if (ret < 0) {
-                       pr_err("%s: no PLL available\n", __func__);
-                       goto err_notpossible;
-               }
-
+               index = cpufreq_frequency_table_target(&tmp_policy, target_freq,
+                                                      relation);
                pll = pll_reg + index;
 
                s3c_freq_dbg("%s: target %u => %u\n",
@@ -345,10 +335,6 @@ static int s3c_cpufreq_target(struct cpufreq_policy *policy,
        }
 
        return s3c_cpufreq_settarget(policy, target_freq, pll);
-
- err_notpossible:
-       pr_err("no compatible settings for %d\n", target_freq);
-       return -EINVAL;
 }
 
 struct clk *s3c_cpufreq_clk_get(struct device *dev, const char *name)
index 6b0cfc3b8c466c83b702877a7972a9bf9b267304..4f4e9df9b7fc992dc92836365afe96bec38e8e91 100644 (file)
@@ -246,11 +246,8 @@ static int s5pv210_target(struct cpufreq_policy *policy, unsigned int index)
        new_freq = s5pv210_freq_table[index].frequency;
 
        /* Finding current running level index */
-       if (cpufreq_frequency_table_target(policy, old_freq, CPUFREQ_RELATION_H,
-                                          &priv_index)) {
-               ret = -EINVAL;
-               goto exit;
-       }
+       priv_index = cpufreq_frequency_table_target(policy, old_freq,
+                                                   CPUFREQ_RELATION_H);
 
        arm_volt = dvs_conf[index].arm_volt;
        int_volt = dvs_conf[index].int_volt;
index bdd7f0c035ae32faa208a0fb621111ac5a3fc1f7..c378776628b4b5eaf28a3ac5ca9cd0e38fc377b6 100644 (file)
@@ -599,8 +599,7 @@ int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy);
 
 int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
                                   unsigned int target_freq,
-                                  unsigned int relation,
-                                  unsigned int *index);
+                                  unsigned int relation);
 int cpufreq_frequency_table_get_index(struct cpufreq_policy *policy,
                unsigned int freq);