|
@@ -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,6 +328,8 @@ 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) {
|
|
|
/* Driver requested deferred probing */
|
|
@@ -525,6 +536,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,
|