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 void (*ce_irq_enable)(struct ath11k_base *ab); 30 void (*ce_irq_disable)(struct ath11k_base *ab); 31 }; 32 33 static inline void ath11k_hif_ce_irq_enable(struct ath11k_base *ab) 34 { 35 if (ab->hif.ops->ce_irq_enable) 36 ab->hif.ops->ce_irq_enable(ab); 37 } 38 39 static inline void ath11k_hif_ce_irq_disable(struct ath11k_base *ab) 40 { 41 if (ab->hif.ops->ce_irq_disable) 42 ab->hif.ops->ce_irq_disable(ab); 43 } 44 45 static inline int ath11k_hif_start(struct ath11k_base *sc) 46 { 47 return sc->hif.ops->start(sc); 48 } 49 50 static inline void ath11k_hif_stop(struct ath11k_base *sc) 51 { 52 sc->hif.ops->stop(sc); 53 } 54 55 static inline void ath11k_hif_irq_enable(struct ath11k_base *sc) 56 { 57 sc->hif.ops->irq_enable(sc); 58 } 59 60 static inline void ath11k_hif_irq_disable(struct ath11k_base *sc) 61 { 62 sc->hif.ops->irq_disable(sc); 63 } 64 65 static inline int ath11k_hif_power_up(struct ath11k_base *sc) 66 { 67 return sc->hif.ops->power_up(sc); 68 } 69 70 static inline void ath11k_hif_power_down(struct ath11k_base *sc) 71 { 72 sc->hif.ops->power_down(sc); 73 } 74 75 static inline int ath11k_hif_suspend(struct ath11k_base *ab) 76 { 77 if (ab->hif.ops->suspend) 78 return ab->hif.ops->suspend(ab); 79 80 return 0; 81 } 82 83 static inline int ath11k_hif_resume(struct ath11k_base *ab) 84 { 85 if (ab->hif.ops->resume) 86 return ab->hif.ops->resume(ab); 87 88 return 0; 89 } 90 91 static inline u32 ath11k_hif_read32(struct ath11k_base *sc, u32 address) 92 { 93 return sc->hif.ops->read32(sc, address); 94 } 95 96 static inline void ath11k_hif_write32(struct ath11k_base *sc, u32 address, u32 data) 97 { 98 sc->hif.ops->write32(sc, address, data); 99 } 100 101 static inline int ath11k_hif_map_service_to_pipe(struct ath11k_base *sc, u16 service_id, 102 u8 *ul_pipe, u8 *dl_pipe) 103 { 104 return sc->hif.ops->map_service_to_pipe(sc, service_id, ul_pipe, dl_pipe); 105 } 106 107 static inline int ath11k_get_user_msi_vector(struct ath11k_base *ab, char *user_name, 108 int *num_vectors, u32 *user_base_data, 109 u32 *base_vector) 110 { 111 if (!ab->hif.ops->get_user_msi_vector) 112 return -EOPNOTSUPP; 113 114 return ab->hif.ops->get_user_msi_vector(ab, user_name, num_vectors, 115 user_base_data, 116 base_vector); 117 } 118 119 static inline void ath11k_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo, 120 u32 *msi_addr_hi) 121 { 122 if (!ab->hif.ops->get_msi_address) 123 return; 124 125 ab->hif.ops->get_msi_address(ab, msi_addr_lo, msi_addr_hi); 126 } 127 #endif /* _HIF_H_ */ 128