On 29/05/18 11:04, Ulf Hansson wrote: > To support devices being partitioned across multiple PM domains, let's > begin with extending genpd to cope with these kind of configurations. > > Therefore, add a new exported function genpd_dev_pm_attach_by_id(), which > is similar to the existing genpd_dev_pm_attach(), but with the difference > that it allows its callers to provide an index to the PM domain that it > wants to attach. > > Note that, genpd_dev_pm_attach_by_id() shall only be called by the driver > core / PM core, similar to how the existing dev_pm_domain_attach() makes > use of genpd_dev_pm_attach(). However, this is implemented by following > changes on top. > > Because, only one PM domain can be attached per device, genpd needs to > create a virtual device that it can attach/detach instead. More precisely, > let the new function genpd_dev_pm_attach_by_id() register a virtual struct > device via calling device_register(). Then let it attach this device to the > corresponding PM domain, rather than the one that is provided by the > caller. The actual attaching is done via re-using the existing genpd OF > functions. > > At successful attachment, genpd_dev_pm_attach_by_id() returns the created > virtual device, which allows the caller to operate on it to deal with power > management. Following changes on top, provides more details in this > regards. > > To deal with detaching of a PM domain for the multiple PM domains case, > let's also extend the existing genpd_dev_pm_detach() function, to cover the > cleanup of the created virtual device, via make it call device_unregister() > on it. In this way, there is no need to introduce a new function to deal > with detach for the multiple PM domain case, but instead the existing one > is re-used. > > Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> > --- > > Changes in v2: > - Fixed comments from Jon. Clarified function descriptions > and changelog. > > --- > drivers/base/power/domain.c | 80 +++++++++++++++++++++++++++++++++++++ > include/linux/pm_domain.h | 8 ++++ > 2 files changed, 88 insertions(+) > > diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c > index 2af99bfcbe3c..2b496d79159d 100644 > --- a/drivers/base/power/domain.c > +++ b/drivers/base/power/domain.c > @@ -2171,6 +2171,15 @@ struct generic_pm_domain *of_genpd_remove_last(struct device_node *np) > } > EXPORT_SYMBOL_GPL(of_genpd_remove_last); > > +static void genpd_release_dev(struct device *dev) > +{ > + kfree(dev); > +} > + > +static struct bus_type genpd_bus_type = { > + .name = "genpd", > +}; > + > /** > * genpd_dev_pm_detach - Detach a device from its PM domain. > * @dev: Device to detach. > @@ -2208,6 +2217,10 @@ static void genpd_dev_pm_detach(struct device *dev, bool power_off) > > /* Check if PM domain can be powered off after removing this device. */ > genpd_queue_power_off_work(pd); > + > + /* Unregister the device if it was created by genpd. */ > + if (dev->bus == &genpd_bus_type) > + device_unregister(dev); > } > > static void genpd_dev_pm_sync(struct device *dev) > @@ -2298,6 +2311,67 @@ int genpd_dev_pm_attach(struct device *dev) > } > EXPORT_SYMBOL_GPL(genpd_dev_pm_attach); > > +/** > + * genpd_dev_pm_attach_by_id() - Attach a device to one of its PM domain. > + * @dev: Device to attach. Can you update the description of the above as well? Thanks Jon -- nvpublic -- To unsubscribe from this list: send the line "unsubscribe linux-tegra" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html