static int rk3188_cpufreq_init_cpu0(struct cpufreq_policy *policy)
{
unsigned int i;
+ struct cpufreq_frequency_table *table_adjust;
gpu_is_mali400 = cpu_is_rk3188();
gpu_clk = clk_get(NULL, "gpu");
if (IS_ERR(cpu_clk))
return PTR_ERR(cpu_clk);
+ if (soc_is_rk3188()) {
+ /* Adjust dvfs table avoid overheat */
+ table_adjust = dvfs_get_freq_volt_table(cpu_clk);
+ dvfs_adjust_table_lmtvolt(cpu_clk, table_adjust);
+ table_adjust = dvfs_get_freq_volt_table(gpu_clk);
+ dvfs_adjust_table_lmtvolt(gpu_clk, table_adjust);
+ }
+
dvfs_clk_register_set_rate_callback(cpu_clk, cpufreq_scale_rate_for_dvfs);
freq_table = dvfs_get_freq_volt_table(cpu_clk);
if (freq_table == NULL) {
#include <linux/delay.h>\r
#include <linux/io.h>\r
#include <linux/hrtimer.h>\r
+#include <plat/efuse.h>\r
\r
static int rk_dvfs_clk_notifier_event(struct notifier_block *this,\r
unsigned long event, void *ptr)\r
.notifier_call = rk_dvfs_clk_notifier_event,\r
};\r
\r
+struct lkg_maxvolt {\r
+ int leakage_level;\r
+ unsigned int maxvolt;\r
+};\r
+static struct lkg_maxvolt lkg_volt_table[] = {\r
+ {.leakage_level = 1, .maxvolt = 1350 * 1000},\r
+ {.leakage_level = 3, .maxvolt = 1275 * 1000},\r
+ {.leakage_level = 15, .maxvolt = 1200 * 1000},\r
+};\r
+\r
+static int leakage_level = 0;\r
+#define HIGH_DELAYLINE 125\r
+#define LOW_DELAYLINE 110\r
+static u8 rk30_get_avs_val(void);\r
+void dvfs_adjust_table_lmtvolt(struct clk *clk, struct cpufreq_frequency_table *table)\r
+{\r
+ int i = 0;\r
+ unsigned int maxvolt = 0;\r
+\r
+ leakage_level = rk_leakage_val();\r
+ printk("DVFS MSG: %s: %s get leakage_level = %d\n", clk->name, __func__, leakage_level);\r
+ if (leakage_level == 0) {\r
+ int delayline_val = 0;\r
+ delayline_val = rk30_get_avs_val();\r
+ printk("This chip no leakage msg, use delayline instead, val = %d\n", delayline_val);\r
+\r
+ if (delayline_val >= HIGH_DELAYLINE) {\r
+ leakage_level = 4; //same as leakage_level > 4\r
+\r
+ } else if (delayline_val <= LOW_DELAYLINE) {\r
+ leakage_level = 1;\r
+ printk("Delayline TOO LOW, maybe need high voltage, ignore this chip\n");\r
+ while(1);\r
+\r
+ } else\r
+ leakage_level = 2; //same as leakage_level = 3\r
+ }\r
+\r
+ for (i = 0; i < ARRAY_SIZE(lkg_volt_table); i++) {\r
+ if (leakage_level <= lkg_volt_table[i].leakage_level) {\r
+ maxvolt = lkg_volt_table[i].maxvolt;\r
+ break;\r
+ }\r
+ }\r
+\r
+ for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {\r
+ if (table[i].index > maxvolt) {\r
+ printk("\t\tadjust table freq=%d KHz, index=%d mV", table[i].frequency, table[i].index);\r
+ table[i].index = maxvolt;\r
+ printk(" to index=%d mV\n", table[i].index);\r
+ }\r
+ }\r
+}\r
+\r
#define NO_VOLT_DIFF\r
#ifdef NO_VOLT_DIFF\r
\r