]> git.karo-electronics.de Git - linux-beck.git/commitdiff
PM / Domains: Add genpd attach/detach callbacks
authorGeert Uytterhoeven <geert+renesas@glider.be>
Thu, 25 Sep 2014 16:28:28 +0000 (18:28 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 25 Sep 2014 20:08:41 +0000 (22:08 +0200)
While a PM domain can enable PM runtime management of its devices' module
clocks by setting

genpd->dev_ops.stop = pm_clk_suspend;
genpd->dev_ops.start = pm_clk_resume;

this also requires registering the clocks with the pm_clk subsystem.
In the legacy case, this is handled by the platform code, after
attaching the device to its PM domain.

When the devices are instantiated from DT, devices are attached to their
PM domains by generic code, leaving no method for the platform-specific
PM domain code to register their clocks.

Add two callbacks, allowing a PM domain to perform platform-specific
tasks when a device is attached to or detached from a PM domain.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/domain.c
include/linux/pm_domain.h

index cd400575ee0ee89c0cee6adf0e9848c1a6fec091..2a9f4c5025e32f617fe547cca914b983e04c25c9 100644 (file)
@@ -1436,6 +1436,9 @@ int __pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
 
        spin_unlock_irq(&dev->power.lock);
 
+       if (genpd->attach_dev)
+               genpd->attach_dev(dev);
+
        mutex_lock(&gpd_data->lock);
        gpd_data->base.dev = dev;
        list_add_tail(&gpd_data->base.list_node, &genpd->dev_list);
@@ -1528,6 +1531,9 @@ int pm_genpd_remove_device(struct generic_pm_domain *genpd,
        genpd->device_count--;
        genpd->max_off_time_changed = true;
 
+       if (genpd->detach_dev)
+               genpd->detach_dev(dev);
+
        spin_lock_irq(&dev->power.lock);
 
        dev->pm_domain = NULL;
index 292079d8da6b8a78ce648f7c0faa23a294632ef6..9a93e622bdea3f7943481cd1bcafc12ceaa226a7 100644 (file)
@@ -73,6 +73,8 @@ struct generic_pm_domain {
        bool cached_power_down_ok;
        struct device_node *of_node; /* Node in device tree */
        struct gpd_cpu_data *cpu_data;
+       void (*attach_dev)(struct device *dev);
+       void (*detach_dev)(struct device *dev);
 };
 
 static inline struct generic_pm_domain *pd_to_genpd(struct dev_pm_domain *pd)