Nand driver: Fix RK3288 supend issue.
authorZhaoyifeng <zyf@rock-chips.com>
Fri, 22 Aug 2014 07:40:14 +0000 (15:40 +0800)
committerZhaoyifeng <zyf@rock-chips.com>
Fri, 22 Aug 2014 07:57:56 +0000 (15:57 +0800)
         issue: rk3288 have two nandc,and driver add two nandc devices
               but with one  mutex signal. The suspend function will be call twice,and crash.
         Fix  : Modify function rknand_suspend,rknand_resume and rknand_shutdown to Fix it.

arch/arm/mach-rockchip/rknandbase.c

index f70cdcaa047d3bd3c98b87efd820b8cd6931f64e..24d43619aa6df7f4c0dfd8247fc0c0c227b844d1 100755 (executable)
@@ -22,7 +22,9 @@ struct rknand_info {
     int tag;\r
     int enable;\r
     int clk_rate[2];\r
-    int reserved0[8];\r
+    int nand_suspend_state;\r
+    int nand_shutdown_state;\r
+    int reserved0[6];\r
     \r
     void (*rknand_suspend)(void);\r
     void (*rknand_resume)(void);\r
@@ -201,6 +203,8 @@ static int rknand_probe(struct platform_device *pdev)
         gpNandInfo = kzalloc(sizeof(struct rknand_info), GFP_KERNEL);\r
         if (!gpNandInfo)\r
             return -ENOMEM;\r
+        gpNandInfo->nand_suspend_state = 0;\r
+        gpNandInfo->nand_shutdown_state = 0;\r
        }\r
        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
        membase = devm_request_and_ioremap(&pdev->dev, mem);\r
@@ -260,8 +264,8 @@ static int rknand_probe(struct platform_device *pdev)
 \r
 static int rknand_suspend(struct platform_device *pdev, pm_message_t state)\r
 {\r
-    if(gpNandInfo->rknand_suspend)\r
-    {\r
+    if(gpNandInfo->rknand_suspend  && gpNandInfo->nand_suspend_state == 0){\r
+       gpNandInfo->nand_suspend_state = 1;\r
         gpNandInfo->rknand_suspend();\r
         //TODO:nandc clk disable\r
        }\r
@@ -270,8 +274,8 @@ static int rknand_suspend(struct platform_device *pdev, pm_message_t state)
 \r
 static int rknand_resume(struct platform_device *pdev)\r
 {\r
-    if(gpNandInfo->rknand_resume)\r
-    {\r
+    if(gpNandInfo->rknand_resume && gpNandInfo->nand_suspend_state == 1){\r
+       gpNandInfo->nand_suspend_state = 0;\r
        //TODO:nandc clk enable\r
        gpNandInfo->rknand_resume();  \r
        }\r
@@ -280,8 +284,10 @@ static int rknand_resume(struct platform_device *pdev)
 \r
 static void rknand_shutdown(struct platform_device *pdev)\r
 {\r
-    if(gpNandInfo->rknand_buffer_shutdown)\r
-        gpNandInfo->rknand_buffer_shutdown();    \r
+    if(gpNandInfo->rknand_buffer_shutdown && gpNandInfo->nand_shutdown_state == 0){\r
+        gpNandInfo->nand_shutdown_state = 1;\r
+        gpNandInfo->rknand_buffer_shutdown();\r
+    }\r
 }\r
 \r
 void rknand_dev_cache_flush(void)\r