These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / cpufreq / qoriq-cpufreq.c
index 88b21ae..358f075 100644 (file)
 
 /**
  * struct cpu_data
- * @parent: the parent node of cpu clock
+ * @pclk: the parent clock of cpu
  * @table: frequency table
  */
 struct cpu_data {
-       struct device_node *parent;
+       struct clk **pclk;
        struct cpufreq_frequency_table *table;
 };
 
@@ -196,7 +196,7 @@ static void freq_table_sort(struct cpufreq_frequency_table *freq_table,
 
 static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
 {
-       struct device_node *np;
+       struct device_node *np, *pnode;
        int i, count, ret;
        u32 freq, mask;
        struct clk *clk;
@@ -219,17 +219,23 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
                goto err_nomem2;
        }
 
-       data->parent = of_parse_phandle(np, "clocks", 0);
-       if (!data->parent) {
+       pnode = of_parse_phandle(np, "clocks", 0);
+       if (!pnode) {
                pr_err("%s: could not get clock information\n", __func__);
                goto err_nomem2;
        }
 
-       count = of_property_count_strings(data->parent, "clock-names");
+       count = of_property_count_strings(pnode, "clock-names");
+       data->pclk = kcalloc(count, sizeof(struct clk *), GFP_KERNEL);
+       if (!data->pclk) {
+               pr_err("%s: no memory\n", __func__);
+               goto err_node;
+       }
+
        table = kcalloc(count + 1, sizeof(*table), GFP_KERNEL);
        if (!table) {
                pr_err("%s: no memory\n", __func__);
-               goto err_node;
+               goto err_pclk;
        }
 
        if (fmask)
@@ -238,7 +244,8 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
                mask = 0x0;
 
        for (i = 0; i < count; i++) {
-               clk = of_clk_get(data->parent, i);
+               clk = of_clk_get(pnode, i);
+               data->pclk[i] = clk;
                freq = clk_get_rate(clk);
                /*
                 * the clock is valid if its frequency is not masked
@@ -273,13 +280,16 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
        policy->cpuinfo.transition_latency = u64temp + 1;
 
        of_node_put(np);
+       of_node_put(pnode);
 
        return 0;
 
 err_nomem1:
        kfree(table);
+err_pclk:
+       kfree(data->pclk);
 err_node:
-       of_node_put(data->parent);
+       of_node_put(pnode);
 err_nomem2:
        policy->driver_data = NULL;
        kfree(data);
@@ -293,7 +303,7 @@ static int __exit qoriq_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 {
        struct cpu_data *data = policy->driver_data;
 
-       of_node_put(data->parent);
+       kfree(data->pclk);
        kfree(data->table);
        kfree(data);
        policy->driver_data = NULL;
@@ -307,7 +317,7 @@ static int qoriq_cpufreq_target(struct cpufreq_policy *policy,
        struct clk *parent;
        struct cpu_data *data = policy->driver_data;
 
-       parent = of_clk_get(data->parent, data->table[index].driver_data);
+       parent = data->pclk[data->table[index].driver_data];
        return clk_set_parent(policy->clk, parent);
 }