NAND update
PATCH 1/9 NAND update
The following modifications have been made in board/
Note that the patch-series is broken unless it is seen as one single patch. It is broken up to multiple emails to fit the size limit.
We have set up a git repository were you can pull the complete patch:
http://git.tandberg.com/tandberg/u-boot.git
Best regards
William
-------------------------------------------------
William Juul, Senior Development Engineer
Data Respons Norge AS
Sandviksveien 26
P.O. Box 489
NO-1323 H?vik, Norway
www.datarespons.no
-------------------------------------------------
board/bf537-stamp/nand.c +19 -24
@@ -37,34 +37,29 @@/* * hardware specific access to control-lines */ -static void bfin_hwcontrol (struct mtd_info *mtd,int cmd) +static void bfin_hwcontrol (struct mtd_info *mtd,int cmd,unsigned int ctrl) { registerstruct nand_chip *this = mtd->priv; +u32 IO_ADDR_W = (u32 ) this->IO_ADDR_W; -switch (cmd) { - -case NAND_CTL_SETCLE : - this->IO_ADDR_W =CFG_NAND_BASE +BFIN_NAND_CLE ; -break ; -case NAND_CTL_CLRCLE : - this->IO_ADDR_W =CFG_NAND_BASE ; -break ; - -case NAND_CTL_SETALE : - this->IO_ADDR_W =CFG_NAND_BASE +BFIN_NAND_ALE ; -break ; -case NAND_CTL_CLRALE : - this->IO_ADDR_W =CFG_NAND_BASE ; -break ; -case NAND_CTL_SETNCE : -case NAND_CTL_CLRNCE : -break ; +if (ctrl &NAND_CTRL_CHANGE ) { +if ( ctrl &NAND_CLE ) +IO_ADDR_W =CFG_NAND_BASE +BFIN_NAND_CLE ; +else +IO_ADDR_W =CFG_NAND_BASE ; +if ( ctrl &NAND_ALE ) +IO_ADDR_W =CFG_NAND_BASE +BFIN_NAND_ALE ; +else +IO_ADDR_W =CFG_NAND_BASE ; + this->IO_ADDR_W = (void __iomem *)IO_ADDR_W ; } - this->IO_ADDR_R = this->IO_ADDR_W;/* Drain the writebuffer */ sync (); + +if (cmd !=NAND_CMD_NONE ) +writeb (cmd, this->IO_ADDR_W); }int bfin_device_ready (struct mtd_info *mtd)
@@ -79,11 +74,11 @@ int bfin_device_ready(struct mtd_info *mtd)* argument are board-specific (per include/linux/mtd/nand.h): * - IO_ADDR_R?: address to read the 8 I/O lines of the flash device * - IO_ADDR_W?: address to write the 8 I/O lines of the flash device -* - hwcontrol: hardwarespecific function for accesing control-lines +* - cmd_ctrl: hardwarespecific function for accesing control-lines * - dev_ready: hardwarespecific function for accesing device ready/busy line * - enable_hwecc?: function to enable (reset) hardware ecc generator. Must * only be provided if a hardware ECC is available -* - eccmode: mode of ecc, see defines +* - ecc.mode: mode of ecc, see defines * - chip_delay: chip dependent delay for transfering data from array to * read regs (tR) * - options: various chip options. They can partly be set to inform
@@ -98,8 +93,8 @@ void board_nand_init(struct nand_chip *nand) *PORT (CONFIG_NAND_GPIO_PORT ,IO_DIR ) &= ~BFIN_NAND_READY ; *PORT (CONFIG_NAND_GPIO_PORT ,IO_INEN ) |=BFIN_NAND_READY ; - nand->hwcontrol = bfin_hwcontrol; - nand->eccmode =NAND_ECC_SOFT ; + nand->cmd_ctrl = bfin_hwcontrol; + nand->ecc.mode =NAND_ECC_SOFT ; nand->dev_ready = bfin_device_ready; nand->chip_delay =30 ; }
board/dave/PPChameleonEVB/nand.c +23 -26
81 lines not on this page · raw message
board/delta/nand.c +8 -33
88 lines not on this page · raw message
board/esd/common/esd405ep_nand.c +20 -22
57 lines not on this page · raw message
board/freescale/m5329evb/nand.c +16 -26
60 lines not on this page · raw message
board/nc650/nand.c +35 -43
118 lines not on this page · raw message
board/netstar/nand.c +13 -7
@@ -21,6 +21,7 @@*/ #include <common.h> +#include <asm/io.h> #if defined(CONFIG_CMD_NAND )
@@ -32,17 +33,22 @@#define MASK_CLE 0x02#define MASK_ALE 0x04 -static void netstar_nand_hwcontrol (struct mtd_info *mtd,int cmd) +static void netstar_nand_hwcontrol (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *this = mtd->priv;ulong IO_ADDR_W = (ulong ) this->IO_ADDR_W;IO_ADDR_W &= ~(MASK_ALE |MASK_CLE ); -switch (cmd) { -case NAND_CTL_SETCLE :IO_ADDR_W |=MASK_CLE ;break ; -case NAND_CTL_SETALE :IO_ADDR_W |=MASK_ALE ;break ; +if (ctrl &NAND_CTRL_CHANGE ) { +if ( ctrl &NAND_CLE ) +IO_ADDR_W |=MASK_CLE ; +if ( ctrl &NAND_ALE ) +IO_ADDR_W |=MASK_ALE ; } - this->IO_ADDR_W = (void *)IO_ADDR_W ; + this->IO_ADDR_W = (void __iomem *)IO_ADDR_W ; + +if (cmd !=NAND_CMD_NONE ) +writeb (cmd, this->IO_ADDR_W); }/*
@@ -58,8 +64,8 @@ static int netstar_nand_ready(struct mtd_info *mtd)int board_nand_init (struct nand_chip *nand) { nand->options =NAND_SAMSUNG_LP_OPTIONS ; - nand->eccmode =NAND_ECC_SOFT ; - nand->hwcontrol = netstar_nand_hwcontrol; + nand->ecc.mode =NAND_ECC_SOFT ; + nand->cmd_ctrl = netstar_nand_hwcontrol;/* nand->dev_ready = netstar_nand_ready; */ nand->chip_delay =18 ;return 0 ;
board/prodrive/alpr/nand.c +18 -39
73 lines not on this page · raw message
board/prodrive/pdnb3/nand.c +18 -35
74 lines not on this page · raw message
board/sc3/sc3nand.c +20 -24
64 lines not on this page · raw message
board/tqm8272/tqm8272.c +16 -18
@@ -1072,24 +1072,22 @@ int update_flash_size (int flash_size)static u8 hwctl =0 ; -static void upmnand_hwcontrol (struct mtd_info *mtdinfo,int cmd) +static void upmnand_hwcontrol (struct mtd_info *mtd,int cmd,unsigned int ctrl) { -switch (cmd) { -case NAND_CTL_SETCLE : - hwctl |=0x1 ; -break ; -case NAND_CTL_CLRCLE : - hwctl &= ~0x1 ; -break ; - -case NAND_CTL_SETALE : - hwctl |=0x2 ; -break ; - -case NAND_CTL_CLRALE : - hwctl &= ~0x2 ; -break ; +struct nand_chip *this = mtd->priv; + +if (ctrl &NAND_CTRL_CHANGE ) { +if ( ctrl &NAND_CLE ) + hwctl |=0x1 ; +else + hwctl &= ~0x1 ; +if ( ctrl &NAND_ALE ) + hwctl |=0x2 ; +else + hwctl &= ~0x2 ; } +if (cmd !=NAND_CMD_NONE ) +writeb (cmd, this->IO_ADDR_W); }static void upmnand_write_byte (struct mtd_info *mtdinfo,u_char byte)
@@ -1192,9 +1190,9 @@ int board_nand_init(struct nand_chip *nand) memctl->memc_br3 =CFG_NAND_BR ; memctl->memc_mbmr = (MxMR_OP_NORM); - nand->eccmode =NAND_ECC_SOFT ; + nand->ecc.mode =NAND_ECC_SOFT ; - nand->hwcontrol = upmnand_hwcontrol; + nand->cmd_ctrl = upmnand_hwcontrol; nand->read_byte = upmnand_read_byte; nand->write_byte = upmnand_write_byte; nand->dev_ready = tqm8272_dev_ready;
board/zylonite/nand.c +9 -30
@@ -69,7 +69,7 @@ static struct nand_oobinfo delta_oob = {/* * not required for Monahans DFC */ -static void dfc_hwcontrol (struct mtd_info *mtdinfo,int cmd) +static void dfc_hwcontrol (struct mtd_info *mtd,int cmd,unsigned int ctrl) {return ; }
@@ -110,25 +110,6 @@ static void dfc_write_buf(struct mtd_info *mtd, const u_char *buf, int len) } -/* -* These functions are quite problematic for the DFC. Luckily they are -* not used in the current nand code, except for nand_command, which -* we've defined our own anyway. The problem is, that we always need -* to write 4 bytes to the DFC Data Buffer, but in these functions we -* don't know if to buffer the bytes/half words until we've gathered 4 -* bytes or if to send them straight away. -* -* Solution: Don't use these with Mona's DFC and complain loudly. -*/ -static void dfc_write_word (struct mtd_info *mtd,u16 word) -{ -printf ("dfc_write_word: WARNING, this function does not work with the Monahans DFC!\n" ); -} -static void dfc_write_byte (struct mtd_info *mtd,u_char byte) -{ -printf ("dfc_write_byte: WARNING, this function does not work with the Monahans DFC!\n" ); -} -/* The original: * static void dfc_read_buf(struct mtd_info *mtd, const u_char *buf, int len) *
@@ -168,7 +149,7 @@ static void dfc_read_buf(struct mtd_info *mtd, u_char* const buf, int len)*/ static u16 dfc_read_word (struct mtd_info *mtd) { -printf ("dfc_write_byte: UNIMPLEMENTED.\n" ); +printf ("dfc_read_word: UNIMPLEMENTED.\n" );return 0 ; }
@@ -289,9 +270,10 @@ static void dfc_new_cmd(void)/* this function is called after Programm and Erase Operations to * check for success or failure */ -static int dfc_wait (struct mtd_info *mtd,struct nand_chip *this,int state) +static int dfc_wait (struct mtd_info *mtd,struct nand_chip *this) {unsigned long ndsr=0 , event=0 ; +int state = this->state;if (state ==FL_WRITING ) { event =NDSR_CS0_CMDD |NDSR_CS0_BBD ;
@@ -435,11 +417,11 @@ static void dfc_gpio_init(void)* argument are board-specific (per include/linux/mtd/nand_new.h): * - IO_ADDR_R?: address to read the 8 I/O lines of the flash device * - IO_ADDR_W?: address to write the 8 I/O lines of the flash device -* - hwcontrol: hardwarespecific function for accesing control-lines +* - cmd_ctrl: hardwarespecific function for accesing control-lines * - dev_ready: hardwarespecific function for accesing device ready/busy line * - enable_hwecc?: function to enable (reset) hardware ecc generator. Must * only be provided if a hardware ECC is available -* - eccmode: mode of ecc, see defines +* - ecc.mode: mode of ecc, see defines * - chip_delay: chip dependent delay for transfering data from array to * read regs (tR) * - options: various chip options. They can partly be set to inform
@@ -560,21 +542,18 @@ int board_nand_init(struct nand_chip *nand)/* wait 10 us due to cmd buffer clear reset */ /* wait(10); */ - - nand->hwcontrol = dfc_hwcontrol; + nand->cmd_ctrl = dfc_hwcontrol;/* nand->dev_ready = dfc_device_ready; */ - nand->eccmode =NAND_ECC_SOFT ; + nand->ecc.mode =NAND_ECC_SOFT ; nand->options =NAND_BUSWIDTH_16 ; nand->waitfunc = dfc_wait; nand->read_byte = dfc_read_byte; - nand->write_byte = dfc_write_byte; nand->read_word = dfc_read_word; - nand->write_word = dfc_write_word; nand->read_buf = dfc_read_buf; nand->write_buf = dfc_write_buf; nand->cmdfunc = dfc_cmdfunc; - nand->autooob = &delta_oob; +/* nand->autooob = &delta_oob; */ nand->badblock_pattern = &delta_bbt_descr;return 0 ; }