/** @file */
/******************************************************************************
 *
 * Copyright(c) 2019 Realtek Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 ******************************************************************************/

#ifndef _MAC_AX_GPIO_H_
#define _MAC_AX_GPIO_H_

#include "../type.h"
#include "gpio_cmd.h"

#define DFLT_GPIO_STATE \
	{RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, \
	 RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, \
	 RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, \
	 RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, \
	 RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, \
	 RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, RTW_MAC_GPIO_DFLT, \
	 RTW_MAC_GPIO_DFLT}

#define DFLT_SW_IO_MODE \
	{0, 0, 0, 0, \
	 0, 0, 0, 0, \
	 0, 0, 0, 0, \
	 0, 0, 0, 0}

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */
/**
 * @brief mac_sel_uart_tx_pin
 *
 * @param *adapter
 * @param uart_pin
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_sel_uart_tx_pin(struct mac_ax_adapter *adapter,
			enum mac_ax_uart_tx_pin uart_pin);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_pinmux_status
 *
 * @param *adapter
 * @param func
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_pinmux_status(struct mac_ax_adapter *adapter,
		      enum mac_ax_gpio_func func);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_pinmux_free_func
 *
 * @param *adapter
 * @param func
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_pinmux_free_func(struct mac_ax_adapter *adapter,
			 enum mac_ax_gpio_func func);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_pinmux_record
 *
 * @param *adapter
 * @param func
 * @param val
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_pinmux_record(struct mac_ax_adapter *adapter,
		      enum mac_ax_gpio_func func, u8 val);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_pinmux_switch
 *
 * @param *adapter
 * @param gpio_func
 * @param *list
 * @param list_size
 * @param gpio_id
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_pinmux_switch(struct mac_ax_adapter *adapter,
		      enum mac_ax_gpio_func gpio_func,
		      const struct mac_ax_pinmux_list *list,
		      u32 list_size, u32 gpio_id);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_sel_uart_rx_pin
 *
 * @param *adapter
 * @param uart_pin
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_sel_uart_rx_pin(struct mac_ax_adapter *adapter,
			enum mac_ax_uart_rx_pin uart_pin);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_set_led_mode
 *
 * @param *adapter
 * @param mode
 * @param led_id
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_set_led_mode(struct mac_ax_adapter *adapter,
		     enum mac_ax_led_mode mode, u8 led_id);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_led_ctrl
 *
 * @param *adapter
 * @param high
 * @param led_id
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_led_ctrl(struct mac_ax_adapter *adapter,
		 u8 high, u8 led_id);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_sw_gpio_ctrl
 *
 * @param *adapter
 * @param high
 * @param gpio
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_sw_gpio_ctrl(struct mac_ax_adapter *adapter,
		     u8 high, u8 gpio);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_set_sw_gpio_mode
 *
 * @param *adapter
 * @param mode
 * @param gpio
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_set_sw_gpio_mode(struct mac_ax_adapter *adapter,
			 enum rtw_gpio_mode mode, u8 gpio);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_get_gpio_status
 *
 * @param *adapter
 * @param *list
 * @return Please Place Description here.
 * @retval  rtw_mac_gfunc
 */
enum rtw_mac_gfunc mac_get_gpio_status(struct mac_ax_adapter *adapter,
				       const struct mac_ax_pin_list *list);
/**
 * @}
 * @}
 */

/**
 * @addtogroup Common
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_cfg_wps
 *
 * WPS is a driver feature to detect button pressed or released.
 * In HW view, the feature is to check the GPIO input value is 0->1 or 1->0
 * We use FW to detect GPIO val.
 * In a specified interval, if FW detects value changed, it will send a C2H
 *
 * @param *adapter
 * @param *wps
 * @return 0 for succcess, others for fail
 * @retval u32
 */
u32 mac_cfg_wps(struct mac_ax_adapter *adapter,
		struct mac_ax_cfg_wps *wps);
/**
 * @}
 * @}
 */
u32 mac_get_gpio_val(struct mac_ax_adapter *adapter, u8 gpio, u8 *val);
u32 mac_get_wl_dis_val(struct mac_ax_adapter *adapter, u8 *val);

/**
 * @addtogroup HCI
 * @{
 * @addtogroup GPIO
 * @{
 */

/**
 * @brief mac_get_uart_fw_dbg_gpio
 *
 * @param *adapter
 * @param uart_tx_pin
 * @param uart_rx_pin
 * @return Please Place Description here.
 * @retval u32
 */
u32 mac_get_uart_fw_dbg_gpio(struct mac_ax_adapter *adapter, u8 *uart_tx_gpio, u8 *uart_rx_gpio);
/**
 * @}
 * @}
 */

u32 mac_bcn_cnt_gpio(struct mac_ax_adapter *adapter,
		     struct rtw_hal_mac_bcn_cnt_gpio_info *bcn_cnt_gpio);
u32 mac_bcn_sync_rpt(struct mac_ax_adapter *adapter,
		     struct rtw_hal_mac_bcn_sync_rpt *ret_rpt);
#endif
