suport gpu dvs
authorxxx <xxx@rock-chips.com>
Thu, 10 May 2012 00:48:40 +0000 (17:48 -0700)
committerxxx <xxx@rock-chips.com>
Thu, 10 May 2012 00:48:40 +0000 (17:48 -0700)
arch/arm/mach-rk30/board-rk30-sdk.c [changed mode: 0755->0644]
arch/arm/mach-rk30/clock.c [changed mode: 0755->0644]
arch/arm/mach-rk30/clock.h [changed mode: 0755->0644]
arch/arm/mach-rk30/cpufreq.c [changed mode: 0755->0644]
arch/arm/mach-rk30/dvfs.c [changed mode: 0755->0644]
arch/arm/mach-rk30/include/mach/dvfs.h

old mode 100755 (executable)
new mode 100644 (file)
index ba0b818..c295625
@@ -1440,6 +1440,17 @@ static struct dvfs_arm_table dvfs_cpu_logic_table[] = {
        {.frequency = 1608 * 1000,      .cpu_volt = 1350 * 1000,        .logic_volt = 1200 * 1000},//1.325V/1.175V
        {.frequency = CPUFREQ_TABLE_END},
 };
+static struct cpufreq_frequency_table dvfs_gpu_table[] = {
+       {.frequency = 266 * 1000,       .index = 1000 * 1000},
+       {.frequency = 400 * 1000,       .index = 1350 * 1000},
+       {.frequency = CPUFREQ_TABLE_END},
+};
+
+static struct cpufreq_frequency_table dvfs_ddr_table[] = {
+       {.frequency = 300 * 1000,       .index = 1000 * 1000},
+       {.frequency = 400 * 1000,       .index = 1100 * 1000},
+       {.frequency = CPUFREQ_TABLE_END},
+};
 
 #define DVFS_CPU_TABLE_SIZE    (ARRAY_SIZE(dvfs_cpu_logic_table))
 static struct cpufreq_frequency_table cpu_dvfs_table[DVFS_CPU_TABLE_SIZE];
@@ -1449,6 +1460,8 @@ void __init board_clock_init(void)
 {
        rk30_clock_data_init(periph_pll_default, codec_pll_default, RK30_CLOCKS_DEFAULT_FLAGS);
        dvfs_set_arm_logic_volt(dvfs_cpu_logic_table, cpu_dvfs_table, dep_cpu2core_table);
+       dvfs_set_freq_volt_table(clk_get(NULL, "gpu"), dvfs_gpu_table);
+       dvfs_set_freq_volt_table(clk_get(NULL, "ddr"), dvfs_ddr_table);
 }
 
 MACHINE_START(RK30, "RK30board")
old mode 100755 (executable)
new mode 100644 (file)
index 6950186..e0afe5b
@@ -244,6 +244,11 @@ long clk_round_rate_nolock(struct clk *clk, unsigned long rate)
 
        return clk->rate;
 }
+int is_suport_round_rate(struct clk *clk)
+{
+       return (clk->round_rate) ? 0:(-1);
+}
+
 int clk_set_rate_nolock(struct clk *clk, unsigned long rate)
 {
        int ret;
old mode 100755 (executable)
new mode 100644 (file)
index 7bf2696..fdecd15
@@ -73,6 +73,7 @@ int clk_set_parent_nolock(struct clk *clk, struct clk *parent);
 int clk_set_rate_locked(struct clk * clk,unsigned long rate);
 void clk_register_dvfs(struct clk_node *dvfs_clk, struct clk *clk);
 struct clk_node *clk_get_dvfs_info(struct clk *clk);
+int is_suport_round_rate(struct clk *clk);
 
 #ifdef RK30_CLK_OFFBOARD_TEST
 #include <linux/device.h>
old mode 100755 (executable)
new mode 100644 (file)
index b05a842..cdc8c7f
@@ -202,6 +202,20 @@ static int rk30_verify_speed(struct cpufreq_policy *policy)
 static int rk30_cpu_init(struct cpufreq_policy *policy)
 {
        if (policy->cpu == 0) {
+               struct clk *gpu_clk;
+               struct clk *ddr_clk;
+               
+               gpu_clk = clk_get(NULL, "gpu");
+               if (!IS_ERR(gpu_clk))
+                       clk_enable_dvfs(gpu_clk);
+
+               ddr_clk = clk_get(NULL, "ddr");
+               if (!IS_ERR(ddr_clk))
+               {
+                       clk_enable_dvfs(ddr_clk);
+                       clk_set_rate(ddr_clk,clk_get_rate(ddr_clk)+1);
+               }
+               
                cpu_clk = clk_get(NULL, "cpu");
                if (IS_ERR(cpu_clk))
                        return PTR_ERR(cpu_clk);
old mode 100755 (executable)
new mode 100644 (file)
index d7d48b5..40ef00f
@@ -51,6 +51,7 @@
 \r
 static LIST_HEAD(rk_dvfs_tree);\r
 static DEFINE_MUTEX(mutex);\r
+static DEFINE_MUTEX(rk_dvfs_mutex);\r
 \r
 extern int rk30_clk_notifier_register(struct clk *clk, struct notifier_block *nb);\r
 extern int rk30_clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);\r
@@ -78,9 +79,11 @@ int dvfs_set_rate(struct clk *clk, unsigned long rate)
                ret = -1;\r
        } else {\r
                vd = clk->dvfs_info->vd;\r
-               mutex_lock(&vd->dvfs_mutex);\r
+               // mutex_lock(&vd->dvfs_mutex);\r
+               mutex_lock(&rk_dvfs_mutex);\r
                ret = vd->vd_dvfs_target(clk, rate);\r
-               mutex_unlock(&vd->dvfs_mutex);\r
+               mutex_unlock(&rk_dvfs_mutex);\r
+               // mutex_unlock(&vd->dvfs_mutex);\r
        }\r
        DVFS_DBG("%s(%s(%lu)),is end\n", __func__, clk->name, rate);\r
        return ret;\r
@@ -439,7 +442,7 @@ static int rk_regist_vd(struct vd_node *vd)
        if (!vd)\r
                return -1;\r
        mutex_lock(&mutex);\r
-       mutex_init(&vd->dvfs_mutex);\r
+       //mutex_init(&vd->dvfs_mutex);\r
        list_add(&vd->node, &rk_dvfs_tree);\r
        INIT_LIST_HEAD(&vd->pd_list);\r
        INIT_LIST_HEAD(&vd->req_volt_list);\r
@@ -665,10 +668,16 @@ int dvfs_target_core(struct clk *clk, unsigned long rate_hz)
                DVFS_ERR("%s can't get dvfs regulater\n", clk->name);\r
                return -1;\r
        }\r
-\r
-       // clk_round_rate_nolock(clk, rate_hz);\r
+       \r
        rate_new = rate_hz;\r
        rate_old = clk_get_rate(clk);\r
+       if(!is_suport_round_rate(clk))\r
+       {\r
+               rate_new=clk_round_rate_nolock(clk, rate_hz);\r
+       }\r
+       if(rate_new==rate_old)\r
+               return 0;\r
+\r
 \r
        // DVFS_DBG("dvfs(%s) round rate(%lu)(rount %lu)\n",dvfs_clk->name,rate_hz,rate_new);\r
 \r
@@ -679,11 +688,8 @@ int dvfs_target_core(struct clk *clk, unsigned long rate_hz)
                return -1;\r
        }\r
        volt_old = dvfs_clk->vd->cur_volt;\r
-\r
        volt_clk_old = dvfs_clk->set_volt;\r
-\r
        dvfs_clk->set_volt = clk_fv.index;\r
-\r
        volt_new = dvfs_vd_get_newvolt_byclk(dvfs_clk);\r
 \r
        DVFS_DBG("dvfs--(%s),volt=%d(was %dmV),rate=%lu(was %lu),vd%u=(was%u)\n",\r
@@ -692,6 +698,12 @@ int dvfs_target_core(struct clk *clk, unsigned long rate_hz)
 \r
        if (flag_core_set_volt_err) {\r
                /* It means the last time set voltage error */  \r
+               if (!IS_ERR(dvfs_clk->vd->regulator))\r
+                       flag_set_volt_correct = dvfs_regulator_get_voltage(dvfs_clk->vd->regulator);\r
+               else {\r
+                       DVFS_ERR("dvfs regulator is ERROR\n");\r
+               }\r
+\r
                flag_set_volt_correct = dvfs_regulator_get_voltage(dvfs_clk->vd->regulator);\r
                if (flag_set_volt_correct <= 0) {\r
                        DVFS_ERR("%s (clk:%s),volt=%d(was %dmV),rate=%lu(was %lu), try to reload core_volt error %d!!! stop scaling\n", \r
@@ -937,8 +949,8 @@ static struct cpufreq_frequency_table ddr_dvfs_table[] = {
 };\r
 \r
 static struct cpufreq_frequency_table gpu_dvfs_table[] = {\r
-       {.frequency = 100 * DVFS_KHZ, .index = 1000 * DVFS_MV},\r
-       {.frequency = 200 * DVFS_KHZ, .index = 1050 * DVFS_MV},\r
+       {.frequency = 90 * DVFS_KHZ, .index = 1100 * DVFS_MV},\r
+       {.frequency = 180 * DVFS_KHZ, .index = 1150 * DVFS_MV},\r
        {.frequency = 300 * DVFS_KHZ, .index = 1100 * DVFS_MV},\r
        {.frequency = 400 * DVFS_KHZ, .index = 1150 * DVFS_MV},\r
        {.frequency = 500 * DVFS_KHZ, .index = 1200 * DVFS_MV},\r
index 256e6adbdb0b5fda45d3e66fd00a6a1f151236d0..e20c992c55312905867bf851ad135e6502134d87 100755 (executable)
@@ -43,7 +43,7 @@ struct vd_node {
        struct list_head        node;\r
        struct list_head        pd_list;\r
        struct list_head        req_volt_list;\r
-       struct mutex            dvfs_mutex;\r
+       //struct mutex          dvfs_mutex;\r
        vd_dvfs_target_callback vd_dvfs_target;\r
 };\r
 \r