summaryrefslogtreecommitdiffstats
path: root/extras/recipes-kernel/linux/linux-omap-2.6.39/sakoman/0025-omap-Fix-mtd-subpage-read-alignment.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap-2.6.39/sakoman/0025-omap-Fix-mtd-subpage-read-alignment.patch')
-rw-r--r--extras/recipes-kernel/linux/linux-omap-2.6.39/sakoman/0025-omap-Fix-mtd-subpage-read-alignment.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap-2.6.39/sakoman/0025-omap-Fix-mtd-subpage-read-alignment.patch b/extras/recipes-kernel/linux/linux-omap-2.6.39/sakoman/0025-omap-Fix-mtd-subpage-read-alignment.patch
new file mode 100644
index 00000000..1508da1a
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-2.6.39/sakoman/0025-omap-Fix-mtd-subpage-read-alignment.patch
@@ -0,0 +1,95 @@
1From acf75c8b4d0f6775527636bf9d41bb1f74fc2f97 Mon Sep 17 00:00:00 2001
2From: Charles Manning <cdhmanning@gmail.com>
3Date: Tue, 18 Jan 2011 11:25:25 +1300
4Subject: [PATCH 25/32] omap: Fix mtd subpage read alignment
5
6This allows the omap2 prefetch engine to work properly for subpage
7reads. Without this ECC errors will stop UBIFS from working.
8
9Signed-off-by: Charles Manning <cdhmanning@gmail.com>
10---
11 drivers/mtd/nand/nand_base.c | 19 +++++++++++++++++++
12 drivers/mtd/nand/omap2.c | 1 +
13 include/linux/mtd/nand.h | 3 +++
14 3 files changed, 23 insertions(+), 0 deletions(-)
15
16diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
17index c54a4cb..6ca7098 100644
18--- a/drivers/mtd/nand/nand_base.c
19+++ b/drivers/mtd/nand/nand_base.c
20@@ -1157,6 +1157,22 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
21 }
22
23 /**
24+ * nand_align_subpage32 - function to align subpage read to 32-bits
25+ * @mtd: mtd info structure
26+ * @buf: pointer to offset that needs to be aligned
27+ * @len: pointer to length that needs to be aligned.
28+ */
29+
30+void nand_align_subpage32(int *offs, int *len)
31+{
32+ int diff = *offs & 3;
33+
34+ *offs = *offs - diff;
35+ *len = (*len + diff + 3) & ~3;
36+}
37+EXPORT_SYMBOL(nand_align_subpage32);
38+
39+/**
40 * nand_read_subpage - [REPLACABLE] software ecc based sub-page read function
41 * @mtd: mtd info structure
42 * @chip: nand chip info structure
43@@ -1221,6 +1237,9 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
44 if (eccpos[index + (num_steps * chip->ecc.bytes)] & (busw - 1))
45 aligned_len++;
46
47+ if(chip->align_subpage)
48+ chip->align_subpage(&aligned_pos, &aligned_len);
49+
50 chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
51 mtd->writesize + aligned_pos, -1);
52 chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);
53diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
54index da9a351..bb89c65 100644
55--- a/drivers/mtd/nand/omap2.c
56+++ b/drivers/mtd/nand/omap2.c
57@@ -1069,6 +1069,7 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
58 info->nand.ecc.correct = omap_correct_data;
59 info->nand.ecc.mode = NAND_ECC_HW;
60 }
61+ info->nand.align_subpage = nand_align_subpage32;
62
63 /* DIP switches on some boards change between 8 and 16 bit
64 * bus widths for flash. Try the other width if the first try fails.
65diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
66index d441927..311f211 100644
67--- a/include/linux/mtd/nand.h
68+++ b/include/linux/mtd/nand.h
69@@ -479,6 +479,7 @@ struct nand_buffers {
70 * additional error status checks (determine if errors are
71 * correctable).
72 * @write_page: [REPLACEABLE] High-level page write function
73+ * @align_subpage: [OPTIONAL] Aligns subpage read buffer.
74 */
75
76 struct nand_chip {
77@@ -507,6 +508,7 @@ struct nand_chip {
78 int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,
79 const uint8_t *buf, int page, int cached, int raw);
80
81+ void (*align_subpage)(int *offs, int *len);
82 int chip_delay;
83 unsigned int options;
84
85@@ -602,6 +604,7 @@ extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
86 int allowbbt);
87 extern int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len,
88 size_t *retlen, uint8_t *buf);
89+extern void nand_align_subpage32(int *offs, int *len);
90
91 /**
92 * struct platform_nand_chip - chip level device structure
93--
941.6.6.1
95