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