lkml.org 
[lkml]   [2020]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 05/12] OPP: Add and export helper to set bandwidth
    Date
    Add and export 'dev_pm_opp_set_bw' to set the bandwidth
    levels associated with an OPP for a given frequency.

    Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
    ---

    v4:
    https://patchwork.kernel.org/patch/11019737/
    * Pass device opp to set bw levels [Bjorn]

    drivers/opp/core.c | 43 ++++++++++++++++++++++++++++++++++++++++++
    include/linux/pm_opp.h | 6 ++++++
    2 files changed, 49 insertions(+)

    diff --git a/drivers/opp/core.c b/drivers/opp/core.c
    index 7f7060079bb28..f157e2d768d76 100644
    --- a/drivers/opp/core.c
    +++ b/drivers/opp/core.c
    @@ -791,6 +791,49 @@ static int _set_required_opps(struct device *dev,
    return ret;
    }

    +/**
    + * dev_pm_opp_set_bw() - sets bandwidth levels corresponding to an available opp
    + * @dev: device for which we do this operation
    + * @opp: opp based on which the bandwidth levels are to be configured
    + *
    + * This configures the bandwidth to the levels specified
    + * by the OPP.
    + *
    + * Return: 0 on success or a negative error value.
    + */
    +int dev_pm_opp_set_bw(struct device *dev, struct dev_pm_opp *opp)
    +{
    + struct opp_table *opp_table;
    + int ret = -EINVAL;
    + int i;
    +
    + if (IS_ERR_OR_NULL(opp) || !opp->available) {
    + dev_err(dev, "%s: Invalid parameters\n", __func__);
    + return -EINVAL;
    + }
    +
    + opp_table = _find_opp_table(dev);
    + if (IS_ERR(opp_table)) {
    + dev_err(dev, "%s: device opp table doesn't exist\n", __func__);
    + return PTR_ERR(opp_table);
    + }
    +
    + if (opp_table->paths) {
    + for (i = 0; i < opp_table->path_count; i++) {
    + ret = icc_set_bw(opp_table->paths[i],
    + opp->bandwidth[i].avg,
    + opp->bandwidth[i].peak);
    + if (ret)
    + dev_err(dev, "Failed to set bandwidth[%d]: %d\n",
    + i, ret);
    + }
    + }
    +
    + dev_pm_opp_put_opp_table(opp_table);
    + return ret;
    +}
    +EXPORT_SYMBOL_GPL(dev_pm_opp_set_bw);
    +
    /**
    * dev_pm_opp_set_rate() - Configure new OPP based on frequency
    * @dev: device for which we do this operation
    diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
    index 639bc0382ee02..87ba295080a2b 100644
    --- a/include/linux/pm_opp.h
    +++ b/include/linux/pm_opp.h
    @@ -154,6 +154,7 @@ struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char **names
    void dev_pm_opp_detach_genpd(struct opp_table *opp_table);
    int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate);
    int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
    +int dev_pm_opp_set_bw(struct device *dev, struct dev_pm_opp *opp);
    int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
    int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
    void dev_pm_opp_remove_table(struct device *dev);
    @@ -352,6 +353,11 @@ static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_f
    return -ENOTSUPP;
    }

    +static inline int dev_pm_opp_set_bw(struct device *dev, struct dev_pm_opp *opp)
    +{
    + return -ENOTSUPP;
    +}
    +
    static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
    {
    return -ENOTSUPP;
    --
    The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
    a Linux Foundation Collaborative Project
    \
     
     \ /
      Last update: 2020-05-04 22:25    [W:4.281 / U:0.428 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site