lkml.org 
[lkml]   [2019]   [Jul]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v3 4/6] OPP: Add API to find an OPP table from its DT node
    From
    This allows finding a device's OPP table (when it has multiple) from a
    phandle to the OPP table in DT.

    Signed-off-by: Saravana Kannan <saravanak@google.com>
    ---
    drivers/opp/of.c | 42 ++++++++++++++++++++++++++++++++++--------
    include/linux/pm_opp.h | 7 +++++++
    2 files changed, 41 insertions(+), 8 deletions(-)

    diff --git a/drivers/opp/of.c b/drivers/opp/of.c
    index 54fa70ed2adc..34c51905f56d 100644
    --- a/drivers/opp/of.c
    +++ b/drivers/opp/of.c
    @@ -42,14 +42,9 @@ struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
    }
    EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_opp_desc_node);

    -struct opp_table *_managed_opp(struct device *dev, int index)
    +struct opp_table *_find_opp_table_from_node(struct device_node *np)
    {
    struct opp_table *opp_table, *managed_table = NULL;
    - struct device_node *np;
    -
    - np = _opp_of_get_opp_desc_node(dev->of_node, index);
    - if (!np)
    - return NULL;

    list_for_each_entry(opp_table, &opp_tables, node) {
    if (opp_table->np == np) {
    @@ -69,11 +64,42 @@ struct opp_table *_managed_opp(struct device *dev, int index)
    }
    }

    - of_node_put(np);
    -
    return managed_table;
    }

    +/**
    + * dev_pm_opp_of_find_table_from_node() - Find OPP table from its DT node
    + * @np: DT node used for finding the OPP table
    + *
    + * Return: OPP table corresponding to the DT node, else NULL on failure.
    + *
    + * The caller needs to put the node with of_node_put() after using it.
    + */
    +struct opp_table *dev_pm_opp_of_find_table_from_node(struct device_node *np)
    +{
    + struct opp_table *opp_table;
    +
    + mutex_lock(&opp_table_lock);
    + opp_table = _find_opp_table_from_node(np);
    + mutex_unlock(&opp_table_lock);
    + return opp_table;
    +}
    +EXPORT_SYMBOL_GPL(dev_pm_opp_of_find_table_from_node);
    +
    +struct opp_table *_managed_opp(struct device *dev, int index)
    +{
    + struct device_node *np;
    + struct opp_table *opp_table;
    +
    + np = _opp_of_get_opp_desc_node(dev->of_node, index);
    + if (!np)
    + return NULL;
    +
    + opp_table = _find_opp_table_from_node(np);
    + of_node_put(np);
    + return opp_table;
    +}
    +
    /* The caller must call dev_pm_opp_put() after the OPP is used */
    static struct dev_pm_opp *_find_opp_of_np(struct opp_table *opp_table,
    struct device_node *opp_np)
    diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
    index d4d79ac0b5b2..d80c59bcd50b 100644
    --- a/include/linux/pm_opp.h
    +++ b/include/linux/pm_opp.h
    @@ -359,6 +359,7 @@ int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
    void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
    int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
    struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
    +struct opp_table *dev_pm_opp_of_find_table_from_node(struct device_node *np);
    struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
    int of_get_required_opp_performance_state(struct device_node *np, int index);
    void dev_pm_opp_of_register_em(struct cpumask *cpus);
    @@ -396,6 +397,12 @@ static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device
    return NULL;
    }

    +static inline struct opp_table *dev_pm_opp_of_find_table_from_node(
    + struct device_node *np)
    +{
    + return NULL;
    +}
    +
    static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
    {
    return NULL;
    --
    2.22.0.410.gd8fdbe21b5-goog
    \
     
     \ /
      Last update: 2019-07-03 03:11    [W:4.594 / U:0.256 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site