/*
 * Copyright (c) 2015 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.
 */

#ifdef HIF_PCI
#ifndef _ICNSS_WLAN_H_
#define _ICNSS_WLAN_H_

#include <linux/device.h>
#include <linux/pci.h>
#include <linux/irqreturn.h>

#define ICNSS_MAX_IRQ_REGISTRATIONS 12

/**
 * struct ce_tgt_pipe_cfg
 *
 * @pipenum: pipe_num
 * @pipedir: pipe_dir
 * @nentries: nentries
 * @nbytes_max: nbytes_max
 * @flags: flags
 * @reserved: reserved
 */
struct ce_tgt_pipe_cfg {
	uint32_t pipe_num;
	uint32_t pipe_dir;
	uint32_t nentries;
	uint32_t nbytes_max;
	uint32_t flags;
	uint32_t reserved;
};

/**
 * struct ce_svc_pipe_cfg
 *
 * @service_id: service_id
 * @pipedir: pipedir
 * @pipenum: pipenum
 */
struct ce_svc_pipe_cfg {
	uint32_t service_id;
	uint32_t pipedir;
	uint32_t pipenum;
};

/**
 * struct icnss_shadow_reg_cfg
 *
 * @ce_id: Copy engine id
 * @reg_offset: Register offset
 */
struct icnss_shadow_reg_cfg {
	u16 ce_id;
	u16 reg_offset;
};
/**
 * struct icnss_wlan_enable_cfg
 *
 * @num_ce_tgt_cfg: num_ce_tgt_cfg
 * @ce_tgt_cfg: ce_tgt_cfg
 * @num_ce_svc_pipe_cfg: num_ce_svc_pipe_cfg
 * @ce_svc_cfg: ce_svc_cfg
 */
struct icnss_wlan_enable_cfg {
	uint32_t num_ce_tgt_cfg;
	struct ce_tgt_pipe_cfg *ce_tgt_cfg;
	uint32_t num_ce_svc_pipe_cfg;
	struct ce_svc_pipe_cfg *ce_svc_cfg;
	u32 num_shadow_reg_cfg;
	struct icnss_shadow_reg_cfg *shadow_reg_cfg;
};

/**
 * enum driver_mode
 *
 * @driver_mode: driver_mode
 */
enum icnss_driver_mode {
	ICNSS_MISSION,
	ICNSS_FTM,
	ICNSS_EPPING,
};

/**
 * struct icnss_soc_info
 *
 * @v_addr: virtual address
 * @p_addr: physical address
 * @ver: version
 */
struct icnss_soc_info {
	void __iomem *v_addr;
	phys_addr_t p_addr;
	uint32_t version;
};

int icnss_wlan_enable(struct icnss_wlan_enable_cfg *config,
	enum icnss_driver_mode mode, const char *host_version);
int icnss_wlan_disable(enum icnss_driver_mode mode);
int icnss_ce_request_irq(int ce_id,
	irqreturn_t (*handler)(int ce_id, void *arg),
	unsigned long flags, const char *name, void *context);
int icnss_ce_free_irq(int irq, void *context);
void icnss_enable_irq(unsigned int ce_id);
void icnss_disable_irq(unsigned int ce_id);
int icnss_get_soc_info(struct icnss_soc_info *info);
int icnss_get_ce_id(int irq);
#endif /* _ICNSS_WLAN_H_ */
#endif /* HIF_PCI */

