Merge branch 'next' of git://git.denx.de/u-boot-avr32
[platform/kernel/u-boot.git] / board / dave / PPChameleonEVB / nand.c
index 16c67cd..3ccbf65 100644 (file)
  */
 
 #include <common.h>
+#include <asm/io.h>
 
-#if (CONFIG_COMMANDS & CFG_CMD_NAND)
-#ifdef CONFIG_NEW_NAND_CODE
-/* new NAND handling */
+#if defined(CONFIG_CMD_NAND)
 
 #include <nand.h>
 
  * hardware specific access to control-lines
  * function borrowed from Linux 2.6 (drivers/mtd/nand/ppchameleonevb.c)
  */
-static void ppchameleonevb_hwcontrol(struct mtd_info *mtdinfo, int cmd)
+static void ppchameleonevb_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
 {
-       struct nand_chip *this = mtdinfo->priv;
+       struct nand_chip *this = mtd->priv;
        ulong base = (ulong) this->IO_ADDR_W;
 
-       switch(cmd) {
-       case NAND_CTL_SETCLE:
-               MACRO_NAND_CTL_SETCLE((unsigned long)base);
-               break;
-       case NAND_CTL_CLRCLE:
-               MACRO_NAND_CTL_CLRCLE((unsigned long)base);
-               break;
-       case NAND_CTL_SETALE:
-               MACRO_NAND_CTL_SETALE((unsigned long)base);
-               break;
-       case NAND_CTL_CLRALE:
-               MACRO_NAND_CTL_CLRALE((unsigned long)base);
-               break;
-       case NAND_CTL_SETNCE:
-               MACRO_NAND_ENABLE_CE((unsigned long)base);
-               break;
-       case NAND_CTL_CLRNCE:
-               MACRO_NAND_DISABLE_CE((unsigned long)base);
-               break;
+       if (ctrl & NAND_CTRL_CHANGE) {
+               if ( ctrl & NAND_CLE )
+                       MACRO_NAND_CTL_SETCLE((unsigned long)base);
+               else
+                       MACRO_NAND_CTL_CLRCLE((unsigned long)base);
+               if ( ctrl & NAND_ALE )
+                       MACRO_NAND_CTL_CLRCLE((unsigned long)base);
+               else
+                       MACRO_NAND_CTL_CLRALE((unsigned long)base);
+               if ( ctrl & NAND_NCE )
+                       MACRO_NAND_ENABLE_CE((unsigned long)base);
+               else
+                       MACRO_NAND_DISABLE_CE((unsigned long)base);
        }
+
+       if (cmd != NAND_CMD_NONE)
+               writeb(cmd, this->IO_ADDR_W);
 }
 
 
@@ -82,7 +78,7 @@ static int ppchameleonevb_device_ready(struct mtd_info *mtdinfo)
                break;
        }
 
-        if (in32(GPIO0_IR) & rb_gpio_pin)
+       if (in32(GPIO0_IR) & rb_gpio_pin)
                return 1;
        return 0;
 }
@@ -90,14 +86,14 @@ static int ppchameleonevb_device_ready(struct mtd_info *mtdinfo)
 
 /*
  * Board-specific NAND initialization. The following members of the
- * argument are board-specific (per include/linux/mtd/nand_new.h):
+ * argument are board-specific (per include/linux/mtd/nand.h):
  * - IO_ADDR_R?: address to read the 8 I/O lines of the flash device
  * - IO_ADDR_W?: address to write the 8 I/O lines of the flash device
- * - hwcontrol: hardwarespecific function for accesing control-lines
+ * - cmd_ctrl: hardwarespecific function for accesing control-lines
  * - dev_ready: hardwarespecific function for  accesing device ready/busy line
  * - enable_hwecc?: function to enable (reset)  hardware ecc generator. Must
  *   only be provided if a hardware ECC is available
- * - eccmode: mode of ecc, see defines
+ * - ecc.mode: mode of ecc, see defines
  * - chip_delay: chip dependent delay for transfering data from array to
  *   read regs (tR)
  * - options: various chip options. They can partly be set to inform
@@ -106,42 +102,14 @@ static int ppchameleonevb_device_ready(struct mtd_info *mtdinfo)
  * Members with a "?" were not set in the merged testing-NAND branch,
  * so they are not set here either.
  */
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
 
-       nand->hwcontrol = ppchameleonevb_hwcontrol;
+       nand->cmd_ctrl = ppchameleonevb_hwcontrol;
        nand->dev_ready = ppchameleonevb_device_ready;
-       nand->eccmode = NAND_ECC_SOFT;
+       nand->ecc.mode = NAND_ECC_SOFT;
        nand->chip_delay = NAND_BIG_DELAY_US;
        nand->options = NAND_SAMSUNG_LP_OPTIONS;
+       return 0;
 }
-
-#else
-
-/* old NAND handling */
-extern ulong
-nand_probe(ulong physadr);
-
-void
-nand_init(void)
-{
-       ulong totlen = 0;
-
-/*
-       The HI model is equipped with a large block NAND chip not supported yet
-       by U-Boot
-    (CONFIG_PPCHAMELEON_MODULE_MODEL == CONFIG_PPCHAMELEON_MODULE_HI)
-*/
-
-#if (CONFIG_PPCHAMELEON_MODULE_MODEL == CONFIG_PPCHAMELEON_MODULE_ME)
-       debug ("Probing at 0x%.8x\n", CFG_NAND0_BASE);
-       totlen += nand_probe (CFG_NAND0_BASE);
-#endif /* CONFIG_PPCHAMELEON_MODULE_ME, CONFIG_PPCHAMELEON_MODULE_HI */
-
-       debug ("Probing at 0x%.8x\n", CFG_NAND1_BASE);
-       totlen += nand_probe (CFG_NAND1_BASE);
-
-       printf ("%3lu MB\n", totlen >>20);
-}
-#endif
 #endif