Skip to content

Commit 401e092

Browse files
storulfvireshk
authored andcommitted
PM: domains: Implement the ->set_performance_state() callback for genpd
To enable generic support for performance scaling for PM domains, let's implement the ->set_performance_state() callback for genpd. Beyond this change, users of the corresponding genpd specific API, dev_pm_genpd_set_performance_state() are encouraged to switch to the common dev_pm_domain_set_performance_state() API. Signed-off-by: Ulf Hansson <[email protected]> Acked-by: Rafael J. Wysocki <[email protected]> Signed-off-by: Viresh Kumar <[email protected]>
1 parent 3fbc5c3 commit 401e092

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

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)