Skip to content

Commit c5eb92f

Browse files
committed
Merge branch 'cpufreq/arm/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm
Pull ARM cpufreq fixes for 5.18-rc6 from Viresh Kumar: "This fixes issues related to throttle IRQ for Qcom SoCs." * 'cpufreq/arm/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm: cpufreq: qcom-hw: Delay enabling throttle_irq cpufreq: Reintroduce ready() callback
2 parents cfb9244 + ef8ee1c commit c5eb92f

5 files changed

Lines changed: 22 additions & 1 deletion

File tree

Documentation/cpu-freq/cpu-drivers.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ And optionally
7575
.resume - A pointer to a per-policy resume function which is called
7676
with interrupts disabled and _before_ the governor is started again.
7777

78+
.ready - A pointer to a per-policy ready function which is called after
79+
the policy is fully initialized.
80+
7881
.attr - A pointer to a NULL-terminated list of "struct freq_attr" which
7982
allow to export values to sysfs.
8083

Documentation/translations/zh_CN/cpu-freq/cpu-drivers.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ CPUfreq核心层注册一个cpufreq_driver结构体。
8484
.resume - 一个指向per-policy恢复函数的指针,该函数在关中断且在调节器再一次启动前被
8585
调用。
8686

87+
.ready - 一个指向per-policy准备函数的指针,该函数在策略完全初始化之后被调用。
88+
8789
.attr - 一个指向NULL结尾的"struct freq_attr"列表的指针,该列表允许导出值到
8890
sysfs。
8991

drivers/cpufreq/cpufreq.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,6 +1518,10 @@ static int cpufreq_online(unsigned int cpu)
15181518

15191519
kobject_uevent(&policy->kobj, KOBJ_ADD);
15201520

1521+
/* Callback for handling stuff after policy is ready */
1522+
if (cpufreq_driver->ready)
1523+
cpufreq_driver->ready(policy);
1524+
15211525
if (cpufreq_thermal_control_enabled(cpufreq_driver))
15221526
policy->cdev = of_cpufreq_cooling_register(policy);
15231527

drivers/cpufreq/qcom-cpufreq-hw.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ static int qcom_cpufreq_hw_lmh_init(struct cpufreq_policy *policy, int index)
388388

389389
snprintf(data->irq_name, sizeof(data->irq_name), "dcvsh-irq-%u", policy->cpu);
390390
ret = request_threaded_irq(data->throttle_irq, NULL, qcom_lmh_dcvs_handle_irq,
391-
IRQF_ONESHOT, data->irq_name, data);
391+
IRQF_ONESHOT | IRQF_NO_AUTOEN, data->irq_name, data);
392392
if (ret) {
393393
dev_err(&pdev->dev, "Error registering %s: %d\n", data->irq_name, ret);
394394
return 0;
@@ -542,6 +542,14 @@ static int qcom_cpufreq_hw_cpu_exit(struct cpufreq_policy *policy)
542542
return 0;
543543
}
544544

545+
static void qcom_cpufreq_ready(struct cpufreq_policy *policy)
546+
{
547+
struct qcom_cpufreq_data *data = policy->driver_data;
548+
549+
if (data->throttle_irq >= 0)
550+
enable_irq(data->throttle_irq);
551+
}
552+
545553
static struct freq_attr *qcom_cpufreq_hw_attr[] = {
546554
&cpufreq_freq_attr_scaling_available_freqs,
547555
&cpufreq_freq_attr_scaling_boost_freqs,
@@ -561,6 +569,7 @@ static struct cpufreq_driver cpufreq_qcom_hw_driver = {
561569
.fast_switch = qcom_cpufreq_hw_fast_switch,
562570
.name = "qcom-cpufreq-hw",
563571
.attr = qcom_cpufreq_hw_attr,
572+
.ready = qcom_cpufreq_ready,
564573
};
565574

566575
static int qcom_cpufreq_hw_driver_probe(struct platform_device *pdev)

include/linux/cpufreq.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,9 @@ struct cpufreq_driver {
382382
int (*suspend)(struct cpufreq_policy *policy);
383383
int (*resume)(struct cpufreq_policy *policy);
384384

385+
/* Will be called after the driver is fully initialized */
386+
void (*ready)(struct cpufreq_policy *policy);
387+
385388
struct freq_attr **attr;
386389

387390
/* platform specific boost support code */

0 commit comments

Comments
 (0)