aboutsummaryrefslogtreecommitdiffstats
path: root/package/uboot-lantiq/patches/030-cfi-addr-fixup.patch
blob: 8f95da1f75dda5516275e1612b72be43d21a5700 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
--- a/drivers/mtd/cfi_flash.c
+++ b/drivers/mtd/cfi_flash.c
@@ -85,6 +85,22 @@ flash_info_t flash_info[CFI_MAX_FLASH_BA
 #define CONFIG_SYS_FLASH_CFI_WIDTH	FLASH_CFI_8BIT
 #endif
 
+/*
+ * Check if address fixup macros are defined, define defaults otherwise
+ */
+#ifndef FLASH_FIXUP_ADDR_8
+#define FLASH_FIXUP_ADDR_8(addr)	(addr)
+#endif
+#ifndef FLASH_FIXUP_ADDR_16
+#define FLASH_FIXUP_ADDR_16(addr)	(addr)
+#endif
+#ifndef FLASH_FIXUP_ADDR_32
+#define FLASH_FIXUP_ADDR_32(addr)	(addr)
+#endif
+#ifndef FLASH_FIXUP_ADDR_64
+#define FLASH_FIXUP_ADDR_64(addr)	(addr)
+#endif
+
 static void __flash_write8(u8 value, void *addr)
 {
 	__raw_writeb(value, addr);
@@ -264,9 +280,9 @@ static inline uchar flash_read_uchar (fl
 
 	cp = flash_map (info, 0, offset);
 #if defined(__LITTLE_ENDIAN) || defined(CONFIG_SYS_WRITE_SWAPPED_DATA)
-	retval = flash_read8(cp);
+	retval = flash_read8(FLASH_FIXUP_ADDR_8(cp));
 #else
-	retval = flash_read8(cp + info->portwidth - 1);
+	retval = flash_read8(FLASH_FIXUP_ADDR_8(cp) + info->portwidth - 1);
 #endif
 	flash_unmap (info, 0, offset, cp);
 	return retval;
@@ -280,7 +296,7 @@ static inline ushort flash_read_word (fl
 	ushort *addr, retval;
 
 	addr = flash_map (info, 0, offset);
-	retval = flash_read16 (addr);
+	retval = flash_read16 (FLASH_FIXUP_ADDR_16(addr));
 	flash_unmap (info, 0, offset, addr);
 	return retval;
 }
@@ -305,19 +321,28 @@ static ulong flash_read_long (flash_info
 	debug ("long addr is at %p info->portwidth = %d\n", addr,
 	       info->portwidth);
 	for (x = 0; x < 4 * info->portwidth; x++) {
-		debug ("addr[%x] = 0x%x\n", x, flash_read8(addr + x));
+		debug ("addr[%x] = 0x%x\n", x,
+			flash_read8(FLASH_FIXUP_ADDR_32(addr) + x));
 	}
 #endif
 #if defined(__LITTLE_ENDIAN) || defined(CONFIG_SYS_WRITE_SWAPPED_DATA)
-	retval = ((flash_read8(addr) << 16) |
-		  (flash_read8(addr + info->portwidth) << 24) |
-		  (flash_read8(addr + 2 * info->portwidth)) |
-		  (flash_read8(addr + 3 * info->portwidth) << 8));
+	retval = ((flash_read8(FLASH_FIXUP_ADDR_8
+			      (addr) << 16) |
+		  (flash_read8(FLASH_FIXUP_ADDR_8
+			      (addr + info->portwidth)) << 24) |
+		  (flash_read8(FLASH_FIXUP_ADDR_8
+			      (addr + 2 * info->portwidth))) |
+		  (flash_read8(FLASH_FIXUP_ADDR_8
+			      (addr + 3 * info->portwidth)) << 8));
 #else
-	retval = ((flash_read8(addr + 2 * info->portwidth - 1) << 24) |
-		  (flash_read8(addr + info->portwidth - 1) << 16) |
-		  (flash_read8(addr + 4 * info->portwidth - 1) << 8) |
-		  (flash_read8(addr + 3 * info->portwidth - 1)));
+	retval = ((flash_read8(FLASH_FIXUP_ADDR_8
+			      (addr + 2 * info->portwidth - 1)) << 24) |
+		  (flash_read8(FLASH_FIXUP_ADDR_8
+			      (addr + info->portwidth - 1)) << 16) |
+		  (flash_read8(FLASH_FIXUP_ADDR_8
+			      (addr + 4 * info->portwidth - 1)) << 8) |
+		  (flash_read8(FLASH_FIXUP_ADDR_8
+			      (addr + 3 * info->portwidth - 1))));
 #endif
 	flash_unmap(info, sect, offset, addr);
 
@@ -338,21 +363,22 @@ void flash_write_cmd (flash_info_t * inf
 	flash_make_cmd (info, cmd, &cword);
 	switch (info->portwidth) {
 	case FLASH_CFI_8BIT:
-		debug ("fwc addr %p cmd %x %x 8bit x %d bit\n", addr, cmd,
-		       cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
-		flash_write8(cword.c, addr);
+		debug ("fwc addr %p cmd %x %x 8bit x %d bit\n",
+		       FLASH_FIXUP_ADDR_8(addr), cmd, cword.c,
+		       info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+		flash_write8(cword.c, FLASH_FIXUP_ADDR_8(addr));
 		break;
 	case FLASH_CFI_16BIT:
-		debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n", addr,
-		       cmd, cword.w,
+		debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n",
+		       FLASH_FIXUP_ADDR_16(addr), cmd, cword.w,
 		       info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
-		flash_write16(cword.w, addr);
+		flash_write16(cword.w, FLASH_FIXUP_ADDR_16(addr));
 		break;
 	case FLASH_CFI_32BIT:
-		debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n", addr,
-		       cmd, cword.l,
+		debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n",
+		       FLASH_FIXUP_ADDR_32(addr), cmd, cword.l,
 		       info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
-		flash_write32(cword.l, addr);
+		flash_write32(cword.l, FLASH_FIXUP_ADDR_32(addr));
 		break;
 	case FLASH_CFI_64BIT:
 #ifdef DEBUG
@@ -362,11 +388,11 @@ void flash_write_cmd (flash_info_t * inf
 			print_longlong (str, cword.ll);
 
 			debug ("fwrite addr %p cmd %x %s 64 bit x %d bit\n",
-			       addr, cmd, str,
+			       FLASH_FIXUP_ADDR_64(addr), cmd, str,
 			       info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
 		}
 #endif
-		flash_write64(cword.ll, addr);
+		flash_write64(cword.ll, FLASH_FIXUP_ADDR_64(addr));
 		break;
 	}
 
@@ -397,16 +423,19 @@ static int flash_isequal (flash_info_t *
 	debug ("is= cmd %x(%c) addr %p ", cmd, cmd, addr);
 	switch (info->portwidth) {
 	case FLASH_CFI_8BIT:
-		debug ("is= %x %x\n", flash_read8(addr), cword.c);
-		retval = (flash_read8(addr) == cword.c);
+		debug ("is= %x %x\n",
+		       flash_read8(FLASH_FIXUP_ADDR_8(addr)), cword.c);
+		retval = (flash_read8(FLASH_FIXUP_ADDR_8(addr)) == cword.c);
 		break;
 	case FLASH_CFI_16BIT:
-		debug ("is= %4.4x %4.4x\n", flash_read16(addr), cword.w);
-		retval = (flash_read16(addr) == cword.w);
+		debug ("is= %4.4x %4.4x\n",
+		       flash_read16(FLASH_FIXUP_ADDR_16(addr)), cword.w);
+		retval = (flash_read16(FLASH_FIXUP_ADDR_16(addr)) == cword.w);
 		break;
 	case FLASH_CFI_32BIT:
-		debug ("is= %8.8x %8.8lx\n", flash_read32(addr), cword.l);
-		retval = (flash_read32(addr) == cword.l);
+		debug ("is= %8.8x %8.8lx\n",
+		       flash_read32(FLASH_FIXUP_ADDR_32(addr)), cword.l);
+		retval = (flash_read32(FLASH_FIXUP_ADDR_32(addr)) == cword.l);
 		break;
 	case FLASH_CFI_64BIT:
 #ifdef DEBUG
@@ -414,12 +443,13 @@ static int flash_isequal (flash_info_t *
 			char str1[20];
 			char str2[20];
 
-			print_longlong (str1, flash_read64(addr));
+			print_longlong (str1, flash_read64(FLASH_FIXUP_ADDR_64
+							  (addr)));
 			print_longlong (str2, cword.ll);
 			debug ("is= %s %s\n", str1, str2);
 		}
 #endif
-		retval = (flash_read64(addr) == cword.ll);
+		retval = (flash_read64(FLASH_FIXUP_ADDR_64(addr)) == cword.ll);
 		break;
 	default:
 		retval = 0;
@@ -443,16 +473,20 @@ static int flash_isset (flash_info_t * i
 	flash_make_cmd (info, cmd, &cword);
 	switch (info->portwidth) {
 	case FLASH_CFI_8BIT:
-		retval = ((flash_read8(addr) & cword.c) == cword.c);
+		retval = ((flash_read8(FLASH_FIXUP_ADDR_8(addr))
+			    & cword.c) == cword.c);
 		break;
 	case FLASH_CFI_16BIT:
-		retval = ((flash_read16(addr) & cword.w) == cword.w);
+		retval = ((flash_read16(FLASH_FIXUP_ADDR_16(addr))
+			    & cword.w) == cword.w);
 		break;
 	case FLASH_CFI_32BIT:
-		retval = ((flash_read32(addr) & cword.l) == cword.l);
+		retval = ((flash_read32(FLASH_FIXUP_ADDR_32(addr))
+			    & cword.l) == cword.l);
 		break;
 	case FLASH_CFI_64BIT:
-		retval = ((flash_read64(addr) & cword.ll) == cword.ll);
+		retval = ((flash_read64(FLASH_FIXUP_ADDR_64(addr))
+			    & cword.ll) == cword.ll);
 		break;
 	default:
 		retval = 0;
@@ -476,17 +510,22 @@ static int flash_toggle (flash_info_t * 
 	flash_make_cmd (info, cmd, &cword);
 	switch (info->portwidth) {
 	case FLASH_CFI_8BIT:
-		retval = flash_read8(addr) != flash_read8(addr);
+		retval = flash_read8(FLASH_FIXUP_ADDR_8(addr)) !=
+			 flash_read8(FLASH_FIXUP_ADDR_8(addr));
 		break;
 	case FLASH_CFI_16BIT:
-		retval = flash_read16(addr) != flash_read16(addr);
+		retval = flash_read16(FLASH_FIXUP_ADDR_16(addr)) !=
+			 flash_read16(FLASH_FIXUP_ADDR_16(addr));
 		break;
 	case FLASH_CFI_32BIT:
-		retval = flash_read32(addr) != flash_read32(addr);
+		retval = flash_read32(FLASH_FIXUP_ADDR_32(addr)) !=
+			 flash_read32(FLASH_FIXUP_ADDR_32(addr));
 		break;
 	case FLASH_CFI_64BIT:
-		retval = ( (flash_read32( addr ) != flash_read32( addr )) ||
-			   (flash_read32(addr+4) != flash_read32(addr+4)) );
+		retval = ( (flash_read32(FLASH_FIXUP_ADDR_64( addr )) !=
+			    flash_read32(FLASH_FIXUP_ADDR_64( addr ))) ||
+			   (flash_read32(FLASH_FIXUP_ADDR_64(addr+4)) !=
+			    flash_read32(FLASH_FIXUP_ADDR_64(addr+4))) );
 		break;
 	default:
 		retval = 0;