Merge tag 'for-linus-4.1-merge-window' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / drivers / base / dd.c
index cdc779c..e843fdb 100644 (file)
@@ -298,6 +298,12 @@ static int really_probe(struct device *dev, struct device_driver *drv)
                goto probe_failed;
        }
 
+       if (dev->pm_domain && dev->pm_domain->activate) {
+               ret = dev->pm_domain->activate(dev);
+               if (ret)
+                       goto probe_failed;
+       }
+
        if (dev->bus->probe) {
                ret = dev->bus->probe(dev);
                if (ret)
@@ -308,6 +314,9 @@ static int really_probe(struct device *dev, struct device_driver *drv)
                        goto probe_failed;
        }
 
+       if (dev->pm_domain && dev->pm_domain->sync)
+               dev->pm_domain->sync(dev);
+
        driver_bound(dev);
        ret = 1;
        pr_debug("bus: '%s': %s: bound device %s to driver %s\n",
@@ -319,22 +328,28 @@ probe_failed:
        driver_sysfs_remove(dev);
        dev->driver = NULL;
        dev_set_drvdata(dev, NULL);
+       if (dev->pm_domain && dev->pm_domain->dismiss)
+               dev->pm_domain->dismiss(dev);
 
-       if (ret == -EPROBE_DEFER) {
+       switch (ret) {
+       case -EPROBE_DEFER:
                /* Driver requested deferred probing */
-               dev_info(dev, "Driver %s requests probe deferral\n", drv->name);
+               dev_dbg(dev, "Driver %s requests probe deferral\n", drv->name);
                driver_deferred_probe_add(dev);
                /* Did a trigger occur while probing? Need to re-trigger if yes */
                if (local_trigger_count != atomic_read(&deferred_trigger_count))
                        driver_deferred_probe_trigger();
-       } else if (ret != -ENODEV && ret != -ENXIO) {
+               break;
+       case -ENODEV:
+       case -ENXIO:
+               pr_debug("%s: probe of %s rejects match %d\n",
+                        drv->name, dev_name(dev), ret);
+               break;
+       default:
                /* driver matched but the probe failed */
                printk(KERN_WARNING
                       "%s: probe of %s failed with error %d\n",
                       drv->name, dev_name(dev), ret);
-       } else {
-               pr_debug("%s: probe of %s rejects match %d\n",
-                      drv->name, dev_name(dev), ret);
        }
        /*
         * Ignore errors returned by ->probe so that the next driver can try
@@ -525,6 +540,9 @@ static void __device_release_driver(struct device *dev)
                devres_release_all(dev);
                dev->driver = NULL;
                dev_set_drvdata(dev, NULL);
+               if (dev->pm_domain && dev->pm_domain->dismiss)
+                       dev->pm_domain->dismiss(dev);
+
                klist_remove(&dev->p->knode_driver);
                if (dev->bus)
                        blocking_notifier_call_chain(&dev->bus->p->bus_notifier,