summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2010-05-03 14:19:19 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2010-05-03 14:19:19 +0200
commitd840493e2886ad54490d8d31cb9c05e1cc52b7b5 (patch)
tree38d25676859cbac57016fc8e2d8470e4991cd41a
parent3a1617d96f8b4e093917bf05fca4d1e0bd6983e0 (diff)
downloadbarebox-d840493e2886ad54490d8d31cb9c05e1cc52b7b5.tar.gz
barebox-d840493e2886ad54490d8d31cb9c05e1cc52b7b5.tar.xz
Revert "nand_imx: Speed up sequential read"
This breaks at least on v1 type controllers with 2k pages. Lets revert it for now and rework it. This reverts commit d5578b81799a61eecca90152a3a1c392caab3638.
-rw-r--r--drivers/nand/nand_imx.c60
1 files changed, 13 insertions, 47 deletions
diff --git a/drivers/nand/nand_imx.c b/drivers/nand/nand_imx.c
index cacf91ca96..74cdf10a50 100644
--- a/drivers/nand/nand_imx.c
+++ b/drivers/nand/nand_imx.c
@@ -295,7 +295,7 @@ static void __nand_boot_init noinline send_addr(struct imx_nand_host *host, u16
* @param spare_only set true if only the spare area is transferred
*/
static void __nand_boot_init send_page(struct imx_nand_host *host,
- unsigned int ops, int wait)
+ unsigned int ops)
{
int bufs, i;
@@ -311,8 +311,7 @@ static void __nand_boot_init send_page(struct imx_nand_host *host,
writew(ops, host->regs + NFC_CONFIG2);
/* Wait for operation to complete */
- if (wait)
- wait_op_done(host);
+ wait_op_done(host);
}
}
@@ -672,17 +671,11 @@ static void imx_nand_command(struct mtd_info *mtd, unsigned command,
{
struct nand_chip *nand_chip = mtd->priv;
struct imx_nand_host *host = nand_chip->priv;
- static int cached = -1;
MTD_DEBUG(MTD_DEBUG_LEVEL3,
"imx_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n",
command, column, page_addr);
- if (cached != -1)
- wait_op_done(host);
- if (command != NAND_CMD_READ0)
- cached = -1;
-
/*
* Reset command state information
*/
@@ -709,44 +702,17 @@ static void imx_nand_command(struct mtd_info *mtd, unsigned command,
command = NAND_CMD_READ0;
- if (cached == page_addr) {
- memcpy32(host->data_buf, host->main_area0, mtd->writesize);
- copy_spare(mtd, 1);
-
- send_cmd(host, command);
- mxc_do_addr_cycle(mtd, column, page_addr + 1);
-
- if (host->pagesize_2k)
- /* send read confirm command */
- send_cmd(host, NAND_CMD_READSTART);
-
- send_page(host, NFC_OUTPUT, 0);
-
- cached = page_addr + 1;
- } else {
- host->buf_start = column;
- send_cmd(host, command);
- mxc_do_addr_cycle(mtd, column, page_addr);
-
- if (host->pagesize_2k)
- /* send read confirm command */
- send_cmd(host, NAND_CMD_READSTART);
-
- send_page(host, NFC_OUTPUT, 1);
- memcpy32(host->data_buf, host->main_area0, mtd->writesize);
- copy_spare(mtd, 1);
-
- send_cmd(host, command);
- mxc_do_addr_cycle(mtd, column, page_addr + 1);
+ send_cmd(host, command);
+ mxc_do_addr_cycle(mtd, column, page_addr);
- if (host->pagesize_2k)
- /* send read confirm command */
- send_cmd(host, NAND_CMD_READSTART);
+ if (host->pagesize_2k)
+ /* send read confirm command */
+ send_cmd(host, NAND_CMD_READSTART);
- send_page(host, NFC_OUTPUT, 0);
- cached = page_addr + 1;
- }
+ send_page(host, NFC_OUTPUT);
+ memcpy32(host->data_buf, host->main_area0, mtd->writesize);
+ copy_spare(mtd, 1);
break;
case NAND_CMD_SEQIN:
@@ -783,7 +749,7 @@ static void imx_nand_command(struct mtd_info *mtd, unsigned command,
case NAND_CMD_PAGEPROG:
memcpy32(host->main_area0, host->data_buf, mtd->writesize);
copy_spare(mtd, 0);
- send_page(host, NFC_INPUT, 1);
+ send_page(host, NFC_INPUT);
send_cmd(host, command);
mxc_do_addr_cycle(mtd, column, page_addr);
break;
@@ -884,7 +850,7 @@ static int __init imxnd_probe(struct device_d *dev)
#endif
/* Allocate memory for MTD device structure and private data */
host = kzalloc(sizeof(struct imx_nand_host) + NAND_MAX_PAGESIZE +
- NAND_MAX_OOBSIZE * 2, GFP_KERNEL);
+ NAND_MAX_OOBSIZE, GFP_KERNEL);
if (!host)
return -ENOMEM;
@@ -1171,7 +1137,7 @@ void __nand_boot_init imx_nand_load_image(void *dest, int size)
page * pagesize);
if (host.pagesize_2k)
send_cmd(&host, NAND_CMD_READSTART);
- send_page(&host, NFC_OUTPUT, 1);
+ send_page(&host, NFC_OUTPUT);
page++;
if (host.pagesize_2k) {