Skip to content

Commit 9ee7827

Browse files
committed
Merge tag 'pm-5.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management fixes from Rafael Wysocki: "These fix some issues in cpufreq drivers and some issues in devfreq: - Fix error code path issues related PROBE_DEFER handling in devfreq (Christian Marangi) - Revert an editing accident in SPDX-License line in the devfreq passive governor (Lukas Bulwahn) - Fix refcount leak in of_get_devfreq_events() in the exynos-ppmu devfreq driver (Miaoqian Lin) - Use HZ_PER_KHZ macro in the passive devfreq governor (Yicong Yang) - Fix missing of_node_put for qoriq and pmac32 driver (Liang He) - Fix issues around throttle interrupt for qcom driver (Stephen Boyd) - Add MT8186 to cpufreq-dt-platdev blocklist (AngeloGioacchino Del Regno) - Make amd-pstate enable CPPC on resume from S3 (Jinzhou Su)" * tag 'pm-5.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: PM / devfreq: passive: revert an editing accident in SPDX-License line PM / devfreq: Fix kernel warning with cpufreq passive register fail PM / devfreq: Rework freq_table to be local to devfreq struct PM / devfreq: exynos-ppmu: Fix refcount leak in of_get_devfreq_events PM / devfreq: passive: Use HZ_PER_KHZ macro in units.h PM / devfreq: Fix cpufreq passive unregister erroring on PROBE_DEFER PM / devfreq: Mute warning on governor PROBE_DEFER PM / devfreq: Fix kernel panic with cpu based scaling to passive gov cpufreq: Add MT8186 to cpufreq-dt-platdev blocklist cpufreq: pmac32-cpufreq: Fix refcount leak bug cpufreq: qcom-hw: Don't do lmh things without a throttle interrupt drivers: cpufreq: Add missing of_node_put() in qoriq-cpufreq.c cpufreq: amd-pstate: Add resume and suspend callbacks
2 parents b336ad5 + bc62158 commit 9ee7827

File tree

9 files changed

+111
-76
lines changed

9 files changed

+111
-76
lines changed

drivers/cpufreq/amd-pstate.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,28 @@ static int amd_pstate_cpu_exit(struct cpufreq_policy *policy)
566566
return 0;
567567
}
568568

569+
static int amd_pstate_cpu_resume(struct cpufreq_policy *policy)
570+
{
571+
int ret;
572+
573+
ret = amd_pstate_enable(true);
574+
if (ret)
575+
pr_err("failed to enable amd-pstate during resume, return %d\n", ret);
576+
577+
return ret;
578+
}
579+
580+
static int amd_pstate_cpu_suspend(struct cpufreq_policy *policy)
581+
{
582+
int ret;
583+
584+
ret = amd_pstate_enable(false);
585+
if (ret)
586+
pr_err("failed to disable amd-pstate during suspend, return %d\n", ret);
587+
588+
return ret;
589+
}
590+
569591
/* Sysfs attributes */
570592

571593
/*
@@ -636,6 +658,8 @@ static struct cpufreq_driver amd_pstate_driver = {
636658
.target = amd_pstate_target,
637659
.init = amd_pstate_cpu_init,
638660
.exit = amd_pstate_cpu_exit,
661+
.suspend = amd_pstate_cpu_suspend,
662+
.resume = amd_pstate_cpu_resume,
639663
.set_boost = amd_pstate_set_boost,
640664
.name = "amd-pstate",
641665
.attr = amd_pstate_attr,

drivers/cpufreq/cpufreq-dt-platdev.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ static const struct of_device_id blocklist[] __initconst = {
127127
{ .compatible = "mediatek,mt8173", },
128128
{ .compatible = "mediatek,mt8176", },
129129
{ .compatible = "mediatek,mt8183", },
130+
{ .compatible = "mediatek,mt8186", },
130131
{ .compatible = "mediatek,mt8365", },
131132
{ .compatible = "mediatek,mt8516", },
132133

drivers/cpufreq/pmac32-cpufreq.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,10 @@ static int pmac_cpufreq_init_MacRISC3(struct device_node *cpunode)
470470
if (slew_done_gpio_np)
471471
slew_done_gpio = read_gpio(slew_done_gpio_np);
472472

473+
of_node_put(volt_gpio_np);
474+
of_node_put(freq_gpio_np);
475+
of_node_put(slew_done_gpio_np);
476+
473477
/* If we use the frequency GPIOs, calculate the min/max speeds based
474478
* on the bus frequencies
475479
*/

drivers/cpufreq/qcom-cpufreq-hw.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,9 @@ static int qcom_cpufreq_hw_cpu_online(struct cpufreq_policy *policy)
442442
struct platform_device *pdev = cpufreq_get_driver_data();
443443
int ret;
444444

445+
if (data->throttle_irq <= 0)
446+
return 0;
447+
445448
ret = irq_set_affinity_hint(data->throttle_irq, policy->cpus);
446449
if (ret)
447450
dev_err(&pdev->dev, "Failed to set CPU affinity of %s[%d]\n",
@@ -469,6 +472,9 @@ static int qcom_cpufreq_hw_cpu_offline(struct cpufreq_policy *policy)
469472

470473
static void qcom_cpufreq_hw_lmh_exit(struct qcom_cpufreq_data *data)
471474
{
475+
if (data->throttle_irq <= 0)
476+
return;
477+
472478
free_irq(data->throttle_irq, data);
473479
}
474480

drivers/cpufreq/qoriq-cpufreq.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ static int qoriq_cpufreq_probe(struct platform_device *pdev)
275275

276276
np = of_find_matching_node(NULL, qoriq_cpufreq_blacklist);
277277
if (np) {
278+
of_node_put(np);
278279
dev_info(&pdev->dev, "Disabling due to erratum A-008083");
279280
return -ENODEV;
280281
}

drivers/devfreq/devfreq.c

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ void devfreq_get_freq_range(struct devfreq *devfreq,
123123
unsigned long *min_freq,
124124
unsigned long *max_freq)
125125
{
126-
unsigned long *freq_table = devfreq->profile->freq_table;
126+
unsigned long *freq_table = devfreq->freq_table;
127127
s32 qos_min_freq, qos_max_freq;
128128

129129
lockdep_assert_held(&devfreq->lock);
@@ -133,11 +133,11 @@ void devfreq_get_freq_range(struct devfreq *devfreq,
133133
* The devfreq drivers can initialize this in either ascending or
134134
* descending order and devfreq core supports both.
135135
*/
136-
if (freq_table[0] < freq_table[devfreq->profile->max_state - 1]) {
136+
if (freq_table[0] < freq_table[devfreq->max_state - 1]) {
137137
*min_freq = freq_table[0];
138-
*max_freq = freq_table[devfreq->profile->max_state - 1];
138+
*max_freq = freq_table[devfreq->max_state - 1];
139139
} else {
140-
*min_freq = freq_table[devfreq->profile->max_state - 1];
140+
*min_freq = freq_table[devfreq->max_state - 1];
141141
*max_freq = freq_table[0];
142142
}
143143

@@ -169,16 +169,15 @@ static int devfreq_get_freq_level(struct devfreq *devfreq, unsigned long freq)
169169
{
170170
int lev;
171171

172-
for (lev = 0; lev < devfreq->profile->max_state; lev++)
173-
if (freq == devfreq->profile->freq_table[lev])
172+
for (lev = 0; lev < devfreq->max_state; lev++)
173+
if (freq == devfreq->freq_table[lev])
174174
return lev;
175175

176176
return -EINVAL;
177177
}
178178

179179
static int set_freq_table(struct devfreq *devfreq)
180180
{
181-
struct devfreq_dev_profile *profile = devfreq->profile;
182181
struct dev_pm_opp *opp;
183182
unsigned long freq;
184183
int i, count;
@@ -188,25 +187,22 @@ static int set_freq_table(struct devfreq *devfreq)
188187
if (count <= 0)
189188
return -EINVAL;
190189

191-
profile->max_state = count;
192-
profile->freq_table = devm_kcalloc(devfreq->dev.parent,
193-
profile->max_state,
194-
sizeof(*profile->freq_table),
195-
GFP_KERNEL);
196-
if (!profile->freq_table) {
197-
profile->max_state = 0;
190+
devfreq->max_state = count;
191+
devfreq->freq_table = devm_kcalloc(devfreq->dev.parent,
192+
devfreq->max_state,
193+
sizeof(*devfreq->freq_table),
194+
GFP_KERNEL);
195+
if (!devfreq->freq_table)
198196
return -ENOMEM;
199-
}
200197

201-
for (i = 0, freq = 0; i < profile->max_state; i++, freq++) {
198+
for (i = 0, freq = 0; i < devfreq->max_state; i++, freq++) {
202199
opp = dev_pm_opp_find_freq_ceil(devfreq->dev.parent, &freq);
203200
if (IS_ERR(opp)) {
204-
devm_kfree(devfreq->dev.parent, profile->freq_table);
205-
profile->max_state = 0;
201+
devm_kfree(devfreq->dev.parent, devfreq->freq_table);
206202
return PTR_ERR(opp);
207203
}
208204
dev_pm_opp_put(opp);
209-
profile->freq_table[i] = freq;
205+
devfreq->freq_table[i] = freq;
210206
}
211207

212208
return 0;
@@ -246,7 +242,7 @@ int devfreq_update_status(struct devfreq *devfreq, unsigned long freq)
246242

247243
if (lev != prev_lev) {
248244
devfreq->stats.trans_table[
249-
(prev_lev * devfreq->profile->max_state) + lev]++;
245+
(prev_lev * devfreq->max_state) + lev]++;
250246
devfreq->stats.total_trans++;
251247
}
252248

@@ -835,6 +831,9 @@ struct devfreq *devfreq_add_device(struct device *dev,
835831
if (err < 0)
836832
goto err_dev;
837833
mutex_lock(&devfreq->lock);
834+
} else {
835+
devfreq->freq_table = devfreq->profile->freq_table;
836+
devfreq->max_state = devfreq->profile->max_state;
838837
}
839838

840839
devfreq->scaling_min_freq = find_available_min_freq(devfreq);
@@ -870,8 +869,8 @@ struct devfreq *devfreq_add_device(struct device *dev,
870869

871870
devfreq->stats.trans_table = devm_kzalloc(&devfreq->dev,
872871
array3_size(sizeof(unsigned int),
873-
devfreq->profile->max_state,
874-
devfreq->profile->max_state),
872+
devfreq->max_state,
873+
devfreq->max_state),
875874
GFP_KERNEL);
876875
if (!devfreq->stats.trans_table) {
877876
mutex_unlock(&devfreq->lock);
@@ -880,7 +879,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
880879
}
881880

882881
devfreq->stats.time_in_state = devm_kcalloc(&devfreq->dev,
883-
devfreq->profile->max_state,
882+
devfreq->max_state,
884883
sizeof(*devfreq->stats.time_in_state),
885884
GFP_KERNEL);
886885
if (!devfreq->stats.time_in_state) {
@@ -932,8 +931,9 @@ struct devfreq *devfreq_add_device(struct device *dev,
932931
err = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_START,
933932
NULL);
934933
if (err) {
935-
dev_err(dev, "%s: Unable to start governor for the device\n",
936-
__func__);
934+
dev_err_probe(dev, err,
935+
"%s: Unable to start governor for the device\n",
936+
__func__);
937937
goto err_init;
938938
}
939939
create_sysfs_files(devfreq, devfreq->governor);
@@ -1665,9 +1665,9 @@ static ssize_t available_frequencies_show(struct device *d,
16651665

16661666
mutex_lock(&df->lock);
16671667

1668-
for (i = 0; i < df->profile->max_state; i++)
1668+
for (i = 0; i < df->max_state; i++)
16691669
count += scnprintf(&buf[count], (PAGE_SIZE - count - 2),
1670-
"%lu ", df->profile->freq_table[i]);
1670+
"%lu ", df->freq_table[i]);
16711671

16721672
mutex_unlock(&df->lock);
16731673
/* Truncate the trailing space */
@@ -1690,7 +1690,7 @@ static ssize_t trans_stat_show(struct device *dev,
16901690

16911691
if (!df->profile)
16921692
return -EINVAL;
1693-
max_state = df->profile->max_state;
1693+
max_state = df->max_state;
16941694

16951695
if (max_state == 0)
16961696
return sprintf(buf, "Not Supported.\n");
@@ -1707,19 +1707,17 @@ static ssize_t trans_stat_show(struct device *dev,
17071707
len += sprintf(buf + len, " :");
17081708
for (i = 0; i < max_state; i++)
17091709
len += sprintf(buf + len, "%10lu",
1710-
df->profile->freq_table[i]);
1710+
df->freq_table[i]);
17111711

17121712
len += sprintf(buf + len, " time(ms)\n");
17131713

17141714
for (i = 0; i < max_state; i++) {
1715-
if (df->profile->freq_table[i]
1716-
== df->previous_freq) {
1715+
if (df->freq_table[i] == df->previous_freq)
17171716
len += sprintf(buf + len, "*");
1718-
} else {
1717+
else
17191718
len += sprintf(buf + len, " ");
1720-
}
1721-
len += sprintf(buf + len, "%10lu:",
1722-
df->profile->freq_table[i]);
1719+
1720+
len += sprintf(buf + len, "%10lu:", df->freq_table[i]);
17231721
for (j = 0; j < max_state; j++)
17241722
len += sprintf(buf + len, "%10u",
17251723
df->stats.trans_table[(i * max_state) + j]);
@@ -1743,19 +1741,19 @@ static ssize_t trans_stat_store(struct device *dev,
17431741
if (!df->profile)
17441742
return -EINVAL;
17451743

1746-
if (df->profile->max_state == 0)
1744+
if (df->max_state == 0)
17471745
return count;
17481746

17491747
err = kstrtoint(buf, 10, &value);
17501748
if (err || value != 0)
17511749
return -EINVAL;
17521750

17531751
mutex_lock(&df->lock);
1754-
memset(df->stats.time_in_state, 0, (df->profile->max_state *
1752+
memset(df->stats.time_in_state, 0, (df->max_state *
17551753
sizeof(*df->stats.time_in_state)));
17561754
memset(df->stats.trans_table, 0, array3_size(sizeof(unsigned int),
1757-
df->profile->max_state,
1758-
df->profile->max_state));
1755+
df->max_state,
1756+
df->max_state));
17591757
df->stats.total_trans = 0;
17601758
df->stats.last_update = get_jiffies_64();
17611759
mutex_unlock(&df->lock);

drivers/devfreq/event/exynos-ppmu.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,15 +519,19 @@ static int of_get_devfreq_events(struct device_node *np,
519519

520520
count = of_get_child_count(events_np);
521521
desc = devm_kcalloc(dev, count, sizeof(*desc), GFP_KERNEL);
522-
if (!desc)
522+
if (!desc) {
523+
of_node_put(events_np);
523524
return -ENOMEM;
525+
}
524526
info->num_events = count;
525527

526528
of_id = of_match_device(exynos_ppmu_id_match, dev);
527529
if (of_id)
528530
info->ppmu_type = (enum exynos_ppmu_type)of_id->data;
529-
else
531+
else {
532+
of_node_put(events_np);
530533
return -EINVAL;
534+
}
531535

532536
j = 0;
533537
for_each_child_of_node(events_np, node) {

0 commit comments

Comments
 (0)