• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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