[PATCH 132/133] [Jaunty SRU] ARM.imx51 Freescale:ENGR00113505 Disable NAND driver interleave mode support
Brad Figg
brad.figg at canonical.com
Thu Jul 9 16:50:02 UTC 2009
From: Jason <r64343 at freescale.com>
Disable NAND driver interleave mode support
Signed-off-by:Jason Liu <r64343 at freescale.com>
Signed-off-by: Brad Figg <brad.figg at canonical.com>
---
drivers/mtd/nand/mxc_nd2.c | 62 +++++++++++++++++++------------------------
1 files changed, 27 insertions(+), 35 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nd2.c b/drivers/mtd/nand/mxc_nd2.c
index 6bfcb2b..00cdf63 100644
--- a/drivers/mtd/nand/mxc_nd2.c
+++ b/drivers/mtd/nand/mxc_nd2.c
@@ -216,12 +216,11 @@ static int mxc_check_ecc_status(struct mtd_info *mtd);
*/
static void auto_cmd_interleave(struct mtd_info *mtd, u16 cmd)
{
- u32 i;
+ u32 i, page_addr, ncs;
u32 j = num_of_interleave;
struct nand_chip *this = mtd->priv;
u32 addr_low = raw_read(NFC_FLASH_ADDR0);
u32 addr_high = raw_read(NFC_FLASH_ADDR8);
- u32 page_addr = addr_low >> 16 | addr_high << 16;
u8 *dbuf = data_buf;
u8 *obuf = oob_buf;
u32 dlen = mtd->writesize / j;
@@ -230,17 +229,25 @@ static void auto_cmd_interleave(struct mtd_info *mtd, u16 cmd)
/* adjust the addr value
* since ADD_OP mode is 01
*/
- if (j > 1)
- page_addr *= j;
+ if (cmd == NAND_CMD_ERASE2)
+ page_addr = addr_low;
else
+ page_addr = addr_low >> 16 | addr_high << 16;
+
+ ncs = page_addr >> (this->chip_shift - this->page_shift);
+
+ if (j > 1) {
+ page_addr *= j;
+ } else {
page_addr *= this->numchips;
+ page_addr += ncs;
+ }
switch (cmd) {
case NAND_CMD_PAGEPROG:
for (i = 0; i < j; i++) {
/* reset addr cycle */
- if (j > 1)
- mxc_do_addr_cycle(mtd, 0, page_addr++);
+ mxc_do_addr_cycle(mtd, 0, page_addr++);
/* data transfer */
memcpy(MAIN_AREA0, dbuf, dlen);
@@ -265,8 +272,7 @@ static void auto_cmd_interleave(struct mtd_info *mtd, u16 cmd)
case NAND_CMD_READSTART:
for (i = 0; i < j; i++) {
/* reset addr cycle */
- if (j > 1)
- mxc_do_addr_cycle(mtd, 0, page_addr++);
+ mxc_do_addr_cycle(mtd, 0, page_addr++);
NFC_SET_RBA(0);
ACK_OPS;
@@ -287,10 +293,6 @@ static void auto_cmd_interleave(struct mtd_info *mtd, u16 cmd)
break;
case NAND_CMD_ERASE2:
for (i = 0; i < j; i++) {
- if (!i) {
- page_addr = addr_low;
- page_addr *= (j > 1 ? j : this->numchips);
- }
mxc_do_addr_cycle(mtd, -1, page_addr++);
ACK_OPS;
raw_write(NFC_AUTO_ERASE, REG_NFC_OPS);
@@ -798,6 +800,7 @@ static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
NFC_FLASH_ADDR8);
} else if (page_addr != -1) {
raw_write(page_addr, NFC_FLASH_ADDR0);
+ raw_write(0, NFC_FLASH_ADDR8);
}
DEBUG(MTD_DEBUG_LEVEL3,
@@ -1036,7 +1039,7 @@ static uint8_t mirror_pattern[] = { '1', 't', 'b', 'B' };
static struct nand_bbt_descr bbt_main_descr = {
.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
- | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
+ | NAND_BBT_2BIT | NAND_BBT_VERSION,
.offs = 0,
.len = 4,
.veroffs = 4,
@@ -1046,7 +1049,7 @@ static struct nand_bbt_descr bbt_main_descr = {
static struct nand_bbt_descr bbt_mirror_descr = {
.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
- | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
+ | NAND_BBT_2BIT | NAND_BBT_VERSION,
.offs = 0,
.len = 4,
.veroffs = 4,
@@ -1060,6 +1063,16 @@ static int mxc_nand_scan_bbt(struct mtd_info *mtd)
g_page_mask = this->pagemask;
+ /* limit to 2G size due to Kernel
+ * larger 4G space support,need fix
+ * it later
+ */
+ if (mtd->size == 0) {
+ mtd->size = 1 << 31;
+ this->numchips = 1;
+ this->chipsize = mtd->size;
+ }
+
if (IS_2K_PAGE_NAND) {
NFC_SET_NFMS(1 << NFMS_NF_PG_SZ);
this->ecc.layout = &nand_hw_eccoob_2k;
@@ -1070,27 +1083,6 @@ static int mxc_nand_scan_bbt(struct mtd_info *mtd)
this->ecc.layout = &nand_hw_eccoob_512;
}
- /* reconfig for interleave mode */
-#ifdef NFC_AUTO_MODE_ENABLE
- if (this->numchips > 1) {
- num_of_interleave = this->numchips;
- this->numchips = 1;
-
- /* FIXEME:need remove it
- * when kernel support
- * 4G larger space
- */
- mtd->size = this->chipsize;
- mtd->erasesize *= num_of_interleave;
- mtd->writesize *= num_of_interleave;
- mtd->oobsize *= num_of_interleave;
- this->page_shift = ffs(mtd->writesize) - 1;
- this->bbt_erase_shift =
- this->phys_erase_shift = ffs(mtd->erasesize) - 1;
- this->chip_shift = ffs(this->chipsize) - 1;
- this->oob_poi = this->buffers->databuf + mtd->writesize;
- }
-#endif
/* propagate ecc.layout to mtd_info */
mtd->ecclayout = this->ecc.layout;
--
1.6.0.4
More information about the kernel-team
mailing list