diff options
| author | Sascha Hauer <s.hauer@pengutronix.de> | 2009-06-04 11:25:53 -0400 |
|---|---|---|
| committer | Sascha Hauer <s.hauer@pengutronix.de> | 2009-11-12 02:32:46 -0500 |
| commit | c5d23f1bf384e4a17bc4a014313a4157c015a820 (patch) | |
| tree | 89b17628f221e5057875fc4eb42cf91e9323ccdc | |
| parent | 89121a6bfecf4bd81b360fa1b3ae8875ed3e4a71 (diff) | |
mxc nand: modify send_page to send all pages, not only one
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| -rw-r--r-- | drivers/mtd/nand/mxc_nand.c | 45 |
1 files changed, 20 insertions, 25 deletions
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 67ddc35ca7bc..1131ad126fd2 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c | |||
| @@ -228,16 +228,25 @@ static void send_addr(struct mxc_nand_host *host, uint16_t addr, int islast) | |||
| 228 | wait_op_done(host, TROP_US_DELAY, islast); | 228 | wait_op_done(host, TROP_US_DELAY, islast); |
| 229 | } | 229 | } |
| 230 | 230 | ||
| 231 | static void send_page(struct mxc_nand_host *host, uint8_t buf_id, | 231 | static void send_page(struct mxc_nand_host *host, unsigned int ops) |
| 232 | unsigned int ops) | ||
| 233 | { | 232 | { |
| 234 | /* NANDFC buffer 0 is used for page read/write */ | 233 | int bufs, i; |
| 235 | writew(buf_id, host->regs + NFC_BUF_ADDR); | ||
| 236 | 234 | ||
| 237 | writew(ops, host->regs + NFC_CONFIG2); | 235 | if (host->pagesize_2k) |
| 236 | bufs = 4; | ||
| 237 | else | ||
| 238 | bufs = 1; | ||
| 238 | 239 | ||
| 239 | /* Wait for operation to complete */ | 240 | for (i = 0; i < bufs; i++) { |
| 240 | wait_op_done(host, TROP_US_DELAY, true); | 241 | |
| 242 | /* NANDFC buffer 0 is used for page read/write */ | ||
| 243 | writew(i, host->regs + NFC_BUF_ADDR); | ||
| 244 | |||
| 245 | writew(ops, host->regs + NFC_CONFIG2); | ||
| 246 | |||
| 247 | /* Wait for operation to complete */ | ||
| 248 | wait_op_done(host, TROP_US_DELAY, true); | ||
| 249 | } | ||
| 241 | } | 250 | } |
| 242 | 251 | ||
| 243 | /* Request the NANDFC to perform a read of the NAND device ID. */ | 252 | /* Request the NANDFC to perform a read of the NAND device ID. */ |
| @@ -565,16 +574,10 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, | |||
| 565 | send_cmd(host, command, false); | 574 | send_cmd(host, command, false); |
| 566 | mxc_do_addr_cycle(mtd, column, page_addr); | 575 | mxc_do_addr_cycle(mtd, column, page_addr); |
| 567 | 576 | ||
| 568 | if (host->pagesize_2k) { | 577 | if (host->pagesize_2k) |
| 569 | /* send read confirm command */ | ||
| 570 | send_cmd(host, NAND_CMD_READSTART, true); | 578 | send_cmd(host, NAND_CMD_READSTART, true); |
| 571 | /* read for each AREA */ | 579 | |
| 572 | send_page(host, 0, NFC_OUTPUT); | 580 | send_page(host, NFC_OUTPUT); |
| 573 | send_page(host, 1, NFC_OUTPUT); | ||
| 574 | send_page(host, 2, NFC_OUTPUT); | ||
| 575 | send_page(host, 3, NFC_OUTPUT); | ||
| 576 | } else | ||
| 577 | send_page(host, 0, NFC_OUTPUT); | ||
| 578 | 581 | ||
| 579 | memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize); | 582 | memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize); |
| 580 | copy_spare(mtd, true); | 583 | copy_spare(mtd, true); |
| @@ -614,15 +617,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, | |||
| 614 | case NAND_CMD_PAGEPROG: | 617 | case NAND_CMD_PAGEPROG: |
| 615 | memcpy(host->regs + MAIN_AREA0, host->data_buf, mtd->writesize); | 618 | memcpy(host->regs + MAIN_AREA0, host->data_buf, mtd->writesize); |
| 616 | copy_spare(mtd, false); | 619 | copy_spare(mtd, false); |
| 617 | send_page(host, 0, NFC_INPUT); | 620 | send_page(host, NFC_INPUT); |
| 618 | |||
| 619 | if (host->pagesize_2k) { | ||
| 620 | /* data in 4 areas datas */ | ||
| 621 | send_page(host, 1, NFC_INPUT); | ||
| 622 | send_page(host, 2, NFC_INPUT); | ||
| 623 | send_page(host, 3, NFC_INPUT); | ||
| 624 | } | ||
| 625 | |||
| 626 | send_cmd(host, command, true); | 621 | send_cmd(host, command, true); |
| 627 | mxc_do_addr_cycle(mtd, column, page_addr); | 622 | mxc_do_addr_cycle(mtd, column, page_addr); |
| 628 | break; | 623 | break; |
