kernel: add bcma/ssb fallback SPROM support
[openwrt/staging/dedeckeh.git] / target / linux / generic / hack-5.15 / 810-bcma-ssb-fallback-sprom.patch
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);
6
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);
10 +
11 /* sprom.c */
12 int bcma_sprom_get(struct bcma_bus *bus);
13
14 --- a/drivers/bcma/Kconfig
15 +++ b/drivers/bcma/Kconfig
16 @@ -18,6 +18,10 @@ config BCMA_BLOCKIO
17 bool
18 default y
19
20 +config BCMA_FALLBACK_SPROM
21 + bool
22 + default y
23 +
24 config BCMA_HOST_PCI_POSSIBLE
25 bool
26 depends on PCI = y
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
40 {
41 int err;
42
43 - if (!get_fallback_sprom) {
44 + if (get_fallback_sprom)
45 + err = get_fallback_sprom(bus, out);
46 +
47 +#ifdef CONFIG_BCMA_FALLBACK_SPROM
48 + if (!get_fallback_sprom || err)
49 + err = bcma_get_fallback_sprom(bus, out);
50 +#else
51 + if (!get_fallback_sprom)
52 err = -ENOENT;
53 - goto fail;
54 - }
55 +#endif /* CONFIG_BCMA_FALLBACK_SPROM */
56
57 - err = get_fallback_sprom(bus, out);
58 - if (err)
59 - goto fail;
60 + if (err) {
61 + bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
62 + return err;
63 + }
64
65 bcma_debug(bus, "Using SPROM revision %d provided by platform.\n",
66 bus->sprom.revision);
67 +
68 return 0;
69 -fail:
70 - bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
71 - return err;
72 }
73
74 /**************************************************
75 --- a/drivers/ssb/Kconfig
76 +++ b/drivers/ssb/Kconfig
77 @@ -25,6 +25,11 @@ if SSB
78 config SSB_SPROM
79 bool
80
81 +config SSB_FALLBACK_SPROM
82 + bool
83 + depends on SSB_PCIHOST
84 + default y
85 +
86 # Support for Block-I/O. SELECT this from the driver that needs it.
87 config SSB_BLOCKIO
88 bool
89 --- a/drivers/ssb/Makefile
90 +++ b/drivers/ssb/Makefile
91 @@ -2,6 +2,7 @@
92 # core
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
97
98 # host support
99 --- a/drivers/ssb/sprom.c
100 +++ b/drivers/ssb/sprom.c
101 @@ -180,10 +180,20 @@ int ssb_arch_register_fallback_sprom(int
102
103 int ssb_fill_sprom_with_fallback(struct ssb_bus *bus, struct ssb_sprom *out)
104 {
105 + int err;
106 +
107 + if (get_fallback_sprom)
108 + err = get_fallback_sprom(bus, out);
109 +
110 +#ifdef CONFIG_SSB_FALLBACK_SPROM
111 + if (!get_fallback_sprom || err)
112 + err = ssb_get_fallback_sprom(bus, out);
113 +#else
114 if (!get_fallback_sprom)
115 return -ENOENT;
116 +#endif /* CONFIG_SSB_FALLBACK_SPROM */
117
118 - return get_fallback_sprom(bus, out);
119 + return err;
120 }
121
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);
127
128
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);
132 +
133 /* sprom.c */
134 extern
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)
139 {
140 int err;
141
142 +#ifdef CONFIG_BCMA_FALLBACK_SPROM
143 + err = bcma_fbs_register();
144 + if (err) {
145 + pr_err("Fallback SPROM initialization failed\n");
146 + err = 0;
147 + }
148 +#endif /* CONFIG_BCMA_FALLBACK_SPROM */
149 +
150 err = bcma_init_bus_register();
151 if (err)
152 return err;
153 --- a/drivers/ssb/main.c
154 +++ b/drivers/ssb/main.c
155 @@ -1287,6 +1287,14 @@ static int __init ssb_modinit(void)
156 {
157 int err;
158
159 +#ifdef CONFIG_SSB_FALLBACK_SPROM
160 + err = ssb_fbs_register();
161 + if (err) {
162 + pr_err("Fallback SPROM initialization failed\n");
163 + err = 0;
164 + }
165 +#endif /* CONFIG_SSB_FALLBACK_SPROM */
166 +
167 /* See the comment at the ssb_is_early_boot definition */
168 ssb_is_early_boot = 0;
169 err = bus_register(&ssb_bustype);