[lantiq] move files/ -> files-3.3/
[openwrt.git] / target / linux / lantiq / files-3.3 / drivers / usb / ifxhcd / 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  **   DATE            : 1/Jan/2009
7  **   AUTHOR          : Chen, Howard
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  *****************************************************************************/
12
13 /*!
14  \file ifxusb_cif.c
15  \ingroup IFXUSB_DRIVER_V3
16  \brief This file contains the interface to the IFX USB Core.
17 */
18
19 #include <linux/clk.h>
20 #include <linux/version.h>
21 #include "ifxusb_version.h"
22
23 #include <asm/byteorder.h>
24 #include <asm/unaligned.h>
25
26
27 #include <linux/jiffies.h>
28 #include <linux/platform_device.h>
29 #include <linux/kernel.h>
30 #include <linux/ioport.h>
31
32 #if defined(__UEIP__)
33 //      #include <asm/ifx/ifx_pmu.h>
34 //      #include <ifx_pmu.h>
35 #endif
36
37
38 #include "ifxusb_plat.h"
39 #include "ifxusb_regs.h"
40 #include "ifxusb_cif.h"
41
42
43 #ifdef __IS_DEVICE__
44         #include "ifxpcd.h"
45 #endif
46
47 #ifdef __IS_HOST__
48         #include "ifxhcd.h"
49 #endif
50
51 #include <linux/mm.h>
52
53 #include <linux/gfp.h>
54
55 #if defined(__UEIP__)
56 //      #include <asm/ifx/ifx_board.h>
57         //#include <ifx_board.h>
58 #endif
59
60 //#include <asm/ifx/ifx_gpio.h>
61 //#include <ifx_gpio.h>
62 #if defined(__UEIP__)
63 //      #include <asm/ifx/ifx_led.h>
64         //#include <ifx_led.h>
65 #endif
66
67
68
69 #if defined(__UEIP__)
70         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
71                 #ifndef USB_CTRL_PMU_SETUP
72                         #define USB_CTRL_PMU_SETUP(__x) USB0_CTRL_PMU_SETUP(__x)
73                 #endif
74                 #ifndef USB_PHY_PMU_SETUP
75                         #define USB_PHY_PMU_SETUP(__x) USB0_PHY_PMU_SETUP(__x)
76                 #endif
77         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
78 #endif // defined(__UEIP__)
79
80 /*!
81  \brief This function is called to allocate buffer of specified size.
82         The allocated buffer is mapped into DMA accessable address.
83  \param size Size in BYTE to be allocated
84  \param clear 0: don't do clear after buffer allocated, other: do clear to zero
85  \return 0/NULL: Fail; uncached pointer of allocated buffer
86  */
87 void *ifxusb_alloc_buf(size_t size, int clear)
88 {
89         uint32_t *cached,*uncached;
90         uint32_t totalsize,page;
91
92         if(!size)
93                 return 0;
94
95         size=(size+3)&0xFFFFFFFC;
96         totalsize=size + 12;
97         page=get_order(totalsize);
98
99         cached = (void *) __get_free_pages(( GFP_ATOMIC | GFP_DMA), page);
100
101         if(!cached)
102         {
103                 IFX_PRINT("%s Allocation Failed size:%d\n",__func__,size);
104                 return NULL;
105         }
106
107         uncached = (uint32_t *)(KSEG1ADDR(cached));
108         if(clear)
109                 memset(uncached, 0, totalsize);
110
111         *(uncached+0)=totalsize;
112         *(uncached+1)=page;
113         *(uncached+2)=(uint32_t)cached;
114         return (void *)(uncached+3);
115 }
116
117
118 /*!
119  \brief This function is called to free allocated buffer.
120  \param vaddr the uncached pointer of the buffer
121  */
122 void ifxusb_free_buf(void *vaddr)
123 {
124         uint32_t totalsize,page;
125         uint32_t *cached,*uncached;
126
127         if(vaddr != NULL)
128         {
129                 uncached=vaddr;
130                 uncached-=3;
131                 totalsize=*(uncached+0);
132                 page=*(uncached+1);
133                 cached=(uint32_t *)(*(uncached+2));
134                 if(totalsize && page==get_order(totalsize) && cached==(uint32_t *)(KSEG0ADDR(uncached)))
135                 {
136                         free_pages((unsigned long)cached, page);
137                         return;
138                 }
139                 // the memory is not allocated by ifxusb_alloc_buf. Allowed but must be careful.
140                 return;
141         }
142 }
143
144
145
146 /*!
147    \brief This function is called to initialize the IFXUSB CSR data
148          structures.  The register addresses in the device and host
149          structures are initialized from the base address supplied by the
150          caller.  The calling function must make the OS calls to get the
151          base address of the IFXUSB controller registers.
152
153    \param _core_if        Pointer of core_if structure
154    \param _irq            irq number
155    \param _reg_base_addr  Base address of IFXUSB core registers
156    \param _fifo_base_addr Fifo base address
157    \param _fifo_dbg_addr  Fifo debug address
158    \return      0: success;
159  */
160 int ifxusb_core_if_init(ifxusb_core_if_t *_core_if,
161                         int               _irq,
162                         uint32_t          _reg_base_addr,
163                         uint32_t          _fifo_base_addr,
164                         uint32_t          _fifo_dbg_addr)
165 {
166         int retval = 0;
167         uint32_t *reg_base  =NULL;
168     uint32_t *fifo_base =NULL;
169     uint32_t *fifo_dbg  =NULL;
170
171     int i;
172
173         IFX_DEBUGPL(DBG_CILV, "%s(%p,%d,0x%08X,0x%08X,0x%08X)\n", __func__,
174                                                      _core_if,
175                                                      _irq,
176                                                      _reg_base_addr,
177                                                      _fifo_base_addr,
178                                                      _fifo_dbg_addr);
179
180         if( _core_if == NULL)
181         {
182                 IFX_ERROR("%s() invalid _core_if\n", __func__);
183                 retval = -ENOMEM;
184                 goto fail;
185         }
186
187         //memset(_core_if, 0, sizeof(ifxusb_core_if_t));
188
189         _core_if->irq=_irq;
190
191         reg_base  =ioremap_nocache(_reg_base_addr , IFXUSB_IOMEM_SIZE  );
192         fifo_base =ioremap_nocache(_fifo_base_addr, IFXUSB_FIFOMEM_SIZE);
193     fifo_dbg  =ioremap_nocache(_fifo_dbg_addr , IFXUSB_FIFODBG_SIZE);
194         if( reg_base == NULL || fifo_base == NULL || fifo_dbg == NULL)
195         {
196                 IFX_ERROR("%s() usb ioremap() failed\n", __func__);
197                 retval = -ENOMEM;
198                 goto fail;
199         }
200
201         _core_if->core_global_regs = (ifxusb_core_global_regs_t *)reg_base;
202
203         /*
204          * Attempt to ensure this device is really a IFXUSB Controller.
205          * Read and verify the SNPSID register contents. The value should be
206          * 0x45F42XXX
207          */
208         {
209                 int32_t snpsid;
210                 snpsid = ifxusb_rreg(&_core_if->core_global_regs->gsnpsid);
211                 if ((snpsid & 0xFFFFF000) != 0x4F542000)
212                 {
213                         IFX_ERROR("%s() snpsid error(0x%08x) failed\n", __func__,snpsid);
214                         retval = -EINVAL;
215                         goto fail;
216                 }
217                 _core_if->snpsid=snpsid;
218         }
219
220         #ifdef __IS_HOST__
221                 _core_if->host_global_regs = (ifxusb_host_global_regs_t *)
222                     ((uint32_t)reg_base + IFXUSB_HOST_GLOBAL_REG_OFFSET);
223                 _core_if->hprt0 = (uint32_t*)((uint32_t)reg_base + IFXUSB_HOST_PORT_REGS_OFFSET);
224
225                 for (i=0; i<MAX_EPS_CHANNELS; i++)
226                 {
227                         _core_if->hc_regs[i] = (ifxusb_hc_regs_t *)
228                             ((uint32_t)reg_base + IFXUSB_HOST_CHAN_REGS_OFFSET +
229                             (i * IFXUSB_CHAN_REGS_OFFSET));
230                         IFX_DEBUGPL(DBG_CILV, "hc_reg[%d]->hcchar=%p\n",
231                             i, &_core_if->hc_regs[i]->hcchar);
232                 }
233         #endif //__IS_HOST__
234
235         #ifdef __IS_DEVICE__
236                 _core_if->dev_global_regs =
237                     (ifxusb_device_global_regs_t *)((uint32_t)reg_base + IFXUSB_DEV_GLOBAL_REG_OFFSET);
238
239                 for (i=0; i<MAX_EPS_CHANNELS; i++)
240                 {
241                         _core_if->in_ep_regs[i] = (ifxusb_dev_in_ep_regs_t *)
242                             ((uint32_t)reg_base + IFXUSB_DEV_IN_EP_REG_OFFSET +
243                             (i * IFXUSB_EP_REG_OFFSET));
244                         _core_if->out_ep_regs[i] = (ifxusb_dev_out_ep_regs_t *)
245                             ((uint32_t)reg_base + IFXUSB_DEV_OUT_EP_REG_OFFSET +
246                             (i * IFXUSB_EP_REG_OFFSET));
247                         IFX_DEBUGPL(DBG_CILV, "in_ep_regs[%d]->diepctl=%p/%p %p/0x%08X/0x%08X\n",
248                             i, &_core_if->in_ep_regs[i]->diepctl, _core_if->in_ep_regs[i],
249                             reg_base,IFXUSB_DEV_IN_EP_REG_OFFSET,(i * IFXUSB_EP_REG_OFFSET)
250                             );
251                         IFX_DEBUGPL(DBG_CILV, "out_ep_regs[%d]->doepctl=%p/%p %p/0x%08X/0x%08X\n",
252                             i, &_core_if->out_ep_regs[i]->doepctl, _core_if->out_ep_regs[i],
253                             reg_base,IFXUSB_DEV_OUT_EP_REG_OFFSET,(i * IFXUSB_EP_REG_OFFSET)
254                             );
255                 }
256         #endif //__IS_DEVICE__
257
258         /* Setting the FIFO and other Address. */
259         for (i=0; i<MAX_EPS_CHANNELS; i++)
260         {
261                 _core_if->data_fifo[i] = fifo_base + (i * IFXUSB_DATA_FIFO_SIZE);
262                 IFX_DEBUGPL(DBG_CILV, "data_fifo[%d]=0x%08x\n",
263                     i, (unsigned)_core_if->data_fifo[i]);
264         }
265
266         _core_if->data_fifo_dbg = fifo_dbg;
267         _core_if->pcgcctl = (uint32_t*)(((uint32_t)reg_base) + IFXUSB_PCGCCTL_OFFSET);
268
269         /*
270          * Store the contents of the hardware configuration registers here for
271          * easy access later.
272          */
273         _core_if->hwcfg1.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg1);
274         _core_if->hwcfg2.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg2);
275         _core_if->hwcfg3.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg3);
276         _core_if->hwcfg4.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg4);
277
278         IFX_DEBUGPL(DBG_CILV,"hwcfg1=%08x\n",_core_if->hwcfg1.d32);
279         IFX_DEBUGPL(DBG_CILV,"hwcfg2=%08x\n",_core_if->hwcfg2.d32);
280         IFX_DEBUGPL(DBG_CILV,"hwcfg3=%08x\n",_core_if->hwcfg3.d32);
281         IFX_DEBUGPL(DBG_CILV,"hwcfg4=%08x\n",_core_if->hwcfg4.d32);
282
283
284         #ifdef __DED_FIFO__
285                 IFX_PRINT("Waiting for PHY Clock Lock!\n");
286                 while(!( ifxusb_rreg(&_core_if->core_global_regs->grxfsiz) & (1<<9)))
287                 {
288                 }
289                 IFX_PRINT("PHY Clock Locked!\n");
290                 //ifxusb_clean_spram(_core_if,128*1024/4);
291         #endif
292
293         /* Create new workqueue and init works */
294 #if 0
295         _core_if->wq_usb = create_singlethread_workqueue(_core_if->core_name);
296
297         if(_core_if->wq_usb == 0)
298         {
299                 IFX_DEBUGPL(DBG_CIL, "Creation of wq_usb failed\n");
300                 retval = -EINVAL;
301                 goto fail;
302         }
303
304         #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
305                 INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change, core_if);
306                 INIT_WORK(&core_if->w_wkp, w_wakeup_detected, core_if);
307         #else
308                 INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change);
309                 INIT_DELAYED_WORK(&core_if->w_wkp, w_wakeup_detected);
310         #endif
311 #endif
312         return 0;
313
314 fail:
315         if( reg_base  != NULL) iounmap(reg_base );
316         if( fifo_base != NULL) iounmap(fifo_base);
317         if( fifo_dbg  != NULL) iounmap(fifo_dbg );
318         return retval;
319 }
320
321 /*!
322  \brief This function free the mapped address in the IFXUSB CSR data structures.
323  \param _core_if Pointer of core_if structure
324  */
325 void ifxusb_core_if_remove(ifxusb_core_if_t *_core_if)
326 {
327         /* Disable all interrupts */
328         if( _core_if->core_global_regs  != NULL)
329         {
330                 ifxusb_mreg( &_core_if->core_global_regs->gahbcfg, 1, 0);
331                 ifxusb_wreg( &_core_if->core_global_regs->gintmsk, 0);
332         }
333
334         if( _core_if->core_global_regs  != NULL) iounmap(_core_if->core_global_regs );
335         if( _core_if->data_fifo[0]      != NULL) iounmap(_core_if->data_fifo[0]     );
336         if( _core_if->data_fifo_dbg     != NULL) iounmap(_core_if->data_fifo_dbg    );
337
338 #if 0
339         if (_core_if->wq_usb)
340                 destroy_workqueue(_core_if->wq_usb);
341 #endif
342         memset(_core_if, 0, sizeof(ifxusb_core_if_t));
343 }
344
345
346
347
348 /*!
349  \brief This function enbles the controller's Global Interrupt in the AHB Config register.
350  \param _core_if Pointer of core_if structure
351  */
352 void ifxusb_enable_global_interrupts( ifxusb_core_if_t *_core_if )
353 {
354         gahbcfg_data_t ahbcfg ={ .d32 = 0};
355         ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */
356         ifxusb_mreg(&_core_if->core_global_regs->gahbcfg, 0, ahbcfg.d32);
357 }
358
359 /*!
360  \brief This function disables the controller's Global Interrupt in the AHB Config register.
361  \param _core_if Pointer of core_if structure
362  */
363 void ifxusb_disable_global_interrupts( ifxusb_core_if_t *_core_if )
364 {
365         gahbcfg_data_t ahbcfg ={ .d32 = 0};
366         ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */
367         ifxusb_mreg(&_core_if->core_global_regs->gahbcfg, ahbcfg.d32, 0);
368 }
369
370
371
372
373 /*!
374  \brief Flush Tx and Rx FIFO.
375  \param _core_if Pointer of core_if structure
376  */
377 void ifxusb_flush_both_fifo( ifxusb_core_if_t *_core_if )
378 {
379         ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
380         volatile grstctl_t greset ={ .d32 = 0};
381         int count = 0;
382
383         IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "%s\n", __func__);
384         greset.b.rxfflsh = 1;
385         greset.b.txfflsh = 1;
386         greset.b.txfnum = 0x10;
387         greset.b.intknqflsh=1;
388         greset.b.hstfrm=1;
389         ifxusb_wreg( &global_regs->grstctl, greset.d32 );
390
391         do
392         {
393                 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
394                 if (++count > 10000)
395                 {
396                         IFX_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, greset.d32);
397                         break;
398                 }
399         } while (greset.b.rxfflsh == 1 || greset.b.txfflsh == 1);
400         /* Wait for 3 PHY Clocks*/
401         UDELAY(1);
402 }
403
404 /*!
405  \brief Flush a Tx FIFO.
406  \param _core_if Pointer of core_if structure
407  \param _num Tx FIFO to flush. ( 0x10 for ALL TX FIFO )
408  */
409 void ifxusb_flush_tx_fifo( ifxusb_core_if_t *_core_if, const int _num )
410 {
411         ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
412         volatile grstctl_t greset ={ .d32 = 0};
413         int count = 0;
414
415         IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "Flush Tx FIFO %d\n", _num);
416
417         greset.b.intknqflsh=1;
418         greset.b.txfflsh = 1;
419         greset.b.txfnum = _num;
420         ifxusb_wreg( &global_regs->grstctl, greset.d32 );
421
422         do
423         {
424                 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
425                 if (++count > 10000&&(_num==0 ||_num==0x10))
426                 {
427                         IFX_WARN("%s() HANG! GRSTCTL=%0x GNPTXSTS=0x%08x\n",
428                             __func__, greset.d32,
429                         ifxusb_rreg( &global_regs->gnptxsts));
430                         break;
431                 }
432         } while (greset.b.txfflsh == 1);
433         /* Wait for 3 PHY Clocks*/
434         UDELAY(1);
435 }
436
437
438 /*!
439  \brief Flush Rx FIFO.
440  \param _core_if Pointer of core_if structure
441  */
442 void ifxusb_flush_rx_fifo( ifxusb_core_if_t *_core_if )
443 {
444         ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
445         volatile grstctl_t greset ={ .d32 = 0};
446         int count = 0;
447
448         IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "%s\n", __func__);
449         greset.b.rxfflsh = 1;
450         ifxusb_wreg( &global_regs->grstctl, greset.d32 );
451
452         do
453         {
454                 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
455                 if (++count > 10000)
456                 {
457                         IFX_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, greset.d32);
458                         break;
459                 }
460         } while (greset.b.rxfflsh == 1);
461         /* Wait for 3 PHY Clocks*/
462         UDELAY(1);
463 }
464
465
466 #define SOFT_RESET_DELAY 100
467
468 /*!
469  \brief Do a soft reset of the core.  Be careful with this because it
470         resets all the internal state machines of the core.
471  \param _core_if Pointer of core_if structure
472  */
473 int ifxusb_core_soft_reset(ifxusb_core_if_t *_core_if)
474 {
475         ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
476         volatile grstctl_t greset ={ .d32 = 0};
477         int count = 0;
478
479         IFX_DEBUGPL(DBG_CILV, "%s\n", __func__);
480         /* Wait for AHB master IDLE state. */
481         do
482         {
483                 UDELAY(10);
484                 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
485                 if (++count > 100000)
486                 {
487                         IFX_WARN("%s() HANG! AHB Idle GRSTCTL=%0x %x\n", __func__,
488                         greset.d32, greset.b.ahbidle);
489                         break;
490                 }
491         } while (greset.b.ahbidle == 0);
492
493         UDELAY(1);
494
495         /* Core Soft Reset */
496         count = 0;
497         greset.b.csftrst = 1;
498         ifxusb_wreg( &global_regs->grstctl, greset.d32 );
499
500         #ifdef SOFT_RESET_DELAY
501                 MDELAY(SOFT_RESET_DELAY);
502         #endif
503
504         do
505         {
506                 UDELAY(10);
507                 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
508                 if (++count > 100000)
509                 {
510                         IFX_WARN("%s() HANG! Soft Reset GRSTCTL=%0x\n", __func__, greset.d32);
511                         return -1;
512                 }
513         } while (greset.b.csftrst == 1);
514
515         #ifdef SOFT_RESET_DELAY
516                 MDELAY(SOFT_RESET_DELAY);
517         #endif
518
519
520         #if defined(__IS_VR9__)
521                 if(_core_if->core_no==0)
522                 {
523                         set_bit (4, VR9_RCU_USBRESET2);
524                         MDELAY(50);
525                         clear_bit (4, VR9_RCU_USBRESET2);
526                 }
527                 else
528                 {
529                         set_bit (5, VR9_RCU_USBRESET2);
530                         MDELAY(50);
531                         clear_bit (5, VR9_RCU_USBRESET2);
532                 }
533                 MDELAY(50);
534         #endif //defined(__IS_VR9__)
535
536         IFX_PRINT("USB core #%d soft-reset\n",_core_if->core_no);
537
538         return 0;
539 }
540
541 /*!
542  \brief Turn on the USB Core Power
543  \param _core_if Pointer of core_if structure
544 */
545 void ifxusb_power_on (ifxusb_core_if_t *_core_if)
546 {
547         struct clk *clk0 = clk_get_sys("usb0", NULL);
548         struct clk *clk1 = clk_get_sys("usb1", NULL);
549         // set clock gating
550         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
551         #if defined(__UEIP__)
552
553                 #if defined(__IS_TWINPASS) || defined(__IS_DANUBE__)
554                         set_bit (4, (volatile unsigned long *)DANUBE_CGU_IFCCR);
555                         set_bit (5, (volatile unsigned long *)DANUBE_CGU_IFCCR);
556                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
557                 #if defined(__IS_AMAZON_SE__)
558                 //      clear_bit (4, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR);
559                         clear_bit (5, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR);
560                 #endif //defined(__IS_AMAZON_SE__)
561                 #if defined(__IS_AR9__)
562                         set_bit (0, (volatile unsigned long *)AR9_CGU_IFCCR);
563                         set_bit (1, (volatile unsigned long *)AR9_CGU_IFCCR);
564                 #endif //defined(__IS_AR9__)
565                 #if defined(__IS_VR9__)
566 //                      set_bit (0, (volatile unsigned long *)VR9_CGU_IFCCR);
567 //                      set_bit (1, (volatile unsigned long *)VR9_CGU_IFCCR);
568                 #endif //defined(__IS_VR9__)
569
570                 MDELAY(50);
571
572                 // set power
573                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
574                         USB_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
575                         //#if defined(__IS_TWINPASS__)
576                         //      ifxusb_enable_afe_oc();
577                         //#endif
578                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
579                 #if defined(__IS_AR9__) || defined(__IS_VR9__)
580                         if(_core_if->core_no==0)
581                                 clk_enable(clk0);
582 //                              USB0_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
583                         else
584                                 clk_enable(clk1);
585 //                              USB1_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
586                 #endif //defined(__IS_AR9__) || defined(__IS_VR9__)
587
588                 if(_core_if->core_global_regs)
589                 {
590                         // PHY configurations.
591                         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
592                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
593                         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
594                         #if defined(__IS_AMAZON_SE__)
595                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
596                         #endif //defined(__IS_AMAZON_SE__)
597                         #if defined(__IS_AR9__)
598                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
599                         #endif //defined(__IS_AR9__)
600                         #if defined(__IS_VR9__)
601                                 //ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
602                         #endif //defined(__IS_VR9__)
603                 }
604         #else //defined(__UEIP__)
605                 #if defined(__IS_TWINPASS) || defined(__IS_DANUBE__)
606                         set_bit (4, (volatile unsigned long *)DANUBE_CGU_IFCCR);
607                         set_bit (5, (volatile unsigned long *)DANUBE_CGU_IFCCR);
608                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
609                 #if defined(__IS_AMAZON_SE__)
610                 //      clear_bit (4, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR);
611                         clear_bit (5, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR);
612                 #endif //defined(__IS_AMAZON_SE__)
613                 #if defined(__IS_AR9__)
614                         set_bit (0, (volatile unsigned long *)AMAZON_S_CGU_IFCCR);
615                         set_bit (1, (volatile unsigned long *)AMAZON_S_CGU_IFCCR);
616                 #endif //defined(__IS_AR9__)
617
618                 MDELAY(50);
619
620                 // set power
621                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
622                         clear_bit (6,  (volatile unsigned long *)DANUBE_PMU_PWDCR);//USB
623                         clear_bit (9,  (volatile unsigned long *)DANUBE_PMU_PWDCR);//DSL
624                         clear_bit (15, (volatile unsigned long *)DANUBE_PMU_PWDCR);//AHB
625                         #if defined(__IS_TWINPASS__)
626                                 ifxusb_enable_afe_oc();
627                         #endif
628                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
629                 #if defined(__IS_AMAZON_SE__)
630                         clear_bit (6,  (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);
631                         clear_bit (9,  (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);
632                         clear_bit (15, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);
633                 #endif //defined(__IS_AMAZON_SE__)
634                 #if defined(__IS_AR9__)
635                         if(_core_if->core_no==0)
636                                 clear_bit (6, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
637                         else
638                                 clear_bit (27, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
639                         clear_bit (9, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//DSL
640                         clear_bit (15, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//AHB
641                 #endif //defined(__IS_AR9__)
642
643                 if(_core_if->core_global_regs)
644                 {
645                         // PHY configurations.
646                         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
647                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
648                         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
649                         #if defined(__IS_AMAZON_SE__)
650                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
651                         #endif //defined(__IS_AMAZON_SE__)
652                         #if defined(__IS_AR9__)
653                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
654                         #endif //defined(__IS_AR9__)
655                 }
656
657         #endif //defined(__UEIP__)
658 }
659
660 /*!
661  \brief Turn off the USB Core Power
662  \param _core_if Pointer of core_if structure
663 */
664 void ifxusb_power_off (ifxusb_core_if_t *_core_if)
665 {
666         struct clk *clk0 = clk_get_sys("usb0", NULL);
667         struct clk *clk1 = clk_get_sys("usb1", NULL);
668         ifxusb_phy_power_off (_core_if);
669
670         // set power
671         #if defined(__UEIP__)
672                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
673                         USB_CTRL_PMU_SETUP(IFX_PMU_DISABLE);
674                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
675                 #if defined(__IS_AR9__) || defined(__IS_VR9__)
676                         if(_core_if->core_no==0)
677                                 clk_disable(clk0);
678                                 //USB0_CTRL_PMU_SETUP(IFX_PMU_DISABLE);
679                         else
680                                 clk_disable(clk1);
681                                 //USB1_CTRL_PMU_SETUP(IFX_PMU_DISABLE);
682                 #endif //defined(__IS_AR9__) || defined(__IS_VR9__)
683         #else //defined(__UEIP__)
684                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
685                         set_bit (6, (volatile unsigned long *)DANUBE_PMU_PWDCR);//USB
686                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
687                 #if defined(__IS_AMAZON_SE__)
688                         set_bit (6, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);//USB
689                 #endif //defined(__IS_AMAZON_SE__)
690                 #if defined(__IS_AR9__)
691                         if(_core_if->core_no==0)
692                                 set_bit (6, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
693                         else
694                                 set_bit (27, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
695                 #endif //defined(__IS_AR9__)
696         #endif //defined(__UEIP__)
697 }
698
699 /*!
700  \brief Turn on the USB PHY Power
701  \param _core_if Pointer of core_if structure
702 */
703 void ifxusb_phy_power_on (ifxusb_core_if_t *_core_if)
704 {
705         struct clk *clk0 = clk_get_sys("usb0", NULL);
706         struct clk *clk1 = clk_get_sys("usb1", NULL);
707         #if defined(__UEIP__)
708                 if(_core_if->core_global_regs)
709                 {
710                         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
711                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
712                         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
713                         #if defined(__IS_AMAZON_SE__)
714                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
715                         #endif //defined(__IS_AMAZON_SE__)
716                         #if defined(__IS_AR9__)
717                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
718                         #endif //defined(__IS_AR9__)
719                         #if defined(__IS_VR9_S__)
720                                 if(_core_if->core_no==0)
721                                         set_bit (0, VR9_RCU_USB_ANA_CFG1A);
722                                 else
723                                         set_bit (0, VR9_RCU_USB_ANA_CFG1B);
724                         #endif //defined(__IS_VR9__)
725                 }
726
727                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
728                         USB_PHY_PMU_SETUP(IFX_PMU_ENABLE);
729                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
730                 #if defined(__IS_AR9__) || defined(__IS_VR9__)
731                         if(_core_if->core_no==0)
732                                 clk_enable(clk0);
733                                 //USB0_PHY_PMU_SETUP(IFX_PMU_ENABLE);
734                         else
735                                 clk_enable(clk1);
736                                 //USB1_PHY_PMU_SETUP(IFX_PMU_ENABLE);
737                 #endif //defined(__IS_AR9__) || defined(__IS_VR9__)
738
739                 // PHY configurations.
740                 if(_core_if->core_global_regs)
741                 {
742                         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
743                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
744                         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
745                         #if defined(__IS_AMAZON_SE__)
746                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
747                         #endif //defined(__IS_AMAZON_SE__)
748                         #if defined(__IS_AR9__)
749                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
750                         #endif //defined(__IS_AR9__)
751                         #if defined(__IS_VR9_S__)
752                                 if(_core_if->core_no==0)
753                                         set_bit (0, VR9_RCU_USB_ANA_CFG1A);
754                                 else
755                                         set_bit (0, VR9_RCU_USB_ANA_CFG1B);
756                         #endif //defined(__IS_VR9__)
757                 }
758         #else //defined(__UEIP__)
759                 // PHY configurations.
760                 if(_core_if->core_global_regs)
761                 {
762                         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
763                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
764                         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
765                         #if defined(__IS_AMAZON_SE__)
766                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
767                         #endif //defined(__IS_AMAZON_SE__)
768                         #if defined(__IS_AR9__)
769                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
770                         #endif //defined(__IS_AR9__)
771                 }
772
773                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
774                         clear_bit (0,  (volatile unsigned long *)DANUBE_PMU_PWDCR);//PHY
775                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
776                 #if defined(__IS_AMAZON_SE__)
777                         clear_bit (0,  (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);
778                 #endif //defined(__IS_AMAZON_SE__)
779                 #if defined(__IS_AR9__)
780                         if(_core_if->core_no==0)
781                                 clear_bit (0,  (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
782                         else
783                                 clear_bit (26, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
784                 #endif //defined(__IS_AR9__)
785
786                 // PHY configurations.
787                 if(_core_if->core_global_regs)
788                 {
789                         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
790                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
791                         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
792                         #if defined(__IS_AMAZON_SE__)
793                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
794                         #endif //defined(__IS_AMAZON_SE__)
795                         #if defined(__IS_AR9__)
796                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
797                         #endif //defined(__IS_AR9__)
798                 }
799         #endif //defined(__UEIP__)
800 }
801
802
803 /*!
804  \brief Turn off the USB PHY Power
805  \param _core_if Pointer of core_if structure
806 */
807 void ifxusb_phy_power_off (ifxusb_core_if_t *_core_if)
808 {
809         struct clk *clk0 = clk_get_sys("usb0", NULL);
810         struct clk *clk1 = clk_get_sys("usb1", NULL);
811         #if defined(__UEIP__)
812                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
813                         USB_PHY_PMU_SETUP(IFX_PMU_DISABLE);
814                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
815                 #if defined(__IS_AR9__) || defined(__IS_VR9__)
816                         if(_core_if->core_no==0)
817                                 clk_disable(clk0);
818                                 //USB0_PHY_PMU_SETUP(IFX_PMU_DISABLE);
819                         else
820                                 clk_disable(clk1);
821                                 //USB1_PHY_PMU_SETUP(IFX_PMU_DISABLE);
822                 #endif // defined(__IS_AR9__) || defined(__IS_VR9__)
823         #else //defined(__UEIP__)
824                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
825                         set_bit (0, (volatile unsigned long *)DANUBE_PMU_PWDCR);//PHY
826                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
827                 #if defined(__IS_AMAZON_SE__)
828                         set_bit (0, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);//PHY
829                 #endif //defined(__IS_AMAZON_SE__)
830                 #if defined(__IS_AR9__)
831                         if(_core_if->core_no==0)
832                                 set_bit (0, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
833                         else
834                                 set_bit (26, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
835                 #endif //defined(__IS_AR9__)
836         #endif //defined(__UEIP__)
837 }
838
839
840 /*!
841  \brief Reset on the USB Core RCU
842  \param _core_if Pointer of core_if structure
843  */
844 #if defined(__IS_VR9__)
845         int already_hard_reset=0;
846 #endif
847 void ifxusb_hard_reset(ifxusb_core_if_t *_core_if)
848 {
849         #if defined(__UEIP__)
850                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
851                         #if defined (__IS_HOST__)
852                                 clear_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
853                         #elif defined (__IS_DEVICE__)
854                                 set_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
855                         #endif
856                 #endif //defined(__IS_AMAZON_SE__)
857
858                 #if defined(__IS_AMAZON_SE__)
859                         #if defined (__IS_HOST__)
860                                 clear_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
861                         #elif defined (__IS_DEVICE__)
862                                 set_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
863                         #endif
864                 #endif //defined(__IS_AMAZON_SE__)
865
866                 #if defined(__IS_AR9__)
867                         if(_core_if->core_no==0)
868                         {
869                                 #if defined (__IS_HOST__)
870                                         clear_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG);
871                                 #elif defined (__IS_DEVICE__)
872                                         set_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG);
873                                 #endif
874                         }
875                         else
876                         {
877                                 #if defined (__IS_HOST__)
878                                         clear_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG);
879                                 #elif defined (__IS_DEVICE__)
880                                         set_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG);
881                                 #endif
882                         }
883                 #endif //defined(__IS_AR9__)
884
885                 #if defined(__IS_VR9__)
886                         if(_core_if->core_no==0)
887                         {
888                                 #if defined (__IS_HOST__)
889                                         clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
890                                 #elif defined (__IS_DEVICE__)
891                                         set_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
892                                 #endif
893                         }
894                         else
895                         {
896                                 #if defined (__IS_HOST__)
897                                         clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
898                                 #elif defined (__IS_DEVICE__)
899                                         set_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
900                                 #endif
901                         }
902                 #endif //defined(__IS_VR9__)
903
904
905                 // set the HC's byte-order to big-endian
906                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
907                         set_bit   (DANUBE_USBCFG_HOST_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
908                         clear_bit (DANUBE_USBCFG_SLV_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
909                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
910                 #if defined(__IS_AMAZON_SE__)
911                         set_bit (AMAZON_SE_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
912                         clear_bit (AMAZON_SE_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
913                 #endif //defined(__IS_AMAZON_SE__)
914                 #if defined(__IS_AR9__)
915                         if(_core_if->core_no==0)
916                         {
917                                 set_bit   (AR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG);
918                                 clear_bit (AR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG);
919                         }
920                         else
921                         {
922                                 set_bit   (AR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG);
923                                 clear_bit (AR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG);
924                         }
925                 #endif //defined(__IS_AR9__)
926                 #if defined(__IS_VR9__)
927                         if(_core_if->core_no==0)
928                         {
929                                 set_bit   (VR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
930                                 clear_bit (VR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG);
931                         }
932                         else
933                         {
934                                 set_bit   (VR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
935                                 clear_bit (VR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG);
936                         }
937                 #endif //defined(__IS_VR9__)
938
939                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
940                     set_bit (4, DANUBE_RCU_RESET);
941                         MDELAY(500);
942                     clear_bit (4, DANUBE_RCU_RESET);
943                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
944
945                 #if defined(__IS_AMAZON_SE__)
946                     set_bit (4, AMAZON_SE_RCU_RESET);
947                         MDELAY(500);
948                     clear_bit (4, AMAZON_SE_RCU_RESET);
949                         MDELAY(500);
950                 #endif //defined(__IS_AMAZON_SE__)
951
952                 #if defined(__IS_AR9__)
953                         if(_core_if->core_no==0)
954                         {
955                                 set_bit (4, AR9_RCU_USBRESET);
956                                 MDELAY(500);
957                                 clear_bit (4, AR9_RCU_USBRESET);
958                         }
959                         else
960                         {
961                                 set_bit (28, AR9_RCU_USBRESET);
962                                 MDELAY(500);
963                                 clear_bit (28, AR9_RCU_USBRESET);
964                         }
965                         MDELAY(500);
966                 #endif //defined(__IS_AR9__)
967                 #if defined(__IS_VR9__)
968                         if(!already_hard_reset)
969                         {
970                                 set_bit (4, VR9_RCU_USBRESET);
971                                 MDELAY(500);
972                                 clear_bit (4, VR9_RCU_USBRESET);
973                                 MDELAY(500);
974                                 already_hard_reset=1;
975                         }
976                 #endif //defined(__IS_VR9__)
977
978                 #if defined(__IS_TWINPASS__)
979                         ifxusb_enable_afe_oc();
980                 #endif
981
982                 if(_core_if->core_global_regs)
983                 {
984                         // PHY configurations.
985                         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
986                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
987                         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
988                         #if defined(__IS_AMAZON_SE__)
989                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
990                         #endif //defined(__IS_AMAZON_SE__)
991                         #if defined(__IS_AR9__)
992                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
993                         #endif //defined(__IS_AR9__)
994                         #if defined(__IS_VR9__)
995                         //      ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
996                         #endif //defined(__IS_VR9__)
997                 }
998         #else //defined(__UEIP__)
999                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1000                         #if defined (__IS_HOST__)
1001                                 clear_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1002                         #elif defined (__IS_DEVICE__)
1003                                 set_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1004                         #endif
1005                 #endif //defined(__IS_AMAZON_SE__)
1006
1007                 #if defined(__IS_AMAZON_SE__)
1008                         #if defined (__IS_HOST__)
1009                                 clear_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1010                         #elif defined (__IS_DEVICE__)
1011                                 set_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1012                         #endif
1013                 #endif //defined(__IS_AMAZON_SE__)
1014
1015                 #if defined(__IS_AR9__)
1016                         if(_core_if->core_no==0)
1017                         {
1018                                 #if defined (__IS_HOST__)
1019                                         clear_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG);
1020                                 #elif defined (__IS_DEVICE__)
1021                                         set_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG);
1022                                 #endif
1023                         }
1024                         else
1025                         {
1026                                 #if defined (__IS_HOST__)
1027                                         clear_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG);
1028                                 #elif defined (__IS_DEVICE__)
1029                                         set_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG);
1030                                 #endif
1031                         }
1032                 #endif //defined(__IS_AR9__)
1033
1034                 // set the HC's byte-order to big-endian
1035                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1036                         set_bit   (DANUBE_USBCFG_HOST_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1037                         clear_bit (DANUBE_USBCFG_SLV_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG);
1038                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1039                 #if defined(__IS_AMAZON_SE__)
1040                         set_bit (AMAZON_SE_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1041                         clear_bit (AMAZON_SE_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG);
1042                 #endif //defined(__IS_AMAZON_SE__)
1043                 #if defined(__IS_AR9__)
1044                         if(_core_if->core_no==0)
1045                         {
1046                                 set_bit   (AMAZON_S_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG);
1047                                 clear_bit (AMAZON_S_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG);
1048                         }
1049                         else
1050                         {
1051                                 set_bit   (AMAZON_S_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG);
1052                                 clear_bit (AMAZON_S_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG);
1053                         }
1054                 #endif //defined(__IS_AR9__)
1055
1056                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1057                     set_bit (4, DANUBE_RCU_RESET);
1058                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1059                 #if defined(__IS_AMAZON_SE__)
1060                     set_bit (4, AMAZON_SE_RCU_RESET);
1061                 #endif //defined(__IS_AMAZON_SE__)
1062                 #if defined(__IS_AR9__)
1063                         if(_core_if->core_no==0)
1064                         {
1065                                 set_bit (4, AMAZON_S_RCU_USBRESET);
1066                         }
1067                         else
1068                         {
1069                                 set_bit (28, AMAZON_S_RCU_USBRESET);
1070                         }
1071                 #endif //defined(__IS_AR9__)
1072
1073                 MDELAY(500);
1074
1075                 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1076                     clear_bit (4, DANUBE_RCU_RESET);
1077                 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1078                 #if defined(__IS_AMAZON_SE__)
1079                     clear_bit (4, AMAZON_SE_RCU_RESET);
1080                 #endif //defined(__IS_AMAZON_SE__)
1081                 #if defined(__IS_AR9__)
1082                         if(_core_if->core_no==0)
1083                         {
1084                                 clear_bit (4, AMAZON_S_RCU_USBRESET);
1085                         }
1086                         else
1087                         {
1088                                 clear_bit (28, AMAZON_S_RCU_USBRESET);
1089                         }
1090                 #endif //defined(__IS_AR9__)
1091
1092                 MDELAY(500);
1093
1094                 #if defined(__IS_TWINPASS__)
1095                         ifxusb_enable_afe_oc();
1096                 #endif
1097
1098                 if(_core_if->core_global_regs)
1099                 {
1100                         // PHY configurations.
1101                         #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1102                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1103                         #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
1104                         #if defined(__IS_AMAZON_SE__)
1105                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1106                         #endif //defined(__IS_AMAZON_SE__)
1107                         #if defined(__IS_AR9__)
1108                                 ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014);
1109                         #endif //defined(__IS_AR9__)
1110                 }
1111         #endif //defined(__UEIP__)
1112 }
1113
1114 #if defined(__GADGET_LED__) || defined(__HOST_LED__)
1115         #if defined(__UEIP__)
1116                 static void *g_usb_led_trigger  = NULL;
1117         #endif
1118
1119         void ifxusb_led_init(ifxusb_core_if_t *_core_if)
1120         {
1121                 #if defined(__UEIP__)
1122                         if ( !g_usb_led_trigger )
1123                         {
1124                                 ifx_led_trigger_register("usb_link", &g_usb_led_trigger);
1125                                 if ( g_usb_led_trigger != NULL )
1126                                 {
1127                                         struct ifx_led_trigger_attrib attrib = {0};
1128                                         attrib.delay_on     = 250;
1129                                         attrib.delay_off    = 250;
1130                                         attrib.timeout      = 2000;
1131                                         attrib.def_value    = 1;
1132                                         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;
1133                                         IFX_DEBUGP("Reg USB LED!!\n");
1134                                         ifx_led_trigger_set_attrib(g_usb_led_trigger, &attrib);
1135                                 }
1136                         }
1137                 #endif //defined(__UEIP__)
1138         }
1139
1140         void ifxusb_led_free(ifxusb_core_if_t *_core_if)
1141         {
1142                 #if defined(__UEIP__)
1143                         if ( g_usb_led_trigger )
1144                         {
1145                             ifx_led_trigger_deregister(g_usb_led_trigger);
1146                             g_usb_led_trigger = NULL;
1147                         }
1148                 #endif //defined(__UEIP__)
1149         }
1150
1151         /*!
1152            \brief Turn off the USB 5V VBus Power
1153            \param _core_if        Pointer of core_if structure
1154          */
1155         void ifxusb_led(ifxusb_core_if_t *_core_if)
1156         {
1157                 #if defined(__UEIP__)
1158                         if(g_usb_led_trigger)
1159                                 ifx_led_trigger_activate(g_usb_led_trigger);
1160                 #else
1161                 #endif //defined(__UEIP__)
1162         }
1163 #endif // defined(__GADGET_LED__) || defined(__HOST_LED__)
1164
1165
1166
1167 #if defined(__IS_HOST__) && defined(__DO_OC_INT__) && defined(__DO_OC_INT_ENABLE__)
1168 /*!
1169  \brief Turn on the OC Int
1170  */
1171         void ifxusb_oc_int_on()
1172         {
1173                 #if defined(__UEIP__)
1174                 #else
1175                         #if defined(__IS_TWINPASS__)
1176                                 irq_enable(DANUBE_USB_OC_INT);
1177                         #endif
1178                 #endif //defined(__UEIP__)
1179         }
1180 /*!
1181  \brief Turn off the OC Int
1182  */
1183         void ifxusb_oc_int_off()
1184         {
1185                 #if defined(__UEIP__)
1186                 #else
1187                         #if defined(__IS_TWINPASS__)
1188                                 irq_disable(DANUBE_USB_OC_INT);
1189                         #endif
1190                 #endif //defined(__UEIP__)
1191         }
1192 #endif //defined(__IS_HOST__) && defined(__DO_OC_INT__) && defined(__DO_OC_INT_ENABLE__)
1193
1194 /* internal routines for debugging */
1195 void ifxusb_dump_msg(const u8 *buf, unsigned int length)
1196 {
1197 #ifdef __DEBUG__
1198         unsigned int    start, num, i;
1199         char            line[52], *p;
1200
1201         if (length >= 512)
1202                 return;
1203         start = 0;
1204         while (length > 0)
1205         {
1206                 num = min(length, 16u);
1207                 p = line;
1208                 for (i = 0; i < num; ++i)
1209                 {
1210                         if (i == 8)
1211                                 *p++ = ' ';
1212                         sprintf(p, " %02x", buf[i]);
1213                         p += 3;
1214                 }
1215                 *p = 0;
1216                 IFX_PRINT( "%6x: %s\n", start, line);
1217                 buf += num;
1218                 start += num;
1219                 length -= num;
1220         }
1221 #endif
1222 }
1223
1224 /* This functions reads the SPRAM and prints its content */
1225 void ifxusb_dump_spram(ifxusb_core_if_t *_core_if)
1226 {
1227 #ifdef __ENABLE_DUMP__
1228         volatile uint8_t *addr, *start_addr, *end_addr;
1229         uint32_t size;
1230         IFX_PRINT("SPRAM Data:\n");
1231         start_addr = (void*)_core_if->core_global_regs;
1232         IFX_PRINT("Base Address: 0x%8X\n", (uint32_t)start_addr);
1233
1234         start_addr = (void*)_core_if->data_fifo_dbg;
1235         IFX_PRINT("Starting Address: 0x%8X\n", (uint32_t)start_addr);
1236
1237         size=_core_if->hwcfg3.b.dfifo_depth;
1238         size<<=2;
1239         size+=0x200;
1240         size&=0x0003FFFC;
1241
1242         end_addr = (void*)_core_if->data_fifo_dbg;
1243         end_addr += size;
1244
1245         for(addr = start_addr; addr < end_addr; addr+=16)
1246         {
1247                 IFX_PRINT("0x%8X:\t%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", (uint32_t)addr,
1248                         addr[ 0], addr[ 1], addr[ 2], addr[ 3],
1249                         addr[ 4], addr[ 5], addr[ 6], addr[ 7],
1250                         addr[ 8], addr[ 9], addr[10], addr[11],
1251                         addr[12], addr[13], addr[14], addr[15]
1252                         );
1253         }
1254         return;
1255 #endif //__ENABLE_DUMP__
1256 }
1257
1258
1259
1260
1261 /* This function reads the core global registers and prints them */
1262 void ifxusb_dump_registers(ifxusb_core_if_t *_core_if)
1263 {
1264 #ifdef __ENABLE_DUMP__
1265         int i;
1266         volatile uint32_t *addr;
1267         #ifdef __IS_DEVICE__
1268                 volatile uint32_t *addri,*addro;
1269         #endif
1270
1271         IFX_PRINT("Core Global Registers\n");
1272         addr=&_core_if->core_global_regs->gotgctl;
1273         IFX_PRINT("GOTGCTL   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1274         addr=&_core_if->core_global_regs->gotgint;
1275         IFX_PRINT("GOTGINT   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1276         addr=&_core_if->core_global_regs->gahbcfg;
1277         IFX_PRINT("GAHBCFG   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1278         addr=&_core_if->core_global_regs->gusbcfg;
1279         IFX_PRINT("GUSBCFG   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1280         addr=&_core_if->core_global_regs->grstctl;
1281         IFX_PRINT("GRSTCTL   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1282         addr=&_core_if->core_global_regs->gintsts;
1283         IFX_PRINT("GINTSTS   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1284         addr=&_core_if->core_global_regs->gintmsk;
1285         IFX_PRINT("GINTMSK   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1286         addr=&_core_if->core_global_regs->gi2cctl;
1287         IFX_PRINT("GI2CCTL   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1288         addr=&_core_if->core_global_regs->gpvndctl;
1289         IFX_PRINT("GPVNDCTL  @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1290         addr=&_core_if->core_global_regs->ggpio;
1291         IFX_PRINT("GGPIO     @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1292         addr=&_core_if->core_global_regs->guid;
1293         IFX_PRINT("GUID      @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1294         addr=&_core_if->core_global_regs->gsnpsid;
1295         IFX_PRINT("GSNPSID   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1296         addr=&_core_if->core_global_regs->ghwcfg1;
1297         IFX_PRINT("GHWCFG1   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1298         addr=&_core_if->core_global_regs->ghwcfg2;
1299         IFX_PRINT("GHWCFG2   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1300         addr=&_core_if->core_global_regs->ghwcfg3;
1301         IFX_PRINT("GHWCFG3   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1302         addr=&_core_if->core_global_regs->ghwcfg4;
1303         IFX_PRINT("GHWCFG4   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1304
1305         addr=_core_if->pcgcctl;
1306         IFX_PRINT("PCGCCTL   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1307
1308         addr=&_core_if->core_global_regs->grxfsiz;
1309         IFX_PRINT("GRXFSIZ   @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1310
1311         #ifdef __IS_HOST__
1312                 addr=&_core_if->core_global_regs->gnptxfsiz;
1313                 IFX_PRINT("GNPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1314                 addr=&_core_if->core_global_regs->hptxfsiz;
1315                 IFX_PRINT("HPTXFSIZ  @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1316         #endif //__IS_HOST__
1317
1318         #ifdef __IS_DEVICE__
1319                 #ifdef __DED_FIFO__
1320                         addr=&_core_if->core_global_regs->gnptxfsiz;
1321                         IFX_PRINT("GNPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1322                         for (i=0; i<= _core_if->hwcfg4.b.num_in_eps; i++)
1323                         {
1324                                 addr=&_core_if->core_global_regs->dptxfsiz_dieptxf[i];
1325                                 IFX_PRINT("DPTXFSIZ[%d] @0x%08X : 0x%08X\n",i,(uint32_t)addr,ifxusb_rreg(addr));
1326                         }
1327                 #else
1328                         addr=&_core_if->core_global_regs->gnptxfsiz;
1329                         IFX_PRINT("TXFSIZ[00] @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1330                         for (i=0; i< _core_if->hwcfg4.b.num_dev_perio_in_ep; i++)
1331                         {
1332                                 addr=&_core_if->core_global_regs->dptxfsiz_dieptxf[i];
1333                                 IFX_PRINT("TXFSIZ[%02d] @0x%08X : 0x%08X\n",i+1,(uint32_t)addr,ifxusb_rreg(addr));
1334                         }
1335                 #endif
1336         #endif //__IS_DEVICE__
1337
1338         #ifdef __IS_HOST__
1339                 IFX_PRINT("Host Global Registers\n");
1340                 addr=&_core_if->host_global_regs->hcfg;
1341                 IFX_PRINT("HCFG          @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1342                 addr=&_core_if->host_global_regs->hfir;
1343                 IFX_PRINT("HFIR          @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1344                 addr=&_core_if->host_global_regs->hfnum;
1345                 IFX_PRINT("HFNUM         @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1346                 addr=&_core_if->host_global_regs->hptxsts;
1347                 IFX_PRINT("HPTXSTS       @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1348                 addr=&_core_if->host_global_regs->haint;
1349                 IFX_PRINT("HAINT         @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1350                 addr=&_core_if->host_global_regs->haintmsk;
1351                 IFX_PRINT("HAINTMSK      @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1352                 addr= _core_if->hprt0;
1353                 IFX_PRINT("HPRT0         @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1354
1355                 for (i=0; i<MAX_EPS_CHANNELS; i++)
1356                 {
1357                         IFX_PRINT("Host Channel %d Specific Registers\n", i);
1358                         addr=&_core_if->hc_regs[i]->hcchar;
1359                         IFX_PRINT("HCCHAR        @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1360                         addr=&_core_if->hc_regs[i]->hcsplt;
1361                         IFX_PRINT("HCSPLT        @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1362                         addr=&_core_if->hc_regs[i]->hcint;
1363                         IFX_PRINT("HCINT         @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1364                         addr=&_core_if->hc_regs[i]->hcintmsk;
1365                         IFX_PRINT("HCINTMSK      @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1366                         addr=&_core_if->hc_regs[i]->hctsiz;
1367                         IFX_PRINT("HCTSIZ        @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1368                         addr=&_core_if->hc_regs[i]->hcdma;
1369                         IFX_PRINT("HCDMA         @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1370                 }
1371         #endif //__IS_HOST__
1372
1373         #ifdef __IS_DEVICE__
1374                 IFX_PRINT("Device Global Registers\n");
1375                 addr=&_core_if->dev_global_regs->dcfg;
1376                 IFX_PRINT("DCFG          @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1377                 addr=&_core_if->dev_global_regs->dctl;
1378                 IFX_PRINT("DCTL          @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1379                 addr=&_core_if->dev_global_regs->dsts;
1380                 IFX_PRINT("DSTS          @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1381                 addr=&_core_if->dev_global_regs->diepmsk;
1382                 IFX_PRINT("DIEPMSK       @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1383                 addr=&_core_if->dev_global_regs->doepmsk;
1384                 IFX_PRINT("DOEPMSK       @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1385                 addr=&_core_if->dev_global_regs->daintmsk;
1386                 IFX_PRINT("DAINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1387                 addr=&_core_if->dev_global_regs->daint;
1388                 IFX_PRINT("DAINT         @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1389                 addr=&_core_if->dev_global_regs->dvbusdis;
1390                 IFX_PRINT("DVBUSID       @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1391                 addr=&_core_if->dev_global_regs->dvbuspulse;
1392                 IFX_PRINT("DVBUSPULSE   @0x%08X : 0x%08X\n", (uint32_t)addr,ifxusb_rreg(addr));
1393
1394                 addr=&_core_if->dev_global_regs->dtknqr1;
1395                 IFX_PRINT("DTKNQR1       @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1396                 if (_core_if->hwcfg2.b.dev_token_q_depth > 6) {
1397                         addr=&_core_if->dev_global_regs->dtknqr2;
1398                         IFX_PRINT("DTKNQR2       @0x%08X : 0x%08X\n", (uint32_t)addr,ifxusb_rreg(addr));
1399                 }
1400
1401                 if (_core_if->hwcfg2.b.dev_token_q_depth > 14)
1402                 {
1403                         addr=&_core_if->dev_global_regs->dtknqr3_dthrctl;
1404                         IFX_PRINT("DTKNQR3_DTHRCTL       @0x%08X : 0x%08X\n", (uint32_t)addr, ifxusb_rreg(addr));
1405                 }
1406
1407                 if (_core_if->hwcfg2.b.dev_token_q_depth > 22)
1408                 {
1409                         addr=&_core_if->dev_global_regs->dtknqr4_fifoemptymsk;
1410                         IFX_PRINT("DTKNQR4       @0x%08X : 0x%08X\n", (uint32_t)addr, ifxusb_rreg(addr));
1411                 }
1412
1413                 //for (i=0; i<= MAX_EPS_CHANNELS; i++)
1414                 //for (i=0; i<= 10; i++)
1415                 for (i=0; i<= 3; i++)
1416                 {
1417                         IFX_PRINT("Device EP %d Registers\n", i);
1418                         addri=&_core_if->in_ep_regs[i]->diepctl;addro=&_core_if->out_ep_regs[i]->doepctl;
1419                         IFX_PRINT("DEPCTL        I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1420                                                                 addro=&_core_if->out_ep_regs[i]->doepfn;
1421                         IFX_PRINT("DEPFN         I:            O: 0x%08X\n",ifxusb_rreg(addro));
1422                         addri=&_core_if->in_ep_regs[i]->diepint;addro=&_core_if->out_ep_regs[i]->doepint;
1423                         IFX_PRINT("DEPINT        I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1424                         addri=&_core_if->in_ep_regs[i]->dieptsiz;addro=&_core_if->out_ep_regs[i]->doeptsiz;
1425                         IFX_PRINT("DETSIZ        I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1426                         addri=&_core_if->in_ep_regs[i]->diepdma;addro=&_core_if->out_ep_regs[i]->doepdma;
1427                         IFX_PRINT("DEPDMA        I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1428                         addri=&_core_if->in_ep_regs[i]->dtxfsts;
1429                         IFX_PRINT("DTXFSTS       I: 0x%08X\n",ifxusb_rreg(addri)                   );
1430                         addri=&_core_if->in_ep_regs[i]->diepdmab;addro=&_core_if->out_ep_regs[i]->doepdmab;
1431                         IFX_PRINT("DEPDMAB       I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro));
1432                 }
1433         #endif //__IS_DEVICE__
1434 #endif //__ENABLE_DUMP__
1435 }
1436
1437 void ifxusb_clean_spram(ifxusb_core_if_t *_core_if,uint32_t dwords)
1438 {
1439         volatile uint32_t *addr1,*addr2, *start_addr, *end_addr;
1440
1441         if(!dwords)
1442                 return;
1443
1444         start_addr = (uint32_t *)_core_if->data_fifo_dbg;
1445
1446         end_addr = (uint32_t *)_core_if->data_fifo_dbg;
1447         end_addr += dwords;
1448
1449         IFX_PRINT("Clearning SPRAM: 0x%8X-0x%8X\n", (uint32_t)start_addr,(uint32_t)end_addr);
1450         for(addr1 = start_addr; addr1 < end_addr; addr1+=4)
1451         {
1452                 for(addr2 = addr1; addr2 < addr1+4; addr2++)
1453                         *addr2=0x00000000;
1454         }
1455         IFX_PRINT("Clearning SPRAM: 0x%8X-0x%8X Done\n", (uint32_t)start_addr,(uint32_t)end_addr);
1456         return;
1457 }
1458