return ret;
 }
 
+static int genpd_runtime_suspend(struct device *dev);
+
 /*
  * Get the generic PM domain for a particular struct device.
  * This validates the struct device pointer, the PM domain pointer,
  * and checks that the PM domain pointer is a real generic PM domain.
  * Any failure results in NULL being returned.
  */
-static struct generic_pm_domain *genpd_lookup_dev(struct device *dev)
+static struct generic_pm_domain *dev_to_genpd_safe(struct device *dev)
 {
-       struct generic_pm_domain *genpd = NULL, *gpd;
-
        if (IS_ERR_OR_NULL(dev) || IS_ERR_OR_NULL(dev->pm_domain))
                return NULL;
 
-       mutex_lock(&gpd_list_lock);
-       list_for_each_entry(gpd, &gpd_list, gpd_list_node) {
-               if (&gpd->domain == dev->pm_domain) {
-                       genpd = gpd;
-                       break;
-               }
-       }
-       mutex_unlock(&gpd_list_lock);
+       /* A genpd's always have its ->runtime_suspend() callback assigned. */
+       if (dev->pm_domain->ops.runtime_suspend == genpd_runtime_suspend)
+               return pd_to_genpd(dev->pm_domain);
 
-       return genpd;
+       return NULL;
 }
 
 /*
  */
 int pm_genpd_remove_device(struct device *dev)
 {
-       struct generic_pm_domain *genpd = genpd_lookup_dev(dev);
+       struct generic_pm_domain *genpd = dev_to_genpd_safe(dev);
 
        if (!genpd)
                return -EINVAL;