/*
 * Copyright (c) 2016 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

#ifndef __PLD_PCIE_H__
#define __PLD_PCIE_H__

#include "pld_common.h"

#ifndef CONFIG_PCI
static inline int pld_pcie_register_driver(void)
{
	return 0;
}

static inline void pld_pcie_unregister_driver(void)
{
	return;
}

static inline int pld_pcie_get_ce_id(int irq)
{
	return 0;
}
#else
int pld_pcie_register_driver(void);
void pld_pcie_unregister_driver(void);
int pld_pcie_get_ce_id(int irq);
#endif

#if (!defined(CONFIG_CNSS)) || (!defined(QCA_WIFI_3_0_ADRASTEA))
static inline int pld_pcie_wlan_enable(struct pld_wlan_enable_cfg *config,
		    enum pld_driver_mode mode, const char *host_version)
{
	return 0;
}
static inline int pld_pcie_wlan_disable(enum pld_driver_mode mode)
{
	return 0;
}
static inline int pld_pcie_set_fw_debug_mode(bool enablefwlog)
{
	return 0;
}
static inline void cnss_intr_notify_q6(void)
{
	return;
}
#else
int pld_pcie_wlan_enable(struct pld_wlan_enable_cfg *config,
			 enum pld_driver_mode mode, const char *host_version);
int pld_pcie_wlan_disable(enum pld_driver_mode mode);
int pld_pcie_set_fw_debug_mode(bool enablefwlog);
#endif

#if (!defined(CONFIG_CNSS)) || (!defined(CONFIG_CNSS_SECURE_FW))
static inline int cnss_get_sha_hash(const u8 *data,
				    u32 data_len, u8 *hash_idx, u8 *out)
{
	return 0;
}
static inline void *cnss_get_fw_ptr(void)
{
	return NULL;
}
#endif

#ifndef CONFIG_CNSS
static inline int
pld_pcie_get_fw_files_for_target(struct pld_fw_files *pfw_files,
				 u32 target_type, u32 target_version)
{
	return 0;
}
static inline int
pld_pcie_get_fw_image(struct pld_image_desc_info *image_desc_info)
{
	return 0;
}
static inline void cnss_wlan_pci_link_down(void)
{
	return;
}
static inline int cnss_pcie_shadow_control(bool enable)
{
	return 0;
}
static inline int
pld_pcie_get_codeswap_struct(struct pld_codeswap_codeseg_info *swap_seg)
{
	return 0;
}
static inline int
cnss_set_wlan_unsafe_channel(u16 *unsafe_ch_list, u16 ch_count)
{
	return 0;
}
static inline int cnss_get_wlan_unsafe_channel(u16 *unsafe_ch_list,
				u16 *ch_count, u16 buf_len)
{
	return 0;
}
static inline int cnss_wlan_set_dfs_nol(void *info, u16 info_len)
{
	return 0;
}
static inline int cnss_wlan_get_dfs_nol(void *info, u16 info_len)
{
	return 0;
}
static inline int cnss_wlan_pm_control(bool vote)
{
	return 0;
}
static inline void *cnss_get_virt_ramdump_mem(unsigned long *size)
{
	return NULL;
}
static inline void cnss_device_crashed(void)
{
	return;
}
static inline void cnss_device_self_recovery(void)
{
	return;
}
static inline void cnss_request_pm_qos(u32 qos_val)
{
	return;
}
static inline void cnss_remove_pm_qos(void)
{
	return;
}
static inline int cnss_request_bus_bandwidth(int bandwidth)
{
	return 0;
}
static inline int pld_pcie_get_platform_cap(struct pld_platform_cap *cap)
{
	return 0;
}
static inline void pld_pcie_set_driver_status(enum pld_driver_status status)
{
	return;
}
static inline int cnss_get_bmi_setup(void)
{
	return 0;
}
static inline int cnss_auto_suspend(void)
{
	return 0;
}
static inline int cnss_auto_resume(void)
{
	return 0;
}
#else
int pld_pcie_get_fw_files_for_target(struct pld_fw_files *pfw_files,
				     u32 target_type, u32 target_version);
int pld_pcie_get_fw_image(struct pld_image_desc_info *image_desc_info);
int pld_pcie_get_codeswap_struct(struct pld_codeswap_codeseg_info *swap_seg);
int pld_pcie_get_platform_cap(struct pld_platform_cap *cap);
void pld_pcie_set_driver_status(enum pld_driver_status status);
#endif

#endif
