On Fri, 8 Nov 2024 at 07:57, Shawn Lin <shawn.lin@xxxxxxxxxxxxxx> wrote: > > From: Ulf Hansson <ulf.hansson@xxxxxxxxxx> > > For some usecases a consumer driver requires its device to remain power-on > from the PM domain perspective during runtime. Using dev PM qos along with > the genpd governors, doesn't work for this case as would potentially > prevent the device from being runtime suspended too. > > To support these usecases, let's introduce dev_pm_genpd_rpm_always_on() to > allow consumers drivers to dynamically control the behaviour in genpd for a > device that is attached to it. > > Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> > Signed-off-by: Shawn Lin <shawn.lin@xxxxxxxxxxxxxx> > --- > > Changes in v5: None > Changes in v4: None > Changes in v3: None > Changes in v2: None > > drivers/pmdomain/core.c | 34 ++++++++++++++++++++++++++++++++++ > include/linux/pm_domain.h | 7 +++++++ > 2 files changed, 41 insertions(+) > > diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c > index 5ede0f7..2ccfcb7 100644 > --- a/drivers/pmdomain/core.c > +++ b/drivers/pmdomain/core.c > @@ -692,6 +692,36 @@ bool dev_pm_genpd_get_hwmode(struct device *dev) > } > EXPORT_SYMBOL_GPL(dev_pm_genpd_get_hwmode); > > +/** > + * dev_pm_genpd_rpm_always_on() - Control if the PM domain can be powered off. > + * > + * @dev: Device for which the PM domain may need to stay on for. > + * @on: Value to set or unset for the condition. > + * > + * For some usecases a consumer driver requires its device to remain power-on > + * from the PM domain perspective during runtime. This function allows the > + * behaviour to be dynamically controlled for a device attached to a genpd. > + * > + * It is assumed that the users guarantee that the genpd wouldn't be detached > + * while this routine is getting called. > + * > + * Return: Returns 0 on success and negative error values on failures. > + */ > +int dev_pm_genpd_rpm_always_on(struct device *dev, bool on) > +{ > + struct generic_pm_domain *genpd; > + > + genpd = dev_to_genpd_safe(dev); > + if (!genpd) > + return -ENODEV; > + > + genpd_lock(genpd); > + dev_gpd_data(dev)->rpm_always_on = on; > + genpd_unlock(genpd); > + > + return 0; > +} We need and EXPORT_SYMBOL_GPL() here too. [...] Kind regards Uffe