|
@@ -11,6 +11,8 @@
|
|
|
#include <linux/export.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/pm_clock.h>
|
|
|
+#include <linux/acpi.h>
|
|
|
+#include <linux/pm_domain.h>
|
|
|
|
|
|
/**
|
|
|
* dev_pm_get_subsys_data - Create or refcount power.subsys_data for device.
|
|
@@ -82,3 +84,53 @@ int dev_pm_put_subsys_data(struct device *dev)
|
|
|
return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(dev_pm_put_subsys_data);
|
|
|
+
|
|
|
+/**
|
|
|
+ * dev_pm_domain_attach - Attach a device to its PM domain.
|
|
|
+ * @dev: Device to attach.
|
|
|
+ * @power_on: Used to indicate whether we should power on the device.
|
|
|
+ *
|
|
|
+ * The @dev may only be attached to a single PM domain. By iterating through
|
|
|
+ * the available alternatives we try to find a valid PM domain for the device.
|
|
|
+ * As attachment succeeds, the ->detach() callback in the struct dev_pm_domain
|
|
|
+ * should be assigned by the corresponding attach function.
|
|
|
+ *
|
|
|
+ * This function should typically be invoked from subsystem level code during
|
|
|
+ * the probe phase. Especially for those that holds devices which requires
|
|
|
+ * power management through PM domains.
|
|
|
+ *
|
|
|
+ * Callers must ensure proper synchronization of this function with power
|
|
|
+ * management callbacks.
|
|
|
+ *
|
|
|
+ * Returns 0 on successfully attached PM domain or negative error code.
|
|
|
+ */
|
|
|
+int dev_pm_domain_attach(struct device *dev, bool power_on)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = acpi_dev_pm_attach(dev, power_on);
|
|
|
+ if (ret)
|
|
|
+ ret = genpd_dev_pm_attach(dev);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(dev_pm_domain_attach);
|
|
|
+
|
|
|
+/**
|
|
|
+ * dev_pm_domain_detach - Detach a device from its PM domain.
|
|
|
+ * @dev: Device to attach.
|
|
|
+ * @power_off: Used to indicate whether we should power off the device.
|
|
|
+ *
|
|
|
+ * This functions will reverse the actions from dev_pm_domain_attach() and thus
|
|
|
+ * try to detach the @dev from its PM domain. Typically it should be invoked
|
|
|
+ * from subsystem level code during the remove phase.
|
|
|
+ *
|
|
|
+ * Callers must ensure proper synchronization of this function with power
|
|
|
+ * management callbacks.
|
|
|
+ */
|
|
|
+void dev_pm_domain_detach(struct device *dev, bool power_off)
|
|
|
+{
|
|
|
+ if (dev->pm_domain && dev->pm_domain->detach)
|
|
|
+ dev->pm_domain->detach(dev, power_off);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(dev_pm_domain_detach);
|