davinci_nand chipselect/init cleanup
authorDavid Brownell <dbrownell@users.sourceforge.net>
Sun, 10 May 2009 22:43:01 +0000 (15:43 -0700)
committerScott Wood <scottwood@freescale.com>
Tue, 7 Jul 2009 22:58:03 +0000 (17:58 -0500)
Update chipselect handling in davinci_nand.c so that it can
handle 2 GByte chips the same way Linux does:  as one device,
even though it has two halves with independent chip selects.
For such chips the "nand info" command reports:

  Device 0: 2x nand0, sector size 128 KiB

Switch to use the default chipselect function unless the board
really needs its own.  The logic for the Sonata board moves out
of the driver into board-specific code.  (Which doesn't affect
current build breakage if its NAND support is enabled...)

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Scott Wood <scottwood@freescale.com>
board/davinci/sonata/sonata.c
drivers/mtd/nand/davinci_nand.c
include/asm-arm/arch-davinci/nand_defs.h

index 7f9d9bba3dc045c0171976dc224f9f6650d039f3..817970aeaa8f3a4f2a2a0cc30c88f759ad41f2bb 100644 (file)
@@ -25,6 +25,8 @@
  */
 
 #include <common.h>
+#include <nand.h>
+#include <asm/arch/nand_defs.h>
 #include <asm/arch/hardware.h>
 #include "../common/misc.h"
 
@@ -72,3 +74,29 @@ int misc_init_r(void)
 
        return(0);
 }
+
+#ifdef CONFIG_NAND_DAVINCI
+
+/* Set WP on deselect, write enable on select */
+static void nand_sonata_select_chip(struct mtd_info *mtd, int chip)
+{
+#define GPIO_SET_DATA01        0x01c67018
+#define GPIO_CLR_DATA01        0x01c6701c
+#define GPIO_NAND_WP   (1 << 4)
+#ifdef SONATA_BOARD_GPIOWP
+       if (chip < 0) {
+               REG(GPIO_CLR_DATA01) |= GPIO_NAND_WP;
+       } else {
+               REG(GPIO_SET_DATA01) |= GPIO_NAND_WP;
+       }
+#endif
+}
+
+int board_nand_init(struct nand_chip *nand)
+{
+       davinci_nand_init(nand);
+       nand->select_chip = nand_sonata_select_chip;
+       return 0;
+}
+
+#endif /* CONFIG_NAND_DAVINCI */
index 9e7b9dd9b155b0770585f76d08b6862ca41ede5c..ca40c6ac0977fe214cbbe4c2763c821d6804dc1c 100644 (file)
@@ -47,8 +47,6 @@
 #include <asm/arch/nand_defs.h>
 #include <asm/arch/emif_defs.h>
 
-extern struct nand_chip nand_dev_desc[CONFIG_SYS_MAX_NAND_DEVICE];
-
 static emif_registers *const emif_regs = (void *) DAVINCI_ASYNC_EMIF_CNTRL_BASE;
 
 static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
@@ -70,21 +68,6 @@ static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int c
                writeb(cmd, this->IO_ADDR_W);
 }
 
-/* Set WP on deselect, write enable on select */
-static void nand_davinci_select_chip(struct mtd_info *mtd, int chip)
-{
-#define GPIO_SET_DATA01        0x01c67018
-#define GPIO_CLR_DATA01        0x01c6701c
-#define GPIO_NAND_WP   (1 << 4)
-#ifdef SONATA_BOARD_GPIOWP
-       if (chip < 0) {
-               REG(GPIO_CLR_DATA01) |= GPIO_NAND_WP;
-       } else {
-               REG(GPIO_SET_DATA01) |= GPIO_NAND_WP;
-       }
-#endif
-}
-
 #ifdef CONFIG_SYS_NAND_HW_ECC
 
 static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
@@ -228,10 +211,9 @@ static void nand_flash_init(void)
 #endif
 }
 
-int board_nand_init(struct nand_chip *nand)
+void davinci_nand_init(struct nand_chip *nand)
 {
        nand->chip_delay  = 0;
-       nand->select_chip = nand_davinci_select_chip;
 #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
        nand->options     = NAND_USE_FLASH_BBT;
 #endif
@@ -252,6 +234,12 @@ int board_nand_init(struct nand_chip *nand)
        nand->dev_ready = nand_davinci_dev_ready;
 
        nand_flash_init();
+}
 
-       return(0);
+int board_nand_init(struct nand_chip *chip) __attribute__((weak));
+
+int board_nand_init(struct nand_chip *chip)
+{
+       davinci_nand_init(chip);
+       return 0;
 }
index f2020728d6b8109490cf42ded5bac9897f934767..386540e418b95ac8a11bccf2a44b2f4ec6745492 100644 (file)
@@ -40,4 +40,6 @@
 #define NAND_READ_END          0x30
 #define NAND_STATUS            0x70
 
+extern void davinci_nand_init(struct nand_chip *nand);
+
 #endif