From: Ping-Ke Shih <pks...@realtek.com>

GPIO with pinmux can switch to many functions such as LED, UART, JTAG,
WoWLAN, etc.

Signed-off-by: Ping-Ke Shih <pks...@realtek.com>
---
 .../halmac_88xx/halmac_8822b/halmac_gpio_8822b.c   | 847 +++++++++++++++++++++
 .../halmac_88xx/halmac_8822b/halmac_gpio_8822b.h   |  34 +
 .../rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.c  | 415 ++++++++++
 .../rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.h  |  55 ++
 .../realtek/rtlwifi/halmac/halmac_gpio_cmd.h       |  84 ++
 5 files changed, 1435 insertions(+)
 create mode 100644 
drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_gpio_8822b.c
 create mode 100644 
drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_gpio_8822b.h
 create mode 100644 
drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.c
 create mode 100644 
drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.h
 create mode 100644 
drivers/net/wireless/realtek/rtlwifi/halmac/halmac_gpio_cmd.h

diff --git 
a/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_gpio_8822b.c
 
b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_gpio_8822b.c
new file mode 100644
index 000000000000..3d43de98bb46
--- /dev/null
+++ 
b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_gpio_8822b.c
@@ -0,0 +1,847 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2016 - 2018 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.
+ *
+ 
******************************************************************************/
+
+#include "halmac_gpio_8822b.h"
+#include "../halmac_gpio_88xx.h"
+
+/* GPIO0 definition */
+#define GPIO0_BT_GPIO0_8822B   \
+       {HALMAC_BT_GPIO, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
+        0x66, BIT(2), BIT(2)}
+#define GPIO0_BT_ACT_8822B     \
+       {HALMAC_BT_PTA, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
+        0x41, BIT(1), 0}
+#define GPIO0_WL_ACT_8822B     \
+       {HALMAC_WL_PTA, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
+        0x41, BIT(2), BIT(2)}
+#define GPIO0_WLMAC_DBG_GPIO0_8822B    \
+       {HALMAC_WLMAC_DBG, HALMAC_GPIO0, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0)}
+#define GPIO0_WLPHY_DBG_GPIO0_8822B    \
+       {HALMAC_WLPHY_DBG, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(1)}
+#define GPIO0_BT_DBG_GPIO0_8822B       \
+       {HALMAC_BT_DBG, HALMAC_GPIO0, HALMAC_GPIO_OUT, \
+       0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
+#define GPIO0_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO1 definition */
+#define GPIO1_BT_GPIO1_8822B   \
+       {HALMAC_BT_GPIO, HALMAC_GPIO1, HALMAC_GPIO_IN_OUT, \
+        0x66, BIT(2), BIT(2)}
+#define GPIO1_BT_3DD_SYNC_A_8822B      \
+       {HALMAC_BT_3DDLS_A, HALMAC_GPIO1, HALMAC_GPIO_IN, \
+        0x66, BIT(2), BIT(2)}
+#define GPIO1_WL_CK_8822B      \
+       {HALMAC_BT_PTA, HALMAC_GPIO1, HALMAC_GPIO_OUT, \
+        0x41, BIT(1), 0}
+#define GPIO1_BT_CK_8822B      \
+       {HALMAC_WL_PTA, HALMAC_GPIO1, HALMAC_GPIO_OUT, \
+        0x41, BIT(2), BIT(2)}
+#define GPIO1_WLMAC_DBG_GPIO1_8822B    \
+       {HALMAC_WLMAC_DBG, HALMAC_GPIO1, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0)}
+#define GPIO1_WLPHY_DBG_GPIO1_8822B    \
+       {HALMAC_WLPHY_DBG, HALMAC_GPIO1, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(1)}
+#define GPIO1_BT_DBG_GPIO1_8822B       \
+       {HALMAC_BT_DBG, HALMAC_GPIO1, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
+#define GPIO1_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO1, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO2 definition */
+#define GPIO2_BT_GPIO2_8822B   \
+       {HALMAC_BT_GPIO, HALMAC_GPIO2, HALMAC_GPIO_IN_OUT, \
+        0x66, BIT(2), BIT(2)}
+#define GPIO2_WL_STATE_8822B   \
+       {HALMAC_BT_PTA, HALMAC_GPIO2, HALMAC_GPIO_OUT, \
+        0x41, BIT(1), 0}
+#define GPIO2_BT_STATE_8822B   \
+       {HALMAC_WL_PTA, HALMAC_GPIO2, HALMAC_GPIO_OUT, \
+        0x41, BIT(2), BIT(2)}
+#define GPIO2_WLMAC_DBG_GPIO2_8822B    \
+       {HALMAC_WLMAC_DBG, HALMAC_GPIO2, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0)}
+#define GPIO2_WLPHY_DBG_GPIO2_8822B    \
+       {HALMAC_WLPHY_DBG, HALMAC_GPIO2, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(1)}
+#define GPIO2_BT_DBG_GPIO2_8822B       \
+       {HALMAC_BT_DBG, HALMAC_GPIO2, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
+#define GPIO2_RFE_CTRL_5_8822B \
+       {HALMAC_WLPHY_RFE_CTRL2GPIO, HALMAC_GPIO2, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(2), BIT(2)}
+#define GPIO2_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO2, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO3 definition */
+#define GPIO3_BT_GPIO3_8822B   \
+       {HALMAC_BT_GPIO, HALMAC_GPIO3, HALMAC_GPIO_IN_OUT, \
+        0x66, BIT(2), BIT(2)}
+#define GPIO3_WL_PRI_8822B     \
+       {HALMAC_BT_PTA, HALMAC_GPIO3, HALMAC_GPIO_OUT, \
+        0x41, BIT(1), 0}
+#define GPIO3_BT_PRI_8822B     \
+       {HALMAC_WL_PTA, HALMAC_GPIO3, HALMAC_GPIO_OUT, \
+        0x41, BIT(2), BIT(2)}
+#define GPIO3_WLMAC_DBG_GPIO3_8822B    \
+       {HALMAC_WLMAC_DBG, HALMAC_GPIO3, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0)}
+#define GPIO3_WLPHY_DBG_GPIO3_8822B    \
+       {HALMAC_WLPHY_DBG, HALMAC_GPIO3, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(1)}
+#define GPIO3_BT_DBG_GPIO3_8822B       \
+       {HALMAC_BT_DBG, HALMAC_GPIO3, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
+#define GPIO3_RFE_CTRL_4_8822B \
+       {HALMAC_WLPHY_RFE_CTRL2GPIO, HALMAC_GPIO3, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(2), BIT(2)}
+#define GPIO3_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO3, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO4 definition */
+#define GPIO4_BT_SPI_D0_8822B  \
+       {HALMAC_BT_SFLASH, HALMAC_GPIO4, HALMAC_GPIO_IN_OUT, \
+        0x66, BIT(4), BIT(4)}
+#define GPIO4_WL_SPI_D0_8822B  \
+       {HALMAC_WL_SFLASH, HALMAC_GPIO4, HALMAC_GPIO_IN_OUT, \
+        0x42, BIT(3), BIT(3)}
+#define GPIO4_SDIO_INT_8822B   \
+       {HALMAC_SDIO_INT, HALMAC_GPIO4, HALMAC_GPIO_OUT, \
+        0x72, BIT(2), BIT(2)}
+#define GPIO4_JTAG_TRST_8822B  \
+       {HALMAC_JTAG, HALMAC_GPIO4, HALMAC_GPIO_IN, \
+        0x67, BIT(0), BIT(0)}
+#define GPIO4_DBG_GNT_WL_8822B \
+       {HALMAC_DBG_GNT_WL_BT, HALMAC_GPIO4, HALMAC_GPIO_OUT, \
+        0x73, BIT(3), BIT(3)}
+#define GPIO4_WLMAC_DBG_GPIO4_8822B    \
+       {HALMAC_WLMAC_DBG, HALMAC_GPIO4, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0)}
+#define GPIO4_WLPHY_DBG_GPIO4_8822B    \
+       {HALMAC_WLPHY_DBG, HALMAC_GPIO4, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(1)}
+#define GPIO4_BT_DBG_GPIO4_8822B       \
+       {HALMAC_BT_DBG, HALMAC_GPIO4, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
+#define GPIO4_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO4, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO5 definition */
+#define GPIO5_BT_SPI_D1_8822B  \
+       {HALMAC_BT_SFLASH, HALMAC_GPIO5, HALMAC_GPIO_IN_OUT, \
+        0x66, BIT(4), BIT(4)}
+#define GPIO5_WL_SPI_D1_8822B  \
+       {HALMAC_WL_SFLASH, HALMAC_GPIO5, HALMAC_GPIO_IN_OUT, \
+        0x42, BIT(3), BIT(3)}
+#define GPIO5_JTAG_TDI_8822B   \
+       {HALMAC_JTAG, HALMAC_GPIO5, HALMAC_GPIO_IN, \
+        0x67, BIT(0), BIT(0)}
+#define GPIO5_DBG_GNT_BT_8822B \
+       {HALMAC_DBG_GNT_WL_BT, HALMAC_GPIO5, HALMAC_GPIO_OUT, \
+        0x73, BIT(3), BIT(3)}
+#define GPIO5_WLMAC_DBG_GPIO5_8822B    \
+       {HALMAC_WLMAC_DBG, HALMAC_GPIO5, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0)}
+#define GPIO5_WLPHY_DBG_GPIO5_8822B    \
+       {HALMAC_WLPHY_DBG, HALMAC_GPIO5, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(1)}
+#define GPIO5_BT_DBG_GPIO5_8822B       \
+       {HALMAC_BT_DBG, HALMAC_GPIO5, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
+#define GPIO5_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO5, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO6 definition */
+#define GPIO6_BT_SPI_D2_8822B  \
+       {HALMAC_BT_SFLASH, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
+        0x66, BIT(4), BIT(4)}
+#define GPIO6_WL_SPI_D2_8822B  \
+       {HALMAC_WL_SFLASH, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
+        0x42, BIT(3), BIT(3)}
+#define GPIO6_EEDO_8822B       \
+       {HALMAC_EEPROM, HALMAC_GPIO6, HALMAC_GPIO_IN, \
+        0x40, BIT(4), BIT(4)}
+#define GPIO6_JTAG_TDO_8822B   \
+       {HALMAC_JTAG, HALMAC_GPIO6, HALMAC_GPIO_OUT, \
+        0x67, BIT(0), BIT(0)}
+#define GPIO6_BT_3DD_SYNC_B_8822B      \
+       {HALMAC_BT_3DDLS_B, HALMAC_GPIO6, HALMAC_GPIO_IN, \
+        0x67, BIT(1), BIT(1)}
+#define GPIO6_BT_GPIO18_8822B  \
+       {HALMAC_BT_GPIO, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
+        0x67, BIT(1), BIT(1)}
+#define GPIO6_SIN_8822B        \
+       {HALMAC_WL_UART, HALMAC_GPIO6, HALMAC_GPIO_IN, \
+        0x41, BIT(0), BIT(0)}
+#define GPIO6_WLMAC_DBG_GPIO6_8822B    \
+       {HALMAC_WLMAC_DBG, HALMAC_GPIO6, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0)}
+#define GPIO6_WLPHY_DBG_GPIO6_8822B    \
+       {HALMAC_WLPHY_DBG, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(1)}
+#define GPIO6_BT_DBG_GPIO6_8822B       \
+       {HALMAC_BT_DBG, HALMAC_GPIO6, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
+#define GPIO6_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO7 definition */
+#define GPIO7_BT_SPI_D3_8822B  \
+       {HALMAC_BT_SFLASH, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
+        0x66, BIT(4), BIT(4)}
+#define GPIO7_WL_SPI_D3_8822B  \
+       {HALMAC_WL_SFLASH, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
+        0x42, BIT(3), BIT(3)}
+#define GPIO7_EEDI_8822B       \
+       {HALMAC_EEPROM, HALMAC_GPIO7, HALMAC_GPIO_OUT, \
+        0x40, BIT(4), BIT(4)}
+#define GPIO7_JTAG_TMS_8822B   \
+       {HALMAC_JTAG, HALMAC_GPIO7, HALMAC_GPIO_IN, \
+        0x67, BIT(0), BIT(0)}
+#define GPIO7_BT_GPIO16_8822B  \
+       {HALMAC_BT_GPIO, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
+        0x67, BIT(2), BIT(2)}
+#define GPIO7_SOUT_8822B       \
+       {HALMAC_WL_UART, HALMAC_GPIO7, HALMAC_GPIO_OUT, \
+        0x41, BIT(0), BIT(0)}
+#define GPIO7_WLMAC_DBG_GPIO7_8822B    \
+       {HALMAC_WLMAC_DBG, HALMAC_GPIO7, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0)}
+#define GPIO7_WLPHY_DBG_GPIO7_8822B    \
+       {HALMAC_WLPHY_DBG, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(1)}
+#define GPIO7_BT_DBG_GPIO7_8822B       \
+       {HALMAC_BT_DBG, HALMAC_GPIO7, HALMAC_GPIO_OUT, \
+        0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
+#define GPIO7_SW_IO_8822B \
+       {HALMAC_SW_IO, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO8 definition */
+#define GPIO8_WL_EXT_WOL_8822B \
+       {HALMAC_WL_HW_EXTWOL, HALMAC_GPIO8, HALMAC_GPIO_IN, \
+        0x4a, BIT(0) | BIT(1), BIT(0) | BIT(1)}
+#define GPIO8_WL_LED_8822B     \
+       {HALMAC_WL_LED, HALMAC_GPIO8, HALMAC_GPIO_OUT, \
+        0x4e, BIT(5), BIT(5)}
+#define GPIO8_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO8, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO9 definition */
+#define GPIO9_DIS_WL_N_8822B   \
+       {HALMAC_WL_HWPDN, HALMAC_GPIO9, HALMAC_GPIO_IN, \
+        0x68, BIT(3) | BIT(0), BIT(3) | BIT(0)}
+#define GPIO9_WL_EXT_WOL_8822B \
+       {HALMAC_WL_HW_EXTWOL, HALMAC_GPIO9, HALMAC_GPIO_IN, \
+        0x4a, BIT(0) | BIT(1), BIT(0)}
+#define GPIO9_USCTS0_8822B     \
+       {HALMAC_UART0, HALMAC_GPIO9, HALMAC_GPIO_IN, \
+        0x66, BIT(6), BIT(6)}
+#define GPIO9_SW_IO_8822B      \
+       {HALMAC_SW_IO, HALMAC_GPIO9, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO10 definition */
+#define GPIO10_SW_IO_8822B     \
+       {HALMAC_SW_IO, HALMAC_GPIO10, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO11 definition */
+#define GPIO11_DIS_BT_N_8822B  \
+       {HALMAC_BT_HWPDN, HALMAC_GPIO11, HALMAC_GPIO_IN, \
+        0x6a, BIT(0), BIT(0)}
+#define GPIO11_USOUT0_8822B    \
+       {HALMAC_UART0, HALMAC_GPIO11, HALMAC_GPIO_OUT, \
+        0x66, BIT(6), BIT(6)}
+#define GPIO11_SW_IO_8822B     \
+       {HALMAC_SW_IO, HALMAC_GPIO11, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO12 definition */
+#define GPIO12_USIN0_8822B     \
+       {HALMAC_UART0, HALMAC_GPIO12, HALMAC_GPIO_IN, \
+        0x66, BIT(6), BIT(6)}
+#define GPIO12_SW_IO_8822B     \
+       {HALMAC_SW_IO, HALMAC_GPIO12, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO13 definition */
+#define GPIO13_BT_WAKE_8822B   \
+       {HALMAC_GPIO13_14_WL_CTRL_EN, HALMAC_GPIO13, HALMAC_GPIO_IN, \
+        0x4e, BIT(6), BIT(6)}
+#define GPIO13_SW_IO_8822B     \
+       {HALMAC_SW_IO, HALMAC_GPIO13, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO14 definition */
+#define GPIO14_UART_WAKE_8822B \
+       {HALMAC_GPIO13_14_WL_CTRL_EN, HALMAC_GPIO14, HALMAC_GPIO_OUT, \
+        0x4e, BIT(6), BIT(6)}
+#define GPIO14_SW_IO_8822B     \
+       {HALMAC_SW_IO, HALMAC_GPIO14, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+/* GPIO15 definition */
+#define GPIO15_EXT_XTAL_8822B  \
+       {HALMAC_EXT_XTAL, HALMAC_GPIO15, HALMAC_GPIO_OUT, \
+        0x66, BIT(7), BIT(7)}
+#define GPIO15_SW_IO_8822B     \
+       {HALMAC_SW_IO, HALMAC_GPIO15, HALMAC_GPIO_IN_OUT, \
+        0x40, BIT(1) | BIT(0), 0}
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO0_8822B[] = {
+       GPIO0_BT_GPIO0_8822B,
+       GPIO0_BT_ACT_8822B,
+       GPIO0_WL_ACT_8822B,
+       GPIO0_WLMAC_DBG_GPIO0_8822B,
+       GPIO0_WLPHY_DBG_GPIO0_8822B,
+       GPIO0_BT_DBG_GPIO0_8822B,
+       GPIO0_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO1_8822B[] = {
+       GPIO1_BT_GPIO1_8822B,
+       GPIO1_BT_3DD_SYNC_A_8822B,
+       GPIO1_WL_CK_8822B,
+       GPIO1_BT_CK_8822B,
+       GPIO1_WLMAC_DBG_GPIO1_8822B,
+       GPIO1_WLPHY_DBG_GPIO1_8822B,
+       GPIO1_BT_DBG_GPIO1_8822B,
+       GPIO1_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO2_8822B[] = {
+       GPIO2_BT_GPIO2_8822B,
+       GPIO2_WL_STATE_8822B,
+       GPIO2_BT_STATE_8822B,
+       GPIO2_WLMAC_DBG_GPIO2_8822B,
+       GPIO2_WLPHY_DBG_GPIO2_8822B,
+       GPIO2_BT_DBG_GPIO2_8822B,
+       GPIO2_RFE_CTRL_5_8822B,
+       GPIO2_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO3_8822B[] = {
+       GPIO3_BT_GPIO3_8822B,
+       GPIO3_WL_PRI_8822B,
+       GPIO3_BT_PRI_8822B,
+       GPIO3_WLMAC_DBG_GPIO3_8822B,
+       GPIO3_WLPHY_DBG_GPIO3_8822B,
+       GPIO3_BT_DBG_GPIO3_8822B,
+       GPIO3_RFE_CTRL_4_8822B,
+       GPIO3_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO4_8822B[] = {
+       GPIO4_BT_SPI_D0_8822B,
+       GPIO4_WL_SPI_D0_8822B,
+       GPIO4_SDIO_INT_8822B,
+       GPIO4_JTAG_TRST_8822B,
+       GPIO4_DBG_GNT_WL_8822B,
+       GPIO4_WLMAC_DBG_GPIO4_8822B,
+       GPIO4_WLPHY_DBG_GPIO4_8822B,
+       GPIO4_BT_DBG_GPIO4_8822B,
+       GPIO4_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO5_8822B[] = {
+       GPIO5_BT_SPI_D1_8822B,
+       GPIO5_WL_SPI_D1_8822B,
+       GPIO5_JTAG_TDI_8822B,
+       GPIO5_DBG_GNT_BT_8822B,
+       GPIO5_WLMAC_DBG_GPIO5_8822B,
+       GPIO5_WLPHY_DBG_GPIO5_8822B,
+       GPIO5_BT_DBG_GPIO5_8822B,
+       GPIO5_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO6_8822B[] = {
+       GPIO6_BT_SPI_D2_8822B,
+       GPIO6_WL_SPI_D2_8822B,
+       GPIO6_EEDO_8822B,
+       GPIO6_JTAG_TDO_8822B,
+       GPIO6_BT_3DD_SYNC_B_8822B,
+       GPIO6_BT_GPIO18_8822B,
+       GPIO6_SIN_8822B,
+       GPIO6_WLMAC_DBG_GPIO6_8822B,
+       GPIO6_WLPHY_DBG_GPIO6_8822B,
+       GPIO6_BT_DBG_GPIO6_8822B,
+       GPIO6_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO7_8822B[] = {
+       GPIO7_BT_SPI_D3_8822B,
+       GPIO7_WL_SPI_D3_8822B,
+       GPIO7_EEDI_8822B,
+       GPIO7_JTAG_TMS_8822B,
+       GPIO7_BT_GPIO16_8822B,
+       GPIO7_SOUT_8822B,
+       GPIO7_WLMAC_DBG_GPIO7_8822B,
+       GPIO7_WLPHY_DBG_GPIO7_8822B,
+       GPIO7_BT_DBG_GPIO7_8822B,
+       GPIO7_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO8_8822B[] = {
+       GPIO8_WL_EXT_WOL_8822B,
+       GPIO8_WL_LED_8822B,
+       GPIO8_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO9_8822B[] = {
+       GPIO9_DIS_WL_N_8822B,
+       GPIO9_WL_EXT_WOL_8822B,
+       GPIO9_USCTS0_8822B,
+       GPIO9_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO10_8822B[] = {
+       GPIO10_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO11_8822B[] = {
+       GPIO11_DIS_BT_N_8822B,
+       GPIO11_USOUT0_8822B,
+       GPIO11_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO12_8822B[] = {
+       GPIO12_USIN0_8822B,
+       GPIO12_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO13_8822B[] = {
+       GPIO13_BT_WAKE_8822B,
+       GPIO13_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO14_8822B[] = {
+       GPIO14_UART_WAKE_8822B,
+       GPIO14_SW_IO_8822B
+};
+
+static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO15_8822B[] = {
+       GPIO15_EXT_XTAL_8822B,
+       GPIO15_SW_IO_8822B
+};
+
+static enum halmac_ret_status
+get_pinmux_list_8822b(struct halmac_adapter *adapter,
+                     enum halmac_gpio_func gpio_func,
+                     const struct halmac_gpio_pimux_list **list,
+                     u32 *list_size, u32 *gpio_id);
+
+static enum halmac_ret_status
+chk_pinmux_valid_8822b(struct halmac_adapter *adapter,
+                      enum halmac_gpio_func gpio_func);
+
+/**
+ * pinmux_get_func_8822b() -get current gpio status
+ * @adapter : the adapter of halmac
+ * @gpio_func : gpio function
+ * @enable : function is enable(1) or disable(0)
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+enum halmac_ret_status
+pinmux_get_func_8822b(struct halmac_adapter *adapter,
+                     enum halmac_gpio_func gpio_func, u8 *enable)
+{
+       u32 list_size;
+       u32 cur_func;
+       u32 gpio_id;
+       enum halmac_ret_status status;
+       const struct halmac_gpio_pimux_list *list = NULL;
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "%s ===>\n",
+                __func__);
+
+       status = get_pinmux_list_8822b(adapter, gpio_func, &list, &list_size,
+                                      &gpio_id);
+       if (status != HALMAC_RET_SUCCESS)
+               return status;
+
+       status = pinmux_parser_88xx(adapter, list, list_size, gpio_id,
+                                   &cur_func);
+       if (status != HALMAC_RET_SUCCESS)
+               return status;
+
+       switch (gpio_func) {
+       case HALMAC_GPIO_FUNC_WL_LED:
+               *enable = (cur_func == HALMAC_WL_LED) ? 1 : 0;
+               break;
+       case HALMAC_GPIO_FUNC_SDIO_INT:
+               *enable = (cur_func == HALMAC_SDIO_INT) ? 1 : 0;
+               break;
+       case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
+       case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
+               *enable = (cur_func == HALMAC_GPIO13_14_WL_CTRL_EN) ? 1 : 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_0:
+       case HALMAC_GPIO_FUNC_SW_IO_1:
+       case HALMAC_GPIO_FUNC_SW_IO_2:
+       case HALMAC_GPIO_FUNC_SW_IO_3:
+       case HALMAC_GPIO_FUNC_SW_IO_4:
+       case HALMAC_GPIO_FUNC_SW_IO_5:
+       case HALMAC_GPIO_FUNC_SW_IO_6:
+       case HALMAC_GPIO_FUNC_SW_IO_7:
+       case HALMAC_GPIO_FUNC_SW_IO_8:
+       case HALMAC_GPIO_FUNC_SW_IO_9:
+       case HALMAC_GPIO_FUNC_SW_IO_10:
+       case HALMAC_GPIO_FUNC_SW_IO_11:
+       case HALMAC_GPIO_FUNC_SW_IO_12:
+       case HALMAC_GPIO_FUNC_SW_IO_13:
+       case HALMAC_GPIO_FUNC_SW_IO_14:
+       case HALMAC_GPIO_FUNC_SW_IO_15:
+               *enable = (cur_func == HALMAC_SW_IO) ? 1 : 0;
+               break;
+       default:
+               *enable = 0;
+               return HALMAC_RET_GET_PINMUX_ERR;
+       }
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "%s <===\n",
+                __func__);
+
+       return HALMAC_RET_SUCCESS;
+}
+
+/**
+ * pinmux_set_func_8822b() -set gpio function
+ * @adapter : the adapter of halmac
+ * @gpio_func : gpio function
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+enum halmac_ret_status
+pinmux_set_func_8822b(struct halmac_adapter *adapter,
+                     enum halmac_gpio_func gpio_func)
+{
+       u32 list_size;
+       u32 gpio_id;
+       enum halmac_ret_status status;
+       const struct halmac_gpio_pimux_list *list = NULL;
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "%s ===>\n",
+                __func__);
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG,
+                "func name : %d\n", gpio_func);
+
+       status = chk_pinmux_valid_8822b(adapter, gpio_func);
+       if (status != HALMAC_RET_SUCCESS)
+               return status;
+
+       status = get_pinmux_list_8822b(adapter, gpio_func, &list, &list_size,
+                                      &gpio_id);
+       if (status != HALMAC_RET_SUCCESS)
+               return status;
+
+       status = pinmux_switch_88xx(adapter, list, list_size, gpio_id,
+                                   gpio_func);
+       if (status != HALMAC_RET_SUCCESS)
+               return status;
+
+       status = pinmux_record_88xx(adapter, gpio_func, 1);
+       if (status != HALMAC_RET_SUCCESS)
+               return status;
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "%s <===\n",
+                __func__);
+
+       return HALMAC_RET_SUCCESS;
+}
+
+/**
+ * pinmux_free_func_8822b() -free locked gpio function
+ * @adapter : the adapter of halmac
+ * @gpio_func : gpio function
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+enum halmac_ret_status
+pinmux_free_func_8822b(struct halmac_adapter *adapter,
+                      enum halmac_gpio_func gpio_func)
+{
+       struct halmac_pinmux_info *info = &adapter->pinmux_info;
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "%s ===>\n",
+                __func__);
+
+       switch (gpio_func) {
+       case HALMAC_GPIO_FUNC_SW_IO_0:
+               info->sw_io_0 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_1:
+               info->sw_io_1 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_2:
+               info->sw_io_2 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_3:
+               info->sw_io_3 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_4:
+       case HALMAC_GPIO_FUNC_SDIO_INT:
+               info->sw_io_4 = 0;
+               info->sdio_int = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_5:
+               info->sw_io_5 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_6:
+               info->sw_io_6 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_7:
+               info->sw_io_7 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_8:
+       case HALMAC_GPIO_FUNC_WL_LED:
+               info->sw_io_8 = 0;
+               info->wl_led = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_9:
+               info->sw_io_9 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_10:
+               info->sw_io_10 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_11:
+               info->sw_io_11 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_12:
+               info->sw_io_12 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_13:
+       case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
+               info->bt_dev_wake = 0;
+               info->sw_io_13 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_14:
+       case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
+               info->bt_host_wake = 0;
+               info->sw_io_14 = 0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_15:
+               info->sw_io_15 = 0;
+               break;
+       default:
+               return HALMAC_RET_SWITCH_CASE_ERROR;
+       }
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "func : %X\n",
+                gpio_func);
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "%s <===\n",
+                __func__);
+
+       return HALMAC_RET_SUCCESS;
+}
+
+static enum halmac_ret_status
+get_pinmux_list_8822b(struct halmac_adapter *adapter,
+                     enum halmac_gpio_func gpio_func,
+                     const struct halmac_gpio_pimux_list **list,
+                     u32 *list_size, u32 *gpio_id)
+{
+       switch (gpio_func) {
+       case HALMAC_GPIO_FUNC_SW_IO_0:
+               *list = PINMUX_LIST_GPIO0_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO0_8822B);
+               *gpio_id = HALMAC_GPIO0;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_1:
+               *list = PINMUX_LIST_GPIO1_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO1_8822B);
+               *gpio_id = HALMAC_GPIO1;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_2:
+               *list = PINMUX_LIST_GPIO2_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO2_8822B);
+               *gpio_id = HALMAC_GPIO2;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_3:
+               *list = PINMUX_LIST_GPIO3_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO3_8822B);
+               *gpio_id = HALMAC_GPIO3;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_4:
+       case HALMAC_GPIO_FUNC_SDIO_INT:
+               *list = PINMUX_LIST_GPIO4_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO4_8822B);
+               *gpio_id = HALMAC_GPIO4;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_5:
+               *list = PINMUX_LIST_GPIO5_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO5_8822B);
+               *gpio_id = HALMAC_GPIO5;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_6:
+               *list = PINMUX_LIST_GPIO6_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO6_8822B);
+               *gpio_id = HALMAC_GPIO6;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_7:
+               *list = PINMUX_LIST_GPIO7_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO7_8822B);
+               *gpio_id = HALMAC_GPIO7;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_8:
+       case HALMAC_GPIO_FUNC_WL_LED:
+               *list = PINMUX_LIST_GPIO8_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO8_8822B);
+               *gpio_id = HALMAC_GPIO8;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_9:
+               *list = PINMUX_LIST_GPIO9_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO9_8822B);
+               *gpio_id = HALMAC_GPIO9;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_10:
+               *list = PINMUX_LIST_GPIO10_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO10_8822B);
+               *gpio_id = HALMAC_GPIO10;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_11:
+               *list = PINMUX_LIST_GPIO11_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO11_8822B);
+               *gpio_id = HALMAC_GPIO11;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_12:
+               *list = PINMUX_LIST_GPIO12_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO12_8822B);
+               *gpio_id = HALMAC_GPIO12;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_13:
+       case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
+               *list = PINMUX_LIST_GPIO13_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO13_8822B);
+               *gpio_id = HALMAC_GPIO13;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_14:
+       case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
+               *list = PINMUX_LIST_GPIO14_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO14_8822B);
+               *gpio_id = HALMAC_GPIO14;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_15:
+               *list = PINMUX_LIST_GPIO15_8822B;
+               *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO15_8822B);
+               *gpio_id = HALMAC_GPIO15;
+               break;
+       default:
+               return HALMAC_RET_SWITCH_CASE_ERROR;
+       }
+
+       return HALMAC_RET_SUCCESS;
+}
+
+static enum halmac_ret_status
+chk_pinmux_valid_8822b(struct halmac_adapter *adapter,
+                      enum halmac_gpio_func gpio_func)
+{
+       struct halmac_pinmux_info *info = &adapter->pinmux_info;
+       enum halmac_ret_status status = HALMAC_RET_SUCCESS;
+
+       switch (gpio_func) {
+       case HALMAC_GPIO_FUNC_SW_IO_0:
+               if (info->sw_io_0 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_1:
+               if (info->sw_io_1 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_2:
+               if (info->sw_io_2 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_3:
+               if (info->sw_io_3 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_4:
+       case HALMAC_GPIO_FUNC_SDIO_INT:
+               if (info->sw_io_4 == 1 || info->sdio_int == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_5:
+               if (info->sw_io_5 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_6:
+               if (info->sw_io_6 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_7:
+               if (info->sw_io_7 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_8:
+       case HALMAC_GPIO_FUNC_WL_LED:
+               if (info->sw_io_8 == 1 || info->wl_led == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_9:
+               if (info->sw_io_9 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_10:
+               if (info->sw_io_10 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_11:
+               if (info->sw_io_11 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_12:
+               if (info->sw_io_12 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_13:
+       case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
+               if (info->sw_io_13 == 1 || info->bt_dev_wake == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_14:
+       case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
+               if (info->sw_io_14 == 1 || info->bt_host_wake == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_15:
+               if (info->sw_io_15 == 1)
+                       status = HALMAC_RET_PINMUX_USED;
+               break;
+       default:
+               return HALMAC_RET_SWITCH_CASE_ERROR;
+       }
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG,
+                "chk_pinmux_valid func : %X status : %X\n", gpio_func, status);
+
+       return status;
+}
diff --git 
a/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_gpio_8822b.h
 
b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_gpio_8822b.h
new file mode 100644
index 000000000000..f5d6d315ac3c
--- /dev/null
+++ 
b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_gpio_8822b.h
@@ -0,0 +1,34 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2016 - 2018 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 _HALMAC_GPIO_8822B_H_
+#define _HALMAC_GPIO_8822B_H_
+
+#include "../../halmac_api.h"
+#include "../../halmac_gpio_cmd.h"
+
+enum halmac_ret_status
+pinmux_get_func_8822b(struct halmac_adapter *adapter,
+                     enum halmac_gpio_func gpio_func, u8 *enable);
+
+enum halmac_ret_status
+pinmux_set_func_8822b(struct halmac_adapter *adapter,
+                     enum halmac_gpio_func gpio_func);
+
+enum halmac_ret_status
+pinmux_free_func_8822b(struct halmac_adapter *adapter,
+                      enum halmac_gpio_func gpio_func);
+
+#endif/* _HALMAC_GPIO_8822B_H_ */
diff --git 
a/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.c 
b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.c
new file mode 100644
index 000000000000..f95add244d47
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.c
@@ -0,0 +1,415 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2016 - 2018 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.
+ *
+ 
******************************************************************************/
+
+#include "halmac_gpio_88xx.h"
+
+/**
+ * pinmux_wl_led_mode_88xx() -control wlan led gpio function
+ * @adapter : the adapter of halmac
+ * @mode : wlan led mode
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+enum halmac_ret_status
+pinmux_wl_led_mode_88xx(struct halmac_adapter *adapter,
+                       enum halmac_wlled_mode mode)
+{
+       u8 value8;
+       struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "%s ===>\n",
+                __func__);
+
+       value8 = HALMAC_REG_R8(REG_LED_CFG + 2);
+       value8 &= ~(BIT(6));
+       value8 |= BIT(3);
+       value8 &= ~(BIT(0) | BIT(1) | BIT(2));
+
+       switch (mode) {
+       case HALMAC_WLLED_MODE_TRX:
+               value8 |= 2;
+               break;
+       case HALMAC_WLLED_MODE_TX:
+               value8 |= 4;
+               break;
+       case HALMAC_WLLED_MODE_RX:
+               value8 |= 6;
+               break;
+       case HALMAC_WLLED_MODE_SW_CTRL:
+               value8 |= 0;
+               break;
+       default:
+               return HALMAC_RET_SWITCH_CASE_ERROR;
+       }
+
+       HALMAC_REG_W8(REG_LED_CFG + 2, value8);
+
+       RT_TRACE(adapter->drv_adapter, COMP_HALMAC, DBG_DMESG, "%s <===\n",
+                __func__);
+
+       return HALMAC_RET_SUCCESS;
+}
+
+/**
+ * pinmux_wl_led_sw_ctrl_88xx() -control wlan led on/off
+ * @adapter : the adapter of halmac
+ * @on : on(1), off(0)
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+void
+pinmux_wl_led_sw_ctrl_88xx(struct halmac_adapter *adapter, u8 on)
+{
+       u8 value8;
+       struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
+
+       value8 = HALMAC_REG_R8(REG_LED_CFG + 2);
+       value8 = (on == 0) ? value8 | BIT(3) : value8 & ~(BIT(3));
+
+       HALMAC_REG_W8(REG_LED_CFG + 2, value8);
+}
+
+/**
+ * pinmux_sdio_int_polarity_88xx() -control sdio int polarity
+ * @adapter : the adapter of halmac
+ * @low_active : low active(1), high active(0)
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+void
+pinmux_sdio_int_polarity_88xx(struct halmac_adapter *adapter, u8 low_active)
+{
+       u8 value8;
+       struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
+
+       value8 = HALMAC_REG_R8(REG_SYS_SDIO_CTRL + 2);
+       value8 = (low_active == 0) ? value8 | BIT(3) : value8 & ~(BIT(3));
+
+       HALMAC_REG_W8(REG_SYS_SDIO_CTRL + 2, value8);
+}
+
+/**
+ * pinmux_gpio_mode_88xx() -control gpio io mode
+ * @adapter : the adapter of halmac
+ * @gpio_id : gpio0~15(0~15)
+ * @output : output(1), input(0)
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+enum halmac_ret_status
+pinmux_gpio_mode_88xx(struct halmac_adapter *adapter, u8 gpio_id, u8 output)
+{
+       u16 value16;
+       u8 in_out;
+       u32 offset;
+       struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
+
+       if (gpio_id <= 7)
+               offset = REG_GPIO_PIN_CTRL + 2;
+       else if (gpio_id >= 8 && gpio_id <= 15)
+               offset = REG_GPIO_EXT_CTRL + 2;
+       else
+               return HALMAC_RET_WRONG_GPIO;
+
+       in_out = (output == 0) ? 0 : 1;
+       gpio_id &= (8 - 1);
+
+       value16 = HALMAC_REG_R16(offset);
+       value16 &= ~((1 << gpio_id) | (1 << gpio_id << 8));
+       value16 |= (in_out << gpio_id);
+       HALMAC_REG_W16(offset, value16);
+
+       return HALMAC_RET_SUCCESS;
+}
+
+/**
+ * pinmux_gpio_output_88xx() -control gpio output high/low
+ * @adapter : the adapter of halmac
+ * @gpio_id : gpio0~15(0~15)
+ * @high : high(1), low(0)
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+enum halmac_ret_status
+pinmux_gpio_output_88xx(struct halmac_adapter *adapter, u8 gpio_id, u8 high)
+{
+       u8 value8;
+       u8 hi_low;
+       u32 offset;
+       struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
+
+       if (gpio_id <= 7)
+               offset = REG_GPIO_PIN_CTRL + 1;
+       else if (gpio_id >= 8 && gpio_id <= 15)
+               offset = REG_GPIO_EXT_CTRL + 1;
+       else
+               return HALMAC_RET_WRONG_GPIO;
+
+       hi_low = (high == 0) ? 0 : 1;
+       gpio_id &= (8 - 1);
+
+       value8 = HALMAC_REG_R8(offset);
+       value8 &= ~(1 << gpio_id);
+       value8 |= (hi_low << gpio_id);
+       HALMAC_REG_W8(offset, value8);
+
+       return HALMAC_RET_SUCCESS;
+}
+
+/**
+ * halmac_pinmux_status_88xx() -get current gpio status(high/low)
+ * @adapter : the adapter of halmac
+ * @pin_id : 0~15(0~15)
+ * @phigh : high(1), low(0)
+ * Author : Ivan Lin
+ * Return : enum halmac_ret_status
+ * More details of status code can be found in prototype document
+ */
+enum halmac_ret_status
+pinmux_pin_status_88xx(struct halmac_adapter *adapter, u8 pin_id, u8 *high)
+{
+       u8 value8;
+       u32 offset;
+       struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
+
+       if (pin_id <= 7)
+               offset = REG_GPIO_PIN_CTRL;
+       else if (pin_id >= 8 && pin_id <= 15)
+               offset = REG_GPIO_EXT_CTRL;
+       else
+               return HALMAC_RET_WRONG_GPIO;
+
+       pin_id &= (8 - 1);
+
+       value8 = HALMAC_REG_R8(offset);
+       *high = (value8 & (1 << pin_id)) >> pin_id;
+
+       return HALMAC_RET_SUCCESS;
+}
+
+enum halmac_ret_status
+pinmux_parser_88xx(struct halmac_adapter *adapter,
+                  const struct halmac_gpio_pimux_list *list, u32 size,
+                  u32 gpio_id, u32 *cur_func)
+{
+       u32 i;
+       u8 value8;
+       const struct halmac_gpio_pimux_list *cur_list = list;
+       enum halmac_gpio_cfg_state *state;
+       struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
+
+       state = &adapter->halmac_state.gpio_cfg_state;
+
+       if (*state == HALMAC_GPIO_CFG_STATE_BUSY)
+               return HALMAC_RET_BUSY_STATE;
+
+       *state = HALMAC_GPIO_CFG_STATE_BUSY;
+
+       for (i = 0; i < size; i++) {
+               if (gpio_id != cur_list->id) {
+                       pr_err("offset:%X, value:%X, func:%X\n",
+                              cur_list->offset, cur_list->value,
+                              cur_list->func);
+                       pr_err("id1 : %X, id2 : %X\n", gpio_id, cur_list->id);
+                       *state = HALMAC_GPIO_CFG_STATE_IDLE;
+                       return HALMAC_RET_GET_PINMUX_ERR;
+               }
+               value8 = HALMAC_REG_R8(cur_list->offset);
+               value8 &= cur_list->msk;
+               if (value8 == cur_list->value) {
+                       *cur_func = cur_list->func;
+                       break;
+               }
+               cur_list++;
+       }
+
+       *state = HALMAC_GPIO_CFG_STATE_IDLE;
+
+       if (i == size)
+               return HALMAC_RET_GET_PINMUX_ERR;
+
+       return HALMAC_RET_SUCCESS;
+}
+
+enum halmac_ret_status
+pinmux_switch_88xx(struct halmac_adapter *adapter,
+                  const struct halmac_gpio_pimux_list *list, u32 size,
+                  u32 gpio_id, enum halmac_gpio_func gpio_func)
+{
+       u32 i;
+       u8 value8;
+       u16 switch_func;
+       const struct halmac_gpio_pimux_list *cur_list = list;
+       enum halmac_gpio_cfg_state *state;
+       struct halmac_api *api = (struct halmac_api *)adapter->halmac_api;
+
+       state = &adapter->halmac_state.gpio_cfg_state;
+
+       if (*state == HALMAC_GPIO_CFG_STATE_BUSY)
+               return HALMAC_RET_BUSY_STATE;
+
+       switch (gpio_func) {
+       case HALMAC_GPIO_FUNC_WL_LED:
+               switch_func = HALMAC_WL_LED;
+               break;
+       case HALMAC_GPIO_FUNC_SDIO_INT:
+               switch_func = HALMAC_SDIO_INT;
+               break;
+       case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
+       case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
+               switch_func = HALMAC_GPIO13_14_WL_CTRL_EN;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_0:
+       case HALMAC_GPIO_FUNC_SW_IO_1:
+       case HALMAC_GPIO_FUNC_SW_IO_2:
+       case HALMAC_GPIO_FUNC_SW_IO_3:
+       case HALMAC_GPIO_FUNC_SW_IO_4:
+       case HALMAC_GPIO_FUNC_SW_IO_5:
+       case HALMAC_GPIO_FUNC_SW_IO_6:
+       case HALMAC_GPIO_FUNC_SW_IO_7:
+       case HALMAC_GPIO_FUNC_SW_IO_8:
+       case HALMAC_GPIO_FUNC_SW_IO_9:
+       case HALMAC_GPIO_FUNC_SW_IO_10:
+       case HALMAC_GPIO_FUNC_SW_IO_11:
+       case HALMAC_GPIO_FUNC_SW_IO_12:
+       case HALMAC_GPIO_FUNC_SW_IO_13:
+       case HALMAC_GPIO_FUNC_SW_IO_14:
+       case HALMAC_GPIO_FUNC_SW_IO_15:
+               switch_func = HALMAC_SW_IO;
+               break;
+       default:
+               return HALMAC_RET_SWITCH_CASE_ERROR;
+       }
+
+       for (i = 0; i < size; i++) {
+               if (gpio_id != cur_list->id) {
+                       pr_err("offset:%X, value:%X, func:%X\n",
+                              cur_list->offset, cur_list->value,
+                              cur_list->func);
+                       pr_err("id1 : %X, id2 : %X\n", gpio_id, cur_list->id);
+                       return HALMAC_RET_GET_PINMUX_ERR;
+               }
+
+               if (switch_func == cur_list->func)
+                       break;
+
+               cur_list++;
+       }
+
+       if (i == size) {
+               pr_err("gpio func error:%X %X\n", gpio_id, cur_list->id);
+               return HALMAC_RET_GET_PINMUX_ERR;
+       }
+
+       *state = HALMAC_GPIO_CFG_STATE_BUSY;
+
+       cur_list = list;
+       for (i = 0; i < size; i++) {
+               value8 = HALMAC_REG_R8(cur_list->offset);
+               value8 &= ~(cur_list->msk);
+
+               if (switch_func == cur_list->func) {
+                       value8 |= (cur_list->value & cur_list->msk);
+                       HALMAC_REG_W8(cur_list->offset, value8);
+                       break;
+               }
+
+               value8 |= (~cur_list->value & cur_list->msk);
+               HALMAC_REG_W8(cur_list->offset, value8);
+
+               cur_list++;
+       }
+
+       *state = HALMAC_GPIO_CFG_STATE_IDLE;
+
+       return HALMAC_RET_SUCCESS;
+}
+
+enum halmac_ret_status
+pinmux_record_88xx(struct halmac_adapter *adapter,
+                  enum halmac_gpio_func gpio_func, u8 val)
+{
+       switch (gpio_func) {
+       case HALMAC_GPIO_FUNC_WL_LED:
+               adapter->pinmux_info.wl_led = val;
+               break;
+       case HALMAC_GPIO_FUNC_SDIO_INT:
+               adapter->pinmux_info.sdio_int = val;
+               break;
+       case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
+               adapter->pinmux_info.bt_host_wake = val;
+               break;
+       case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
+               adapter->pinmux_info.bt_dev_wake = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_0:
+               adapter->pinmux_info.sw_io_0 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_1:
+               adapter->pinmux_info.sw_io_1 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_2:
+               adapter->pinmux_info.sw_io_2 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_3:
+               adapter->pinmux_info.sw_io_3 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_4:
+               adapter->pinmux_info.sw_io_4 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_5:
+               adapter->pinmux_info.sw_io_5 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_6:
+               adapter->pinmux_info.sw_io_6 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_7:
+               adapter->pinmux_info.sw_io_7 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_8:
+               adapter->pinmux_info.sw_io_8 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_9:
+               adapter->pinmux_info.sw_io_9 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_10:
+               adapter->pinmux_info.sw_io_10 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_11:
+               adapter->pinmux_info.sw_io_11 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_12:
+               adapter->pinmux_info.sw_io_12 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_13:
+               adapter->pinmux_info.sw_io_13 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_14:
+               adapter->pinmux_info.sw_io_14 = val;
+               break;
+       case HALMAC_GPIO_FUNC_SW_IO_15:
+               adapter->pinmux_info.sw_io_15 = val;
+               break;
+       default:
+               return HALMAC_RET_GET_PINMUX_ERR;
+       }
+
+       return HALMAC_RET_SUCCESS;
+}
diff --git 
a/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.h 
b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.h
new file mode 100644
index 000000000000..2b6b5ce345f4
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_88xx/halmac_gpio_88xx.h
@@ -0,0 +1,55 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2016 - 2018 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 _HALMAC_GPIO_88XX_H_
+#define _HALMAC_GPIO_88XX_H_
+
+#include "../halmac_api.h"
+#include "../halmac_gpio_cmd.h"
+
+enum halmac_ret_status
+pinmux_wl_led_mode_88xx(struct halmac_adapter *adapter,
+                       enum halmac_wlled_mode mode);
+
+void
+pinmux_wl_led_sw_ctrl_88xx(struct halmac_adapter *adapter, u8 on);
+
+void
+pinmux_sdio_int_polarity_88xx(struct halmac_adapter *adapter, u8 low_active);
+
+enum halmac_ret_status
+pinmux_gpio_mode_88xx(struct halmac_adapter *adapter, u8 gpio_id, u8 output);
+
+enum halmac_ret_status
+pinmux_gpio_output_88xx(struct halmac_adapter *adapter, u8 gpio_id, u8 high);
+
+enum halmac_ret_status
+pinmux_pin_status_88xx(struct halmac_adapter *adapter, u8 pin_id, u8 *high);
+
+enum halmac_ret_status
+pinmux_parser_88xx(struct halmac_adapter *adapter,
+                  const struct halmac_gpio_pimux_list *list, u32 size,
+                  u32 gpio_id, u32 *cur_func);
+
+enum halmac_ret_status
+pinmux_switch_88xx(struct halmac_adapter *adapter,
+                  const struct halmac_gpio_pimux_list *list, u32 size,
+                  u32 gpio_id, enum halmac_gpio_func gpio_func);
+
+enum halmac_ret_status
+pinmux_record_88xx(struct halmac_adapter *adapter,
+                  enum halmac_gpio_func gpio_func, u8 val);
+
+#endif/* _HALMAC_GPIO_88XX_H_ */
diff --git a/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_gpio_cmd.h 
b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_gpio_cmd.h
new file mode 100644
index 000000000000..92283350083a
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtlwifi/halmac/halmac_gpio_cmd.h
@@ -0,0 +1,84 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2016 - 2018 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 HALMAC_GPIO_CMD
+#define HALMAC_GPIO_CMD
+
+#include "../wifi.h"
+
+/* GPIO ID */
+#define HALMAC_GPIO0           0
+#define HALMAC_GPIO1           1
+#define HALMAC_GPIO2           2
+#define HALMAC_GPIO3           3
+#define HALMAC_GPIO4           4
+#define HALMAC_GPIO5           5
+#define HALMAC_GPIO6           6
+#define HALMAC_GPIO7           7
+#define HALMAC_GPIO8           8
+#define HALMAC_GPIO9           9
+#define HALMAC_GPIO10          10
+#define HALMAC_GPIO11          11
+#define HALMAC_GPIO12          12
+#define HALMAC_GPIO13          13
+#define HALMAC_GPIO14          14
+#define HALMAC_GPIO15          15
+#define HALMAC_GPIO_NUM                16
+
+/* GPIO type */
+#define HALMAC_GPIO_IN         0
+#define HALMAC_GPIO_OUT                1
+#define HALMAC_GPIO_IN_OUT     2
+
+/* Function name */
+#define HALMAC_WL_HWPDN                        0
+#define HALMAC_BT_HWPDN                        1
+#define HALMAC_BT_GPIO                 2
+#define HALMAC_WL_HW_EXTWOL            3
+#define HALMAC_BT_HW_EXTWOL            4
+#define HALMAC_BT_SFLASH               5
+#define HALMAC_WL_SFLASH               6
+#define HALMAC_WL_LED                  7
+#define HALMAC_SDIO_INT                        8
+#define HALMAC_UART0                   9
+#define HALMAC_EEPROM                  10
+#define HALMAC_JTAG                    11
+#define HALMAC_LTE_COEX_UART           12
+#define HALMAC_3W_LTE_WL_GPIO          13
+#define HALMAC_GPIO2_3_WL_CTRL_EN      14
+#define HALMAC_GPIO13_14_WL_CTRL_EN    15
+#define HALMAC_DBG_GNT_WL_BT           16
+#define HALMAC_BT_3DDLS_A              17
+#define HALMAC_BT_3DDLS_B              18
+#define HALMAC_BT_PTA                  19
+#define HALMAC_WL_PTA                  20
+#define HALMAC_WL_UART                 21
+#define HALMAC_WLMAC_DBG               22
+#define HALMAC_WLPHY_DBG               23
+#define HALMAC_BT_DBG                  24
+#define HALMAC_WLPHY_RFE_CTRL2GPIO     25
+#define HALMAC_EXT_XTAL                        26
+#define HALMAC_SW_IO                   27
+
+struct halmac_gpio_pimux_list {
+       u16 func;
+       u8 id;
+       u8 type;
+       u16 offset;
+       u8 msk;
+       u8 value;
+};
+
+#endif
-- 
2.15.1

Reply via email to