blob: 99ce8695ed45f1062513e8050c458524c2e9568a [file] [log] [blame]
Yuanyuan Liud5ec14c2019-01-03 11:25:40 -08001// SPDX-License-Identifier: GPL-2.0-only
2/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */
3
4#include "bus.h"
5#include "debug.h"
6#include "pci.h"
7
8enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev)
9{
10 if (!dev)
11 return CNSS_BUS_NONE;
12
13 if (!dev->bus)
14 return CNSS_BUS_NONE;
15
16 if (memcmp(dev->bus->name, "pci", 3) == 0)
17 return CNSS_BUS_PCI;
18 else
19 return CNSS_BUS_NONE;
20}
21
22enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id)
23{
24 switch (device_id) {
25 case QCA6174_DEVICE_ID:
26 case QCA6290_DEVICE_ID:
27 case QCA6390_DEVICE_ID:
28 return CNSS_BUS_PCI;
29 default:
30 cnss_pr_err("Unknown device_id: 0x%lx\n", device_id);
31 return CNSS_BUS_NONE;
32 }
33}
34
35void *cnss_bus_dev_to_bus_priv(struct device *dev)
36{
37 if (!dev)
38 return NULL;
39
40 switch (cnss_get_dev_bus_type(dev)) {
41 case CNSS_BUS_PCI:
42 return cnss_get_pci_priv(to_pci_dev(dev));
43 default:
44 return NULL;
45 }
46}
47
48struct cnss_plat_data *cnss_bus_dev_to_plat_priv(struct device *dev)
49{
50 void *bus_priv;
51
52 if (!dev)
53 return cnss_get_plat_priv(NULL);
54
55 bus_priv = cnss_bus_dev_to_bus_priv(dev);
56 if (!bus_priv)
57 return NULL;
58
59 switch (cnss_get_dev_bus_type(dev)) {
60 case CNSS_BUS_PCI:
61 return cnss_pci_priv_to_plat_priv(bus_priv);
62 default:
63 return NULL;
64 }
65}
66
67int cnss_bus_init(struct cnss_plat_data *plat_priv)
68{
69 if (!plat_priv)
70 return -ENODEV;
71
72 switch (plat_priv->bus_type) {
73 case CNSS_BUS_PCI:
74 return cnss_pci_init(plat_priv);
75 default:
76 cnss_pr_err("Unsupported bus type: %d\n",
77 plat_priv->bus_type);
78 return -EINVAL;
79 }
80}
81
82void cnss_bus_deinit(struct cnss_plat_data *plat_priv)
83{
84 if (!plat_priv)
85 return;
86
87 switch (plat_priv->bus_type) {
88 case CNSS_BUS_PCI:
89 cnss_pci_deinit(plat_priv);
90 default:
91 cnss_pr_err("Unsupported bus type: %d\n",
92 plat_priv->bus_type);
93 return;
94 }
95}
96
97int cnss_bus_load_m3(struct cnss_plat_data *plat_priv)
98{
99 if (!plat_priv)
100 return -ENODEV;
101
102 switch (plat_priv->bus_type) {
103 case CNSS_BUS_PCI:
104 return cnss_pci_load_m3(plat_priv->bus_priv);
105 default:
106 cnss_pr_err("Unsupported bus type: %d\n",
107 plat_priv->bus_type);
108 return -EINVAL;
109 }
110}
111
112int cnss_bus_alloc_fw_mem(struct cnss_plat_data *plat_priv)
113{
114 if (!plat_priv)
115 return -ENODEV;
116
117 switch (plat_priv->bus_type) {
118 case CNSS_BUS_PCI:
119 return cnss_pci_alloc_fw_mem(plat_priv->bus_priv);
120 default:
121 cnss_pr_err("Unsupported bus type: %d\n",
122 plat_priv->bus_type);
123 return -EINVAL;
124 }
125}
126
Yuanyuan Liu36d1fba2019-01-02 14:13:15 -0800127int cnss_bus_alloc_qdss_mem(struct cnss_plat_data *plat_priv)
128{
129 if (!plat_priv)
130 return -ENODEV;
131
132 switch (plat_priv->bus_type) {
133 case CNSS_BUS_PCI:
134 return cnss_pci_alloc_qdss_mem(plat_priv->bus_priv);
135 default:
136 cnss_pr_err("Unsupported bus type: %d\n",
137 plat_priv->bus_type);
138 return -EINVAL;
139 }
140}
141
142void cnss_bus_free_qdss_mem(struct cnss_plat_data *plat_priv)
143{
144 if (!plat_priv)
145 return;
146
147 switch (plat_priv->bus_type) {
148 case CNSS_BUS_PCI:
149 cnss_pci_free_qdss_mem(plat_priv->bus_priv);
150 return;
151 default:
152 cnss_pr_err("Unsupported bus type: %d\n",
153 plat_priv->bus_type);
154 return;
155 }
156}
157
Yuanyuan Liud5ec14c2019-01-03 11:25:40 -0800158u32 cnss_bus_get_wake_irq(struct cnss_plat_data *plat_priv)
159{
160 if (!plat_priv)
161 return -ENODEV;
162
163 switch (plat_priv->bus_type) {
164 case CNSS_BUS_PCI:
165 return cnss_pci_get_wake_msi(plat_priv->bus_priv);
166 default:
167 cnss_pr_err("Unsupported bus type: %d\n",
168 plat_priv->bus_type);
169 return -EINVAL;
170 }
171}
172
173int cnss_bus_force_fw_assert_hdlr(struct cnss_plat_data *plat_priv)
174{
175 if (!plat_priv)
176 return -ENODEV;
177
178 switch (plat_priv->bus_type) {
179 case CNSS_BUS_PCI:
180 return cnss_pci_force_fw_assert_hdlr(plat_priv->bus_priv);
181 default:
182 cnss_pr_err("Unsupported bus type: %d\n",
183 plat_priv->bus_type);
184 return -EINVAL;
185 }
186}
187
Yuanyuan Liu3f813132019-01-15 15:12:46 -0800188void cnss_bus_fw_boot_timeout_hdlr(struct timer_list *t)
Yuanyuan Liud5ec14c2019-01-03 11:25:40 -0800189{
Yuanyuan Liu3f813132019-01-15 15:12:46 -0800190 struct cnss_plat_data *plat_priv =
191 from_timer(plat_priv, t, fw_boot_timer);
Yuanyuan Liud5ec14c2019-01-03 11:25:40 -0800192
193 if (!plat_priv)
194 return;
195
196 switch (plat_priv->bus_type) {
197 case CNSS_BUS_PCI:
198 return cnss_pci_fw_boot_timeout_hdlr(plat_priv->bus_priv);
199 default:
200 cnss_pr_err("Unsupported bus type: %d\n",
201 plat_priv->bus_type);
202 return;
203 }
204}
205
206void cnss_bus_collect_dump_info(struct cnss_plat_data *plat_priv, bool in_panic)
207{
208 if (!plat_priv)
209 return;
210
211 switch (plat_priv->bus_type) {
212 case CNSS_BUS_PCI:
213 return cnss_pci_collect_dump_info(plat_priv->bus_priv,
214 in_panic);
215 default:
216 cnss_pr_err("Unsupported bus type: %d\n",
217 plat_priv->bus_type);
218 return;
219 }
220}
221
222int cnss_bus_call_driver_probe(struct cnss_plat_data *plat_priv)
223{
224 if (!plat_priv)
225 return -ENODEV;
226
227 switch (plat_priv->bus_type) {
228 case CNSS_BUS_PCI:
229 return cnss_pci_call_driver_probe(plat_priv->bus_priv);
230 default:
231 cnss_pr_err("Unsupported bus type: %d\n",
232 plat_priv->bus_type);
233 return -EINVAL;
234 }
235}
236
237int cnss_bus_call_driver_remove(struct cnss_plat_data *plat_priv)
238{
239 if (!plat_priv)
240 return -ENODEV;
241
242 switch (plat_priv->bus_type) {
243 case CNSS_BUS_PCI:
244 return cnss_pci_call_driver_remove(plat_priv->bus_priv);
245 default:
246 cnss_pr_err("Unsupported bus type: %d\n",
247 plat_priv->bus_type);
248 return -EINVAL;
249 }
250}
251
252int cnss_bus_dev_powerup(struct cnss_plat_data *plat_priv)
253{
254 if (!plat_priv)
255 return -ENODEV;
256
257 switch (plat_priv->bus_type) {
258 case CNSS_BUS_PCI:
259 return cnss_pci_dev_powerup(plat_priv->bus_priv);
260 default:
261 cnss_pr_err("Unsupported bus type: %d\n",
262 plat_priv->bus_type);
263 return -EINVAL;
264 }
265}
266
267int cnss_bus_dev_shutdown(struct cnss_plat_data *plat_priv)
268{
269 if (!plat_priv)
270 return -ENODEV;
271
272 switch (plat_priv->bus_type) {
273 case CNSS_BUS_PCI:
274 return cnss_pci_dev_shutdown(plat_priv->bus_priv);
275 default:
276 cnss_pr_err("Unsupported bus type: %d\n",
277 plat_priv->bus_type);
278 return -EINVAL;
279 }
280}
281
282int cnss_bus_dev_crash_shutdown(struct cnss_plat_data *plat_priv)
283{
284 if (!plat_priv)
285 return -ENODEV;
286
287 switch (plat_priv->bus_type) {
288 case CNSS_BUS_PCI:
289 return cnss_pci_dev_crash_shutdown(plat_priv->bus_priv);
290 default:
291 cnss_pr_err("Unsupported bus type: %d\n",
292 plat_priv->bus_type);
293 return -EINVAL;
294 }
295}
296
297int cnss_bus_dev_ramdump(struct cnss_plat_data *plat_priv)
298{
299 if (!plat_priv)
300 return -ENODEV;
301
302 switch (plat_priv->bus_type) {
303 case CNSS_BUS_PCI:
304 return cnss_pci_dev_ramdump(plat_priv->bus_priv);
305 default:
306 cnss_pr_err("Unsupported bus type: %d\n",
307 plat_priv->bus_type);
308 return -EINVAL;
309 }
310}
311
312int cnss_bus_register_driver_hdlr(struct cnss_plat_data *plat_priv, void *data)
313{
314 if (!plat_priv)
315 return -ENODEV;
316
317 switch (plat_priv->bus_type) {
318 case CNSS_BUS_PCI:
319 return cnss_pci_register_driver_hdlr(plat_priv->bus_priv, data);
320 default:
321 cnss_pr_err("Unsupported bus type: %d\n",
322 plat_priv->bus_type);
323 return -EINVAL;
324 }
325}
326
327int cnss_bus_unregister_driver_hdlr(struct cnss_plat_data *plat_priv)
328{
329 if (!plat_priv)
330 return -ENODEV;
331
332 switch (plat_priv->bus_type) {
333 case CNSS_BUS_PCI:
334 return cnss_pci_unregister_driver_hdlr(plat_priv->bus_priv);
335 default:
336 cnss_pr_err("Unsupported bus type: %d\n",
337 plat_priv->bus_type);
338 return -EINVAL;
339 }
340}
341
342int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv,
343 int modem_current_status)
344{
345 if (!plat_priv)
346 return -ENODEV;
347
348 switch (plat_priv->bus_type) {
349 case CNSS_BUS_PCI:
350 return cnss_pci_call_driver_modem_status(plat_priv->bus_priv,
351 modem_current_status);
352 default:
353 cnss_pr_err("Unsupported bus type: %d\n",
354 plat_priv->bus_type);
355 return -EINVAL;
356 }
357}
358
359int cnss_bus_update_status(struct cnss_plat_data *plat_priv,
360 enum cnss_driver_status status)
361{
362 if (!plat_priv)
363 return -ENODEV;
364
365 switch (plat_priv->bus_type) {
366 case CNSS_BUS_PCI:
367 return cnss_pci_update_status(plat_priv->bus_priv, status);
368 default:
369 cnss_pr_err("Unsupported bus type: %d\n",
370 plat_priv->bus_type);
371 return -EINVAL;
372 }
373}