pm_tests: rockchip: add pvtm test
authorXiao Feng <xf@rock-chips.com>
Wed, 24 Jun 2015 11:36:56 +0000 (19:36 +0800)
committerXiao Feng <xf@rock-chips.com>
Wed, 24 Jun 2015 11:41:53 +0000 (19:41 +0800)
Signed-off-by: Xiao Feng <xf@rock-chips.com>
arch/arm/mach-rockchip/rk_pm_tests/pvtm_test.c

index 8fa7ca080ddb13e02fc8a3971d08dd83604e83ea..926c1e0061d59f648d1b12ad76aceff91b171a29 100644 (file)
@@ -394,15 +394,116 @@ void scale_min_pvtm_fix_rate(void)
 }
 
 #endif
+
+void scale_pvtm_fix_freq(void)
+{
+       struct regulator *regulator_arm;
+       struct clk *clk_core_b, *clk_core_l;
+       unsigned long rate;
+       u32 pvtm, old_pvtm = 0;
+       int volt, ret = 0;
+
+       regulator_arm = regulator_get(NULL, "vdd_arm");
+       if (IS_ERR_OR_NULL(regulator_arm)) {
+               pr_info("get regulator err\n");
+               return;
+       }
+
+       clk_core_b = clk_get(NULL, "clk_core_b");
+       if (IS_ERR_OR_NULL(clk_core_b)) {
+               pr_info("get clk err\n");
+               return;
+       }
+       clk_core_l = clk_get(NULL, "clk_core_l");
+       if (IS_ERR_OR_NULL(clk_core_l)) {
+               pr_info("get clk err\n");
+               return;
+       }
+
+       volt = 1300000;
+       rate = 216000000;
+       ret = regulator_set_voltage(regulator_arm, volt, volt);
+       if (ret)
+               pr_err("set volt(%d) err:%d\n", volt, ret);
+
+       do {
+               clk_set_rate(clk_core_b, rate);
+               clk_set_rate(clk_core_l, rate);
+               mdelay(500);
+               pvtm = pvtm_get_value(0, 1000);
+               if (!old_pvtm)
+                       old_pvtm = pvtm;
+               pr_info("%d %lu %d %d\n",
+                       volt, clk_get_rate(clk_core_b), pvtm, old_pvtm-pvtm);
+
+               old_pvtm = pvtm;
+               rate += 48000000;
+               if (rate > 1200000000)
+                       break;
+       } while (1);
+}
+
+void scale_pvtm_fix_volt(void)
+{
+       struct regulator *regulator_arm;
+       struct clk *clk_core_b, *clk_core_l;
+       unsigned long rate;
+       u32 pvtm, old_pvtm = 0;
+       int volt, ret = 0;
+
+       regulator_arm = regulator_get(NULL, "vdd_arm");
+       if (IS_ERR_OR_NULL(regulator_arm)) {
+               pr_info("get regulator err\n");
+               return;
+       }
+
+       clk_core_b = clk_get(NULL, "clk_core_b");
+       if (IS_ERR_OR_NULL(clk_core_b)) {
+               pr_info("get clk err\n");
+               return;
+       }
+
+       clk_core_l = clk_get(NULL, "clk_core_b");
+       if (IS_ERR_OR_NULL(clk_core_l)) {
+               pr_info("get clk err\n");
+               return;
+       }
+
+       volt = 1300000;
+       rate = 816000000;
+
+       ret = regulator_set_voltage(regulator_arm, volt, volt);
+       if (ret)
+               pr_err("set volt(%d) err:%d\n", volt, ret);
+
+       ret = clk_set_rate(clk_core_b, rate);
+       ret = clk_set_rate(clk_core_l, rate);
+       do {
+               regulator_set_voltage(regulator_arm, volt, volt);
+               mdelay(500);
+               pvtm = pvtm_get_value(0, 1000);
+               if (!old_pvtm)
+                       old_pvtm = pvtm;
+
+               pr_info("%d %lu %d %d\n",
+                       volt, clk_get_rate(clk_core_b), pvtm, old_pvtm-pvtm);
+               old_pvtm = pvtm;
+               volt -= 12500;
+               if (volt < 950000) {
+                       regulator_set_voltage(regulator_arm, 1300000, 1300000);
+                       break;
+               }
+       } while (1);
+}
+
 ssize_t pvtm_show(struct kobject *kobj, struct kobj_attribute *attr,
                  char *buf)
 {
        char *str = buf;
 
-       str += sprintf(str, "core:%d\ngpu:%d\nlogic:%d\n",
+       str += sprintf(str, "core:%d\ngpu:%d\n",
                pvtm_get_value(0, 1000),
-               pvtm_get_value(1, 1000),
-               pvtm_get_value(2, 1000));
+               pvtm_get_value(1, 1000));
        return (str - buf);
 }