nand:add suspend and resume function.
authorZhaoyifeng <zyf@rock-chips.com>
Fri, 20 Jul 2012 09:05:53 +0000 (17:05 +0800)
committerZhaoyifeng <zyf@rock-chips.com>
Fri, 20 Jul 2012 09:05:53 +0000 (17:05 +0800)
drivers/mtd/rknand/rknand_base.h
drivers/mtd/rknand/rknand_base_ko.c

index e74761a8a32326a7d642514db66e4683e53f258c..b7fa95ab0b844dedbb3d39a7194303bfd42067ae 100755 (executable)
@@ -70,6 +70,8 @@ struct rknand_info {
     int emmc_clk_power_save_en;\r
     char *pdmaBuf;\r
     void (*nand_timing_config)(unsigned long AHBnKHz);\r
+    void (*rknand_suspend)(void);\r
+    void (*rknand_resume)(void);\r
     int reserved[20];\r
 };\r
 \r
index 7043d2d68734badb5c5e3fec4c6b84b7623dc984..ea49e277ea8a58ed4993102d45c152fc9ff74516 100755 (executable)
 //#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
-const char rknand_base_version[] = "rknand_base.c version: 4.34 20120401";\r
+const char rknand_base_version[] = "rknand_base.c version: 4.38 20120717";\r
 #define NAND_DEBUG_LEVEL0 0\r
 #define NAND_DEBUG_LEVEL1 1\r
 #define NAND_DEBUG_LEVEL2 2\r
@@ -67,10 +68,23 @@ static char grknand_trac_buf[MAX_TRAC_BUFFER_SIZE];
 static char *ptrac_buf = grknand_trac_buf;\r
 void trac_log(long lba,int len, int mod)\r
 {\r
+       unsigned long long t;\r
+    unsigned long nanosec_rem;\r
+    t = cpu_clock(UINT_MAX);\r
+    nanosec_rem = do_div(t, 1000000000);\r
     if(mod)\r
-        ptrac_buf += sprintf(ptrac_buf,"W %d %d \n",lba,len);\r
+        ptrac_buf += sprintf(ptrac_buf,"[%5lu.%06lu] W %d %d \n",(unsigned long) t, nanosec_rem / 1000,lba,len);\r
     else\r
-        ptrac_buf += sprintf(ptrac_buf,"R %d %d \n",lba,len);\r
+        ptrac_buf += sprintf(ptrac_buf,"[%5lu.%06lu] R %d %d \n",(unsigned long) t, nanosec_rem / 1000,lba,len);\r
+}\r
+\r
+void trac_logs(char *s)\r
+{\r
+       unsigned long long t;\r
+    unsigned long nanosec_rem;\r
+    t = cpu_clock(UINT_MAX);\r
+    nanosec_rem = do_div(t, 1000000000);\r
+       ptrac_buf += sprintf(ptrac_buf,"[%5lu.%06lu] %s\n",(unsigned long) t, nanosec_rem / 1000,s);\r
 }\r
 \r
 static int rkNand_trac_read(char *page, char **start, off_t off, int count, int *eof,\r
@@ -80,7 +94,7 @@ static int rkNand_trac_read(char *page, char **start, off_t off, int count, int
        int len;\r
 \r
         len = ptrac_buf - grknand_trac_buf - off;\r
-     printk("rkNand_trac_read: page=%x,off=%x,count=%x ,len=%x \n",(int)page,(int)off,count,len);\r
+     //printk("rkNand_trac_read: page=%x,off=%x,count=%x ,len=%x \n",(int)page,(int)off,count,len);\r
 \r
        if (len < 0)\r
                len = 0;\r
@@ -321,7 +335,7 @@ static int rknand_nand_timing_cfg(void)
         if(gpNandInfo->nand_timing_config)\r
         {\r
             nandc_clk_rate = newclk;\r
-            gpNandInfo->nand_timing_config( nandc_clk_rate / 1000); // KHz\r
+            //gpNandInfo->nand_timing_config( nandc_clk_rate / 1000); // KHz\r
         }\r
        }\r
        return 0;\r
@@ -493,12 +507,16 @@ exit_free:
 static int rknand_suspend(struct platform_device *pdev, pm_message_t state)\r
 {\r
     gpNandInfo->rknand.rknand_schedule_enable = 0;\r
+    if(gpNandInfo->rknand_suspend)\r
+        gpNandInfo->rknand_suspend();  \r
        NAND_DEBUG(NAND_DEBUG_LEVEL0,"rknand_suspend: \n");\r
        return 0;\r
 }\r
 \r
 static int rknand_resume(struct platform_device *pdev)\r
 {\r
+    if(gpNandInfo->rknand_resume)\r
+       gpNandInfo->rknand_resume();  \r
     gpNandInfo->rknand.rknand_schedule_enable = 1;\r
        NAND_DEBUG(NAND_DEBUG_LEVEL0,"rknand_resume: \n");\r
        return 0;\r