add mutex_lock between nandc and dm9000,use mutex_lock replace some mutex_trylock...
author刘益星 <lyx@rock-chips.com>
Sat, 29 May 2010 03:39:53 +0000 (03:39 +0000)
committer黄涛 <huangtao@rock-chips.com>
Mon, 21 Jun 2010 05:35:19 +0000 (13:35 +0800)
.config
drivers/mtd/nand/rk2818_nand.c
drivers/net/dm9000.c

diff --git a/.config b/.config
index 231d8c09276177a9c79e7bf26fed28993d457c99..28bb46d1d9f549a721527285f412171b27405871 100644 (file)
--- a/.config
+++ b/.config
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.32.9
-# Wed May 19 19:32:08 2010
+# Fri May 28 08:07:09 2010
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -591,7 +591,7 @@ CONFIG_MII=y
 # CONFIG_SMC91X is not set
 CONFIG_DM9000=y
 CONFIG_DM9000_DEBUGLEVEL=4
-# CONFIG_DM9000_USE_NAND_CONTROL is not set
+CONFIG_DM9000_USE_NAND_CONTROL=y
 # CONFIG_DM9000_USE_NOR_CONTROL is not set
 # CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set
 # CONFIG_ENC28J60 is not set
index 19e65f0a77bdebdea333c0eccc933953fddf4f52..31a9cb8f2a03d034e8ef15507dca81982d5c2b99 100644 (file)
@@ -1007,6 +1007,14 @@ static void __exit rk2818_nand_exit(void)
 
 
 // nandc dma cs mutex for dm9000 interface
+void rk2818_nand_status_mutex_lock(void)
+{
+     pNANDC pRK28NC=  (pNANDC)RK2818_NANDC_BASE;
+     mutex_lock(&rknand_mutex);
+     pRK28NC->FMCTL &=0xffffff00;   // release chip select
+
+}
+
 int rk2818_nand_status_mutex_trylock(void)
 {
      pNANDC pRK28NC=  (pNANDC)RK2818_NANDC_BASE;
index 1b0bb74a2e660b6fb0a29c16972228a89f89b66a..701599ac4c420404a02a366416a6b0b9245f8563 100644 (file)
@@ -148,9 +148,11 @@ typedef struct board_info {
 } while (0)
 
 #ifdef CONFIG_DM9000_USE_NAND_CONTROL
+extern void rk2818_nand_status_mutex_lock(void);
 extern int rk2818_nand_status_mutex_trylock(void);
 extern void rk2818_nand_status_mutex_unlock(void);
 #else
+static void rk2818_nand_status_mutex_lock(void){return;}
 static int rk2818_nand_status_mutex_trylock(void) {return 1;}
 static void rk2818_nand_status_mutex_unlock(void) {return;}
 #endif
@@ -322,8 +324,7 @@ dm9000_read_locked(board_info_t *db, int reg)
        unsigned long flags;
        unsigned int ret;
        
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock, flags);    
        ret = ior(db, reg);
@@ -383,8 +384,7 @@ dm9000_read_eeprom(board_info_t *db, int offset, u8 *to)
 
        mutex_lock(&db->addr_lock);
        
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock, flags);
                
@@ -400,8 +400,7 @@ dm9000_read_eeprom(board_info_t *db, int offset, u8 *to)
        /* delay for at-least 150uS */
        msleep(1);
        
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock, flags);
        
@@ -430,8 +429,7 @@ dm9000_write_eeprom(board_info_t *db, int offset, u8 *data)
 
        mutex_lock(&db->addr_lock);
        
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock, flags);    
        iow(db, DM9000_EPAR, offset);
@@ -446,8 +444,7 @@ dm9000_write_eeprom(board_info_t *db, int offset, u8 *data)
 
        mdelay(1);      /* wait at least 150uS to clear */
        
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock, flags);
        iow(db, DM9000_EPCR, 0);
@@ -519,8 +516,7 @@ static int dm9000_set_rx_csum(struct net_device *dev, uint32_t data)
        if (dm->can_csum) {
                dm->rx_csum = data;
 
-               while(!rk2818_nand_status_mutex_trylock())
-                       dev_dbg(dm->dev, "fun:%s, nand busy\n", __func__);
+               rk2818_nand_status_mutex_lock();
                
                spin_lock_irqsave(&dm->lock, flags);
                iow(dm, DM9000_RCSR, dm->rx_csum ? RCSR_CSUM : 0);
@@ -724,8 +720,7 @@ dm9000_hash_table(struct net_device *dev)
 
        dm9000_dbg(db, 1, "entering %s\n", __func__);
        
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock, flags);
        
@@ -825,8 +820,7 @@ static void dm9000_timeout(struct net_device *dev)
        /* Save previous register address */
        reg_save = readb(db->io_addr);
        
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
        
        spin_lock_irqsave(&db->lock, flags);
 
@@ -1073,8 +1067,7 @@ static void dm9000_interrupt_work(struct work_struct *work)
 
        /* holders of db->lock must always block IRQs */
        
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
        
        spin_lock_irqsave(&db->lock, flags);
 
@@ -1270,8 +1263,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
 
        mutex_lock(&db->addr_lock);
 
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock,flags);
        
@@ -1290,8 +1282,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
 
        dm9000_msleep(db, 1);           /* Wait read complete */
 
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock,flags);
        
@@ -1328,8 +1319,7 @@ dm9000_phy_write(struct net_device *dev,
        dm9000_dbg(db, 5, "phy_write[%02x] = %04x\n", reg, value);
        mutex_lock(&db->addr_lock);
 
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock,flags);
        
@@ -1352,8 +1342,7 @@ dm9000_phy_write(struct net_device *dev,
 
        dm9000_msleep(db, 1);           /* Wait write complete */
 
-       while(!rk2818_nand_status_mutex_trylock())
-               dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+       rk2818_nand_status_mutex_lock();
 
        spin_lock_irqsave(&db->lock,flags);