if config DM9000 or kpanic, no use mutex_lock
authorhxy <hxy@rock-chips.com>
Wed, 29 Sep 2010 08:00:31 +0000 (16:00 +0800)
committerhxy <hxy@rock-chips.com>
Wed, 29 Sep 2010 08:00:31 +0000 (16:00 +0800)
drivers/mtd/nand/rk2818_nand.c

index 683acfea1d2da3b3c2926869e934365e27b0de40..fe5f320c011f49913d2ef683f0ee26d66f5dca97 100755 (executable)
 /* Define delays in microsec for NAND device operations */
 #define TROP_US_DELAY   2000
 
-static struct mutex  rknand_mutex;
-//static  spinlock_t   rknand_lock;
 
+#ifdef CONFIG_DM9000_USE_NAND_CONTROL
+static DEFINE_MUTEX(rknand_mutex);
+#define RKNAND_LOCK()   do { int panic = in_interrupt() | in_atomic(); if (!panic) mutex_lock(&rknand_mutex); } while (0)
+#define RKNAND_UNLOCK() do { int panic = in_interrupt() | in_atomic(); if (!panic) mutex_unlock(&rknand_mutex); } while (0)
+#else
+#define RKNAND_LOCK()   do {} while (0)
+#define RKNAND_UNLOCK() do {} while (0)
+#endif
 
 struct rk2818_nand_mtd {
        struct mtd_info         mtd;
@@ -213,7 +219,7 @@ static void rk2818_nand_read_buf(struct mtd_info *mtd, u_char* const buf, int le
        pNANDC pRK28NC=  (pNANDC)(master->regs);
        uint32_t  i, chipnr;
         
-       mutex_lock(&rknand_mutex);
+       RKNAND_LOCK();
 
        chipnr = master->cs ;
           
@@ -246,7 +252,7 @@ static void rk2818_nand_read_buf(struct mtd_info *mtd, u_char* const buf, int le
        
        rk2818_nand_select_chip(mtd,-1);
 
-       mutex_unlock(&rknand_mutex);
+       RKNAND_UNLOCK();
 
        
        return; 
@@ -262,7 +268,7 @@ static void rk2818_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int l
        uint32_t  i = 0, chipnr;
           
         
-        mutex_lock(&rknand_mutex);
+        RKNAND_LOCK();
 
         chipnr = master->cs ;
 
@@ -283,7 +289,7 @@ static void rk2818_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int l
          
        rk2818_nand_select_chip(mtd,-1);
          
-         mutex_unlock(&rknand_mutex);
+         RKNAND_UNLOCK();
 
 
 }
@@ -529,7 +535,7 @@ int rk2818_nand_calculate_ecc(struct mtd_info *mtd,const uint8_t *dat,uint8_t *e
        int i,chipnr;
 
           
-       mutex_lock(&rknand_mutex);
+       RKNAND_LOCK();
 
        chipnr = master->cs ;
        
@@ -553,7 +559,7 @@ int rk2818_nand_calculate_ecc(struct mtd_info *mtd,const uint8_t *dat,uint8_t *e
                
        rk2818_nand_select_chip(mtd,-1);
 
-       mutex_unlock(&rknand_mutex);
+       RKNAND_UNLOCK();
        
     return 0;
        
@@ -566,7 +572,7 @@ void  rk2818_nand_write_page(struct mtd_info *mtd,struct nand_chip *chip,const u
        pNANDC pRK28NC=  (pNANDC)(master->regs);
        uint32_t  i = 0, chipnr;
           
-       mutex_lock(&rknand_mutex);
+       RKNAND_LOCK();
 
        chipnr = master->cs ;
           
@@ -594,7 +600,7 @@ void  rk2818_nand_write_page(struct mtd_info *mtd,struct nand_chip *chip,const u
          
         rk2818_nand_select_chip(mtd,-1);
 
-     mutex_unlock(&rknand_mutex);
+     RKNAND_UNLOCK();
        
     return;
          
@@ -613,7 +619,7 @@ int rk2818_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip, int page,
                sndcmd = 0;
        }
 
-       mutex_lock(&rknand_mutex);
+       RKNAND_LOCK();
 
        chipnr = master->cs ;
 
@@ -640,7 +646,7 @@ int rk2818_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip, int page,
           
         rk2818_nand_select_chip(mtd,-1);
 
-        mutex_unlock(&rknand_mutex);
+        RKNAND_UNLOCK();
 
 
        return sndcmd;
@@ -655,7 +661,7 @@ int rk2818_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, uint
        int i,chipnr;
 
        
-    mutex_lock(&rknand_mutex);
+    RKNAND_LOCK();
 
        chipnr = master->cs ;
        
@@ -680,7 +686,7 @@ int rk2818_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, uint
 
         
         rk2818_nand_select_chip(mtd,-1);
-        mutex_unlock(&rknand_mutex);
+        RKNAND_UNLOCK();
 
         
     return 0;
@@ -724,11 +730,11 @@ static int rk2818_nand_setrate(struct rk2818_nand_mtd *info)
        csrw = timingcfg/4;
        rwcs = (timingcfg/4 >=1)?(timingcfg/4):1;
 
-       mutex_lock(&rknand_mutex);
+       RKNAND_LOCK();
 
        pRK28NC ->FMWAIT |=  (rwcs<<FMW_RWCS_OFFSET)|(rwpw<<FMW_RWPW_OFFSET)|(csrw<<FMW_CSRW_OFFSET);
 
-       mutex_unlock(&rknand_mutex);
+       RKNAND_UNLOCK();
 
 
        return 0;
@@ -854,7 +860,6 @@ static int rk2818_nand_probe(struct platform_device *pdev)
        }
 
 
-       mutex_init(&rknand_mutex);
 
        master->clk = clk_get(NULL, "nandc");
 
@@ -1045,7 +1050,7 @@ static void __exit rk2818_nand_exit(void)
        platform_driver_unregister(&rk2818_nand_driver);
 }
 
-
+#ifdef CONFIG_DM9000_USE_NAND_CONTROL
 // nandc dma cs mutex for dm9000 interface
 void rk2818_nand_status_mutex_lock(void)
 {
@@ -1072,6 +1077,7 @@ void rk2818_nand_status_mutex_unlock(void)
      mutex_unlock(&rknand_mutex);
      return;
 }
+#endif
 
 module_init(rk2818_nand_init);
 module_exit(rk2818_nand_exit);