OSDN Git Service

Add rtl8821ce driver version 5.5.2
[android-x86/external-kernel-drivers.git] / rtl8821ce / hal / halmac / halmac_88xx / halmac_8821c / halmac_gpio_8821c.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2016 - 2018 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15
16 #include "halmac_gpio_8821c.h"
17 #include "../halmac_gpio_88xx.h"
18
19 #if HALMAC_8821C_SUPPORT
20
21 /* P_LED0 definition */
22 #define GPIO0_BT_GPIO0_8821C    \
23         {HALMAC_BT_GPIO, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
24          0x66, BIT(2), BIT(2)}
25 #define GPIO0_BT_GPIO0_8821C    \
26         {HALMAC_BT_GPIO, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
27          0x66, BIT(2), BIT(2)}
28 #define GPIO0_BT_ACT_8821C      \
29         {HALMAC_BT_PTA, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
30          0x41, BIT(1), 0}
31 #define GPIO0_WL_ACT_8821C      \
32         {HALMAC_WL_PTA, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
33          0x41, BIT(2), BIT(2)}
34 #define GPIO0_WLMAC_DBG_GPIO0_8821C     \
35         {HALMAC_WLMAC_DBG, HALMAC_GPIO0, HALMAC_GPIO_OUT, \
36          0x40, BIT(1) | BIT(0), BIT(0)}
37 #define GPIO0_WLPHY_DBG_GPIO0_8821C     \
38         {HALMAC_WLPHY_DBG, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
39          0x40, BIT(1) | BIT(0), BIT(1)}
40 #define GPIO0_BT_DBG_GPIO0_8821C        \
41         {HALMAC_BT_DBG, HALMAC_GPIO0, HALMAC_GPIO_OUT, \
42          0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
43 #define GPIO0_SW_IO_8821C       \
44         {HALMAC_SW_IO, HALMAC_GPIO0, HALMAC_GPIO_IN_OUT, \
45          0x40, BIT(1) | BIT(0), 0}
46
47 /* GPIO1 definition */
48 #define GPIO1_BT_GPIO1_8821C    \
49         {HALMAC_BT_GPIO, HALMAC_GPIO1, HALMAC_GPIO_IN_OUT, \
50          0x66, BIT(2), BIT(2)}
51 #define GPIO1_BT_3DD_SYNC_A_8821C       \
52         {HALMAC_BT_3DDLS_A, HALMAC_GPIO1, HALMAC_GPIO_IN, \
53          0x66, BIT(2), BIT(2)}
54 #define GPIO1_WL_CK_8821C       \
55         {HALMAC_BT_PTA, HALMAC_GPIO1, HALMAC_GPIO_OUT, \
56          0x41, BIT(1), 0}
57 #define GPIO1_BT_CK_8821C       \
58         {HALMAC_WL_PTA, HALMAC_GPIO1, HALMAC_GPIO_OUT, \
59          0x41, BIT(2), BIT(2)}
60 #define GPIO1_WLMAC_DBG_GPIO1_8821C     \
61         {HALMAC_WLMAC_DBG, HALMAC_GPIO1, HALMAC_GPIO_OUT, \
62          0x40, BIT(1) | BIT(0), BIT(0)}
63 #define GPIO1_WLPHY_DBG_GPIO1_8821C     \
64         {HALMAC_WLPHY_DBG, HALMAC_GPIO1, HALMAC_GPIO_IN_OUT, \
65          0x40, BIT(1) | BIT(0), BIT(1)}
66 #define GPIO1_BT_DBG_GPIO1_8821C        \
67         {HALMAC_BT_DBG, HALMAC_GPIO1, HALMAC_GPIO_OUT, \
68          0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
69 #define GPIO1_SW_IO_8821C       \
70         {HALMAC_SW_IO, HALMAC_GPIO1, HALMAC_GPIO_IN_OUT, \
71          0x40, BIT(1) | BIT(0), 0}
72
73 /* GPIO2 definition */
74 #define GPIO2_BT_GPIO2_8821C    \
75         {HALMAC_BT_GPIO, HALMAC_GPIO2, HALMAC_GPIO_IN_OUT, \
76          0x66, BIT(2), BIT(2)}
77 #define GPIO2_WL_STATE_8821C    \
78         {HALMAC_BT_PTA, HALMAC_GPIO2, HALMAC_GPIO_OUT, \
79          0x41, BIT(1), 0}
80 #define GPIO2_BT_STATE_8821C    \
81         {HALMAC_WL_PTA, HALMAC_GPIO2, HALMAC_GPIO_OUT, \
82          0x41, BIT(2), BIT(2)}
83 #define GPIO2_WLMAC_DBG_GPIO2_8821C     \
84         {HALMAC_WLMAC_DBG, HALMAC_GPIO2, HALMAC_GPIO_OUT, \
85          0x40, BIT(1) | BIT(0), BIT(0)}
86 #define GPIO2_WLPHY_DBG_GPIO2_8821C     \
87         {HALMAC_WLPHY_DBG, HALMAC_GPIO2, HALMAC_GPIO_IN_OUT, \
88          0x40, BIT(1) | BIT(0), BIT(1)}
89 #define GPIO2_BT_DBG_GPIO2_8821C        \
90         {HALMAC_BT_DBG, HALMAC_GPIO2, HALMAC_GPIO_OUT, \
91          0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
92 #define GPIO2_RFE_CTRL_5_8821C  \
93         {HALMAC_WLPHY_RFE_CTRL2GPIO, HALMAC_GPIO2, HALMAC_GPIO_IN_OUT, \
94          0x40, BIT(2), BIT(2)}
95 #define GPIO2_SW_IO_8821C       \
96         {HALMAC_SW_IO, HALMAC_GPIO2, HALMAC_GPIO_IN_OUT, \
97          0x40, BIT(1) | BIT(0), 0}
98
99 /* GPIO3 definition */
100 #define GPIO3_BT_GPIO3_8821C    \
101         {HALMAC_BT_GPIO, HALMAC_GPIO3, HALMAC_GPIO_IN_OUT, \
102          0x66, BIT(2), BIT(2)}
103 #define GPIO3_WL_PRI_8821C      \
104         {HALMAC_BT_PTA, HALMAC_GPIO3, HALMAC_GPIO_OUT, \
105          0x41, BIT(1), 0}
106 #define GPIO3_BT_PRI_8821C      \
107         {HALMAC_WL_PTA, HALMAC_GPIO3, HALMAC_GPIO_OUT, \
108          0x41, BIT(2), BIT(2)}
109 #define GPIO3_WLMAC_DBG_GPIO3_8821C     \
110         {HALMAC_WLMAC_DBG, HALMAC_GPIO3, HALMAC_GPIO_OUT, \
111          0x40, BIT(1) | BIT(0), BIT(0)}
112 #define GPIO3_WLPHY_DBG_GPIO3_8821C     \
113         {HALMAC_WLPHY_DBG, HALMAC_GPIO3, HALMAC_GPIO_IN_OUT, \
114          0x40, BIT(1) | BIT(0), BIT(1)}
115 #define GPIO3_BT_DBG_GPIO3_8821C        \
116         {HALMAC_BT_DBG, HALMAC_GPIO3, HALMAC_GPIO_OUT, \
117          0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
118 #define GPIO3_RFE_CTRL_4_8821C  \
119         {HALMAC_WLPHY_RFE_CTRL2GPIO, HALMAC_GPIO3, HALMAC_GPIO_IN_OUT, \
120          0x40, BIT(2), BIT(2)}
121 #define GPIO3_SW_IO_8821C       \
122         {HALMAC_SW_IO, HALMAC_GPIO3, HALMAC_GPIO_IN_OUT, \
123          0x40, BIT(1) | BIT(0), 0}
124
125 /* GPIO4 definition */
126 #define GPIO4_BT_SPI_D0_8821C   \
127         {HALMAC_BT_SFLASH, HALMAC_GPIO4, HALMAC_GPIO_IN_OUT, \
128          0x66, BIT(4), BIT(4)}
129 #define GPIO4_WL_SPI_D0_8821C   \
130         {HALMAC_WL_SFLASH, HALMAC_GPIO4, HALMAC_GPIO_IN_OUT, \
131          0x42, BIT(3), BIT(3)}
132 #define GPIO4_SDIO_INT_8821C    \
133         {HALMAC_SDIO_INT, HALMAC_GPIO4, HALMAC_GPIO_OUT, \
134          0x72, BIT(2), BIT(2)}
135 #define GPIO4_JTAG_TRST_8821C   \
136         {HALMAC_JTAG, HALMAC_GPIO4, HALMAC_GPIO_IN, \
137          0x67, BIT(0), BIT(0)}
138 #define GPIO4_DBG_GNT_WL_8821C  \
139         {HALMAC_DBG_GNT_WL_BT, HALMAC_GPIO4, HALMAC_GPIO_OUT, \
140          0x73, BIT(3), BIT(3)}
141 #define GPIO4_WLMAC_DBG_GPIO4_8821C     \
142         {HALMAC_WLMAC_DBG, HALMAC_GPIO4, HALMAC_GPIO_OUT, \
143          0x40, BIT(1) | BIT(0), BIT(0)}
144 #define GPIO4_WLPHY_DBG_GPIO4_8821C     \
145         {HALMAC_WLPHY_DBG, HALMAC_GPIO4, HALMAC_GPIO_IN_OUT, \
146          0x40, BIT(1) | BIT(0), BIT(1)}
147 #define GPIO4_BT_DBG_GPIO4_8821C        \
148         {HALMAC_BT_DBG, HALMAC_GPIO4, HALMAC_GPIO_OUT, \
149          0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
150 #define GPIO4_SW_IO_8821C       \
151         {HALMAC_SW_IO, HALMAC_GPIO4, HALMAC_GPIO_IN_OUT, \
152          0x40, BIT(1) | BIT(0), 0}
153
154 /* GPIO5 definition */
155 #define GPIO5_BT_SPI_D1_8821C   \
156         {HALMAC_BT_SFLASH, HALMAC_GPIO5, HALMAC_GPIO_IN_OUT, \
157          0x66, BIT(4), BIT(4)}
158 #define GPIO5_WL_SPI_D1_8821C   \
159         {HALMAC_WL_SFLASH, HALMAC_GPIO5, HALMAC_GPIO_IN_OUT, \
160          0x42, BIT(3), BIT(3)}
161 #define GPIO5_JTAG_TDI_8821C    \
162         {HALMAC_JTAG, HALMAC_GPIO5, HALMAC_GPIO_IN, \
163          0x67, BIT(0), BIT(0)}
164 #define GPIO5_DBG_GNT_BT_8821C  \
165         {HALMAC_DBG_GNT_WL_BT, HALMAC_GPIO5, HALMAC_GPIO_OUT, \
166          0x73, BIT(3), BIT(3)}
167 #define GPIO5_WLMAC_DBG_GPIO5_8821C     \
168         {HALMAC_WLMAC_DBG, HALMAC_GPIO5, HALMAC_GPIO_OUT, \
169          0x40, BIT(1) | BIT(0), BIT(0)}
170 #define GPIO5_WLPHY_DBG_GPIO5_8821C     \
171         {HALMAC_WLPHY_DBG, HALMAC_GPIO5, HALMAC_GPIO_IN_OUT, \
172          0x40, BIT(1) | BIT(0), BIT(1)}
173 #define GPIO5_BT_DBG_GPIO5_8821C        \
174         {HALMAC_BT_DBG, HALMAC_GPIO5, HALMAC_GPIO_OUT, \
175          0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
176 #define GPIO5_SW_IO_8821C       \
177         {HALMAC_SW_IO, HALMAC_GPIO5, HALMAC_GPIO_IN_OUT, \
178          0x40, BIT(1) | BIT(0), 0}
179
180 /* GPIO6 definition */
181 #define GPIO6_BT_SPI_D2_8821C   \
182         {HALMAC_BT_SFLASH, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
183          0x66, BIT(4), BIT(4)}
184 #define GPIO6_WL_SPI_D2_8821C   \
185         {HALMAC_WL_SFLASH, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
186          0x42, BIT(3), BIT(3)}
187 #define GPIO6_EEDO_8821C        \
188         {HALMAC_EEPROM, HALMAC_GPIO6, HALMAC_GPIO_IN, \
189          0x40, BIT(4), BIT(4)}
190 #define GPIO6_JTAG_TDO_8821C    \
191         {HALMAC_JTAG, HALMAC_GPIO6, HALMAC_GPIO_OUT, \
192          0x67, BIT(0), BIT(0)}
193 #define GPIO6_BT_3DD_SYNC_B_8821C       \
194         {HALMAC_BT_3DDLS_B, HALMAC_GPIO6, HALMAC_GPIO_IN, \
195          0x67, BIT(1), BIT(1)}
196 #define GPIO6_BT_GPIO18_8821C   \
197         {HALMAC_BT_GPIO, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
198          0x67, BIT(1), BIT(1)}
199 #define GPIO6_SIN_8821C \
200         {HALMAC_WL_UART, HALMAC_GPIO6, HALMAC_GPIO_IN, \
201          0x41, BIT(0), BIT(0)}
202 #define GPIO6_WLMAC_DBG_GPIO6_8821C     \
203         {HALMAC_WLMAC_DBG, HALMAC_GPIO6, HALMAC_GPIO_OUT, \
204          0x40, BIT(1) | BIT(0), BIT(0)}
205 #define GPIO6_WLPHY_DBG_GPIO6_8821C     \
206         {HALMAC_WLPHY_DBG, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
207          0x40, BIT(1) | BIT(0), BIT(1)}
208 #define GPIO6_BT_DBG_GPIO6_8821C        \
209         {HALMAC_BT_DBG, HALMAC_GPIO6, HALMAC_GPIO_OUT, \
210          0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
211 #define GPIO6_SW_IO_8821C       \
212         {HALMAC_SW_IO, HALMAC_GPIO6, HALMAC_GPIO_IN_OUT, \
213          0x40, BIT(1) | BIT(0), 0}
214
215 /* GPIO7 definition */
216 #define GPIO7_BT_SPI_D3_8821C   \
217         {HALMAC_BT_SFLASH, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
218          0x66, BIT(4), BIT(4)}
219 #define GPIO7_WL_SPI_D3_8821C   \
220         {HALMAC_WL_SFLASH, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
221          0x42, BIT(3), BIT(3)}
222 #define GPIO7_EEDI_8821C        \
223         {HALMAC_EEPROM, HALMAC_GPIO7, HALMAC_GPIO_OUT, \
224          0x40, BIT(4), BIT(4)}
225 #define GPIO7_JTAG_TMS_8821C    \
226         {HALMAC_JTAG, HALMAC_GPIO7, HALMAC_GPIO_IN, \
227          0x67, BIT(0), BIT(0)}
228 #define GPIO7_BT_GPIO16_8821C   \
229         {HALMAC_BT_GPIO, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
230          0x67, BIT(2), BIT(2)}
231 #define GPIO7_SOUT_8821C        \
232         {HALMAC_WL_UART, HALMAC_GPIO7, HALMAC_GPIO_OUT, \
233          0x41, BIT(0), BIT(0)}
234 #define GPIO7_WLMAC_DBG_GPIO7_8821C     \
235         {HALMAC_WLMAC_DBG, HALMAC_GPIO7, HALMAC_GPIO_OUT, \
236          0x40, BIT(1) | BIT(0), BIT(0)}
237 #define GPIO7_WLPHY_DBG_GPIO7_8821C     \
238         {HALMAC_WLPHY_DBG, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
239          0x40, BIT(1) | BIT(0), BIT(1)}
240 #define GPIO7_BT_DBG_GPIO7_8821C        \
241         {HALMAC_BT_DBG, HALMAC_GPIO7, HALMAC_GPIO_OUT, \
242          0x40, BIT(1) | BIT(0), BIT(0) | BIT(1)}
243 #define GPIO7_SW_IO_8821C       \
244         {HALMAC_SW_IO, HALMAC_GPIO7, HALMAC_GPIO_IN_OUT, \
245          0x40, BIT(1) | BIT(0), 0}
246
247 /* GPIO8 definition */
248 #define GPIO8_WL_EXT_WOL_8821C  \
249         {HALMAC_WL_HW_EXTWOL, HALMAC_GPIO8, HALMAC_GPIO_IN, \
250          0x4a, BIT(0) | BIT(1), BIT(0) | BIT(1)}
251 #define GPIO8_WL_LED_8821C      \
252         {HALMAC_WL_LED, HALMAC_GPIO8, HALMAC_GPIO_OUT, \
253          0x4e, BIT(5), BIT(5)}
254 #define GPIO8_SW_IO_8821C       \
255         {HALMAC_SW_IO, HALMAC_GPIO8, HALMAC_GPIO_IN_OUT, \
256          0x40, BIT(1) | BIT(0), 0}
257
258 /* GPIO9 definition */
259 #define GPIO9_DIS_WL_N_8821C    \
260         {HALMAC_WL_HWPDN, HALMAC_GPIO9, HALMAC_GPIO_IN, \
261          0x68, BIT(3) | BIT(0), BIT(3) | BIT(0)}
262 #define GPIO9_WL_EXT_WOL_8821C  \
263         {HALMAC_WL_HW_EXTWOL, HALMAC_GPIO9, HALMAC_GPIO_IN, \
264          0x4a, BIT(0) | BIT(1), BIT(0)}
265 #define GPIO9_USCTS0_8821C      \
266         {HALMAC_UART0, HALMAC_GPIO9, HALMAC_GPIO_IN, \
267          0x66, BIT(6), BIT(6)}
268 #define GPIO9_SW_IO_8821C       \
269         {HALMAC_SW_IO, HALMAC_GPIO9, HALMAC_GPIO_IN_OUT, \
270          0x40, BIT(1) | BIT(0), 0}
271
272 /* GPIO10 definition */
273 #define GPIO10_SW_IO_8821C      \
274         {HALMAC_SW_IO, HALMAC_GPIO10, HALMAC_GPIO_IN_OUT, \
275          0x40, BIT(1) | BIT(0), 0}
276
277 /* GPIO11 definition */
278 #define GPIO11_DIS_BT_N_8821C   \
279         {HALMAC_BT_HWPDN, HALMAC_GPIO11, HALMAC_GPIO_IN, \
280          0x6a, BIT(0), BIT(0)}
281 #define GPIO11_USOUT0_8821C     \
282         {HALMAC_UART0, HALMAC_GPIO11, HALMAC_GPIO_OUT, \
283          0x66, BIT(6), BIT(6)}
284 #define GPIO11_SW_IO_8821C      \
285         {HALMAC_SW_IO, HALMAC_GPIO11, HALMAC_GPIO_IN_OUT, \
286          0x40, BIT(1) | BIT(0), 0}
287
288 /* GPIO12 definition */
289 #define GPIO12_USIN0_8821C      \
290         {HALMAC_UART0, HALMAC_GPIO12, HALMAC_GPIO_IN, \
291          0x66, BIT(6), BIT(6)}
292 #define GPIO12_SW_IO_8821C      \
293         {HALMAC_SW_IO, HALMAC_GPIO12, HALMAC_GPIO_IN_OUT, \
294          0x40, BIT(1) | BIT(0), 0}
295
296 /* GPIO13 definition */
297 #define GPIO13_BT_WAKE_8821C    \
298         {HALMAC_GPIO13_14_WL_CTRL_EN, HALMAC_GPIO13, HALMAC_GPIO_IN, \
299          0x4e, BIT(6), BIT(6)}
300 #define GPIO13_SW_IO_8821C      \
301         {HALMAC_SW_IO, HALMAC_GPIO13, HALMAC_GPIO_IN_OUT, \
302          0x40, BIT(1) | BIT(0), 0}
303
304 /* GPIO14 definition */
305 #define GPIO14_UART_WAKE_8821C  \
306         {HALMAC_GPIO13_14_WL_CTRL_EN, HALMAC_GPIO14, HALMAC_GPIO_OUT, \
307          0x4e, BIT(6), BIT(6)}
308 #define GPIO14_SW_IO_8821C      \
309         {HALMAC_SW_IO, HALMAC_GPIO14, HALMAC_GPIO_IN_OUT, \
310          0x40, BIT(1) | BIT(0), 0}
311
312 /* GPIO15 definition */
313 #define GPIO15_EXT_XTAL_8821C   \
314         {HALMAC_EXT_XTAL, HALMAC_GPIO15, HALMAC_GPIO_OUT, \
315          0x66, BIT(7), BIT(7)}
316 #define GPIO15_SW_IO_8821C      \
317         {HALMAC_SW_IO, HALMAC_GPIO15, HALMAC_GPIO_IN_OUT, \
318          0x40, BIT(1) | BIT(0), 0}
319
320 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO0_8821C[] = {
321         GPIO0_BT_GPIO0_8821C,
322         GPIO0_BT_ACT_8821C,
323         GPIO0_WL_ACT_8821C,
324         GPIO0_WLMAC_DBG_GPIO0_8821C,
325         GPIO0_WLPHY_DBG_GPIO0_8821C,
326         GPIO0_BT_DBG_GPIO0_8821C,
327         GPIO0_SW_IO_8821C
328 };
329
330 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO1_8821C[] = {
331         GPIO1_BT_GPIO1_8821C,
332         GPIO1_BT_3DD_SYNC_A_8821C,
333         GPIO1_WL_CK_8821C,
334         GPIO1_BT_CK_8821C,
335         GPIO1_WLMAC_DBG_GPIO1_8821C,
336         GPIO1_WLPHY_DBG_GPIO1_8821C,
337         GPIO1_BT_DBG_GPIO1_8821C,
338         GPIO1_SW_IO_8821C
339 };
340
341 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO2_8821C[] = {
342         GPIO2_BT_GPIO2_8821C,
343         GPIO2_WL_STATE_8821C,
344         GPIO2_BT_STATE_8821C,
345         GPIO2_WLMAC_DBG_GPIO2_8821C,
346         GPIO2_WLPHY_DBG_GPIO2_8821C,
347         GPIO2_BT_DBG_GPIO2_8821C,
348         GPIO2_RFE_CTRL_5_8821C,
349         GPIO2_SW_IO_8821C
350 };
351
352 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO3_8821C[] = {
353         GPIO3_BT_GPIO3_8821C,
354         GPIO3_WL_PRI_8821C,
355         GPIO3_BT_PRI_8821C,
356         GPIO3_WLMAC_DBG_GPIO3_8821C,
357         GPIO3_WLPHY_DBG_GPIO3_8821C,
358         GPIO3_BT_DBG_GPIO3_8821C,
359         GPIO3_RFE_CTRL_4_8821C,
360         GPIO3_SW_IO_8821C
361 };
362
363 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO4_8821C[] = {
364         GPIO4_BT_SPI_D0_8821C,
365         GPIO4_WL_SPI_D0_8821C,
366         GPIO4_SDIO_INT_8821C,
367         GPIO4_JTAG_TRST_8821C,
368         GPIO4_DBG_GNT_WL_8821C,
369         GPIO4_WLMAC_DBG_GPIO4_8821C,
370         GPIO4_WLPHY_DBG_GPIO4_8821C,
371         GPIO4_BT_DBG_GPIO4_8821C,
372         GPIO4_SW_IO_8821C
373 };
374
375 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO5_8821C[] = {
376         GPIO5_BT_SPI_D1_8821C,
377         GPIO5_WL_SPI_D1_8821C,
378         GPIO5_JTAG_TDI_8821C,
379         GPIO5_DBG_GNT_BT_8821C,
380         GPIO5_WLMAC_DBG_GPIO5_8821C,
381         GPIO5_WLPHY_DBG_GPIO5_8821C,
382         GPIO5_BT_DBG_GPIO5_8821C,
383         GPIO5_SW_IO_8821C
384 };
385
386 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO6_8821C[] = {
387         GPIO6_BT_SPI_D2_8821C,
388         GPIO6_WL_SPI_D2_8821C,
389         GPIO6_EEDO_8821C,
390         GPIO6_JTAG_TDO_8821C,
391         GPIO6_BT_3DD_SYNC_B_8821C,
392         GPIO6_BT_GPIO18_8821C,
393         GPIO6_SIN_8821C,
394         GPIO6_WLMAC_DBG_GPIO6_8821C,
395         GPIO6_WLPHY_DBG_GPIO6_8821C,
396         GPIO6_BT_DBG_GPIO6_8821C,
397         GPIO6_SW_IO_8821C
398 };
399
400 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO7_8821C[] = {
401         GPIO7_BT_SPI_D3_8821C,
402         GPIO7_WL_SPI_D3_8821C,
403         GPIO7_EEDI_8821C,
404         GPIO7_JTAG_TMS_8821C,
405         GPIO7_BT_GPIO16_8821C,
406         GPIO7_SOUT_8821C,
407         GPIO7_WLMAC_DBG_GPIO7_8821C,
408         GPIO7_WLPHY_DBG_GPIO7_8821C,
409         GPIO7_BT_DBG_GPIO7_8821C,
410         GPIO7_SW_IO_8821C
411 };
412
413 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO8_8821C[] = {
414         GPIO8_WL_EXT_WOL_8821C,
415         GPIO8_WL_LED_8821C,
416         GPIO8_SW_IO_8821C
417 };
418
419 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO9_8821C[] = {
420         GPIO9_DIS_WL_N_8821C,
421         GPIO9_WL_EXT_WOL_8821C,
422         GPIO9_USCTS0_8821C,
423         GPIO9_SW_IO_8821C
424 };
425
426 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO10_8821C[] = {
427         GPIO10_SW_IO_8821C
428 };
429
430 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO11_8821C[] = {
431         GPIO11_DIS_BT_N_8821C,
432         GPIO11_USOUT0_8821C,
433         GPIO11_SW_IO_8821C
434 };
435
436 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO12_8821C[] = {
437         GPIO12_USIN0_8821C,
438         GPIO12_SW_IO_8821C
439 };
440
441 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO13_8821C[] = {
442         GPIO13_BT_WAKE_8821C,
443         GPIO13_SW_IO_8821C
444 };
445
446 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO14_8821C[] = {
447         GPIO14_UART_WAKE_8821C,
448         GPIO14_SW_IO_8821C
449 };
450
451 static const struct halmac_gpio_pimux_list PINMUX_LIST_GPIO15_8821C[] = {
452         GPIO15_EXT_XTAL_8821C,
453         GPIO15_SW_IO_8821C
454 };
455
456 static enum halmac_ret_status
457 get_pinmux_list_8821c(struct halmac_adapter *adapter,
458                       enum halmac_gpio_func gpio_func,
459                       const struct halmac_gpio_pimux_list **list,
460                       u32 *list_size, u32 *gpio_id);
461
462 static enum halmac_ret_status
463 chk_pinmux_valid_8821c(struct halmac_adapter *adapter,
464                        enum halmac_gpio_func gpio_func);
465
466 /**
467  * pinmux_get_func_8821c() -get current gpio status
468  * @adapter : the adapter of halmac
469  * @gpio_func : gpio function
470  * @enable : function is enable(1) or disable(0)
471  * Author : Ivan Lin
472  * Return : enum halmac_ret_status
473  * More details of status code can be found in prototype document
474  */
475 enum halmac_ret_status
476 pinmux_get_func_8821c(struct halmac_adapter *adapter,
477                       enum halmac_gpio_func gpio_func, u8 *enable)
478 {
479         u32 list_size;
480         u32 cur_func;
481         u32 gpio_id;
482         enum halmac_ret_status status;
483         const struct halmac_gpio_pimux_list *list = NULL;
484
485         PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__);
486
487         status = get_pinmux_list_8821c(adapter, gpio_func, &list, &list_size,
488                                        &gpio_id);
489         if (status != HALMAC_RET_SUCCESS)
490                 return status;
491
492         status = pinmux_parser_88xx(adapter, list, list_size, gpio_id,
493                                     &cur_func);
494         if (status != HALMAC_RET_SUCCESS)
495                 return status;
496
497         switch (gpio_func) {
498         case HALMAC_GPIO_FUNC_WL_LED:
499                 *enable = (cur_func == HALMAC_WL_LED) ? 1 : 0;
500                 break;
501         case HALMAC_GPIO_FUNC_SDIO_INT:
502                 *enable = (cur_func == HALMAC_SDIO_INT) ? 1 : 0;
503                 break;
504         case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
505         case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
506                 *enable = (cur_func == HALMAC_GPIO13_14_WL_CTRL_EN) ? 1 : 0;
507                 break;
508         case HALMAC_GPIO_FUNC_SW_IO_0:
509         case HALMAC_GPIO_FUNC_SW_IO_1:
510         case HALMAC_GPIO_FUNC_SW_IO_2:
511         case HALMAC_GPIO_FUNC_SW_IO_3:
512         case HALMAC_GPIO_FUNC_SW_IO_4:
513         case HALMAC_GPIO_FUNC_SW_IO_5:
514         case HALMAC_GPIO_FUNC_SW_IO_6:
515         case HALMAC_GPIO_FUNC_SW_IO_7:
516         case HALMAC_GPIO_FUNC_SW_IO_8:
517         case HALMAC_GPIO_FUNC_SW_IO_9:
518         case HALMAC_GPIO_FUNC_SW_IO_10:
519         case HALMAC_GPIO_FUNC_SW_IO_11:
520         case HALMAC_GPIO_FUNC_SW_IO_12:
521         case HALMAC_GPIO_FUNC_SW_IO_13:
522         case HALMAC_GPIO_FUNC_SW_IO_14:
523         case HALMAC_GPIO_FUNC_SW_IO_15:
524                 *enable = (cur_func == HALMAC_SW_IO) ? 1 : 0;
525                 break;
526         default:
527                 *enable = 0;
528                 return HALMAC_RET_GET_PINMUX_ERR;
529         }
530
531         PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__);
532
533         return HALMAC_RET_SUCCESS;
534 }
535
536 /**
537  * pinmux_set_func_8821c() -set gpio function
538  * @adapter : the adapter of halmac
539  * @gpio_func : gpio function
540  * Author : Ivan Lin
541  * Return : enum halmac_ret_status
542  * More details of status code can be found in prototype document
543  */
544 enum halmac_ret_status
545 pinmux_set_func_8821c(struct halmac_adapter *adapter,
546                       enum halmac_gpio_func gpio_func)
547 {
548         u32 list_size;
549         u32 gpio_id;
550         enum halmac_ret_status status;
551         const struct halmac_gpio_pimux_list *list = NULL;
552
553         PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__);
554         PLTFM_MSG_TRACE("[TRACE]func name : %d\n", gpio_func);
555
556         status = chk_pinmux_valid_8821c(adapter, gpio_func);
557         if (status != HALMAC_RET_SUCCESS)
558                 return status;
559
560         status = get_pinmux_list_8821c(adapter, gpio_func, &list, &list_size,
561                                        &gpio_id);
562         if (status != HALMAC_RET_SUCCESS)
563                 return status;
564
565         status = pinmux_switch_88xx(adapter, list, list_size, gpio_id,
566                                     gpio_func);
567         if (status != HALMAC_RET_SUCCESS)
568                 return status;
569
570         status = pinmux_record_88xx(adapter, gpio_func, 1);
571         if (status != HALMAC_RET_SUCCESS)
572                 return status;
573
574         PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__);
575
576         return HALMAC_RET_SUCCESS;
577 }
578
579 /**
580  * pinmux_free_func_8821c() -free locked gpio function
581  * @adapter : the adapter of halmac
582  * @gpio_func : gpio function
583  * Author : Ivan Lin
584  * Return : enum halmac_ret_status
585  * More details of status code can be found in prototype document
586  */
587 enum halmac_ret_status
588 pinmux_free_func_8821c(struct halmac_adapter *adapter,
589                        enum halmac_gpio_func gpio_func)
590 {
591         struct halmac_pinmux_info *info = &adapter->pinmux_info;
592
593         PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__);
594
595         switch (gpio_func) {
596         case HALMAC_GPIO_FUNC_SW_IO_0:
597                 info->sw_io_0 = 0;
598                 break;
599         case HALMAC_GPIO_FUNC_SW_IO_1:
600                 info->sw_io_1 = 0;
601                 break;
602         case HALMAC_GPIO_FUNC_SW_IO_2:
603                 info->sw_io_2 = 0;
604                 break;
605         case HALMAC_GPIO_FUNC_SW_IO_3:
606                 info->sw_io_3 = 0;
607                 break;
608         case HALMAC_GPIO_FUNC_SW_IO_4:
609         case HALMAC_GPIO_FUNC_SDIO_INT:
610                 info->sw_io_4 = 0;
611                 info->sdio_int = 0;
612                 break;
613         case HALMAC_GPIO_FUNC_SW_IO_5:
614                 info->sw_io_5 = 0;
615                 break;
616         case HALMAC_GPIO_FUNC_SW_IO_6:
617                 info->sw_io_6 = 0;
618                 break;
619         case HALMAC_GPIO_FUNC_SW_IO_7:
620                 info->sw_io_7 = 0;
621                 break;
622         case HALMAC_GPIO_FUNC_SW_IO_8:
623         case HALMAC_GPIO_FUNC_WL_LED:
624                 info->sw_io_8 = 0;
625                 info->wl_led = 0;
626                 break;
627         case HALMAC_GPIO_FUNC_SW_IO_9:
628                 info->sw_io_9 = 0;
629                 break;
630         case HALMAC_GPIO_FUNC_SW_IO_10:
631                 info->sw_io_10 = 0;
632                 break;
633         case HALMAC_GPIO_FUNC_SW_IO_11:
634                 info->sw_io_11 = 0;
635                 break;
636         case HALMAC_GPIO_FUNC_SW_IO_12:
637                 info->sw_io_12 = 0;
638                 break;
639         case HALMAC_GPIO_FUNC_SW_IO_13:
640         case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
641                 info->bt_dev_wake = 0;
642                 info->sw_io_13 = 0;
643                 break;
644         case HALMAC_GPIO_FUNC_SW_IO_14:
645         case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
646                 info->bt_host_wake = 0;
647                 info->sw_io_14 = 0;
648                 break;
649         case HALMAC_GPIO_FUNC_SW_IO_15:
650                 info->sw_io_15 = 0;
651                 break;
652         default:
653                 return HALMAC_RET_SWITCH_CASE_ERROR;
654         }
655
656         PLTFM_MSG_TRACE("[TRACE]func : %X\n", gpio_func);
657         PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__);
658
659         return HALMAC_RET_SUCCESS;
660 }
661
662 static enum halmac_ret_status
663 get_pinmux_list_8821c(struct halmac_adapter *adapter,
664                       enum halmac_gpio_func gpio_func,
665                       const struct halmac_gpio_pimux_list **list,
666                       u32 *list_size, u32 *gpio_id)
667 {
668         switch (gpio_func) {
669         case HALMAC_GPIO_FUNC_SW_IO_0:
670                 *list = PINMUX_LIST_GPIO0_8821C;
671                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO0_8821C);
672                 *gpio_id = HALMAC_GPIO0;
673                 break;
674         case HALMAC_GPIO_FUNC_SW_IO_1:
675                 *list = PINMUX_LIST_GPIO1_8821C;
676                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO1_8821C);
677                 *gpio_id = HALMAC_GPIO1;
678                 break;
679         case HALMAC_GPIO_FUNC_SW_IO_2:
680                 *list = PINMUX_LIST_GPIO2_8821C;
681                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO2_8821C);
682                 *gpio_id = HALMAC_GPIO2;
683                 break;
684         case HALMAC_GPIO_FUNC_SW_IO_3:
685                 *list = PINMUX_LIST_GPIO3_8821C;
686                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO3_8821C);
687                 *gpio_id = HALMAC_GPIO3;
688                 break;
689         case HALMAC_GPIO_FUNC_SW_IO_4:
690         case HALMAC_GPIO_FUNC_SDIO_INT:
691                 *list = PINMUX_LIST_GPIO4_8821C;
692                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO4_8821C);
693                 *gpio_id = HALMAC_GPIO4;
694                 break;
695         case HALMAC_GPIO_FUNC_SW_IO_5:
696                 *list = PINMUX_LIST_GPIO5_8821C;
697                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO5_8821C);
698                 *gpio_id = HALMAC_GPIO5;
699                 break;
700         case HALMAC_GPIO_FUNC_SW_IO_6:
701                 *list = PINMUX_LIST_GPIO6_8821C;
702                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO6_8821C);
703                 *gpio_id = HALMAC_GPIO6;
704                 break;
705         case HALMAC_GPIO_FUNC_SW_IO_7:
706                 *list = PINMUX_LIST_GPIO7_8821C;
707                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO7_8821C);
708                 *gpio_id = HALMAC_GPIO7;
709                 break;
710         case HALMAC_GPIO_FUNC_SW_IO_8:
711         case HALMAC_GPIO_FUNC_WL_LED:
712                 *list = PINMUX_LIST_GPIO8_8821C;
713                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO8_8821C);
714                 *gpio_id = HALMAC_GPIO8;
715                 break;
716         case HALMAC_GPIO_FUNC_SW_IO_9:
717                 *list = PINMUX_LIST_GPIO9_8821C;
718                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO9_8821C);
719                 *gpio_id = HALMAC_GPIO9;
720                 break;
721         case HALMAC_GPIO_FUNC_SW_IO_10:
722                 *list = PINMUX_LIST_GPIO10_8821C;
723                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO10_8821C);
724                 *gpio_id = HALMAC_GPIO10;
725                 break;
726         case HALMAC_GPIO_FUNC_SW_IO_11:
727                 *list = PINMUX_LIST_GPIO11_8821C;
728                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO11_8821C);
729                 *gpio_id = HALMAC_GPIO11;
730                 break;
731         case HALMAC_GPIO_FUNC_SW_IO_12:
732                 *list = PINMUX_LIST_GPIO12_8821C;
733                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO12_8821C);
734                 *gpio_id = HALMAC_GPIO12;
735                 break;
736         case HALMAC_GPIO_FUNC_SW_IO_13:
737         case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
738                 *list = PINMUX_LIST_GPIO13_8821C;
739                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO13_8821C);
740                 *gpio_id = HALMAC_GPIO13;
741                 break;
742         case HALMAC_GPIO_FUNC_SW_IO_14:
743         case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
744                 *list = PINMUX_LIST_GPIO14_8821C;
745                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO14_8821C);
746                 *gpio_id = HALMAC_GPIO14;
747                 break;
748         case HALMAC_GPIO_FUNC_SW_IO_15:
749                 *list = PINMUX_LIST_GPIO15_8821C;
750                 *list_size = ARRAY_SIZE(PINMUX_LIST_GPIO15_8821C);
751                 *gpio_id = HALMAC_GPIO15;
752                 break;
753         default:
754                 return HALMAC_RET_SWITCH_CASE_ERROR;
755         }
756
757         return HALMAC_RET_SUCCESS;
758 }
759
760 static enum halmac_ret_status
761 chk_pinmux_valid_8821c(struct halmac_adapter *adapter,
762                        enum halmac_gpio_func gpio_func)
763 {
764         struct halmac_pinmux_info *info = &adapter->pinmux_info;
765         enum halmac_ret_status status = HALMAC_RET_SUCCESS;
766
767         switch (gpio_func) {
768         case HALMAC_GPIO_FUNC_SW_IO_0:
769                 if (info->sw_io_0 == 1)
770                         status = HALMAC_RET_PINMUX_USED;
771                 break;
772         case HALMAC_GPIO_FUNC_SW_IO_1:
773                 if (info->sw_io_1 == 1)
774                         status = HALMAC_RET_PINMUX_USED;
775                 break;
776         case HALMAC_GPIO_FUNC_SW_IO_2:
777                 if (info->sw_io_2 == 1)
778                         status = HALMAC_RET_PINMUX_USED;
779                 break;
780         case HALMAC_GPIO_FUNC_SW_IO_3:
781                 if (info->sw_io_3 == 1)
782                         status = HALMAC_RET_PINMUX_USED;
783                 break;
784         case HALMAC_GPIO_FUNC_SW_IO_4:
785         case HALMAC_GPIO_FUNC_SDIO_INT:
786                 if (info->sw_io_4 == 1 || info->sdio_int == 1)
787                         status = HALMAC_RET_PINMUX_USED;
788                 break;
789         case HALMAC_GPIO_FUNC_SW_IO_5:
790                 if (info->sw_io_5 == 1)
791                         status = HALMAC_RET_PINMUX_USED;
792                 break;
793         case HALMAC_GPIO_FUNC_SW_IO_6:
794                 if (info->sw_io_6 == 1)
795                         status = HALMAC_RET_PINMUX_USED;
796                 break;
797         case HALMAC_GPIO_FUNC_SW_IO_7:
798                 if (info->sw_io_7 == 1)
799                         status = HALMAC_RET_PINMUX_USED;
800                 break;
801         case HALMAC_GPIO_FUNC_SW_IO_8:
802         case HALMAC_GPIO_FUNC_WL_LED:
803                 if (info->sw_io_8 == 1 || info->wl_led == 1)
804                         status = HALMAC_RET_PINMUX_USED;
805                 break;
806         case HALMAC_GPIO_FUNC_SW_IO_9:
807                 if (info->sw_io_9 == 1)
808                         status = HALMAC_RET_PINMUX_USED;
809                 break;
810         case HALMAC_GPIO_FUNC_SW_IO_10:
811                 if (info->sw_io_10 == 1)
812                         status = HALMAC_RET_PINMUX_USED;
813                 break;
814         case HALMAC_GPIO_FUNC_SW_IO_11:
815                 if (info->sw_io_11 == 1)
816                         status = HALMAC_RET_PINMUX_USED;
817                 break;
818         case HALMAC_GPIO_FUNC_SW_IO_12:
819                 if (info->sw_io_12 == 1)
820                         status = HALMAC_RET_PINMUX_USED;
821                 break;
822         case HALMAC_GPIO_FUNC_SW_IO_13:
823         case HALMAC_GPIO_FUNC_BT_DEV_WAKE1:
824                 if (info->sw_io_13 == 1 || info->bt_dev_wake == 1)
825                         status = HALMAC_RET_PINMUX_USED;
826                 break;
827         case HALMAC_GPIO_FUNC_SW_IO_14:
828         case HALMAC_GPIO_FUNC_BT_HOST_WAKE1:
829                 if (info->sw_io_14 == 1 || info->bt_host_wake == 1)
830                         status = HALMAC_RET_PINMUX_USED;
831                 break;
832         case HALMAC_GPIO_FUNC_SW_IO_15:
833                 if (info->sw_io_15 == 1)
834                         status = HALMAC_RET_PINMUX_USED;
835                 break;
836         default:
837                 return HALMAC_RET_SWITCH_CASE_ERROR;
838         }
839
840         PLTFM_MSG_TRACE("[TRACE]chk_pinmux_valid func : %X status : %X\n",
841                         gpio_func, status);
842
843         return status;
844 }
845 #endif /* HALMAC_8821C_SUPPORT */