summaryrefslogtreecommitdiff
path: root/target/linux/generic/hack-5.10/810-bcma-ssb-fallback-sprom.patch
blob: eea72702118182f51a6e5ad67e5fb9a9baf18531 (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
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -38,6 +38,10 @@ int bcma_bus_resume(struct bcma_bus *bus
 void bcma_detect_chip(struct bcma_bus *bus);
 int bcma_bus_scan(struct bcma_bus *bus);
 
+/* fallback-sprom.c */
+int __init bcma_fbs_register(void);
+int bcma_get_fallback_sprom(struct bcma_bus *dev, struct ssb_sprom *out);
+
 /* sprom.c */
 int bcma_sprom_get(struct bcma_bus *bus);
 
--- a/drivers/bcma/Kconfig
+++ b/drivers/bcma/Kconfig
@@ -18,6 +18,10 @@ config BCMA_BLOCKIO
 	bool
 	default y
 
+config BCMA_FALLBACK_SPROM
+	bool
+	default y
+
 config BCMA_HOST_PCI_POSSIBLE
 	bool
 	depends on PCI = y
--- a/drivers/bcma/Makefile
+++ b/drivers/bcma/Makefile
@@ -11,6 +11,7 @@ bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)
 bcma-$(CONFIG_BCMA_DRIVER_MIPS)		+= driver_mips.o
 bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN)	+= driver_gmac_cmn.o
 bcma-$(CONFIG_BCMA_DRIVER_GPIO)		+= driver_gpio.o
+bcma-$(CONFIG_BCMA_FALLBACK_SPROM)	+= fallback-sprom.o
 bcma-$(CONFIG_BCMA_HOST_PCI)		+= host_pci.o
 bcma-$(CONFIG_BCMA_HOST_SOC)		+= host_soc.o
 obj-$(CONFIG_BCMA)			+= bcma.o
--- a/drivers/bcma/sprom.c
+++ b/drivers/bcma/sprom.c
@@ -51,21 +51,26 @@ static int bcma_fill_sprom_with_fallback
 {
 	int err;
 
-	if (!get_fallback_sprom) {
+	if (get_fallback_sprom)
+		err = get_fallback_sprom(bus, out);
+
+#ifdef CONFIG_BCMA_FALLBACK_SPROM
+	if (!get_fallback_sprom || err)
+		err = bcma_get_fallback_sprom(bus, out);
+#else
+	if (!get_fallback_sprom)
 		err = -ENOENT;
-		goto fail;
-	}
+#endif /* CONFIG_BCMA_FALLBACK_SPROM */
 
-	err = get_fallback_sprom(bus, out);
-	if (err)
-		goto fail;
+	if (err) {
+		bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
+		return err;
+	}
 
 	bcma_debug(bus, "Using SPROM revision %d provided by platform.\n",
 		   bus->sprom.revision);
+
 	return 0;
-fail:
-	bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
-	return err;
 }
 
 /**************************************************
--- a/drivers/ssb/Kconfig
+++ b/drivers/ssb/Kconfig
@@ -25,6 +25,11 @@ if SSB
 config SSB_SPROM
 	bool
 
+config SSB_FALLBACK_SPROM
+	bool
+	depends on SSB_PCIHOST
+	default y
+
 # Support for Block-I/O. SELECT this from the driver that needs it.
 config SSB_BLOCKIO
 	bool
--- a/drivers/ssb/Makefile
+++ b/drivers/ssb/Makefile
@@ -2,6 +2,7 @@
 # core
 ssb-y					+= main.o scan.o
 ssb-$(CONFIG_SSB_EMBEDDED)		+= embedded.o
+ssb-$(CONFIG_SSB_FALLBACK_SPROM)	+= fallback-sprom.o
 ssb-$(CONFIG_SSB_SPROM)			+= sprom.o
 
 # host support
--- a/drivers/ssb/sprom.c
+++ b/drivers/ssb/sprom.c
@@ -180,10 +180,20 @@ int ssb_arch_register_fallback_sprom(int
 
 int ssb_fill_sprom_with_fallback(struct ssb_bus *bus, struct ssb_sprom *out)
 {
+	int err;
+
+	if (get_fallback_sprom)
+		err = get_fallback_sprom(bus, out);
+
+#ifdef CONFIG_SSB_FALLBACK_SPROM
+	if (!get_fallback_sprom || err)
+		err = ssb_get_fallback_sprom(bus, out);
+#else
 	if (!get_fallback_sprom)
 		return -ENOENT;
+#endif /* CONFIG_SSB_FALLBACK_SPROM */
 
-	return get_fallback_sprom(bus, out);
+	return err;
 }
 
 /* https://bcm-v4.sipsolutions.net/802.11/IsSpromAvailable */
--- a/drivers/ssb/ssb_private.h
+++ b/drivers/ssb/ssb_private.h
@@ -143,6 +143,10 @@ extern int ssb_bus_scan(struct ssb_bus *
 extern void ssb_iounmap(struct ssb_bus *ssb);
 
 
+/* fallback-sprom.c */
+int __init ssb_fbs_register(void);
+int ssb_get_fallback_sprom(struct ssb_bus *dev, struct ssb_sprom *out);
+
 /* sprom.c */
 extern
 ssize_t ssb_attr_sprom_show(struct ssb_bus *bus, char *buf,
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -668,6 +668,14 @@ static int __init bcma_modinit(void)
 {
 	int err;
 
+#ifdef CONFIG_BCMA_FALLBACK_SPROM
+	err = bcma_fbs_register();
+	if (err) {
+		pr_err("Fallback SPROM initialization failed\n");
+		err = 0;
+	}
+#endif /* CONFIG_BCMA_FALLBACK_SPROM */
+
 	err = bcma_init_bus_register();
 	if (err)
 		return err;
--- a/drivers/ssb/main.c
+++ b/drivers/ssb/main.c
@@ -1282,6 +1282,14 @@ static int __init ssb_modinit(void)
 {
 	int err;
 
+#ifdef CONFIG_SSB_FALLBACK_SPROM
+	err = ssb_fbs_register();
+	if (err) {
+		pr_err("Fallback SPROM initialization failed\n");
+		err = 0;
+	}
+#endif /* CONFIG_SSB_FALLBACK_SPROM */
+
 	/* See the comment at the ssb_is_early_boot definition */
 	ssb_is_early_boot = 0;
 	err = bus_register(&ssb_bustype);