struct thermal_cooling_device *cdev;
        struct device *dev = df->dev.parent;
        struct devfreq_cooling_device *dfc;
 +      struct em_perf_domain *em;
+       struct thermal_cooling_device_ops *ops;
        char *name;
        int err, num_opps;
  
-       dfc = kzalloc(sizeof(*dfc), GFP_KERNEL);
-       if (!dfc)
+       ops = kmemdup(&devfreq_cooling_ops, sizeof(*ops), GFP_KERNEL);
+       if (!ops)
                return ERR_PTR(-ENOMEM);
  
+       dfc = kzalloc(sizeof(*dfc), GFP_KERNEL);
+       if (!dfc) {
+               err = -ENOMEM;
+               goto free_ops;
+       }
+ 
        dfc->devfreq = df;
  
 -      dfc->em_pd = em_pd_get(dev);
 -      if (dfc->em_pd) {
 +      em = em_pd_get(dev);
 +      if (em && !em_is_artificial(em)) {
 +              dfc->em_pd = em;
-               devfreq_cooling_ops.get_requested_power =
+               ops->get_requested_power =
                        devfreq_cooling_get_requested_power;
-               devfreq_cooling_ops.state2power = devfreq_cooling_state2power;
-               devfreq_cooling_ops.power2state = devfreq_cooling_power2state;
+               ops->state2power = devfreq_cooling_state2power;
+               ops->power2state = devfreq_cooling_power2state;
  
                dfc->power_ops = dfc_power;