mtd: nand: mxc_nand: Fix is_16bit_nand()
authorFabio Estevam <fabio.estevam@freescale.com>
Thu, 11 Apr 2013 09:35:35 +0000 (09:35 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Fri, 12 Apr 2013 05:55:03 +0000 (07:55 +0200)
Currently is_16bit_nand() is a per SoC function and it decides the bus nand
width by reading some boot related registers.

This method works when NAND is the boot medium, but does not work if another
boot medium is used. For example: booting from a SD card and then using NAND
to store the environment variables, would lead to the following error:

NAND bus width 16 instead 8 bit
No NAND device found!!!
0 MiB

Use CONFIG_SYS_NAND_BUSWIDTH_16BIT symbol to decide the bus width.

If it is defined in the board file, then consider 16-bit NAND bus-width,
otherwise assume 8-bit NAND is used.

This also aligns with Documentation/devicetree/bindings/mtd/nand.txt, which
states:

nand-bus-width : 8 or 16 bus width if not present 8

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Acked-by: Scott Wood <scottwood@freescale.com>
Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
README
drivers/mtd/nand/mxc_nand.c

diff --git a/README b/README
index e9c3145156f3895370ae30acdfa2974194381e3c..9285ddda406ebb96e8517dd03904ba63bc28d9f9 100644 (file)
--- a/README
+++ b/README
@@ -3759,8 +3759,9 @@ Low Level (hardware related) configuration options:
                Defined to tell the NAND controller that the NAND chip is using
                a 16 bit bus.
                Not all NAND drivers use this symbol.
-               Example of driver that uses it:
+               Example of drivers that use it:
                - drivers/mtd/nand/ndfc.c
+               - drivers/mtd/nand/mxc_nand.c
 
 - CONFIG_SYS_NDFC_EBC0_CFG
                Sets the EBC0_CFG register for the NDFC. If not defined
index d0ded483e2a41342387be2a19f0e1a086cbad92c..bb475f2f68d62470bc6c90edec0fe33ab44afd7d 100644 (file)
@@ -98,45 +98,14 @@ static struct nand_ecclayout nand_hw_eccoob2k = {
 #endif
 #endif
 
-#ifdef CONFIG_MX27
 static int is_16bit_nand(void)
 {
-       struct system_control_regs *sc_regs =
-               (struct system_control_regs *)IMX_SYSTEM_CTL_BASE;
-
-       if (readl(&sc_regs->fmcr) & NF_16BIT_SEL)
-               return 1;
-       else
-               return 0;
-}
-#elif defined(CONFIG_MX31)
-static int is_16bit_nand(void)
-{
-       struct clock_control_regs *sc_regs =
-               (struct clock_control_regs *)CCM_BASE;
-
-       if (readl(&sc_regs->rcsr) & CCM_RCSR_NF16B)
-               return 1;
-       else
-               return 0;
-}
-#elif defined(CONFIG_MX25) || defined(CONFIG_MX35)
-static int is_16bit_nand(void)
-{
-       struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
-
-       if (readl(&ccm->rcsr) & CCM_RCSR_NF_16BIT_SEL)
-               return 1;
-       else
-               return 0;
-}
+#if defined(CONFIG_SYS_NAND_BUSWIDTH_16BIT)
+       return 1;
 #else
-#warning "8/16 bit NAND autodetection not supported"
-static int is_16bit_nand(void)
-{
        return 0;
-}
 #endif
+}
 
 static uint32_t *mxc_nand_memcpy32(uint32_t *dest, uint32_t *source, size_t size)
 {