[U-Boot] [PATCH v2 11/17] SPEAr : Configuring FSMC driver for NAND interface

Tom Rix tom at bumblecow.com
Mon May 3 02:24:15 CEST 2010


Vipin KUMAR wrote:
> Since FSMC is a standard IP and it supports different memory interfaces the FSMC

grammar
'interfaces the' -> 'interfaces; the'

> is supported independent of spear platform and spear is configured to use that
> driver for interfacing with the NAND device

Describe that because the common interface is used,
the spear specific files
arch/arm/include/asm/arch-spear/spr_nand.h,
drivers/mtd/nand/spr_nand.c
Have been removed and replaced
with
...

> 
> Signed-off-by: Vipin Kumar <vipin.kumar at st.com>
> ---
>  arch/arm/include/asm/arch-spear/hardware.h |    8 +-
>  arch/arm/include/asm/arch-spear/spr_nand.h |   57 -------------
>  board/spear/spear300/spear300.c            |    4 +-
>  board/spear/spear310/spear310.c            |    4 +-
>  board/spear/spear320/spear320.c            |    4 +-
>  board/spear/spear600/spear600.c            |    4 +-
>  drivers/mtd/nand/Makefile                  |    1 -
>  drivers/mtd/nand/spr_nand.c                |  124 ----------------------------
>  include/configs/spear-common.h             |    2 +-
>  include/configs/spear3xx.h                 |    4 +
>  include/configs/spear6xx.h                 |    3 +
>  11 files changed, 20 insertions(+), 195 deletions(-)
>  delete mode 100644 arch/arm/include/asm/arch-spear/spr_nand.h
>  delete mode 100644 drivers/mtd/nand/spr_nand.c
> 
> diff --git a/arch/arm/include/asm/arch-spear/hardware.h b/arch/arm/include/asm/arch-spear/hardware.h
> index 9f1e154..52037b6 100644
> --- a/arch/arm/include/asm/arch-spear/hardware.h
> +++ b/arch/arm/include/asm/arch-spear/hardware.h
> @@ -38,15 +38,15 @@
>  
>  #if defined(CONFIG_SPEAR600)
>  #define CONFIG_SYS_I2C_BASE			(0xD0200000)
> -#define CONFIG_SPEAR_FSMCBASE			(0xD1800000)
> +#define CONFIG_SYS_FSMC_BASE			(0xD1800000)
>  
>  #elif defined(CONFIG_SPEAR300)
>  #define CONFIG_SYS_I2C_BASE			(0xD0180000)
> -#define CONFIG_SPEAR_FSMCBASE			(0x94000000)
> +#define CONFIG_SYS_FSMC_BASE			(0x94000000)
>  
>  #elif defined(CONFIG_SPEAR310)
>  #define CONFIG_SYS_I2C_BASE			(0xD0180000)
> -#define CONFIG_SPEAR_FSMCBASE			(0x44000000)
> +#define CONFIG_SYS_FSMC_BASE			(0x44000000)
>  
>  #undef CONFIG_SYS_NAND_CLE
>  #undef CONFIG_SYS_NAND_ALE
> @@ -63,7 +63,7 @@
>  
>  #elif defined(CONFIG_SPEAR320)
>  #define CONFIG_SYS_I2C_BASE			(0xD0180000)
> -#define CONFIG_SPEAR_FSMCBASE			(0x4C000000)
> +#define CONFIG_SYS_FSMC_BASE			(0x4C000000)
>  
>  #define CONFIG_SPEAR_EMIBASE			(0x40000000)
>  #define CONFIG_SPEAR_RASBASE			(0xB3000000)
> diff --git a/arch/arm/include/asm/arch-spear/spr_nand.h b/arch/arm/include/asm/arch-spear/spr_nand.h
> deleted file mode 100644
> index 2b63dc7..0000000
> --- a/arch/arm/include/asm/arch-spear/spr_nand.h
> +++ /dev/null
> @@ -1,57 +0,0 @@
> -/*
> - * (C) Copyright 2009
> - * Vipin Kumar, ST Micoelectronics, vipin.kumar at st.com.
> - *
> - * See file CREDITS for list of people who contributed to this
> - * project.
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License as
> - * published by the Free Software Foundation; either version 2 of
> - * the License, or (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> - * MA 02111-1307 USA
> - */
> -
> -#ifndef __SPR_NAND_H__
> -#define __SPR_NAND_H__
> -
> -struct fsmc_regs {
> -	u32 reserved_1[0x10];
> -	u32 genmemctrl_pc;
> -	u32 reserved_2;
> -	u32 genmemctrl_comm;
> -	u32 genmemctrl_attrib;
> -	u32 reserved_3;
> -	u32 genmemctrl_ecc;
> -};
> -
> -/* genmemctrl_pc register definitions */
> -#define FSMC_RESET		(1 << 0)
> -#define FSMC_WAITON		(1 << 1)
> -#define FSMC_ENABLE		(1 << 2)
> -#define FSMC_DEVTYPE_NAND	(1 << 3)
> -#define FSMC_DEVWID_8		(0 << 4)
> -#define FSMC_DEVWID_16		(1 << 4)
> -#define FSMC_ECCEN		(1 << 6)
> -#define FSMC_ECCPLEN_512	(0 << 7)
> -#define FSMC_ECCPLEN_256	(1 << 7)
> -#define FSMC_TCLR_1		(1 << 9)
> -#define FSMC_TAR_1		(1 << 13)
> -
> -/* genmemctrl_comm register definitions */
> -#define FSMC_TSET_0		(0 << 0)
> -#define FSMC_TWAIT_6		(6 << 8)
> -#define FSMC_THOLD_4		(4 << 16)
> -#define FSMC_THIZ_1		(1 << 24)
> -
> -extern int spear_nand_init(struct nand_chip *nand);
> -#endif
> diff --git a/board/spear/spear300/spear300.c b/board/spear/spear300/spear300.c
> index cd24247..bb98161 100644
> --- a/board/spear/spear300/spear300.c
> +++ b/board/spear/spear300/spear300.c
> @@ -25,10 +25,10 @@
>  #include <netdev.h>
>  #include <nand.h>
>  #include <asm/io.h>
> +#include <linux/mtd/fsmc_nand.h>
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/spr_defs.h>
>  #include <asm/arch/spr_misc.h>
> -#include <asm/arch/spr_nand.h>
>  
>  int board_init(void)
>  {
> @@ -52,7 +52,7 @@ int board_nand_init(struct nand_chip *nand)
>  	    ((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) ==
>  	     MISC_SOCCFG31)) {
>  
> -		return spear_nand_init(nand);
> +		return fsmc_nand_init(nand);

Can make this conditionally compiled with CONFIG_NAND_FSMC

It this is common, it may be able to move to the spear/common dir.

Tom


>  	}
>  
>  	return -1;
> diff --git a/board/spear/spear310/spear310.c b/board/spear/spear310/spear310.c
> index 1207709..dfb7728 100644
> --- a/board/spear/spear310/spear310.c
> +++ b/board/spear/spear310/spear310.c
> @@ -26,10 +26,10 @@
>  #include <netdev.h>
>  #include <nand.h>
>  #include <asm/io.h>
> +#include <linux/mtd/fsmc_nand.h>
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/spr_defs.h>
>  #include <asm/arch/spr_misc.h>
> -#include <asm/arch/spr_nand.h>
>  
>  int board_init(void)
>  {
> @@ -53,7 +53,7 @@ int board_nand_init(struct nand_chip *nand)
>  	    ((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) ==
>  	     MISC_SOCCFG31)) {
>  
> -		return spear_nand_init(nand);
> +		return fsmc_nand_init(nand);
>  	}
>  
>  	return -1;
> diff --git a/board/spear/spear320/spear320.c b/board/spear/spear320/spear320.c
> index efc9a99..a15ffc4 100644
> --- a/board/spear/spear320/spear320.c
> +++ b/board/spear/spear320/spear320.c
> @@ -26,10 +26,10 @@
>  #include <netdev.h>
>  #include <nand.h>
>  #include <asm/io.h>
> +#include <linux/mtd/fsmc_nand.h>
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/spr_defs.h>
>  #include <asm/arch/spr_misc.h>
> -#include <asm/arch/spr_nand.h>
>  
>  int board_init(void)
>  {
> @@ -53,7 +53,7 @@ int board_nand_init(struct nand_chip *nand)
>  	    ((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) ==
>  	     MISC_SOCCFG31)) {
>  
> -		return spear_nand_init(nand);
> +		return fsmc_nand_init(nand);
>  	}
>  
>  	return -1;
> diff --git a/board/spear/spear600/spear600.c b/board/spear/spear600/spear600.c
> index 6d921bd..f7f25d2 100644
> --- a/board/spear/spear600/spear600.c
> +++ b/board/spear/spear600/spear600.c
> @@ -25,10 +25,10 @@
>  #include <netdev.h>
>  #include <nand.h>
>  #include <asm/io.h>
> +#include <linux/mtd/fsmc_nand.h>
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/spr_defs.h>
>  #include <asm/arch/spr_misc.h>
> -#include <asm/arch/spr_nand.h>
>  
>  int board_init(void)
>  {
> @@ -48,7 +48,7 @@ int board_nand_init(struct nand_chip *nand)
>  	    (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
>  
>  	if (!(readl(&misc_regs_p->auto_cfg_reg) & MISC_NANDDIS))
> -		return spear_nand_init(nand);
> +		return fsmc_nand_init(nand);
>  
>  	return -1;
>  }
> diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
> index 4c6b54f..36fc8b3 100644
> --- a/drivers/mtd/nand/Makefile
> +++ b/drivers/mtd/nand/Makefile
> @@ -48,7 +48,6 @@ COBJS-$(CONFIG_NAND_NDFC) += ndfc.o
>  COBJS-$(CONFIG_NAND_NOMADIK) += nomadik.o
>  COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
>  COBJS-$(CONFIG_NAND_S3C64XX) += s3c64xx.o
> -COBJS-$(CONFIG_NAND_SPEAR) += spr_nand.o
>  COBJS-$(CONFIG_NAND_OMAP_GPMC) += omap_gpmc.o
>  COBJS-$(CONFIG_NAND_PLAT) += nand_plat.o
>  endif
> diff --git a/drivers/mtd/nand/spr_nand.c b/drivers/mtd/nand/spr_nand.c
> deleted file mode 100644
> index 097d0c6..0000000
> --- a/drivers/mtd/nand/spr_nand.c
> +++ /dev/null
> @@ -1,124 +0,0 @@
> -/*
> - * (C) Copyright 2009
> - * Vipin Kumar, ST Micoelectronics, vipin.kumar at st.com.
> - *
> - * See file CREDITS for list of people who contributed to this
> - * project.
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License as
> - * published by the Free Software Foundation; either version 2 of
> - * the License, or (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> - * MA 02111-1307 USA
> - */
> -
> -#include <common.h>
> -#include <nand.h>
> -#include <linux/mtd/nand_ecc.h>
> -#include <asm/io.h>
> -#include <asm/arch/hardware.h>
> -#include <asm/arch/spr_nand.h>
> -
> -static struct fsmc_regs *const fsmc_regs_p =
> -    (struct fsmc_regs *)CONFIG_SPEAR_FSMCBASE;
> -
> -static struct nand_ecclayout spear_nand_ecclayout = {
> -	.eccbytes = 24,
> -	.eccpos = {2, 3, 4, 18, 19, 20, 34, 35, 36, 50, 51, 52,
> -		   66, 67, 68, 82, 83, 84, 98, 99, 100, 114, 115, 116},
> -	.oobfree = {
> -		    {.offset = 8, .length = 8},
> -		    {.offset = 24, .length = 8},
> -		    {.offset = 40, .length = 8},
> -		    {.offset = 56, .length = 8},
> -		    {.offset = 72, .length = 8},
> -		    {.offset = 88, .length = 8},
> -		    {.offset = 104, .length = 8},
> -		    {.offset = 120, .length = 8}
> -		    }
> -};
> -
> -static void spear_nand_hwcontrol(struct mtd_info *mtd, int cmd, uint ctrl)
> -{
> -	struct nand_chip *this = mtd->priv;
> -	ulong IO_ADDR_W;
> -
> -	if (ctrl & NAND_CTRL_CHANGE) {
> -		IO_ADDR_W = (ulong)this->IO_ADDR_W;
> -
> -		IO_ADDR_W &= ~(CONFIG_SYS_NAND_CLE | CONFIG_SYS_NAND_ALE);
> -		if (ctrl & NAND_CLE)
> -			IO_ADDR_W |= CONFIG_SYS_NAND_CLE;
> -		if (ctrl & NAND_ALE)
> -			IO_ADDR_W |= CONFIG_SYS_NAND_ALE;
> -
> -		if (ctrl & NAND_NCE) {
> -			writel(readl(&fsmc_regs_p->genmemctrl_pc) |
> -			       FSMC_ENABLE, &fsmc_regs_p->genmemctrl_pc);
> -		} else {
> -			writel(readl(&fsmc_regs_p->genmemctrl_pc) &
> -			       ~FSMC_ENABLE, &fsmc_regs_p->genmemctrl_pc);
> -		}
> -		this->IO_ADDR_W = (void *)IO_ADDR_W;
> -	}
> -
> -	if (cmd != NAND_CMD_NONE)
> -		writeb(cmd, this->IO_ADDR_W);
> -}
> -
> -static int spear_read_hwecc(struct mtd_info *mtd,
> -			    const u_char *data, u_char ecc[3])
> -{
> -	u_int ecc_tmp;
> -
> -	/* read the h/w ECC */
> -	ecc_tmp = readl(&fsmc_regs_p->genmemctrl_ecc);
> -
> -	ecc[0] = (u_char) (ecc_tmp & 0xFF);
> -	ecc[1] = (u_char) ((ecc_tmp & 0xFF00) >> 8);
> -	ecc[2] = (u_char) ((ecc_tmp & 0xFF0000) >> 16);
> -
> -	return 0;
> -}
> -
> -void spear_enable_hwecc(struct mtd_info *mtd, int mode)
> -{
> -	writel(readl(&fsmc_regs_p->genmemctrl_pc) & ~0x80,
> -	       &fsmc_regs_p->genmemctrl_pc);
> -	writel(readl(&fsmc_regs_p->genmemctrl_pc) & ~FSMC_ECCEN,
> -	       &fsmc_regs_p->genmemctrl_pc);
> -	writel(readl(&fsmc_regs_p->genmemctrl_pc) | FSMC_ECCEN,
> -	       &fsmc_regs_p->genmemctrl_pc);
> -}
> -
> -int spear_nand_init(struct nand_chip *nand)
> -{
> -	writel(FSMC_DEVWID_8 | FSMC_DEVTYPE_NAND | FSMC_ENABLE | FSMC_WAITON,
> -	       &fsmc_regs_p->genmemctrl_pc);
> -	writel(readl(&fsmc_regs_p->genmemctrl_pc) | FSMC_TCLR_1 | FSMC_TAR_1,
> -	       &fsmc_regs_p->genmemctrl_pc);
> -	writel(FSMC_THIZ_1 | FSMC_THOLD_4 | FSMC_TWAIT_6 | FSMC_TSET_0,
> -	       &fsmc_regs_p->genmemctrl_comm);
> -	writel(FSMC_THIZ_1 | FSMC_THOLD_4 | FSMC_TWAIT_6 | FSMC_TSET_0,
> -	       &fsmc_regs_p->genmemctrl_attrib);
> -
> -	nand->options = 0;
> -	nand->ecc.mode = NAND_ECC_HW;
> -	nand->ecc.layout = &spear_nand_ecclayout;
> -	nand->ecc.size = 512;
> -	nand->ecc.bytes = 3;
> -	nand->ecc.calculate = spear_read_hwecc;
> -	nand->ecc.hwctl = spear_enable_hwecc;
> -	nand->ecc.correct = nand_correct_data;
> -	nand->cmd_ctrl = spear_nand_hwcontrol;
> -	return 0;
> -}
> diff --git a/include/configs/spear-common.h b/include/configs/spear-common.h
> index ecb1fd1..3eaa086 100644
> --- a/include/configs/spear-common.h
> +++ b/include/configs/spear-common.h
> @@ -90,7 +90,7 @@
>  #define CONFIG_SYS_LOADS_BAUD_CHANGE
>  
>  /* NAND FLASH Configuration */
> -#define CONFIG_NAND_SPEAR			1
> +#define CONFIG_NAND_FSMC			1
>  #define CONFIG_SYS_MAX_NAND_DEVICE		1
>  #define CONFIG_MTD_NAND_VERIFY_WRITE		1
>  
> diff --git a/include/configs/spear3xx.h b/include/configs/spear3xx.h
> index 689d914..fde505c 100644
> --- a/include/configs/spear3xx.h
> +++ b/include/configs/spear3xx.h
> @@ -133,6 +133,10 @@
>  
>  #endif
>  
> +/* NAND flash configuration */
> +#define CONFIG_SYS_FSMC_NAND_SP			1
> +#define CONFIG_SYS_FSMC_NAND_8BIT		1
> +
>  #if defined(CONFIG_SPEAR300)
>  #define CONFIG_SYS_NAND_BASE			(0x80000000)
>  
> diff --git a/include/configs/spear6xx.h b/include/configs/spear6xx.h
> index 2ad5beb..2532344 100644
> --- a/include/configs/spear6xx.h
> +++ b/include/configs/spear6xx.h
> @@ -38,6 +38,9 @@
>  #define CONFIG_PL01x_PORTS			{ (void *)CONFIG_SYS_SERIAL0, \
>  						(void *)CONFIG_SYS_SERIAL1 }
>  
> +/* NAND flash configuration */
> +#define CONFIG_SYS_FSMC_NAND_SP			1
> +#define CONFIG_SYS_FSMC_NAND_8BIT		1
>  #define CONFIG_SYS_NAND_BASE			(0xD2000000)
>  
>  #endif  /* __CONFIG_H */



More information about the U-Boot mailing list