static int cpufreq_start_governor(struct cpufreq_policy *policy);
 static void cpufreq_stop_governor(struct cpufreq_policy *policy);
 static void cpufreq_governor_limits(struct cpufreq_policy *policy);
+static int cpufreq_set_policy(struct cpufreq_policy *policy,
+                             struct cpufreq_governor *new_gov,
+                             unsigned int new_pol);
 
 /**
  * Two notifier lists: the "policy" list is involved in the
        return NULL;
 }
 
-static int cpufreq_parse_policy(char *str_governor,
-                               struct cpufreq_policy *policy)
+static unsigned int cpufreq_parse_policy(char *str_governor)
 {
-       if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
-               policy->policy = CPUFREQ_POLICY_PERFORMANCE;
-               return 0;
-       }
-       if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) {
-               policy->policy = CPUFREQ_POLICY_POWERSAVE;
-               return 0;
-       }
-       return -EINVAL;
+       if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN))
+               return CPUFREQ_POLICY_PERFORMANCE;
+
+       if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN))
+               return CPUFREQ_POLICY_POWERSAVE;
+
+       return CPUFREQ_POLICY_UNKNOWN;
 }
 
 /**
  * cpufreq_parse_governor - parse a governor string only for has_target()
+ * @str_governor: Governor name.
  */
-static int cpufreq_parse_governor(char *str_governor,
-                                 struct cpufreq_policy *policy)
+static struct cpufreq_governor *cpufreq_parse_governor(char *str_governor)
 {
        struct cpufreq_governor *t;
 
 
                ret = request_module("cpufreq_%s", str_governor);
                if (ret)
-                       return -EINVAL;
+                       return NULL;
 
                mutex_lock(&cpufreq_governor_mutex);
 
 
        mutex_unlock(&cpufreq_governor_mutex);
 
-       if (t) {
-               policy->governor = t;
-               return 0;
-       }
-
-       return -EINVAL;
+       return t;
 }
 
 /**
 static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
                                        const char *buf, size_t count)
 {
+       char str_governor[16];
        int ret;
-       char    str_governor[16];
-       struct cpufreq_policy new_policy;
-
-       memcpy(&new_policy, policy, sizeof(*policy));
 
        ret = sscanf(buf, "%15s", str_governor);
        if (ret != 1)
                return -EINVAL;
 
        if (cpufreq_driver->setpolicy) {
-               if (cpufreq_parse_policy(str_governor, &new_policy))
+               unsigned int new_pol;
+
+               new_pol = cpufreq_parse_policy(str_governor);
+               if (!new_pol)
                        return -EINVAL;
+
+               ret = cpufreq_set_policy(policy, NULL, new_pol);
        } else {
-               if (cpufreq_parse_governor(str_governor, &new_policy))
+               struct cpufreq_governor *new_gov;
+
+               new_gov = cpufreq_parse_governor(str_governor);
+               if (!new_gov)
                        return -EINVAL;
-       }
 
-       ret = cpufreq_set_policy(policy, &new_policy);
+               ret = cpufreq_set_policy(policy, new_gov,
+                                        CPUFREQ_POLICY_UNKNOWN);
 
-       if (new_policy.governor)
-               module_put(new_policy.governor->owner);
+               module_put(new_gov->owner);
+       }
 
        return ret ? ret : count;
 }
 
 static int cpufreq_init_policy(struct cpufreq_policy *policy)
 {
-       struct cpufreq_governor *gov = NULL, *def_gov = NULL;
-       struct cpufreq_policy new_policy;
-
-       memcpy(&new_policy, policy, sizeof(*policy));
-
-       def_gov = cpufreq_default_governor();
+       struct cpufreq_governor *def_gov = cpufreq_default_governor();
+       struct cpufreq_governor *gov = NULL;
+       unsigned int pol = CPUFREQ_POLICY_UNKNOWN;
 
        if (has_target()) {
-               /*
-                * Update governor of new_policy to the governor used before
-                * hotplug
-                */
+               /* Update policy governor to the one used before hotplug. */
                gov = find_governor(policy->last_governor);
                if (gov) {
                        pr_debug("Restoring governor %s for cpu %d\n",
-                               policy->governor->name, policy->cpu);
-               } else {
-                       if (!def_gov)
-                               return -ENODATA;
+                                policy->governor->name, policy->cpu);
+               } else if (def_gov) {
                        gov = def_gov;
+               } else {
+                       return -ENODATA;
                }
-               new_policy.governor = gov;
        } else {
                /* Use the default policy if there is no last_policy. */
                if (policy->last_policy) {
-                       new_policy.policy = policy->last_policy;
+                       pol = policy->last_policy;
+               } else if (def_gov) {
+                       pol = cpufreq_parse_policy(def_gov->name);
                } else {
-                       if (!def_gov)
-                               return -ENODATA;
-                       cpufreq_parse_policy(def_gov->name, &new_policy);
+                       return -ENODATA;
                }
        }
 
-       return cpufreq_set_policy(policy, &new_policy);
+       return cpufreq_set_policy(policy, gov, pol);
 }
 
 static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
 
 void refresh_frequency_limits(struct cpufreq_policy *policy)
 {
-       struct cpufreq_policy new_policy;
-
        if (!policy_is_inactive(policy)) {
-               new_policy = *policy;
                pr_debug("updating policy for CPU %u\n", policy->cpu);
 
-               cpufreq_set_policy(policy, &new_policy);
+               cpufreq_set_policy(policy, policy->governor, policy->policy);
        }
 }
 EXPORT_SYMBOL(refresh_frequency_limits);
 /**
  * cpufreq_set_policy - Modify cpufreq policy parameters.
  * @policy: Policy object to modify.
- * @new_policy: New policy data.
+ * @new_gov: Policy governor pointer.
+ * @new_pol: Policy value (for drivers with built-in governors).
  *
- * Pass @new_policy to the cpufreq driver's ->verify() callback. Next, copy the
- * min and max parameters of @new_policy to @policy and either invoke the
- * driver's ->setpolicy() callback (if present) or carry out a governor update
- * for @policy.  That is, run the current governor's ->limits() callback (if the
- * governor field in @new_policy points to the same object as the one in
- * @policy) or replace the governor for @policy with the new one stored in
- * @new_policy.
+ * Invoke the cpufreq driver's ->verify() callback to sanity-check the frequency
+ * limits to be set for the policy, update @policy with the verified limits
+ * values and either invoke the driver's ->setpolicy() callback (if present) or
+ * carry out a governor update for @policy.  That is, run the current governor's
+ * ->limits() callback (if @new_gov points to the same object as the one in
+ * @policy) or replace the governor for @policy with @new_gov.
  *
  * The cpuinfo part of @policy is not updated by this function.
  */
-int cpufreq_set_policy(struct cpufreq_policy *policy,
-                      struct cpufreq_policy *new_policy)
+static int cpufreq_set_policy(struct cpufreq_policy *policy,
+                             struct cpufreq_governor *new_gov,
+                             unsigned int new_pol)
 {
+       struct cpufreq_policy_data new_data;
        struct cpufreq_governor *old_gov;
        int ret;
 
-       pr_debug("setting new policy for CPU %u: %u - %u kHz\n",
-                new_policy->cpu, new_policy->min, new_policy->max);
-
-       memcpy(&new_policy->cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo));
-
+       memcpy(&new_data.cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo));
+       new_data.freq_table = policy->freq_table;
+       new_data.cpu = policy->cpu;
        /*
         * PM QoS framework collects all the requests from users and provide us
         * the final aggregated value here.
         */
-       new_policy->min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN);
-       new_policy->max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX);
+       new_data.min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN);
+       new_data.max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX);
+
+       pr_debug("setting new policy for CPU %u: %u - %u kHz\n",
+                new_data.cpu, new_data.min, new_data.max);
 
        /*
         * Verify that the CPU speed can be set within these limits and make sure
         * that min <= max.
         */
-       ret = cpufreq_driver->verify(new_policy);
+       ret = cpufreq_driver->verify(&new_data);
        if (ret)
                return ret;
 
-       policy->min = new_policy->min;
-       policy->max = new_policy->max;
+       policy->min = new_data.min;
+       policy->max = new_data.max;
        trace_cpu_frequency_limits(policy);
 
        policy->cached_target_freq = UINT_MAX;
                 policy->min, policy->max);
 
        if (cpufreq_driver->setpolicy) {
-               policy->policy = new_policy->policy;
+               policy->policy = new_pol;
                pr_debug("setting range\n");
                return cpufreq_driver->setpolicy(policy);
        }
 
-       if (new_policy->governor == policy->governor) {
+       if (new_gov == policy->governor) {
                pr_debug("governor limits update\n");
                cpufreq_governor_limits(policy);
                return 0;
        }
 
        /* start new governor */
-       policy->governor = new_policy->governor;
+       policy->governor = new_gov;
        ret = cpufreq_init_governor(policy);
        if (!ret) {
                ret = cpufreq_start_governor(policy);
 
                        cpu->pstate.max_freq : cpu->pstate.turbo_freq;
 }
 
-static void intel_pstate_update_perf_limits(struct cpufreq_policy *policy,
-                                           struct cpudata *cpu)
+static void intel_pstate_update_perf_limits(struct cpudata *cpu,
+                                           unsigned int policy_min,
+                                           unsigned int policy_max)
 {
        int max_freq = intel_pstate_get_max_freq(cpu);
        int32_t max_policy_perf, min_policy_perf;
                turbo_max = cpu->pstate.turbo_pstate;
        }
 
-       max_policy_perf = max_state * policy->max / max_freq;
-       if (policy->max == policy->min) {
+       max_policy_perf = max_state * policy_max / max_freq;
+       if (policy_max == policy_min) {
                min_policy_perf = max_policy_perf;
        } else {
-               min_policy_perf = max_state * policy->min / max_freq;
+               min_policy_perf = max_state * policy_min / max_freq;
                min_policy_perf = clamp_t(int32_t, min_policy_perf,
                                          0, max_policy_perf);
        }
 
        pr_debug("cpu:%d max_state %d min_policy_perf:%d max_policy_perf:%d\n",
-                policy->cpu, max_state,
-                min_policy_perf, max_policy_perf);
+                cpu->cpu, max_state, min_policy_perf, max_policy_perf);
 
        /* Normalize user input to [min_perf, max_perf] */
        if (per_cpu_limits) {
                global_min = DIV_ROUND_UP(turbo_max * global.min_perf_pct, 100);
                global_min = clamp_t(int32_t, global_min, 0, global_max);
 
-               pr_debug("cpu:%d global_min:%d global_max:%d\n", policy->cpu,
+               pr_debug("cpu:%d global_min:%d global_max:%d\n", cpu->cpu,
                         global_min, global_max);
 
                cpu->min_perf_ratio = max(min_policy_perf, global_min);
                                          cpu->max_perf_ratio);
 
        }
-       pr_debug("cpu:%d max_perf_ratio:%d min_perf_ratio:%d\n", policy->cpu,
+       pr_debug("cpu:%d max_perf_ratio:%d min_perf_ratio:%d\n", cpu->cpu,
                 cpu->max_perf_ratio,
                 cpu->min_perf_ratio);
 }
 
        mutex_lock(&intel_pstate_limits_lock);
 
-       intel_pstate_update_perf_limits(policy, cpu);
+       intel_pstate_update_perf_limits(cpu, policy->min, policy->max);
 
        if (cpu->policy == CPUFREQ_POLICY_PERFORMANCE) {
                /*
        return 0;
 }
 
-static void intel_pstate_adjust_policy_max(struct cpufreq_policy *policy,
-                                        struct cpudata *cpu)
+static void intel_pstate_adjust_policy_max(struct cpudata *cpu,
+                                          struct cpufreq_policy_data *policy)
 {
        if (!hwp_active &&
            cpu->pstate.max_pstate_physical > cpu->pstate.max_pstate &&
        }
 }
 
-static int intel_pstate_verify_policy(struct cpufreq_policy *policy)
+static int intel_pstate_verify_policy(struct cpufreq_policy_data *policy)
 {
        struct cpudata *cpu = all_cpu_data[policy->cpu];
 
        cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
                                     intel_pstate_get_max_freq(cpu));
 
-       if (policy->policy != CPUFREQ_POLICY_POWERSAVE &&
-           policy->policy != CPUFREQ_POLICY_PERFORMANCE)
-               return -EINVAL;
-
-       intel_pstate_adjust_policy_max(policy, cpu);
+       intel_pstate_adjust_policy_max(cpu, policy);
 
        return 0;
 }
        .name           = "intel_pstate",
 };
 
-static int intel_cpufreq_verify_policy(struct cpufreq_policy *policy)
+static int intel_cpufreq_verify_policy(struct cpufreq_policy_data *policy)
 {
        struct cpudata *cpu = all_cpu_data[policy->cpu];
 
        cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
                                     intel_pstate_get_max_freq(cpu));
 
-       intel_pstate_adjust_policy_max(policy, cpu);
+       intel_pstate_adjust_policy_max(cpu, policy);
 
-       intel_pstate_update_perf_limits(policy, cpu);
+       intel_pstate_update_perf_limits(cpu, policy->min, policy->max);
 
        return 0;
 }
 
        struct notifier_block nb_max;
 };
 
+/*
+ * Used for passing new cpufreq policy data to the cpufreq driver's ->verify()
+ * callback for sanitization.  That callback is only expected to modify the min
+ * and max values, if necessary, and specifically it must not update the
+ * frequency table.
+ */
+struct cpufreq_policy_data {
+       struct cpufreq_cpuinfo          cpuinfo;
+       struct cpufreq_frequency_table  *freq_table;
+       unsigned int                    cpu;
+       unsigned int                    min;    /* in kHz */
+       unsigned int                    max;    /* in kHz */
+};
+
 struct cpufreq_freqs {
        struct cpufreq_policy *policy;
        unsigned int old;
 struct cpufreq_policy *cpufreq_cpu_acquire(unsigned int cpu);
 void cpufreq_cpu_release(struct cpufreq_policy *policy);
 int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
-int cpufreq_set_policy(struct cpufreq_policy *policy,
-                      struct cpufreq_policy *new_policy);
 void refresh_frequency_limits(struct cpufreq_policy *policy);
 void cpufreq_update_policy(unsigned int cpu);
 void cpufreq_update_limits(unsigned int cpu);
 
        /* needed by all drivers */
        int             (*init)(struct cpufreq_policy *policy);
-       int             (*verify)(struct cpufreq_policy *policy);
+       int             (*verify)(struct cpufreq_policy_data *policy);
 
        /* define one out of two */
        int             (*setpolicy)(struct cpufreq_policy *policy);
                (drv->flags & CPUFREQ_IS_COOLING_DEV);
 }
 
-static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy,
-               unsigned int min, unsigned int max)
+static inline void cpufreq_verify_within_limits(struct cpufreq_policy_data *policy,
+                                               unsigned int min,
+                                               unsigned int max)
 {
        if (policy->min < min)
                policy->min = min;
 }
 
 static inline void
-cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy)
+cpufreq_verify_within_cpu_limits(struct cpufreq_policy_data *policy)
 {
        cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
-                       policy->cpuinfo.max_freq);
+                                    policy->cpuinfo.max_freq);
 }
 
 #ifdef CONFIG_CPU_FREQ
  *                          CPUFREQ GOVERNORS                        *
  *********************************************************************/
 
+#define CPUFREQ_POLICY_UNKNOWN         (0)
 /*
  * If (cpufreq_driver->target) exists, the ->governor decides what frequency
  * within the limits is used. If (cpufreq_driver->setpolicy> exists, these
 int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
                                    struct cpufreq_frequency_table *table);
 
-int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
+int cpufreq_frequency_table_verify(struct cpufreq_policy_data *policy,
                                   struct cpufreq_frequency_table *table);
-int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy);
+int cpufreq_generic_frequency_table_verify(struct cpufreq_policy_data *policy);
 
 int cpufreq_table_index_unsorted(struct cpufreq_policy *policy,
                                 unsigned int target_freq,