struct mtk_cpufreq_data *data;
        struct device *dev = &pdev->dev;
        struct resource *res;
+       struct of_phandle_args args;
        void __iomem *base;
        int ret, i;
        int index;
        if (!data)
                return -ENOMEM;
 
-       index = of_perf_domain_get_sharing_cpumask(policy->cpu, "performance-domains",
-                                                  "#performance-domain-cells",
-                                                  policy->cpus);
-       if (index < 0)
-               return index;
+       ret = of_perf_domain_get_sharing_cpumask(policy->cpu, "performance-domains",
+                                                "#performance-domain-cells",
+                                                policy->cpus, &args);
+       if (ret < 0)
+               return ret;
+
+       index = args.args[0];
+       of_node_put(args.np);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, index);
        if (!res) {
 
 }
 
 static inline int parse_perf_domain(int cpu, const char *list_name,
-                                   const char *cell_name)
+                                   const char *cell_name,
+                                   struct of_phandle_args *args)
 {
        struct device_node *cpu_np;
-       struct of_phandle_args args;
        int ret;
 
        cpu_np = of_cpu_device_node_get(cpu);
                return -ENODEV;
 
        ret = of_parse_phandle_with_args(cpu_np, list_name, cell_name, 0,
-                                        &args);
+                                        args);
        if (ret < 0)
                return ret;
 
        of_node_put(cpu_np);
 
-       return args.args[0];
+       return 0;
 }
 
 static inline int of_perf_domain_get_sharing_cpumask(int pcpu, const char *list_name,
-                                                    const char *cell_name, struct cpumask *cpumask)
+                                                    const char *cell_name, struct cpumask *cpumask,
+                                                    struct of_phandle_args *pargs)
 {
-       int target_idx;
        int cpu, ret;
+       struct of_phandle_args args;
 
-       ret = parse_perf_domain(pcpu, list_name, cell_name);
+       ret = parse_perf_domain(pcpu, list_name, cell_name, pargs);
        if (ret < 0)
                return ret;
 
-       target_idx = ret;
        cpumask_set_cpu(pcpu, cpumask);
 
        for_each_possible_cpu(cpu) {
                if (cpu == pcpu)
                        continue;
 
-               ret = parse_perf_domain(cpu, list_name, cell_name);
+               ret = parse_perf_domain(cpu, list_name, cell_name, &args);
                if (ret < 0)
                        continue;
 
-               if (target_idx == ret)
+               if (pargs->np == args.np && pargs->args_count == args.args_count &&
+                   !memcmp(pargs->args, args.args, sizeof(args.args[0]) * args.args_count))
                        cpumask_set_cpu(cpu, cpumask);
+
+               of_node_put(args.np);
        }
 
-       return target_idx;
+       return 0;
 }
 #else
 static inline int cpufreq_boost_trigger_state(int state)
 }
 
 static inline int of_perf_domain_get_sharing_cpumask(int pcpu, const char *list_name,
-                                                    const char *cell_name, struct cpumask *cpumask)
+                                                    const char *cell_name, struct cpumask *cpumask,
+                                                    struct of_phandle_args *pargs)
 {
        return -EOPNOTSUPP;
 }