mirror of
https://github.com/hanwckf/immortalwrt-mt798x.git
synced 2025-01-10 11:09:57 +08:00
48 lines
1.4 KiB
Diff
48 lines
1.4 KiB
Diff
diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c
|
|
index b23b6d2..147a224 100644
|
|
--- a/drivers/cpufreq/mediatek-cpufreq.c
|
|
+++ b/drivers/cpufreq/mediatek-cpufreq.c
|
|
@@ -15,6 +15,7 @@
|
|
#include <linux/regulator/consumer.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/thermal.h>
|
|
+#include <linux/nvmem-consumer.h>
|
|
|
|
#define MIN_VOLT_SHIFT (100000)
|
|
#define MAX_VOLT_SHIFT (200000)
|
|
@@ -539,6 +540,11 @@ static int mtk_cpufreq_init(struct cpufreq_policy *policy)
|
|
struct mtk_cpu_dvfs_info *info;
|
|
struct cpufreq_frequency_table *freq_table;
|
|
int ret;
|
|
+ int target_vproc;
|
|
+ u32 reg_val;
|
|
+ struct nvmem_cell *cell;
|
|
+ size_t len;
|
|
+ u32 *buf;
|
|
|
|
info = mtk_cpu_dvfs_info_lookup(policy->cpu);
|
|
if (!info) {
|
|
@@ -547,6 +553,22 @@ static int mtk_cpufreq_init(struct cpufreq_policy *policy)
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ cell = nvmem_cell_get(info->cpu_dev, "calibration-data");
|
|
+ if (!IS_ERR(cell)) {
|
|
+ buf = (u32 *)nvmem_cell_read(cell, &len);
|
|
+ nvmem_cell_put(cell);
|
|
+ if (!IS_ERR(buf)) {
|
|
+ reg_val = buf[0] & 0x1f;
|
|
+ pr_debug("%s: read vbinning value: %d\n", __func__, reg_val);
|
|
+ if (reg_val > 0) {
|
|
+ target_vproc = 850000 + reg_val * 10000;
|
|
+ dev_pm_opp_remove(info->cpu_dev, 1800000000);
|
|
+ dev_pm_opp_add(info->cpu_dev, 1800000000, target_vproc);
|
|
+ }
|
|
+ kfree(buf);
|
|
+ }
|
|
+ }
|
|
+
|
|
ret = dev_pm_opp_init_cpufreq_table(info->cpu_dev, &freq_table);
|
|
if (ret) {
|
|
pr_err("failed to init cpufreq table for cpu%d: %d\n",
|