lkml.org 
[lkml]   [2016]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V4 04/10] PM / OPP: Manage supply's voltage/current in a separate structure
    Date
    This is a preparatory step for multiple regulator per device support.
    Move the voltage/current variables to a new structure.

    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Tested-by: Dave Gerlach <d-gerlach@ti.com>
    ---
    drivers/base/power/opp/core.c | 44 +++++++++++++++++++++-------------------
    drivers/base/power/opp/debugfs.c | 8 ++++----
    drivers/base/power/opp/of.c | 18 ++++++++--------
    drivers/base/power/opp/opp.h | 11 +++-------
    include/linux/pm_opp.h | 16 +++++++++++++++
    5 files changed, 55 insertions(+), 42 deletions(-)

    diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c
    index 056527a3fb4e..8d6006151c9a 100644
    --- a/drivers/base/power/opp/core.c
    +++ b/drivers/base/power/opp/core.c
    @@ -112,7 +112,7 @@ unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
    if (IS_ERR_OR_NULL(tmp_opp))
    pr_err("%s: Invalid parameters\n", __func__);
    else
    - v = tmp_opp->u_volt;
    + v = tmp_opp->supply.u_volt;

    return v;
    }
    @@ -246,10 +246,10 @@ unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
    if (!opp->available)
    continue;

    - if (opp->u_volt_min < min_uV)
    - min_uV = opp->u_volt_min;
    - if (opp->u_volt_max > max_uV)
    - max_uV = opp->u_volt_max;
    + if (opp->supply.u_volt_min < min_uV)
    + min_uV = opp->supply.u_volt_min;
    + if (opp->supply.u_volt_max > max_uV)
    + max_uV = opp->supply.u_volt_max;
    }

    rcu_read_unlock();
    @@ -637,14 +637,14 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
    if (IS_ERR(old_opp)) {
    old_u_volt = 0;
    } else {
    - old_u_volt = old_opp->u_volt;
    - old_u_volt_min = old_opp->u_volt_min;
    - old_u_volt_max = old_opp->u_volt_max;
    + old_u_volt = old_opp->supply.u_volt;
    + old_u_volt_min = old_opp->supply.u_volt_min;
    + old_u_volt_max = old_opp->supply.u_volt_max;
    }

    - u_volt = opp->u_volt;
    - u_volt_min = opp->u_volt_min;
    - u_volt_max = opp->u_volt_max;
    + u_volt = opp->supply.u_volt;
    + u_volt_min = opp->supply.u_volt_min;
    + u_volt_max = opp->supply.u_volt_max;

    reg = opp_table->regulator;

    @@ -957,10 +957,11 @@ static bool _opp_supported_by_regulators(struct dev_pm_opp *opp,
    struct regulator *reg = opp_table->regulator;

    if (!IS_ERR(reg) &&
    - !regulator_is_supported_voltage(reg, opp->u_volt_min,
    - opp->u_volt_max)) {
    + !regulator_is_supported_voltage(reg, opp->supply.u_volt_min,
    + opp->supply.u_volt_max)) {
    pr_warn("%s: OPP minuV: %lu maxuV: %lu, not supported by regulator\n",
    - __func__, opp->u_volt_min, opp->u_volt_max);
    + __func__, opp->supply.u_volt_min,
    + opp->supply.u_volt_max);
    return false;
    }

    @@ -993,11 +994,12 @@ int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,

    /* Duplicate OPPs */
    dev_warn(dev, "%s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d\n",
    - __func__, opp->rate, opp->u_volt, opp->available,
    - new_opp->rate, new_opp->u_volt, new_opp->available);
    + __func__, opp->rate, opp->supply.u_volt,
    + opp->available, new_opp->rate, new_opp->supply.u_volt,
    + new_opp->available);

    - return opp->available && new_opp->u_volt == opp->u_volt ?
    - 0 : -EEXIST;
    + return opp->available &&
    + new_opp->supply.u_volt == opp->supply.u_volt ? 0 : -EEXIST;
    }

    new_opp->opp_table = opp_table;
    @@ -1064,9 +1066,9 @@ int _opp_add_v1(struct device *dev, unsigned long freq, long u_volt,
    /* populate the opp table */
    new_opp->rate = freq;
    tol = u_volt * opp_table->voltage_tolerance_v1 / 100;
    - new_opp->u_volt = u_volt;
    - new_opp->u_volt_min = u_volt - tol;
    - new_opp->u_volt_max = u_volt + tol;
    + new_opp->supply.u_volt = u_volt;
    + new_opp->supply.u_volt_min = u_volt - tol;
    + new_opp->supply.u_volt_max = u_volt + tol;
    new_opp->available = true;
    new_opp->dynamic = dynamic;

    diff --git a/drivers/base/power/opp/debugfs.c b/drivers/base/power/opp/debugfs.c
    index ef1ae6b52042..c897676ca35f 100644
    --- a/drivers/base/power/opp/debugfs.c
    +++ b/drivers/base/power/opp/debugfs.c
    @@ -63,16 +63,16 @@ int opp_debug_create_one(struct dev_pm_opp *opp, struct opp_table *opp_table)
    if (!debugfs_create_ulong("rate_hz", S_IRUGO, d, &opp->rate))
    return -ENOMEM;

    - if (!debugfs_create_ulong("u_volt_target", S_IRUGO, d, &opp->u_volt))
    + if (!debugfs_create_ulong("u_volt_target", S_IRUGO, d, &opp->supply.u_volt))
    return -ENOMEM;

    - if (!debugfs_create_ulong("u_volt_min", S_IRUGO, d, &opp->u_volt_min))
    + if (!debugfs_create_ulong("u_volt_min", S_IRUGO, d, &opp->supply.u_volt_min))
    return -ENOMEM;

    - if (!debugfs_create_ulong("u_volt_max", S_IRUGO, d, &opp->u_volt_max))
    + if (!debugfs_create_ulong("u_volt_max", S_IRUGO, d, &opp->supply.u_volt_max))
    return -ENOMEM;

    - if (!debugfs_create_ulong("u_amp", S_IRUGO, d, &opp->u_amp))
    + if (!debugfs_create_ulong("u_amp", S_IRUGO, d, &opp->supply.u_amp))
    return -ENOMEM;

    if (!debugfs_create_ulong("clock_latency_ns", S_IRUGO, d,
    diff --git a/drivers/base/power/opp/of.c b/drivers/base/power/opp/of.c
    index 5b3755e49731..bdf409d42126 100644
    --- a/drivers/base/power/opp/of.c
    +++ b/drivers/base/power/opp/of.c
    @@ -148,14 +148,14 @@ static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
    return -EINVAL;
    }

    - opp->u_volt = microvolt[0];
    + opp->supply.u_volt = microvolt[0];

    if (count == 1) {
    - opp->u_volt_min = opp->u_volt;
    - opp->u_volt_max = opp->u_volt;
    + opp->supply.u_volt_min = opp->supply.u_volt;
    + opp->supply.u_volt_max = opp->supply.u_volt;
    } else {
    - opp->u_volt_min = microvolt[1];
    - opp->u_volt_max = microvolt[2];
    + opp->supply.u_volt_min = microvolt[1];
    + opp->supply.u_volt_max = microvolt[2];
    }

    /* Search for "opp-microamp-<name>" */
    @@ -173,7 +173,7 @@ static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
    }

    if (prop && !of_property_read_u32(opp->np, name, &val))
    - opp->u_amp = val;
    + opp->supply.u_amp = val;

    return 0;
    }
    @@ -303,9 +303,9 @@ static int _opp_add_static_v2(struct device *dev, struct device_node *np)
    mutex_unlock(&opp_table_lock);

    pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu latency:%lu\n",
    - __func__, new_opp->turbo, new_opp->rate, new_opp->u_volt,
    - new_opp->u_volt_min, new_opp->u_volt_max,
    - new_opp->clock_latency_ns);
    + __func__, new_opp->turbo, new_opp->rate,
    + new_opp->supply.u_volt, new_opp->supply.u_volt_min,
    + new_opp->supply.u_volt_max, new_opp->clock_latency_ns);

    /*
    * Notify the changes in the availability of the operable
    diff --git a/drivers/base/power/opp/opp.h b/drivers/base/power/opp/opp.h
    index 96cd30ac6c1d..8a02516542c2 100644
    --- a/drivers/base/power/opp/opp.h
    +++ b/drivers/base/power/opp/opp.h
    @@ -61,10 +61,7 @@ extern struct list_head opp_tables;
    * @turbo: true if turbo (boost) OPP
    * @suspend: true if suspend OPP
    * @rate: Frequency in hertz
    - * @u_volt: Target voltage in microvolts corresponding to this OPP
    - * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP
    - * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP
    - * @u_amp: Maximum current drawn by the device in microamperes
    + * @supply: Power supply voltage/current values
    * @clock_latency_ns: Latency (in nanoseconds) of switching to this OPP's
    * frequency from any other OPP's frequency.
    * @opp_table: points back to the opp_table struct this opp belongs to
    @@ -83,10 +80,8 @@ struct dev_pm_opp {
    bool suspend;
    unsigned long rate;

    - unsigned long u_volt;
    - unsigned long u_volt_min;
    - unsigned long u_volt_max;
    - unsigned long u_amp;
    + struct dev_pm_opp_supply supply;
    +
    unsigned long clock_latency_ns;

    struct opp_table *opp_table;
    diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
    index bca26157f5b6..f69126e2bb59 100644
    --- a/include/linux/pm_opp.h
    +++ b/include/linux/pm_opp.h
    @@ -24,6 +24,22 @@ enum dev_pm_opp_event {
    OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
    };

    +/**
    + * struct dev_pm_opp_supply - Power supply voltage/current values
    + * @u_volt: Target voltage in microvolts corresponding to this OPP
    + * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP
    + * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP
    + * @u_amp: Maximum current drawn by the device in microamperes
    + *
    + * This structure stores the voltage/current values for a single power supply.
    + */
    +struct dev_pm_opp_supply {
    + unsigned long u_volt;
    + unsigned long u_volt_min;
    + unsigned long u_volt_max;
    + unsigned long u_amp;
    +};
    +
    #if defined(CONFIG_PM_OPP)

    unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
    --
    2.7.1.410.g6faf27b
    \
     
     \ /
      Last update: 2016-11-24 12:38    [W:4.052 / U:0.256 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site