提交 0f0fe7e0 编写于 作者: V Viresh Kumar 提交者: Rafael J. Wysocki

PM / OPP: Manage supply's voltage/current in a separate structure

This is a preparatory step for multiple regulator per device support.
Move the voltage/current variables to a new structure.
Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
Tested-by: NDave Gerlach <d-gerlach@ti.com>
Reviewed-by: NStephen Boyd <sboyd@codeaurora.org>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
上级 dc39d06f
...@@ -112,7 +112,7 @@ unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp) ...@@ -112,7 +112,7 @@ unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
if (IS_ERR_OR_NULL(tmp_opp)) if (IS_ERR_OR_NULL(tmp_opp))
pr_err("%s: Invalid parameters\n", __func__); pr_err("%s: Invalid parameters\n", __func__);
else else
v = tmp_opp->u_volt; v = tmp_opp->supply.u_volt;
return v; return v;
} }
...@@ -246,10 +246,10 @@ unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev) ...@@ -246,10 +246,10 @@ unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
if (!opp->available) if (!opp->available)
continue; continue;
if (opp->u_volt_min < min_uV) if (opp->supply.u_volt_min < min_uV)
min_uV = opp->u_volt_min; min_uV = opp->supply.u_volt_min;
if (opp->u_volt_max > max_uV) if (opp->supply.u_volt_max > max_uV)
max_uV = opp->u_volt_max; max_uV = opp->supply.u_volt_max;
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -637,14 +637,14 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) ...@@ -637,14 +637,14 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
if (IS_ERR(old_opp)) { if (IS_ERR(old_opp)) {
old_u_volt = 0; old_u_volt = 0;
} else { } else {
old_u_volt = old_opp->u_volt; old_u_volt = old_opp->supply.u_volt;
old_u_volt_min = old_opp->u_volt_min; old_u_volt_min = old_opp->supply.u_volt_min;
old_u_volt_max = old_opp->u_volt_max; old_u_volt_max = old_opp->supply.u_volt_max;
} }
u_volt = opp->u_volt; u_volt = opp->supply.u_volt;
u_volt_min = opp->u_volt_min; u_volt_min = opp->supply.u_volt_min;
u_volt_max = opp->u_volt_max; u_volt_max = opp->supply.u_volt_max;
reg = opp_table->regulator; reg = opp_table->regulator;
...@@ -957,10 +957,11 @@ static bool _opp_supported_by_regulators(struct dev_pm_opp *opp, ...@@ -957,10 +957,11 @@ static bool _opp_supported_by_regulators(struct dev_pm_opp *opp,
struct regulator *reg = opp_table->regulator; struct regulator *reg = opp_table->regulator;
if (!IS_ERR(reg) && if (!IS_ERR(reg) &&
!regulator_is_supported_voltage(reg, opp->u_volt_min, !regulator_is_supported_voltage(reg, opp->supply.u_volt_min,
opp->u_volt_max)) { opp->supply.u_volt_max)) {
pr_warn("%s: OPP minuV: %lu maxuV: %lu, not supported by regulator\n", 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; return false;
} }
...@@ -993,11 +994,12 @@ int _opp_add(struct device *dev, struct dev_pm_opp *new_opp, ...@@ -993,11 +994,12 @@ int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,
/* Duplicate OPPs */ /* Duplicate OPPs */
dev_warn(dev, "%s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d\n", 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, __func__, opp->rate, opp->supply.u_volt,
new_opp->rate, new_opp->u_volt, new_opp->available); opp->available, new_opp->rate, new_opp->supply.u_volt,
new_opp->available);
return opp->available && new_opp->u_volt == opp->u_volt ? return opp->available &&
0 : -EEXIST; new_opp->supply.u_volt == opp->supply.u_volt ? 0 : -EEXIST;
} }
new_opp->opp_table = opp_table; new_opp->opp_table = opp_table;
...@@ -1064,9 +1066,9 @@ int _opp_add_v1(struct device *dev, unsigned long freq, long u_volt, ...@@ -1064,9 +1066,9 @@ int _opp_add_v1(struct device *dev, unsigned long freq, long u_volt,
/* populate the opp table */ /* populate the opp table */
new_opp->rate = freq; new_opp->rate = freq;
tol = u_volt * opp_table->voltage_tolerance_v1 / 100; tol = u_volt * opp_table->voltage_tolerance_v1 / 100;
new_opp->u_volt = u_volt; new_opp->supply.u_volt = u_volt;
new_opp->u_volt_min = u_volt - tol; new_opp->supply.u_volt_min = u_volt - tol;
new_opp->u_volt_max = u_volt + tol; new_opp->supply.u_volt_max = u_volt + tol;
new_opp->available = true; new_opp->available = true;
new_opp->dynamic = dynamic; new_opp->dynamic = dynamic;
......
...@@ -63,16 +63,16 @@ int opp_debug_create_one(struct dev_pm_opp *opp, struct opp_table *opp_table) ...@@ -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)) if (!debugfs_create_ulong("rate_hz", S_IRUGO, d, &opp->rate))
return -ENOMEM; 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; 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; 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; 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; return -ENOMEM;
if (!debugfs_create_ulong("clock_latency_ns", S_IRUGO, d, if (!debugfs_create_ulong("clock_latency_ns", S_IRUGO, d,
......
...@@ -148,14 +148,14 @@ static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev, ...@@ -148,14 +148,14 @@ static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
return -EINVAL; return -EINVAL;
} }
opp->u_volt = microvolt[0]; opp->supply.u_volt = microvolt[0];
if (count == 1) { if (count == 1) {
opp->u_volt_min = opp->u_volt; opp->supply.u_volt_min = opp->supply.u_volt;
opp->u_volt_max = opp->u_volt; opp->supply.u_volt_max = opp->supply.u_volt;
} else { } else {
opp->u_volt_min = microvolt[1]; opp->supply.u_volt_min = microvolt[1];
opp->u_volt_max = microvolt[2]; opp->supply.u_volt_max = microvolt[2];
} }
/* Search for "opp-microamp-<name>" */ /* Search for "opp-microamp-<name>" */
...@@ -173,7 +173,7 @@ static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev, ...@@ -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)) if (prop && !of_property_read_u32(opp->np, name, &val))
opp->u_amp = val; opp->supply.u_amp = val;
return 0; return 0;
} }
...@@ -303,9 +303,9 @@ static int _opp_add_static_v2(struct device *dev, struct device_node *np) ...@@ -303,9 +303,9 @@ static int _opp_add_static_v2(struct device *dev, struct device_node *np)
mutex_unlock(&opp_table_lock); mutex_unlock(&opp_table_lock);
pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu latency:%lu\n", 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, __func__, new_opp->turbo, new_opp->rate,
new_opp->u_volt_min, new_opp->u_volt_max, new_opp->supply.u_volt, new_opp->supply.u_volt_min,
new_opp->clock_latency_ns); new_opp->supply.u_volt_max, new_opp->clock_latency_ns);
/* /*
* Notify the changes in the availability of the operable * Notify the changes in the availability of the operable
......
...@@ -61,10 +61,7 @@ extern struct list_head opp_tables; ...@@ -61,10 +61,7 @@ extern struct list_head opp_tables;
* @turbo: true if turbo (boost) OPP * @turbo: true if turbo (boost) OPP
* @suspend: true if suspend OPP * @suspend: true if suspend OPP
* @rate: Frequency in hertz * @rate: Frequency in hertz
* @u_volt: Target voltage in microvolts corresponding to this OPP * @supply: Power supply voltage/current values
* @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
* @clock_latency_ns: Latency (in nanoseconds) of switching to this OPP's * @clock_latency_ns: Latency (in nanoseconds) of switching to this OPP's
* frequency from any other OPP's frequency. * frequency from any other OPP's frequency.
* @opp_table: points back to the opp_table struct this opp belongs to * @opp_table: points back to the opp_table struct this opp belongs to
...@@ -83,10 +80,8 @@ struct dev_pm_opp { ...@@ -83,10 +80,8 @@ struct dev_pm_opp {
bool suspend; bool suspend;
unsigned long rate; unsigned long rate;
unsigned long u_volt; struct dev_pm_opp_supply supply;
unsigned long u_volt_min;
unsigned long u_volt_max;
unsigned long u_amp;
unsigned long clock_latency_ns; unsigned long clock_latency_ns;
struct opp_table *opp_table; struct opp_table *opp_table;
......
...@@ -25,6 +25,22 @@ enum dev_pm_opp_event { ...@@ -25,6 +25,22 @@ enum dev_pm_opp_event {
OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE, 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) #if defined(CONFIG_PM_OPP)
unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册