162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause-Clear */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
462306a36Sopenharmony_ci * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef ATH12K_HIF_H
862306a36Sopenharmony_ci#define ATH12K_HIF_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "core.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistruct ath12k_hif_ops {
1362306a36Sopenharmony_ci	u32 (*read32)(struct ath12k_base *sc, u32 address);
1462306a36Sopenharmony_ci	void (*write32)(struct ath12k_base *sc, u32 address, u32 data);
1562306a36Sopenharmony_ci	void (*irq_enable)(struct ath12k_base *sc);
1662306a36Sopenharmony_ci	void (*irq_disable)(struct ath12k_base *sc);
1762306a36Sopenharmony_ci	int (*start)(struct ath12k_base *sc);
1862306a36Sopenharmony_ci	void (*stop)(struct ath12k_base *sc);
1962306a36Sopenharmony_ci	int (*power_up)(struct ath12k_base *sc);
2062306a36Sopenharmony_ci	void (*power_down)(struct ath12k_base *sc);
2162306a36Sopenharmony_ci	int (*suspend)(struct ath12k_base *ab);
2262306a36Sopenharmony_ci	int (*resume)(struct ath12k_base *ab);
2362306a36Sopenharmony_ci	int (*map_service_to_pipe)(struct ath12k_base *sc, u16 service_id,
2462306a36Sopenharmony_ci				   u8 *ul_pipe, u8 *dl_pipe);
2562306a36Sopenharmony_ci	int (*get_user_msi_vector)(struct ath12k_base *ab, char *user_name,
2662306a36Sopenharmony_ci				   int *num_vectors, u32 *user_base_data,
2762306a36Sopenharmony_ci				   u32 *base_vector);
2862306a36Sopenharmony_ci	void (*get_msi_address)(struct ath12k_base *ab, u32 *msi_addr_lo,
2962306a36Sopenharmony_ci				u32 *msi_addr_hi);
3062306a36Sopenharmony_ci	void (*ce_irq_enable)(struct ath12k_base *ab);
3162306a36Sopenharmony_ci	void (*ce_irq_disable)(struct ath12k_base *ab);
3262306a36Sopenharmony_ci	void (*get_ce_msi_idx)(struct ath12k_base *ab, u32 ce_id, u32 *msi_idx);
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic inline int ath12k_hif_map_service_to_pipe(struct ath12k_base *ab, u16 service_id,
3662306a36Sopenharmony_ci						 u8 *ul_pipe, u8 *dl_pipe)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	return ab->hif.ops->map_service_to_pipe(ab, service_id,
3962306a36Sopenharmony_ci						ul_pipe, dl_pipe);
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic inline int ath12k_hif_get_user_msi_vector(struct ath12k_base *ab,
4362306a36Sopenharmony_ci						 char *user_name,
4462306a36Sopenharmony_ci						 int *num_vectors,
4562306a36Sopenharmony_ci						 u32 *user_base_data,
4662306a36Sopenharmony_ci						 u32 *base_vector)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	if (!ab->hif.ops->get_user_msi_vector)
4962306a36Sopenharmony_ci		return -EOPNOTSUPP;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	return ab->hif.ops->get_user_msi_vector(ab, user_name, num_vectors,
5262306a36Sopenharmony_ci						user_base_data,
5362306a36Sopenharmony_ci						base_vector);
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline void ath12k_hif_get_msi_address(struct ath12k_base *ab,
5762306a36Sopenharmony_ci					      u32 *msi_addr_lo,
5862306a36Sopenharmony_ci					      u32 *msi_addr_hi)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	if (!ab->hif.ops->get_msi_address)
6162306a36Sopenharmony_ci		return;
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	ab->hif.ops->get_msi_address(ab, msi_addr_lo, msi_addr_hi);
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic inline void ath12k_hif_get_ce_msi_idx(struct ath12k_base *ab, u32 ce_id,
6762306a36Sopenharmony_ci					     u32 *msi_data_idx)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	if (ab->hif.ops->get_ce_msi_idx)
7062306a36Sopenharmony_ci		ab->hif.ops->get_ce_msi_idx(ab, ce_id, msi_data_idx);
7162306a36Sopenharmony_ci	else
7262306a36Sopenharmony_ci		*msi_data_idx = ce_id;
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic inline void ath12k_hif_ce_irq_enable(struct ath12k_base *ab)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	if (ab->hif.ops->ce_irq_enable)
7862306a36Sopenharmony_ci		ab->hif.ops->ce_irq_enable(ab);
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline void ath12k_hif_ce_irq_disable(struct ath12k_base *ab)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	if (ab->hif.ops->ce_irq_disable)
8462306a36Sopenharmony_ci		ab->hif.ops->ce_irq_disable(ab);
8562306a36Sopenharmony_ci}
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistatic inline void ath12k_hif_irq_enable(struct ath12k_base *ab)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	ab->hif.ops->irq_enable(ab);
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic inline void ath12k_hif_irq_disable(struct ath12k_base *ab)
9362306a36Sopenharmony_ci{
9462306a36Sopenharmony_ci	ab->hif.ops->irq_disable(ab);
9562306a36Sopenharmony_ci}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistatic inline int ath12k_hif_suspend(struct ath12k_base *ab)
9862306a36Sopenharmony_ci{
9962306a36Sopenharmony_ci	if (ab->hif.ops->suspend)
10062306a36Sopenharmony_ci		return ab->hif.ops->suspend(ab);
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	return 0;
10362306a36Sopenharmony_ci}
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic inline int ath12k_hif_resume(struct ath12k_base *ab)
10662306a36Sopenharmony_ci{
10762306a36Sopenharmony_ci	if (ab->hif.ops->resume)
10862306a36Sopenharmony_ci		return ab->hif.ops->resume(ab);
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	return 0;
11162306a36Sopenharmony_ci}
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cistatic inline int ath12k_hif_start(struct ath12k_base *ab)
11462306a36Sopenharmony_ci{
11562306a36Sopenharmony_ci	return ab->hif.ops->start(ab);
11662306a36Sopenharmony_ci}
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_cistatic inline void ath12k_hif_stop(struct ath12k_base *ab)
11962306a36Sopenharmony_ci{
12062306a36Sopenharmony_ci	ab->hif.ops->stop(ab);
12162306a36Sopenharmony_ci}
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistatic inline u32 ath12k_hif_read32(struct ath12k_base *ab, u32 address)
12462306a36Sopenharmony_ci{
12562306a36Sopenharmony_ci	return ab->hif.ops->read32(ab, address);
12662306a36Sopenharmony_ci}
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cistatic inline void ath12k_hif_write32(struct ath12k_base *ab, u32 address,
12962306a36Sopenharmony_ci				      u32 data)
13062306a36Sopenharmony_ci{
13162306a36Sopenharmony_ci	ab->hif.ops->write32(ab, address, data);
13262306a36Sopenharmony_ci}
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cistatic inline int ath12k_hif_power_up(struct ath12k_base *ab)
13562306a36Sopenharmony_ci{
13662306a36Sopenharmony_ci	return ab->hif.ops->power_up(ab);
13762306a36Sopenharmony_ci}
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cistatic inline void ath12k_hif_power_down(struct ath12k_base *ab)
14062306a36Sopenharmony_ci{
14162306a36Sopenharmony_ci	ab->hif.ops->power_down(ab);
14262306a36Sopenharmony_ci}
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci#endif /* ATH12K_HIF_H */
145