[U-Boot] [PATCH v2 2/2] mtd: nand: mxc_nand: Fix is_16bit_nand()

Benoît Thébaudeau benoit.thebaudeau at advansee.com
Tue Feb 26 19:47:21 CET 2013


Hi Fabio,

On Tuesday, February 26, 2013 7:35:20 PM, Fabio Estevam wrote:
> 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 82
> 
> Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
> ---
> Changes since v1:
> - Add an entry into README
>  README                      |    3 ++-
>  drivers/mtd/nand/mxc_nand.c |   37 +++----------------------------------
>  2 files changed, 5 insertions(+), 35 deletions(-)
> 
> diff --git a/README b/README
> index bdd2c81..1a6a7a5 100644
> --- a/README
> +++ b/README
> @@ -3717,8 +3717,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
> diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
> index d0ded48..bb475f2 100644
> --- a/drivers/mtd/nand/mxc_nand.c
> +++ b/drivers/mtd/nand/mxc_nand.c
> @@ -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)
>  {

That's correct.

is_16bit_nand() is only used to conditionally set NAND_BUSWIDTH_16 in
this->options, then this flag is tested everywhere else, so we could also
completely drop is_16bit_nand() and just do:
#ifdef CONFIG_SYS_NAND_BUSWIDTH_16BIT
	this->options |= NAND_BUSWIDTH_16;
#endif

What do you think is better? I'm fine with your implementation.

Should I rebase my series on that, keeping both series separate, or should I
integrate these 2 patches as is at the beginning of my series?

Best regards,
Benoît


More information about the U-Boot mailing list