[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