kernel: update bcma and ssb to master-2012-12-11-2 from wireless-testing
[openwrt.git] / target / linux / generic / patches-3.6 / 020-ssb_update.patch
1 --- a/drivers/ssb/b43_pci_bridge.c
2 +++ b/drivers/ssb/b43_pci_bridge.c
3 @@ -37,6 +37,7 @@ static const struct pci_device_id b43_pc
4         { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4329) },
5         { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x432b) },
6         { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x432c) },
7 +       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4350) },
8         { 0, },
9  };
10  MODULE_DEVICE_TABLE(pci, b43_pci_bridge_tbl);
11 --- a/drivers/ssb/driver_chipcommon.c
12 +++ b/drivers/ssb/driver_chipcommon.c
13 @@ -4,6 +4,7 @@
14   *
15   * Copyright 2005, Broadcom Corporation
16   * Copyright 2006, 2007, Michael Buesch <m@bues.ch>
17 + * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de>
18   *
19   * Licensed under the GNU/GPL. See COPYING for details.
20   */
21 @@ -12,6 +13,7 @@
22  #include <linux/ssb/ssb_regs.h>
23  #include <linux/export.h>
24  #include <linux/pci.h>
25 +#include <linux/bcm47xx_wdt.h>
26  
27  #include "ssb_private.h"
28  
29 @@ -280,6 +282,69 @@ static void calc_fast_powerup_delay(stru
30         cc->fast_pwrup_delay = tmp;
31  }
32  
33 +static u32 ssb_chipco_alp_clock(struct ssb_chipcommon *cc)
34 +{
35 +       if (cc->capabilities & SSB_CHIPCO_CAP_PMU)
36 +               return ssb_pmu_get_alp_clock(cc);
37 +
38 +       return 20000000;
39 +}
40 +
41 +static u32 ssb_chipco_watchdog_get_max_timer(struct ssb_chipcommon *cc)
42 +{
43 +       u32 nb;
44 +
45 +       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
46 +               if (cc->dev->id.revision < 26)
47 +                       nb = 16;
48 +               else
49 +                       nb = (cc->dev->id.revision >= 37) ? 32 : 24;
50 +       } else {
51 +               nb = 28;
52 +       }
53 +       if (nb == 32)
54 +               return 0xffffffff;
55 +       else
56 +               return (1 << nb) - 1;
57 +}
58 +
59 +u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks)
60 +{
61 +       struct ssb_chipcommon *cc = bcm47xx_wdt_get_drvdata(wdt);
62 +
63 +       if (cc->dev->bus->bustype != SSB_BUSTYPE_SSB)
64 +               return 0;
65 +
66 +       return ssb_chipco_watchdog_timer_set(cc, ticks);
67 +}
68 +
69 +u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms)
70 +{
71 +       struct ssb_chipcommon *cc = bcm47xx_wdt_get_drvdata(wdt);
72 +       u32 ticks;
73 +
74 +       if (cc->dev->bus->bustype != SSB_BUSTYPE_SSB)
75 +               return 0;
76 +
77 +       ticks = ssb_chipco_watchdog_timer_set(cc, cc->ticks_per_ms * ms);
78 +       return ticks / cc->ticks_per_ms;
79 +}
80 +
81 +static int ssb_chipco_watchdog_ticks_per_ms(struct ssb_chipcommon *cc)
82 +{
83 +       struct ssb_bus *bus = cc->dev->bus;
84 +
85 +       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
86 +                       /* based on 32KHz ILP clock */
87 +                       return 32;
88 +       } else {
89 +               if (cc->dev->id.revision < 18)
90 +                       return ssb_clockspeed(bus) / 1000;
91 +               else
92 +                       return ssb_chipco_alp_clock(cc) / 1000;
93 +       }
94 +}
95 +
96  void ssb_chipcommon_init(struct ssb_chipcommon *cc)
97  {
98         if (!cc->dev)
99 @@ -297,6 +362,11 @@ void ssb_chipcommon_init(struct ssb_chip
100         chipco_powercontrol_init(cc);
101         ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST);
102         calc_fast_powerup_delay(cc);
103 +
104 +       if (cc->dev->bus->bustype == SSB_BUSTYPE_SSB) {
105 +               cc->ticks_per_ms = ssb_chipco_watchdog_ticks_per_ms(cc);
106 +               cc->max_timer_ms = ssb_chipco_watchdog_get_max_timer(cc) / cc->ticks_per_ms;
107 +       }
108  }
109  
110  void ssb_chipco_suspend(struct ssb_chipcommon *cc)
111 @@ -395,10 +465,27 @@ void ssb_chipco_timing_init(struct ssb_c
112  }
113  
114  /* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */
115 -void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks)
116 +u32 ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks)
117  {
118 -       /* instant NMI */
119 -       chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks);
120 +       u32 maxt;
121 +       enum ssb_clkmode clkmode;
122 +
123 +       maxt = ssb_chipco_watchdog_get_max_timer(cc);
124 +       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
125 +               if (ticks == 1)
126 +                       ticks = 2;
127 +               else if (ticks > maxt)
128 +                       ticks = maxt;
129 +               chipco_write32(cc, SSB_CHIPCO_PMU_WATCHDOG, ticks);
130 +       } else {
131 +               clkmode = ticks ? SSB_CLKMODE_FAST : SSB_CLKMODE_DYNAMIC;
132 +               ssb_chipco_set_clockmode(cc, clkmode);
133 +               if (ticks > maxt)
134 +                       ticks = maxt;
135 +               /* instant NMI */
136 +               chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks);
137 +       }
138 +       return ticks;
139  }
140  
141  void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value)
142 @@ -473,12 +560,7 @@ int ssb_chipco_serial_init(struct ssb_ch
143                                        chipco_read32(cc, SSB_CHIPCO_CORECTL)
144                                        | SSB_CHIPCO_CORECTL_UARTCLK0);
145                 } else if ((ccrev >= 11) && (ccrev != 15)) {
146 -                       /* Fixed ALP clock */
147 -                       baud_base = 20000000;
148 -                       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
149 -                               /* FIXME: baud_base is different for devices with a PMU */
150 -                               SSB_WARN_ON(1);
151 -                       }
152 +                       baud_base = ssb_chipco_alp_clock(cc);
153                         div = 1;
154                         if (ccrev >= 21) {
155                                 /* Turn off UART clock before switching clocksource. */
156 --- a/drivers/ssb/driver_chipcommon_pmu.c
157 +++ b/drivers/ssb/driver_chipcommon_pmu.c
158 @@ -346,6 +346,8 @@ static void ssb_pmu_pll_init(struct ssb_
159                         chipco_write32(cc, SSB_CHIPCO_PLLCTL_DATA, 0x380005C0);
160                 }
161                 break;
162 +       case 43222:
163 +               break;
164         default:
165                 ssb_printk(KERN_ERR PFX
166                            "ERROR: PLL init unknown for device %04X\n",
167 @@ -434,6 +436,7 @@ static void ssb_pmu_resources_init(struc
168                  min_msk = 0xCBB;
169                  break;
170         case 0x4322:
171 +       case 43222:
172                 /* We keep the default settings:
173                  * min_msk = 0xCBB
174                  * max_msk = 0x7FFFF
175 @@ -615,6 +618,33 @@ void ssb_pmu_set_ldo_paref(struct ssb_ch
176  EXPORT_SYMBOL(ssb_pmu_set_ldo_voltage);
177  EXPORT_SYMBOL(ssb_pmu_set_ldo_paref);
178  
179 +static u32 ssb_pmu_get_alp_clock_clk0(struct ssb_chipcommon *cc)
180 +{
181 +       u32 crystalfreq;
182 +       const struct pmu0_plltab_entry *e = NULL;
183 +
184 +       crystalfreq = chipco_read32(cc, SSB_CHIPCO_PMU_CTL) &
185 +                     SSB_CHIPCO_PMU_CTL_XTALFREQ >> SSB_CHIPCO_PMU_CTL_XTALFREQ_SHIFT;
186 +       e = pmu0_plltab_find_entry(crystalfreq);
187 +       BUG_ON(!e);
188 +       return e->freq * 1000;
189 +}
190 +
191 +u32 ssb_pmu_get_alp_clock(struct ssb_chipcommon *cc)
192 +{
193 +       struct ssb_bus *bus = cc->dev->bus;
194 +
195 +       switch (bus->chip_id) {
196 +       case 0x5354:
197 +               ssb_pmu_get_alp_clock_clk0(cc);
198 +       default:
199 +               ssb_printk(KERN_ERR PFX
200 +                          "ERROR: PMU alp clock unknown for device %04X\n",
201 +                          bus->chip_id);
202 +               return 0;
203 +       }
204 +}
205 +
206  u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc)
207  {
208         struct ssb_bus *bus = cc->dev->bus;
209 --- a/drivers/ssb/driver_extif.c
210 +++ b/drivers/ssb/driver_extif.c
211 @@ -112,10 +112,30 @@ void ssb_extif_get_clockcontrol(struct s
212         *m = extif_read32(extif, SSB_EXTIF_CLOCK_SB);
213  }
214  
215 -void ssb_extif_watchdog_timer_set(struct ssb_extif *extif,
216 -                                 u32 ticks)
217 +u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks)
218  {
219 +       struct ssb_extif *extif = bcm47xx_wdt_get_drvdata(wdt);
220 +
221 +       return ssb_extif_watchdog_timer_set(extif, ticks);
222 +}
223 +
224 +u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms)
225 +{
226 +       struct ssb_extif *extif = bcm47xx_wdt_get_drvdata(wdt);
227 +       u32 ticks = (SSB_EXTIF_WATCHDOG_CLK / 1000) * ms;
228 +
229 +       ticks = ssb_extif_watchdog_timer_set(extif, ticks);
230 +
231 +       return (ticks * 1000) / SSB_EXTIF_WATCHDOG_CLK;
232 +}
233 +
234 +u32 ssb_extif_watchdog_timer_set(struct ssb_extif *extif, u32 ticks)
235 +{
236 +       if (ticks > SSB_EXTIF_WATCHDOG_MAX_TIMER)
237 +               ticks = SSB_EXTIF_WATCHDOG_MAX_TIMER;
238         extif_write32(extif, SSB_EXTIF_WATCHDOG, ticks);
239 +
240 +       return ticks;
241  }
242  
243  u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask)
244 --- a/drivers/ssb/driver_mipscore.c
245 +++ b/drivers/ssb/driver_mipscore.c
246 @@ -178,9 +178,9 @@ static void ssb_mips_serial_init(struct
247  {
248         struct ssb_bus *bus = mcore->dev->bus;
249  
250 -       if (bus->extif.dev)
251 +       if (ssb_extif_available(&bus->extif))
252                 mcore->nr_serial_ports = ssb_extif_serial_init(&bus->extif, mcore->serial_ports);
253 -       else if (bus->chipco.dev)
254 +       else if (ssb_chipco_available(&bus->chipco))
255                 mcore->nr_serial_ports = ssb_chipco_serial_init(&bus->chipco, mcore->serial_ports);
256         else
257                 mcore->nr_serial_ports = 0;
258 @@ -190,16 +190,32 @@ static void ssb_mips_flash_detect(struct
259  {
260         struct ssb_bus *bus = mcore->dev->bus;
261  
262 -       mcore->flash_buswidth = 2;
263 -       if (bus->chipco.dev) {
264 -               mcore->flash_window = 0x1c000000;
265 -               mcore->flash_window_size = 0x02000000;
266 +       /* When there is no chipcommon on the bus there is 4MB flash */
267 +       if (!ssb_chipco_available(&bus->chipco)) {
268 +               mcore->pflash.present = true;
269 +               mcore->pflash.buswidth = 2;
270 +               mcore->pflash.window = SSB_FLASH1;
271 +               mcore->pflash.window_size = SSB_FLASH1_SZ;
272 +               return;
273 +       }
274 +
275 +       /* There is ChipCommon, so use it to read info about flash */
276 +       switch (bus->chipco.capabilities & SSB_CHIPCO_CAP_FLASHT) {
277 +       case SSB_CHIPCO_FLASHT_STSER:
278 +       case SSB_CHIPCO_FLASHT_ATSER:
279 +               pr_err("Serial flash not supported\n");
280 +               break;
281 +       case SSB_CHIPCO_FLASHT_PARA:
282 +               pr_debug("Found parallel flash\n");
283 +               mcore->pflash.present = true;
284 +               mcore->pflash.window = SSB_FLASH2;
285 +               mcore->pflash.window_size = SSB_FLASH2_SZ;
286                 if ((ssb_read32(bus->chipco.dev, SSB_CHIPCO_FLASH_CFG)
287                                & SSB_CHIPCO_CFG_DS16) == 0)
288 -                       mcore->flash_buswidth = 1;
289 -       } else {
290 -               mcore->flash_window = 0x1fc00000;
291 -               mcore->flash_window_size = 0x00400000;
292 +                       mcore->pflash.buswidth = 1;
293 +               else
294 +                       mcore->pflash.buswidth = 2;
295 +               break;
296         }
297  }
298  
299 @@ -211,9 +227,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m
300         if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU)
301                 return ssb_pmu_get_cpu_clock(&bus->chipco);
302  
303 -       if (bus->extif.dev) {
304 +       if (ssb_extif_available(&bus->extif)) {
305                 ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m);
306 -       } else if (bus->chipco.dev) {
307 +       } else if (ssb_chipco_available(&bus->chipco)) {
308                 ssb_chipco_get_clockcpu(&bus->chipco, &pll_type, &n, &m);
309         } else
310                 return 0;
311 @@ -249,9 +265,9 @@ void ssb_mipscore_init(struct ssb_mipsco
312                 hz = 100000000;
313         ns = 1000000000 / hz;
314  
315 -       if (bus->extif.dev)
316 +       if (ssb_extif_available(&bus->extif))
317                 ssb_extif_timing_init(&bus->extif, ns);
318 -       else if (bus->chipco.dev)
319 +       else if (ssb_chipco_available(&bus->chipco))
320                 ssb_chipco_timing_init(&bus->chipco, ns);
321  
322         /* Assign IRQs to all cores on the bus, start with irq line 2, because serial usually takes 1 */
323 --- a/drivers/ssb/embedded.c
324 +++ b/drivers/ssb/embedded.c
325 @@ -4,11 +4,13 @@
326   *
327   * Copyright 2005-2008, Broadcom Corporation
328   * Copyright 2006-2008, Michael Buesch <m@bues.ch>
329 + * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de>
330   *
331   * Licensed under the GNU/GPL. See COPYING for details.
332   */
333  
334  #include <linux/export.h>
335 +#include <linux/platform_device.h>
336  #include <linux/ssb/ssb.h>
337  #include <linux/ssb/ssb_embedded.h>
338  #include <linux/ssb/ssb_driver_pci.h>
339 @@ -32,6 +34,39 @@ int ssb_watchdog_timer_set(struct ssb_bu
340  }
341  EXPORT_SYMBOL(ssb_watchdog_timer_set);
342  
343 +int ssb_watchdog_register(struct ssb_bus *bus)
344 +{
345 +       struct bcm47xx_wdt wdt = {};
346 +       struct platform_device *pdev;
347 +
348 +       if (ssb_chipco_available(&bus->chipco)) {
349 +               wdt.driver_data = &bus->chipco;
350 +               wdt.timer_set = ssb_chipco_watchdog_timer_set_wdt;
351 +               wdt.timer_set_ms = ssb_chipco_watchdog_timer_set_ms;
352 +               wdt.max_timer_ms = bus->chipco.max_timer_ms;
353 +       } else if (ssb_extif_available(&bus->extif)) {
354 +               wdt.driver_data = &bus->extif;
355 +               wdt.timer_set = ssb_extif_watchdog_timer_set_wdt;
356 +               wdt.timer_set_ms = ssb_extif_watchdog_timer_set_ms;
357 +               wdt.max_timer_ms = SSB_EXTIF_WATCHDOG_MAX_TIMER_MS;
358 +       } else {
359 +               return -ENODEV;
360 +       }
361 +
362 +       pdev = platform_device_register_data(NULL, "bcm47xx-wdt",
363 +                                            bus->busnumber, &wdt,
364 +                                            sizeof(wdt));
365 +       if (IS_ERR(pdev)) {
366 +               ssb_dprintk(KERN_INFO PFX
367 +                           "can not register watchdog device, err: %li\n",
368 +                           PTR_ERR(pdev));
369 +               return PTR_ERR(pdev);
370 +       }
371 +
372 +       bus->watchdog = pdev;
373 +       return 0;
374 +}
375 +
376  u32 ssb_gpio_in(struct ssb_bus *bus, u32 mask)
377  {
378         unsigned long flags;
379 --- a/drivers/ssb/main.c
380 +++ b/drivers/ssb/main.c
381 @@ -13,6 +13,7 @@
382  #include <linux/delay.h>
383  #include <linux/io.h>
384  #include <linux/module.h>
385 +#include <linux/platform_device.h>
386  #include <linux/ssb/ssb.h>
387  #include <linux/ssb/ssb_regs.h>
388  #include <linux/ssb/ssb_driver_gige.h>
389 @@ -433,6 +434,11 @@ static void ssb_devices_unregister(struc
390                 if (sdev->dev)
391                         device_unregister(sdev->dev);
392         }
393 +
394 +#ifdef CONFIG_SSB_EMBEDDED
395 +       if (bus->bustype == SSB_BUSTYPE_SSB)
396 +               platform_device_unregister(bus->watchdog);
397 +#endif
398  }
399  
400  void ssb_bus_unregister(struct ssb_bus *bus)
401 @@ -561,6 +567,8 @@ static int __devinit ssb_attach_queued_b
402                 if (err)
403                         goto error;
404                 ssb_pcicore_init(&bus->pcicore);
405 +               if (bus->bustype == SSB_BUSTYPE_SSB)
406 +                       ssb_watchdog_register(bus);
407                 ssb_bus_may_powerdown(bus);
408  
409                 err = ssb_devices_register(bus);
410 @@ -1118,8 +1126,7 @@ static u32 ssb_tmslow_reject_bitmask(str
411         case SSB_IDLOW_SSBREV_27:     /* same here */
412                 return SSB_TMSLOW_REJECT;       /* this is a guess */
413         default:
414 -               printk(KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev);
415 -               WARN_ON(1);
416 +               WARN(1, KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev);
417         }
418         return (SSB_TMSLOW_REJECT | SSB_TMSLOW_REJECT_23);
419  }
420 --- a/drivers/ssb/ssb_private.h
421 +++ b/drivers/ssb/ssb_private.h
422 @@ -3,6 +3,7 @@
423  
424  #include <linux/ssb/ssb.h>
425  #include <linux/types.h>
426 +#include <linux/bcm47xx_wdt.h>
427  
428  
429  #define PFX    "ssb: "
430 @@ -210,5 +211,35 @@ static inline void b43_pci_ssb_bridge_ex
431  /* driver_chipcommon_pmu.c */
432  extern u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc);
433  extern u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc);
434 +extern u32 ssb_pmu_get_alp_clock(struct ssb_chipcommon *cc);
435 +
436 +extern u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt,
437 +                                            u32 ticks);
438 +extern u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
439 +
440 +#ifdef CONFIG_SSB_DRIVER_EXTIF
441 +extern u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks);
442 +extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
443 +#else
444 +static inline u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt,
445 +                                                  u32 ticks)
446 +{
447 +       return 0;
448 +}
449 +static inline u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt,
450 +                                                 u32 ms)
451 +{
452 +       return 0;
453 +}
454 +#endif
455 +
456 +#ifdef CONFIG_SSB_EMBEDDED
457 +extern int ssb_watchdog_register(struct ssb_bus *bus);
458 +#else /* CONFIG_SSB_EMBEDDED */
459 +static inline int ssb_watchdog_register(struct ssb_bus *bus)
460 +{
461 +       return 0;
462 +}
463 +#endif /* CONFIG_SSB_EMBEDDED */
464  
465  #endif /* LINUX_SSB_PRIVATE_H_ */
466 --- a/include/linux/ssb/ssb.h
467 +++ b/include/linux/ssb/ssb.h
468 @@ -8,6 +8,7 @@
469  #include <linux/pci.h>
470  #include <linux/mod_devicetable.h>
471  #include <linux/dma-mapping.h>
472 +#include <linux/platform_device.h>
473  
474  #include <linux/ssb/ssb_regs.h>
475  
476 @@ -432,6 +433,7 @@ struct ssb_bus {
477  #ifdef CONFIG_SSB_EMBEDDED
478         /* Lock for GPIO register access. */
479         spinlock_t gpio_lock;
480 +       struct platform_device *watchdog;
481  #endif /* EMBEDDED */
482  
483         /* Internal-only stuff follows. Do not touch. */
484 --- a/include/linux/ssb/ssb_driver_chipcommon.h
485 +++ b/include/linux/ssb/ssb_driver_chipcommon.h
486 @@ -504,7 +504,9 @@
487  #define SSB_CHIPCO_FLASHCTL_ST_SE      0x02D8          /* Sector Erase */
488  #define SSB_CHIPCO_FLASHCTL_ST_BE      0x00C7          /* Bulk Erase */
489  #define SSB_CHIPCO_FLASHCTL_ST_DP      0x00B9          /* Deep Power-down */
490 -#define SSB_CHIPCO_FLASHCTL_ST_RSIG    0x03AB          /* Read Electronic Signature */
491 +#define SSB_CHIPCO_FLASHCTL_ST_RES     0x03AB          /* Read Electronic Signature */
492 +#define SSB_CHIPCO_FLASHCTL_ST_CSA     0x1000          /* Keep chip select asserted */
493 +#define SSB_CHIPCO_FLASHCTL_ST_SSE     0x0220          /* Sub-sector Erase */
494  
495  /* Status register bits for ST flashes */
496  #define SSB_CHIPCO_FLASHSTA_ST_WIP     0x01            /* Write In Progress */
497 @@ -589,6 +591,8 @@ struct ssb_chipcommon {
498         /* Fast Powerup Delay constant */
499         u16 fast_pwrup_delay;
500         struct ssb_chipcommon_pmu pmu;
501 +       u32 ticks_per_ms;
502 +       u32 max_timer_ms;
503  };
504  
505  static inline bool ssb_chipco_available(struct ssb_chipcommon *cc)
506 @@ -628,8 +632,7 @@ enum ssb_clkmode {
507  extern void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc,
508                                      enum ssb_clkmode mode);
509  
510 -extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc,
511 -                                         u32 ticks);
512 +extern u32 ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks);
513  
514  void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value);
515  
516 --- a/include/linux/ssb/ssb_driver_extif.h
517 +++ b/include/linux/ssb/ssb_driver_extif.h
518 @@ -152,6 +152,9 @@
519  /* watchdog */
520  #define SSB_EXTIF_WATCHDOG_CLK         48000000        /* Hz */
521  
522 +#define SSB_EXTIF_WATCHDOG_MAX_TIMER   ((1 << 28) - 1)
523 +#define SSB_EXTIF_WATCHDOG_MAX_TIMER_MS        (SSB_EXTIF_WATCHDOG_MAX_TIMER \
524 +                                        / (SSB_EXTIF_WATCHDOG_CLK / 1000))
525  
526  
527  #ifdef CONFIG_SSB_DRIVER_EXTIF
528 @@ -171,8 +174,7 @@ extern void ssb_extif_get_clockcontrol(s
529  extern void ssb_extif_timing_init(struct ssb_extif *extif,
530                                   unsigned long ns);
531  
532 -extern void ssb_extif_watchdog_timer_set(struct ssb_extif *extif,
533 -                                        u32 ticks);
534 +extern u32 ssb_extif_watchdog_timer_set(struct ssb_extif *extif, u32 ticks);
535  
536  /* Extif GPIO pin access */
537  u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask);
538 @@ -205,10 +207,52 @@ void ssb_extif_get_clockcontrol(struct s
539  }
540  
541  static inline
542 -void ssb_extif_watchdog_timer_set(struct ssb_extif *extif,
543 -                                 u32 ticks)
544 +void ssb_extif_timing_init(struct ssb_extif *extif, unsigned long ns)
545  {
546  }
547  
548 +static inline
549 +u32 ssb_extif_watchdog_timer_set(struct ssb_extif *extif, u32 ticks)
550 +{
551 +       return 0;
552 +}
553 +
554 +static inline u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask)
555 +{
556 +       return 0;
557 +}
558 +
559 +static inline u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask,
560 +                                    u32 value)
561 +{
562 +       return 0;
563 +}
564 +
565 +static inline u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask,
566 +                                      u32 value)
567 +{
568 +       return 0;
569 +}
570 +
571 +static inline u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask,
572 +                                         u32 value)
573 +{
574 +       return 0;
575 +}
576 +
577 +static inline u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask,
578 +                                        u32 value)
579 +{
580 +       return 0;
581 +}
582 +
583 +#ifdef CONFIG_SSB_SERIAL
584 +static inline int ssb_extif_serial_init(struct ssb_extif *extif,
585 +                                       struct ssb_serial_port *ports)
586 +{
587 +       return 0;
588 +}
589 +#endif /* CONFIG_SSB_SERIAL */
590 +
591  #endif /* CONFIG_SSB_DRIVER_EXTIF */
592  #endif /* LINUX_SSB_EXTIFCORE_H_ */
593 --- a/include/linux/ssb/ssb_driver_mips.h
594 +++ b/include/linux/ssb/ssb_driver_mips.h
595 @@ -13,6 +13,12 @@ struct ssb_serial_port {
596         unsigned int reg_shift;
597  };
598  
599 +struct ssb_pflash {
600 +       bool present;
601 +       u8 buswidth;
602 +       u32 window;
603 +       u32 window_size;
604 +};
605  
606  struct ssb_mipscore {
607         struct ssb_device *dev;
608 @@ -20,9 +26,7 @@ struct ssb_mipscore {
609         int nr_serial_ports;
610         struct ssb_serial_port serial_ports[4];
611  
612 -       u8 flash_buswidth;
613 -       u32 flash_window;
614 -       u32 flash_window_size;
615 +       struct ssb_pflash pflash;
616  };
617  
618  extern void ssb_mipscore_init(struct ssb_mipscore *mcore);
619 --- a/include/linux/ssb/ssb_regs.h
620 +++ b/include/linux/ssb/ssb_regs.h
621 @@ -485,7 +485,7 @@
622  #define  SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT 4
623  #define  SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL        0x0020
624  #define  SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT  5
625 -#define SSB_SPROM8_TEMPDELTA           0x00BA
626 +#define SSB_SPROM8_TEMPDELTA           0x00BC
627  #define  SSB_SPROM8_TEMPDELTA_PHYCAL   0x00ff
628  #define  SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT     0
629  #define  SSB_SPROM8_TEMPDELTA_PERIOD   0x0f00