Re: [PATCH V3 06/10] PM / Domains: Add genpd_opp_to_performance_state()
From: Ulf Hansson
Date: Thu Oct 25 2018 - 06:55:21 EST
On 25 October 2018 at 07:52, Viresh Kumar <viresh.kumar@xxxxxxxxxx> wrote:
> The OPP core currently stores the performance state in the consumer
> device's OPP table, but that is going to change going forward and
> performance state will rather be set directly in the genpd's OPP table.
>
> For that we need to get the performance state for genpd's device
> structure (genpd->dev) instead of the consumer device's structure. Add a
> new helper to do that.
>
> Signed-off-by: Viresh Kumar <viresh.kumar@xxxxxxxxxx>
Reviewed-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx>
Kind regards
Uffe
> ---
> drivers/base/power/domain.c | 32 ++++++++++++++++++++++++++++++++
> include/linux/pm_domain.h | 9 +++++++++
> 2 files changed, 41 insertions(+)
>
> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
> index fe9b0527b161..7be8c94c6b7f 100644
> --- a/drivers/base/power/domain.c
> +++ b/drivers/base/power/domain.c
> @@ -2520,6 +2520,38 @@ int of_genpd_parse_idle_states(struct device_node *dn,
> }
> EXPORT_SYMBOL_GPL(of_genpd_parse_idle_states);
>
> +/**
> + * pm_genpd_opp_to_performance_state - Gets performance state of the genpd from its OPP node.
> + *
> + * @genpd_dev: Genpd's device for which the performance-state needs to be found.
> + * @opp: struct dev_pm_opp of the OPP for which we need to find performance
> + * state.
> + *
> + * Returns performance state encoded in the OPP of the genpd. This calls
> + * platform specific genpd->opp_to_performance_state() callback to translate
> + * power domain OPP to performance state.
> + *
> + * Returns performance state on success and 0 on failure.
> + */
> +unsigned int pm_genpd_opp_to_performance_state(struct device *genpd_dev,
> + struct dev_pm_opp *opp)
> +{
> + struct generic_pm_domain *genpd = NULL;
> + int state;
> +
> + genpd = container_of(genpd_dev, struct generic_pm_domain, dev);
> +
> + if (unlikely(!genpd->opp_to_performance_state))
> + return 0;
> +
> + genpd_lock(genpd);
> + state = genpd->opp_to_performance_state(genpd, opp);
> + genpd_unlock(genpd);
> +
> + return state;
> +}
> +EXPORT_SYMBOL_GPL(pm_genpd_opp_to_performance_state);
> +
> /**
> * of_genpd_opp_to_performance_state- Gets performance state of device's
> * power domain corresponding to a DT node's "required-opps" property.
> diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
> index 3b5d7280e52e..4f803f934308 100644
> --- a/include/linux/pm_domain.h
> +++ b/include/linux/pm_domain.h
> @@ -258,6 +258,8 @@ int of_genpd_add_subdomain(struct of_phandle_args *parent,
> struct generic_pm_domain *of_genpd_remove_last(struct device_node *np);
> int of_genpd_parse_idle_states(struct device_node *dn,
> struct genpd_power_state **states, int *n);
> +unsigned int pm_genpd_opp_to_performance_state(struct device *genpd_dev,
> + struct dev_pm_opp *opp);
> unsigned int of_genpd_opp_to_performance_state(struct device *dev,
> struct device_node *np);
>
> @@ -299,6 +301,13 @@ static inline int of_genpd_parse_idle_states(struct device_node *dn,
> return -ENODEV;
> }
>
> +static inline unsigned int
> +pm_genpd_opp_to_performance_state(struct device *genpd_dev,
> + struct dev_pm_opp *opp)
> +{
> + return 0;
> +}
> +
> static inline unsigned int
> of_genpd_opp_to_performance_state(struct device *dev,
> struct device_node *np)
> --
> 2.19.1.568.g152ad8e3369a
>