add ltq-hcd
[openwrt/staging/yousong.git] / package / platform / lantiq / ltq-hcd / src / ifxusb_cif.c
1 /*****************************************************************************
2 ** FILE NAME : ifxusb_cif.c
3 ** PROJECT : IFX USB sub-system V3
4 ** MODULES : IFX USB sub-system Host and Device driver
5 ** SRC VERSION : 1.0
6 ** SRC VERSION : 3.2
7 ** DATE : 1/Jan/2011
8 ** DESCRIPTION : The Core Interface provides basic services for accessing and
9 ** managing the IFX USB hardware. These services are used by both the
10 ** Host Controller Driver and the Peripheral Controller Driver.
11 ** FUNCTIONS :
12 ** COMPILER : gcc
13 ** REFERENCE : Synopsys DWC-OTG Driver 2.7
14 ** COPYRIGHT : Copyright (c) 2010
15 ** LANTIQ DEUTSCHLAND GMBH,
16 ** Am Campeon 3, 85579 Neubiberg, Germany
17 **
18 ** This program is free software; you can redistribute it and/or modify
19 ** it under the terms of the GNU General Public License as published by
20 ** the Free Software Foundation; either version 2 of the License, or
21 ** (at your option) any later version.
22 **
23 ** Version Control Section **
24 ** $Author$
25 ** $Date$
26 ** $Revisions$
27 ** $Log$ Revision history
28 *****************************************************************************/
29
30 /*
31 * This file contains code fragments from Synopsys HS OTG Linux Software Driver.
32 * For this code the following notice is applicable:
33 *
34 * ==========================================================================
35 *
36 * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
37 * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless
38 * otherwise expressly agreed to in writing between Synopsys and you.
39 *
40 * The Software IS NOT an item of Licensed Software or Licensed Product under
41 * any End User Software License Agreement or Agreement for Licensed Product
42 * with Synopsys or any supplement thereto. You are permitted to use and
43 * redistribute this Software in source and binary forms, with or without
44 * modification, provided that redistributions of source code must retain this
45 * notice. You may not view, use, disclose, copy or distribute this file or
46 * any information contained herein except pursuant to this license grant from
47 * Synopsys. If you do not agree with this notice, including the disclaimer
48 * below, then you are not authorized to use the Software.
49 *
50 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS
51 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
52 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
53 * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT,
54 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
55 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
56 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
57 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
58 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
59 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
60 * DAMAGE.
61 * ========================================================================== */
62
63 /*!
64 \file ifxusb_cif.c
65 \ingroup IFXUSB_DRIVER_V3
66 \brief This file contains the interface to the IFX USB Core.
67 */
68
69 #include <linux/version.h>
70 #include "ifxusb_version.h"
71
72 #include <asm/byteorder.h>
73 #include <asm/unaligned.h>
74
75 #ifdef __DEBUG__
76 #include <linux/jiffies.h>
77 #include <linux/platform_device.h>
78 #include <linux/kernel.h>
79 #include <linux/ioport.h>
80 #endif
81
82
83 #include "ifxusb_plat.h"
84 #include "ifxusb_regs.h"
85 #include "ifxusb_cif.h"
86
87
88 #ifdef __IS_DEVICE__
89 #include "ifxpcd.h"
90 #endif
91
92 #ifdef __IS_HOST__
93 #include "ifxhcd.h"
94 #endif
95
96 #include <linux/mm.h>
97
98 #include <linux/gfp.h>
99
100 #include <lantiq_soc.h>
101
102 #if defined(__UEIP__)
103 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
104 #ifndef USB_CTRL_PMU_SETUP
105 #define USB_CTRL_PMU_SETUP(__x) USB0_CTRL_PMU_SETUP(__x)
106 #endif
107 #ifndef USB_PHY_PMU_SETUP
108 #define USB_PHY_PMU_SETUP(__x) USB0_PHY_PMU_SETUP(__x)
109 #endif
110 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
111 #endif // defined(__UEIP__)
112
113 /*!
114 \brief This function is called to allocate buffer of specified size.
115 The allocated buffer is mapped into DMA accessable address.
116 \param size Size in BYTE to be allocated
117 \param clear 0: don't do clear after buffer allocated, other: do clear to zero
118 \return 0/NULL: Fail; uncached pointer of allocated buffer
119 */
120 #ifdef __IS_HOST__
121 void *ifxusb_alloc_buf_h(size_t size, int clear)
122 #else
123 void *ifxusb_alloc_buf_d(size_t size, int clear)
124 #endif
125 {
126 uint32_t *cached,*uncached;
127 uint32_t totalsize,page;
128
129 if(!size)
130 return 0;
131
132 size=(size+3)&0xFFFFFFFC;
133 totalsize=size + 12;
134 page=get_order(totalsize);
135
136 cached = (void *) __get_free_pages(( GFP_ATOMIC | GFP_DMA), page);
137
138 if(!cached)
139 {
140 IFX_PRINT("%s Allocation Failed size:%d\n",__func__,size);
141 return NULL;
142 }
143
144 uncached = (uint32_t *)(KSEG1ADDR(cached));
145 if(clear)
146 memset(uncached, 0, totalsize);
147
148 *(uncached+0)=totalsize;
149 *(uncached+1)=page;
150 *(uncached+2)=(uint32_t)cached;
151 return (void *)(uncached+3);
152 }
153
154
155 /*!
156 \brief This function is called to free allocated buffer.
157 \param vaddr the uncached pointer of the buffer
158 */
159 #ifdef __IS_HOST__
160 void ifxusb_free_buf_h(void *vaddr)
161 #else
162 void ifxusb_free_buf_d(void *vaddr)
163 #endif
164 {
165 uint32_t totalsize,page;
166 uint32_t *cached,*uncached;
167
168 if(vaddr != NULL)
169 {
170 uncached=vaddr;
171 uncached-=3;
172 totalsize=*(uncached+0);
173 page=*(uncached+1);
174 cached=(uint32_t *)(*(uncached+2));
175 if(totalsize && page==get_order(totalsize) && cached==(uint32_t *)(KSEG0ADDR(uncached)))
176 {
177 free_pages((unsigned long)cached, page);
178 return;
179 }
180 // the memory is not allocated by ifxusb_alloc_buf. Allowed but must be careful.
181 return;
182 }
183 }
184
185
186
187 /*!
188 \brief This function is called to initialize the IFXUSB CSR data
189 structures. The register addresses in the device and host
190 structures are initialized from the base address supplied by the
191 caller. The calling function must make the OS calls to get the
192 base address of the IFXUSB controller registers.
193
194 \param _core_if Pointer of core_if structure
195 \param _irq irq number
196 \param _reg_base_addr Base address of IFXUSB core registers
197 \param _fifo_base_addr Fifo base address
198 \param _fifo_dbg_addr Fifo debug address
199 \return 0: success;
200 */
201 #ifdef __IS_HOST__
202 int ifxusb_core_if_init_h(ifxusb_core_if_t *_core_if,
203 #else
204 int ifxusb_core_if_init_d(ifxusb_core_if_t *_core_if,
205 #endif
206 int _irq,
207 uint32_t _reg_base_addr,
208 uint32_t _fifo_base_addr,
209 uint32_t _fifo_dbg_addr)
210 {
211 int retval = 0;
212 uint32_t *reg_base =NULL;
213 uint32_t *fifo_base =NULL;
214 uint32_t *fifo_dbg =NULL;
215
216 int i;
217
218 IFX_DEBUGPL(DBG_CILV, "%s(%p,%d,0x%08X,0x%08X,0x%08X)\n", __func__,
219 _core_if,
220 _irq,
221 _reg_base_addr,
222 _fifo_base_addr,
223 _fifo_dbg_addr);
224
225 if( _core_if == NULL)
226 {
227 IFX_ERROR("%s() invalid _core_if\n", __func__);
228 retval = -ENOMEM;
229 goto fail;
230 }
231
232 //memset(_core_if, 0, sizeof(ifxusb_core_if_t));
233
234 _core_if->irq=_irq;
235
236 reg_base =ioremap_nocache(_reg_base_addr , IFXUSB_IOMEM_SIZE );
237 fifo_base =ioremap_nocache(_fifo_base_addr, IFXUSB_FIFOMEM_SIZE);
238 fifo_dbg =ioremap_nocache(_fifo_dbg_addr , IFXUSB_FIFODBG_SIZE);
239 if( reg_base == NULL || fifo_base == NULL || fifo_dbg == NULL)
240 {
241 IFX_ERROR("%s() usb ioremap() failed\n", __func__);
242 retval = -ENOMEM;
243 goto fail;
244 }
245
246 _core_if->core_global_regs = (ifxusb_core_global_regs_t *)reg_base;
247
248 /*
249 * Attempt to ensure this device is really a IFXUSB Controller.
250 * Read and verify the SNPSID register contents. The value should be
251 * 0x45F42XXX
252 */
253 {
254 int32_t snpsid;
255 snpsid = ifxusb_rreg(&_core_if->core_global_regs->gsnpsid);
256 if ((snpsid & 0xFFFFF000) != 0x4F542000)
257 {
258 IFX_ERROR("%s() snpsid error(0x%08x) failed\n", __func__,snpsid);
259 retval = -EINVAL;
260 goto fail;
261 }
262 _core_if->snpsid=snpsid;
263 }
264
265 #ifdef __IS_HOST__
266 _core_if->host_global_regs = (ifxusb_host_global_regs_t *)
267 ((uint32_t)reg_base + IFXUSB_HOST_GLOBAL_REG_OFFSET);
268 _core_if->hprt0 = (uint32_t*)((uint32_t)reg_base + IFXUSB_HOST_PORT_REGS_OFFSET);
269
270 for (i=0; i<MAX_EPS_CHANNELS; i++)
271 {
272 _core_if->hc_regs[i] = (ifxusb_hc_regs_t *)
273 ((uint32_t)reg_base + IFXUSB_HOST_CHAN_REGS_OFFSET +
274 (i * IFXUSB_CHAN_REGS_OFFSET));
275 IFX_DEBUGPL(DBG_CILV, "hc_reg[%d]->hcchar=%p\n",
276 i, &_core_if->hc_regs[i]->hcchar);
277 }
278 #endif //__IS_HOST__
279
280 #ifdef __IS_DEVICE__
281 _core_if->dev_global_regs =
282 (ifxusb_device_global_regs_t *)((uint32_t)reg_base + IFXUSB_DEV_GLOBAL_REG_OFFSET);
283
284 for (i=0; i<MAX_EPS_CHANNELS; i++)
285 {
286 _core_if->in_ep_regs[i] = (ifxusb_dev_in_ep_regs_t *)
287 ((uint32_t)reg_base + IFXUSB_DEV_IN_EP_REG_OFFSET +
288 (i * IFXUSB_EP_REG_OFFSET));
289 _core_if->out_ep_regs[i] = (ifxusb_dev_out_ep_regs_t *)
290 ((uint32_t)reg_base + IFXUSB_DEV_OUT_EP_REG_OFFSET +
291 (i * IFXUSB_EP_REG_OFFSET));
292 IFX_DEBUGPL(DBG_CILV, "in_ep_regs[%d]->diepctl=%p/%p %p/0x%08X/0x%08X\n",
293 i, &_core_if->in_ep_regs[i]->diepctl, _core_if->in_ep_regs[i],
294 reg_base,IFXUSB_DEV_IN_EP_REG_OFFSET,(i * IFXUSB_EP_REG_OFFSET)
295 );
296 IFX_DEBUGPL(DBG_CILV, "out_ep_regs[%d]->doepctl=%p/%p %p/0x%08X/0x%08X\n",
297 i, &_core_if->out_ep_regs[i]->doepctl, _core_if->out_ep_regs[i],
298 reg_base,IFXUSB_DEV_OUT_EP_REG_OFFSET,(i * IFXUSB_EP_REG_OFFSET)
299 );
300 }
301 #endif //__IS_DEVICE__
302
303 /* Setting the FIFO and other Address. */
304 for (i=0; i<MAX_EPS_CHANNELS; i++)
305 {
306 _core_if->data_fifo[i] = fifo_base + (i * IFXUSB_DATA_FIFO_SIZE);
307 IFX_DEBUGPL(DBG_CILV, "data_fifo[%d]=0x%08x\n",
308 i, (unsigned)_core_if->data_fifo[i]);
309 }
310
311 _core_if->data_fifo_dbg = fifo_dbg;
312 _core_if->pcgcctl = (uint32_t*)(((uint32_t)reg_base) + IFXUSB_PCGCCTL_OFFSET);
313
314 /*
315 * Store the contents of the hardware configuration registers here for
316 * easy access later.
317 */
318 _core_if->hwcfg1.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg1);
319 _core_if->hwcfg2.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg2);
320 _core_if->hwcfg3.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg3);
321 _core_if->hwcfg4.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg4);
322
323 IFX_DEBUGPL(DBG_CILV,"hwcfg1=%08x\n",_core_if->hwcfg1.d32);
324 IFX_DEBUGPL(DBG_CILV,"hwcfg2=%08x\n",_core_if->hwcfg2.d32);
325 IFX_DEBUGPL(DBG_CILV,"hwcfg3=%08x\n",_core_if->hwcfg3.d32);
326 IFX_DEBUGPL(DBG_CILV,"hwcfg4=%08x\n",_core_if->hwcfg4.d32);
327
328
329 #ifdef __DED_FIFO__
330 {
331 unsigned int countdown=0xFFFF;
332 IFX_PRINT("Waiting for PHY Clock Lock!\n");
333 while(--countdown && !( ifxusb_rreg(&_core_if->core_global_regs->grxfsiz) & (1<<9)))
334 {
335 UDELAY(1);
336 }
337 if(countdown)
338 IFX_PRINT("PHY Clock Locked!\n");
339 else
340 IFX_PRINT("PHY Clock Not Locked! %08X\n",ifxusb_rreg(&_core_if->core_global_regs->grxfsiz));
341 }
342 #endif
343
344 /* Create new workqueue and init works */
345 #if 0
346 _core_if->wq_usb = create_singlethread_workqueue(_core_if->core_name);
347
348 if(_core_if->wq_usb == 0)
349 {
350 IFX_DEBUGPL(DBG_CIL, "Creation of wq_usb failed\n");
351 retval = -EINVAL;
352 goto fail;
353 }
354
355 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
356 INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change, core_if);
357 INIT_WORK(&core_if->w_wkp, w_wakeup_detected, core_if);
358 #else
359 INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change);
360 INIT_DELAYED_WORK(&core_if->w_wkp, w_wakeup_detected);
361 #endif
362 #endif
363 return 0;
364
365 fail:
366 if( reg_base != NULL) iounmap(reg_base );
367 if( fifo_base != NULL) iounmap(fifo_base);
368 if( fifo_dbg != NULL) iounmap(fifo_dbg );
369 return retval;
370 }
371
372 /*!
373 \brief This function free the mapped address in the IFXUSB CSR data structures.
374 \param _core_if Pointer of core_if structure
375 */
376 #ifdef __IS_HOST__
377 void ifxusb_core_if_remove_h(ifxusb_core_if_t *_core_if)
378 #else
379 void ifxusb_core_if_remove_d(ifxusb_core_if_t *_core_if)
380 #endif
381 {
382 /* Disable all interrupts */
383 if( _core_if->core_global_regs != NULL)
384 {
385 gusbcfg_data_t usbcfg ={.d32 = 0};
386 usbcfg.d32 = ifxusb_rreg( &_core_if->core_global_regs->gusbcfg);
387 usbcfg.b.ForceDevMode=0;
388 usbcfg.b.ForceHstMode=0;
389 ifxusb_wreg( &_core_if->core_global_regs->gusbcfg,usbcfg.d32);
390 ifxusb_mreg( &_core_if->core_global_regs->gahbcfg, 1, 0);
391 ifxusb_wreg( &_core_if->core_global_regs->gintmsk, 0);
392 }
393
394 if( _core_if->core_global_regs != NULL) iounmap(_core_if->core_global_regs );
395 if( _core_if->data_fifo[0] != NULL) iounmap(_core_if->data_fifo[0] );
396 if( _core_if->data_fifo_dbg != NULL) iounmap(_core_if->data_fifo_dbg );
397
398 #if 0
399 if (_core_if->wq_usb)
400 destroy_workqueue(_core_if->wq_usb);
401 #endif
402 memset(_core_if, 0, sizeof(ifxusb_core_if_t));
403 }
404
405
406
407
408 /*!
409 \brief This function enbles the controller's Global Interrupt in the AHB Config register.
410 \param _core_if Pointer of core_if structure
411 */
412 #ifdef __IS_HOST__
413 void ifxusb_enable_global_interrupts_h( ifxusb_core_if_t *_core_if )
414 #else
415 void ifxusb_enable_global_interrupts_d( ifxusb_core_if_t *_core_if )
416 #endif
417 {
418 gahbcfg_data_t ahbcfg ={ .d32 = 0};
419 ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */
420 ifxusb_mreg(&_core_if->core_global_regs->gahbcfg, 0, ahbcfg.d32);
421 }
422
423 /*!
424 \brief This function disables the controller's Global Interrupt in the AHB Config register.
425 \param _core_if Pointer of core_if structure
426 */
427 #ifdef __IS_HOST__
428 void ifxusb_disable_global_interrupts_h( ifxusb_core_if_t *_core_if )
429 #else
430 void ifxusb_disable_global_interrupts_d( ifxusb_core_if_t *_core_if )
431 #endif
432 {
433 gahbcfg_data_t ahbcfg ={ .d32 = 0};
434 ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */
435 ifxusb_mreg(&_core_if->core_global_regs->gahbcfg, ahbcfg.d32, 0);
436 }
437
438
439
440
441 /*!
442 \brief Flush Tx and Rx FIFO.
443 \param _core_if Pointer of core_if structure
444 */
445 #ifdef __IS_HOST__
446 void ifxusb_flush_both_fifo_h( ifxusb_core_if_t *_core_if )
447 #else
448 void ifxusb_flush_both_fifo_d( ifxusb_core_if_t *_core_if )
449 #endif
450 {
451 ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
452 volatile grstctl_t greset ={ .d32 = 0};
453 int count = 0;
454
455 IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "%s\n", __func__);
456 greset.b.rxfflsh = 1;
457 greset.b.txfflsh = 1;
458 greset.b.txfnum = 0x10;
459 greset.b.intknqflsh=1;
460 greset.b.hstfrm=1;
461 ifxusb_wreg( &global_regs->grstctl, greset.d32 );
462
463 do
464 {
465 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
466 if (++count > 10000)
467 {
468 IFX_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, greset.d32);
469 break;
470 }
471 } while (greset.b.rxfflsh == 1 || greset.b.txfflsh == 1);
472 /* Wait for 3 PHY Clocks*/
473 UDELAY(1);
474 }
475
476 /*!
477 \brief Flush a Tx FIFO.
478 \param _core_if Pointer of core_if structure
479 \param _num Tx FIFO to flush. ( 0x10 for ALL TX FIFO )
480 */
481 #ifdef __IS_HOST__
482 void ifxusb_flush_tx_fifo_h( ifxusb_core_if_t *_core_if, const int _num )
483 #else
484 void ifxusb_flush_tx_fifo_d( ifxusb_core_if_t *_core_if, const int _num )
485 #endif
486 {
487 ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
488 volatile grstctl_t greset ={ .d32 = 0};
489 int count = 0;
490
491 IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "Flush Tx FIFO %d\n", _num);
492
493 greset.b.intknqflsh=1;
494 greset.b.txfflsh = 1;
495 greset.b.txfnum = _num;
496 ifxusb_wreg( &global_regs->grstctl, greset.d32 );
497
498 do
499 {
500 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
501 if (++count > 10000&&(_num==0 ||_num==0x10))
502 {
503 IFX_WARN("%s() HANG! GRSTCTL=%0x GNPTXSTS=0x%08x\n",
504 __func__, greset.d32,
505 ifxusb_rreg( &global_regs->gnptxsts));
506 break;
507 }
508 } while (greset.b.txfflsh == 1);
509 /* Wait for 3 PHY Clocks*/
510 UDELAY(1);
511 }
512
513
514 /*!
515 \brief Flush Rx FIFO.
516 \param _core_if Pointer of core_if structure
517 */
518 #ifdef __IS_HOST__
519 void ifxusb_flush_rx_fifo_h( ifxusb_core_if_t *_core_if )
520 #else
521 void ifxusb_flush_rx_fifo_d( ifxusb_core_if_t *_core_if )
522 #endif
523 {
524 ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
525 volatile grstctl_t greset ={ .d32 = 0};
526 int count = 0;
527
528 IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "%s\n", __func__);
529 greset.b.rxfflsh = 1;
530 ifxusb_wreg( &global_regs->grstctl, greset.d32 );
531
532 do
533 {
534 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
535 if (++count > 10000)
536 {
537 IFX_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, greset.d32);
538 break;
539 }
540 } while (greset.b.rxfflsh == 1);
541 /* Wait for 3 PHY Clocks*/
542 UDELAY(1);
543 }
544
545
546 #define SOFT_RESET_DELAY 100 /*!< Delay in msec of detection after soft-reset of usb core */
547
548 /*!
549 \brief Do a soft reset of the core. Be careful with this because it
550 resets all the internal state machines of the core.
551 \param _core_if Pointer of core_if structure
552 */
553 #ifdef __IS_HOST__
554 int ifxusb_core_soft_reset_h(ifxusb_core_if_t *_core_if)
555 #else
556 int ifxusb_core_soft_reset_d(ifxusb_core_if_t *_core_if)
557 #endif
558 {
559 ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
560 volatile grstctl_t greset ={ .d32 = 0};
561 int count = 0;
562
563 IFX_DEBUGPL(DBG_CILV, "%s\n", __func__);
564 /* Wait for AHB master IDLE state. */
565 do
566 {
567 UDELAY(10);
568 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
569 if (++count > 100000)
570 {
571 IFX_WARN("%s() HANG! AHB Idle GRSTCTL=%0x %x\n", __func__,
572 greset.d32, greset.b.ahbidle);
573 break;
574 }
575 } while (greset.b.ahbidle == 0);
576
577 UDELAY(1);
578
579 /* Core Soft Reset */
580 count = 0;
581 greset.b.csftrst = 1;
582 ifxusb_wreg( &global_regs->grstctl, greset.d32 );
583
584 #ifdef SOFT_RESET_DELAY
585 MDELAY(SOFT_RESET_DELAY);
586 #endif
587
588 do
589 {
590 UDELAY(10);
591 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
592 if (++count > 100000)
593 {
594 IFX_WARN("%s() HANG! Soft Reset GRSTCTL=%0x\n", __func__, greset.d32);
595 return -1;
596 }
597 } while (greset.b.csftrst == 1);
598
599 #ifdef SOFT_RESET_DELAY
600 MDELAY(SOFT_RESET_DELAY);
601 #endif
602
603 // This is to reset the PHY of VR9
604 #if defined(__IS_VR9__)
605 if(_core_if->core_no==0)
606 {
607 set_bit (4, VR9_RCU_USBRESET2);
608 MDELAY(50);
609 clear_bit (4, VR9_RCU_USBRESET2);
610 }
611 else
612 {
613 set_bit (5, VR9_RCU_USBRESET2);
614 MDELAY(50);
615 clear_bit (5, VR9_RCU_USBRESET2);
616 }
617 MDELAY(50);
618 #endif //defined(__IS_VR9__)
619
620 IFX_PRINT("USB core #%d soft-reset\n",_core_if->core_no);
621
622 return 0;
623 }
624
625 /*!
626 \brief Turn on the USB Core Power
627 \param _core_if Pointer of core_if structure
628 */
629 #ifdef __IS_HOST__
630 void ifxusb_power_on_h (ifxusb_core_if_t *_core_if)
631 #else
632 void ifxusb_power_on_d (ifxusb_core_if_t *_core_if)
633 #endif
634 {
635 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
636 #if defined(__UEIP__)
637
638 // set clock gating
639 #if defined(__IS_TWINPASS) || defined(__IS_DANUBE__)
640 set_bit (4, (volatile unsigned long *)DANUBE_CGU_IFCCR);
641 set_bit (5, (volatile unsigned long *)DANUBE_CGU_IFCCR);
642 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
643 #if defined(__IS_AMAZON_SE__)
644 // clear_bit (4, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR);
645 clear_bit (5, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR);
646 #endif //defined(__IS_AMAZON_SE__)
647 #if defined(__IS_AR9__)
648 set_bit (0, (volatile unsigned long *)AR9_CGU_IFCCR);
649 set_bit (1, (volatile unsigned long *)AR9_CGU_IFCCR);
650 #endif //defined(__IS_AR9__)
651 #if defined(__IS_VR9__)
652 // set_bit (0, (volatile unsigned long *)VR9_CGU_IFCCR);
653 // set_bit (1, (volatile unsigned long *)VR9_CGU_IFCCR);
654 #endif //defined(__IS_VR9__)
655 #if defined(__IS_AR10__)
656 // set_bit (0, (volatile unsigned long *)VR9_CGU_IFCCR);
657 // set_bit (1, (volatile unsigned long *)VR9_CGU_IFCCR);
658 #endif //defined(__IS_AR10__)
659
660 MDELAY(50);
661 #define PMU_AHBM BIT(15)
662 #define PMU_USB0 BIT(6)
663 #define PMU_USB1 BIT(27)
664 #define PMU_USB0_P BIT(0)
665 #define PMU_USB1_P BIT(26)
666 // set power
667 ltq_pmu_enable(PMU_AHBM);
668 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
669 ltq_pmu_enable(PMU_USB0);
670 //#if defined(__IS_TWINPASS__)
671 // ifxusb_enable_afe_oc();
672 //#endif
673 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
674 #if defined(__IS_AR9__) || defined(__IS_VR9__)
675 if(_core_if->core_no==0)
676 ltq_pmu_enable(PMU_USB0);
677 else
678 ltq_pmu_enable(PMU_USB1);
679 #endif //defined(__IS_AR9__) || defined(__IS_VR9__)
680 #if defined(__IS_AR10__)
681 //if(_core_if->core_no==0)
682 // USB0_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
683 //else
684 // USB1_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
685 #endif //defined(__IS_AR10__)
686
687 MDELAY(50);
688
689 if(_core_if->pcgcctl)
690 {
691 pcgcctl_data_t pcgcctl = {.d32=0};
692 pcgcctl.b.gatehclk = 1;
693 ifxusb_mreg(_core_if->pcgcctl, pcgcctl.d32, 0);
694 }
695
696
697 if(_core_if->core_global_regs)
698 {
699 // PHY configurations.
700 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
701 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
702 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
703 #if defined(__IS_AMAZON_SE__)
704 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
705 #endif //defined(__IS_AMAZON_SE__)
706 #if defined(__IS_AR9__)
707 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
708 #endif //defined(__IS_AR9__)
709 #if defined(__IS_VR9__)
710 //ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
711 #endif //defined(__IS_VR9__)
712 #if defined(__IS_AR10__)
713 //ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
714 #endif //defined(__IS_AR10__)
715 }
716 #else //defined(__UEIP__)
717 // set clock gating
718 #if defined(__IS_TWINPASS) || defined(__IS_DANUBE__)
719 set_bit (4, (volatile unsigned long *)DANUBE_CGU_IFCCR);
720 set_bit (5, (volatile unsigned long *)DANUBE_CGU_IFCCR);
721 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
722 #if defined(__IS_AMAZON_SE__)
723 // clear_bit (4, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR);
724 clear_bit (5, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR);
725 #endif //defined(__IS_AMAZON_SE__)
726 #if defined(__IS_AR9__)
727 set_bit (0, (volatile unsigned long *)AMAZON_S_CGU_IFCCR);
728 set_bit (1, (volatile unsigned long *)AMAZON_S_CGU_IFCCR);
729 #endif //defined(__IS_AR9__)
730
731 MDELAY(50);
732
733 // set power
734 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
735 clear_bit (6, (volatile unsigned long *)DANUBE_PMU_PWDCR);//USB
736 clear_bit (9, (volatile unsigned long *)DANUBE_PMU_PWDCR);//DSL
737 clear_bit (15, (volatile unsigned long *)DANUBE_PMU_PWDCR);//AHB
738 #if defined(__IS_TWINPASS__)
739 ifxusb_enable_afe_oc();
740 #endif
741 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
742 #if defined(__IS_AMAZON_SE__)
743 clear_bit (6, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);
744 clear_bit (9, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);
745 clear_bit (15, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);
746 #endif //defined(__IS_AMAZON_SE__)
747 #if defined(__IS_AR9__)
748 if(_core_if->core_no==0)
749 clear_bit (6, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
750 else
751 clear_bit (27, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
752 clear_bit (9, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//DSL
753 clear_bit (15, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//AHB
754 #endif //defined(__IS_AR9__)
755
756 if(_core_if->core_global_regs)
757 {
758 // PHY configurations.
759 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
760 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
761 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
762 #if defined(__IS_AMAZON_SE__)
763 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
764 #endif //defined(__IS_AMAZON_SE__)
765 #if defined(__IS_AR9__)
766 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
767 #endif //defined(__IS_AR9__)
768 }
769
770 #endif //defined(__UEIP__)
771 }
772
773 /*!
774 \brief Turn off the USB Core Power
775 \param _core_if Pointer of core_if structure
776 */
777 #ifdef __IS_HOST__
778 void ifxusb_power_off_h (ifxusb_core_if_t *_core_if)
779 #else
780 void ifxusb_power_off_d (ifxusb_core_if_t *_core_if)
781 #endif
782
783 {
784 #ifdef __IS_HOST__
785 ifxusb_phy_power_off_h (_core_if);
786 #else
787 ifxusb_phy_power_off_d (_core_if);
788 #endif
789
790 #if defined(__UEIP__)
791 //AHBM_PMU_SETUP(IFX_PMU_DISABLE);
792 // set power
793 if(_core_if->pcgcctl)
794 {
795 pcgcctl_data_t pcgcctl = {.d32=0};
796 pcgcctl.b.gatehclk = 1;
797 pcgcctl.b.stoppclk = 1;
798 ifxusb_mreg(_core_if->pcgcctl, 0, pcgcctl.d32);
799 }
800 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
801 //USB_CTRL_PMU_SETUP(IFX_PMU_DISABLE);
802 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
803 #if defined(__IS_AR9__) || defined(__IS_VR9__)
804 /* if(_core_if->core_no==0)
805 USB0_CTRL_PMU_SETUP(IFX_PMU_DISABLE);
806 else
807 USB1_CTRL_PMU_SETUP(IFX_PMU_DISABLE);*/
808 #endif //defined(__IS_AR9__) || defined(__IS_VR9__)
809 #if defined(__IS_AR10__)
810 //if(_core_if->core_no==0)
811 // USB0_CTRL_PMU_SETUP(IFX_PMU_DISABLE);
812 //else
813 // USB1_CTRL_PMU_SETUP(IFX_PMU_DISABLE);
814 #endif //defined(__IS_AR10__)
815 #else //defined(__UEIP__)
816 // set power
817 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
818 set_bit (6, (volatile unsigned long *)DANUBE_PMU_PWDCR);//USB
819 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
820 #if defined(__IS_AMAZON_SE__)
821 set_bit (6, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);//USB
822 #endif //defined(__IS_AMAZON_SE__)
823 #if defined(__IS_AR9__)
824 if(_core_if->core_no==0)
825 set_bit (6, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
826 else
827 set_bit (27, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
828 #endif //defined(__IS_AR9__)
829 #endif //defined(__UEIP__)
830 }
831
832 /*!
833 \brief Turn on the USB PHY Power
834 \param _core_if Pointer of core_if structure
835 */
836 #ifdef __IS_HOST__
837 void ifxusb_phy_power_on_h (ifxusb_core_if_t *_core_if)
838 #else
839 void ifxusb_phy_power_on_d (ifxusb_core_if_t *_core_if)
840 #endif
841 {
842 #if defined(__UEIP__)
843 if(_core_if->core_global_regs)
844 {
845 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
846 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
847 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
848 #if defined(__IS_AMAZON_SE__)
849 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
850 #endif //defined(__IS_AMAZON_SE__)
851 #if defined(__IS_AR9__)
852 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
853 #endif //defined(__IS_AR9__)
854 #if ( defined(__IS_VR9__) || defined(__IS_AR10__)) && defined(__PHY_LONG_PREEMP__)
855 if(_core_if->core_no==0)
856 set_bit (0, VR9_RCU_USB_ANA_CFG1A);
857 else
858 set_bit (0, VR9_RCU_USB_ANA_CFG1B);
859 #endif //( defined(__IS_VR9__) || defined(__IS_AR10__)) && defined(__PHY_LONG_PREEMP__)
860
861 if(_core_if->pcgcctl)
862 {
863 pcgcctl_data_t pcgcctl = {.d32=0};
864 pcgcctl.b.stoppclk = 1;
865 ifxusb_mreg(_core_if->pcgcctl, pcgcctl.d32, 0);
866 }
867 }
868
869 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
870 ltq_pmu_enable(PMU_USB0_P);
871 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
872 #if defined(__IS_AR9__) || defined(__IS_VR9__) || defined(__IS_AR10__)
873 if(_core_if->core_no==0)
874 ltq_pmu_enable(PMU_USB0_P);
875 else
876 ltq_pmu_enable(PMU_USB1_P);
877 #endif //defined(__IS_AR9__) || defined(__IS_VR9__)
878
879 // PHY configurations.
880 if(_core_if->core_global_regs)
881 {
882 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
883 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
884 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
885 #if defined(__IS_AMAZON_SE__)
886 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
887 #endif //defined(__IS_AMAZON_SE__)
888 #if defined(__IS_AR9__)
889 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
890 #endif //defined(__IS_AR9__)
891 #if ( defined(__IS_VR9__) || defined(__IS_AR10__)) && defined(__PHY_LONG_PREEMP__)
892 if(_core_if->core_no==0)
893 set_bit (0, VR9_RCU_USB_ANA_CFG1A);
894 else
895 set_bit (0, VR9_RCU_USB_ANA_CFG1B);
896 #endif //( defined(__IS_VR9__) || defined(__IS_AR10__)) && defined(__PHY_LONG_PREEMP__)
897 }
898 #else //defined(__UEIP__)
899 // PHY configurations.
900 if(_core_if->core_global_regs)
901 {
902 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
903 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
904 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
905 #if defined(__IS_AMAZON_SE__)
906 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
907 #endif //defined(__IS_AMAZON_SE__)
908 #if defined(__IS_AR9__)
909 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
910 #endif //defined(__IS_AR9__)
911 }
912
913 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
914 clear_bit (0, (volatile unsigned long *)DANUBE_PMU_PWDCR);//PHY
915 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
916 #if defined(__IS_AMAZON_SE__)
917 clear_bit (0, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);
918 #endif //defined(__IS_AMAZON_SE__)
919 #if defined(__IS_AR9__)
920 if(_core_if->core_no==0)
921 clear_bit (0, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
922 else
923 clear_bit (26, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
924 #endif //defined(__IS_AR9__)
925
926 // PHY configurations.
927 if(_core_if->core_global_regs)
928 {
929 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
930 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
931 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
932 #if defined(__IS_AMAZON_SE__)
933 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
934 #endif //defined(__IS_AMAZON_SE__)
935 #if defined(__IS_AR9__)
936 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
937 #endif //defined(__IS_AR9__)
938 }
939 #endif //defined(__UEIP__)
940 }
941
942
943 /*!
944 \brief Turn off the USB PHY Power
945 \param _core_if Pointer of core_if structure
946 */
947 #ifdef __IS_HOST__
948 void ifxusb_phy_power_off_h (ifxusb_core_if_t *_core_if)
949 #else
950 void ifxusb_phy_power_off_d (ifxusb_core_if_t *_core_if)
951 #endif
952 {
953 #if defined(__UEIP__)
954 if(_core_if->pcgcctl)
955 {
956 pcgcctl_data_t pcgcctl = {.d32=0};
957 pcgcctl.b.stoppclk = 1;
958 ifxusb_mreg(_core_if->pcgcctl, 0, pcgcctl.d32);
959 }
960 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
961 //USB_PHY_PMU_SETUP(IFX_PMU_DISABLE);
962 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
963 #if defined(__IS_AR9__) || defined(__IS_VR9__) || defined(__IS_AR10__)
964 /* if(_core_if->core_no==0)
965 USB0_PHY_PMU_SETUP(IFX_PMU_DISABLE);
966 else
967 USB1_PHY_PMU_SETUP(IFX_PMU_DISABLE);*/
968 #endif // defined(__IS_AR9__) || defined(__IS_VR9__)
969 #else //defined(__UEIP__)
970 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
971 set_bit (0, (volatile unsigned long *)DANUBE_PMU_PWDCR);//PHY
972 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
973 #if defined(__IS_AMAZON_SE__)
974 set_bit (0, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);//PHY
975 #endif //defined(__IS_AMAZON_SE__)
976 #if defined(__IS_AR9__)
977 if(_core_if->core_no==0)
978 set_bit (0, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
979 else
980 set_bit (26, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
981 #endif //defined(__IS_AR9__)
982 #endif //defined(__UEIP__)
983 }
984
985
986 /*!
987 \brief Reset on the USB Core RCU
988 \param _core_if Pointer of core_if structure
989 */
990 #if defined(__IS_VR9__) || defined(__IS_AR10__)
991 static int CheckAlready(void)
992 {
993 gusbcfg_data_t usbcfg ={.d32 = 0};
994 usbcfg.d32 = ifxusb_rreg((volatile uint32_t *)0xBE10100C);
995 if(usbcfg.b.ForceDevMode)
996 return 1;
997 if(usbcfg.b.ForceHstMode)
998 return 1;
999 usbcfg.d32 = ifxusb_rreg((volatile uint32_t *)0xBE10600C);
1000 if(usbcfg.b.ForceDevMode)
1001 return 1;
1002 if(usbcfg.b.ForceHstMode)
1003 return 1;
1004 return 0;
1005 }
1006 #endif
1007
1008 #ifdef __IS_HOST__
1009 void ifxusb_hard_reset_h(ifxusb_core_if_t *_core_if)
1010 #else
1011 void ifxusb_hard_reset_d(ifxusb_core_if_t *_core_if)
1012 #endif
1013 {
1014 #if defined(__UEIP__)
1015 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1016 #if defined (__IS_HOST__)
1017 clear_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1018 #elif defined (__IS_DEVICE__)
1019 set_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1020 #endif
1021 #endif //defined(__IS_AMAZON_SE__)
1022
1023 #if defined(__IS_AMAZON_SE__)
1024 #if defined (__IS_HOST__)
1025 clear_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1026 #elif defined (__IS_DEVICE__)
1027 set_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1028 #endif
1029 #endif //defined(__IS_AMAZON_SE__)
1030
1031 #if defined(__IS_AR9__)
1032 if(_core_if->core_no==0)
1033 {
1034 #if defined (__IS_HOST__)
1035 clear_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG);
1036 #elif defined (__IS_DEVICE__)
1037 set_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG);
1038 #endif
1039 }
1040 else
1041 {
1042 #if defined (__IS_HOST__)
1043 clear_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG);
1044 #elif defined (__IS_DEVICE__)
1045 set_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG);
1046 #endif
1047 }
1048 #endif //defined(__IS_AR9__)
1049
1050 #if defined(__IS_VR9__)
1051 if(!CheckAlready())
1052 {
1053 #if defined (__IS_HOST__)
1054 #if defined (__IS_DUAL__)
1055 clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
1056 clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
1057 #elif defined (__IS_FIRST__)
1058 clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
1059 set_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
1060 #elif defined (__IS_SECOND__)
1061 set_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
1062 clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
1063 #endif
1064 #endif
1065 #if defined (__IS_DEVICE__)
1066 #if defined (__IS_FIRST__)
1067 set_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
1068 clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
1069 #elif defined (__IS_SECOND__)
1070 clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
1071 set_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
1072 #endif
1073 #endif
1074 }
1075 #endif //defined(__IS_VR9__)
1076
1077 #if defined(__IS_AR10__)
1078 if(!CheckAlready())
1079 {
1080 #if defined (__IS_HOST__)
1081 #if defined (__IS_DUAL__)
1082 clear_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG);
1083 clear_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG);
1084 #elif defined (__IS_FIRST__)
1085 clear_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG);
1086 set_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG);
1087 #elif defined (__IS_SECOND__)
1088 set_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG);
1089 clear_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG);
1090 #endif
1091 #endif
1092 #if defined (__IS_DEVICE__)
1093 #if defined (__IS_FIRST__)
1094 set_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG);
1095 clear_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG);
1096 #elif defined (__IS_SECOND__)
1097 clear_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG);
1098 set_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG);
1099 #endif
1100 #endif
1101 }
1102 #endif //defined(__IS_AR10__)
1103
1104 // set the HC's byte-order to big-endian
1105 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1106 set_bit (DANUBE_USBCFG_HOST_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1107 clear_bit (DANUBE_USBCFG_SLV_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1108 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1109 #if defined(__IS_AMAZON_SE__)
1110 set_bit (AMAZON_SE_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1111 clear_bit (AMAZON_SE_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1112 #endif //defined(__IS_AMAZON_SE__)
1113 #if defined(__IS_AR9__)
1114 if(_core_if->core_no==0)
1115 {
1116 set_bit (AR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG);
1117 clear_bit (AR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG);
1118 }
1119 else
1120 {
1121 set_bit (AR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG);
1122 clear_bit (AR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG);
1123 }
1124 #endif //defined(__IS_AR9__)
1125 #if defined(__IS_VR9__)
1126 if(_core_if->core_no==0)
1127 {
1128 set_bit (VR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
1129 clear_bit (VR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
1130 }
1131 else
1132 {
1133 set_bit (VR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
1134 clear_bit (VR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
1135 }
1136 #endif //defined(__IS_VR9__)
1137 #if defined(__IS_AR10__)
1138 if(_core_if->core_no==0)
1139 {
1140 set_bit (AR10_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG);
1141 clear_bit (AR10_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG);
1142 }
1143 else
1144 {
1145 set_bit (AR10_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG);
1146 clear_bit (AR10_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG);
1147 }
1148 #endif //defined(__IS_AR10__)
1149
1150 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1151 set_bit (4, DANUBE_RCU_RESET);
1152 MDELAY(50);
1153 clear_bit (4, DANUBE_RCU_RESET);
1154 MDELAY(50);
1155 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1156
1157 #if defined(__IS_AMAZON_SE__)
1158 set_bit (4, AMAZON_SE_RCU_RESET);
1159 MDELAY(50);
1160 clear_bit (4, AMAZON_SE_RCU_RESET);
1161 MDELAY(50);
1162 #endif //defined(__IS_AMAZON_SE__)
1163
1164 #if defined(__IS_AR9__)
1165 if(_core_if->core_no==0)
1166 {
1167 set_bit (4, AR9_RCU_USBRESET);
1168 MDELAY(50);
1169 clear_bit (4, AR9_RCU_USBRESET);
1170 }
1171 else
1172 {
1173 set_bit (28, AR9_RCU_USBRESET);
1174 MDELAY(50);
1175 clear_bit (28, AR9_RCU_USBRESET);
1176 }
1177 MDELAY(50);
1178 #endif //defined(__IS_AR9__)
1179 #if defined(__IS_VR9__)
1180 if(!CheckAlready())
1181 {
1182 set_bit (4, VR9_RCU_USBRESET);
1183 MDELAY(50);
1184 clear_bit (4, VR9_RCU_USBRESET);
1185 MDELAY(50);
1186 }
1187 #endif //defined(__IS_VR9__)
1188 #if defined(__IS_AR10__)
1189 if(!CheckAlready())
1190 {
1191 set_bit (4, AR10_RCU_USBRESET);
1192 MDELAY(50);
1193 clear_bit (4, AR10_RCU_USBRESET);
1194 MDELAY(50);
1195 }
1196 #endif //defined(__IS_AR10__)
1197
1198 #if defined(__IS_TWINPASS__)
1199 ifxusb_enable_afe_oc();
1200 #endif
1201
1202 if(_core_if->core_global_regs)
1203 {
1204 // PHY configurations.
1205 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1206 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1207 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1208 #if defined(__IS_AMAZON_SE__)
1209 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1210 #endif //defined(__IS_AMAZON_SE__)
1211 #if defined(__IS_AR9__)
1212 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1213 #endif //defined(__IS_AR9__)
1214 #if defined(__IS_VR9__)
1215 // ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1216 #endif //defined(__IS_VR9__)
1217 #if defined(__IS_AR10__)
1218 // ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1219 #endif //defined(__IS_AR10__)
1220 }
1221 #else //defined(__UEIP__)
1222 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1223 #if defined (__IS_HOST__)
1224 clear_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1225 #elif defined (__IS_DEVICE__)
1226 set_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1227 #endif
1228 #endif //defined(__IS_AMAZON_SE__)
1229
1230 #if defined(__IS_AMAZON_SE__)
1231 #if defined (__IS_HOST__)
1232 clear_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1233 #elif defined (__IS_DEVICE__)
1234 set_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1235 #endif
1236 #endif //defined(__IS_AMAZON_SE__)
1237
1238 #if defined(__IS_AR9__)
1239 if(_core_if->core_no==0)
1240 {
1241 #if defined (__IS_HOST__)
1242 clear_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG);
1243 #elif defined (__IS_DEVICE__)
1244 set_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG);
1245 #endif
1246 }
1247 else
1248 {
1249 #if defined (__IS_HOST__)
1250 clear_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG);
1251 #elif defined (__IS_DEVICE__)
1252 set_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG);
1253 #endif
1254 }
1255 #endif //defined(__IS_AR9__)
1256
1257 // set the HC's byte-order to big-endian
1258 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1259 set_bit (DANUBE_USBCFG_HOST_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1260 clear_bit (DANUBE_USBCFG_SLV_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1261 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1262 #if defined(__IS_AMAZON_SE__)
1263 set_bit (AMAZON_SE_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1264 clear_bit (AMAZON_SE_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1265 #endif //defined(__IS_AMAZON_SE__)
1266 #if defined(__IS_AR9__)
1267 if(_core_if->core_no==0)
1268 {
1269 set_bit (AMAZON_S_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG);
1270 clear_bit (AMAZON_S_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG);
1271 }
1272 else
1273 {
1274 set_bit (AMAZON_S_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG);
1275 clear_bit (AMAZON_S_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG);
1276 }
1277 #endif //defined(__IS_AR9__)
1278
1279 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1280 set_bit (4, DANUBE_RCU_RESET);
1281 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1282 #if defined(__IS_AMAZON_SE__)
1283 set_bit (4, AMAZON_SE_RCU_RESET);
1284 #endif //defined(__IS_AMAZON_SE__)
1285 #if defined(__IS_AR9__)
1286 if(_core_if->core_no==0)
1287 {
1288 set_bit (4, AMAZON_S_RCU_USBRESET);
1289 }
1290 else
1291 {
1292 set_bit (28, AMAZON_S_RCU_USBRESET);
1293 }
1294 #endif //defined(__IS_AR9__)
1295
1296 MDELAY(50);
1297
1298 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1299 clear_bit (4, DANUBE_RCU_RESET);
1300 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1301 #if defined(__IS_AMAZON_SE__)
1302 clear_bit (4, AMAZON_SE_RCU_RESET);
1303 #endif //defined(__IS_AMAZON_SE__)
1304 #if defined(__IS_AR9__)
1305 if(_core_if->core_no==0)
1306 {
1307 clear_bit (4, AMAZON_S_RCU_USBRESET);
1308 }
1309 else
1310 {
1311 clear_bit (28, AMAZON_S_RCU_USBRESET);
1312 }
1313 #endif //defined(__IS_AR9__)
1314
1315 MDELAY(50);
1316
1317 #if defined(__IS_TWINPASS__)
1318 ifxusb_enable_afe_oc();
1319 #endif
1320
1321 if(_core_if->core_global_regs)
1322 {
1323 // PHY configurations.
1324 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1325 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1326 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1327 #if defined(__IS_AMAZON_SE__)
1328 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1329 #endif //defined(__IS_AMAZON_SE__)
1330 #if defined(__IS_AR9__)
1331 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1332 #endif //defined(__IS_AR9__)
1333 }
1334 #endif //defined(__UEIP__)
1335 }
1336
1337 #if defined(__GADGET_LED__) || defined(__HOST_LED__)
1338 #if defined(__UEIP__)
1339 static void *g_usb_led_trigger = NULL;
1340 #endif
1341
1342 void ifxusb_led_init(ifxusb_core_if_t *_core_if)
1343 {
1344 #if defined(__UEIP__)
1345 #if defined(IFX_LEDGPIO_USB_LED) || defined(IFX_LEDLED_USB_LED)
1346 if ( !g_usb_led_trigger )
1347 {
1348 ifx_led_trigger_register("usb_link", &g_usb_led_trigger);
1349 if ( g_usb_led_trigger != NULL )
1350 {
1351 struct ifx_led_trigger_attrib attrib = {0};
1352 attrib.delay_on = 250;
1353 attrib.delay_off = 250;
1354 attrib.timeout = 2000;
1355 attrib.def_value = 1;
1356 attrib.flags = IFX_LED_TRIGGER_ATTRIB_DELAY_ON | IFX_LED_TRIGGER_ATTRIB_DELAY_OFF | IFX_LED_TRIGGER_ATTRIB_TIMEOUT | IFX_LED_TRIGGER_ATTRIB_DEF_VALUE;
1357 IFX_DEBUGP("Reg USB LED!!\n");
1358 ifx_led_trigger_set_attrib(g_usb_led_trigger, &attrib);
1359 }
1360 }
1361 #endif
1362 #endif //defined(__UEIP__)
1363 }
1364
1365 void ifxusb_led_free(ifxusb_core_if_t *_core_if)
1366 {
1367 #if defined(__UEIP__)
1368 if ( g_usb_led_trigger )
1369 {
1370 ifx_led_trigger_deregister(g_usb_led_trigger);
1371 g_usb_led_trigger = NULL;
1372 }
1373 #endif //defined(__UEIP__)
1374 }
1375
1376 /*!
1377 \brief Turn off the USB 5V VBus Power
1378 \param _core_if Pointer of core_if structure
1379 */
1380 void ifxusb_led(ifxusb_core_if_t *_core_if)
1381 {
1382 #if defined(__UEIP__)
1383 if(g_usb_led_trigger)
1384 ifx_led_trigger_activate(g_usb_led_trigger);
1385 #else
1386 #endif //defined(__UEIP__)
1387 }
1388 #endif // defined(__GADGET_LED__) || defined(__HOST_LED__)
1389
1390
1391
1392 /*!
1393 \brief internal routines for debugging
1394 */
1395 #ifdef __IS_HOST__
1396 void ifxusb_dump_msg_h(const u8 *buf, unsigned int length)
1397 #else
1398 void ifxusb_dump_msg_d(const u8 *buf, unsigned int length)
1399 #endif
1400 {
1401 #ifdef __DEBUG__
1402 unsigned int start, num, i;
1403 char line[52], *p;
1404
1405 if (length >= 512)
1406 return;
1407 start = 0;
1408 while (length > 0)
1409 {
1410 num = min(length, 16u);
1411 p = line;
1412 for (i = 0; i < num; ++i)
1413 {
1414 if (i == 8)
1415 *p++ = ' ';
1416 sprintf(p, " %02x", buf[i]);
1417 p += 3;
1418 }
1419 *p = 0;
1420 IFX_PRINT( "%6x: %s\n", start, line);
1421 buf += num;
1422 start += num;
1423 length -= num;
1424 }
1425 #endif
1426 }
1427
1428 /*!
1429 \brief internal routines for debugging, reads the SPRAM and prints its content
1430 */
1431 #ifdef __IS_HOST__
1432 void ifxusb_dump_spram_h(ifxusb_core_if_t *_core_if)
1433 #else
1434 void ifxusb_dump_spram_d(ifxusb_core_if_t *_core_if)
1435 #endif
1436 {
1437 #ifdef __ENABLE_DUMP__
1438 volatile uint8_t *addr, *start_addr, *end_addr;
1439 uint32_t size;
1440 IFX_PRINT("SPRAM Data:\n");
1441 start_addr = (void*)_core_if->core_global_regs;
1442 IFX_PRINT("Base Address: 0x%8X\n", (uint32_t)start_addr);
1443
1444 start_addr = (void*)_core_if->data_fifo_dbg;
1445 IFX_PRINT("Starting Address: 0x%8X\n", (uint32_t)start_addr);
1446
1447 size=_core_if->hwcfg3.b.dfifo_depth;
1448 size<<=2;
1449 size+=0x200;
1450 size&=0x0003FFFC;
1451
1452 end_addr = (void*)_core_if->data_fifo_dbg;
1453 end_addr += size;
1454
1455 for(addr = start_addr; addr < end_addr; addr+=16)
1456 {
1457 IFX_PRINT("0x%8X: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X \n", (uint32_t)addr,
1458 addr[ 0], addr[ 1], addr[ 2], addr[ 3],
1459 addr[ 4], addr[ 5], addr[ 6], addr[ 7],
1460 addr[ 8], addr[ 9], addr[10], addr[11],
1461 addr[12], addr[13], addr[14], addr[15]
1462 );
1463 }
1464 return;
1465 #endif //__ENABLE_DUMP__
1466 }
1467
1468 /*!
1469 \brief internal routines for debugging, reads the core global registers and prints them
1470 */
1471 #ifdef __IS_HOST__
1472 void ifxusb_dump_registers_h(ifxusb_core_if_t *_core_if)
1473 #else
1474 void ifxusb_dump_registers_d(ifxusb_core_if_t *_core_if)
1475 #endif
1476 {
1477 #ifdef __ENABLE_DUMP__
1478 int i;
1479 volatile uint32_t *addr;
1480 #ifdef __IS_DEVICE__
1481 volatile uint32_t *addri,*addro;
1482 #endif
1483
1484 IFX_PRINT("Core #%d\n",_core_if->core_no);
1485 IFX_PRINT("========================================\n");
1486 IFX_PRINT("Core Global Registers\n");
1487 addr=&_core_if->core_global_regs->gotgctl;
1488 IFX_PRINT(" GOTGCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1489 addr=&_core_if->core_global_regs->gotgint;
1490 IFX_PRINT(" GOTGINT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1491 addr=&_core_if->core_global_regs->gahbcfg;
1492 IFX_PRINT(" GAHBCFG @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1493 addr=&_core_if->core_global_regs->gusbcfg;
1494 IFX_PRINT(" GUSBCFG @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1495 addr=&_core_if->core_global_regs->grstctl;
1496 IFX_PRINT(" GRSTCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1497 addr=&_core_if->core_global_regs->gintsts;
1498 IFX_PRINT(" GINTSTS @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1499 addr=&_core_if->core_global_regs->gintmsk;
1500 IFX_PRINT(" GINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1501 addr=&_core_if->core_global_regs->gi2cctl;
1502 IFX_PRINT(" GI2CCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1503 addr=&_core_if->core_global_regs->gpvndctl;
1504 IFX_PRINT(" GPVNDCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1505 addr=&_core_if->core_global_regs->ggpio;
1506 IFX_PRINT(" GGPIO @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1507 addr=&_core_if->core_global_regs->guid;
1508 IFX_PRINT(" GUID @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1509 addr=&_core_if->core_global_regs->gsnpsid;
1510 IFX_PRINT(" GSNPSID @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1511 addr=&_core_if->core_global_regs->ghwcfg1;
1512 IFX_PRINT(" GHWCFG1 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1513 addr=&_core_if->core_global_regs->ghwcfg2;
1514 IFX_PRINT(" GHWCFG2 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1515 addr=&_core_if->core_global_regs->ghwcfg3;
1516 IFX_PRINT(" GHWCFG3 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1517 addr=&_core_if->core_global_regs->ghwcfg4;
1518 IFX_PRINT(" GHWCFG4 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1519
1520 addr=_core_if->pcgcctl;
1521 IFX_PRINT(" PCGCCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1522
1523 addr=&_core_if->core_global_regs->grxfsiz;
1524 IFX_PRINT(" GRXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1525
1526 #ifdef __IS_HOST__
1527 addr=&_core_if->core_global_regs->gnptxfsiz;
1528 IFX_PRINT(" GNPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1529 addr=&_core_if->core_global_regs->hptxfsiz;
1530 IFX_PRINT(" HPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1531 #endif //__IS_HOST__
1532
1533 #ifdef __IS_DEVICE__
1534 #ifdef __DED_FIFO__
1535 addr=&_core_if->core_global_regs->gnptxfsiz;
1536 IFX_PRINT(" GNPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1537 for (i=0; i<= _core_if->hwcfg4.b.num_in_eps; i++)
1538 {
1539 addr=&_core_if->core_global_regs->dptxfsiz_dieptxf[i];
1540 IFX_PRINT(" DPTXFSIZ[%d] @0x%08X : 0x%08X\n",i,(uint32_t)addr,ifxusb_rreg(addr));
1541 }
1542 #else
1543 addr=&_core_if->core_global_regs->gnptxfsiz;
1544 IFX_PRINT(" TXFSIZ[00] @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1545 for (i=0; i< _core_if->hwcfg4.b.num_dev_perio_in_ep; i++)
1546 {
1547 addr=&_core_if->core_global_regs->dptxfsiz_dieptxf[i];
1548 IFX_PRINT(" TXFSIZ[%02d] @0x%08X : 0x%08X\n",i+1,(uint32_t)addr,ifxusb_rreg(addr));
1549 }
1550 #endif
1551 #endif //__IS_DEVICE__
1552
1553 #ifdef __IS_HOST__
1554 IFX_PRINT(" Host Global Registers\n");
1555 addr=&_core_if->host_global_regs->hcfg;
1556 IFX_PRINT(" HCFG @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1557 addr=&_core_if->host_global_regs->hfir;
1558 IFX_PRINT(" HFIR @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1559 addr=&_core_if->host_global_regs->hfnum;
1560 IFX_PRINT(" HFNUM @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1561 addr=&_core_if->host_global_regs->hptxsts;
1562 IFX_PRINT(" HPTXSTS @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1563 addr=&_core_if->host_global_regs->haint;
1564 IFX_PRINT(" HAINT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1565 addr=&_core_if->host_global_regs->haintmsk;
1566 IFX_PRINT(" HAINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1567 addr= _core_if->hprt0;
1568 IFX_PRINT(" HPRT0 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1569
1570 for (i=0; i<MAX_EPS_CHANNELS; i++)
1571 {
1572 addr=&_core_if->hc_regs[i]->hcchar;
1573 IFX_PRINT(" Host Channel %d Specific Registers\n", i);
1574 IFX_PRINT(" HCCHAR @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1575 addr=&_core_if->hc_regs[i]->hcsplt;
1576 IFX_PRINT(" HCSPLT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1577 addr=&_core_if->hc_regs[i]->hcint;
1578 IFX_PRINT(" HCINT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1579 addr=&_core_if->hc_regs[i]->hcintmsk;
1580 IFX_PRINT(" HCINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1581 addr=&_core_if->hc_regs[i]->hctsiz;
1582 IFX_PRINT(" HCTSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1583 addr=&_core_if->hc_regs[i]->hcdma;
1584 IFX_PRINT(" HCDMA @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1585 }
1586 #endif //__IS_HOST__
1587
1588 #ifdef __IS_DEVICE__
1589 IFX_PRINT(" Device Global Registers\n");
1590 addr=&_core_if->dev_global_regs->dcfg;
1591 IFX_PRINT(" DCFG @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1592 addr=&_core_if->dev_global_regs->dctl;
1593 IFX_PRINT(" DCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1594 addr=&_core_if->dev_global_regs->dsts;
1595 IFX_PRINT(" DSTS @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1596 addr=&_core_if->dev_global_regs->diepmsk;
1597 IFX_PRINT(" DIEPMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1598 addr=&_core_if->dev_global_regs->doepmsk;
1599 IFX_PRINT(" DOEPMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1600 addr=&_core_if->dev_global_regs->daintmsk;
1601 IFX_PRINT(" DAINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1602 addr=&_core_if->dev_global_regs->daint;
1603 IFX_PRINT(" DAINT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1604 addr=&_core_if->dev_global_regs->dvbusdis;
1605 IFX_PRINT(" DVBUSID @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1606 addr=&_core_if->dev_global_regs->dvbuspulse;
1607 IFX_PRINT(" DVBUSPULS @0x%08X : 0x%08X\n", (uint32_t)addr,ifxusb_rreg(addr));
1608
1609 addr=&_core_if->dev_global_regs->dtknqr1;
1610 IFX_PRINT(" DTKNQR1 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1611 if (_core_if->hwcfg2.b.dev_token_q_depth > 6) {
1612 addr=&_core_if->dev_global_regs->dtknqr2;
1613 IFX_PRINT(" DTKNQR2 @0x%08X : 0x%08X\n", (uint32_t)addr,ifxusb_rreg(addr));
1614 }
1615
1616 if (_core_if->hwcfg2.b.dev_token_q_depth > 14)
1617 {
1618 addr=&_core_if->dev_global_regs->dtknqr3_dthrctl;
1619 IFX_PRINT(" DTKNQR3_DTHRCTL @0x%08X : 0x%08X\n", (uint32_t)addr, ifxusb_rreg(addr));
1620 }
1621
1622 if (_core_if->hwcfg2.b.dev_token_q_depth > 22)
1623 {
1624 addr=&_core_if->dev_global_regs->dtknqr4_fifoemptymsk;
1625 IFX_PRINT(" DTKNQR4 @0x%08X : 0x%08X\n", (uint32_t)addr, ifxusb_rreg(addr));
1626 }
1627
1628 //for (i=0; i<= MAX_EPS_CHANNELS; i++)
1629 //for (i=0; i<= 10; i++)
1630 for (i=0; i<= 3; i++)
1631 {
1632 IFX_PRINT(" Device EP %d Registers\n", i);
1633 addri=&_core_if->in_ep_regs[i]->diepctl;addro=&_core_if->out_ep_regs[i]->doepctl;
1634 IFX_PRINT(" DEPCTL I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1635 addro=&_core_if->out_ep_regs[i]->doepfn;
1636 IFX_PRINT(" DEPFN I: O: 0x%08X\n",ifxusb_rreg(addro));
1637 addri=&_core_if->in_ep_regs[i]->diepint;addro=&_core_if->out_ep_regs[i]->doepint;
1638 IFX_PRINT(" DEPINT I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1639 addri=&_core_if->in_ep_regs[i]->dieptsiz;addro=&_core_if->out_ep_regs[i]->doeptsiz;
1640 IFX_PRINT(" DETSIZ I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1641 addri=&_core_if->in_ep_regs[i]->diepdma;addro=&_core_if->out_ep_regs[i]->doepdma;
1642 IFX_PRINT(" DEPDMA I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1643 addri=&_core_if->in_ep_regs[i]->dtxfsts;
1644 IFX_PRINT(" DTXFSTS I: 0x%08X\n",ifxusb_rreg(addri) );
1645 addri=&_core_if->in_ep_regs[i]->diepdmab;addro=&_core_if->out_ep_regs[i]->doepdmab;
1646 IFX_PRINT(" DEPDMAB I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1647 }
1648 #endif //__IS_DEVICE__
1649 #endif //__ENABLE_DUMP__
1650 }
1651
1652 #ifdef __IS_HOST__
1653 void do_suspend_h(ifxusb_core_if_t *core_if)
1654 {
1655 ifxusb_vbus_off(core_if);
1656 mdelay(100);
1657 ifxusb_power_off_h(core_if);
1658 }
1659 void do_resume_h(ifxusb_core_if_t *core_if)
1660 {
1661 ifxusb_vbus_on(core_if);
1662 mdelay(100);
1663 ifxusb_power_on_h(core_if);
1664 ifxusb_phy_power_on_h(core_if);
1665 }
1666 #endif
1667 #ifdef __IS_DEVICE__
1668 void do_suspend_d(ifxusb_core_if_t *core_if)
1669 {
1670 ifxusb_power_off_d(core_if);
1671 }
1672 void do_resume_d(ifxusb_core_if_t *core_if)
1673 {
1674 dctl_data_t dctl = {.d32=0};
1675
1676 ifxusb_power_on_d(core_if);
1677 ifxusb_phy_power_on_d(core_if);
1678 dctl.d32=ifxusb_rreg(&core_if->dev_global_regs->dctl);
1679 dctl.b.sftdiscon=1;
1680 ifxusb_wreg(&core_if->dev_global_regs->dctl,dctl.d32);
1681 mdelay(50);
1682 dctl.b.sftdiscon=0;
1683 ifxusb_wreg(&core_if->dev_global_regs->dctl,dctl.d32);
1684 }
1685 #endif
1686