|
@@ -66,7 +66,7 @@ static void ndfc_hwcontrol(struct mtd_info *mtdinfo, int cmd)
|
|
static void ndfc_write_byte(struct mtd_info *mtdinfo, u_char byte)
|
|
static void ndfc_write_byte(struct mtd_info *mtdinfo, u_char byte)
|
|
{
|
|
{
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
- ulong base = (ulong) this->IO_ADDR_W;
|
|
|
|
|
|
+ ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
|
|
|
|
|
|
if (hwctl & 0x1)
|
|
if (hwctl & 0x1)
|
|
out8(base + NDFC_CMD, byte);
|
|
out8(base + NDFC_CMD, byte);
|
|
@@ -79,7 +79,7 @@ static void ndfc_write_byte(struct mtd_info *mtdinfo, u_char byte)
|
|
static u_char ndfc_read_byte(struct mtd_info *mtdinfo)
|
|
static u_char ndfc_read_byte(struct mtd_info *mtdinfo)
|
|
{
|
|
{
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
- ulong base = (ulong) this->IO_ADDR_W;
|
|
|
|
|
|
+ ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
|
|
|
|
|
|
return (in8(base + NDFC_DATA));
|
|
return (in8(base + NDFC_DATA));
|
|
}
|
|
}
|
|
@@ -87,7 +87,7 @@ static u_char ndfc_read_byte(struct mtd_info *mtdinfo)
|
|
static int ndfc_dev_ready(struct mtd_info *mtdinfo)
|
|
static int ndfc_dev_ready(struct mtd_info *mtdinfo)
|
|
{
|
|
{
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
- ulong base = (ulong) this->IO_ADDR_W;
|
|
|
|
|
|
+ ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
|
|
|
|
|
|
while (!(in32(base + NDFC_STAT) & NDFC_STAT_IS_READY))
|
|
while (!(in32(base + NDFC_STAT) & NDFC_STAT_IS_READY))
|
|
;
|
|
;
|
|
@@ -111,30 +111,30 @@ static int ndfc_dev_ready(struct mtd_info *mtdinfo)
|
|
static void ndfc_read_buf(struct mtd_info *mtdinfo, uint8_t *buf, int len)
|
|
static void ndfc_read_buf(struct mtd_info *mtdinfo, uint8_t *buf, int len)
|
|
{
|
|
{
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
- ulong base = (ulong) this->IO_ADDR_W;
|
|
|
|
|
|
+ ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
|
|
uint32_t *p = (uint32_t *) buf;
|
|
uint32_t *p = (uint32_t *) buf;
|
|
|
|
|
|
- for(;len > 0; len -= 4)
|
|
|
|
|
|
+ for (;len > 0; len -= 4)
|
|
*p++ = in32(base + NDFC_DATA);
|
|
*p++ = in32(base + NDFC_DATA);
|
|
}
|
|
}
|
|
|
|
|
|
static void ndfc_write_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
|
|
static void ndfc_write_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
|
|
{
|
|
{
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
- ulong base = (ulong) this->IO_ADDR_W;
|
|
|
|
|
|
+ ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
|
|
uint32_t *p = (uint32_t *) buf;
|
|
uint32_t *p = (uint32_t *) buf;
|
|
|
|
|
|
- for(; len > 0; len -= 4)
|
|
|
|
|
|
+ for (; len > 0; len -= 4)
|
|
out32(base + NDFC_DATA, *p++);
|
|
out32(base + NDFC_DATA, *p++);
|
|
}
|
|
}
|
|
|
|
|
|
static int ndfc_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
|
|
static int ndfc_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
|
|
{
|
|
{
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
struct nand_chip *this = mtdinfo->priv;
|
|
- ulong base = (ulong) this->IO_ADDR_W;
|
|
|
|
|
|
+ ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
|
|
uint32_t *p = (uint32_t *) buf;
|
|
uint32_t *p = (uint32_t *) buf;
|
|
|
|
|
|
- for(; len > 0; len -= 4)
|
|
|
|
|
|
+ for (; len > 0; len -= 4)
|
|
if (*p++ != in32(base + NDFC_DATA))
|
|
if (*p++ != in32(base + NDFC_DATA))
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
@@ -142,8 +142,20 @@ static int ndfc_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len
|
|
}
|
|
}
|
|
#endif /* #ifndef CONFIG_NAND_SPL */
|
|
#endif /* #ifndef CONFIG_NAND_SPL */
|
|
|
|
|
|
|
|
+void board_nand_select_device(struct nand_chip *nand, int chip)
|
|
|
|
+{
|
|
|
|
+ ulong base = (ulong)nand->IO_ADDR_W & 0xfffffffc;
|
|
|
|
+
|
|
|
|
+ /* Set NandFlash Core Configuration Register */
|
|
|
|
+ /* 1col x 2 rows */
|
|
|
|
+ out32(base + NDFC_CCR, 0x00000000 | (chip << 24));
|
|
|
|
+}
|
|
|
|
+
|
|
void board_nand_init(struct nand_chip *nand)
|
|
void board_nand_init(struct nand_chip *nand)
|
|
{
|
|
{
|
|
|
|
+ int chip = (ulong)nand->IO_ADDR_W & 0x00000003;
|
|
|
|
+ ulong base = (ulong)nand->IO_ADDR_W & 0xfffffffc;
|
|
|
|
+
|
|
nand->eccmode = NAND_ECC_SOFT;
|
|
nand->eccmode = NAND_ECC_SOFT;
|
|
|
|
|
|
nand->hwcontrol = ndfc_hwcontrol;
|
|
nand->hwcontrol = ndfc_hwcontrol;
|
|
@@ -166,10 +178,11 @@ void board_nand_init(struct nand_chip *nand)
|
|
mtebc(pb0ap, CFG_EBC_PB0AP);
|
|
mtebc(pb0ap, CFG_EBC_PB0AP);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- /* Set NandFlash Core Configuration Register */
|
|
|
|
- /* Chip select 3, 1col x 2 rows */
|
|
|
|
- out32(CFG_NAND_BASE + NDFC_CCR, 0x00000000 | (CFG_NAND_CS << 24));
|
|
|
|
- out32(CFG_NAND_BASE + NDFC_BCFG0 + (CFG_NAND_CS << 2), 0x80002222);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Select required NAND chip in NDFC
|
|
|
|
+ */
|
|
|
|
+ board_nand_select_device(nand, chip);
|
|
|
|
+ out32(base + NDFC_BCFG0 + (chip << 2), 0x80002222);
|
|
}
|
|
}
|
|
|
|
|
|
#endif
|
|
#endif
|