]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - drivers/staging/rtl8723au/hal/HalHWImg8723A_RF.c
pinctrl: sirf: move sgpio lock into state container
[mirror_ubuntu-zesty-kernel.git] / drivers / staging / rtl8723au / hal / HalHWImg8723A_RF.c
1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2011 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 "odm_precomp.h"
17
18 static bool CheckCondition(const u32 Condition, const u32 Hex)
19 {
20 u32 _board = (Hex & 0x000000FF);
21 u32 _interface = (Hex & 0x0000FF00) >> 8;
22 u32 _platform = (Hex & 0x00FF0000) >> 16;
23 u32 cond = Condition;
24
25 if (Condition == 0xCDCDCDCD)
26 return true;
27
28 cond = Condition & 0x000000FF;
29 if ((_board == cond) && cond != 0x00)
30 return false;
31
32 cond = Condition & 0x0000FF00;
33 cond = cond >> 8;
34 if ((_interface & cond) == 0 && cond != 0x07)
35 return false;
36
37 cond = Condition & 0x00FF0000;
38 cond = cond >> 16;
39 if ((_platform & cond) == 0 && cond != 0x0F)
40 return false;
41 return true;
42 }
43
44 /******************************************************************************
45 * RadioA_1T.TXT
46 ******************************************************************************/
47
48 static u32 Array_RadioA_1T_8723A[] = {
49 0x000, 0x00030159,
50 0x001, 0x00031284,
51 0x002, 0x00098000,
52 0xFF0F011F, 0xABCD,
53 0x003, 0x00018C63,
54 0xCDCDCDCD, 0xCDCD,
55 0x003, 0x00039C63,
56 0xFF0F011F, 0xDEAD,
57 0x004, 0x000210E7,
58 0x009, 0x0002044F,
59 0x00A, 0x0001A3F1,
60 0x00B, 0x00014787,
61 0x00C, 0x000896FE,
62 0x00D, 0x0000E02C,
63 0x00E, 0x00039CE7,
64 0x00F, 0x00000451,
65 0x019, 0x00000000,
66 0x01A, 0x00030355,
67 0x01B, 0x00060A00,
68 0x01C, 0x000FC378,
69 0x01D, 0x000A1250,
70 0x01E, 0x0000024F,
71 0x01F, 0x00000000,
72 0x020, 0x0000B614,
73 0x021, 0x0006C000,
74 0x022, 0x00000000,
75 0x023, 0x00001558,
76 0x024, 0x00000060,
77 0x025, 0x00000483,
78 0x026, 0x0004F000,
79 0x027, 0x000EC7D9,
80 0x028, 0x00057730,
81 0x029, 0x00004783,
82 0x02A, 0x00000001,
83 0x02B, 0x00021334,
84 0x02A, 0x00000000,
85 0x02B, 0x00000054,
86 0x02A, 0x00000001,
87 0x02B, 0x00000808,
88 0x02B, 0x00053333,
89 0x02C, 0x0000000C,
90 0x02A, 0x00000002,
91 0x02B, 0x00000808,
92 0x02B, 0x0005B333,
93 0x02C, 0x0000000D,
94 0x02A, 0x00000003,
95 0x02B, 0x00000808,
96 0x02B, 0x00063333,
97 0x02C, 0x0000000D,
98 0x02A, 0x00000004,
99 0x02B, 0x00000808,
100 0x02B, 0x0006B333,
101 0x02C, 0x0000000D,
102 0x02A, 0x00000005,
103 0x02B, 0x00000808,
104 0x02B, 0x00073333,
105 0x02C, 0x0000000D,
106 0x02A, 0x00000006,
107 0x02B, 0x00000709,
108 0x02B, 0x0005B333,
109 0x02C, 0x0000000D,
110 0x02A, 0x00000007,
111 0x02B, 0x00000709,
112 0x02B, 0x00063333,
113 0x02C, 0x0000000D,
114 0x02A, 0x00000008,
115 0x02B, 0x0000060A,
116 0x02B, 0x0004B333,
117 0x02C, 0x0000000D,
118 0x02A, 0x00000009,
119 0x02B, 0x0000060A,
120 0x02B, 0x00053333,
121 0x02C, 0x0000000D,
122 0x02A, 0x0000000A,
123 0x02B, 0x0000060A,
124 0x02B, 0x0005B333,
125 0x02C, 0x0000000D,
126 0x02A, 0x0000000B,
127 0x02B, 0x0000060A,
128 0x02B, 0x00063333,
129 0x02C, 0x0000000D,
130 0x02A, 0x0000000C,
131 0x02B, 0x0000060A,
132 0x02B, 0x0006B333,
133 0x02C, 0x0000000D,
134 0x02A, 0x0000000D,
135 0x02B, 0x0000060A,
136 0x02B, 0x00073333,
137 0x02C, 0x0000000D,
138 0x02A, 0x0000000E,
139 0x02B, 0x0000050B,
140 0x02B, 0x00066666,
141 0x02C, 0x0000001A,
142 0x02A, 0x000E0000,
143 0x010, 0x0004000F,
144 0x011, 0x000E31FC,
145 0x010, 0x0006000F,
146 0x011, 0x000FF9F8,
147 0x010, 0x0002000F,
148 0x011, 0x000203F9,
149 0x010, 0x0003000F,
150 0x011, 0x000FF500,
151 0x010, 0x00000000,
152 0x011, 0x00000000,
153 0x010, 0x0008000F,
154 0x011, 0x0003F100,
155 0x010, 0x0009000F,
156 0x011, 0x00023100,
157 0x012, 0x00032000,
158 0x012, 0x00071000,
159 0x012, 0x000B0000,
160 0x012, 0x000FC000,
161 0x013, 0x000287B3,
162 0x013, 0x000244B7,
163 0x013, 0x000204AB,
164 0x013, 0x0001C49F,
165 0x013, 0x00018493,
166 0x013, 0x0001429B,
167 0x013, 0x00010299,
168 0x013, 0x0000C29C,
169 0x013, 0x000081A0,
170 0x013, 0x000040AC,
171 0x013, 0x00000020,
172 0x014, 0x0001944C,
173 0x014, 0x00059444,
174 0x014, 0x0009944C,
175 0x014, 0x000D9444,
176 0xFF0F011F, 0xABCD,
177 0x015, 0x0000F424,
178 0x015, 0x0004F424,
179 0x015, 0x0008F424,
180 0x015, 0x000CF424,
181 0xCDCDCDCD, 0xCDCD,
182 0x015, 0x0000F474,
183 0x015, 0x0004F477,
184 0x015, 0x0008F455,
185 0x015, 0x000CF455,
186 0xFF0F011F, 0xDEAD,
187 0x016, 0x00000339,
188 0x016, 0x00040339,
189 0x016, 0x00080339,
190 0xFF0F011F, 0xABCD,
191 0x016, 0x000C0356,
192 0xCDCDCDCD, 0xCDCD,
193 0x016, 0x000C0366,
194 0xFF0F011F, 0xDEAD,
195 0x000, 0x00010159,
196 0x018, 0x0000F401,
197 0x0FE, 0x00000000,
198 0x0FE, 0x00000000,
199 0x01F, 0x00000003,
200 0x0FE, 0x00000000,
201 0x0FE, 0x00000000,
202 0x01E, 0x00000247,
203 0x01F, 0x00000000,
204 0x000, 0x00030159,
205 };
206
207 void ODM_ReadAndConfig_RadioA_1T_8723A(struct dm_odm_t *pDM_Odm)
208 {
209 #define READ_NEXT_PAIR(v1, v2, i) \
210 do { \
211 i += 2; v1 = Array[i]; v2 = Array[i+1];\
212 } while (0)
213
214 u32 hex = 0;
215 u32 i = 0;
216 u8 platform = 0x04;
217 u8 interfaceValue = pDM_Odm->SupportInterface;
218 u8 board = pDM_Odm->BoardType;
219 u32 ArrayLen = sizeof(Array_RadioA_1T_8723A)/sizeof(u32);
220 u32 *Array = Array_RadioA_1T_8723A;
221
222 hex += board;
223 hex += interfaceValue << 8;
224 hex += platform << 16;
225 hex += 0xFF000000;
226
227 for (i = 0; i < ArrayLen; i += 2) {
228 u32 v1 = Array[i];
229 u32 v2 = Array[i+1];
230
231 /* This (offset, data) pair meets the condition. */
232 if (v1 < 0xCDCDCDCD) {
233 odm_ConfigRFReg_8723A(pDM_Odm, v1, v2, RF_PATH_A, v1);
234 continue;
235 } else {
236 if (!CheckCondition(Array[i], hex)) {
237 /* Discard the following (offset, data) pairs. */
238 READ_NEXT_PAIR(v1, v2, i);
239 while (v2 != 0xDEAD &&
240 v2 != 0xCDEF &&
241 v2 != 0xCDCD && i < ArrayLen - 2)
242 READ_NEXT_PAIR(v1, v2, i);
243 i -= 2; /* prevent from for-loop += 2 */
244 } else {
245 /* Configure matched pairs and skip to end of if-else. */
246 READ_NEXT_PAIR(v1, v2, i);
247 while (v2 != 0xDEAD &&
248 v2 != 0xCDEF &&
249 v2 != 0xCDCD && i < ArrayLen - 2) {
250 odm_ConfigRFReg_8723A(pDM_Odm, v1, v2,
251 RF_PATH_A, v1);
252 READ_NEXT_PAIR(v1, v2, i);
253 }
254
255 while (v2 != 0xDEAD && i < ArrayLen - 2)
256 READ_NEXT_PAIR(v1, v2, i);
257 }
258 }
259 }
260 }