diff options
| author | Sascha Hauer <s.hauer@pengutronix.de> | 2009-10-21 08:25:27 -0400 |
|---|---|---|
| committer | Sascha Hauer <s.hauer@pengutronix.de> | 2009-11-12 02:33:32 -0500 |
| commit | f1372055df21734f042f12ab92852e9d350be8d0 (patch) | |
| tree | fd4ef8a4b6eeb14bdf4afbf021bf0db1c24fba64 | |
| parent | f06368f7d15f6fc323ba0c71aec67b9b2dd5614a (diff) | |
mxc_nand: Allow flash based bbt
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| -rw-r--r-- | arch/arm/plat-mxc/include/mach/mxc_nand.h | 3 | ||||
| -rw-r--r-- | drivers/mtd/nand/mxc_nand.c | 34 |
2 files changed, 36 insertions, 1 deletions
diff --git a/arch/arm/plat-mxc/include/mach/mxc_nand.h b/arch/arm/plat-mxc/include/mach/mxc_nand.h index 2b972df22d12..5d2d21d414e0 100644 --- a/arch/arm/plat-mxc/include/mach/mxc_nand.h +++ b/arch/arm/plat-mxc/include/mach/mxc_nand.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | 22 | ||
| 23 | struct mxc_nand_platform_data { | 23 | struct mxc_nand_platform_data { |
| 24 | int width; /* data bus width in bytes */ | 24 | int width; /* data bus width in bytes */ |
| 25 | int hw_ecc; /* 0 if supress hardware ECC */ | 25 | int hw_ecc:1; /* 0 if supress hardware ECC */ |
| 26 | int flash_bbt:1; /* set to 1 to use a flash based bbt */ | ||
| 26 | }; | 27 | }; |
| 27 | #endif /* __ASM_ARCH_NAND_H */ | 28 | #endif /* __ASM_ARCH_NAND_H */ |
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 2e3f3fbcd67c..044a57483027 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c | |||
| @@ -648,6 +648,33 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, | |||
| 648 | } | 648 | } |
| 649 | } | 649 | } |
| 650 | 650 | ||
| 651 | /* | ||
| 652 | * The generic flash bbt decriptors overlap with our ecc | ||
| 653 | * hardware, so define some i.MX specific ones. | ||
| 654 | */ | ||
| 655 | static uint8_t bbt_pattern[] = { 'B', 'b', 't', '0' }; | ||
| 656 | static uint8_t mirror_pattern[] = { '1', 't', 'b', 'B' }; | ||
| 657 | |||
| 658 | static struct nand_bbt_descr bbt_main_descr = { | ||
| 659 | .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | ||
| 660 | | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP, | ||
| 661 | .offs = 0, | ||
| 662 | .len = 4, | ||
| 663 | .veroffs = 4, | ||
| 664 | .maxblocks = 4, | ||
| 665 | .pattern = bbt_pattern, | ||
| 666 | }; | ||
| 667 | |||
| 668 | static struct nand_bbt_descr bbt_mirror_descr = { | ||
| 669 | .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | ||
| 670 | | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP, | ||
| 671 | .offs = 0, | ||
| 672 | .len = 4, | ||
| 673 | .veroffs = 4, | ||
| 674 | .maxblocks = 4, | ||
| 675 | .pattern = mirror_pattern, | ||
| 676 | }; | ||
| 677 | |||
| 651 | static int __init mxcnd_probe(struct platform_device *pdev) | 678 | static int __init mxcnd_probe(struct platform_device *pdev) |
| 652 | { | 679 | { |
| 653 | struct nand_chip *this; | 680 | struct nand_chip *this; |
| @@ -786,6 +813,13 @@ static int __init mxcnd_probe(struct platform_device *pdev) | |||
| 786 | if (pdata->width == 2) | 813 | if (pdata->width == 2) |
| 787 | this->options |= NAND_BUSWIDTH_16; | 814 | this->options |= NAND_BUSWIDTH_16; |
| 788 | 815 | ||
| 816 | if (pdata->flash_bbt) { | ||
| 817 | this->bbt_td = &bbt_main_descr; | ||
| 818 | this->bbt_md = &bbt_mirror_descr; | ||
| 819 | /* update flash based bbt */ | ||
| 820 | this->options |= NAND_USE_FLASH_BBT; | ||
| 821 | } | ||
| 822 | |||
| 789 | /* first scan to find the device and get the page size */ | 823 | /* first scan to find the device and get the page size */ |
| 790 | if (nand_scan_ident(mtd, 1)) { | 824 | if (nand_scan_ident(mtd, 1)) { |
| 791 | err = -ENXIO; | 825 | err = -ENXIO; |
