bcm63xx: Add Huawei HG556a support
[openwrt/openwrt.git] / target / linux / brcm63xx / patches-3.6 / 554-board_hw556.patch
1 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
2 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
3 @@ -2923,6 +2923,366 @@ static struct board_info __initdata boar
4 },
5 };
6
7 +static struct board_info __initdata board_HW556 = {
8 + .name = "HW556",
9 + .expected_cpu_id = 0x6358,
10 +
11 + .has_uart0 = 1,
12 + .has_pci = 1,
13 + .has_ohci0 = 1,
14 + .has_ehci0 = 1,
15 +
16 + .has_caldata = 1,
17 + .caldata = {
18 + {
19 + .caldata_offset = 0xe00000,
20 + },
21 + },
22 +
23 + .has_enet1 = 1,
24 + .enet1 = {
25 + .force_speed_100 = 1,
26 + .force_duplex_full = 1,
27 + },
28 +
29 + .leds = {
30 + {
31 + .name = "HW556:red:message",
32 + .gpio = 0,
33 + .active_low = 1,
34 + },
35 + {
36 + .name = "HW556:red:hspa",
37 + .gpio = 1,
38 + .active_low = 1,
39 + },
40 + {
41 + .name = "HW556:red:dsl",
42 + .gpio = 2,
43 + .active_low = 1,
44 + },
45 + {
46 + .name = "HW556:red:power",
47 + .gpio = 3,
48 + .active_low = 1,
49 + .default_trigger = "default-on",
50 + },
51 + {
52 + .name = "HW556:red:all",
53 + .gpio = 6,
54 + .active_low = 1,
55 + .default_trigger = "default-on",
56 + },
57 + },
58 +
59 + .buttons = {
60 + {
61 + .desc = "help",
62 + .gpio = 8,
63 + .active_low = 1,
64 + .type = EV_KEY,
65 + .code = KEY_HELP,
66 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
67 + },
68 + {
69 + .desc = "wlan",
70 + .gpio = 9,
71 + .active_low = 1,
72 + .type = EV_KEY,
73 + .code = KEY_WLAN,
74 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
75 + },
76 + {
77 + .desc = "restart",
78 + .gpio = 10,
79 + .active_low = 1,
80 + .type = EV_KEY,
81 + .code = KEY_RESTART,
82 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
83 + },
84 + {
85 + .desc = "reset",
86 + .gpio = 11,
87 + .active_low = 1,
88 + .type = EV_KEY,
89 + .code = KEY_CONFIG,
90 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
91 + },
92 + },
93 +};
94 +static struct board_info __initdata board_HW556_A = {
95 + .name = "HW556_A",
96 + .expected_cpu_id = 0x6358,
97 +
98 + .has_uart0 = 1,
99 + .has_pci = 1,
100 + .has_ohci0 = 1,
101 + .has_ehci0 = 1,
102 +
103 + .has_caldata = 1,
104 + .caldata = {
105 + {
106 + .vendor = PCI_VENDOR_ID_RALINK,
107 + .caldata_offset = 0xeffe00,
108 + .slot = 1,
109 + .eeprom = "rt2x00.eeprom",
110 + },
111 + },
112 +
113 + .has_enet1 = 1,
114 + .enet1 = {
115 + .force_speed_100 = 1,
116 + .force_duplex_full = 1,
117 + },
118 +
119 + .leds = {
120 + {
121 + .name = "HW556:red:message",
122 + .gpio = 0,
123 + .active_low = 1,
124 + },
125 + {
126 + .name = "HW556:red:hspa",
127 + .gpio = 1,
128 + .active_low = 1,
129 + },
130 + {
131 + .name = "HW556:red:dsl",
132 + .gpio = 2,
133 + .active_low = 1,
134 + },
135 + {
136 + .name = "HW556:red:power",
137 + .gpio = 3,
138 + .active_low = 1,
139 + .default_trigger = "default-on",
140 + },
141 + {
142 + .name = "HW556:red:all",
143 + .gpio = 6,
144 + .active_low = 1,
145 + .default_trigger = "default-on",
146 + },
147 + },
148 +
149 + .buttons = {
150 + {
151 + .desc = "help",
152 + .gpio = 8,
153 + .active_low = 1,
154 + .type = EV_KEY,
155 + .code = KEY_HELP,
156 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
157 + },
158 + {
159 + .desc = "wlan",
160 + .gpio = 9,
161 + .active_low = 1,
162 + .type = EV_KEY,
163 + .code = KEY_WLAN,
164 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
165 + },
166 + {
167 + .desc = "restart",
168 + .gpio = 10,
169 + .active_low = 1,
170 + .type = EV_KEY,
171 + .code = KEY_RESTART,
172 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
173 + },
174 + {
175 + .desc = "reset",
176 + .gpio = 11,
177 + .active_low = 1,
178 + .type = EV_KEY,
179 + .code = KEY_CONFIG,
180 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
181 + },
182 + },
183 +};
184 +static struct board_info __initdata board_HW556_B = {
185 + .name = "HW556_B",
186 + .expected_cpu_id = 0x6358,
187 +
188 + .has_uart0 = 1,
189 + .has_pci = 1,
190 + .has_ohci0 = 1,
191 + .has_ehci0 = 1,
192 +
193 + .has_caldata = 1,
194 + .caldata = {
195 + {
196 + .vendor = PCI_VENDOR_ID_ATHEROS,
197 + .caldata_offset = 0xf7e000,
198 + .slot = 1,
199 + .endian_check = 1,
200 + .led_pin = 2,
201 + },
202 + },
203 +
204 + .has_enet1 = 1,
205 + .enet1 = {
206 + .force_speed_100 = 1,
207 + .force_duplex_full = 1,
208 + },
209 +
210 + .leds = {
211 + {
212 + .name = "HW556:red:message",
213 + .gpio = 0,
214 + .active_low = 1,
215 + },
216 + {
217 + .name = "HW556:red:hspa",
218 + .gpio = 1,
219 + .active_low = 1,
220 + },
221 + {
222 + .name = "HW556:red:dsl",
223 + .gpio = 2,
224 + .active_low = 1,
225 + },
226 + {
227 + .name = "HW556:red:power",
228 + .gpio = 3,
229 + .active_low = 1,
230 + .default_trigger = "default-on",
231 + },
232 + {
233 + .name = "HW556:red:all",
234 + .gpio = 6,
235 + .active_low = 1,
236 + .default_trigger = "default-on",
237 + },
238 + },
239 +
240 + .buttons = {
241 + {
242 + .desc = "help",
243 + .gpio = 8,
244 + .active_low = 1,
245 + .type = EV_KEY,
246 + .code = KEY_HELP,
247 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
248 + },
249 + {
250 + .desc = "wlan",
251 + .gpio = 9,
252 + .active_low = 1,
253 + .type = EV_KEY,
254 + .code = KEY_WLAN,
255 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
256 + },
257 + {
258 + .desc = "restart",
259 + .gpio = 10,
260 + .active_low = 1,
261 + .type = EV_KEY,
262 + .code = KEY_RESTART,
263 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
264 + },
265 + {
266 + .desc = "reset",
267 + .gpio = 11,
268 + .active_low = 1,
269 + .type = EV_KEY,
270 + .code = KEY_CONFIG,
271 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
272 + },
273 + },
274 +};
275 +static struct board_info __initdata board_HW556_C = {
276 + .name = "HW556_C",
277 + .expected_cpu_id = 0x6358,
278 +
279 + .has_uart0 = 1,
280 + .has_pci = 1,
281 + .has_ohci0 = 1,
282 + .has_ehci0 = 1,
283 +
284 + .has_caldata = 1,
285 + .caldata = {
286 + {
287 + .vendor = PCI_VENDOR_ID_ATHEROS,
288 + .caldata_offset = 0xefe000,
289 + .slot = 1,
290 + .endian_check = 1,
291 + .led_pin = 2,
292 + },
293 + },
294 +
295 + .has_enet1 = 1,
296 + .enet1 = {
297 + .force_speed_100 = 1,
298 + .force_duplex_full = 1,
299 + },
300 +
301 + .leds = {
302 + {
303 + .name = "HW556:red:message",
304 + .gpio = 0,
305 + .active_low = 1,
306 + },
307 + {
308 + .name = "HW556:red:hspa",
309 + .gpio = 1,
310 + .active_low = 1,
311 + },
312 + {
313 + .name = "HW556:red:dsl",
314 + .gpio = 2,
315 + .active_low = 1,
316 + },
317 + {
318 + .name = "HW556:red:power",
319 + .gpio = 3,
320 + .active_low = 1,
321 + .default_trigger = "default-on",
322 + },
323 + {
324 + .name = "HW556:red:all",
325 + .gpio = 6,
326 + .active_low = 1,
327 + .default_trigger = "default-on",
328 + },
329 + },
330 +
331 + .buttons = {
332 + {
333 + .desc = "help",
334 + .gpio = 8,
335 + .active_low = 1,
336 + .type = EV_KEY,
337 + .code = KEY_HELP,
338 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
339 + },
340 + {
341 + .desc = "wlan",
342 + .gpio = 9,
343 + .active_low = 1,
344 + .type = EV_KEY,
345 + .code = KEY_WLAN,
346 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
347 + },
348 + {
349 + .desc = "restart",
350 + .gpio = 10,
351 + .active_low = 1,
352 + .type = EV_KEY,
353 + .code = KEY_RESTART,
354 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
355 + },
356 + {
357 + .desc = "reset",
358 + .gpio = 11,
359 + .active_low = 1,
360 + .type = EV_KEY,
361 + .code = KEY_CONFIG,
362 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
363 + },
364 + },
365 +};
366 +
367 /* T-Home Speedport W 303V Typ B */
368 static struct board_info __initdata board_spw303v = {
369 .name = "96358-502V",
370 @@ -3349,6 +3709,10 @@ static const struct board_info __initdat
371 &board_nb4_fxc_r2,
372 &board_ct6373_1,
373 &board_HW553,
374 + &board_HW556,
375 + &board_HW556_A,
376 + &board_HW556_B,
377 + &board_HW556_C,
378 &board_spw303v,
379 &board_DVAG3810BN,
380 #endif
381 @@ -3414,13 +3778,37 @@ static void __init boardid_fixup(u8 *boo
382 struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
383 char *board_name = (char *)bcm63xx_nvram_get_name();
384
385 - if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
386 - u8 *p = boot_addr + NB4_PID_OFFSET;
387 -
388 - /* Extract nb4 PID */
389 - if (!memcmp(p, "NB4-", 4)) {
390 - memcpy(board_name, p, sizeof("NB4-XXX-rX"));
391 - return;
392 + if (BCMCPU_IS_6358()) {
393 + if (!strcmp(board_name, "96358VW")) {
394 + u8 *p = boot_addr + NB4_PID_OFFSET;
395 +
396 + /* Extract nb4 PID */
397 + if (!memcmp(p, "NB4-", 4)) {
398 + memcpy(board_name, p, sizeof("NB4-XXX-rX"));
399 + return;
400 + }
401 + } else if (!strcmp(board_name, "HW556")) {
402 + /*
403 + * HW556 has different wlan caldatas depending on
404 + * hardware version.
405 + * Detect hardware version and change board id
406 + */
407 + u8 cal_data_ath9k[4] = { 0xa5, 0x5a, 0, 0 };
408 + u8 cal_data_rt3062[4] = { 0x62, 0x30, 1, 0 };
409 +
410 + if (!memcmp(boot_addr + 0xeffe00,
411 + &cal_data_rt3062, 4)) {
412 + /* Ralink 0xeffe00 */
413 + memcpy(board_name, "HW556_A", 7);
414 + } else if (!memcmp(boot_addr + 0xf7e000,
415 + &cal_data_ath9k, 4)) {
416 + /* Atheros 0xf7e000 */
417 + memcpy(board_name, "HW556_B", 7);
418 + } else if (!memcmp(boot_addr + 0xefe000,
419 + &cal_data_ath9k, 4)) {
420 + /* Atheros 0xefe000 */
421 + memcpy(board_name, "HW556_C", 7);
422 + }
423 }
424 }
425
426 --- a/drivers/mtd/bcm63xxpart.c
427 +++ b/drivers/mtd/bcm63xxpart.c
428 @@ -93,6 +93,11 @@ static int bcm63xx_parse_cfe_partitions(
429 BCM63XX_CFE_BLOCK_SIZE);
430
431 cfelen = cfe_erasesize;
432 +
433 + /* Fix HW556 MX29LV128DB */
434 + if (!strncmp(bcm63xx_nvram_get_name(), "HW556", 5))
435 + cfelen = 0x20000;
436 +
437 nvramlen = bcm63xx_nvram_get_psi_size() * 1024;
438 nvramlen = roundup(nvramlen, cfe_erasesize);
439 nvramaddr = master->size - nvramlen;