Nand Driver:Add clk config.
authorzhaoyifeng <zyf@rock-chips.com>
Sat, 31 Mar 2012 10:28:45 +0000 (18:28 +0800)
committerzhaoyifeng <zyf@rock-chips.com>
Sat, 31 Mar 2012 10:28:45 +0000 (18:28 +0800)
drivers/mtd/rknand/rknand_base_ko.c

index 0afad0d4fc8ad4fc14d686df80a71b1ee8f337ae..bdd0dec451c7f19652670dd27450da79b58ed98a 100755 (executable)
@@ -22,6 +22,8 @@
 #include <asm/mach/flash.h>\r
 //#include "api_flash.h"\r
 #include "rknand_base.h"\r
+#include <linux/clk.h>\r
+#include <linux/cpufreq.h>\r
 \r
 #define DRIVER_NAME    "rk29xxnand"\r
 \r
@@ -305,6 +307,56 @@ static int rknand_block_markbad(struct mtd_info *mtd, loff_t ofs)
        return 0;\r
 }\r
 \r
+\r
+static struct clk                      *nandc_clk;\r
+static unsigned long            nandc_clk_rate = 0;\r
+static struct notifier_block   nandc_freq_transition;\r
+/* cpufreq driver support */\r
+static int rknand_nand_timing_cfg(void)\r
+{\r
+       unsigned long newclk;\r
+       newclk = clk_get_rate(nandc_clk);\r
+       printk("rknand_nand_timing_cfg %d",newclk);\r
+       if (newclk != nandc_clk_rate) \r
+       {\r
+        if(gpNandInfo->nand_timing_config)\r
+        {\r
+            nandc_clk_rate = newclk;\r
+            //gpNandInfo->nand_timing_config( nandc_clk_rate / 1000); // KHz\r
+        }\r
+       }\r
+       return 0;\r
+}\r
+\r
+#ifdef CONFIG_CPU_FREQ\r
+static int rknand_cpufreq_transition(struct notifier_block *nb, unsigned long val, void *data)\r
+{\r
+    if(val == CPUFREQ_POSTCHANGE)\r
+        rknand_nand_timing_cfg();\r
+       return 0;\r
+}\r
+\r
+static inline int rknand_cpufreq_register(void)\r
+{\r
+       nandc_freq_transition.notifier_call = rknand_cpufreq_transition;\r
+       return cpufreq_register_notifier(&nandc_freq_transition, CPUFREQ_TRANSITION_NOTIFIER);\r
+}\r
+\r
+static inline void rknand_cpufreq_deregister(void)\r
+{\r
+       cpufreq_unregister_notifier(&nandc_freq_transition, CPUFREQ_TRANSITION_NOTIFIER);\r
+}\r
+#else\r
+static inline int rknand_cpufreq_register(void)\r
+{\r
+       return 0;\r
+}\r
+\r
+static inline void rknand_cpufreq_deregister(void)\r
+{\r
+}\r
+#endif\r
+\r
 static int rknand_info_init(struct rknand_info *nand_info)\r
 {\r
        struct mtd_info    *mtd = &rknand_mtd;\r
@@ -408,10 +460,12 @@ int add_rknand_device(struct rknand_info * prknand_Info)
     }\r
        if(SysImageWriteEndAdd)\r
        gpNandInfo->SysImageWriteEndAdd = SysImageWriteEndAdd;\r
-    \r
-    //if(gpNandInfo->nand_timing_config)\r
-    //    gpNandInfo->nand_timing_config(100*1000);\r
-        \r
+\r
+       nandc_clk = clk_get(NULL, "nandc");\r
+       clk_enable(nandc_clk);\r
+    rknand_cpufreq_register();\r
+    rknand_nand_timing_cfg();\r
+\r
     return 0;\r
 }\r
 \r