kernel: add missing config symbols for 5.15
[openwrt/openwrt.git] / target / linux / mediatek / files-5.10 / drivers / net / phy / rtk / rtl8367c / rtl8367c_asicdrv_i2c.c
1 /*
2 * Copyright (C) 2013 Realtek Semiconductor Corp.
3 * All Rights Reserved.
4 *
5 * Unless you and Realtek execute a separate written software license
6 * agreement governing use of this software, this software is licensed
7 * to you under the terms of the GNU General Public License version 2,
8 * available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
9 *
10 * $Revision: 38651 $
11 * $Date: 2016-02-27 14:32:56 +0800 (周三, 17 ε››ζœˆ 2016) $
12 *
13 * Purpose : RTL8367C switch high-level API for RTL8367C
14 * Feature : I2C related functions
15 *
16 */
17
18
19 #include <rtl8367c_asicdrv_i2c.h>
20 #include <rtk_error.h>
21 #include <rtk_types.h>
22
23
24
25 /* Function Name:
26 * rtl8367c_setAsicI2C_checkBusIdle
27 * Description:
28 * Check i2c bus status idle or not
29 * Input:
30 * None
31 * Output:
32 * None
33 * Return:
34 * RT_ERR_OK - Success
35 * RT_ERR_BUSYWAIT_TIMEOUT - i2c bus is busy
36 * Note:
37 * This API can check i2c bus status.
38 */
39 ret_t rtl8367c_setAsicI2C_checkBusIdle(void)
40 {
41 rtk_uint32 regData;
42 ret_t retVal;
43
44 if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_M_I2C_BUS_IDLE_OFFSET, &regData)) != RT_ERR_OK)
45 return retVal;
46
47 if(regData == 0x0001)
48 return RT_ERR_OK; /*i2c is idle*/
49 else
50 return RT_ERR_BUSYWAIT_TIMEOUT; /*i2c is busy*/
51 }
52
53
54 /* Function Name:
55 * rtl8367c_setAsicI2CStartCmd
56 * Description:
57 * Set I2C start command
58 * Input:
59 * None
60 * Output:
61 * None
62 * Return:
63 * RT_ERR_OK - Success
64 * Note:
65 * This API can set i2c start command ,start a i2c traffic .
66 */
67 ret_t rtl8367c_setAsicI2CStartCmd(void)
68 {
69 rtk_uint32 regData;
70 ret_t retVal;
71
72 /* Bits [4-1] = 0b0000, Start Command; Bit [0] = 1, Trigger the Command */
73 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
74 return retVal;
75 regData &= 0xFFE0;
76 regData |= 0x0001;
77
78 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
79 return retVal;
80
81 /* wait for command finished */
82 do{
83 if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
84 return retVal;
85 }while( regData != 0x0);
86
87 return RT_ERR_OK ;
88 }
89
90 /* Function Name:
91 * rtl8367c_setAsicI2CStopCmd
92 * Description:
93 * Set I2C stop command
94 * Input:
95 * None
96 * Output:
97 * None
98 * Return:
99 * RT_ERR_OK - Success
100 * Note:
101 * This API can set i2c stop command ,stop a i2c traffic.
102 */
103 ret_t rtl8367c_setAsicI2CStopCmd(void)
104 {
105
106 rtk_uint32 regData;
107 ret_t retVal;
108
109 /* Bits [4-1] = 0b0001, Stop Command; Bit [0] = 1, Trigger the Command */
110 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
111 return retVal;
112 regData &= 0xFFE0;
113 regData |= 0x0003;
114
115 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
116 return retVal;
117
118
119 /* wait for command finished */
120 do{
121 if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
122 return retVal;
123 }while( regData != 0x0);
124
125 return RT_ERR_OK ;
126 }
127
128 /* Function Name:
129 * rtl8367c_setAsicI2CTxOneCharCmd
130 * Description:
131 * Set I2C Tx a char command, with a 8-bit data
132 * Input:
133 * oneChar - 8-bit data
134 * Output:
135 * None
136 * Return:
137 * RT_ERR_OK - Success
138 * Note:
139 * This API can set i2c Tx command and with a 8-bit data.
140 */
141 ret_t rtl8367c_setAsicI2CTxOneCharCmd(rtk_uint8 oneChar)
142 {
143 rtk_uint32 regData;
144 ret_t retVal;
145
146 /* Bits [4-1] = 0b0010, tx one char; Bit [0] = 1, Trigger the Command */
147 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
148 return retVal;
149
150 regData &= 0xFFE0;
151 regData |= 0x0005;
152 regData &= 0x00FF;
153 regData |= (rtk_uint16) (oneChar << 8);
154
155 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
156 return retVal;
157
158
159 /* wait for command finished */
160 do{
161 if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
162 return retVal;
163 }while( regData != 0x0);
164
165 return RT_ERR_OK ;
166 }
167
168
169 /* Function Name:
170 * rtl8367c_setAsicI2CcheckRxAck
171 * Description:
172 * Check if rx an Ack
173 * Input:
174 * None
175 * Output:
176 * None
177 * Return:
178 * RT_ERR_OK - Success
179 * Note:
180 * This API can check if rx an ack from i2c slave.
181 */
182 ret_t rtl8367c_setAsicI2CcheckRxAck(void)
183 {
184 rtk_uint32 regData;
185 ret_t retVal;
186 rtk_uint32 count = 0;
187
188 do{
189 count++;
190 if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_SLV_ACK_FLAG_OFFSET, &regData)) != RT_ERR_OK)
191 return retVal;
192 }while( (regData != 0x1) && (count < TIMEROUT_FOR_MICROSEMI) );
193
194 if(regData != 0x1)
195 return RT_ERR_FAILED;
196 else
197 return RT_ERR_OK;
198 }
199
200
201 /* Function Name:
202 * rtl8367c_setAsicI2CRxOneCharCmd
203 * Description:
204 * Set I2C Rx command and get 8-bit data
205 * Input:
206 * None
207 * Output:
208 * pValue - 8bit-data
209 * Return:
210 * RT_ERR_OK - Success
211 * Note:
212 * This API can set I2C Rx command and get 8-bit data.
213 */
214 ret_t rtl8367c_setAsicI2CRxOneCharCmd(rtk_uint8 *pValue)
215 {
216 rtk_uint32 regData;
217 ret_t retVal;
218
219 /* Bits [4-1] = 0b0011, Rx one char; Bit [0] = 1, Trigger the Command */
220 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
221 return retVal;
222 regData &= 0xFFE0;
223 regData |= 0x0007;
224 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
225 return retVal;
226
227 /* wait for command finished */
228 do{
229 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
230 return retVal;
231 }while( (regData & 0x1) != 0x0);
232
233 *pValue = (rtk_uint8)(regData >> 8);
234 return RT_ERR_OK ;
235
236 }
237
238 /* Function Name:
239 * rtl8367c_setAsicI2CTxAckCmd
240 * Description:
241 * Set I2C Tx ACK command
242 * Input:
243 * None
244 * Output:
245 * None
246 * Return:
247 * RT_ERR_OK - Success
248 * Note:
249 * This API can set I2C Tx ack command.
250 */
251 ret_t rtl8367c_setAsicI2CTxAckCmd(void)
252 {
253 rtk_uint32 regData;
254 ret_t retVal;
255
256 /* Bits [4-1] = 0b0100, tx ACK Command; Bit [0] = 1, Trigger the Command */
257 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
258 return retVal;
259 regData &= 0xFFE0;
260 regData |= 0x0009;
261 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
262 return retVal;
263
264 /* wait for command finished */
265 do{
266 if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
267 return retVal;
268 }while( regData != 0x0);
269
270 return RT_ERR_OK ;
271
272 }
273
274
275 /* Function Name:
276 * rtl8367c_setAsicI2CTxNoAckCmd
277 * Description:
278 * Set I2C master Tx noACK command
279 * Input:
280 * None
281 * Output:
282 * None
283 * Return:
284 * RT_ERR_OK - Success
285 * Note:
286 * This API can set I2C master Tx noACK command.
287 */
288 ret_t rtl8367c_setAsicI2CTxNoAckCmd(void)
289 {
290 rtk_uint32 regData;
291 ret_t retVal;
292
293 /* Bits [4-1] = 0b0101, tx noACK Command; Bit [0] = 1, Trigger the Command */
294 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
295 return retVal;
296 regData &= 0xFFE0;
297 regData |= 0x000b;
298 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
299 return retVal;
300
301 /* wait for command finished */
302 do{
303 if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
304 return retVal;
305 }while( regData != 0x0);
306
307 return RT_ERR_OK ;
308
309 }
310
311 /* Function Name:
312 * rtl8367c_setAsicI2CSoftRSTseqCmd
313 * Description:
314 * set I2C master tx soft reset command
315 * Input:
316 * None
317 * Output:
318 * None
319 * Return:
320 * RT_ERR_OK - Success
321 * Note:
322 * This API can set I2C master tx soft reset command.
323 */
324 ret_t rtl8367c_setAsicI2CSoftRSTseqCmd(void)
325 {
326
327 rtk_uint32 regData;
328 ret_t retVal;
329
330 /*Bits [4-1] = 0b0110, tx soft reset Command; Bit [0] = 1, Trigger the Command */
331 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
332 return retVal;
333 regData &= 0xFFE0;
334 regData |= 0x000d;
335
336 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
337 return retVal;
338
339
340 /* wait for command finished */
341 do{
342 if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
343 return retVal;
344 }while( regData != 0x0);
345
346 return RT_ERR_OK ;
347 }
348
349
350 /* Function Name:
351 * rtl8367c_setAsicI2CGpioPinGroup
352 * Description:
353 * set I2C function used gpio pins
354 * Input:
355 * pinGroup_ID - gpio pins group
356 * Output:
357 * None
358 * Return:
359 * RT_ERR_OK - Success
360 * RT_ERR_INPUT _ Invalid input parameter
361 * Note:
362 * This API can set I2C function used gpio pins.
363 * There are three group gpio pins
364 */
365 ret_t rtl8367c_setAsicI2CGpioPinGroup(rtk_uint32 pinGroup_ID)
366 {
367 rtk_uint32 regData;
368 ret_t retVal;
369
370 if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, &regData)) != RT_ERR_OK)
371 return retVal;
372 if( pinGroup_ID==0 )
373 {
374 regData &= 0x0FFF;
375 regData |= 0x5000;
376
377 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, regData)) != RT_ERR_OK)
378 return retVal;
379 }
380
381 else if( pinGroup_ID==1 )
382 {
383 regData &= 0x0FFF;
384 regData |= 0xA000;
385
386 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, regData)) != RT_ERR_OK)
387 return retVal;
388 }
389
390 else if( pinGroup_ID==2 )
391 {
392 regData &= 0x0FFF;
393 regData |= 0xF000;
394
395 if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, regData)) != RT_ERR_OK)
396 return retVal;
397 }
398 else
399 return RT_ERR_INPUT;
400
401 return RT_ERR_OK ;
402
403 }
404
405 /* Function Name:
406 * rtl8367c_setAsicI2CGpioPinGroup
407 * Description:
408 * set I2C function used gpio pins
409 * Input:
410 * pinGroup_ID - gpio pins group
411 * Output:
412 * None
413 * Return:
414 * RT_ERR_OK - Success
415 * RT_ERR_INPUT _ Invalid input parameter
416 * Note:
417 * This API can set I2C function used gpio pins.
418 * There are three group gpio pins
419 */
420 ret_t rtl8367c_getAsicI2CGpioPinGroup(rtk_uint32 * pPinGroup_ID)
421 {
422
423 rtk_uint32 regData;
424 ret_t retVal;
425 if( (retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, &regData)) != RT_ERR_OK)
426 return retVal;
427 regData &= 0xF000 ;
428 regData = (regData >> 12);
429
430 if( regData == 0x5 )
431 *pPinGroup_ID = 0;
432 else if(regData == 0xA)
433 *pPinGroup_ID = 1;
434 else if(regData == 0xF)
435 *pPinGroup_ID = 2;
436 else
437 return RT_ERR_FAILED;
438 return RT_ERR_OK ;
439 }
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474