diff options
author | Mike Frysinger <vapier.adi@gmail.com> | 2008-07-30 15:35:01 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-08-01 10:42:55 -0400 |
commit | fcb90ba7e9ba9a17ca5103be3f3ae3a446dadc14 (patch) | |
tree | 48313298d30bd369b29ef86cc511c96497af0202 /drivers/mtd | |
parent | cf840392e83914b9fcdbce8a8a2bc17a84cf0353 (diff) |
[MTD] [NAND] Blackfin NFC Driver: add support for the ECC layout the Blackfin bootrom uses
Signed-off-by: Mike Frysinger <vapier.adi@gmail.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/nand/Kconfig | 12 | ||||
-rw-r--r-- | drivers/mtd/nand/bf5xx_nand.c | 40 |
2 files changed, 52 insertions, 0 deletions
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 71406e517857..c075b47e11ad 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig | |||
@@ -109,6 +109,18 @@ config MTD_NAND_BF5XX_HWECC | |||
109 | Enable the use of the BF5XX's internal ECC generator when | 109 | Enable the use of the BF5XX's internal ECC generator when |
110 | using NAND. | 110 | using NAND. |
111 | 111 | ||
112 | config MTD_NAND_BF5XX_BOOTROM_ECC | ||
113 | bool "Use Blackfin BootROM ECC Layout" | ||
114 | default n | ||
115 | depends on MTD_NAND_BF5XX_HWECC | ||
116 | help | ||
117 | If you wish to modify NAND pages and allow the Blackfin on-chip | ||
118 | BootROM to boot from them, say Y here. This is only necessary | ||
119 | if you are booting U-Boot out of NAND and you wish to update | ||
120 | U-Boot from Linux' userspace. Otherwise, you should say N here. | ||
121 | |||
122 | If unsure, say N. | ||
123 | |||
112 | config MTD_NAND_RTC_FROM4 | 124 | config MTD_NAND_RTC_FROM4 |
113 | tristate "Renesas Flash ROM 4-slot interface board (FROM_BOARD4)" | 125 | tristate "Renesas Flash ROM 4-slot interface board (FROM_BOARD4)" |
114 | depends on SH_SOLUTION_ENGINE | 126 | depends on SH_SOLUTION_ENGINE |
diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c index fc58afe4733a..3555f6b3ebe0 100644 --- a/drivers/mtd/nand/bf5xx_nand.c +++ b/drivers/mtd/nand/bf5xx_nand.c | |||
@@ -91,6 +91,41 @@ static const unsigned short bfin_nfc_pin_req[] = | |||
91 | P_NAND_ALE, | 91 | P_NAND_ALE, |
92 | 0}; | 92 | 0}; |
93 | 93 | ||
94 | #ifdef CONFIG_MTD_NAND_BF5XX_BOOTROM_ECC | ||
95 | static uint8_t bbt_pattern[] = { 0xff }; | ||
96 | |||
97 | static struct nand_bbt_descr bootrom_bbt = { | ||
98 | .options = 0, | ||
99 | .offs = 63, | ||
100 | .len = 1, | ||
101 | .pattern = bbt_pattern, | ||
102 | }; | ||
103 | |||
104 | static struct nand_ecclayout bootrom_ecclayout = { | ||
105 | .eccbytes = 24, | ||
106 | .eccpos = { | ||
107 | 0x8 * 0, 0x8 * 0 + 1, 0x8 * 0 + 2, | ||
108 | 0x8 * 1, 0x8 * 1 + 1, 0x8 * 1 + 2, | ||
109 | 0x8 * 2, 0x8 * 2 + 1, 0x8 * 2 + 2, | ||
110 | 0x8 * 3, 0x8 * 3 + 1, 0x8 * 3 + 2, | ||
111 | 0x8 * 4, 0x8 * 4 + 1, 0x8 * 4 + 2, | ||
112 | 0x8 * 5, 0x8 * 5 + 1, 0x8 * 5 + 2, | ||
113 | 0x8 * 6, 0x8 * 6 + 1, 0x8 * 6 + 2, | ||
114 | 0x8 * 7, 0x8 * 7 + 1, 0x8 * 7 + 2 | ||
115 | }, | ||
116 | .oobfree = { | ||
117 | { 0x8 * 0 + 3, 5 }, | ||
118 | { 0x8 * 1 + 3, 5 }, | ||
119 | { 0x8 * 2 + 3, 5 }, | ||
120 | { 0x8 * 3 + 3, 5 }, | ||
121 | { 0x8 * 4 + 3, 5 }, | ||
122 | { 0x8 * 5 + 3, 5 }, | ||
123 | { 0x8 * 6 + 3, 5 }, | ||
124 | { 0x8 * 7 + 3, 5 }, | ||
125 | } | ||
126 | }; | ||
127 | #endif | ||
128 | |||
94 | /* | 129 | /* |
95 | * Data structures for bf5xx nand flash controller driver | 130 | * Data structures for bf5xx nand flash controller driver |
96 | */ | 131 | */ |
@@ -712,6 +747,11 @@ static int bf5xx_nand_probe(struct platform_device *pdev) | |||
712 | 747 | ||
713 | /* setup hardware ECC data struct */ | 748 | /* setup hardware ECC data struct */ |
714 | if (hardware_ecc) { | 749 | if (hardware_ecc) { |
750 | #ifdef CONFIG_MTD_NAND_BF5XX_BOOTROM_ECC | ||
751 | chip->badblock_pattern = &bootrom_bbt; | ||
752 | chip->ecc.layout = &bootrom_ecclayout; | ||
753 | #endif | ||
754 | |||
715 | if (plat->page_size == NFC_PG_SIZE_256) { | 755 | if (plat->page_size == NFC_PG_SIZE_256) { |
716 | chip->ecc.bytes = 3; | 756 | chip->ecc.bytes = 3; |
717 | chip->ecc.size = 256; | 757 | chip->ecc.size = 256; |