/**
  * 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;
 };
 
 
 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;
                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)
                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
        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);
 {
        struct cpu_data *data = policy->driver_data;
 
-       of_node_put(data->parent);
+       kfree(data->pclk);
        kfree(data->table);
        kfree(data);
        policy->driver_data = NULL;
        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);
 }