1 /*****************************************************************************
2 ** FILE NAME : ifxusb_cif.c
3 ** PROJECT : IFX USB sub-system V3
4 ** MODULES : IFX USB sub-system Host and Device driver
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 *****************************************************************************/
15 \ingroup IFXUSB_DRIVER_V3
16 \brief This file contains the interface to the IFX USB Core.
19 #include <linux/clk.h>
20 #include <linux/version.h>
21 #include "ifxusb_version.h"
23 #include <asm/byteorder.h>
24 #include <asm/unaligned.h>
27 #include <linux/jiffies.h>
28 #include <linux/platform_device.h>
29 #include <linux/kernel.h>
30 #include <linux/ioport.h>
33 // #include <asm/ifx/ifx_pmu.h>
34 // #include <ifx_pmu.h>
38 #include "ifxusb_plat.h"
39 #include "ifxusb_regs.h"
40 #include "ifxusb_cif.h"
53 #include <linux/gfp.h>
56 // #include <asm/ifx/ifx_board.h>
57 //#include <ifx_board.h>
60 //#include <asm/ifx/ifx_gpio.h>
61 //#include <ifx_gpio.h>
63 // #include <asm/ifx/ifx_led.h>
64 //#include <ifx_led.h>
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)
74 #ifndef USB_PHY_PMU_SETUP
75 #define USB_PHY_PMU_SETUP(__x) USB0_PHY_PMU_SETUP(__x)
77 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__)
78 #endif // defined(__UEIP__)
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
87 void *ifxusb_alloc_buf(size_t size, int clear)
89 uint32_t *cached,*uncached;
90 uint32_t totalsize,page;
95 size=(size+3)&0xFFFFFFFC;
97 page=get_order(totalsize);
99 cached = (void *) __get_free_pages(( GFP_ATOMIC | GFP_DMA), page);
103 IFX_PRINT("%s Allocation Failed size:%d\n",__func__,size);
107 uncached = (uint32_t *)(KSEG1ADDR(cached));
109 memset(uncached, 0, totalsize);
111 *(uncached+0)=totalsize;
113 *(uncached+2)=(uint32_t)cached;
114 return (void *)(uncached+3);
119 \brief This function is called to free allocated buffer.
120 \param vaddr the uncached pointer of the buffer
122 void ifxusb_free_buf(void *vaddr)
124 uint32_t totalsize,page;
125 uint32_t *cached,*uncached;
131 totalsize=*(uncached+0);
133 cached=(uint32_t *)(*(uncached+2));
134 if(totalsize && page==get_order(totalsize) && cached==(uint32_t *)(KSEG0ADDR(uncached)))
136 free_pages((unsigned long)cached, page);
139 // the memory is not allocated by ifxusb_alloc_buf. Allowed but must be careful.
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.
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
160 int ifxusb_core_if_init(ifxusb_core_if_t *_core_if,
162 uint32_t _reg_base_addr,
163 uint32_t _fifo_base_addr,
164 uint32_t _fifo_dbg_addr)
167 uint32_t *reg_base =NULL;
168 uint32_t *fifo_base =NULL;
169 uint32_t *fifo_dbg =NULL;
173 IFX_DEBUGPL(DBG_CILV, "%s(%p,%d,0x%08X,0x%08X,0x%08X)\n", __func__,
180 if( _core_if == NULL)
182 IFX_ERROR("%s() invalid _core_if\n", __func__);
187 //memset(_core_if, 0, sizeof(ifxusb_core_if_t));
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)
196 IFX_ERROR("%s() usb ioremap() failed\n", __func__);
201 _core_if->core_global_regs = (ifxusb_core_global_regs_t *)reg_base;
204 * Attempt to ensure this device is really a IFXUSB Controller.
205 * Read and verify the SNPSID register contents. The value should be
210 snpsid = ifxusb_rreg(&_core_if->core_global_regs->gsnpsid);
211 if ((snpsid & 0xFFFFF000) != 0x4F542000)
213 IFX_ERROR("%s() snpsid error(0x%08x) failed\n", __func__,snpsid);
217 _core_if->snpsid=snpsid;
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);
225 for (i=0; i<MAX_EPS_CHANNELS; i++)
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);
236 _core_if->dev_global_regs =
237 (ifxusb_device_global_regs_t *)((uint32_t)reg_base + IFXUSB_DEV_GLOBAL_REG_OFFSET);
239 for (i=0; i<MAX_EPS_CHANNELS; i++)
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)
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)
256 #endif //__IS_DEVICE__
258 /* Setting the FIFO and other Address. */
259 for (i=0; i<MAX_EPS_CHANNELS; i++)
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]);
266 _core_if->data_fifo_dbg = fifo_dbg;
267 _core_if->pcgcctl = (uint32_t*)(((uint32_t)reg_base) + IFXUSB_PCGCCTL_OFFSET);
270 * Store the contents of the hardware configuration registers here for
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);
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);
285 IFX_PRINT("Waiting for PHY Clock Lock!\n");
286 while(!( ifxusb_rreg(&_core_if->core_global_regs->grxfsiz) & (1<<9)))
289 IFX_PRINT("PHY Clock Locked!\n");
290 //ifxusb_clean_spram(_core_if,128*1024/4);
293 /* Create new workqueue and init works */
295 _core_if->wq_usb = create_singlethread_workqueue(_core_if->core_name);
297 if(_core_if->wq_usb == 0)
299 IFX_DEBUGPL(DBG_CIL, "Creation of wq_usb failed\n");
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);
308 INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change);
309 INIT_DELAYED_WORK(&core_if->w_wkp, w_wakeup_detected);
315 if( reg_base != NULL) iounmap(reg_base );
316 if( fifo_base != NULL) iounmap(fifo_base);
317 if( fifo_dbg != NULL) iounmap(fifo_dbg );
322 \brief This function free the mapped address in the IFXUSB CSR data structures.
323 \param _core_if Pointer of core_if structure
325 void ifxusb_core_if_remove(ifxusb_core_if_t *_core_if)
327 /* Disable all interrupts */
328 if( _core_if->core_global_regs != NULL)
330 ifxusb_mreg( &_core_if->core_global_regs->gahbcfg, 1, 0);
331 ifxusb_wreg( &_core_if->core_global_regs->gintmsk, 0);
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 );
339 if (_core_if->wq_usb)
340 destroy_workqueue(_core_if->wq_usb);
342 memset(_core_if, 0, sizeof(ifxusb_core_if_t));
349 \brief This function enbles the controller's Global Interrupt in the AHB Config register.
350 \param _core_if Pointer of core_if structure
352 void ifxusb_enable_global_interrupts( ifxusb_core_if_t *_core_if )
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);
360 \brief This function disables the controller's Global Interrupt in the AHB Config register.
361 \param _core_if Pointer of core_if structure
363 void ifxusb_disable_global_interrupts( ifxusb_core_if_t *_core_if )
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);
374 \brief Flush Tx and Rx FIFO.
375 \param _core_if Pointer of core_if structure
377 void ifxusb_flush_both_fifo( ifxusb_core_if_t *_core_if )
379 ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
380 volatile grstctl_t greset ={ .d32 = 0};
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;
389 ifxusb_wreg( &global_regs->grstctl, greset.d32 );
393 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
396 IFX_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, greset.d32);
399 } while (greset.b.rxfflsh == 1 || greset.b.txfflsh == 1);
400 /* Wait for 3 PHY Clocks*/
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 )
409 void ifxusb_flush_tx_fifo( ifxusb_core_if_t *_core_if, const int _num )
411 ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
412 volatile grstctl_t greset ={ .d32 = 0};
415 IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "Flush Tx FIFO %d\n", _num);
417 greset.b.intknqflsh=1;
418 greset.b.txfflsh = 1;
419 greset.b.txfnum = _num;
420 ifxusb_wreg( &global_regs->grstctl, greset.d32 );
424 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
425 if (++count > 10000&&(_num==0 ||_num==0x10))
427 IFX_WARN("%s() HANG! GRSTCTL=%0x GNPTXSTS=0x%08x\n",
428 __func__, greset.d32,
429 ifxusb_rreg( &global_regs->gnptxsts));
432 } while (greset.b.txfflsh == 1);
433 /* Wait for 3 PHY Clocks*/
439 \brief Flush Rx FIFO.
440 \param _core_if Pointer of core_if structure
442 void ifxusb_flush_rx_fifo( ifxusb_core_if_t *_core_if )
444 ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
445 volatile grstctl_t greset ={ .d32 = 0};
448 IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "%s\n", __func__);
449 greset.b.rxfflsh = 1;
450 ifxusb_wreg( &global_regs->grstctl, greset.d32 );
454 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
457 IFX_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, greset.d32);
460 } while (greset.b.rxfflsh == 1);
461 /* Wait for 3 PHY Clocks*/
466 #define SOFT_RESET_DELAY 100
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
473 int ifxusb_core_soft_reset(ifxusb_core_if_t *_core_if)
475 ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs;
476 volatile grstctl_t greset ={ .d32 = 0};
479 IFX_DEBUGPL(DBG_CILV, "%s\n", __func__);
480 /* Wait for AHB master IDLE state. */
484 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
485 if (++count > 100000)
487 IFX_WARN("%s() HANG! AHB Idle GRSTCTL=%0x %x\n", __func__,
488 greset.d32, greset.b.ahbidle);
491 } while (greset.b.ahbidle == 0);
495 /* Core Soft Reset */
497 greset.b.csftrst = 1;
498 ifxusb_wreg( &global_regs->grstctl, greset.d32 );
500 #ifdef SOFT_RESET_DELAY
501 MDELAY(SOFT_RESET_DELAY);
507 greset.d32 = ifxusb_rreg( &global_regs->grstctl);
508 if (++count > 100000)
510 IFX_WARN("%s() HANG! Soft Reset GRSTCTL=%0x\n", __func__, greset.d32);
513 } while (greset.b.csftrst == 1);
515 #ifdef SOFT_RESET_DELAY
516 MDELAY(SOFT_RESET_DELAY);
520 #if defined(__IS_VR9__)
521 if(_core_if->core_no==0)
523 set_bit (4, VR9_RCU_USBRESET2);
525 clear_bit (4, VR9_RCU_USBRESET2);
529 set_bit (5, VR9_RCU_USBRESET2);
531 clear_bit (5, VR9_RCU_USBRESET2);
534 #endif //defined(__IS_VR9__)
536 IFX_PRINT("USB core #%d soft-reset\n",_core_if->core_no);
542 \brief Turn on the USB Core Power
543 \param _core_if Pointer of core_if structure
545 void ifxusb_power_on (ifxusb_core_if_t *_core_if)
547 struct clk *clk0 = clk_get_sys("usb0", NULL);
548 struct clk *clk1 = clk_get_sys("usb1", NULL);
550 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
551 #if defined(__UEIP__)
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__)
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();
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)
582 // USB0_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
585 // USB1_CTRL_PMU_SETUP(IFX_PMU_ENABLE);
586 #endif //defined(__IS_AR9__) || defined(__IS_VR9__)
588 if(_core_if->core_global_regs)
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__)
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__)
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();
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
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__)
643 if(_core_if->core_global_regs)
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__)
657 #endif //defined(__UEIP__)
661 \brief Turn off the USB Core Power
662 \param _core_if Pointer of core_if structure
664 void ifxusb_power_off (ifxusb_core_if_t *_core_if)
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);
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)
678 //USB0_CTRL_PMU_SETUP(IFX_PMU_DISABLE);
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
694 set_bit (27, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB
695 #endif //defined(__IS_AR9__)
696 #endif //defined(__UEIP__)
700 \brief Turn on the USB PHY Power
701 \param _core_if Pointer of core_if structure
703 void ifxusb_phy_power_on (ifxusb_core_if_t *_core_if)
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)
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);
723 set_bit (0, VR9_RCU_USB_ANA_CFG1B);
724 #endif //defined(__IS_VR9__)
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)
733 //USB0_PHY_PMU_SETUP(IFX_PMU_ENABLE);
736 //USB1_PHY_PMU_SETUP(IFX_PMU_ENABLE);
737 #endif //defined(__IS_AR9__) || defined(__IS_VR9__)
739 // PHY configurations.
740 if(_core_if->core_global_regs)
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);
755 set_bit (0, VR9_RCU_USB_ANA_CFG1B);
756 #endif //defined(__IS_VR9__)
758 #else //defined(__UEIP__)
759 // PHY configurations.
760 if(_core_if->core_global_regs)
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__)
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
783 clear_bit (26, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
784 #endif //defined(__IS_AR9__)
786 // PHY configurations.
787 if(_core_if->core_global_regs)
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__)
799 #endif //defined(__UEIP__)
804 \brief Turn off the USB PHY Power
805 \param _core_if Pointer of core_if structure
807 void ifxusb_phy_power_off (ifxusb_core_if_t *_core_if)
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)
818 //USB0_PHY_PMU_SETUP(IFX_PMU_DISABLE);
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
834 set_bit (26, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY
835 #endif //defined(__IS_AR9__)
836 #endif //defined(__UEIP__)
841 \brief Reset on the USB Core RCU
842 \param _core_if Pointer of core_if structure
844 #if defined(__IS_VR9__)
845 int already_hard_reset=0;
847 void ifxusb_hard_reset(ifxusb_core_if_t *_core_if)
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);
856 #endif //defined(__IS_AMAZON_SE__)
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);
864 #endif //defined(__IS_AMAZON_SE__)
866 #if defined(__IS_AR9__)
867 if(_core_if->core_no==0)
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);
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);
883 #endif //defined(__IS_AR9__)
885 #if defined(__IS_VR9__)
886 if(_core_if->core_no==0)
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);
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);
902 #endif //defined(__IS_VR9__)
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)
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);
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);
925 #endif //defined(__IS_AR9__)
926 #if defined(__IS_VR9__)
927 if(_core_if->core_no==0)
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);
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);
937 #endif //defined(__IS_VR9__)
939 #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
940 set_bit (4, DANUBE_RCU_RESET);
942 clear_bit (4, DANUBE_RCU_RESET);
943 #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__)
945 #if defined(__IS_AMAZON_SE__)
946 set_bit (4, AMAZON_SE_RCU_RESET);
948 clear_bit (4, AMAZON_SE_RCU_RESET);
950 #endif //defined(__IS_AMAZON_SE__)
952 #if defined(__IS_AR9__)
953 if(_core_if->core_no==0)
955 set_bit (4, AR9_RCU_USBRESET);
957 clear_bit (4, AR9_RCU_USBRESET);
961 set_bit (28, AR9_RCU_USBRESET);
963 clear_bit (28, AR9_RCU_USBRESET);
966 #endif //defined(__IS_AR9__)
967 #if defined(__IS_VR9__)
968 if(!already_hard_reset)
970 set_bit (4, VR9_RCU_USBRESET);
972 clear_bit (4, VR9_RCU_USBRESET);
974 already_hard_reset=1;
976 #endif //defined(__IS_VR9__)
978 #if defined(__IS_TWINPASS__)
979 ifxusb_enable_afe_oc();
982 if(_core_if->core_global_regs)
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__)
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);
1005 #endif //defined(__IS_AMAZON_SE__)
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);
1013 #endif //defined(__IS_AMAZON_SE__)
1015 #if defined(__IS_AR9__)
1016 if(_core_if->core_no==0)
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);
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);
1032 #endif //defined(__IS_AR9__)
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)
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);
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);
1054 #endif //defined(__IS_AR9__)
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)
1065 set_bit (4, AMAZON_S_RCU_USBRESET);
1069 set_bit (28, AMAZON_S_RCU_USBRESET);
1071 #endif //defined(__IS_AR9__)
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)
1084 clear_bit (4, AMAZON_S_RCU_USBRESET);
1088 clear_bit (28, AMAZON_S_RCU_USBRESET);
1090 #endif //defined(__IS_AR9__)
1094 #if defined(__IS_TWINPASS__)
1095 ifxusb_enable_afe_oc();
1098 if(_core_if->core_global_regs)
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__)
1111 #endif //defined(__UEIP__)
1114 #if defined(__GADGET_LED__) || defined(__HOST_LED__)
1115 #if defined(__UEIP__)
1116 static void *g_usb_led_trigger = NULL;
1119 void ifxusb_led_init(ifxusb_core_if_t *_core_if)
1121 #if defined(__UEIP__)
1122 if ( !g_usb_led_trigger )
1124 ifx_led_trigger_register("usb_link", &g_usb_led_trigger);
1125 if ( g_usb_led_trigger != NULL )
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);
1137 #endif //defined(__UEIP__)
1140 void ifxusb_led_free(ifxusb_core_if_t *_core_if)
1142 #if defined(__UEIP__)
1143 if ( g_usb_led_trigger )
1145 ifx_led_trigger_deregister(g_usb_led_trigger);
1146 g_usb_led_trigger = NULL;
1148 #endif //defined(__UEIP__)
1152 \brief Turn off the USB 5V VBus Power
1153 \param _core_if Pointer of core_if structure
1155 void ifxusb_led(ifxusb_core_if_t *_core_if)
1157 #if defined(__UEIP__)
1158 if(g_usb_led_trigger)
1159 ifx_led_trigger_activate(g_usb_led_trigger);
1161 #endif //defined(__UEIP__)
1163 #endif // defined(__GADGET_LED__) || defined(__HOST_LED__)
1167 #if defined(__IS_HOST__) && defined(__DO_OC_INT__) && defined(__DO_OC_INT_ENABLE__)
1169 \brief Turn on the OC Int
1171 void ifxusb_oc_int_on()
1173 #if defined(__UEIP__)
1175 #if defined(__IS_TWINPASS__)
1176 irq_enable(DANUBE_USB_OC_INT);
1178 #endif //defined(__UEIP__)
1181 \brief Turn off the OC Int
1183 void ifxusb_oc_int_off()
1185 #if defined(__UEIP__)
1187 #if defined(__IS_TWINPASS__)
1188 irq_disable(DANUBE_USB_OC_INT);
1190 #endif //defined(__UEIP__)
1192 #endif //defined(__IS_HOST__) && defined(__DO_OC_INT__) && defined(__DO_OC_INT_ENABLE__)
1194 /* internal routines for debugging */
1195 void ifxusb_dump_msg(const u8 *buf, unsigned int length)
1198 unsigned int start, num, i;
1206 num = min(length, 16u);
1208 for (i = 0; i < num; ++i)
1212 sprintf(p, " %02x", buf[i]);
1216 IFX_PRINT( "%6x: %s\n", start, line);
1224 /* This functions reads the SPRAM and prints its content */
1225 void ifxusb_dump_spram(ifxusb_core_if_t *_core_if)
1227 #ifdef __ENABLE_DUMP__
1228 volatile uint8_t *addr, *start_addr, *end_addr;
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);
1234 start_addr = (void*)_core_if->data_fifo_dbg;
1235 IFX_PRINT("Starting Address: 0x%8X\n", (uint32_t)start_addr);
1237 size=_core_if->hwcfg3.b.dfifo_depth;
1242 end_addr = (void*)_core_if->data_fifo_dbg;
1245 for(addr = start_addr; addr < end_addr; addr+=16)
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]
1255 #endif //__ENABLE_DUMP__
1261 /* This function reads the core global registers and prints them */
1262 void ifxusb_dump_registers(ifxusb_core_if_t *_core_if)
1264 #ifdef __ENABLE_DUMP__
1266 volatile uint32_t *addr;
1267 #ifdef __IS_DEVICE__
1268 volatile uint32_t *addri,*addro;
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));
1305 addr=_core_if->pcgcctl;
1306 IFX_PRINT("PCGCCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
1308 addr=&_core_if->core_global_regs->grxfsiz;
1309 IFX_PRINT("GRXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr));
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__
1318 #ifdef __IS_DEVICE__
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++)
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));
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++)
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));
1336 #endif //__IS_DEVICE__
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));
1355 for (i=0; i<MAX_EPS_CHANNELS; i++)
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));
1371 #endif //__IS_HOST__
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));
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));
1401 if (_core_if->hwcfg2.b.dev_token_q_depth > 14)
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));
1407 if (_core_if->hwcfg2.b.dev_token_q_depth > 22)
1409 addr=&_core_if->dev_global_regs->dtknqr4_fifoemptymsk;
1410 IFX_PRINT("DTKNQR4 @0x%08X : 0x%08X\n", (uint32_t)addr, ifxusb_rreg(addr));
1413 //for (i=0; i<= MAX_EPS_CHANNELS; i++)
1414 //for (i=0; i<= 10; i++)
1415 for (i=0; i<= 3; i++)
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));
1433 #endif //__IS_DEVICE__
1434 #endif //__ENABLE_DUMP__
1437 void ifxusb_clean_spram(ifxusb_core_if_t *_core_if,uint32_t dwords)
1439 volatile uint32_t *addr1,*addr2, *start_addr, *end_addr;
1444 start_addr = (uint32_t *)_core_if->data_fifo_dbg;
1446 end_addr = (uint32_t *)_core_if->data_fifo_dbg;
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)
1452 for(addr2 = addr1; addr2 < addr1+4; addr2++)
1455 IFX_PRINT("Clearning SPRAM: 0x%8X-0x%8X Done\n", (uint32_t)start_addr,(uint32_t)end_addr);