Skip to content

Commit 067e613

Browse files
committed
Merge tag 'opp-updates-6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm
Merge OPP (operating performance points) updates for 6.7 from Viresh Kumar: "- Extend support for the opp-level beyond required-opps (Ulf Hansson). - Add dev_pm_opp_find_level_floor() (Krishna chaitanya chundru). - dt-bindings: Allow opp-peak-kBpsfor kryo CPUs, support Qualcomm Krait SoCs and document named opp-microvolt property (Bjorn Andersson, Dmitry Baryshkov and Christian Marangi). - Fix -Wunsequenced warning (Nathan Chancellor). - General cleanup (Viresh Kumar)." * tag 'opp-updates-6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm: dt-bindings: opp: opp-v2-kryo-cpu: Document named opp-microvolt property OPP: No need to defer probe from _opp_attach_genpd() OPP: Remove genpd_virt_dev_lock OPP: Reorder code in _opp_set_required_opps_genpd() OPP: Add _link_required_opps() to avoid code duplication OPP: Fix formatting of if/else block dt-bindings: opp: opp-v2-kryo-cpu: support Qualcomm Krait SoCs OPP: Fix -Wunsequenced in _of_add_opp_table_v1() dt-bindings: opp: opp-v2-kryo-cpu: Allow opp-peak-kBps OPP: debugfs: Fix warning with W=1 builds OPP: Remove doc style comments for internal routines OPP: Add dev_pm_opp_find_level_floor() OPP: Extend support for the opp-level beyond required-opps OPP: Switch to use dev_pm_domain_set_performance_state() OPP: Extend dev_pm_opp_data with a level OPP: Add dev_pm_opp_add_dynamic() to allow more flexibility PM: domains: Implement the ->set_performance_state() callback for genpd PM: domains: Introduce dev_pm_domain_set_performance_state()
2 parents 05d3ef8 + 35e0964 commit 067e613

File tree

10 files changed

+254
-195
lines changed

10 files changed

+254
-195
lines changed

Documentation/devicetree/bindings/opp/opp-v2-kryo-cpu.yaml

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ description: |
2626
2727
properties:
2828
compatible:
29-
const: operating-points-v2-kryo-cpu
29+
enum:
30+
- operating-points-v2-krait-cpu
31+
- operating-points-v2-kryo-cpu
3032

3133
nvmem-cells:
3234
description: |
@@ -47,6 +49,8 @@ patternProperties:
4749

4850
opp-microvolt: true
4951

52+
opp-peak-kBps: true
53+
5054
opp-supported-hw:
5155
description: |
5256
A single 32 bit bitmap value, representing compatible HW.
@@ -63,14 +67,22 @@ patternProperties:
6367
5: MSM8996SG, speedbin 1
6468
6: MSM8996SG, speedbin 2
6569
7-31: unused
66-
enum: [0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
67-
0x9, 0xd, 0xe, 0xf,
68-
0x10, 0x20, 0x30, 0x70]
70+
71+
Bitmap for IPQ806x SoC:
72+
0: IPQ8062
73+
1: IPQ8064/IPQ8066/IPQ8068
74+
2: IPQ8065/IPQ8069
75+
3-31: unused
76+
77+
Other platforms use bits directly corresponding to speedbin index.
6978
7079
clock-latency-ns: true
7180

7281
required-opps: true
7382

83+
patternProperties:
84+
'^opp-microvolt-speed[0-9]+-pvs[0-9]+$': true
85+
7486
required:
7587
- opp-hz
7688

@@ -256,6 +268,22 @@ examples:
256268
};
257269
};
258270
271+
/* Dummy opp table to give example for named opp-microvolt */
272+
opp-table-2 {
273+
compatible = "operating-points-v2-krait-cpu";
274+
nvmem-cells = <&speedbin_efuse>;
275+
276+
opp-384000000 {
277+
opp-hz = /bits/ 64 <384000000>;
278+
opp-microvolt-speed0-pvs0 = <1000000 950000 1050000>;
279+
opp-microvolt-speed0-pvs1 = <925000 878750 971250>;
280+
opp-microvolt-speed0-pvs2 = <875000 831250 918750>;
281+
opp-microvolt-speed0-pvs3 = <800000 760000 840000>;
282+
opp-supported-hw = <0x7>;
283+
clock-latency-ns = <100000>;
284+
};
285+
};
286+
259287
smem {
260288
compatible = "qcom,smem";
261289
memory-region = <&smem_mem>;

drivers/base/power/common.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,24 @@ void dev_pm_domain_set(struct device *dev, struct dev_pm_domain *pd)
228228
device_pm_check_callbacks(dev);
229229
}
230230
EXPORT_SYMBOL_GPL(dev_pm_domain_set);
231+
232+
/**
233+
* dev_pm_domain_set_performance_state - Request a new performance state.
234+
* @dev: The device to make the request for.
235+
* @state: Target performance state for the device.
236+
*
237+
* This function should be called when a new performance state needs to be
238+
* requested for a device that is attached to a PM domain. Note that, the
239+
* support for performance scaling for PM domains is optional.
240+
*
241+
* Returns 0 on success and when performance scaling isn't supported, negative
242+
* error code on failure.
243+
*/
244+
int dev_pm_domain_set_performance_state(struct device *dev, unsigned int state)
245+
{
246+
if (dev->pm_domain && dev->pm_domain->set_performance_state)
247+
return dev->pm_domain->set_performance_state(dev, state);
248+
249+
return 0;
250+
}
251+
EXPORT_SYMBOL_GPL(dev_pm_domain_set_performance_state);

drivers/base/power/domain.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,25 @@ static void genpd_restore_performance_state(struct device *dev,
419419
genpd_set_performance_state(dev, state);
420420
}
421421

422+
static int genpd_dev_pm_set_performance_state(struct device *dev,
423+
unsigned int state)
424+
{
425+
struct generic_pm_domain *genpd = dev_to_genpd(dev);
426+
int ret = 0;
427+
428+
genpd_lock(genpd);
429+
if (pm_runtime_suspended(dev)) {
430+
dev_gpd_data(dev)->rpm_pstate = state;
431+
} else {
432+
ret = genpd_set_performance_state(dev, state);
433+
if (!ret)
434+
dev_gpd_data(dev)->rpm_pstate = 0;
435+
}
436+
genpd_unlock(genpd);
437+
438+
return ret;
439+
}
440+
422441
/**
423442
* dev_pm_genpd_set_performance_state- Set performance state of device's power
424443
* domain.
@@ -437,7 +456,6 @@ static void genpd_restore_performance_state(struct device *dev,
437456
int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state)
438457
{
439458
struct generic_pm_domain *genpd;
440-
int ret = 0;
441459

442460
genpd = dev_to_genpd_safe(dev);
443461
if (!genpd)
@@ -447,17 +465,7 @@ int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state)
447465
!dev->power.subsys_data->domain_data))
448466
return -EINVAL;
449467

450-
genpd_lock(genpd);
451-
if (pm_runtime_suspended(dev)) {
452-
dev_gpd_data(dev)->rpm_pstate = state;
453-
} else {
454-
ret = genpd_set_performance_state(dev, state);
455-
if (!ret)
456-
dev_gpd_data(dev)->rpm_pstate = 0;
457-
}
458-
genpd_unlock(genpd);
459-
460-
return ret;
468+
return genpd_dev_pm_set_performance_state(dev, state);
461469
}
462470
EXPORT_SYMBOL_GPL(dev_pm_genpd_set_performance_state);
463471

@@ -2079,6 +2087,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
20792087
genpd->domain.ops.restore_noirq = genpd_restore_noirq;
20802088
genpd->domain.ops.complete = genpd_complete;
20812089
genpd->domain.start = genpd_dev_pm_start;
2090+
genpd->domain.set_performance_state = genpd_dev_pm_set_performance_state;
20822091

20832092
if (genpd->flags & GENPD_FLAG_PM_CLK) {
20842093
genpd->dev_ops.stop = pm_clk_suspend;

0 commit comments

Comments
 (0)