/* 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;
pNANDC pRK28NC= (pNANDC)(master->regs);
uint32_t i, chipnr;
- mutex_lock(&rknand_mutex);
+ RKNAND_LOCK();
chipnr = master->cs ;
rk2818_nand_select_chip(mtd,-1);
- mutex_unlock(&rknand_mutex);
+ RKNAND_UNLOCK();
return;
uint32_t i = 0, chipnr;
- mutex_lock(&rknand_mutex);
+ RKNAND_LOCK();
chipnr = master->cs ;
rk2818_nand_select_chip(mtd,-1);
- mutex_unlock(&rknand_mutex);
+ RKNAND_UNLOCK();
}
int i,chipnr;
- mutex_lock(&rknand_mutex);
+ RKNAND_LOCK();
chipnr = master->cs ;
rk2818_nand_select_chip(mtd,-1);
- mutex_unlock(&rknand_mutex);
+ RKNAND_UNLOCK();
return 0;
pNANDC pRK28NC= (pNANDC)(master->regs);
uint32_t i = 0, chipnr;
- mutex_lock(&rknand_mutex);
+ RKNAND_LOCK();
chipnr = master->cs ;
rk2818_nand_select_chip(mtd,-1);
- mutex_unlock(&rknand_mutex);
+ RKNAND_UNLOCK();
return;
sndcmd = 0;
}
- mutex_lock(&rknand_mutex);
+ RKNAND_LOCK();
chipnr = master->cs ;
rk2818_nand_select_chip(mtd,-1);
- mutex_unlock(&rknand_mutex);
+ RKNAND_UNLOCK();
return sndcmd;
int i,chipnr;
- mutex_lock(&rknand_mutex);
+ RKNAND_LOCK();
chipnr = master->cs ;
rk2818_nand_select_chip(mtd,-1);
- mutex_unlock(&rknand_mutex);
+ RKNAND_UNLOCK();
return 0;
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;
}
- mutex_init(&rknand_mutex);
master->clk = clk_get(NULL, "nandc");
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)
{
mutex_unlock(&rknand_mutex);
return;
}
+#endif
module_init(rk2818_nand_init);
module_exit(rk2818_nand_exit);