1 /*
2 * drivers/usb/sunxi_usb/usbc/usbc.c
3 * (C) Copyright 2010-2015
4 * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
5 * daniel, 2009.09.01
6 *
7 * usb common ops.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of
12 * the License, or (at your option) any later version.
13 *
14 */
15
16 #include "usbc_i.h"
17
18 static void __iomem *usbc_base_address; /* usb base address */
19 /* usbc internal use, in charge of USB port */
20 static __usbc_otg_t usbc_otg_array[USBC_MAX_OPEN_NUM];
21 static __fifo_info_t usbc_info_g;
22
23 /**
24 * get vbus current state
25 * @hUSB: handle return by USBC_open_otg, include the key data which USBC need
26 *
27 * return the current VBUS state
28 */
USBC_GetVbusStatus(__hdle hUSB)29 __u32 USBC_GetVbusStatus(__hdle hUSB)
30 {
31 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
32 __u8 reg_val = 0;
33
34 if (usbc_otg == NULL)
35 return 0;
36
37 reg_val = USBC_Readb(USBC_REG_DEVCTL(usbc_otg->base_addr));
38 reg_val = reg_val >> USBC_BP_DEVCTL_VBUS;
39 switch (reg_val & 0x03) {
40 case 0x00:
41 return USBC_VBUS_STATUS_BELOW_SESSIONEND;
42 case 0x01:
43 return USBC_VBUS_STATUS_ABOVE_SESSIONEND_BELOW_AVALID;
44 case 0x02:
45 return USBC_VBUS_STATUS_ABOVE_AVALID_BELOW_VBUSVALID;
46 case 0x03:
47 return USBC_VBUS_STATUS_ABOVE_VBUSVALID;
48 default:
49 return USBC_VBUS_STATUS_BELOW_SESSIONEND;
50 }
51 }
52 EXPORT_SYMBOL(USBC_GetVbusStatus);
53
54 /**
55 * select the function type, now is for host, or device
56 * @hUSB: handle return by USBC_open_otg, include the key data which USBC need
57 *
58 */
USBC_OTG_SelectMode(__hdle hUSB,__u32 mode)59 void USBC_OTG_SelectMode(__hdle hUSB, __u32 mode)
60 {
61 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
62
63 if (usbc_otg == NULL)
64 return;
65 }
66 EXPORT_SYMBOL(USBC_OTG_SelectMode);
67
68 /**
69 * get the length of data that can be read from current FIFO
70 * @hUSB: handle return by USBC_open_otg,
71 * include the key data which USBC need
72 * @ep_type: ep type, tx or rx
73 *
74 * return the data length that can be current read
75 */
USBC_ReadLenFromFifo(__hdle hUSB,__u32 ep_type)76 __u32 USBC_ReadLenFromFifo(__hdle hUSB, __u32 ep_type)
77 {
78 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
79
80 if (usbc_otg == NULL)
81 return 0;
82
83 switch (ep_type) {
84 case USBC_EP_TYPE_EP0:
85 return USBC_Readw(USBC_REG_COUNT0(usbc_otg->base_addr));
86 case USBC_EP_TYPE_TX:
87 return 0;
88 case USBC_EP_TYPE_RX:
89 return USBC_Readw(USBC_REG_RXCOUNT(usbc_otg->base_addr));
90 default:
91 return 0;
92 }
93 }
94 EXPORT_SYMBOL(USBC_ReadLenFromFifo);
95
96 /**
97 * write data packet to fifo
98 * @hUSB: handle return by USBC_open_otg,
99 * include the key data which USBC need
100 * @fifo: fifo address
101 * @cnt: data length
102 * @buff: store the data to be written
103 *
104 * return the length that successfully written
105 */
USBC_WritePacket(__hdle hUSB,void __iomem * fifo,__u32 cnt,void * buff)106 __u32 USBC_WritePacket(__hdle hUSB, void __iomem *fifo, __u32 cnt, void *buff)
107 {
108 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
109 __u32 len = 0;
110 __u32 i32 = 0;
111 __u32 i8 = 0;
112 __u8 *buf8 = NULL;
113 __u32 *buf32 = NULL;
114
115 if (usbc_otg == NULL || buff == NULL)
116 return 0;
117
118 /* --<1>-- adjust data */
119 buf32 = buff;
120 len = cnt;
121
122 i32 = len >> 2;
123 i8 = len & 0x03;
124
125 /* --<2>-- deal with 4byte part */
126 while (i32--)
127 USBC_Writel(*buf32++, fifo);
128
129 /* --<3>-- deal with no 4byte part */
130 buf8 = (__u8 *)buf32;
131 while (i8--)
132 USBC_Writeb(*buf8++, fifo);
133
134 return len;
135 }
136 EXPORT_SYMBOL(USBC_WritePacket);
137
138 /**
139 * read data from fifo
140 * @hUSB: handle return by USBC_open_otg,
141 * include the key data which USBC need
142 * @fifo: fifo address
143 * @cnt: data length
144 * @buff: store the data that will be read
145 *
146 * return the length that successfully read
147 */
USBC_ReadPacket(__hdle hUSB,void __iomem * fifo,__u32 cnt,void * buff)148 __u32 USBC_ReadPacket(__hdle hUSB, void __iomem *fifo, __u32 cnt, void *buff)
149 {
150 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
151 __u32 len = 0;
152 __u32 i32 = 0;
153 __u32 i8 = 0;
154 __u8 *buf8 = NULL;
155 __u32 *buf32 = NULL;
156
157 if (usbc_otg == NULL || buff == NULL)
158 return 0;
159
160 /* --<1>-- adjust data */
161 buf32 = buff;
162 len = cnt;
163
164 i32 = len >> 2;
165 i8 = len & 0x03;
166
167 /* --<2>-- deal with 4byte part */
168 while (i32--)
169 *buf32++ = USBC_Readl(fifo);
170
171 /* --<3>-- deal with no 4byte part */
172 buf8 = (__u8 *)buf32;
173 while (i8--)
174 *buf8++ = USBC_Readb(fifo);
175
176 return len;
177 }
178 EXPORT_SYMBOL(USBC_ReadPacket);
179
USBC_ConfigFIFO_Base(__hdle hUSB,__u32 fifo_mode)180 void USBC_ConfigFIFO_Base(__hdle hUSB, __u32 fifo_mode)
181 {
182 __fifo_info_t *usbc_info = &usbc_info_g;
183
184 usbc_info->port0_fifo_addr = 0x00;
185 usbc_info->port0_fifo_size = fifo_mode; /* 8k */
186 }
187 EXPORT_SYMBOL(USBC_ConfigFIFO_Base);
188
189 /* get port fifo's start address */
USBC_GetPortFifoStartAddr(__hdle hUSB)190 void __iomem *USBC_GetPortFifoStartAddr(__hdle hUSB)
191 {
192 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
193
194 if (usbc_otg == NULL)
195 return 0;
196
197 if (usbc_otg->port_num == 0)
198 return usbc_info_g.port0_fifo_addr;
199 else if (usbc_otg->port_num == 1)
200 return usbc_info_g.port1_fifo_addr;
201 else
202 return usbc_info_g.port2_fifo_addr;
203 }
204 EXPORT_SYMBOL(USBC_GetPortFifoStartAddr);
205
206 /* get port fifo's size */
USBC_GetPortFifoSize(__hdle hUSB)207 __u32 USBC_GetPortFifoSize(__hdle hUSB)
208 {
209 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
210
211 if (usbc_otg == NULL)
212 return 0;
213
214 if (usbc_otg->port_num == 0)
215 return usbc_info_g.port0_fifo_size;
216 else
217 return usbc_info_g.port1_fifo_size;
218 }
219 EXPORT_SYMBOL(USBC_GetPortFifoSize);
220
USBC_SelectFIFO(__hdle hUSB,__u32 ep_index)221 void __iomem *USBC_SelectFIFO(__hdle hUSB, __u32 ep_index)
222 {
223 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
224
225 if (usbc_otg == NULL)
226 return 0;
227
228 return USBC_REG_EPFIFOx(usbc_otg->base_addr, ep_index);
229 }
230 EXPORT_SYMBOL(USBC_SelectFIFO);
231
__USBC_ConfigFifo_TxEp_Default(void __iomem * usbc_base_addr)232 static void __USBC_ConfigFifo_TxEp_Default(void __iomem *usbc_base_addr)
233 {
234 USBC_Writew(0x00, USBC_REG_TXFIFOAD(usbc_base_addr));
235 USBC_Writeb(0x00, USBC_REG_TXFIFOSZ(usbc_base_addr));
236 }
237
238 /**
239 * set tx ep's fifo address and size
240 * @hUSB: handle return by USBC_open_otg,
241 * include the key data which USBC need
242 * @is_double_fifo: if use hardware double fifo
243 * @fifo_size: fifo size = 2 ^ fifo_size
244 * @fifo_addr: fifo start addr = fifo_addr * 8
245 *
246 */
__USBC_ConfigFifo_TxEp(void __iomem * usbc_base_addr,__u32 is_double_fifo,__u32 fifo_size,__u32 fifo_addr)247 static void __USBC_ConfigFifo_TxEp(void __iomem *usbc_base_addr,
248 __u32 is_double_fifo, __u32 fifo_size, __u32 fifo_addr)
249 {
250 __u32 temp = 0;
251 __u32 size = 0; /* fifo_size = 2^ (size + 3) */
252 __u32 addr = 0; /* fifo_addr = addr * 8 */
253
254 /* --<1>-- 512 align */
255 temp = fifo_size + 511;
256 temp &= ~511;
257 temp >>= 3;
258 temp >>= 1;
259 while (temp) {
260 size++;
261 temp >>= 1;
262 }
263
264 /* --<2>-- calculate addr */
265 addr = fifo_addr >> 3;
266
267 /* --<3>--config fifo addr */
268 USBC_Writew(addr, USBC_REG_TXFIFOAD(usbc_base_addr));
269
270 /* --<4>--config fifo size */
271 USBC_Writeb((size & 0x0f), USBC_REG_TXFIFOSZ(usbc_base_addr));
272 if (is_double_fifo)
273 USBC_REG_set_bit_b(USBC_BP_TXFIFOSZ_DPB,
274 USBC_REG_TXFIFOSZ(usbc_base_addr));
275 }
276
__USBC_ConfigFifo_RxEp_Default(void __iomem * usbc_base_addr)277 static void __USBC_ConfigFifo_RxEp_Default(void __iomem *usbc_base_addr)
278 {
279 USBC_Writew(0x00, USBC_REG_RXFIFOAD(usbc_base_addr));
280 USBC_Writeb(0x00, USBC_REG_RXFIFOSZ(usbc_base_addr));
281 }
282
283 /**
284 * set rx ep's fifo address and size
285 * @hUSB: handle return by USBC_open_otg,
286 * include the key data which USBC need
287 * @is_double_fifo: if use hardware double fifo
288 * @fifo_size: fifo size = 2 ^ fifo_size
289 * @fifo_addr: fifo start addr = fifo_addr * 8
290 *
291 */
__USBC_ConfigFifo_RxEp(void __iomem * usbc_base_addr,__u32 is_double_fifo,__u32 fifo_size,__u32 fifo_addr)292 static void __USBC_ConfigFifo_RxEp(void __iomem *usbc_base_addr,
293 __u32 is_double_fifo, __u32 fifo_size, __u32 fifo_addr)
294 {
295 __u32 temp = 0;
296 __u32 size = 0; /* fifo_size = 2 ^ (size + 3) */
297 __u32 addr = 0; /* fifo_addr = addr * 8 */
298
299 /* --<1>-- 512 align */
300 temp = fifo_size + 511;
301 temp &= ~511;
302 temp >>= 3;
303 temp >>= 1;
304 while (temp) {
305 size++;
306 temp >>= 1;
307 }
308
309 /* --<2>--calculate addr */
310 addr = fifo_addr >> 3;
311
312 /* --<3>--config fifo addr */
313 USBC_Writew(addr, USBC_REG_RXFIFOAD(usbc_base_addr));
314
315 /* --<2>--config fifo size */
316 USBC_Writeb((size & 0x0f), USBC_REG_RXFIFOSZ(usbc_base_addr));
317 if (is_double_fifo)
318 USBC_REG_set_bit_b(USBC_BP_RXFIFOSZ_DPB,
319 USBC_REG_RXFIFOSZ(usbc_base_addr));
320 }
321
322 /**
323 * config ep's fifo addr and size
324 * @hUSB: handle return by USBC_open_otg,
325 * include the key data which USBC need
326 * @ep_type: ep type
327 *
328 */
USBC_ConfigFifo_Default(__hdle hUSB,__u32 ep_type)329 void USBC_ConfigFifo_Default(__hdle hUSB, __u32 ep_type)
330 {
331 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
332
333 if (usbc_otg == NULL)
334 return;
335
336 switch (ep_type) {
337 case USBC_EP_TYPE_EP0:
338 /* not support */
339 break;
340 case USBC_EP_TYPE_TX:
341 __USBC_ConfigFifo_TxEp_Default(usbc_otg->base_addr);
342 break;
343 case USBC_EP_TYPE_RX:
344 __USBC_ConfigFifo_RxEp_Default(usbc_otg->base_addr);
345 break;
346 default:
347 break;
348 }
349 }
350 EXPORT_SYMBOL(USBC_ConfigFifo_Default);
351
352 /**
353 * config ep's fifo addr and size
354 * @hUSB: handle return by USBC_open_otg,
355 * include the key data which USBC need
356 * @ep_type: ep type
357 * @is_double_fifo: if use hardware double fifo
358 * @fifo_size: fifo size = 2 ^ fifo_size
359 * @fifo_addr: fifo start addr = fifo_addr * 8
360 *
361 */
USBC_ConfigFifo(__hdle hUSB,__u32 ep_type,__u32 is_double_fifo,__u32 fifo_size,__u32 fifo_addr)362 void USBC_ConfigFifo(__hdle hUSB, __u32 ep_type,
363 __u32 is_double_fifo, __u32 fifo_size, __u32 fifo_addr)
364 {
365 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
366
367 if (usbc_otg == NULL)
368 return;
369
370 switch (ep_type) {
371 case USBC_EP_TYPE_EP0:
372 /* not support */
373 break;
374 case USBC_EP_TYPE_TX:
375 __USBC_ConfigFifo_TxEp(usbc_otg->base_addr,
376 is_double_fifo, fifo_size, fifo_addr);
377 break;
378 case USBC_EP_TYPE_RX:
379 __USBC_ConfigFifo_RxEp(usbc_otg->base_addr,
380 is_double_fifo, fifo_size, fifo_addr);
381 break;
382 default:
383 break;
384 }
385 }
386 EXPORT_SYMBOL(USBC_ConfigFifo);
387
388 /**
389 * get the last frma number
390 * @hUSB: handle return by USBC_open_otg,
391 * include the key data which USBC need
392 *
393 */
USBC_GetLastFrameNumber(__hdle hUSB)394 __u32 USBC_GetLastFrameNumber(__hdle hUSB)
395 {
396 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
397
398 if (usbc_otg == NULL)
399 return 0;
400
401 return USBC_Readl(USBC_REG_FRNUM(usbc_otg->base_addr));
402 }
403 EXPORT_SYMBOL(USBC_GetLastFrameNumber);
404
405 /**
406 * get status of DP
407 * @hUSB: handle return by USBC_open_otg,
408 * include the key data which USBC need
409 *
410 */
USBC_GetStatus_Dp(__hdle hUSB)411 __u32 USBC_GetStatus_Dp(__hdle hUSB)
412 {
413 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
414 __u32 temp = 0;
415
416 if (usbc_otg == NULL)
417 return 0;
418
419 temp = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
420 temp = (temp >> USBC_BP_ISCR_EXT_DP_STATUS) & 0x01;
421
422 return temp;
423 }
424 EXPORT_SYMBOL(USBC_GetStatus_Dp);
425
426 /**
427 * get status of DM
428 * @hUSB: handle return by USBC_open_otg,
429 * include the key data which USBC need
430 *
431 */
USBC_GetStatus_Dm(__hdle hUSB)432 __u32 USBC_GetStatus_Dm(__hdle hUSB)
433 {
434 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
435 __u32 temp = 0;
436
437 if (usbc_otg == NULL)
438 return 0;
439
440 temp = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
441 temp = (temp >> USBC_BP_ISCR_EXT_DM_STATUS) & 0x01;
442
443 return temp;
444 }
445 EXPORT_SYMBOL(USBC_GetStatus_Dm);
446
447 /**
448 * get status of DpDm
449 * @hUSB: handle return by USBC_open_otg,
450 * include the key data which USBC need
451 *
452 */
USBC_GetStatus_DpDm(__hdle hUSB)453 __u32 USBC_GetStatus_DpDm(__hdle hUSB)
454 {
455 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
456 __u32 temp = 0;
457 __u32 dp = 0;
458 __u32 dm = 0;
459
460
461 if (usbc_otg == NULL)
462 return 0;
463
464 temp = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
465 dp = (temp >> USBC_BP_ISCR_EXT_DP_STATUS) & 0x01;
466 dm = (temp >> USBC_BP_ISCR_EXT_DM_STATUS) & 0x01;
467 return ((dp << 1) | dm);
468
469 }
470 EXPORT_SYMBOL(USBC_GetStatus_DpDm);
471
472 /**
473 * get current OTG mode from vendor0's id
474 * @hUSB: handle return by USBC_open_otg,
475 * include the key data which USBC need
476 *
477 * return USBC_OTG_DEVICE / USBC_OTG_HOST
478 */
USBC_GetOtgMode_Form_ID(__hdle hUSB)479 __u32 USBC_GetOtgMode_Form_ID(__hdle hUSB)
480 {
481 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
482 __u32 mode = 0;
483
484 if (usbc_otg == NULL)
485 return USBC_OTG_DEVICE;
486
487 mode = USBC_REG_test_bit_l(USBC_BP_ISCR_MERGED_ID_STATUS,
488 USBC_REG_ISCR(usbc_otg->base_addr));
489 if (mode)
490 return USBC_OTG_DEVICE;
491 else
492 return USBC_OTG_HOST;
493 }
494 EXPORT_SYMBOL(USBC_GetOtgMode_Form_ID);
495
496 /**
497 * get current OTG mode from OTG Device's B-Device
498 * @hUSB: handle return by USBC_open_otg,
499 * include the key data which USBC need
500 *
501 * return USBC_OTG_DEVICE / USBC_OTG_HOST
502 */
USBC_GetOtgMode_Form_BDevice(__hdle hUSB)503 __u32 USBC_GetOtgMode_Form_BDevice(__hdle hUSB)
504 {
505 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
506 __u32 mode = 0;
507
508 if (usbc_otg == NULL)
509 return USBC_OTG_DEVICE;
510
511 mode = USBC_REG_test_bit_b(USBC_BP_DEVCTL_B_DEVICE,
512 USBC_REG_DEVCTL(usbc_otg->base_addr));
513 if (mode)
514 return USBC_OTG_DEVICE;
515 else
516 return USBC_OTG_HOST;
517 }
518 EXPORT_SYMBOL(USBC_GetOtgMode_Form_BDevice);
519
520 /**
521 * otg and hci0 Controller Shared phy in SUN50I
522 * select 1:to device,0:hci
523 */
USBC_SelectPhyToDevice(void __iomem * usbc_base_addr)524 void USBC_SelectPhyToDevice(void __iomem *usbc_base_addr)
525 {
526 int reg_value = 0;
527
528 reg_value = USBC_Readl(usbc_base_addr + 0x420);
529 reg_value |= (0x01);
530 USBC_Writel(reg_value, (usbc_base_addr + 0x420));
531 }
532
533 /**
534 * select the bus way for data transfer
535 * @hUSB: handle return by USBC_open_otg,
536 * include the key data which USBC need
537 * @io_type: bus type, pio or dma
538 * @ep_type: ep type, rx or tx
539 * @ep_index: ep index
540 *
541 */
USBC_SelectBus(__hdle hUSB,__u32 io_type,__u32 ep_type,__u32 ep_index)542 void USBC_SelectBus(__hdle hUSB, __u32 io_type, __u32 ep_type, __u32 ep_index)
543 {
544 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
545 __u32 reg_val = 0;
546
547 if (usbc_otg == NULL)
548 return;
549
550 reg_val = USBC_Readb(USBC_REG_VEND0(usbc_otg->base_addr));
551 if (io_type == USBC_IO_TYPE_DMA) {
552 if (ep_type == USBC_EP_TYPE_TX) {
553 reg_val |= ((ep_index - 0x01) << 1)
554 << USBC_BP_VEND0_DRQ_SEL; /* drq_sel */
555 reg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL; /* io_dma */
556 } else {
557 reg_val |= ((ep_index << 1) - 0x01)
558 << USBC_BP_VEND0_DRQ_SEL;
559 reg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL;
560 }
561 } else {
562 #if !defined(CONFIG_ARCH_SUN8IW6) && !defined(CONFIG_ARCH_SUN8IW8)
563 reg_val &= 0x00; /* clear drq_sel, select pio */
564 #endif
565 }
566
567 /**
568 * in SUN8IW5 SUN8IW6 and later ic, FIFO_BUS_SEL bit(bit24 of reg0x40
569 * for host/device) is fixed to 1, the hw guarantee that it's ok for
570 * cpu/inner_dma/outer_dma transfer.
571 */
572
573 reg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL;
574
575 USBC_Writeb(reg_val, USBC_REG_VEND0(usbc_otg->base_addr));
576 }
577 EXPORT_SYMBOL(USBC_SelectBus);
578
579 /* get tx ep's interrupt flag */
__USBC_INT_TxPending(void __iomem * usbc_base_addr)580 static __u32 __USBC_INT_TxPending(void __iomem *usbc_base_addr)
581 {
582 return USBC_Readw(USBC_REG_INTTx(usbc_base_addr));
583 }
584
585 /* clear tx ep's interrupt flag */
__USBC_INT_ClearTxPending(void __iomem * usbc_base_addr,__u8 ep_index)586 static void __USBC_INT_ClearTxPending(void __iomem *usbc_base_addr,
587 __u8 ep_index)
588 {
589 USBC_Writew((1 << ep_index), USBC_REG_INTTx(usbc_base_addr));
590 }
591
592 /* clear all the tx ep's interrupt flag */
__USBC_INT_ClearTxPendingAll(void __iomem * usbc_base_addr)593 static void __USBC_INT_ClearTxPendingAll(void __iomem *usbc_base_addr)
594 {
595 USBC_Writew(0xffff, USBC_REG_INTTx(usbc_base_addr));
596 }
597
598 /* get rx ep's interrupt flag */
__USBC_INT_RxPending(void __iomem * usbc_base_addr)599 static __u32 __USBC_INT_RxPending(void __iomem *usbc_base_addr)
600 {
601 return USBC_Readw(USBC_REG_INTRx(usbc_base_addr));
602 }
603
604 /* clear rx ep's interrupt flag */
__USBC_INT_ClearRxPending(void __iomem * usbc_base_addr,__u8 ep_index)605 static void __USBC_INT_ClearRxPending(void __iomem *usbc_base_addr,
606 __u8 ep_index)
607 {
608 USBC_Writew((1 << ep_index), USBC_REG_INTRx(usbc_base_addr));
609 }
610
611 /* clear all the rx ep's interrupt flag */
__USBC_INT_ClearRxPendingAll(void __iomem * usbc_base_addr)612 static void __USBC_INT_ClearRxPendingAll(void __iomem *usbc_base_addr)
613 {
614 USBC_Writew(0xffff, USBC_REG_INTRx(usbc_base_addr));
615 }
616
617 /* open a tx ep's interrupt */
__USBC_INT_EnableTxEp(void __iomem * usbc_base_addr,__u8 ep_index)618 static void __USBC_INT_EnableTxEp(void __iomem *usbc_base_addr, __u8 ep_index)
619 {
620 USBC_REG_set_bit_w(ep_index, USBC_REG_INTTxE(usbc_base_addr));
621 }
622
623 /* open a rx ep's interrupt */
__USBC_INT_EnableRxEp(void __iomem * usbc_base_addr,__u8 ep_index)624 static void __USBC_INT_EnableRxEp(void __iomem *usbc_base_addr, __u8 ep_index)
625 {
626 USBC_REG_set_bit_w(ep_index, USBC_REG_INTRxE(usbc_base_addr));
627 }
628
629 /* close a tx ep's interrupt */
__USBC_INT_DisableTxEp(void __iomem * usbc_base_addr,__u8 ep_index)630 static void __USBC_INT_DisableTxEp(void __iomem *usbc_base_addr, __u8 ep_index)
631 {
632 USBC_REG_clear_bit_w(ep_index, USBC_REG_INTTxE(usbc_base_addr));
633 }
634
635 /* close a rx ep's interrupt */
__USBC_INT_DisableRxEp(void __iomem * usbc_base_addr,__u8 ep_index)636 static void __USBC_INT_DisableRxEp(void __iomem *usbc_base_addr, __u8 ep_index)
637 {
638 USBC_REG_clear_bit_w(ep_index, USBC_REG_INTRxE(usbc_base_addr));
639 }
640
641 /* close all tx ep's interrupt */
__USBC_INT_DisableTxAll(void __iomem * usbc_base_addr)642 static void __USBC_INT_DisableTxAll(void __iomem *usbc_base_addr)
643 {
644 USBC_Writew(0, USBC_REG_INTTxE(usbc_base_addr));
645 }
646
647 /* close all rx ep's interrupt */
__USBC_INT_DisableRxAll(void __iomem * usbc_base_addr)648 static void __USBC_INT_DisableRxAll(void __iomem *usbc_base_addr)
649 {
650 USBC_Writew(0, USBC_REG_INTRxE(usbc_base_addr));
651 }
652
653 /* get ep's interrupt flag */
USBC_INT_EpPending(__hdle hUSB,__u32 ep_type)654 __u32 USBC_INT_EpPending(__hdle hUSB, __u32 ep_type)
655 {
656 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
657
658 if (usbc_otg == NULL)
659 return 0;
660
661 switch (ep_type) {
662 case USBC_EP_TYPE_EP0:
663 case USBC_EP_TYPE_TX:
664 return __USBC_INT_TxPending(usbc_otg->base_addr);
665
666 case USBC_EP_TYPE_RX:
667 return __USBC_INT_RxPending(usbc_otg->base_addr);
668
669 default:
670 return 0;
671 }
672 }
673 EXPORT_SYMBOL(USBC_INT_EpPending);
674
675 /* clear ep's interrupt flag */
USBC_INT_ClearEpPending(__hdle hUSB,__u32 ep_type,__u8 ep_index)676 void USBC_INT_ClearEpPending(__hdle hUSB, __u32 ep_type, __u8 ep_index)
677 {
678 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
679
680 if (usbc_otg == NULL)
681 return;
682
683 switch (ep_type) {
684 case USBC_EP_TYPE_EP0:
685 case USBC_EP_TYPE_TX:
686 __USBC_INT_ClearTxPending(usbc_otg->base_addr, ep_index);
687 break;
688
689 case USBC_EP_TYPE_RX:
690 __USBC_INT_ClearRxPending(usbc_otg->base_addr, ep_index);
691 break;
692
693 default:
694 break;
695 }
696
697 }
698 EXPORT_SYMBOL(USBC_INT_ClearEpPending);
699
700 /* clear ep's interrupt flag */
USBC_INT_ClearEpPendingAll(__hdle hUSB,__u32 ep_type)701 void USBC_INT_ClearEpPendingAll(__hdle hUSB, __u32 ep_type)
702 {
703 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
704
705 if (usbc_otg == NULL)
706 return;
707
708 switch (ep_type) {
709 case USBC_EP_TYPE_EP0:
710 case USBC_EP_TYPE_TX:
711 __USBC_INT_ClearTxPendingAll(usbc_otg->base_addr);
712 break;
713
714 case USBC_EP_TYPE_RX:
715 __USBC_INT_ClearRxPendingAll(usbc_otg->base_addr);
716 break;
717
718 default:
719 break;
720 }
721 }
722 EXPORT_SYMBOL(USBC_INT_ClearEpPendingAll);
723
724 /* get usb misc's interrupt flag */
USBC_INT_MiscPending(__hdle hUSB)725 __u32 USBC_INT_MiscPending(__hdle hUSB)
726 {
727 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
728
729 if (usbc_otg == NULL)
730 return 0;
731
732 return USBC_Readb(USBC_REG_INTUSB(usbc_otg->base_addr));
733 }
734 EXPORT_SYMBOL(USBC_INT_MiscPending);
735
736 /* clear usb misc's interrupt flag */
USBC_INT_ClearMiscPending(__hdle hUSB,__u32 mask)737 void USBC_INT_ClearMiscPending(__hdle hUSB, __u32 mask)
738 {
739 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
740
741 if (usbc_otg == NULL)
742 return;
743
744 USBC_Writeb(mask, USBC_REG_INTUSB(usbc_otg->base_addr));
745 }
746 EXPORT_SYMBOL(USBC_INT_ClearMiscPending);
747
748 /* clear all the usb misc's interrupt flag */
USBC_INT_ClearMiscPendingAll(__hdle hUSB)749 void USBC_INT_ClearMiscPendingAll(__hdle hUSB)
750 {
751 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
752
753 if (usbc_otg == NULL)
754 return;
755
756 USBC_Writeb(0xff, USBC_REG_INTUSB(usbc_otg->base_addr));
757 }
758 EXPORT_SYMBOL(USBC_INT_ClearMiscPendingAll);
759
760 /* open a ep's interrupt */
USBC_INT_EnableEp(__hdle hUSB,__u32 ep_type,__u8 ep_index)761 void USBC_INT_EnableEp(__hdle hUSB, __u32 ep_type, __u8 ep_index)
762 {
763 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
764
765 if (usbc_otg == NULL)
766 return;
767
768 switch (ep_type) {
769 case USBC_EP_TYPE_TX:
770 __USBC_INT_EnableTxEp(usbc_otg->base_addr, ep_index);
771 break;
772
773 case USBC_EP_TYPE_RX:
774 __USBC_INT_EnableRxEp(usbc_otg->base_addr, ep_index);
775 break;
776
777 default:
778 break;
779 }
780 }
781 EXPORT_SYMBOL(USBC_INT_EnableEp);
782
783 /* open a usb misc's interrupt */
USBC_INT_EnableUsbMiscUint(__hdle hUSB,__u32 mask)784 void USBC_INT_EnableUsbMiscUint(__hdle hUSB, __u32 mask)
785 {
786 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
787 __u32 reg_val = 0;
788
789 if (usbc_otg == NULL)
790 return;
791
792 reg_val = USBC_Readb(USBC_REG_INTUSBE(usbc_otg->base_addr));
793 reg_val |= mask;
794 USBC_Writeb(reg_val, USBC_REG_INTUSBE(usbc_otg->base_addr));
795 }
796 EXPORT_SYMBOL(USBC_INT_EnableUsbMiscUint);
797
798 /* close a ep's interrupt */
USBC_INT_DisableEp(__hdle hUSB,__u32 ep_type,__u8 ep_index)799 void USBC_INT_DisableEp(__hdle hUSB, __u32 ep_type, __u8 ep_index)
800 {
801 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
802
803 if (usbc_otg == NULL)
804 return;
805
806 switch (ep_type) {
807 case USBC_EP_TYPE_TX:
808 __USBC_INT_DisableTxEp(usbc_otg->base_addr, ep_index);
809 break;
810
811 case USBC_EP_TYPE_RX:
812 __USBC_INT_DisableRxEp(usbc_otg->base_addr, ep_index);
813 break;
814
815 default:
816 break;
817 }
818 }
819 EXPORT_SYMBOL(USBC_INT_DisableEp);
820
821 /* close a usb misc's interrupt */
USBC_INT_DisableUsbMiscUint(__hdle hUSB,__u32 mask)822 void USBC_INT_DisableUsbMiscUint(__hdle hUSB, __u32 mask)
823 {
824 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
825 __u32 reg_val = 0;
826
827 if (usbc_otg == NULL)
828 return;
829
830 reg_val = USBC_Readb(USBC_REG_INTUSBE(usbc_otg->base_addr));
831 reg_val &= ~mask;
832 USBC_Writeb(reg_val, USBC_REG_INTUSBE(usbc_otg->base_addr));
833 }
834 EXPORT_SYMBOL(USBC_INT_DisableUsbMiscUint);
835
836 /* close all ep's interrupt */
USBC_INT_DisableEpAll(__hdle hUSB,__u32 ep_type)837 void USBC_INT_DisableEpAll(__hdle hUSB, __u32 ep_type)
838 {
839 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
840
841 if (usbc_otg == NULL)
842 return;
843
844 switch (ep_type) {
845 case USBC_EP_TYPE_TX:
846 __USBC_INT_DisableTxAll(usbc_otg->base_addr);
847 break;
848
849 case USBC_EP_TYPE_RX:
850 __USBC_INT_DisableRxAll(usbc_otg->base_addr);
851 break;
852
853 default:
854 break;
855 }
856 }
857 EXPORT_SYMBOL(USBC_INT_DisableEpAll);
858
859 /* close all usb misc's interrupt */
USBC_INT_DisableUsbMiscAll(__hdle hUSB)860 void USBC_INT_DisableUsbMiscAll(__hdle hUSB)
861 {
862 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
863
864 if (usbc_otg == NULL)
865 return;
866
867 USBC_Writeb(0, USBC_REG_INTUSBE(usbc_otg->base_addr));
868 }
869 EXPORT_SYMBOL(USBC_INT_DisableUsbMiscAll);
870
871 /* get current active ep */
USBC_GetActiveEp(__hdle hUSB)872 __u32 USBC_GetActiveEp(__hdle hUSB)
873 {
874 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
875
876 if (usbc_otg == NULL)
877 return 0;
878
879 return USBC_Readb(USBC_REG_EPIND(usbc_otg->base_addr));
880 }
881 EXPORT_SYMBOL(USBC_GetActiveEp);
882
883 /* set the active ep */
USBC_SelectActiveEp(__hdle hUSB,__u8 ep_index)884 void USBC_SelectActiveEp(__hdle hUSB, __u8 ep_index)
885 {
886 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
887
888 if (usbc_otg == NULL)
889 return;
890
891 USBC_Writeb(ep_index, USBC_REG_EPIND(usbc_otg->base_addr));
892 }
893 EXPORT_SYMBOL(USBC_SelectActiveEp);
894
895 /* enhance usb transfer signal */
USBC_EnhanceSignal(__hdle hUSB)896 void USBC_EnhanceSignal(__hdle hUSB)
897 {
898 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
899
900 if (usbc_otg == NULL)
901 return;
902 }
903 EXPORT_SYMBOL(USBC_EnhanceSignal);
904
905 /* enter TestPacket mode */
USBC_EnterMode_TestPacket(__hdle hUSB)906 void USBC_EnterMode_TestPacket(__hdle hUSB)
907 {
908 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
909
910 if (usbc_otg == NULL)
911 return;
912
913 USBC_REG_set_bit_b(USBC_BP_TMCTL_TEST_PACKET,
914 USBC_REG_TMCTL(usbc_otg->base_addr));
915 }
916 EXPORT_SYMBOL(USBC_EnterMode_TestPacket);
917
918 /* enter Test_K mode */
USBC_EnterMode_Test_K(__hdle hUSB)919 void USBC_EnterMode_Test_K(__hdle hUSB)
920 {
921 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
922
923 if (usbc_otg == NULL)
924 return;
925
926 USBC_REG_set_bit_b(USBC_BP_TMCTL_TEST_K,
927 USBC_REG_TMCTL(usbc_otg->base_addr));
928 }
929 EXPORT_SYMBOL(USBC_EnterMode_Test_K);
930
931 /* enter Test_J mode */
USBC_EnterMode_Test_J(__hdle hUSB)932 void USBC_EnterMode_Test_J(__hdle hUSB)
933 {
934 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
935
936 if (usbc_otg == NULL)
937 return;
938
939 USBC_REG_set_bit_b(USBC_BP_TMCTL_TEST_J,
940 USBC_REG_TMCTL(usbc_otg->base_addr));
941 }
942 EXPORT_SYMBOL(USBC_EnterMode_Test_J);
943
944 /* enter Test_SE0_NAK mode */
USBC_EnterMode_Test_SE0_NAK(__hdle hUSB)945 void USBC_EnterMode_Test_SE0_NAK(__hdle hUSB)
946 {
947 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
948
949 if (usbc_otg == NULL)
950 return;
951
952 USBC_REG_set_bit_b(USBC_BP_TMCTL_TEST_SE0_NAK,
953 USBC_REG_TMCTL(usbc_otg->base_addr));
954 }
955 EXPORT_SYMBOL(USBC_EnterMode_Test_SE0_NAK);
956
957 /* clear all test mode */
USBC_EnterMode_Idle(__hdle hUSB)958 void USBC_EnterMode_Idle(__hdle hUSB)
959 {
960 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
961
962 if (usbc_otg == NULL)
963 return;
964
965 USBC_REG_clear_bit_b(USBC_BP_TMCTL_TEST_PACKET,
966 USBC_REG_TMCTL(usbc_otg->base_addr));
967 USBC_REG_clear_bit_b(USBC_BP_TMCTL_TEST_K,
968 USBC_REG_TMCTL(usbc_otg->base_addr));
969 USBC_REG_clear_bit_b(USBC_BP_TMCTL_TEST_J,
970 USBC_REG_TMCTL(usbc_otg->base_addr));
971 USBC_REG_clear_bit_b(USBC_BP_TMCTL_TEST_SE0_NAK,
972 USBC_REG_TMCTL(usbc_otg->base_addr));
973 }
974 EXPORT_SYMBOL(USBC_EnterMode_Idle);
975
976 /**
977 * vbus, id, dpdm, these bit is set 1 to clear,
978 * so we clear these bit when operate other bits
979 */
__USBC_WakeUp_ClearChangeDetect(__u32 reg_val)980 static __u32 __USBC_WakeUp_ClearChangeDetect(__u32 reg_val)
981 {
982 __u32 temp = reg_val;
983
984 temp &= ~(1 << USBC_BP_ISCR_VBUS_CHANGE_DETECT);
985 temp &= ~(1 << USBC_BP_ISCR_ID_CHANGE_DETECT);
986 temp &= ~(1 << USBC_BP_ISCR_DPDM_CHANGE_DETECT);
987
988 return temp;
989 }
990
USBC_SetWakeUp_Default(__hdle hUSB)991 void USBC_SetWakeUp_Default(__hdle hUSB)
992 {
993 }
994 EXPORT_SYMBOL(USBC_SetWakeUp_Default);
995
USBC_EnableIdPullUp(__hdle hUSB)996 void USBC_EnableIdPullUp(__hdle hUSB)
997 {
998 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
999 __u32 reg_val = 0;
1000
1001 /**
1002 * vbus, id, dpdm, these bit is set 1 to clear,
1003 * so we clear these bit when operate other bits
1004 */
1005 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1006 reg_val |= (1 << USBC_BP_ISCR_ID_PULLUP_EN);
1007 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1008 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1009 }
1010 EXPORT_SYMBOL(USBC_EnableIdPullUp);
1011
USBC_DisableIdPullUp(__hdle hUSB)1012 void USBC_DisableIdPullUp(__hdle hUSB)
1013 {
1014 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1015 __u32 reg_val = 0;
1016
1017 /**
1018 * vbus, id, dpdm, these bit is set 1 to clear,
1019 * so we clear these bit when operate other bits
1020 */
1021 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1022 reg_val &= ~(1 << USBC_BP_ISCR_ID_PULLUP_EN);
1023 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1024 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1025 }
1026 EXPORT_SYMBOL(USBC_DisableIdPullUp);
1027
USBC_EnableDpDmPullUp(__hdle hUSB)1028 void USBC_EnableDpDmPullUp(__hdle hUSB)
1029 {
1030 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1031 __u32 reg_val = 0;
1032
1033 /**
1034 * vbus, id, dpdm, these bit is set 1 to clear,
1035 * so we clear these bit when operate other bits
1036 */
1037 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1038 reg_val |= (1 << USBC_BP_ISCR_DPDM_PULLUP_EN);
1039 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1040 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1041 }
1042 EXPORT_SYMBOL(USBC_EnableDpDmPullUp);
1043
USBC_DisableDpDmPullUp(__hdle hUSB)1044 void USBC_DisableDpDmPullUp(__hdle hUSB)
1045 {
1046 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1047 __u32 reg_val = 0;
1048
1049 /**
1050 * vbus, id, dpdm, these bit is set 1 to clear,
1051 * so we clear these bit when operate other bits
1052 */
1053 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1054 reg_val &= ~(1 << USBC_BP_ISCR_DPDM_PULLUP_EN);
1055 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1056 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1057 }
1058 EXPORT_SYMBOL(USBC_DisableDpDmPullUp);
1059
__USBC_ForceIdDisable(void __iomem * usbc_base_addr)1060 static void __USBC_ForceIdDisable(void __iomem *usbc_base_addr)
1061 {
1062 __u32 reg_val = 0;
1063
1064 /**
1065 * vbus, id, dpdm, these bit is set 1 to clear,
1066 * so we clear these bit when operate other bits
1067 */
1068 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_base_addr));
1069 reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_ID);
1070 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1071 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_base_addr));
1072 }
1073
__USBC_ForceIdToLow(void __iomem * usbc_base_addr)1074 static void __USBC_ForceIdToLow(void __iomem *usbc_base_addr)
1075 {
1076 __u32 reg_val = 0;
1077
1078 /* first write 00, then write 10 */
1079 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_base_addr));
1080 reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_ID);
1081 reg_val |= (0x02 << USBC_BP_ISCR_FORCE_ID);
1082 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1083 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_base_addr));
1084 }
1085
__USBC_ForceIdToHigh(void __iomem * usbc_base_addr)1086 static void __USBC_ForceIdToHigh(void __iomem *usbc_base_addr)
1087 {
1088 __u32 reg_val = 0;
1089
1090 /* first write 00, then write 10 */
1091 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_base_addr));
1092 reg_val |= (0x03 << USBC_BP_ISCR_FORCE_ID);
1093 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1094 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_base_addr));
1095 }
1096
1097 /* force id to (id_type) */
USBC_ForceId(__hdle hUSB,__u32 id_type)1098 void USBC_ForceId(__hdle hUSB, __u32 id_type)
1099 {
1100 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1101
1102 switch (id_type) {
1103 case USBC_ID_TYPE_HOST:
1104 __USBC_ForceIdToLow(usbc_otg->base_addr);
1105 break;
1106
1107 case USBC_ID_TYPE_DEVICE:
1108 __USBC_ForceIdToHigh(usbc_otg->base_addr);
1109 break;
1110
1111 default:
1112 __USBC_ForceIdDisable(usbc_otg->base_addr);
1113 }
1114 }
1115 EXPORT_SYMBOL(USBC_ForceId);
1116
__USBC_ForceVbusValidDisable(void __iomem * usbc_base_addr)1117 static void __USBC_ForceVbusValidDisable(void __iomem *usbc_base_addr)
1118 {
1119 __u32 reg_val = 0;
1120
1121 /* first write 00, then write 10 */
1122 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_base_addr));
1123 reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_VBUS_VALID);
1124 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1125 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_base_addr));
1126 }
1127
__USBC_ForceVbusValidToLow(void __iomem * usbc_base_addr)1128 static void __USBC_ForceVbusValidToLow(void __iomem *usbc_base_addr)
1129 {
1130 __u32 reg_val = 0;
1131
1132 /* first write 00, then write 10 */
1133 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_base_addr));
1134 reg_val &= ~(0x03 << USBC_BP_ISCR_FORCE_VBUS_VALID);
1135 reg_val |= (0x02 << USBC_BP_ISCR_FORCE_VBUS_VALID);
1136 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1137 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_base_addr));
1138 }
1139
__USBC_ForceVbusValidToHigh(void __iomem * usbc_base_addr)1140 static void __USBC_ForceVbusValidToHigh(void __iomem *usbc_base_addr)
1141 {
1142 __u32 reg_val = 0;
1143
1144 /* first write 00, then write 11 */
1145 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_base_addr));
1146 reg_val |= (0x03 << USBC_BP_ISCR_FORCE_VBUS_VALID);
1147 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1148 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_base_addr));
1149 }
1150
1151 /* force vbus valid to (id_type) */
USBC_ForceVbusValid(__hdle hUSB,__u32 vbus_type)1152 void USBC_ForceVbusValid(__hdle hUSB, __u32 vbus_type)
1153 {
1154 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1155
1156 if (usbc_otg == NULL)
1157 return;
1158
1159 switch (vbus_type) {
1160 case USBC_VBUS_TYPE_LOW:
1161 __USBC_ForceVbusValidToLow(usbc_otg->base_addr);
1162 break;
1163
1164 case USBC_VBUS_TYPE_HIGH:
1165 __USBC_ForceVbusValidToHigh(usbc_otg->base_addr);
1166 break;
1167
1168 default:
1169 __USBC_ForceVbusValidDisable(usbc_otg->base_addr);
1170 }
1171 }
1172 EXPORT_SYMBOL(USBC_ForceVbusValid);
1173
USBC_A_valid_InputSelect(__hdle hUSB,__u32 source)1174 void USBC_A_valid_InputSelect(__hdle hUSB, __u32 source)
1175 {
1176 }
1177 EXPORT_SYMBOL(USBC_A_valid_InputSelect);
1178
USBC_EnableUsbLineStateBypass(__hdle hUSB)1179 void USBC_EnableUsbLineStateBypass(__hdle hUSB)
1180 {
1181 }
1182 EXPORT_SYMBOL(USBC_EnableUsbLineStateBypass);
1183
USBC_DisableUsbLineStateBypass(__hdle hUSB)1184 void USBC_DisableUsbLineStateBypass(__hdle hUSB)
1185 {
1186 }
1187 EXPORT_SYMBOL(USBC_DisableUsbLineStateBypass);
1188
USBC_EnableHosc(__hdle hUSB)1189 void USBC_EnableHosc(__hdle hUSB)
1190 {
1191 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1192 __u32 reg_val = 0;
1193
1194 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1195 reg_val |= 1 << USBC_BP_ISCR_HOSC_EN;
1196 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1197 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1198 }
1199 EXPORT_SYMBOL(USBC_EnableHosc);
1200
1201 /* forbidde Hosc */
USBC_DisableHosc(__hdle hUSB)1202 void USBC_DisableHosc(__hdle hUSB)
1203 {
1204 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1205 __u32 reg_val = 0;
1206
1207 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1208 reg_val &= ~(1 << USBC_BP_ISCR_HOSC_EN);
1209 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1210 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1211 }
1212 EXPORT_SYMBOL(USBC_DisableHosc);
1213
1214 /* check if vbus irq occur */
USBC_IsVbusChange(__hdle hUSB)1215 __u32 USBC_IsVbusChange(__hdle hUSB)
1216 {
1217 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1218 __u32 reg_val = 0;
1219 __u32 temp = 0;
1220
1221 /* when read the volatile bit, write 1 clear it synchronously. */
1222 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1223
1224 temp = reg_val & (1 << USBC_BP_ISCR_VBUS_CHANGE_DETECT);
1225
1226 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1227 reg_val |= 1 << USBC_BP_ISCR_VBUS_CHANGE_DETECT;
1228 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1229
1230 return temp;
1231 }
1232 EXPORT_SYMBOL(USBC_IsVbusChange);
1233
1234 /* check if id irq occur */
USBC_IsIdChange(__hdle hUSB)1235 __u32 USBC_IsIdChange(__hdle hUSB)
1236 {
1237 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1238 __u32 reg_val = 0;
1239 __u32 temp = 0;
1240
1241 /* when read the volatile bit, write 1 clear it synchronously. */
1242 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1243
1244 temp = reg_val & (1 << USBC_BP_ISCR_ID_CHANGE_DETECT);
1245
1246 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1247 reg_val |= 1 << USBC_BP_ISCR_ID_CHANGE_DETECT;
1248 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1249
1250 return temp;
1251 }
1252 EXPORT_SYMBOL(USBC_IsIdChange);
1253
1254 /* check if dpdm irq occur */
USBC_IsDpDmChange(__hdle hUSB)1255 __u32 USBC_IsDpDmChange(__hdle hUSB)
1256 {
1257 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1258 __u32 reg_val = 0;
1259 __u32 temp = 0;
1260
1261 /* when read the volatile bit, write 1 clear it synchronously. */
1262 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1263
1264 temp = reg_val & (1 << USBC_BP_ISCR_DPDM_CHANGE_DETECT);
1265
1266 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1267 reg_val |= 1 << USBC_BP_ISCR_DPDM_CHANGE_DETECT;
1268 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1269
1270 return temp;
1271 }
1272 EXPORT_SYMBOL(USBC_IsDpDmChange);
1273
1274 /* disable wake irq */
USBC_DisableWakeIrq(__hdle hUSB)1275 void USBC_DisableWakeIrq(__hdle hUSB)
1276 {
1277 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1278 __u32 reg_val = 0;
1279
1280 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1281 reg_val &= ~(1 << USBC_BP_ISCR_IRQ_ENABLE);
1282 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1283 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1284 }
1285 EXPORT_SYMBOL(USBC_DisableWakeIrq);
1286
1287 /* disable vbus irq */
USBC_DisableVbusChange(__hdle hUSB)1288 void USBC_DisableVbusChange(__hdle hUSB)
1289 {
1290 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1291 __u32 reg_val = 0;
1292
1293 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1294 reg_val &= ~(1 << USBC_BP_ISCR_VBUS_CHANGE_DETECT_EN);
1295 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1296 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1297 }
1298 EXPORT_SYMBOL(USBC_DisableVbusChange);
1299
1300 /* disable id irq */
USBC_DisableIdChange(__hdle hUSB)1301 void USBC_DisableIdChange(__hdle hUSB)
1302 {
1303 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1304 __u32 reg_val = 0;
1305
1306 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1307 reg_val &= ~(1 << USBC_BP_ISCR_ID_CHANGE_DETECT_EN);
1308 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1309 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1310 }
1311 EXPORT_SYMBOL(USBC_DisableIdChange);
1312
1313 /* disable dpdm irq */
USBC_DisableDpDmChange(__hdle hUSB)1314 void USBC_DisableDpDmChange(__hdle hUSB)
1315 {
1316 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1317 __u32 reg_val = 0;
1318
1319 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1320 reg_val &= ~(1 << USBC_BP_ISCR_DPDM_CHANGE_DETECT_EN);
1321 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1322 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1323 }
1324 EXPORT_SYMBOL(USBC_DisableDpDmChange);
1325
1326 /* enable wake irq */
USBC_EnableWakeIrq(__hdle hUSB)1327 void USBC_EnableWakeIrq(__hdle hUSB)
1328 {
1329 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1330 __u32 reg_val = 0;
1331
1332 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1333 reg_val |= 1 << USBC_BP_ISCR_IRQ_ENABLE;
1334 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1335 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1336 }
1337 EXPORT_SYMBOL(USBC_EnableWakeIrq);
1338
1339 /* enable vbus irq */
USBC_EnableVbusChange(__hdle hUSB)1340 void USBC_EnableVbusChange(__hdle hUSB)
1341 {
1342 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1343 __u32 reg_val = 0;
1344
1345 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1346 reg_val |= 1 << USBC_BP_ISCR_VBUS_CHANGE_DETECT_EN;
1347 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1348 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1349 }
1350 EXPORT_SYMBOL(USBC_EnableVbusChange);
1351
1352 /* enable id irq */
USBC_EnableIdChange(__hdle hUSB)1353 void USBC_EnableIdChange(__hdle hUSB)
1354 {
1355 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1356 __u32 reg_val = 0;
1357
1358 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1359 reg_val |= 1 << USBC_BP_ISCR_ID_CHANGE_DETECT_EN;
1360 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1361 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1362 }
1363 EXPORT_SYMBOL(USBC_EnableIdChange);
1364
1365 /* enable dmdp irq */
USBC_EnableDpDmChange(__hdle hUSB)1366 void USBC_EnableDpDmChange(__hdle hUSB)
1367 {
1368 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1369 __u32 reg_val = 0;
1370
1371 reg_val = USBC_Readl(USBC_REG_ISCR(usbc_otg->base_addr));
1372 reg_val |= 1 << USBC_BP_ISCR_DPDM_CHANGE_DETECT_EN;
1373 reg_val = __USBC_WakeUp_ClearChangeDetect(reg_val);
1374 USBC_Writel(reg_val, USBC_REG_ISCR(usbc_otg->base_addr));
1375 }
1376 EXPORT_SYMBOL(USBC_EnableDpDmChange);
1377
1378 /* test mode, get the reg value */
USBC_TestMode_ReadReg(__hdle hUSB,__u32 offset,__u32 reg_width)1379 __u32 USBC_TestMode_ReadReg(__hdle hUSB, __u32 offset, __u32 reg_width)
1380 {
1381 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1382 __u32 reg_val = 0;
1383
1384 if (usbc_otg == NULL)
1385 return reg_val;
1386
1387 if (reg_width == 8)
1388 reg_val = USBC_Readb(usbc_otg->base_addr + offset);
1389 else if (reg_width == 16)
1390 reg_val = USBC_Readw(usbc_otg->base_addr + offset);
1391 else if (reg_width == 32)
1392 reg_val = USBC_Readl(usbc_otg->base_addr + offset);
1393 else
1394 reg_val = 0;
1395
1396 return reg_val;
1397 }
1398 EXPORT_SYMBOL(USBC_TestMode_ReadReg);
1399
USBC_open_otg(__u32 otg_no)1400 __hdle USBC_open_otg(__u32 otg_no)
1401 {
1402 __usbc_otg_t *usbc_otg = usbc_otg_array;
1403
1404 usbc_otg->used = 1;
1405 usbc_otg->no = otg_no;
1406 usbc_otg->port_num = otg_no;
1407 usbc_otg->base_addr = usbc_base_address;
1408
1409 return (__hdle)(usbc_otg);
1410 }
1411 EXPORT_SYMBOL(USBC_open_otg);
1412
1413 /**
1414 * release otg's usage
1415 * @hUSB: handle return by USBC_open_otg, include the key data which USBC need
1416 *
1417 * return 0 on success, !0 otherwise.
1418 */
USBC_close_otg(__hdle hUSB)1419 __s32 USBC_close_otg(__hdle hUSB)
1420 {
1421 __usbc_otg_t *usbc_otg = (__usbc_otg_t *)hUSB;
1422
1423 if (usbc_otg == NULL)
1424 return -1;
1425
1426 memset(usbc_otg, 0, sizeof(__usbc_otg_t));
1427
1428 return 0;
1429 }
1430 EXPORT_SYMBOL(USBC_close_otg);
1431
USBC_init(bsp_usbc_t * usbc)1432 __s32 USBC_init(bsp_usbc_t *usbc)
1433 {
1434 if (usbc->usbc_info.base)
1435 usbc_base_address = usbc->usbc_info.base;
1436
1437 return 0;
1438 }
1439 EXPORT_SYMBOL(USBC_init);
1440
USBC_exit(bsp_usbc_t * usbc)1441 __s32 USBC_exit(bsp_usbc_t *usbc)
1442 {
1443 __usbc_otg_t *usbc_otg = usbc_otg_array;
1444
1445 memset(&usbc_info_g, 0, sizeof(__fifo_info_t));
1446 memset(usbc_otg, 0, (USBC_MAX_OPEN_NUM * sizeof(__usbc_otg_t)));
1447
1448 return 0;
1449 }
1450 EXPORT_SYMBOL(USBC_exit);
1451