bcm63xx: Add Huawei HG556a support
[librecmc/librecmc.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;