struct qcom_cpufreq_data {
        void __iomem *base;
        struct resource *res;
-       const struct qcom_cpufreq_soc_data *soc_data;
 
        /*
         * Mutex to synchronize between de-init sequence and re-starting LMh
 
 static struct {
        struct qcom_cpufreq_data *data;
+       const struct qcom_cpufreq_soc_data *soc_data;
 } qcom_cpufreq;
 
 static unsigned long cpu_hw_rate, xo_rate;
                                        unsigned int index)
 {
        struct qcom_cpufreq_data *data = policy->driver_data;
-       const struct qcom_cpufreq_soc_data *soc_data = data->soc_data;
+       const struct qcom_cpufreq_soc_data *soc_data = qcom_cpufreq.soc_data;
        unsigned long freq = policy->freq_table[index].frequency;
        unsigned int i;
 
                return 0;
 
        data = policy->driver_data;
-       soc_data = data->soc_data;
+       soc_data = qcom_cpufreq.soc_data;
 
        index = readl_relaxed(data->base + soc_data->reg_perf_state);
        index = min(index, LUT_MAX_ENTRIES - 1);
                                                unsigned int target_freq)
 {
        struct qcom_cpufreq_data *data = policy->driver_data;
-       const struct qcom_cpufreq_soc_data *soc_data = data->soc_data;
+       const struct qcom_cpufreq_soc_data *soc_data = qcom_cpufreq.soc_data;
        unsigned int index;
        unsigned int i;
 
        unsigned long rate;
        int ret;
        struct qcom_cpufreq_data *drv_data = policy->driver_data;
-       const struct qcom_cpufreq_soc_data *soc_data = drv_data->soc_data;
+       const struct qcom_cpufreq_soc_data *soc_data = qcom_cpufreq.soc_data;
 
        table = kcalloc(LUT_MAX_ENTRIES + 1, sizeof(*table), GFP_KERNEL);
        if (!table)
 {
        unsigned int lval;
 
-       if (data->soc_data->reg_current_vote)
-               lval = readl_relaxed(data->base + data->soc_data->reg_current_vote) & 0x3ff;
+       if (qcom_cpufreq.soc_data->reg_current_vote)
+               lval = readl_relaxed(data->base + qcom_cpufreq.soc_data->reg_current_vote) & 0x3ff;
        else
-               lval = readl_relaxed(data->base + data->soc_data->reg_domain_state) & 0xff;
+               lval = readl_relaxed(data->base + qcom_cpufreq.soc_data->reg_domain_state) & 0xff;
 
        return lval * xo_rate;
 }
        disable_irq_nosync(c_data->throttle_irq);
        schedule_delayed_work(&c_data->throttle_work, 0);
 
-       if (c_data->soc_data->reg_intr_clr)
+       if (qcom_cpufreq.soc_data->reg_intr_clr)
                writel_relaxed(GT_IRQ_STATUS,
-                              c_data->base + c_data->soc_data->reg_intr_clr);
+                              c_data->base + qcom_cpufreq.soc_data->reg_intr_clr);
 
        return IRQ_HANDLED;
 }
                return ret;
 
        index = args.args[0];
-       data->soc_data = of_device_get_match_data(&pdev->dev);
        data = &qcom_cpufreq.data[index];
 
        /* HW should be in enabled state to proceed */
-       if (!(readl_relaxed(data->base + data->soc_data->reg_enable) & 0x1)) {
+       if (!(readl_relaxed(data->base + qcom_cpufreq.soc_data->reg_enable) & 0x1)) {
                dev_err(dev, "Domain-%d cpufreq hardware not enabled\n", index);
                return -ENODEV;
        }
 
-       if (readl_relaxed(data->base + data->soc_data->reg_dcvs_ctrl) & 0x1)
+       if (readl_relaxed(data->base + qcom_cpufreq.soc_data->reg_dcvs_ctrl) & 0x1)
                data->per_core_dcvs = true;
 
        qcom_get_related_cpus(index, policy->cpus);
        if (!qcom_cpufreq.data)
                return -ENOMEM;
 
+       qcom_cpufreq.soc_data = of_device_get_match_data(dev);
+
        for (i = 0; i < num_domains; i++) {
                struct qcom_cpufreq_data *data = &qcom_cpufreq.data[i];
                struct resource *res;