rk: dvfs fix round bug
authorchenxing <chenxing@rock-chips.com>
Sat, 4 May 2013 09:07:05 +0000 (17:07 +0800)
committerchenxing <chenxing@rock-chips.com>
Sat, 4 May 2013 09:08:31 +0000 (17:08 +0800)
arch/arm/plat-rk/dvfs.c

index e7c6d6953147f9ec30eb3f38687ed6c0d0035610..d8afde4b261da567bd9d4816dfdc7b680c99f577 100644 (file)
@@ -27,7 +27,7 @@
 #include <linux/io.h>\r
 #include <linux/hrtimer.h>\r
 \r
-\r
+#define MHz    (1000 * 1000)\r
 static LIST_HEAD(rk_dvfs_tree);\r
 static DEFINE_MUTEX(mutex);\r
 static DEFINE_MUTEX(rk_dvfs_mutex);\r
@@ -338,7 +338,7 @@ int dvfs_vd_clk_disable(struct clk *clk, int on)
                DVFS_WARNING("%s(%s),vd is no target callback\n", __func__, clk->name); \r
                return -1;\r
        }\r
-       DVFS_DBG("%s(%s(%lu)),is end\n", __func__, dvfs_info->name, DVFS_STR_ON(on));\r
+       DVFS_DBG("%s(%s(%s)),is end\n", __func__, dvfs_info->name, DVFS_STR_DISABLE(on));\r
 \r
        return ret;\r
 }\r
@@ -348,7 +348,7 @@ EXPORT_SYMBOL(dvfs_vd_clk_disable);
 static void dvfs_table_round_clk_rate(struct clk_node  *dvfs_clk)\r
 {\r
        int i;\r
-       long temp_rate;\r
+       unsigned long temp_rate;\r
        int rate;\r
        int flags;\r
        \r
@@ -366,7 +366,12 @@ static void dvfs_table_round_clk_rate(struct clk_node  *dvfs_clk)
                        DVFS_WARNING("clk %s:round_clk_rate : is %d,but round <=0",dvfs_clk->name,dvfs_clk->dvfs_table[i].frequency);\r
                        break;\r
                }\r
-               temp_rate=(temp_rate/1000)+flags;\r
+               \r
+               /* Set rate unit as MHZ */\r
+               if (temp_rate % MHz != 0)\r
+                       temp_rate = (temp_rate / MHz + 1) * MHz;\r
+\r
+               temp_rate = (temp_rate / 1000) + flags;\r
                \r
                DVFS_DBG("clk %s round_clk_rate %d to %d\n",\r
                        dvfs_clk->name,dvfs_clk->dvfs_table[i].frequency,(int)(temp_rate));\r