Re: [PATCH 1/7] PM / Domains: Make it possible to use per-device start/stop routines

Rafael J. Wysocki
2011-11-08T20:36:19Z

On Tuesday, November 08, 2011, Guennadi Liakhovetski wrote:
> Hi Rafael
>
> On Mon, 7 Nov 2011, Rafael J. Wysocki wrote:
>
> > From: Rafael J. Wysocki <rjw@sisk.pl>
> >
> > The current generic PM domains code requires that the same .stop()
> > and .start() device callback routines be used for all devices in the
> > given domain, which is inflexible and may not cover some specific use
> > cases. For this reason, make it possible to use device specific
> > .start() and .stop() callback routines by adding corresponding
> > callback pointers to struct generic_pm_domain_data. Add a new helper
> > routine, pm_genpd_register_callbacks(), that can be used to populate
> > the new per-device callback pointers.
> >
> > Modify the shmobile's power domains code to allow drivers to add
> > their own code to be run during the device stop and start operations
> > with the help of the new callback pointers.
> >
> > Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
> > ---
>
> [snip]
>
> > Index: linux/drivers/base/power/domain.c
> > ===================================================================
> > --- linux.orig/drivers/base/power/domain.c
> > +++ linux/drivers/base/power/domain.c
> > @@ -29,6 +29,36 @@ static struct generic_pm_domain *dev_to_
> > return pd_to_genpd(dev->pm_domain);
> > }
> >
> > +static int genpd_stop_dev(struct generic_pm_domain *genpd, struct device *dev)
> > +{
> > + int (*stop)(struct device *dev);
> > +
> > + stop = genpd->stop_device;
> > + if (stop)
> > + return stop(dev);
> > +
> > + stop = dev_gpd_data(dev)->ops.stop;
> > + if (stop)
> > + return stop(dev);
>
> With this implementation your approach is: in your genpd_stop_dev() and
> genpd_start_dev() you first check for the pm-domain _common_ .start() and
> .stop(), and if they exist, the specific ones will not be called. Then in
> your sh7372 pm domain implementation you do the domain-common part -
> switch the PM clock on or off, and you _again_ check for device-specific
> domains, and this time you call both of them.
>
> Do you have specific reasons to think, that calling both of them from
> genpd_stop_dev() / genpd_start_dev() might not fit some PM-domain
> implementations?

Not very specific, but the current way is more flexible, because it
allows the PM domain to do something completely different from the
default thing.

Also that follows the strategy used in dd.c for .probe().

Thanks,
Rafael