Commit 22ffff6d authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'pm-opp'

Merge OPP (Operating Performance Points) changes for 5.19-rc1:

 - Minor update to dt-binding for Qcom's opp-v2-kryo-cpu (Yassine
   Oudjana).

 - Use list iterator only inside the list_for_each_entry loop (Xiaomeng
   Tong, and Jakob Koschel).

 - New APIs related to finding OPP based on interconnect bandwidth
   (Krzysztof Kozlowski).

 - Fix the missing of_node_put() in _bandwidth_supported() (Dan
   Carpenter).

 - Cleanups (Krzysztof Kozlowski, and Viresh Kumar).

* pm-opp:
  opp: Reorder definition of ceil/floor helpers
  opp: Add apis to retrieve opps with interconnect bandwidth
  dt-bindings: opp: opp-v2-kryo-cpu: Remove SMEM
  opp: use list iterator only inside the loop
  opp: replace usage of found with dedicated list iterator variable
  PM: opp: simplify with dev_err_probe()
  OPP: call of_node_put() on error path in _bandwidth_supported()
parents da436345 e0431408
...@@ -17,10 +17,10 @@ description: | ...@@ -17,10 +17,10 @@ description: |
the CPU frequencies subset and voltage value of each OPP varies based on the CPU frequencies subset and voltage value of each OPP varies based on
the silicon variant in use. the silicon variant in use.
Qualcomm Technologies, Inc. Process Voltage Scaling Tables Qualcomm Technologies, Inc. Process Voltage Scaling Tables
defines the voltage and frequency value based on the msm-id in SMEM defines the voltage and frequency value based on the speedbin blown in
and speedbin blown in the efuse combination. the efuse combination.
The qcom-cpufreq-nvmem driver reads the msm-id and efuse value from the SoC The qcom-cpufreq-nvmem driver reads the efuse value from the SoC to provide
to provide the OPP framework with required information (existing HW bitmap). the OPP framework with required information (existing HW bitmap).
This is used to determine the voltage and frequency value for each OPP of This is used to determine the voltage and frequency value for each OPP of
operating-points-v2 table when it is parsed by the OPP framework. operating-points-v2 table when it is parsed by the OPP framework.
...@@ -50,15 +50,11 @@ patternProperties: ...@@ -50,15 +50,11 @@ patternProperties:
description: | description: |
A single 32 bit bitmap value, representing compatible HW. A single 32 bit bitmap value, representing compatible HW.
Bitmap: Bitmap:
0: MSM8996 V3, speedbin 0 0: MSM8996, speedbin 0
1: MSM8996 V3, speedbin 1 1: MSM8996, speedbin 1
2: MSM8996 V3, speedbin 2 2: MSM8996, speedbin 2
3: unused 3-31: unused
4: MSM8996 SG, speedbin 0 maximum: 0x7
5: MSM8996 SG, speedbin 1
6: MSM8996 SG, speedbin 2
7-31: unused
maximum: 0x77
clock-latency-ns: true clock-latency-ns: true
...@@ -184,19 +180,19 @@ examples: ...@@ -184,19 +180,19 @@ examples:
opp-307200000 { opp-307200000 {
opp-hz = /bits/ 64 <307200000>; opp-hz = /bits/ 64 <307200000>;
opp-microvolt = <905000 905000 1140000>; opp-microvolt = <905000 905000 1140000>;
opp-supported-hw = <0x77>; opp-supported-hw = <0x7>;
clock-latency-ns = <200000>; clock-latency-ns = <200000>;
}; };
opp-1593600000 { opp-1401600000 {
opp-hz = /bits/ 64 <1593600000>; opp-hz = /bits/ 64 <1401600000>;
opp-microvolt = <1140000 905000 1140000>; opp-microvolt = <1140000 905000 1140000>;
opp-supported-hw = <0x71>; opp-supported-hw = <0x5>;
clock-latency-ns = <200000>; clock-latency-ns = <200000>;
}; };
opp-2188800000 { opp-1593600000 {
opp-hz = /bits/ 64 <2188800000>; opp-hz = /bits/ 64 <1593600000>;
opp-microvolt = <1140000 905000 1140000>; opp-microvolt = <1140000 905000 1140000>;
opp-supported-hw = <0x10>; opp-supported-hw = <0x1>;
clock-latency-ns = <200000>; clock-latency-ns = <200000>;
}; };
}; };
...@@ -209,25 +205,25 @@ examples: ...@@ -209,25 +205,25 @@ examples:
opp-307200000 { opp-307200000 {
opp-hz = /bits/ 64 <307200000>; opp-hz = /bits/ 64 <307200000>;
opp-microvolt = <905000 905000 1140000>; opp-microvolt = <905000 905000 1140000>;
opp-supported-hw = <0x77>; opp-supported-hw = <0x7>;
clock-latency-ns = <200000>; clock-latency-ns = <200000>;
}; };
opp-1593600000 { opp-1804800000 {
opp-hz = /bits/ 64 <1593600000>; opp-hz = /bits/ 64 <1804800000>;
opp-microvolt = <1140000 905000 1140000>; opp-microvolt = <1140000 905000 1140000>;
opp-supported-hw = <0x70>; opp-supported-hw = <0x6>;
clock-latency-ns = <200000>; clock-latency-ns = <200000>;
}; };
opp-2150400000 { opp-1900800000 {
opp-hz = /bits/ 64 <2150400000>; opp-hz = /bits/ 64 <1900800000>;
opp-microvolt = <1140000 905000 1140000>; opp-microvolt = <1140000 905000 1140000>;
opp-supported-hw = <0x31>; opp-supported-hw = <0x4>;
clock-latency-ns = <200000>; clock-latency-ns = <200000>;
}; };
opp-2342400000 { opp-2150400000 {
opp-hz = /bits/ 64 <2342400000>; opp-hz = /bits/ 64 <2150400000>;
opp-microvolt = <1140000 905000 1140000>; opp-microvolt = <1140000 905000 1140000>;
opp-supported-hw = <0x10>; opp-supported-hw = <0x1>;
clock-latency-ns = <200000>; clock-latency-ns = <200000>;
}; };
}; };
......
This diff is collapsed.
...@@ -195,14 +195,18 @@ void opp_debug_register(struct opp_device *opp_dev, struct opp_table *opp_table) ...@@ -195,14 +195,18 @@ void opp_debug_register(struct opp_device *opp_dev, struct opp_table *opp_table)
static void opp_migrate_dentry(struct opp_device *opp_dev, static void opp_migrate_dentry(struct opp_device *opp_dev,
struct opp_table *opp_table) struct opp_table *opp_table)
{ {
struct opp_device *new_dev; struct opp_device *new_dev = NULL, *iter;
const struct device *dev; const struct device *dev;
struct dentry *dentry; struct dentry *dentry;
/* Look for next opp-dev */ /* Look for next opp-dev */
list_for_each_entry(new_dev, &opp_table->dev_list, node) list_for_each_entry(iter, &opp_table->dev_list, node)
if (new_dev != opp_dev) if (iter != opp_dev) {
new_dev = iter;
break; break;
}
BUG_ON(!new_dev);
/* new_dev is guaranteed to be valid here */ /* new_dev is guaranteed to be valid here */
dev = new_dev->dev; dev = new_dev->dev;
......
...@@ -437,11 +437,11 @@ static int _bandwidth_supported(struct device *dev, struct opp_table *opp_table) ...@@ -437,11 +437,11 @@ static int _bandwidth_supported(struct device *dev, struct opp_table *opp_table)
/* Checking only first OPP is sufficient */ /* Checking only first OPP is sufficient */
np = of_get_next_available_child(opp_np, NULL); np = of_get_next_available_child(opp_np, NULL);
of_node_put(opp_np);
if (!np) { if (!np) {
dev_err(dev, "OPP table empty\n"); dev_err(dev, "OPP table empty\n");
return -EINVAL; return -EINVAL;
} }
of_node_put(opp_np);
prop = of_find_property(np, "opp-peak-kBps", NULL); prop = of_find_property(np, "opp-peak-kBps", NULL);
of_node_put(np); of_node_put(np);
......
...@@ -117,18 +117,25 @@ unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev); ...@@ -117,18 +117,25 @@ unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
unsigned long freq, unsigned long freq,
bool available); bool available);
struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
unsigned int level);
struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
unsigned int *level);
struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
unsigned long *freq); unsigned long *freq);
struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev, struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
unsigned long u_volt); unsigned long u_volt);
struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
unsigned int level);
struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
unsigned int *level);
struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
unsigned long *freq); unsigned long *freq);
struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
unsigned int *bw, int index);
struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
unsigned int *bw, int index);
void dev_pm_opp_put(struct dev_pm_opp *opp); void dev_pm_opp_put(struct dev_pm_opp *opp);
int dev_pm_opp_add(struct device *dev, unsigned long freq, int dev_pm_opp_add(struct device *dev, unsigned long freq,
...@@ -243,12 +250,6 @@ static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev) ...@@ -243,12 +250,6 @@ static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
return 0; return 0;
} }
static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
unsigned long freq, bool available)
{
return ERR_PTR(-EOPNOTSUPP);
}
static inline struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev, static inline struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
unsigned int level) unsigned int level)
{ {
...@@ -261,6 +262,12 @@ static inline struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev, ...@@ -261,6 +262,12 @@ static inline struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
return ERR_PTR(-EOPNOTSUPP); return ERR_PTR(-EOPNOTSUPP);
} }
static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
unsigned long freq, bool available)
{
return ERR_PTR(-EOPNOTSUPP);
}
static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
unsigned long *freq) unsigned long *freq)
{ {
...@@ -279,6 +286,18 @@ static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, ...@@ -279,6 +286,18 @@ static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
return ERR_PTR(-EOPNOTSUPP); return ERR_PTR(-EOPNOTSUPP);
} }
static inline struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
unsigned int *bw, int index)
{
return ERR_PTR(-EOPNOTSUPP);
}
static inline struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
unsigned int *bw, int index)
{
return ERR_PTR(-EOPNOTSUPP);
}
static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {} static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
static inline int dev_pm_opp_add(struct device *dev, unsigned long freq, static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment