1
0
Fork 0

NAND: Add 16bit NAND support for the NDFC

This patch adds support for 16 bit NAND devices attached to the
NDFC on ppc4xx processors. Two config entries were added:

  CONFIG_SYS_NDFC_16        - Setting this tells the NDFC that a
			      16 bit device is attached.
  CONFIG_SYS_NDFC_EBC0_CFG  - This is for the External Bus
			      Controller configuration register.

Also, a new ndfc_read_byte() function was added which does not
first convert the data to little endian.

The NAND SPL was also modified to do 16bit bad block testing
when a 16 bit chip is being used.

Signed-off-by: Alex Waterman <awaterman@dawning.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
utp
Alex Waterman 2011-05-19 15:08:36 -04:00 committed by Scott Wood
parent c9494866df
commit eced4626e4
3 changed files with 45 additions and 7 deletions

8
README
View File

@ -2917,6 +2917,14 @@ Low Level (hardware related) configuration options:
- CONFIG_SYS_SRIOn_MEM_SIZE: - CONFIG_SYS_SRIOn_MEM_SIZE:
Size of SRIO port 'n' memory region Size of SRIO port 'n' memory region
- CONFIG_SYS_NDFC_16
Defined to tell the NDFC that the NAND chip is using a
16 bit bus.
- CONFIG_SYS_NDFC_EBC0_CFG
Sets the EBC0_CFG register for the NDFC. If not defined
a default value will be used.
- CONFIG_SPD_EEPROM - CONFIG_SPD_EEPROM
Get DDR timing information from an I2C EEPROM. Common Get DDR timing information from an I2C EEPROM. Common
with pluggable memory modules such as SODIMMs with pluggable memory modules such as SODIMMs

View File

@ -37,6 +37,13 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/ppc4xx.h> #include <asm/ppc4xx.h>
#ifndef CONFIG_SYS_NAND_BCR
#define CONFIG_SYS_NAND_BCR 0x80002222
#endif
#ifndef CONFIG_SYS_NDFC_EBC0_CFG
#define CONFIG_SYS_NDFC_EBC0_CFG 0xb8400000
#endif
/* /*
* We need to store the info, which chip-select (CS) is used for the * We need to store the info, which chip-select (CS) is used for the
* chip number. For example on Sequoia NAND chip #0 uses * chip number. For example on Sequoia NAND chip #0 uses
@ -140,12 +147,25 @@ static int ndfc_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len
return 0; return 0;
} }
#endif /* #ifndef CONFIG_NAND_SPL */
#ifndef CONFIG_SYS_NAND_BCR /*
#define CONFIG_SYS_NAND_BCR 0x80002222 * Read a byte from the NDFC.
*/
static uint8_t ndfc_read_byte(struct mtd_info *mtd)
{
struct nand_chip *chip = mtd->priv;
#ifdef CONFIG_SYS_NDFC_16BIT
return (uint8_t) readw(chip->IO_ADDR_R);
#else
return readb(chip->IO_ADDR_R);
#endif #endif
}
#endif /* #ifndef CONFIG_NAND_SPL */
void board_nand_select_device(struct nand_chip *nand, int chip) void board_nand_select_device(struct nand_chip *nand, int chip)
{ {
/* /*
@ -198,16 +218,21 @@ int board_nand_init(struct nand_chip *nand)
nand->ecc.bytes = 3; nand->ecc.bytes = 3;
nand->select_chip = ndfc_select_chip; nand->select_chip = ndfc_select_chip;
#ifdef CONFIG_SYS_NDFC_16BIT
nand->options |= NAND_BUSWIDTH_16;
#endif
#ifndef CONFIG_NAND_SPL #ifndef CONFIG_NAND_SPL
nand->write_buf = ndfc_write_buf; nand->write_buf = ndfc_write_buf;
nand->verify_buf = ndfc_verify_buf; nand->verify_buf = ndfc_verify_buf;
nand->read_byte = ndfc_read_byte;
chip++; chip++;
#else #else
/* /*
* Setup EBC (CS0 only right now) * Setup EBC (CS0 only right now)
*/ */
mtebc(EBC0_CFG, 0xb8400000); mtebc(EBC0_CFG, CONFIG_SYS_NDFC_EBC0_CFG);
mtebc(PB0CR, CONFIG_SYS_EBC_PB0CR); mtebc(PB0CR, CONFIG_SYS_EBC_PB0CR);
mtebc(PB0AP, CONFIG_SYS_EBC_PB0AP); mtebc(PB0AP, CONFIG_SYS_EBC_PB0AP);

View File

@ -122,10 +122,15 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block)
nand_command(mtd, block, 0, CONFIG_SYS_NAND_BAD_BLOCK_POS, NAND_CMD_READOOB); nand_command(mtd, block, 0, CONFIG_SYS_NAND_BAD_BLOCK_POS, NAND_CMD_READOOB);
/* /*
* Read one byte * Read one byte (or two if it's a 16 bit chip).
*/ */
if (readb(this->IO_ADDR_R) != 0xff) if (this->options & NAND_BUSWIDTH_16) {
return 1; if (readw(this->IO_ADDR_R) != 0xffff)
return 1;
} else {
if (readb(this->IO_ADDR_R) != 0xff)
return 1;
}
return 0; return 0;
} }