1 From e4d708702e6c98f2111e33201a264d6788564cb2 Mon Sep 17 00:00:00 2001
2 From: OpenWrt community <openwrt-devel@lists.openwrt.org>
3 Date: Fri, 12 May 2023 11:08:43 +0200
4 Subject: [PATCH] ssb_sprom: add generic kernel support for Broadcom Fallback SPROMs
7 drivers/bcma/Kconfig | 4 ++++
8 drivers/bcma/Makefile | 1 +
9 drivers/bcma/bcma_private.h | 4 ++++
10 drivers/bcma/main.c | 8 ++++++++
11 drivers/bcma/sprom.c | 23 ++++++++++++++---------
12 drivers/ssb/Kconfig | 5 +++++
13 drivers/ssb/Makefile | 1 +
14 drivers/ssb/main.c | 8 ++++++++
15 drivers/ssb/sprom.c | 12 +++++++++++-
16 drivers/ssb/ssb_private.h | 4 ++++
17 10 files changed, 60 insertions(+), 10 deletions(-)
19 --- a/drivers/bcma/Kconfig
20 +++ b/drivers/bcma/Kconfig
21 @@ -18,6 +18,10 @@ config BCMA_BLOCKIO
25 +config BCMA_FALLBACK_SPROM
29 config BCMA_HOST_PCI_POSSIBLE
32 --- a/drivers/bcma/Makefile
33 +++ b/drivers/bcma/Makefile
34 @@ -11,6 +11,7 @@ bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)
35 bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o
36 bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN) += driver_gmac_cmn.o
37 bcma-$(CONFIG_BCMA_DRIVER_GPIO) += driver_gpio.o
38 +bcma-$(CONFIG_BCMA_FALLBACK_SPROM) += fallback-sprom.o
39 bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o
40 bcma-$(CONFIG_BCMA_HOST_SOC) += host_soc.o
41 obj-$(CONFIG_BCMA) += bcma.o
42 --- a/drivers/bcma/bcma_private.h
43 +++ b/drivers/bcma/bcma_private.h
44 @@ -38,6 +38,10 @@ int bcma_bus_resume(struct bcma_bus *bus
45 void bcma_detect_chip(struct bcma_bus *bus);
46 int bcma_bus_scan(struct bcma_bus *bus);
48 +/* fallback-sprom.c */
49 +int __init bcma_fbs_register(void);
50 +int bcma_get_fallback_sprom(struct bcma_bus *dev, struct ssb_sprom *out);
53 int bcma_sprom_get(struct bcma_bus *bus);
55 --- a/drivers/bcma/main.c
56 +++ b/drivers/bcma/main.c
57 @@ -668,6 +668,14 @@ static int __init bcma_modinit(void)
61 +#ifdef CONFIG_BCMA_FALLBACK_SPROM
62 + err = bcma_fbs_register();
64 + pr_err("Fallback SPROM initialization failed\n");
67 +#endif /* CONFIG_BCMA_FALLBACK_SPROM */
69 err = bcma_init_bus_register();
72 --- a/drivers/bcma/sprom.c
73 +++ b/drivers/bcma/sprom.c
74 @@ -51,21 +51,26 @@ static int bcma_fill_sprom_with_fallback
78 - if (!get_fallback_sprom) {
79 + if (get_fallback_sprom)
80 + err = get_fallback_sprom(bus, out);
82 +#ifdef CONFIG_BCMA_FALLBACK_SPROM
83 + if (!get_fallback_sprom || err)
84 + err = bcma_get_fallback_sprom(bus, out);
86 + if (!get_fallback_sprom)
90 +#endif /* CONFIG_BCMA_FALLBACK_SPROM */
92 - err = get_fallback_sprom(bus, out);
96 + bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
100 bcma_debug(bus, "Using SPROM revision %d provided by platform.\n",
101 bus->sprom.revision);
105 - bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
109 /**************************************************
110 --- a/drivers/ssb/Kconfig
111 +++ b/drivers/ssb/Kconfig
112 @@ -25,6 +25,11 @@ if SSB
116 +config SSB_FALLBACK_SPROM
118 + depends on SSB_PCIHOST
121 # Support for Block-I/O. SELECT this from the driver that needs it.
124 --- a/drivers/ssb/Makefile
125 +++ b/drivers/ssb/Makefile
128 ssb-y += main.o scan.o
129 ssb-$(CONFIG_SSB_EMBEDDED) += embedded.o
130 +ssb-$(CONFIG_SSB_FALLBACK_SPROM) += fallback-sprom.o
131 ssb-$(CONFIG_SSB_SPROM) += sprom.o
134 --- a/drivers/ssb/main.c
135 +++ b/drivers/ssb/main.c
136 @@ -1287,6 +1287,14 @@ static int __init ssb_modinit(void)
140 +#ifdef CONFIG_SSB_FALLBACK_SPROM
141 + err = ssb_fbs_register();
143 + pr_err("Fallback SPROM initialization failed\n");
146 +#endif /* CONFIG_SSB_FALLBACK_SPROM */
148 /* See the comment at the ssb_is_early_boot definition */
149 ssb_is_early_boot = 0;
150 err = bus_register(&ssb_bustype);
151 --- a/drivers/ssb/sprom.c
152 +++ b/drivers/ssb/sprom.c
153 @@ -180,10 +180,20 @@ int ssb_arch_register_fallback_sprom(int
155 int ssb_fill_sprom_with_fallback(struct ssb_bus *bus, struct ssb_sprom *out)
159 + if (get_fallback_sprom)
160 + err = get_fallback_sprom(bus, out);
162 +#ifdef CONFIG_SSB_FALLBACK_SPROM
163 + if (!get_fallback_sprom || err)
164 + err = ssb_get_fallback_sprom(bus, out);
166 if (!get_fallback_sprom)
168 +#endif /* CONFIG_SSB_FALLBACK_SPROM */
170 - return get_fallback_sprom(bus, out);
174 /* https://bcm-v4.sipsolutions.net/802.11/IsSpromAvailable */
175 --- a/drivers/ssb/ssb_private.h
176 +++ b/drivers/ssb/ssb_private.h
177 @@ -143,6 +143,10 @@ extern int ssb_bus_scan(struct ssb_bus *
178 extern void ssb_iounmap(struct ssb_bus *ssb);
181 +/* fallback-sprom.c */
182 +int __init ssb_fbs_register(void);
183 +int ssb_get_fallback_sprom(struct ssb_bus *dev, struct ssb_sprom *out);
187 ssize_t ssb_attr_sprom_show(struct ssb_bus *bus, char *buf,