summaryrefslogtreecommitdiff
path: root/drivers/cpufreq
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r--drivers/cpufreq/Kconfig.arm5
-rw-r--r--drivers/cpufreq/Makefile1
-rw-r--r--drivers/cpufreq/acpi-cpufreq.c5
-rw-r--r--drivers/cpufreq/amd-pstate.c17
-rw-r--r--drivers/cpufreq/apple-soc-cpufreq.c2
-rw-r--r--drivers/cpufreq/armada-37xx-cpufreq.c3
-rw-r--r--drivers/cpufreq/armada-8k-cpufreq.c2
-rw-r--r--drivers/cpufreq/bmips-cpufreq.c2
-rw-r--r--drivers/cpufreq/cppc_cpufreq.c166
-rw-r--r--drivers/cpufreq/cpufreq-dt-platdev.c6
-rw-r--r--drivers/cpufreq/cpufreq.c21
-rw-r--r--drivers/cpufreq/cpufreq_conservative.c4
-rw-r--r--drivers/cpufreq/cpufreq_governor.c2
-rw-r--r--drivers/cpufreq/cpufreq_ondemand.c11
-rw-r--r--drivers/cpufreq/cpufreq_stats.c2
-rw-r--r--drivers/cpufreq/cpufreq_userspace.c6
-rw-r--r--drivers/cpufreq/e_powersaver.c6
-rw-r--r--drivers/cpufreq/gx-suspmod.c2
-rw-r--r--drivers/cpufreq/intel_pstate.c6
-rw-r--r--drivers/cpufreq/longhaul.c3
-rw-r--r--drivers/cpufreq/omap-cpufreq.c195
-rw-r--r--drivers/cpufreq/powernow-k7.c2
-rw-r--r--drivers/cpufreq/powernow-k8.c2
-rw-r--r--drivers/cpufreq/powernv-cpufreq.c8
-rw-r--r--drivers/cpufreq/pxa3xx-cpufreq.c2
-rw-r--r--drivers/cpufreq/qcom-cpufreq-hw.c2
-rw-r--r--drivers/cpufreq/qcom-cpufreq-nvmem.c1
-rw-r--r--drivers/cpufreq/qoriq-cpufreq.c6
-rw-r--r--drivers/cpufreq/rcpufreq_dt.rs5
-rw-r--r--drivers/cpufreq/s5pv210-cpufreq.c10
-rw-r--r--drivers/cpufreq/scmi-cpufreq.c5
-rw-r--r--drivers/cpufreq/scpi-cpufreq.c2
-rw-r--r--drivers/cpufreq/sparc-us2e-cpufreq.c3
-rw-r--r--drivers/cpufreq/sparc-us3-cpufreq.c3
-rw-r--r--drivers/cpufreq/spear-cpufreq.c2
-rw-r--r--drivers/cpufreq/sun50i-cpufreq-nvmem.c3
-rw-r--r--drivers/cpufreq/tegra186-cpufreq.c2
-rw-r--r--drivers/cpufreq/tegra194-cpufreq.c2
-rw-r--r--drivers/cpufreq/ti-cpufreq.c34
-rw-r--r--drivers/cpufreq/vexpress-spc-cpufreq.c2
-rw-r--r--drivers/cpufreq/virtual-cpufreq.c2
41 files changed, 211 insertions, 354 deletions
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 9be0503df55a..4014bc9dd73a 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -141,11 +141,6 @@ config ARM_MEDIATEK_CPUFREQ_HW
The driver implements the cpufreq interface for this HW engine.
Say Y if you want to support CPUFreq HW.
-config ARM_OMAP2PLUS_CPUFREQ
- bool "TI OMAP2+"
- depends on ARCH_OMAP2PLUS || COMPILE_TEST
- default ARCH_OMAP2PLUS
-
config ARM_QCOM_CPUFREQ_NVMEM
tristate "Qualcomm nvmem based CPUFreq"
depends on ARCH_QCOM || COMPILE_TEST
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 681d687b5a18..385c9fcc65c6 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -69,7 +69,6 @@ obj-$(CONFIG_ARM_KIRKWOOD_CPUFREQ) += kirkwood-cpufreq.o
obj-$(CONFIG_ARM_MEDIATEK_CPUFREQ) += mediatek-cpufreq.o
obj-$(CONFIG_ARM_MEDIATEK_CPUFREQ_HW) += mediatek-cpufreq-hw.o
obj-$(CONFIG_MACH_MVEBU_V7) += mvebu-cpufreq.o
-obj-$(CONFIG_ARM_OMAP2PLUS_CPUFREQ) += omap-cpufreq.o
obj-$(CONFIG_ARM_PXA2xx_CPUFREQ) += pxa2xx-cpufreq.o
obj-$(CONFIG_PXA3xx) += pxa3xx-cpufreq.o
obj-$(CONFIG_ARM_QCOM_CPUFREQ_HW) += qcom-cpufreq-hw.o
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index e73a66785d69..e7eff6c2f092 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -700,7 +700,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
return blacklisted;
#endif
- data = kzalloc(sizeof(*data), GFP_KERNEL);
+ data = kzalloc_obj(*data);
if (!data)
return -ENOMEM;
@@ -798,8 +798,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
goto err_unreg;
}
- freq_table = kcalloc(perf->state_count + 1, sizeof(*freq_table),
- GFP_KERNEL);
+ freq_table = kzalloc_objs(*freq_table, perf->state_count + 1);
if (!freq_table) {
result = -ENOMEM;
goto err_unreg;
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index c45bc98721d2..5aa9fcd80cf5 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -636,6 +636,19 @@ static void amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
WRITE_ONCE(cpudata->max_limit_freq, policy->max);
if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE) {
+ /*
+ * For performance policy, set MinPerf to nominal_perf rather than
+ * highest_perf or lowest_nonlinear_perf.
+ *
+ * Per commit 0c411b39e4f4c, using highest_perf was observed
+ * to cause frequency throttling on power-limited platforms, leading to
+ * performance regressions. Using lowest_nonlinear_perf would limit
+ * performance too much for HPC workloads requiring high frequency
+ * operation and minimal wakeup latency from idle states.
+ *
+ * nominal_perf therefore provides a balance by avoiding throttling
+ * while still maintaining enough performance for HPC workloads.
+ */
perf.min_limit_perf = min(perf.nominal_perf, perf.max_limit_perf);
WRITE_ONCE(cpudata->min_limit_freq, min(cpudata->nominal_freq, cpudata->max_limit_freq));
} else {
@@ -980,7 +993,7 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
if (!dev)
return -ENODEV;
- cpudata = kzalloc(sizeof(*cpudata), GFP_KERNEL);
+ cpudata = kzalloc_obj(*cpudata);
if (!cpudata)
return -ENOMEM;
@@ -1465,7 +1478,7 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
if (!dev)
return -ENODEV;
- cpudata = kzalloc(sizeof(*cpudata), GFP_KERNEL);
+ cpudata = kzalloc_obj(*cpudata);
if (!cpudata)
return -ENOMEM;
diff --git a/drivers/cpufreq/apple-soc-cpufreq.c b/drivers/cpufreq/apple-soc-cpufreq.c
index b1d29b7af232..9396034167e5 100644
--- a/drivers/cpufreq/apple-soc-cpufreq.c
+++ b/drivers/cpufreq/apple-soc-cpufreq.c
@@ -276,7 +276,7 @@ static int apple_soc_cpufreq_init(struct cpufreq_policy *policy)
goto out_free_opp;
}
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ priv = kzalloc_obj(*priv);
if (!priv) {
ret = -ENOMEM;
goto out_free_opp;
diff --git a/drivers/cpufreq/armada-37xx-cpufreq.c b/drivers/cpufreq/armada-37xx-cpufreq.c
index 0efe403a5980..1ec54fc4c2ba 100644
--- a/drivers/cpufreq/armada-37xx-cpufreq.c
+++ b/drivers/cpufreq/armada-37xx-cpufreq.c
@@ -467,8 +467,7 @@ static int __init armada37xx_cpufreq_driver_init(void)
return -EINVAL;
}
- armada37xx_cpufreq_state = kmalloc(sizeof(*armada37xx_cpufreq_state),
- GFP_KERNEL);
+ armada37xx_cpufreq_state = kmalloc_obj(*armada37xx_cpufreq_state);
if (!armada37xx_cpufreq_state) {
clk_put(clk);
return -ENOMEM;
diff --git a/drivers/cpufreq/armada-8k-cpufreq.c b/drivers/cpufreq/armada-8k-cpufreq.c
index d96c1718f7f8..9d55398f3797 100644
--- a/drivers/cpufreq/armada-8k-cpufreq.c
+++ b/drivers/cpufreq/armada-8k-cpufreq.c
@@ -143,7 +143,7 @@ static int __init armada_8k_cpufreq_init(void)
of_node_put(node);
nb_cpus = num_possible_cpus();
- freq_tables = kcalloc(nb_cpus, sizeof(*freq_tables), GFP_KERNEL);
+ freq_tables = kzalloc_objs(*freq_tables, nb_cpus);
if (!freq_tables)
return -ENOMEM;
cpumask_copy(&cpus, cpu_possible_mask);
diff --git a/drivers/cpufreq/bmips-cpufreq.c b/drivers/cpufreq/bmips-cpufreq.c
index 36051880640b..a8e35bc75fb2 100644
--- a/drivers/cpufreq/bmips-cpufreq.c
+++ b/drivers/cpufreq/bmips-cpufreq.c
@@ -71,7 +71,7 @@ bmips_cpufreq_get_freq_table(const struct cpufreq_policy *policy)
cpu_freq = htp_freq_to_cpu_freq(priv->clk_mult);
- table = kmalloc_array(priv->max_freqs + 1, sizeof(*table), GFP_KERNEL);
+ table = kmalloc_objs(*table, priv->max_freqs + 1);
if (!table)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
index 9eac77c4f294..011f35cb47b9 100644
--- a/drivers/cpufreq/cppc_cpufreq.c
+++ b/drivers/cpufreq/cppc_cpufreq.c
@@ -54,31 +54,24 @@ static int cppc_perf_from_fbctrs(struct cppc_perf_fb_ctrs *fb_ctrs_t0,
struct cppc_perf_fb_ctrs *fb_ctrs_t1);
/**
- * cppc_scale_freq_workfn - CPPC arch_freq_scale updater for frequency invariance
- * @work: The work item.
+ * __cppc_scale_freq_tick - CPPC arch_freq_scale updater for frequency invariance
+ * @cppc_fi: per-cpu CPPC FIE data.
*
- * The CPPC driver register itself with the topology core to provide its own
+ * The CPPC driver registers itself with the topology core to provide its own
* implementation (cppc_scale_freq_tick()) of topology_scale_freq_tick() which
* gets called by the scheduler on every tick.
*
* Note that the arch specific counters have higher priority than CPPC counters,
* if available, though the CPPC driver doesn't need to have any special
* handling for that.
- *
- * On an invocation of cppc_scale_freq_tick(), we schedule an irq work (since we
- * reach here from hard-irq context), which then schedules a normal work item
- * and cppc_scale_freq_workfn() updates the per_cpu arch_freq_scale variable
- * based on the counter updates since the last tick.
*/
-static void cppc_scale_freq_workfn(struct kthread_work *work)
+static void __cppc_scale_freq_tick(struct cppc_freq_invariance *cppc_fi)
{
- struct cppc_freq_invariance *cppc_fi;
struct cppc_perf_fb_ctrs fb_ctrs = {0};
struct cppc_cpudata *cpu_data;
unsigned long local_freq_scale;
u64 perf;
- cppc_fi = container_of(work, struct cppc_freq_invariance, work);
cpu_data = cppc_fi->cpu_data;
if (cppc_get_perf_ctrs(cppc_fi->cpu, &fb_ctrs)) {
@@ -102,6 +95,24 @@ static void cppc_scale_freq_workfn(struct kthread_work *work)
per_cpu(arch_freq_scale, cppc_fi->cpu) = local_freq_scale;
}
+static void cppc_scale_freq_tick(void)
+{
+ __cppc_scale_freq_tick(&per_cpu(cppc_freq_inv, smp_processor_id()));
+}
+
+static struct scale_freq_data cppc_sftd = {
+ .source = SCALE_FREQ_SOURCE_CPPC,
+ .set_freq_scale = cppc_scale_freq_tick,
+};
+
+static void cppc_scale_freq_workfn(struct kthread_work *work)
+{
+ struct cppc_freq_invariance *cppc_fi;
+
+ cppc_fi = container_of(work, struct cppc_freq_invariance, work);
+ __cppc_scale_freq_tick(cppc_fi);
+}
+
static void cppc_irq_work(struct irq_work *irq_work)
{
struct cppc_freq_invariance *cppc_fi;
@@ -110,7 +121,14 @@ static void cppc_irq_work(struct irq_work *irq_work)
kthread_queue_work(kworker_fie, &cppc_fi->work);
}
-static void cppc_scale_freq_tick(void)
+/*
+ * Reading perf counters may sleep if the CPC regs are in PCC. Thus, we
+ * schedule an irq work in scale_freq_tick (since we reach here from hard-irq
+ * context), which then schedules a normal work item cppc_scale_freq_workfn()
+ * that updates the per_cpu arch_freq_scale variable based on the counter
+ * updates since the last tick.
+ */
+static void cppc_scale_freq_tick_pcc(void)
{
struct cppc_freq_invariance *cppc_fi = &per_cpu(cppc_freq_inv, smp_processor_id());
@@ -121,13 +139,14 @@ static void cppc_scale_freq_tick(void)
irq_work_queue(&cppc_fi->irq_work);
}
-static struct scale_freq_data cppc_sftd = {
+static struct scale_freq_data cppc_sftd_pcc = {
.source = SCALE_FREQ_SOURCE_CPPC,
- .set_freq_scale = cppc_scale_freq_tick,
+ .set_freq_scale = cppc_scale_freq_tick_pcc,
};
static void cppc_cpufreq_cpu_fie_init(struct cpufreq_policy *policy)
{
+ struct scale_freq_data *sftd = &cppc_sftd;
struct cppc_freq_invariance *cppc_fi;
int cpu, ret;
@@ -138,8 +157,11 @@ static void cppc_cpufreq_cpu_fie_init(struct cpufreq_policy *policy)
cppc_fi = &per_cpu(cppc_freq_inv, cpu);
cppc_fi->cpu = cpu;
cppc_fi->cpu_data = policy->driver_data;
- kthread_init_work(&cppc_fi->work, cppc_scale_freq_workfn);
- init_irq_work(&cppc_fi->irq_work, cppc_irq_work);
+ if (cppc_perf_ctrs_in_pcc_cpu(cpu)) {
+ kthread_init_work(&cppc_fi->work, cppc_scale_freq_workfn);
+ init_irq_work(&cppc_fi->irq_work, cppc_irq_work);
+ sftd = &cppc_sftd_pcc;
+ }
ret = cppc_get_perf_ctrs(cpu, &cppc_fi->prev_perf_fb_ctrs);
@@ -155,7 +177,7 @@ static void cppc_cpufreq_cpu_fie_init(struct cpufreq_policy *policy)
}
/* Register for freq-invariance */
- topology_set_scale_freq_source(&cppc_sftd, policy->cpus);
+ topology_set_scale_freq_source(sftd, policy->cpus);
}
/*
@@ -178,13 +200,15 @@ static void cppc_cpufreq_cpu_fie_exit(struct cpufreq_policy *policy)
topology_clear_scale_freq_source(SCALE_FREQ_SOURCE_CPPC, policy->related_cpus);
for_each_cpu(cpu, policy->related_cpus) {
+ if (!cppc_perf_ctrs_in_pcc_cpu(cpu))
+ continue;
cppc_fi = &per_cpu(cppc_freq_inv, cpu);
irq_work_sync(&cppc_fi->irq_work);
kthread_cancel_work_sync(&cppc_fi->work);
}
}
-static void __init cppc_freq_invariance_init(void)
+static void cppc_fie_kworker_init(void)
{
struct sched_attr attr = {
.size = sizeof(struct sched_attr),
@@ -201,22 +225,12 @@ static void __init cppc_freq_invariance_init(void)
};
int ret;
- if (fie_disabled != FIE_ENABLED && fie_disabled != FIE_DISABLED) {
- fie_disabled = FIE_ENABLED;
- if (cppc_perf_ctrs_in_pcc()) {
- pr_info("FIE not enabled on systems with registers in PCC\n");
- fie_disabled = FIE_DISABLED;
- }
- }
-
- if (fie_disabled)
- return;
-
kworker_fie = kthread_run_worker(0, "cppc_fie");
if (IS_ERR(kworker_fie)) {
pr_warn("%s: failed to create kworker_fie: %ld\n", __func__,
PTR_ERR(kworker_fie));
fie_disabled = FIE_DISABLED;
+ kworker_fie = NULL;
return;
}
@@ -226,15 +240,33 @@ static void __init cppc_freq_invariance_init(void)
ret);
kthread_destroy_worker(kworker_fie);
fie_disabled = FIE_DISABLED;
+ kworker_fie = NULL;
}
}
-static void cppc_freq_invariance_exit(void)
+static void __init cppc_freq_invariance_init(void)
{
- if (fie_disabled)
+ bool perf_ctrs_in_pcc = cppc_perf_ctrs_in_pcc();
+
+ if (fie_disabled == FIE_UNSET) {
+ if (perf_ctrs_in_pcc) {
+ pr_info("FIE not enabled on systems with registers in PCC\n");
+ fie_disabled = FIE_DISABLED;
+ } else {
+ fie_disabled = FIE_ENABLED;
+ }
+ }
+
+ if (fie_disabled || !perf_ctrs_in_pcc)
return;
- kthread_destroy_worker(kworker_fie);
+ cppc_fie_kworker_init();
+}
+
+static void cppc_freq_invariance_exit(void)
+{
+ if (kworker_fie)
+ kthread_destroy_worker(kworker_fie);
}
#else
@@ -543,7 +575,7 @@ static struct cppc_cpudata *cppc_cpufreq_get_cpu_data(unsigned int cpu)
struct cppc_cpudata *cpu_data;
int ret;
- cpu_data = kzalloc(sizeof(struct cppc_cpudata), GFP_KERNEL);
+ cpu_data = kzalloc_obj(struct cppc_cpudata);
if (!cpu_data)
goto out;
@@ -831,14 +863,13 @@ static ssize_t store_auto_select(struct cpufreq_policy *policy,
return count;
}
-static ssize_t show_auto_act_window(struct cpufreq_policy *policy, char *buf)
+static ssize_t cppc_cpufreq_sysfs_show_u64(unsigned int cpu,
+ int (*get_func)(int, u64 *),
+ char *buf)
{
u64 val;
- int ret;
+ int ret = get_func((int)cpu, &val);
- ret = cppc_get_auto_act_window(policy->cpu, &val);
-
- /* show "<unsupported>" when this register is not supported by cpc */
if (ret == -EOPNOTSUPP)
return sysfs_emit(buf, "<unsupported>\n");
@@ -848,56 +879,39 @@ static ssize_t show_auto_act_window(struct cpufreq_policy *policy, char *buf)
return sysfs_emit(buf, "%llu\n", val);
}
-static ssize_t store_auto_act_window(struct cpufreq_policy *policy,
- const char *buf, size_t count)
+static ssize_t cppc_cpufreq_sysfs_store_u64(unsigned int cpu,
+ int (*set_func)(int, u64),
+ const char *buf, size_t count)
{
- u64 usec;
+ u64 val;
int ret;
- ret = kstrtou64(buf, 0, &usec);
+ ret = kstrtou64(buf, 0, &val);
if (ret)
return ret;
- ret = cppc_set_auto_act_window(policy->cpu, usec);
- if (ret)
- return ret;
+ ret = set_func((int)cpu, val);
- return count;
+ return ret ? ret : count;
}
-static ssize_t show_energy_performance_preference_val(struct cpufreq_policy *policy, char *buf)
-{
- u64 val;
- int ret;
-
- ret = cppc_get_epp_perf(policy->cpu, &val);
-
- /* show "<unsupported>" when this register is not supported by cpc */
- if (ret == -EOPNOTSUPP)
- return sysfs_emit(buf, "<unsupported>\n");
-
- if (ret)
- return ret;
-
- return sysfs_emit(buf, "%llu\n", val);
+#define CPPC_CPUFREQ_ATTR_RW_U64(_name, _get_func, _set_func) \
+static ssize_t show_##_name(struct cpufreq_policy *policy, char *buf) \
+{ \
+ return cppc_cpufreq_sysfs_show_u64(policy->cpu, _get_func, buf);\
+} \
+static ssize_t store_##_name(struct cpufreq_policy *policy, \
+ const char *buf, size_t count) \
+{ \
+ return cppc_cpufreq_sysfs_store_u64(policy->cpu, _set_func, \
+ buf, count); \
}
-static ssize_t store_energy_performance_preference_val(struct cpufreq_policy *policy,
- const char *buf, size_t count)
-{
- u64 val;
- int ret;
-
- ret = kstrtou64(buf, 0, &val);
- if (ret)
- return ret;
-
- ret = cppc_set_epp(policy->cpu, val);
- if (ret)
- return ret;
+CPPC_CPUFREQ_ATTR_RW_U64(auto_act_window, cppc_get_auto_act_window,
+ cppc_set_auto_act_window)
- return count;
-}
+CPPC_CPUFREQ_ATTR_RW_U64(energy_performance_preference_val,
+ cppc_get_epp_perf, cppc_set_epp)
cpufreq_freq_attr_ro(freqdomain_cpus);
cpufreq_freq_attr_rw(auto_select);
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c
index b06a43143d23..25fd3b191b7e 100644
--- a/drivers/cpufreq/cpufreq-dt-platdev.c
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c
@@ -147,6 +147,8 @@ static const struct of_device_id blocklist[] __initconst = {
{ .compatible = "nvidia,tegra30", },
{ .compatible = "nvidia,tegra114", },
{ .compatible = "nvidia,tegra124", },
+ { .compatible = "nvidia,tegra186", },
+ { .compatible = "nvidia,tegra194", },
{ .compatible = "nvidia,tegra210", },
{ .compatible = "nvidia,tegra234", },
@@ -169,8 +171,11 @@ static const struct of_device_id blocklist[] __initconst = {
{ .compatible = "qcom,sdm845", },
{ .compatible = "qcom,sdx75", },
{ .compatible = "qcom,sm6115", },
+ { .compatible = "qcom,sm6125", },
+ { .compatible = "qcom,sm6150", },
{ .compatible = "qcom,sm6350", },
{ .compatible = "qcom,sm6375", },
+ { .compatible = "qcom,sm7125", },
{ .compatible = "qcom,sm7225", },
{ .compatible = "qcom,sm7325", },
{ .compatible = "qcom,sm8150", },
@@ -191,6 +196,7 @@ static const struct of_device_id blocklist[] __initconst = {
{ .compatible = "ti,am625", },
{ .compatible = "ti,am62a7", },
{ .compatible = "ti,am62d2", },
+ { .compatible = "ti,am62l3", },
{ .compatible = "ti,am62p5", },
{ .compatible = "qcom,ipq5332", },
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 4472bb1ec83c..277884d91913 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -198,6 +198,12 @@ struct cpufreq_policy *cpufreq_cpu_get_raw(unsigned int cpu)
}
EXPORT_SYMBOL_GPL(cpufreq_cpu_get_raw);
+struct cpufreq_policy *cpufreq_cpu_policy(unsigned int cpu)
+{
+ return per_cpu(cpufreq_cpu_data, cpu);
+}
+EXPORT_SYMBOL_GPL(cpufreq_cpu_policy);
+
unsigned int cpufreq_generic_get(unsigned int cpu)
{
struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
@@ -1257,7 +1263,7 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu)
if (!dev)
return NULL;
- policy = kzalloc(sizeof(*policy), GFP_KERNEL);
+ policy = kzalloc_obj(*policy);
if (!policy)
return NULL;
@@ -2803,7 +2809,7 @@ static int cpufreq_boost_trigger_state(int state)
{
struct cpufreq_policy *policy;
unsigned long flags;
- int ret = 0;
+ int ret = -EOPNOTSUPP;
/*
* Don't compare 'cpufreq_driver->boost_enabled' with 'state' here to
@@ -2820,16 +2826,15 @@ static int cpufreq_boost_trigger_state(int state)
continue;
ret = policy_set_boost(policy, state);
- if (ret)
- goto err_reset_state;
+ if (unlikely(ret))
+ break;
}
- cpus_read_unlock();
-
- return 0;
-err_reset_state:
cpus_read_unlock();
+ if (likely(!ret))
+ return 0;
+
write_lock_irqsave(&cpufreq_driver_lock, flags);
cpufreq_driver->boost_enabled = !state;
write_unlock_irqrestore(&cpufreq_driver_lock, flags);
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
index cce6a8d113e1..e0e847764511 100644
--- a/drivers/cpufreq/cpufreq_conservative.c
+++ b/drivers/cpufreq/cpufreq_conservative.c
@@ -273,7 +273,7 @@ static struct policy_dbs_info *cs_alloc(void)
{
struct cs_policy_dbs_info *dbs_info;
- dbs_info = kzalloc(sizeof(*dbs_info), GFP_KERNEL);
+ dbs_info = kzalloc_obj(*dbs_info);
return dbs_info ? &dbs_info->policy_dbs : NULL;
}
@@ -286,7 +286,7 @@ static int cs_init(struct dbs_data *dbs_data)
{
struct cs_dbs_tuners *tuners;
- tuners = kzalloc(sizeof(*tuners), GFP_KERNEL);
+ tuners = kzalloc_obj(*tuners);
if (!tuners)
return -ENOMEM;
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
index 1a7fcaf39cc9..36eb7aee4bcd 100644
--- a/drivers/cpufreq/cpufreq_governor.c
+++ b/drivers/cpufreq/cpufreq_governor.c
@@ -429,7 +429,7 @@ int cpufreq_dbs_governor_init(struct cpufreq_policy *policy)
goto out;
}
- dbs_data = kzalloc(sizeof(*dbs_data), GFP_KERNEL);
+ dbs_data = kzalloc_obj(*dbs_data);
if (!dbs_data) {
ret = -ENOMEM;
goto free_policy_dbs_info;
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index a6ecc203f7b7..9942dbb38dae 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -322,7 +322,7 @@ static struct policy_dbs_info *od_alloc(void)
{
struct od_policy_dbs_info *dbs_info;
- dbs_info = kzalloc(sizeof(*dbs_info), GFP_KERNEL);
+ dbs_info = kzalloc_obj(*dbs_info);
return dbs_info ? &dbs_info->policy_dbs : NULL;
}
@@ -334,17 +334,12 @@ static void od_free(struct policy_dbs_info *policy_dbs)
static int od_init(struct dbs_data *dbs_data)
{
struct od_dbs_tuners *tuners;
- u64 idle_time;
- int cpu;
- tuners = kzalloc(sizeof(*tuners), GFP_KERNEL);
+ tuners = kzalloc_obj(*tuners);
if (!tuners)
return -ENOMEM;
- cpu = get_cpu();
- idle_time = get_cpu_idle_time_us(cpu, NULL);
- put_cpu();
- if (idle_time != -1ULL) {
+ if (tick_nohz_is_active()) {
/* Idle micro accounting is supported. Use finer thresholds */
dbs_data->up_threshold = MICRO_FREQUENCY_UP_THRESHOLD;
} else {
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
index 40a9ff18da06..670a10c3ecfa 100644
--- a/drivers/cpufreq/cpufreq_stats.c
+++ b/drivers/cpufreq/cpufreq_stats.c
@@ -222,7 +222,7 @@ void cpufreq_stats_create_table(struct cpufreq_policy *policy)
if (policy->stats)
return;
- stats = kzalloc(sizeof(*stats), GFP_KERNEL);
+ stats = kzalloc_obj(*stats);
if (!stats)
return;
diff --git a/drivers/cpufreq/cpufreq_userspace.c b/drivers/cpufreq/cpufreq_userspace.c
index 77d62152cd38..d738d31995f9 100644
--- a/drivers/cpufreq/cpufreq_userspace.c
+++ b/drivers/cpufreq/cpufreq_userspace.c
@@ -49,14 +49,16 @@ static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
static ssize_t show_speed(struct cpufreq_policy *policy, char *buf)
{
- return sprintf(buf, "%u\n", policy->cur);
+ struct userspace_policy *userspace = policy->governor_data;
+
+ return sprintf(buf, "%u\n", userspace->setspeed);
}
static int cpufreq_userspace_policy_init(struct cpufreq_policy *policy)
{
struct userspace_policy *userspace;
- userspace = kzalloc(sizeof(*userspace), GFP_KERNEL);
+ userspace = kzalloc_obj(*userspace);
if (!userspace)
return -ENOMEM;
diff --git a/drivers/cpufreq/e_powersaver.c b/drivers/cpufreq/e_powersaver.c
index 320a0af2266a..eb5a9209d828 100644
--- a/drivers/cpufreq/e_powersaver.c
+++ b/drivers/cpufreq/e_powersaver.c
@@ -55,8 +55,7 @@ static struct acpi_processor_performance *eps_acpi_cpu_perf;
/* Minimum necessary to get acpi_processor_get_bios_limit() working */
static int eps_acpi_init(void)
{
- eps_acpi_cpu_perf = kzalloc(sizeof(*eps_acpi_cpu_perf),
- GFP_KERNEL);
+ eps_acpi_cpu_perf = kzalloc_obj(*eps_acpi_cpu_perf);
if (!eps_acpi_cpu_perf)
return -ENOMEM;
@@ -321,8 +320,7 @@ static int eps_cpu_init(struct cpufreq_policy *policy)
states = 2;
/* Allocate private data and frequency table for current cpu */
- centaur = kzalloc(struct_size(centaur, freq_table, states + 1),
- GFP_KERNEL);
+ centaur = kzalloc_flex(*centaur, freq_table, states + 1);
if (!centaur)
return -ENOMEM;
eps_cpu[0] = centaur;
diff --git a/drivers/cpufreq/gx-suspmod.c b/drivers/cpufreq/gx-suspmod.c
index 75b3ef7ec679..d269a4f26f98 100644
--- a/drivers/cpufreq/gx-suspmod.c
+++ b/drivers/cpufreq/gx-suspmod.c
@@ -458,7 +458,7 @@ static int __init cpufreq_gx_init(void)
pr_debug("geode suspend modulation available.\n");
- params = kzalloc(sizeof(*params), GFP_KERNEL);
+ params = kzalloc_obj(*params);
if (params == NULL)
return -ENOMEM;
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index ec4abe374573..a48af3540c74 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -1161,7 +1161,7 @@ static void hybrid_init_cpu_capacity_scaling(bool refresh)
* the capacity of SMT threads is not deterministic even approximately,
* do not do that when SMT is in use.
*/
- if (hwp_is_hybrid && !sched_smt_active() && arch_enable_hybrid_capacity_scale()) {
+ if (hwp_is_hybrid && !cpu_smt_possible() && arch_enable_hybrid_capacity_scale()) {
hybrid_refresh_cpu_capacity_scaling();
/*
* Disabling ITMT causes sched domains to be rebuilt to disable asym
@@ -2745,7 +2745,7 @@ static int intel_pstate_init_cpu(unsigned int cpunum)
cpu = all_cpu_data[cpunum];
if (!cpu) {
- cpu = kzalloc(sizeof(*cpu), GFP_KERNEL);
+ cpu = kzalloc_obj(*cpu);
if (!cpu)
return -ENOMEM;
@@ -3301,7 +3301,7 @@ static int intel_cpufreq_cpu_init(struct cpufreq_policy *policy)
/* This reflects the intel_pstate_get_cpu_pstates() setting. */
policy->cur = policy->cpuinfo.min_freq;
- req = kcalloc(2, sizeof(*req), GFP_KERNEL);
+ req = kzalloc_objs(*req, 2);
if (!req) {
ret = -ENOMEM;
goto pstate_exit;
diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c
index 49e76b44468a..a18d1d11725f 100644
--- a/drivers/cpufreq/longhaul.c
+++ b/drivers/cpufreq/longhaul.c
@@ -475,8 +475,7 @@ static int longhaul_get_ranges(void)
return -EINVAL;
}
- longhaul_table = kcalloc(numscales + 1, sizeof(*longhaul_table),
- GFP_KERNEL);
+ longhaul_table = kzalloc_objs(*longhaul_table, numscales + 1);
if (!longhaul_table)
return -ENOMEM;
diff --git a/drivers/cpufreq/omap-cpufreq.c b/drivers/cpufreq/omap-cpufreq.c
deleted file mode 100644
index bbb01d93b54b..000000000000
--- a/drivers/cpufreq/omap-cpufreq.c
+++ /dev/null
@@ -1,195 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * CPU frequency scaling for OMAP using OPP information
- *
- * Copyright (C) 2005 Nokia Corporation
- * Written by Tony Lindgren <tony@atomide.com>
- *
- * Based on cpu-sa1110.c, Copyright (C) 2001 Russell King
- *
- * Copyright (C) 2007-2011 Texas Instruments, Inc.
- * - OMAP3/4 support by Rajendra Nayak, Santosh Shilimkar
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/cpufreq.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/pm_opp.h>
-#include <linux/cpu.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/regulator/consumer.h>
-
-/* OPP tolerance in percentage */
-#define OPP_TOLERANCE 4
-
-static struct cpufreq_frequency_table *freq_table;
-static atomic_t freq_table_users = ATOMIC_INIT(0);
-static struct device *mpu_dev;
-static struct regulator *mpu_reg;
-
-static int omap_target(struct cpufreq_policy *policy, unsigned int index)
-{
- int r, ret;
- struct dev_pm_opp *opp;
- unsigned long freq, volt = 0, volt_old = 0, tol = 0;
- unsigned int old_freq, new_freq;
-
- old_freq = policy->cur;
- new_freq = freq_table[index].frequency;
-
- freq = new_freq * 1000;
- ret = clk_round_rate(policy->clk, freq);
- if (ret < 0) {
- dev_warn(mpu_dev,
- "CPUfreq: Cannot find matching frequency for %lu\n",
- freq);
- return ret;
- }
- freq = ret;
-
- if (mpu_reg) {
- opp = dev_pm_opp_find_freq_ceil(mpu_dev, &freq);
- if (IS_ERR(opp)) {
- dev_err(mpu_dev, "%s: unable to find MPU OPP for %d\n",
- __func__, new_freq);
- return -EINVAL;
- }
- volt = dev_pm_opp_get_voltage(opp);
- dev_pm_opp_put(opp);
- tol = volt * OPP_TOLERANCE / 100;
- volt_old = regulator_get_voltage(mpu_reg);
- }
-
- dev_dbg(mpu_dev, "cpufreq-omap: %u MHz, %ld mV --> %u MHz, %ld mV\n",
- old_freq / 1000, volt_old ? volt_old / 1000 : -1,
- new_freq / 1000, volt ? volt / 1000 : -1);
-
- /* scaling up? scale voltage before frequency */
- if (mpu_reg && (new_freq > old_freq)) {
- r = regulator_set_voltage(mpu_reg, volt - tol, volt + tol);
- if (r < 0) {
- dev_warn(mpu_dev, "%s: unable to scale voltage up.\n",
- __func__);
- return r;
- }
- }
-
- ret = clk_set_rate(policy->clk, new_freq * 1000);
-
- /* scaling down? scale voltage after frequency */
- if (mpu_reg && (new_freq < old_freq)) {
- r = regulator_set_voltage(mpu_reg, volt - tol, volt + tol);
- if (r < 0) {
- dev_warn(mpu_dev, "%s: unable to scale voltage down.\n",
- __func__);
- clk_set_rate(policy->clk, old_freq * 1000);
- return r;
- }
- }
-
- return ret;
-}
-
-static inline void freq_table_free(void)
-{
- if (atomic_dec_and_test(&freq_table_users))
- dev_pm_opp_free_cpufreq_table(mpu_dev, &freq_table);
-}
-
-static int omap_cpu_init(struct cpufreq_policy *policy)
-{
- int result;
-
- policy->clk = clk_get(NULL, "cpufreq_ck");
- if (IS_ERR(policy->clk))
- return PTR_ERR(policy->clk);
-
- if (!freq_table) {
- result = dev_pm_opp_init_cpufreq_table(mpu_dev, &freq_table);
- if (result) {
- dev_err(mpu_dev,
- "%s: cpu%d: failed creating freq table[%d]\n",
- __func__, policy->cpu, result);
- clk_put(policy->clk);
- return result;
- }
- }
-
- atomic_inc_return(&freq_table_users);
-
- /* FIXME: what's the actual transition time? */
- cpufreq_generic_init(policy, freq_table, 300 * 1000);
-
- return 0;
-}
-
-static void omap_cpu_exit(struct cpufreq_policy *policy)
-{
- freq_table_free();
- clk_put(policy->clk);
-}
-
-static struct cpufreq_driver omap_driver = {
- .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK,
- .verify = cpufreq_generic_frequency_table_verify,
- .target_index = omap_target,
- .get = cpufreq_generic_get,
- .init = omap_cpu_init,
- .exit = omap_cpu_exit,
- .register_em = cpufreq_register_em_with_opp,
- .name = "omap",
-};
-
-static int omap_cpufreq_probe(struct platform_device *pdev)
-{
- mpu_dev = get_cpu_device(0);
- if (!mpu_dev) {
- pr_warn("%s: unable to get the MPU device\n", __func__);
- return -EINVAL;
- }
-
- mpu_reg = regulator_get(mpu_dev, "vcc");
- if (IS_ERR(mpu_reg)) {
- pr_warn("%s: unable to get MPU regulator\n", __func__);
- mpu_reg = NULL;
- } else {
- /*
- * Ensure physical regulator is present.
- * (e.g. could be dummy regulator.)
- */
- if (regulator_get_voltage(mpu_reg) < 0) {
- pr_warn("%s: physical regulator not present for MPU\n",
- __func__);
- regulator_put(mpu_reg);
- mpu_reg = NULL;
- }
- }
-
- return cpufreq_register_driver(&omap_driver);
-}
-
-static void omap_cpufreq_remove(struct platform_device *pdev)
-{
- cpufreq_unregister_driver(&omap_driver);
-}
-
-static struct platform_driver omap_cpufreq_platdrv = {
- .driver = {
- .name = "omap-cpufreq",
- },
- .probe = omap_cpufreq_probe,
- .remove = omap_cpufreq_remove,
-};
-module_platform_driver(omap_cpufreq_platdrv);
-
-MODULE_DESCRIPTION("cpufreq driver for OMAP SoCs");
-MODULE_LICENSE("GPL");
diff --git a/drivers/cpufreq/powernow-k7.c b/drivers/cpufreq/powernow-k7.c
index 31039330a3ba..6b7caf4ae20d 100644
--- a/drivers/cpufreq/powernow-k7.c
+++ b/drivers/cpufreq/powernow-k7.c
@@ -304,7 +304,7 @@ static int powernow_acpi_init(void)
goto err0;
}
- acpi_processor_perf = kzalloc(sizeof(*acpi_processor_perf), GFP_KERNEL);
+ acpi_processor_perf = kzalloc_obj(*acpi_processor_perf);
if (!acpi_processor_perf) {
retval = -ENOMEM;
goto err0;
diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c
index f7512b4e923e..4d77eef53fe0 100644
--- a/drivers/cpufreq/powernow-k8.c
+++ b/drivers/cpufreq/powernow-k8.c
@@ -1029,7 +1029,7 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol)
if (rc)
return -ENODEV;
- data = kzalloc(sizeof(*data), GFP_KERNEL);
+ data = kzalloc_obj(*data);
if (!data)
return -ENOMEM;
diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
index 7d9a5f656de8..4a6f4d9043e9 100644
--- a/drivers/cpufreq/powernv-cpufreq.c
+++ b/drivers/cpufreq/powernv-cpufreq.c
@@ -323,7 +323,7 @@ next:
powernv_freqs[i].frequency = freq * 1000; /* kHz */
powernv_freqs[i].driver_data = id & 0xFF;
- revmap_data = kmalloc(sizeof(*revmap_data), GFP_KERNEL);
+ revmap_data = kmalloc_obj(*revmap_data);
if (!revmap_data) {
rc = -ENOMEM;
goto out;
@@ -857,7 +857,7 @@ static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
return 0;
/* Initialise Gpstate ramp-down timer only on POWER8 */
- gpstates = kzalloc(sizeof(*gpstates), GFP_KERNEL);
+ gpstates = kzalloc_obj(*gpstates);
if (!gpstates)
return -ENOMEM;
@@ -1053,7 +1053,7 @@ static int init_chip_info(void)
return -ENOMEM;
/* Allocate a chip cpu mask large enough to fit mask for all chips */
- chip_cpu_mask = kcalloc(MAX_NR_CHIPS, sizeof(cpumask_t), GFP_KERNEL);
+ chip_cpu_mask = kzalloc_objs(cpumask_t, MAX_NR_CHIPS);
if (!chip_cpu_mask) {
ret = -ENOMEM;
goto free_and_return;
@@ -1069,7 +1069,7 @@ static int init_chip_info(void)
cpumask_set_cpu(cpu, &chip_cpu_mask[nr_chips-1]);
}
- chips = kcalloc(nr_chips, sizeof(struct chip), GFP_KERNEL);
+ chips = kzalloc_objs(struct chip, nr_chips);
if (!chips) {
ret = -ENOMEM;
goto out_free_chip_cpu_mask;
diff --git a/drivers/cpufreq/pxa3xx-cpufreq.c b/drivers/cpufreq/pxa3xx-cpufreq.c
index 4afa48d172db..50ff3b6a6900 100644
--- a/drivers/cpufreq/pxa3xx-cpufreq.c
+++ b/drivers/cpufreq/pxa3xx-cpufreq.c
@@ -110,7 +110,7 @@ static int setup_freqs_table(struct cpufreq_policy *policy,
struct cpufreq_frequency_table *table;
int i;
- table = kcalloc(num + 1, sizeof(*table), GFP_KERNEL);
+ table = kzalloc_objs(*table, num + 1);
if (table == NULL)
return -ENOMEM;
diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c
index 8422704a3b10..ea9a20d27b8f 100644
--- a/drivers/cpufreq/qcom-cpufreq-hw.c
+++ b/drivers/cpufreq/qcom-cpufreq-hw.c
@@ -211,7 +211,7 @@ static int qcom_cpufreq_hw_read_lut(struct device *cpu_dev,
struct qcom_cpufreq_data *drv_data = policy->driver_data;
const struct qcom_cpufreq_soc_data *soc_data = qcom_cpufreq.soc_data;
- table = kcalloc(LUT_MAX_ENTRIES + 1, sizeof(*table), GFP_KERNEL);
+ table = kzalloc_objs(*table, LUT_MAX_ENTRIES + 1);
if (!table)
return -ENOMEM;
diff --git a/drivers/cpufreq/qcom-cpufreq-nvmem.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c
index 81e16b5a0245..b8081acba928 100644
--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
@@ -263,6 +263,7 @@ static const struct of_device_id qcom_cpufreq_ipq806x_match_list[] __maybe_unuse
{ .compatible = "qcom,ipq8066", .data = (const void *)QCOM_ID_IPQ8066 },
{ .compatible = "qcom,ipq8068", .data = (const void *)QCOM_ID_IPQ8068 },
{ .compatible = "qcom,ipq8069", .data = (const void *)QCOM_ID_IPQ8069 },
+ { /* sentinel */ }
};
static int qcom_cpufreq_ipq8064_name_version(struct device *cpu_dev,
diff --git a/drivers/cpufreq/qoriq-cpufreq.c b/drivers/cpufreq/qoriq-cpufreq.c
index 8d1f5ac59132..42edb41ad459 100644
--- a/drivers/cpufreq/qoriq-cpufreq.c
+++ b/drivers/cpufreq/qoriq-cpufreq.c
@@ -168,7 +168,7 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
if (!np)
return -ENODEV;
- data = kzalloc(sizeof(*data), GFP_KERNEL);
+ data = kzalloc_obj(*data);
if (!data)
goto err_np;
@@ -181,11 +181,11 @@ static int qoriq_cpufreq_cpu_init(struct cpufreq_policy *policy)
hwclk = __clk_get_hw(policy->clk);
count = clk_hw_get_num_parents(hwclk);
- data->pclk = kcalloc(count, sizeof(struct clk *), GFP_KERNEL);
+ data->pclk = kzalloc_objs(struct clk *, count);
if (!data->pclk)
goto err_nomem2;
- table = kcalloc(count + 1, sizeof(*table), GFP_KERNEL);
+ table = kzalloc_objs(*table, count + 1);
if (!table)
goto err_pclk;
diff --git a/drivers/cpufreq/rcpufreq_dt.rs b/drivers/cpufreq/rcpufreq_dt.rs
index 31e07f0279db..f17bf64c22e2 100644
--- a/drivers/cpufreq/rcpufreq_dt.rs
+++ b/drivers/cpufreq/rcpufreq_dt.rs
@@ -3,7 +3,6 @@
//! Rust based implementation of the cpufreq-dt driver.
use kernel::{
- c_str,
clk::Clk,
cpu, cpufreq,
cpumask::CpumaskVar,
@@ -52,7 +51,7 @@ impl opp::ConfigOps for CPUFreqDTDriver {}
#[vtable]
impl cpufreq::Driver for CPUFreqDTDriver {
- const NAME: &'static CStr = c_str!("cpufreq-dt");
+ const NAME: &'static CStr = c"cpufreq-dt";
const FLAGS: u16 = cpufreq::flags::NEED_INITIAL_FREQ_CHECK | cpufreq::flags::IS_COOLING_DEV;
const BOOST_ENABLED: bool = true;
@@ -197,7 +196,7 @@ kernel::of_device_table!(
OF_TABLE,
MODULE_OF_TABLE,
<CPUFreqDTDriver as platform::Driver>::IdInfo,
- [(of::DeviceId::new(c_str!("operating-points-v2")), ())]
+ [(of::DeviceId::new(c"operating-points-v2"), ())]
);
impl platform::Driver for CPUFreqDTDriver {
diff --git a/drivers/cpufreq/s5pv210-cpufreq.c b/drivers/cpufreq/s5pv210-cpufreq.c
index ba8a1c96427a..e64e84e1ee79 100644
--- a/drivers/cpufreq/s5pv210-cpufreq.c
+++ b/drivers/cpufreq/s5pv210-cpufreq.c
@@ -629,19 +629,17 @@ static int s5pv210_cpufreq_probe(struct platform_device *pdev)
goto err_clock;
}
- for_each_compatible_node(np, NULL, "samsung,s5pv210-dmc") {
- id = of_alias_get_id(np, "dmc");
+ for_each_compatible_node_scoped(dmc, NULL, "samsung,s5pv210-dmc") {
+ id = of_alias_get_id(dmc, "dmc");
if (id < 0 || id >= ARRAY_SIZE(dmc_base)) {
- dev_err(dev, "failed to get alias of dmc node '%pOFn'\n", np);
- of_node_put(np);
+ dev_err(dev, "failed to get alias of dmc node '%pOFn'\n", dmc);
result = id;
goto err_clk_base;
}
- dmc_base[id] = of_iomap(np, 0);
+ dmc_base[id] = of_iomap(dmc, 0);
if (!dmc_base[id]) {
dev_err(dev, "failed to map dmc%d registers\n", id);
- of_node_put(np);
result = -EFAULT;
goto err_dmc;
}
diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
index d2a110079f5f..4edb4f7a8aa9 100644
--- a/drivers/cpufreq/scmi-cpufreq.c
+++ b/drivers/cpufreq/scmi-cpufreq.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
/*
- * System Control and Power Interface (SCMI) based CPUFreq Interface driver
+ * System Control and Management Interface (SCMI) based CPUFreq Interface driver
*
* Copyright (C) 2018-2021 ARM Ltd.
* Sudeep Holla <sudeep.holla@arm.com>
@@ -101,6 +101,7 @@ static int scmi_cpu_domain_id(struct device *cpu_dev)
return -EINVAL;
}
+ of_node_put(domain_id.np);
return domain_id.args[0];
}
@@ -213,7 +214,7 @@ static int scmi_cpufreq_init(struct cpufreq_policy *policy)
if (domain < 0)
return domain;
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ priv = kzalloc_obj(*priv);
if (!priv)
return -ENOMEM;
diff --git a/drivers/cpufreq/scpi-cpufreq.c b/drivers/cpufreq/scpi-cpufreq.c
index e530345baddf..09e29b2a6d8e 100644
--- a/drivers/cpufreq/scpi-cpufreq.c
+++ b/drivers/cpufreq/scpi-cpufreq.c
@@ -128,7 +128,7 @@ static int scpi_cpufreq_init(struct cpufreq_policy *policy)
goto out_free_opp;
}
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ priv = kzalloc_obj(*priv);
if (!priv) {
ret = -ENOMEM;
goto out_free_opp;
diff --git a/drivers/cpufreq/sparc-us2e-cpufreq.c b/drivers/cpufreq/sparc-us2e-cpufreq.c
index 15899dd77c08..a68706406b88 100644
--- a/drivers/cpufreq/sparc-us2e-cpufreq.c
+++ b/drivers/cpufreq/sparc-us2e-cpufreq.c
@@ -323,8 +323,7 @@ static int __init us2e_freq_init(void)
impl = ((ver >> 32) & 0xffff);
if (manuf == 0x17 && impl == 0x13) {
- us2e_freq_table = kcalloc(NR_CPUS, sizeof(*us2e_freq_table),
- GFP_KERNEL);
+ us2e_freq_table = kzalloc_objs(*us2e_freq_table, NR_CPUS);
if (!us2e_freq_table)
return -ENOMEM;
diff --git a/drivers/cpufreq/sparc-us3-cpufreq.c b/drivers/cpufreq/sparc-us3-cpufreq.c
index de50a2f3b124..5a8ad86018e8 100644
--- a/drivers/cpufreq/sparc-us3-cpufreq.c
+++ b/drivers/cpufreq/sparc-us3-cpufreq.c
@@ -171,8 +171,7 @@ static int __init us3_freq_init(void)
impl == CHEETAH_PLUS_IMPL ||
impl == JAGUAR_IMPL ||
impl == PANTHER_IMPL)) {
- us3_freq_table = kcalloc(NR_CPUS, sizeof(*us3_freq_table),
- GFP_KERNEL);
+ us3_freq_table = kzalloc_objs(*us3_freq_table, NR_CPUS);
if (!us3_freq_table)
return -ENOMEM;
diff --git a/drivers/cpufreq/spear-cpufreq.c b/drivers/cpufreq/spear-cpufreq.c
index 2a1550e1aa21..81a0780b2ebf 100644
--- a/drivers/cpufreq/spear-cpufreq.c
+++ b/drivers/cpufreq/spear-cpufreq.c
@@ -191,7 +191,7 @@ static int spear_cpufreq_probe(struct platform_device *pdev)
goto out_put_node;
}
- freq_tbl = kcalloc(cnt + 1, sizeof(*freq_tbl), GFP_KERNEL);
+ freq_tbl = kzalloc_objs(*freq_tbl, cnt + 1);
if (!freq_tbl) {
ret = -ENOMEM;
goto out_put_node;
diff --git a/drivers/cpufreq/sun50i-cpufreq-nvmem.c b/drivers/cpufreq/sun50i-cpufreq-nvmem.c
index 4fffc8e83692..9261d148a165 100644
--- a/drivers/cpufreq/sun50i-cpufreq-nvmem.c
+++ b/drivers/cpufreq/sun50i-cpufreq-nvmem.c
@@ -244,8 +244,7 @@ static int sun50i_cpufreq_nvmem_probe(struct platform_device *pdev)
int speed;
int ret;
- opp_tokens = kcalloc(num_possible_cpus(), sizeof(*opp_tokens),
- GFP_KERNEL);
+ opp_tokens = kzalloc_objs(*opp_tokens, num_possible_cpus());
if (!opp_tokens)
return -ENOMEM;
diff --git a/drivers/cpufreq/tegra186-cpufreq.c b/drivers/cpufreq/tegra186-cpufreq.c
index 34ed943c5f34..4fa6894f6371 100644
--- a/drivers/cpufreq/tegra186-cpufreq.c
+++ b/drivers/cpufreq/tegra186-cpufreq.c
@@ -135,7 +135,7 @@ static int tegra_cpufreq_init_cpufreq_table(struct cpufreq_policy *policy,
dev_pm_opp_disable(cpu_dev, rate);
}
- freq_table = kcalloc((max_opps + 1), sizeof(*freq_table), GFP_KERNEL);
+ freq_table = kzalloc_objs(*freq_table, (max_opps + 1));
if (!freq_table)
return -ENOMEM;
diff --git a/drivers/cpufreq/tegra194-cpufreq.c b/drivers/cpufreq/tegra194-cpufreq.c
index 695599e1001f..7a41cfc71a46 100644
--- a/drivers/cpufreq/tegra194-cpufreq.c
+++ b/drivers/cpufreq/tegra194-cpufreq.c
@@ -463,7 +463,7 @@ static int tegra_cpufreq_init_cpufreq_table(struct cpufreq_policy *policy,
return ret;
}
- freq_table = kcalloc((max_opps + 1), sizeof(*freq_table), GFP_KERNEL);
+ freq_table = kzalloc_objs(*freq_table, (max_opps + 1));
if (!freq_table)
return -ENOMEM;
diff --git a/drivers/cpufreq/ti-cpufreq.c b/drivers/cpufreq/ti-cpufreq.c
index 6ee76f5fe9c5..3d1129aeed02 100644
--- a/drivers/cpufreq/ti-cpufreq.c
+++ b/drivers/cpufreq/ti-cpufreq.c
@@ -70,6 +70,12 @@ enum {
#define AM62A7_SUPPORT_R_MPU_OPP BIT(1)
#define AM62A7_SUPPORT_V_MPU_OPP BIT(2)
+#define AM62L3_EFUSE_E_MPU_OPP 5
+#define AM62L3_EFUSE_O_MPU_OPP 15
+
+#define AM62L3_SUPPORT_E_MPU_OPP BIT(0)
+#define AM62L3_SUPPORT_O_MPU_OPP BIT(1)
+
#define AM62P5_EFUSE_O_MPU_OPP 15
#define AM62P5_EFUSE_S_MPU_OPP 19
#define AM62P5_EFUSE_T_MPU_OPP 20
@@ -213,6 +219,22 @@ static unsigned long am625_efuse_xlate(struct ti_cpufreq_data *opp_data,
return calculated_efuse;
}
+static unsigned long am62l3_efuse_xlate(struct ti_cpufreq_data *opp_data,
+ unsigned long efuse)
+{
+ unsigned long calculated_efuse = AM62L3_SUPPORT_E_MPU_OPP;
+
+ switch (efuse) {
+ case AM62L3_EFUSE_O_MPU_OPP:
+ calculated_efuse |= AM62L3_SUPPORT_O_MPU_OPP;
+ fallthrough;
+ case AM62L3_EFUSE_E_MPU_OPP:
+ calculated_efuse |= AM62L3_SUPPORT_E_MPU_OPP;
+ }
+
+ return calculated_efuse;
+}
+
static struct ti_cpufreq_soc_data am3x_soc_data = {
.efuse_xlate = amx3_efuse_xlate,
.efuse_fallback = AM33XX_800M_ARM_MPU_MAX_FREQ,
@@ -313,8 +335,9 @@ static struct ti_cpufreq_soc_data am3517_soc_data = {
static const struct soc_device_attribute k3_cpufreq_soc[] = {
{ .family = "AM62X", },
{ .family = "AM62AX", },
- { .family = "AM62PX", },
{ .family = "AM62DX", },
+ { .family = "AM62LX", },
+ { .family = "AM62PX", },
{ /* sentinel */ }
};
@@ -335,6 +358,14 @@ static struct ti_cpufreq_soc_data am62a7_soc_data = {
.multi_regulator = false,
};
+static struct ti_cpufreq_soc_data am62l3_soc_data = {
+ .efuse_xlate = am62l3_efuse_xlate,
+ .efuse_offset = 0x0,
+ .efuse_mask = 0x07c0,
+ .efuse_shift = 0x6,
+ .multi_regulator = false,
+};
+
static struct ti_cpufreq_soc_data am62p5_soc_data = {
.efuse_xlate = am62p5_efuse_xlate,
.efuse_offset = 0x0,
@@ -463,6 +494,7 @@ static const struct of_device_id ti_cpufreq_of_match[] __maybe_unused = {
{ .compatible = "ti,am625", .data = &am625_soc_data, },
{ .compatible = "ti,am62a7", .data = &am62a7_soc_data, },
{ .compatible = "ti,am62d2", .data = &am62a7_soc_data, },
+ { .compatible = "ti,am62l3", .data = &am62l3_soc_data, },
{ .compatible = "ti,am62p5", .data = &am62p5_soc_data, },
/* legacy */
{ .compatible = "ti,omap3430", .data = &omap34xx_soc_data, },
diff --git a/drivers/cpufreq/vexpress-spc-cpufreq.c b/drivers/cpufreq/vexpress-spc-cpufreq.c
index 65fea47b82e6..8e4e29138464 100644
--- a/drivers/cpufreq/vexpress-spc-cpufreq.c
+++ b/drivers/cpufreq/vexpress-spc-cpufreq.c
@@ -252,7 +252,7 @@ static int merge_cluster_tables(void)
for (i = 0; i < MAX_CLUSTERS; i++)
count += get_table_count(freq_table[i]);
- table = kcalloc(count, sizeof(*table), GFP_KERNEL);
+ table = kzalloc_objs(*table, count);
if (!table)
return -ENOMEM;
diff --git a/drivers/cpufreq/virtual-cpufreq.c b/drivers/cpufreq/virtual-cpufreq.c
index 6ffa16d239b2..4159f31349b1 100644
--- a/drivers/cpufreq/virtual-cpufreq.c
+++ b/drivers/cpufreq/virtual-cpufreq.c
@@ -171,7 +171,7 @@ static int virt_cpufreq_get_freq_info(struct cpufreq_policy *policy)
return 0;
}
- table = kcalloc(num_perftbl_entries + 1, sizeof(*table), GFP_KERNEL);
+ table = kzalloc_objs(*table, num_perftbl_entries + 1);
if (!table)
return -ENOMEM;