diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2009-06-04 11:18:01 -0400 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2009-11-12 02:32:39 -0500 |
commit | 89121a6bfecf4bd81b360fa1b3ae8875ed3e4a71 (patch) | |
tree | 451bd9c5a2761fe9cda8ca5b386d6834e3cc8252 | |
parent | f8f9608d9b7a5b3349605284a4f3876e898413f1 (diff) |
mxc nand: simplify command processing
Instead of having two switch/case with other operations
in between, use only one switch/case
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/mtd/nand/mxc_nand.c | 81 |
1 files changed, 35 insertions, 46 deletions
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 03d20086170b..67ddc35ca7bc 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c | |||
@@ -533,7 +533,6 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, | |||
533 | { | 533 | { |
534 | struct nand_chip *nand_chip = mtd->priv; | 534 | struct nand_chip *nand_chip = mtd->priv; |
535 | struct mxc_nand_host *host = nand_chip->priv; | 535 | struct mxc_nand_host *host = nand_chip->priv; |
536 | int useirq = true; | ||
537 | 536 | ||
538 | DEBUG(MTD_DEBUG_LEVEL3, | 537 | DEBUG(MTD_DEBUG_LEVEL3, |
539 | "mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n", | 538 | "mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n", |
@@ -548,19 +547,37 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, | |||
548 | case NAND_CMD_STATUS: | 547 | case NAND_CMD_STATUS: |
549 | host->buf_start = 0; | 548 | host->buf_start = 0; |
550 | host->status_request = true; | 549 | host->status_request = true; |
551 | break; | ||
552 | 550 | ||
553 | case NAND_CMD_READ0: | 551 | send_cmd(host, command, true); |
554 | host->buf_start = column; | 552 | mxc_do_addr_cycle(mtd, column, page_addr); |
555 | useirq = false; | ||
556 | break; | 553 | break; |
557 | 554 | ||
555 | case NAND_CMD_READ0: | ||
558 | case NAND_CMD_READOOB: | 556 | case NAND_CMD_READOOB: |
559 | host->buf_start = column + mtd->writesize; | 557 | if (command == NAND_CMD_READ0) |
558 | host->buf_start = column; | ||
559 | else | ||
560 | host->buf_start = column + mtd->writesize; | ||
560 | 561 | ||
561 | useirq = false; | ||
562 | if (host->pagesize_2k) | 562 | if (host->pagesize_2k) |
563 | command = NAND_CMD_READ0; /* only READ0 is valid */ | 563 | command = NAND_CMD_READ0; /* only READ0 is valid */ |
564 | |||
565 | send_cmd(host, command, false); | ||
566 | mxc_do_addr_cycle(mtd, column, page_addr); | ||
567 | |||
568 | if (host->pagesize_2k) { | ||
569 | /* send read confirm command */ | ||
570 | send_cmd(host, NAND_CMD_READSTART, true); | ||
571 | /* read for each AREA */ | ||
572 | send_page(host, 0, 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 | |||
579 | memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize); | ||
580 | copy_spare(mtd, true); | ||
564 | break; | 581 | break; |
565 | 582 | ||
566 | case NAND_CMD_SEQIN: | 583 | case NAND_CMD_SEQIN: |
@@ -589,7 +606,9 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, | |||
589 | if (!host->pagesize_2k) | 606 | if (!host->pagesize_2k) |
590 | send_cmd(host, NAND_CMD_READ0, false); | 607 | send_cmd(host, NAND_CMD_READ0, false); |
591 | } | 608 | } |
592 | useirq = false; | 609 | |
610 | send_cmd(host, command, false); | ||
611 | mxc_do_addr_cycle(mtd, column, page_addr); | ||
593 | break; | 612 | break; |
594 | 613 | ||
595 | case NAND_CMD_PAGEPROG: | 614 | case NAND_CMD_PAGEPROG: |
@@ -604,51 +623,21 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, | |||
604 | send_page(host, 3, NFC_INPUT); | 623 | send_page(host, 3, NFC_INPUT); |
605 | } | 624 | } |
606 | 625 | ||
607 | break; | 626 | send_cmd(host, command, true); |
608 | 627 | mxc_do_addr_cycle(mtd, column, page_addr); | |
609 | case NAND_CMD_ERASE1: | ||
610 | useirq = false; | ||
611 | break; | ||
612 | } | ||
613 | |||
614 | /* Write out the command to the device. */ | ||
615 | send_cmd(host, command, useirq); | ||
616 | mxc_do_addr_cycle(mtd, column, page_addr); | ||
617 | |||
618 | /* Command post-processing step */ | ||
619 | switch (command) { | ||
620 | |||
621 | case NAND_CMD_RESET: | ||
622 | break; | ||
623 | |||
624 | case NAND_CMD_READOOB: | ||
625 | case NAND_CMD_READ0: | ||
626 | if (host->pagesize_2k) { | ||
627 | /* send read confirm command */ | ||
628 | send_cmd(host, NAND_CMD_READSTART, true); | ||
629 | /* read for each AREA */ | ||
630 | send_page(host, 0, NFC_OUTPUT); | ||
631 | send_page(host, 1, NFC_OUTPUT); | ||
632 | send_page(host, 2, NFC_OUTPUT); | ||
633 | send_page(host, 3, NFC_OUTPUT); | ||
634 | } else | ||
635 | send_page(host, 0, NFC_OUTPUT); | ||
636 | |||
637 | memcpy(host->data_buf, host->regs + MAIN_AREA0, mtd->writesize); | ||
638 | copy_spare(mtd, true); | ||
639 | break; | 628 | break; |
640 | 629 | ||
641 | case NAND_CMD_READID: | 630 | case NAND_CMD_READID: |
631 | send_cmd(host, command, true); | ||
632 | mxc_do_addr_cycle(mtd, column, page_addr); | ||
642 | send_read_id(host); | 633 | send_read_id(host); |
643 | break; | 634 | break; |
644 | 635 | ||
645 | case NAND_CMD_PAGEPROG: | 636 | case NAND_CMD_ERASE1: |
646 | break; | ||
647 | |||
648 | case NAND_CMD_STATUS: | ||
649 | break; | ||
650 | |||
651 | case NAND_CMD_ERASE2: | 637 | case NAND_CMD_ERASE2: |
638 | send_cmd(host, command, false); | ||
639 | mxc_do_addr_cycle(mtd, column, page_addr); | ||
640 | |||
652 | break; | 641 | break; |
653 | } | 642 | } |
654 | } | 643 | } |