kernel: backport nvmem v6.6 fixes and v6.7 changes
[openwrt/openwrt.git] / target / linux / generic / hack-6.1 / 810-bcma-ssb-fallback-sprom.patch
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
5
6 ---
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(-)
18
19 --- a/drivers/bcma/Kconfig
20 +++ b/drivers/bcma/Kconfig
21 @@ -18,6 +18,10 @@ config BCMA_BLOCKIO
22 bool
23 default y
24
25 +config BCMA_FALLBACK_SPROM
26 + bool
27 + default y
28 +
29 config BCMA_HOST_PCI_POSSIBLE
30 bool
31 depends on PCI = y
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);
47
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);
51 +
52 /* sprom.c */
53 int bcma_sprom_get(struct bcma_bus *bus);
54
55 --- a/drivers/bcma/main.c
56 +++ b/drivers/bcma/main.c
57 @@ -668,6 +668,14 @@ static int __init bcma_modinit(void)
58 {
59 int err;
60
61 +#ifdef CONFIG_BCMA_FALLBACK_SPROM
62 + err = bcma_fbs_register();
63 + if (err) {
64 + pr_err("Fallback SPROM initialization failed\n");
65 + err = 0;
66 + }
67 +#endif /* CONFIG_BCMA_FALLBACK_SPROM */
68 +
69 err = bcma_init_bus_register();
70 if (err)
71 return err;
72 --- a/drivers/bcma/sprom.c
73 +++ b/drivers/bcma/sprom.c
74 @@ -51,21 +51,26 @@ static int bcma_fill_sprom_with_fallback
75 {
76 int err;
77
78 - if (!get_fallback_sprom) {
79 + if (get_fallback_sprom)
80 + err = get_fallback_sprom(bus, out);
81 +
82 +#ifdef CONFIG_BCMA_FALLBACK_SPROM
83 + if (!get_fallback_sprom || err)
84 + err = bcma_get_fallback_sprom(bus, out);
85 +#else
86 + if (!get_fallback_sprom)
87 err = -ENOENT;
88 - goto fail;
89 - }
90 +#endif /* CONFIG_BCMA_FALLBACK_SPROM */
91
92 - err = get_fallback_sprom(bus, out);
93 - if (err)
94 - goto fail;
95 + if (err) {
96 + bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
97 + return err;
98 + }
99
100 bcma_debug(bus, "Using SPROM revision %d provided by platform.\n",
101 bus->sprom.revision);
102 +
103 return 0;
104 -fail:
105 - bcma_warn(bus, "Using fallback SPROM failed (err %d)\n", err);
106 - return err;
107 }
108
109 /**************************************************
110 --- a/drivers/ssb/Kconfig
111 +++ b/drivers/ssb/Kconfig
112 @@ -25,6 +25,11 @@ if SSB
113 config SSB_SPROM
114 bool
115
116 +config SSB_FALLBACK_SPROM
117 + bool
118 + depends on SSB_PCIHOST
119 + default y
120 +
121 # Support for Block-I/O. SELECT this from the driver that needs it.
122 config SSB_BLOCKIO
123 bool
124 --- a/drivers/ssb/Makefile
125 +++ b/drivers/ssb/Makefile
126 @@ -2,6 +2,7 @@
127 # core
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
132
133 # host support
134 --- a/drivers/ssb/main.c
135 +++ b/drivers/ssb/main.c
136 @@ -1287,6 +1287,14 @@ static int __init ssb_modinit(void)
137 {
138 int err;
139
140 +#ifdef CONFIG_SSB_FALLBACK_SPROM
141 + err = ssb_fbs_register();
142 + if (err) {
143 + pr_err("Fallback SPROM initialization failed\n");
144 + err = 0;
145 + }
146 +#endif /* CONFIG_SSB_FALLBACK_SPROM */
147 +
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
154
155 int ssb_fill_sprom_with_fallback(struct ssb_bus *bus, struct ssb_sprom *out)
156 {
157 + int err;
158 +
159 + if (get_fallback_sprom)
160 + err = get_fallback_sprom(bus, out);
161 +
162 +#ifdef CONFIG_SSB_FALLBACK_SPROM
163 + if (!get_fallback_sprom || err)
164 + err = ssb_get_fallback_sprom(bus, out);
165 +#else
166 if (!get_fallback_sprom)
167 return -ENOENT;
168 +#endif /* CONFIG_SSB_FALLBACK_SPROM */
169
170 - return get_fallback_sprom(bus, out);
171 + return err;
172 }
173
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);
179
180
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);
184 +
185 /* sprom.c */
186 extern
187 ssize_t ssb_attr_sprom_show(struct ssb_bus *bus, char *buf,