1 /*
2 * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 #ifndef __PLD_SNOC_H__
21 #define __PLD_SNOC_H__
22
23 #ifdef CONFIG_CNSS_OUT_OF_TREE
24 #ifdef CONFIG_PLD_SNOC_ICNSS
25 #ifdef CONFIG_PLD_SNOC_ICNSS2
26 #include "icnss2.h"
27 #else
28 #include "icnss.h"
29 #endif
30 #endif
31 #else
32 #ifdef CONFIG_PLD_SNOC_ICNSS
33 #ifdef CONFIG_PLD_SNOC_ICNSS2
34 #include <soc/qcom/icnss2.h>
35 #else
36 #include <soc/qcom/icnss.h>
37 #endif
38 #endif
39 #endif
40
41 #include "pld_internal.h"
42
43 #ifndef CONFIG_PLD_SNOC_ICNSS
pld_snoc_register_driver(void)44 static inline int pld_snoc_register_driver(void)
45 {
46 return 0;
47 }
48
pld_snoc_unregister_driver(void)49 static inline void pld_snoc_unregister_driver(void)
50 {
51 }
pld_snoc_wlan_enable(struct device * dev,struct pld_wlan_enable_cfg * config,enum pld_driver_mode mode,const char * host_version)52 static inline int pld_snoc_wlan_enable(struct device *dev,
53 struct pld_wlan_enable_cfg *config,
54 enum pld_driver_mode mode, const char *host_version)
55 {
56 return 0;
57 }
pld_snoc_wlan_disable(struct device * dev,enum pld_driver_mode mode)58 static inline int pld_snoc_wlan_disable(struct device *dev,
59 enum pld_driver_mode mode)
60 {
61 return 0;
62 }
pld_snoc_ce_request_irq(struct device * dev,unsigned int ce_id,irqreturn_t (* handler)(int,void *),unsigned long flags,const char * name,void * ctx)63 static inline int pld_snoc_ce_request_irq(struct device *dev,
64 unsigned int ce_id,
65 irqreturn_t (*handler)(int, void *),
66 unsigned long flags,
67 const char *name, void *ctx)
68 {
69 return 0;
70 }
pld_snoc_ce_free_irq(struct device * dev,unsigned int ce_id,void * ctx)71 static inline int pld_snoc_ce_free_irq(struct device *dev,
72 unsigned int ce_id, void *ctx)
73 {
74 return 0;
75 }
pld_snoc_enable_irq(struct device * dev,unsigned int ce_id)76 static inline void pld_snoc_enable_irq(struct device *dev, unsigned int ce_id)
77 {
78 }
pld_snoc_disable_irq(struct device * dev,unsigned int ce_id)79 static inline void pld_snoc_disable_irq(struct device *dev, unsigned int ce_id)
80 {
81 }
pld_snoc_get_soc_info(struct device * dev,struct pld_soc_info * info)82 static inline int pld_snoc_get_soc_info(struct device *dev, struct pld_soc_info *info)
83 {
84 return 0;
85 }
pld_snoc_get_ce_id(struct device * dev,int irq)86 static inline int pld_snoc_get_ce_id(struct device *dev, int irq)
87 {
88 return 0;
89 }
pld_snoc_power_on(struct device * dev)90 static inline int pld_snoc_power_on(struct device *dev)
91 {
92 return 0;
93 }
pld_snoc_power_off(struct device * dev)94 static inline int pld_snoc_power_off(struct device *dev)
95 {
96 return 0;
97 }
pld_snoc_get_irq(struct device * dev,int ce_id)98 static inline int pld_snoc_get_irq(struct device *dev, int ce_id)
99 {
100 return 0;
101 }
pld_snoc_athdiag_read(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * output)102 static inline int pld_snoc_athdiag_read(struct device *dev, uint32_t offset,
103 uint32_t memtype, uint32_t datalen,
104 uint8_t *output)
105 {
106 return 0;
107 }
pld_snoc_athdiag_write(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * input)108 static inline int pld_snoc_athdiag_write(struct device *dev, uint32_t offset,
109 uint32_t memtype, uint32_t datalen,
110 uint8_t *input)
111 {
112 return 0;
113 }
114
115 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
pld_snoc_smmu_get_domain(struct device * dev)116 static inline void *pld_snoc_smmu_get_domain(struct device *dev)
117 {
118 return NULL;
119 }
120
121 #else
pld_snoc_smmu_get_mapping(struct device * dev)122 static inline void *pld_snoc_smmu_get_mapping(struct device *dev)
123 {
124 return NULL;
125 }
126 #endif
127
pld_snoc_idle_restart(struct device * dev)128 static inline int pld_snoc_idle_restart(struct device *dev)
129 {
130 return 0;
131 }
132
pld_snoc_idle_shutdown(struct device * dev)133 static inline int pld_snoc_idle_shutdown(struct device *dev)
134 {
135 return 0;
136 }
137
pld_snoc_get_device_config(void)138 static inline unsigned long pld_snoc_get_device_config(void)
139 {
140 return 0;
141 }
142
pld_snoc_smmu_map(struct device * dev,phys_addr_t paddr,uint32_t * iova_addr,size_t size)143 static inline int pld_snoc_smmu_map(struct device *dev, phys_addr_t paddr,
144 uint32_t *iova_addr, size_t size)
145 {
146 return 0;
147 }
148
pld_snoc_smmu_unmap(struct device * dev,uint32_t iova_addr,size_t size)149 static inline int pld_snoc_smmu_unmap(struct device *dev,
150 uint32_t iova_addr, size_t size)
151 {
152 return 0;
153 }
154
155 static inline
pld_snoc_socinfo_get_serial_number(struct device * dev)156 unsigned int pld_snoc_socinfo_get_serial_number(struct device *dev)
157 {
158 return 0;
159 }
pld_snoc_is_qmi_disable(struct device * dev)160 static inline int pld_snoc_is_qmi_disable(struct device *dev)
161 {
162 return 0;
163 }
164
pld_snoc_is_fw_down(struct device * dev)165 static inline int pld_snoc_is_fw_down(struct device *dev)
166 {
167 return 0;
168 }
169
pld_snoc_is_low_power_mode(struct device * dev)170 static inline int pld_snoc_is_low_power_mode(struct device *dev)
171 {
172 return 0;
173 }
174
pld_snoc_set_fw_log_mode(struct device * dev,u8 fw_log_mode)175 static inline int pld_snoc_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
176 {
177 return 0;
178 }
pld_snoc_force_assert_target(struct device * dev)179 static inline int pld_snoc_force_assert_target(struct device *dev)
180 {
181 return 0;
182 }
183
pld_snoc_is_pdr(void)184 static inline int pld_snoc_is_pdr(void)
185 {
186 return 0;
187 }
188
pld_snoc_is_fw_rejuvenate(void)189 static inline int pld_snoc_is_fw_rejuvenate(void)
190 {
191 return 0;
192 }
193
pld_snoc_block_shutdown(bool status)194 static inline void pld_snoc_block_shutdown(bool status)
195 {
196 }
197
198 #ifdef FEATURE_WLAN_TIME_SYNC_FTM
199 static inline int
pld_snoc_get_audio_wlan_timestamp(struct device * dev,enum pld_wlan_time_sync_trigger_type type,uint64_t * ts)200 pld_snoc_get_audio_wlan_timestamp(struct device *dev,
201 enum pld_wlan_time_sync_trigger_type type,
202 uint64_t *ts)
203 {
204 return 0;
205 }
206 #endif /* FEATURE_WLAN_TIME_SYNC_FTM */
207
208 #else
209 /**
210 * pld_snoc_register_driver() - Register platform device callback functions
211 *
212 * Return: int
213 */
214 int pld_snoc_register_driver(void);
215
216 /**
217 * pld_snoc_unregister_driver() - Unregister platform device callback functions
218 *
219 * Return: void
220 */
221 void pld_snoc_unregister_driver(void);
222
223 /**
224 * pld_snoc_wlan_enable() - Enable WLAN
225 * @dev: device
226 * @config: WLAN configuration data
227 * @mode: WLAN mode
228 * @host_version: host software version
229 *
230 * This function enables WLAN FW. It passed WLAN configuration data,
231 * WLAN mode and host software version to FW.
232 *
233 * Return: 0 for success
234 * Non zero failure code for errors
235 */
236 int pld_snoc_wlan_enable(struct device *dev,
237 struct pld_wlan_enable_cfg *config,
238 enum pld_driver_mode mode, const char *host_version);
239
240 /**
241 * pld_snoc_wlan_disable() - Disable WLAN
242 * @dev: device
243 * @mode: WLAN mode
244 *
245 * This function disables WLAN FW. It passes WLAN mode to FW.
246 *
247 * Return: 0 for success
248 * Non zero failure code for errors
249 */
250 int pld_snoc_wlan_disable(struct device *dev, enum pld_driver_mode mode);
251
252 /**
253 * pld_snoc_get_soc_info() - Get SOC information
254 * @dev: device
255 * @info: buffer to SOC information
256 *
257 * Return SOC info to the buffer.
258 *
259 * Return: 0 for success
260 * Non zero failure code for errors
261 */
262 int pld_snoc_get_soc_info(struct device *dev, struct pld_soc_info *info);
263
264 #ifdef FEATURE_WLAN_TIME_SYNC_FTM
265 /**
266 * pld_snoc_get_audio_wlan_timestamp() - Get audio timestamp
267 * @dev: device
268 * @type: trigger type
269 * @ts: timestamp
270 *
271 * Return audio timestamp to the ts.
272 *
273 * Return: 0 for success
274 * Non zero failure code for errors
275 */
276 static inline int
pld_snoc_get_audio_wlan_timestamp(struct device * dev,enum pld_wlan_time_sync_trigger_type type,uint64_t * ts)277 pld_snoc_get_audio_wlan_timestamp(struct device *dev,
278 enum pld_wlan_time_sync_trigger_type type,
279 uint64_t *ts)
280 {
281 if (!dev)
282 return -ENODEV;
283
284 return 0;
285 }
286 #endif /* FEATURE_WLAN_TIME_SYNC_FTM */
pld_snoc_ce_request_irq(struct device * dev,unsigned int ce_id,irqreturn_t (* handler)(int,void *),unsigned long flags,const char * name,void * ctx)287 static inline int pld_snoc_ce_request_irq(struct device *dev,
288 unsigned int ce_id,
289 irqreturn_t (*handler)(int, void *),
290 unsigned long flags,
291 const char *name, void *ctx)
292 {
293 if (!dev)
294 return -ENODEV;
295
296 return icnss_ce_request_irq(dev, ce_id, handler, flags, name, ctx);
297 }
298
pld_snoc_ce_free_irq(struct device * dev,unsigned int ce_id,void * ctx)299 static inline int pld_snoc_ce_free_irq(struct device *dev,
300 unsigned int ce_id, void *ctx)
301 {
302 if (!dev)
303 return -ENODEV;
304
305 return icnss_ce_free_irq(dev, ce_id, ctx);
306 }
307
pld_snoc_enable_irq(struct device * dev,unsigned int ce_id)308 static inline void pld_snoc_enable_irq(struct device *dev, unsigned int ce_id)
309 {
310 if (dev)
311 icnss_enable_irq(dev, ce_id);
312 }
313
pld_snoc_disable_irq(struct device * dev,unsigned int ce_id)314 static inline void pld_snoc_disable_irq(struct device *dev, unsigned int ce_id)
315 {
316 if (dev)
317 icnss_disable_irq(dev, ce_id);
318 }
319
pld_snoc_get_ce_id(struct device * dev,int irq)320 static inline int pld_snoc_get_ce_id(struct device *dev, int irq)
321 {
322 if (!dev)
323 return -ENODEV;
324
325 return icnss_get_ce_id(dev, irq);
326 }
327
pld_snoc_get_irq(struct device * dev,int ce_id)328 static inline int pld_snoc_get_irq(struct device *dev, int ce_id)
329 {
330 if (!dev)
331 return -ENODEV;
332
333 return icnss_get_irq(dev, ce_id);
334 }
335
pld_snoc_power_on(struct device * dev)336 static inline int pld_snoc_power_on(struct device *dev)
337 {
338 return icnss_power_on(dev);
339 }
pld_snoc_power_off(struct device * dev)340 static inline int pld_snoc_power_off(struct device *dev)
341 {
342 return icnss_power_off(dev);
343 }
pld_snoc_athdiag_read(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * output)344 static inline int pld_snoc_athdiag_read(struct device *dev, uint32_t offset,
345 uint32_t memtype, uint32_t datalen,
346 uint8_t *output)
347 {
348 return icnss_athdiag_read(dev, offset, memtype, datalen, output);
349 }
pld_snoc_athdiag_write(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * input)350 static inline int pld_snoc_athdiag_write(struct device *dev, uint32_t offset,
351 uint32_t memtype, uint32_t datalen,
352 uint8_t *input)
353 {
354 return icnss_athdiag_write(dev, offset, memtype, datalen, input);
355 }
356
357 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
pld_snoc_smmu_get_domain(struct device * dev)358 static inline void *pld_snoc_smmu_get_domain(struct device *dev)
359 {
360 return icnss_smmu_get_domain(dev);
361 }
362
363 #else
pld_snoc_smmu_get_mapping(struct device * dev)364 static inline void *pld_snoc_smmu_get_mapping(struct device *dev)
365 {
366 return icnss_smmu_get_mapping(dev);
367 }
368 #endif
369
pld_snoc_smmu_map(struct device * dev,phys_addr_t paddr,uint32_t * iova_addr,size_t size)370 static inline int pld_snoc_smmu_map(struct device *dev, phys_addr_t paddr,
371 uint32_t *iova_addr, size_t size)
372 {
373 return icnss_smmu_map(dev, paddr, iova_addr, size);
374 }
375
376 #ifdef CONFIG_SMMU_S1_UNMAP
pld_snoc_smmu_unmap(struct device * dev,uint32_t iova_addr,size_t size)377 static inline int pld_snoc_smmu_unmap(struct device *dev,
378 uint32_t iova_addr, size_t size)
379 {
380 return icnss_smmu_unmap(dev, iova_addr, size);
381 }
382
383 #else
pld_snoc_smmu_unmap(struct device * dev,uint32_t iova_addr,size_t size)384 static inline int pld_snoc_smmu_unmap(struct device *dev,
385 uint32_t iova_addr, size_t size)
386 {
387 return 0;
388 }
389 #endif
390
391 static inline
pld_snoc_socinfo_get_serial_number(struct device * dev)392 unsigned int pld_snoc_socinfo_get_serial_number(struct device *dev)
393 {
394 return icnss_socinfo_get_serial_number(dev);
395 }
396
pld_snoc_is_fw_down(struct device * dev)397 static inline int pld_snoc_is_fw_down(struct device *dev)
398 {
399 return icnss_is_fw_down();
400 }
401
402 #ifdef CONFIG_ENABLE_LOW_POWER_MODE
pld_snoc_is_low_power_mode(struct device * dev)403 static inline int pld_snoc_is_low_power_mode(struct device *dev)
404 {
405 return icnss_is_low_power();
406 }
407 #else
pld_snoc_is_low_power_mode(struct device * dev)408 static inline int pld_snoc_is_low_power_mode(struct device *dev)
409 {
410 return 0;
411 }
412 #endif
413
pld_snoc_is_qmi_disable(struct device * dev)414 static inline int pld_snoc_is_qmi_disable(struct device *dev)
415 {
416 if (!dev)
417 return -ENODEV;
418
419 return icnss_is_qmi_disable(dev);
420 }
421
pld_snoc_set_fw_log_mode(struct device * dev,u8 fw_log_mode)422 static inline int pld_snoc_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
423 {
424 if (!dev)
425 return -ENODEV;
426
427 return icnss_set_fw_log_mode(dev, fw_log_mode);
428 }
429
pld_snoc_force_assert_target(struct device * dev)430 static inline int pld_snoc_force_assert_target(struct device *dev)
431 {
432 return icnss_trigger_recovery(dev);
433 }
434
pld_snoc_is_pdr(void)435 static inline int pld_snoc_is_pdr(void)
436 {
437 return icnss_is_pdr();
438 }
439
pld_snoc_is_fw_rejuvenate(void)440 static inline int pld_snoc_is_fw_rejuvenate(void)
441 {
442 return icnss_is_rejuvenate();
443 }
444
pld_snoc_block_shutdown(bool status)445 static inline void pld_snoc_block_shutdown(bool status)
446 {
447 icnss_block_shutdown(status);
448 }
449
pld_snoc_idle_restart(struct device * dev)450 static inline int pld_snoc_idle_restart(struct device *dev)
451 {
452 return icnss_idle_restart(dev);
453 }
454
pld_snoc_idle_shutdown(struct device * dev)455 static inline int pld_snoc_idle_shutdown(struct device *dev)
456 {
457 return icnss_idle_shutdown(dev);
458 }
459
pld_snoc_get_device_config(void)460 static inline unsigned long pld_snoc_get_device_config(void)
461 {
462 return icnss_get_device_config();
463 }
464 #endif
465 #endif
466