1 --- a/drivers/bcma/bcma_private.h
2 +++ b/drivers/bcma/bcma_private.h
3 @@ -38,6 +38,10 @@ int bcma_bus_resume(struct bcma_bus *bus
4 void bcma_detect_chip(struct bcma_bus *bus);
5 int bcma_bus_scan(struct bcma_bus *bus);
7 +/* fallback-sprom.c */
8 +int __init bcma_fbs_register(void);
9 +int bcma_get_fallback_sprom(struct bcma_bus *dev, struct ssb_sprom *out);
12 int bcma_sprom_get(struct bcma_bus *bus);
14 --- a/drivers/bcma/Kconfig
15 +++ b/drivers/bcma/Kconfig
16 @@ -18,6 +18,10 @@ config BCMA_BLOCKIO
20 +config BCMA_FALLBACK_SPROM
24 config BCMA_HOST_PCI_POSSIBLE
27 --- a/drivers/bcma/Makefile
28 +++ b/drivers/bcma/Makefile
29 @@ -11,6 +11,7 @@ bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)
30 bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o
31 bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN) += driver_gmac_cmn.o
32 bcma-$(CONFIG_BCMA_DRIVER_GPIO) += driver_gpio.o
33 +bcma-$(CONFIG_BCMA_FALLBACK_SPROM) += fallback-sprom.o
34 bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o
35 bcma-$(CONFIG_BCMA_HOST_SOC) += host_soc.o
36 obj-$(CONFIG_BCMA) += bcma.o
37 --- a/drivers/bcma/sprom.c
38 +++ b/drivers/bcma/sprom.c
39 @@ -51,21 +51,26 @@ static int bcma_fill_sprom_with_fallback
43 - if (!get_fallback_sprom) {
44 + if (get_fallback_sprom)
45 + err = get_fallback_sprom(bus, out);
47 +#ifdef CONFIG_BCMA_FALLBACK_SPROM
48 + if (!get_fallback_sprom || err)
49 + err = bcma_get_fallback_sprom(bus, out);
51 + if (!get_fallback_sprom)
55 +#endif /* CONFIG_BCMA_FALLBACK_SPROM */
57 - err = get_fallback_sprom(bus, out);
61 + bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
65 bcma_debug(bus, "Using SPROM revision %d provided by platform.\n",
70 - bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
74 /**************************************************
75 --- a/drivers/ssb/Kconfig
76 +++ b/drivers/ssb/Kconfig
77 @@ -25,6 +25,11 @@ if SSB
81 +config SSB_FALLBACK_SPROM
83 + depends on SSB_PCIHOST
86 # Support for Block-I/O. SELECT this from the driver that needs it.
89 --- a/drivers/ssb/Makefile
90 +++ b/drivers/ssb/Makefile
93 ssb-y += main.o scan.o
94 ssb-$(CONFIG_SSB_EMBEDDED) += embedded.o
95 +ssb-$(CONFIG_SSB_FALLBACK_SPROM) += fallback-sprom.o
96 ssb-$(CONFIG_SSB_SPROM) += sprom.o
99 --- a/drivers/ssb/sprom.c
100 +++ b/drivers/ssb/sprom.c
101 @@ -180,10 +180,20 @@ int ssb_arch_register_fallback_sprom(int
103 int ssb_fill_sprom_with_fallback(struct ssb_bus *bus, struct ssb_sprom *out)
107 + if (get_fallback_sprom)
108 + err = get_fallback_sprom(bus, out);
110 +#ifdef CONFIG_SSB_FALLBACK_SPROM
111 + if (!get_fallback_sprom || err)
112 + err = ssb_get_fallback_sprom(bus, out);
114 if (!get_fallback_sprom)
116 +#endif /* CONFIG_SSB_FALLBACK_SPROM */
118 - return get_fallback_sprom(bus, out);
122 /* https://bcm-v4.sipsolutions.net/802.11/IsSpromAvailable */
123 --- a/drivers/ssb/ssb_private.h
124 +++ b/drivers/ssb/ssb_private.h
125 @@ -143,6 +143,10 @@ extern int ssb_bus_scan(struct ssb_bus *
126 extern void ssb_iounmap(struct ssb_bus *ssb);
129 +/* fallback-sprom.c */
130 +int __init ssb_fbs_register(void);
131 +int ssb_get_fallback_sprom(struct ssb_bus *dev, struct ssb_sprom *out);
135 ssize_t ssb_attr_sprom_show(struct ssb_bus *bus, char *buf,
136 --- a/drivers/bcma/main.c
137 +++ b/drivers/bcma/main.c
138 @@ -668,6 +668,14 @@ static int __init bcma_modinit(void)
142 +#ifdef CONFIG_BCMA_FALLBACK_SPROM
143 + err = bcma_fbs_register();
145 + pr_err("Fallback SPROM initialization failed\n");
148 +#endif /* CONFIG_BCMA_FALLBACK_SPROM */
150 err = bcma_init_bus_register();
153 --- a/drivers/ssb/main.c
154 +++ b/drivers/ssb/main.c
155 @@ -1282,6 +1282,14 @@ static int __init ssb_modinit(void)
159 +#ifdef CONFIG_SSB_FALLBACK_SPROM
160 + err = ssb_fbs_register();
162 + pr_err("Fallback SPROM initialization failed\n");
165 +#endif /* CONFIG_SSB_FALLBACK_SPROM */
167 /* See the comment at the ssb_is_early_boot definition */
168 ssb_is_early_boot = 0;
169 err = bus_register(&ssb_bustype);