xref: /openbmc/linux/drivers/net/wireless/ath/ath11k/hif.h (revision fa5917e44ee888732bba5294a9a22c1d54cce393)
1 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
2 /*
3  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
4  */
5 
6 #ifndef _HIF_H_
7 #define _HIF_H_
8 
9 #include "core.h"
10 
11 struct ath11k_hif_ops {
12 	u32 (*read32)(struct ath11k_base *sc, u32 address);
13 	void (*write32)(struct ath11k_base *sc, u32 address, u32 data);
14 	void (*irq_enable)(struct ath11k_base *sc);
15 	void (*irq_disable)(struct ath11k_base *sc);
16 	int (*start)(struct ath11k_base *sc);
17 	void (*stop)(struct ath11k_base *sc);
18 	int (*power_up)(struct ath11k_base *sc);
19 	void (*power_down)(struct ath11k_base *sc);
20 	int (*suspend)(struct ath11k_base *ab);
21 	int (*resume)(struct ath11k_base *ab);
22 	int (*map_service_to_pipe)(struct ath11k_base *sc, u16 service_id,
23 				   u8 *ul_pipe, u8 *dl_pipe);
24 	int (*get_user_msi_vector)(struct ath11k_base *ab, char *user_name,
25 				   int *num_vectors, u32 *user_base_data,
26 				   u32 *base_vector);
27 	void (*get_msi_address)(struct ath11k_base *ab, u32 *msi_addr_lo,
28 				u32 *msi_addr_hi);
29 };
30 
31 static inline int ath11k_hif_start(struct ath11k_base *sc)
32 {
33 	return sc->hif.ops->start(sc);
34 }
35 
36 static inline void ath11k_hif_stop(struct ath11k_base *sc)
37 {
38 	sc->hif.ops->stop(sc);
39 }
40 
41 static inline void ath11k_hif_irq_enable(struct ath11k_base *sc)
42 {
43 	sc->hif.ops->irq_enable(sc);
44 }
45 
46 static inline void ath11k_hif_irq_disable(struct ath11k_base *sc)
47 {
48 	sc->hif.ops->irq_disable(sc);
49 }
50 
51 static inline int ath11k_hif_power_up(struct ath11k_base *sc)
52 {
53 	return sc->hif.ops->power_up(sc);
54 }
55 
56 static inline void ath11k_hif_power_down(struct ath11k_base *sc)
57 {
58 	sc->hif.ops->power_down(sc);
59 }
60 
61 static inline int ath11k_hif_suspend(struct ath11k_base *ab)
62 {
63 	if (ab->hif.ops->suspend)
64 		return ab->hif.ops->suspend(ab);
65 
66 	return 0;
67 }
68 
69 static inline int ath11k_hif_resume(struct ath11k_base *ab)
70 {
71 	if (ab->hif.ops->resume)
72 		return ab->hif.ops->resume(ab);
73 
74 	return 0;
75 }
76 
77 static inline u32 ath11k_hif_read32(struct ath11k_base *sc, u32 address)
78 {
79 	return sc->hif.ops->read32(sc, address);
80 }
81 
82 static inline void ath11k_hif_write32(struct ath11k_base *sc, u32 address, u32 data)
83 {
84 	sc->hif.ops->write32(sc, address, data);
85 }
86 
87 static inline int ath11k_hif_map_service_to_pipe(struct ath11k_base *sc, u16 service_id,
88 						 u8 *ul_pipe, u8 *dl_pipe)
89 {
90 	return sc->hif.ops->map_service_to_pipe(sc, service_id, ul_pipe, dl_pipe);
91 }
92 
93 static inline int ath11k_get_user_msi_vector(struct ath11k_base *ab, char *user_name,
94 					     int *num_vectors, u32 *user_base_data,
95 					     u32 *base_vector)
96 {
97 	if (!ab->hif.ops->get_user_msi_vector)
98 		return -EOPNOTSUPP;
99 
100 	return ab->hif.ops->get_user_msi_vector(ab, user_name, num_vectors,
101 						user_base_data,
102 						base_vector);
103 }
104 
105 static inline void ath11k_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo,
106 					  u32 *msi_addr_hi)
107 {
108 	if (!ab->hif.ops->get_msi_address)
109 		return;
110 
111 	ab->hif.ops->get_msi_address(ab, msi_addr_lo, msi_addr_hi);
112 }
113 #endif /* _HIF_H_ */
114