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