Lines Matching refs:hsotg
67 int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg) in dwc2_backup_global_registers() argument
71 dev_dbg(hsotg->dev, "%s\n", __func__); in dwc2_backup_global_registers()
74 gr = &hsotg->gr_backup; in dwc2_backup_global_registers()
76 gr->gotgctl = dwc2_readl(hsotg, GOTGCTL); in dwc2_backup_global_registers()
77 gr->gintmsk = dwc2_readl(hsotg, GINTMSK); in dwc2_backup_global_registers()
78 gr->gahbcfg = dwc2_readl(hsotg, GAHBCFG); in dwc2_backup_global_registers()
79 gr->gusbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_backup_global_registers()
80 gr->grxfsiz = dwc2_readl(hsotg, GRXFSIZ); in dwc2_backup_global_registers()
81 gr->gnptxfsiz = dwc2_readl(hsotg, GNPTXFSIZ); in dwc2_backup_global_registers()
82 gr->gdfifocfg = dwc2_readl(hsotg, GDFIFOCFG); in dwc2_backup_global_registers()
83 gr->pcgcctl1 = dwc2_readl(hsotg, PCGCCTL1); in dwc2_backup_global_registers()
84 gr->glpmcfg = dwc2_readl(hsotg, GLPMCFG); in dwc2_backup_global_registers()
85 gr->gi2cctl = dwc2_readl(hsotg, GI2CCTL); in dwc2_backup_global_registers()
86 gr->pcgcctl = dwc2_readl(hsotg, PCGCTL); in dwc2_backup_global_registers()
99 int dwc2_restore_global_registers(struct dwc2_hsotg *hsotg) in dwc2_restore_global_registers() argument
103 dev_dbg(hsotg->dev, "%s\n", __func__); in dwc2_restore_global_registers()
106 gr = &hsotg->gr_backup; in dwc2_restore_global_registers()
108 dev_err(hsotg->dev, "%s: no global registers to restore\n", in dwc2_restore_global_registers()
114 dwc2_writel(hsotg, 0xffffffff, GINTSTS); in dwc2_restore_global_registers()
115 dwc2_writel(hsotg, gr->gotgctl, GOTGCTL); in dwc2_restore_global_registers()
116 dwc2_writel(hsotg, gr->gintmsk, GINTMSK); in dwc2_restore_global_registers()
117 dwc2_writel(hsotg, gr->gusbcfg, GUSBCFG); in dwc2_restore_global_registers()
118 dwc2_writel(hsotg, gr->gahbcfg, GAHBCFG); in dwc2_restore_global_registers()
119 dwc2_writel(hsotg, gr->grxfsiz, GRXFSIZ); in dwc2_restore_global_registers()
120 dwc2_writel(hsotg, gr->gnptxfsiz, GNPTXFSIZ); in dwc2_restore_global_registers()
121 dwc2_writel(hsotg, gr->gdfifocfg, GDFIFOCFG); in dwc2_restore_global_registers()
122 dwc2_writel(hsotg, gr->pcgcctl1, PCGCCTL1); in dwc2_restore_global_registers()
123 dwc2_writel(hsotg, gr->glpmcfg, GLPMCFG); in dwc2_restore_global_registers()
124 dwc2_writel(hsotg, gr->pcgcctl, PCGCTL); in dwc2_restore_global_registers()
125 dwc2_writel(hsotg, gr->gi2cctl, GI2CCTL); in dwc2_restore_global_registers()
137 int dwc2_exit_partial_power_down(struct dwc2_hsotg *hsotg, int rem_wakeup, in dwc2_exit_partial_power_down() argument
142 gr = &hsotg->gr_backup; in dwc2_exit_partial_power_down()
150 return dwc2_host_exit_partial_power_down(hsotg, rem_wakeup, in dwc2_exit_partial_power_down()
153 return dwc2_gadget_exit_partial_power_down(hsotg, restore); in dwc2_exit_partial_power_down()
161 int dwc2_enter_partial_power_down(struct dwc2_hsotg *hsotg) in dwc2_enter_partial_power_down() argument
163 if (dwc2_is_host_mode(hsotg)) in dwc2_enter_partial_power_down()
164 return dwc2_host_enter_partial_power_down(hsotg); in dwc2_enter_partial_power_down()
166 return dwc2_gadget_enter_partial_power_down(hsotg); in dwc2_enter_partial_power_down()
176 static void dwc2_restore_essential_regs(struct dwc2_hsotg *hsotg, int rmode, in dwc2_restore_essential_regs() argument
184 gr = &hsotg->gr_backup; in dwc2_restore_essential_regs()
185 dr = &hsotg->dr_backup; in dwc2_restore_essential_regs()
186 hr = &hsotg->hr_backup; in dwc2_restore_essential_regs()
188 dev_dbg(hsotg->dev, "%s: restoring essential regs\n", __func__); in dwc2_restore_essential_regs()
200 dwc2_writel(hsotg, pcgcctl, PCGCTL); in dwc2_restore_essential_regs()
203 dwc2_writel(hsotg, gr->gahbcfg | GAHBCFG_GLBL_INTR_EN, GAHBCFG); in dwc2_restore_essential_regs()
206 dwc2_writel(hsotg, 0xffffffff, GINTSTS); in dwc2_restore_essential_regs()
209 dwc2_writel(hsotg, GINTSTS_RESTOREDONE, GINTMSK); in dwc2_restore_essential_regs()
212 dwc2_writel(hsotg, gr->gusbcfg, GUSBCFG); in dwc2_restore_essential_regs()
215 dwc2_writel(hsotg, hr->hcfg, HCFG); in dwc2_restore_essential_regs()
218 dwc2_writel(hsotg, pcgcctl, PCGCTL); in dwc2_restore_essential_regs()
222 dwc2_writel(hsotg, pcgcctl, PCGCTL); in dwc2_restore_essential_regs()
225 dwc2_writel(hsotg, dr->dcfg, DCFG); in dwc2_restore_essential_regs()
228 dwc2_writel(hsotg, pcgcctl, PCGCTL); in dwc2_restore_essential_regs()
232 dwc2_writel(hsotg, pcgcctl, PCGCTL); in dwc2_restore_essential_regs()
244 void dwc2_hib_restore_common(struct dwc2_hsotg *hsotg, int rem_wakeup, in dwc2_hib_restore_common() argument
250 gpwrdn = dwc2_readl(hsotg, GPWRDN); in dwc2_hib_restore_common()
252 dwc2_writel(hsotg, gpwrdn, GPWRDN); in dwc2_hib_restore_common()
256 gpwrdn = dwc2_readl(hsotg, GPWRDN); in dwc2_hib_restore_common()
258 dwc2_writel(hsotg, gpwrdn, GPWRDN); in dwc2_hib_restore_common()
262 gpwrdn = dwc2_readl(hsotg, GPWRDN); in dwc2_hib_restore_common()
264 dwc2_writel(hsotg, gpwrdn, GPWRDN); in dwc2_hib_restore_common()
268 gpwrdn = dwc2_readl(hsotg, GPWRDN); in dwc2_hib_restore_common()
270 dwc2_writel(hsotg, gpwrdn, GPWRDN); in dwc2_hib_restore_common()
277 gpwrdn = dwc2_readl(hsotg, GPWRDN); in dwc2_hib_restore_common()
279 dwc2_writel(hsotg, gpwrdn, GPWRDN); in dwc2_hib_restore_common()
283 gpwrdn = dwc2_readl(hsotg, GPWRDN); in dwc2_hib_restore_common()
285 dwc2_writel(hsotg, gpwrdn, GPWRDN); in dwc2_hib_restore_common()
289 dwc2_restore_essential_regs(hsotg, rem_wakeup, is_host); in dwc2_hib_restore_common()
295 if (dwc2_hsotg_wait_bit_set(hsotg, GINTSTS, GINTSTS_RESTOREDONE, in dwc2_hib_restore_common()
297 dev_dbg(hsotg->dev, in dwc2_hib_restore_common()
301 dev_dbg(hsotg->dev, "restore done generated here\n"); in dwc2_hib_restore_common()
307 dwc2_writel(hsotg, GINTSTS_RESTOREDONE, GINTSTS); in dwc2_hib_restore_common()
316 static void dwc2_wait_for_mode(struct dwc2_hsotg *hsotg, in dwc2_wait_for_mode() argument
323 dev_vdbg(hsotg->dev, "Waiting for %s mode\n", in dwc2_wait_for_mode()
331 if (dwc2_is_host_mode(hsotg) == host_mode) { in dwc2_wait_for_mode()
332 dev_vdbg(hsotg->dev, "%s mode set\n", in dwc2_wait_for_mode()
341 dev_warn(hsotg->dev, "%s: Couldn't set %s mode\n", in dwc2_wait_for_mode()
356 static bool dwc2_iddig_filter_enabled(struct dwc2_hsotg *hsotg) in dwc2_iddig_filter_enabled() argument
361 if (!dwc2_hw_is_otg(hsotg)) in dwc2_iddig_filter_enabled()
365 ghwcfg4 = dwc2_readl(hsotg, GHWCFG4); in dwc2_iddig_filter_enabled()
373 gsnpsid = dwc2_readl(hsotg, GSNPSID); in dwc2_iddig_filter_enabled()
375 u32 gotgctl = dwc2_readl(hsotg, GOTGCTL); in dwc2_iddig_filter_enabled()
392 int dwc2_enter_hibernation(struct dwc2_hsotg *hsotg, int is_host) in dwc2_enter_hibernation() argument
395 return dwc2_host_enter_hibernation(hsotg); in dwc2_enter_hibernation()
397 return dwc2_gadget_enter_hibernation(hsotg); in dwc2_enter_hibernation()
410 int dwc2_exit_hibernation(struct dwc2_hsotg *hsotg, int rem_wakeup, in dwc2_exit_hibernation() argument
414 return dwc2_host_exit_hibernation(hsotg, rem_wakeup, reset); in dwc2_exit_hibernation()
416 return dwc2_gadget_exit_hibernation(hsotg, rem_wakeup, reset); in dwc2_exit_hibernation()
423 int dwc2_core_reset(struct dwc2_hsotg *hsotg, bool skip_wait) in dwc2_core_reset() argument
428 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_core_reset()
440 if (dwc2_iddig_filter_enabled(hsotg)) { in dwc2_core_reset()
441 u32 gotgctl = dwc2_readl(hsotg, GOTGCTL); in dwc2_core_reset()
442 u32 gusbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_core_reset()
451 greset = dwc2_readl(hsotg, GRSTCTL); in dwc2_core_reset()
453 dwc2_writel(hsotg, greset, GRSTCTL); in dwc2_core_reset()
455 if ((hsotg->hw_params.snpsid & DWC2_CORE_REV_MASK) < in dwc2_core_reset()
457 if (dwc2_hsotg_wait_bit_clear(hsotg, GRSTCTL, in dwc2_core_reset()
459 dev_warn(hsotg->dev, "%s: HANG! Soft Reset timeout GRSTCTL_CSFTRST\n", in dwc2_core_reset()
464 if (dwc2_hsotg_wait_bit_set(hsotg, GRSTCTL, in dwc2_core_reset()
466 dev_warn(hsotg->dev, "%s: HANG! Soft Reset timeout GRSTCTL_CSFTRST_DONE\n", in dwc2_core_reset()
470 greset = dwc2_readl(hsotg, GRSTCTL); in dwc2_core_reset()
473 dwc2_writel(hsotg, greset, GRSTCTL); in dwc2_core_reset()
490 dwc2_clear_fifo_map(hsotg); in dwc2_core_reset()
493 if (dwc2_hsotg_wait_bit_set(hsotg, GRSTCTL, GRSTCTL_AHBIDLE, 10000)) { in dwc2_core_reset()
494 dev_warn(hsotg->dev, "%s: HANG! AHB Idle timeout GRSTCTL GRSTCTL_AHBIDLE\n", in dwc2_core_reset()
500 dwc2_wait_for_mode(hsotg, true); in dwc2_core_reset()
532 void dwc2_force_mode(struct dwc2_hsotg *hsotg, bool host) in dwc2_force_mode() argument
538 dev_dbg(hsotg->dev, "Forcing mode to %s\n", host ? "host" : "device"); in dwc2_force_mode()
543 if (!dwc2_hw_is_otg(hsotg)) in dwc2_force_mode()
550 if (WARN_ON(host && hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)) in dwc2_force_mode()
553 if (WARN_ON(!host && hsotg->dr_mode == USB_DR_MODE_HOST)) in dwc2_force_mode()
556 gusbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_force_mode()
563 dwc2_writel(hsotg, gusbcfg, GUSBCFG); in dwc2_force_mode()
565 dwc2_wait_for_mode(hsotg, host); in dwc2_force_mode()
580 static void dwc2_clear_force_mode(struct dwc2_hsotg *hsotg) in dwc2_clear_force_mode() argument
584 if (!dwc2_hw_is_otg(hsotg)) in dwc2_clear_force_mode()
587 dev_dbg(hsotg->dev, "Clearing force mode bits\n"); in dwc2_clear_force_mode()
589 gusbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_clear_force_mode()
592 dwc2_writel(hsotg, gusbcfg, GUSBCFG); in dwc2_clear_force_mode()
594 if (dwc2_iddig_filter_enabled(hsotg)) in dwc2_clear_force_mode()
601 void dwc2_force_dr_mode(struct dwc2_hsotg *hsotg) in dwc2_force_dr_mode() argument
603 switch (hsotg->dr_mode) { in dwc2_force_dr_mode()
609 if (!dwc2_hw_is_otg(hsotg)) in dwc2_force_dr_mode()
614 dwc2_force_mode(hsotg, false); in dwc2_force_dr_mode()
617 dwc2_clear_force_mode(hsotg); in dwc2_force_dr_mode()
620 dev_warn(hsotg->dev, "%s() Invalid dr_mode=%d\n", in dwc2_force_dr_mode()
621 __func__, hsotg->dr_mode); in dwc2_force_dr_mode()
629 void dwc2_enable_acg(struct dwc2_hsotg *hsotg) in dwc2_enable_acg() argument
631 if (hsotg->params.acg_enable) { in dwc2_enable_acg()
632 u32 pcgcctl1 = dwc2_readl(hsotg, PCGCCTL1); in dwc2_enable_acg()
634 dev_dbg(hsotg->dev, "Enabling Active Clock Gating\n"); in dwc2_enable_acg()
636 dwc2_writel(hsotg, pcgcctl1, PCGCCTL1); in dwc2_enable_acg()
648 void dwc2_dump_host_registers(struct dwc2_hsotg *hsotg) in dwc2_dump_host_registers() argument
654 dev_dbg(hsotg->dev, "Host Global Registers\n"); in dwc2_dump_host_registers()
655 addr = hsotg->regs + HCFG; in dwc2_dump_host_registers()
656 dev_dbg(hsotg->dev, "HCFG @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
657 (unsigned long)addr, dwc2_readl(hsotg, HCFG)); in dwc2_dump_host_registers()
658 addr = hsotg->regs + HFIR; in dwc2_dump_host_registers()
659 dev_dbg(hsotg->dev, "HFIR @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
660 (unsigned long)addr, dwc2_readl(hsotg, HFIR)); in dwc2_dump_host_registers()
661 addr = hsotg->regs + HFNUM; in dwc2_dump_host_registers()
662 dev_dbg(hsotg->dev, "HFNUM @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
663 (unsigned long)addr, dwc2_readl(hsotg, HFNUM)); in dwc2_dump_host_registers()
664 addr = hsotg->regs + HPTXSTS; in dwc2_dump_host_registers()
665 dev_dbg(hsotg->dev, "HPTXSTS @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
666 (unsigned long)addr, dwc2_readl(hsotg, HPTXSTS)); in dwc2_dump_host_registers()
667 addr = hsotg->regs + HAINT; in dwc2_dump_host_registers()
668 dev_dbg(hsotg->dev, "HAINT @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
669 (unsigned long)addr, dwc2_readl(hsotg, HAINT)); in dwc2_dump_host_registers()
670 addr = hsotg->regs + HAINTMSK; in dwc2_dump_host_registers()
671 dev_dbg(hsotg->dev, "HAINTMSK @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
672 (unsigned long)addr, dwc2_readl(hsotg, HAINTMSK)); in dwc2_dump_host_registers()
673 if (hsotg->params.dma_desc_enable) { in dwc2_dump_host_registers()
674 addr = hsotg->regs + HFLBADDR; in dwc2_dump_host_registers()
675 dev_dbg(hsotg->dev, "HFLBADDR @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
676 (unsigned long)addr, dwc2_readl(hsotg, HFLBADDR)); in dwc2_dump_host_registers()
679 addr = hsotg->regs + HPRT0; in dwc2_dump_host_registers()
680 dev_dbg(hsotg->dev, "HPRT0 @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
681 (unsigned long)addr, dwc2_readl(hsotg, HPRT0)); in dwc2_dump_host_registers()
683 for (i = 0; i < hsotg->params.host_channels; i++) { in dwc2_dump_host_registers()
684 dev_dbg(hsotg->dev, "Host Channel %d Specific Registers\n", i); in dwc2_dump_host_registers()
685 addr = hsotg->regs + HCCHAR(i); in dwc2_dump_host_registers()
686 dev_dbg(hsotg->dev, "HCCHAR @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
687 (unsigned long)addr, dwc2_readl(hsotg, HCCHAR(i))); in dwc2_dump_host_registers()
688 addr = hsotg->regs + HCSPLT(i); in dwc2_dump_host_registers()
689 dev_dbg(hsotg->dev, "HCSPLT @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
690 (unsigned long)addr, dwc2_readl(hsotg, HCSPLT(i))); in dwc2_dump_host_registers()
691 addr = hsotg->regs + HCINT(i); in dwc2_dump_host_registers()
692 dev_dbg(hsotg->dev, "HCINT @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
693 (unsigned long)addr, dwc2_readl(hsotg, HCINT(i))); in dwc2_dump_host_registers()
694 addr = hsotg->regs + HCINTMSK(i); in dwc2_dump_host_registers()
695 dev_dbg(hsotg->dev, "HCINTMSK @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
696 (unsigned long)addr, dwc2_readl(hsotg, HCINTMSK(i))); in dwc2_dump_host_registers()
697 addr = hsotg->regs + HCTSIZ(i); in dwc2_dump_host_registers()
698 dev_dbg(hsotg->dev, "HCTSIZ @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
699 (unsigned long)addr, dwc2_readl(hsotg, HCTSIZ(i))); in dwc2_dump_host_registers()
700 addr = hsotg->regs + HCDMA(i); in dwc2_dump_host_registers()
701 dev_dbg(hsotg->dev, "HCDMA @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
702 (unsigned long)addr, dwc2_readl(hsotg, HCDMA(i))); in dwc2_dump_host_registers()
703 if (hsotg->params.dma_desc_enable) { in dwc2_dump_host_registers()
704 addr = hsotg->regs + HCDMAB(i); in dwc2_dump_host_registers()
705 dev_dbg(hsotg->dev, "HCDMAB @0x%08lX : 0x%08X\n", in dwc2_dump_host_registers()
706 (unsigned long)addr, dwc2_readl(hsotg, in dwc2_dump_host_registers()
721 void dwc2_dump_global_registers(struct dwc2_hsotg *hsotg) in dwc2_dump_global_registers() argument
726 dev_dbg(hsotg->dev, "Core Global Registers\n"); in dwc2_dump_global_registers()
727 addr = hsotg->regs + GOTGCTL; in dwc2_dump_global_registers()
728 dev_dbg(hsotg->dev, "GOTGCTL @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
729 (unsigned long)addr, dwc2_readl(hsotg, GOTGCTL)); in dwc2_dump_global_registers()
730 addr = hsotg->regs + GOTGINT; in dwc2_dump_global_registers()
731 dev_dbg(hsotg->dev, "GOTGINT @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
732 (unsigned long)addr, dwc2_readl(hsotg, GOTGINT)); in dwc2_dump_global_registers()
733 addr = hsotg->regs + GAHBCFG; in dwc2_dump_global_registers()
734 dev_dbg(hsotg->dev, "GAHBCFG @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
735 (unsigned long)addr, dwc2_readl(hsotg, GAHBCFG)); in dwc2_dump_global_registers()
736 addr = hsotg->regs + GUSBCFG; in dwc2_dump_global_registers()
737 dev_dbg(hsotg->dev, "GUSBCFG @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
738 (unsigned long)addr, dwc2_readl(hsotg, GUSBCFG)); in dwc2_dump_global_registers()
739 addr = hsotg->regs + GRSTCTL; in dwc2_dump_global_registers()
740 dev_dbg(hsotg->dev, "GRSTCTL @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
741 (unsigned long)addr, dwc2_readl(hsotg, GRSTCTL)); in dwc2_dump_global_registers()
742 addr = hsotg->regs + GINTSTS; in dwc2_dump_global_registers()
743 dev_dbg(hsotg->dev, "GINTSTS @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
744 (unsigned long)addr, dwc2_readl(hsotg, GINTSTS)); in dwc2_dump_global_registers()
745 addr = hsotg->regs + GINTMSK; in dwc2_dump_global_registers()
746 dev_dbg(hsotg->dev, "GINTMSK @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
747 (unsigned long)addr, dwc2_readl(hsotg, GINTMSK)); in dwc2_dump_global_registers()
748 addr = hsotg->regs + GRXSTSR; in dwc2_dump_global_registers()
749 dev_dbg(hsotg->dev, "GRXSTSR @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
750 (unsigned long)addr, dwc2_readl(hsotg, GRXSTSR)); in dwc2_dump_global_registers()
751 addr = hsotg->regs + GRXFSIZ; in dwc2_dump_global_registers()
752 dev_dbg(hsotg->dev, "GRXFSIZ @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
753 (unsigned long)addr, dwc2_readl(hsotg, GRXFSIZ)); in dwc2_dump_global_registers()
754 addr = hsotg->regs + GNPTXFSIZ; in dwc2_dump_global_registers()
755 dev_dbg(hsotg->dev, "GNPTXFSIZ @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
756 (unsigned long)addr, dwc2_readl(hsotg, GNPTXFSIZ)); in dwc2_dump_global_registers()
757 addr = hsotg->regs + GNPTXSTS; in dwc2_dump_global_registers()
758 dev_dbg(hsotg->dev, "GNPTXSTS @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
759 (unsigned long)addr, dwc2_readl(hsotg, GNPTXSTS)); in dwc2_dump_global_registers()
760 addr = hsotg->regs + GI2CCTL; in dwc2_dump_global_registers()
761 dev_dbg(hsotg->dev, "GI2CCTL @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
762 (unsigned long)addr, dwc2_readl(hsotg, GI2CCTL)); in dwc2_dump_global_registers()
763 addr = hsotg->regs + GPVNDCTL; in dwc2_dump_global_registers()
764 dev_dbg(hsotg->dev, "GPVNDCTL @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
765 (unsigned long)addr, dwc2_readl(hsotg, GPVNDCTL)); in dwc2_dump_global_registers()
766 addr = hsotg->regs + GGPIO; in dwc2_dump_global_registers()
767 dev_dbg(hsotg->dev, "GGPIO @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
768 (unsigned long)addr, dwc2_readl(hsotg, GGPIO)); in dwc2_dump_global_registers()
769 addr = hsotg->regs + GUID; in dwc2_dump_global_registers()
770 dev_dbg(hsotg->dev, "GUID @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
771 (unsigned long)addr, dwc2_readl(hsotg, GUID)); in dwc2_dump_global_registers()
772 addr = hsotg->regs + GSNPSID; in dwc2_dump_global_registers()
773 dev_dbg(hsotg->dev, "GSNPSID @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
774 (unsigned long)addr, dwc2_readl(hsotg, GSNPSID)); in dwc2_dump_global_registers()
775 addr = hsotg->regs + GHWCFG1; in dwc2_dump_global_registers()
776 dev_dbg(hsotg->dev, "GHWCFG1 @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
777 (unsigned long)addr, dwc2_readl(hsotg, GHWCFG1)); in dwc2_dump_global_registers()
778 addr = hsotg->regs + GHWCFG2; in dwc2_dump_global_registers()
779 dev_dbg(hsotg->dev, "GHWCFG2 @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
780 (unsigned long)addr, dwc2_readl(hsotg, GHWCFG2)); in dwc2_dump_global_registers()
781 addr = hsotg->regs + GHWCFG3; in dwc2_dump_global_registers()
782 dev_dbg(hsotg->dev, "GHWCFG3 @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
783 (unsigned long)addr, dwc2_readl(hsotg, GHWCFG3)); in dwc2_dump_global_registers()
784 addr = hsotg->regs + GHWCFG4; in dwc2_dump_global_registers()
785 dev_dbg(hsotg->dev, "GHWCFG4 @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
786 (unsigned long)addr, dwc2_readl(hsotg, GHWCFG4)); in dwc2_dump_global_registers()
787 addr = hsotg->regs + GLPMCFG; in dwc2_dump_global_registers()
788 dev_dbg(hsotg->dev, "GLPMCFG @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
789 (unsigned long)addr, dwc2_readl(hsotg, GLPMCFG)); in dwc2_dump_global_registers()
790 addr = hsotg->regs + GPWRDN; in dwc2_dump_global_registers()
791 dev_dbg(hsotg->dev, "GPWRDN @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
792 (unsigned long)addr, dwc2_readl(hsotg, GPWRDN)); in dwc2_dump_global_registers()
793 addr = hsotg->regs + GDFIFOCFG; in dwc2_dump_global_registers()
794 dev_dbg(hsotg->dev, "GDFIFOCFG @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
795 (unsigned long)addr, dwc2_readl(hsotg, GDFIFOCFG)); in dwc2_dump_global_registers()
796 addr = hsotg->regs + HPTXFSIZ; in dwc2_dump_global_registers()
797 dev_dbg(hsotg->dev, "HPTXFSIZ @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
798 (unsigned long)addr, dwc2_readl(hsotg, HPTXFSIZ)); in dwc2_dump_global_registers()
800 addr = hsotg->regs + PCGCTL; in dwc2_dump_global_registers()
801 dev_dbg(hsotg->dev, "PCGCTL @0x%08lX : 0x%08X\n", in dwc2_dump_global_registers()
802 (unsigned long)addr, dwc2_readl(hsotg, PCGCTL)); in dwc2_dump_global_registers()
812 void dwc2_flush_tx_fifo(struct dwc2_hsotg *hsotg, const int num) in dwc2_flush_tx_fifo() argument
816 dev_vdbg(hsotg->dev, "Flush Tx FIFO %d\n", num); in dwc2_flush_tx_fifo()
819 if (dwc2_hsotg_wait_bit_set(hsotg, GRSTCTL, GRSTCTL_AHBIDLE, 10000)) in dwc2_flush_tx_fifo()
820 dev_warn(hsotg->dev, "%s: HANG! AHB Idle GRSCTL\n", in dwc2_flush_tx_fifo()
825 dwc2_writel(hsotg, greset, GRSTCTL); in dwc2_flush_tx_fifo()
827 if (dwc2_hsotg_wait_bit_clear(hsotg, GRSTCTL, GRSTCTL_TXFFLSH, 10000)) in dwc2_flush_tx_fifo()
828 dev_warn(hsotg->dev, "%s: HANG! timeout GRSTCTL GRSTCTL_TXFFLSH\n", in dwc2_flush_tx_fifo()
840 void dwc2_flush_rx_fifo(struct dwc2_hsotg *hsotg) in dwc2_flush_rx_fifo() argument
844 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_flush_rx_fifo()
847 if (dwc2_hsotg_wait_bit_set(hsotg, GRSTCTL, GRSTCTL_AHBIDLE, 10000)) in dwc2_flush_rx_fifo()
848 dev_warn(hsotg->dev, "%s: HANG! AHB Idle GRSCTL\n", in dwc2_flush_rx_fifo()
852 dwc2_writel(hsotg, greset, GRSTCTL); in dwc2_flush_rx_fifo()
855 if (dwc2_hsotg_wait_bit_clear(hsotg, GRSTCTL, GRSTCTL_RXFFLSH, 10000)) in dwc2_flush_rx_fifo()
856 dev_warn(hsotg->dev, "%s: HANG! timeout GRSTCTL GRSTCTL_RXFFLSH\n", in dwc2_flush_rx_fifo()
863 bool dwc2_is_controller_alive(struct dwc2_hsotg *hsotg) in dwc2_is_controller_alive() argument
865 if (dwc2_readl(hsotg, GSNPSID) == 0xffffffff) in dwc2_is_controller_alive()
877 void dwc2_enable_global_interrupts(struct dwc2_hsotg *hsotg) in dwc2_enable_global_interrupts() argument
879 u32 ahbcfg = dwc2_readl(hsotg, GAHBCFG); in dwc2_enable_global_interrupts()
882 dwc2_writel(hsotg, ahbcfg, GAHBCFG); in dwc2_enable_global_interrupts()
891 void dwc2_disable_global_interrupts(struct dwc2_hsotg *hsotg) in dwc2_disable_global_interrupts() argument
893 u32 ahbcfg = dwc2_readl(hsotg, GAHBCFG); in dwc2_disable_global_interrupts()
896 dwc2_writel(hsotg, ahbcfg, GAHBCFG); in dwc2_disable_global_interrupts()
900 unsigned int dwc2_op_mode(struct dwc2_hsotg *hsotg) in dwc2_op_mode() argument
902 u32 ghwcfg2 = dwc2_readl(hsotg, GHWCFG2); in dwc2_op_mode()
909 bool dwc2_hw_is_otg(struct dwc2_hsotg *hsotg) in dwc2_hw_is_otg() argument
911 unsigned int op_mode = dwc2_op_mode(hsotg); in dwc2_hw_is_otg()
919 bool dwc2_hw_is_host(struct dwc2_hsotg *hsotg) in dwc2_hw_is_host() argument
921 unsigned int op_mode = dwc2_op_mode(hsotg); in dwc2_hw_is_host()
928 bool dwc2_hw_is_device(struct dwc2_hsotg *hsotg) in dwc2_hw_is_device() argument
930 unsigned int op_mode = dwc2_op_mode(hsotg); in dwc2_hw_is_device()
945 int dwc2_hsotg_wait_bit_set(struct dwc2_hsotg *hsotg, u32 offset, u32 mask, in dwc2_hsotg_wait_bit_set() argument
951 if (dwc2_readl(hsotg, offset) & mask) in dwc2_hsotg_wait_bit_set()
968 int dwc2_hsotg_wait_bit_clear(struct dwc2_hsotg *hsotg, u32 offset, u32 mask, in dwc2_hsotg_wait_bit_clear() argument
974 if (!(dwc2_readl(hsotg, offset) & mask)) in dwc2_hsotg_wait_bit_clear()
986 void dwc2_init_fs_ls_pclk_sel(struct dwc2_hsotg *hsotg) in dwc2_init_fs_ls_pclk_sel() argument
990 if ((hsotg->hw_params.hs_phy_type == GHWCFG2_HS_PHY_TYPE_ULPI && in dwc2_init_fs_ls_pclk_sel()
991 hsotg->hw_params.fs_phy_type == GHWCFG2_FS_PHY_TYPE_DEDICATED && in dwc2_init_fs_ls_pclk_sel()
992 hsotg->params.ulpi_fs_ls) || in dwc2_init_fs_ls_pclk_sel()
993 hsotg->params.phy_type == DWC2_PHY_TYPE_PARAM_FS) { in dwc2_init_fs_ls_pclk_sel()
1001 dev_dbg(hsotg->dev, "Initializing HCFG.FSLSPClkSel to %08x\n", val); in dwc2_init_fs_ls_pclk_sel()
1002 hcfg = dwc2_readl(hsotg, HCFG); in dwc2_init_fs_ls_pclk_sel()
1005 dwc2_writel(hsotg, hcfg, HCFG); in dwc2_init_fs_ls_pclk_sel()
1008 static int dwc2_fs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy) in dwc2_fs_phy_init() argument
1018 dev_dbg(hsotg->dev, "FS PHY selected\n"); in dwc2_fs_phy_init()
1020 usbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_fs_phy_init()
1023 dwc2_writel(hsotg, usbcfg, GUSBCFG); in dwc2_fs_phy_init()
1026 retval = dwc2_core_reset(hsotg, false); in dwc2_fs_phy_init()
1029 dev_err(hsotg->dev, in dwc2_fs_phy_init()
1035 if (hsotg->params.activate_stm_fs_transceiver) { in dwc2_fs_phy_init()
1036 ggpio = dwc2_readl(hsotg, GGPIO); in dwc2_fs_phy_init()
1038 dev_dbg(hsotg->dev, "Activating transceiver\n"); in dwc2_fs_phy_init()
1044 dwc2_writel(hsotg, ggpio, GGPIO); in dwc2_fs_phy_init()
1054 if (dwc2_is_host_mode(hsotg)) in dwc2_fs_phy_init()
1055 dwc2_init_fs_ls_pclk_sel(hsotg); in dwc2_fs_phy_init()
1057 if (hsotg->params.i2c_enable) { in dwc2_fs_phy_init()
1058 dev_dbg(hsotg->dev, "FS PHY enabling I2C\n"); in dwc2_fs_phy_init()
1061 usbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_fs_phy_init()
1063 dwc2_writel(hsotg, usbcfg, GUSBCFG); in dwc2_fs_phy_init()
1066 i2cctl = dwc2_readl(hsotg, GI2CCTL); in dwc2_fs_phy_init()
1070 dwc2_writel(hsotg, i2cctl, GI2CCTL); in dwc2_fs_phy_init()
1072 dwc2_writel(hsotg, i2cctl, GI2CCTL); in dwc2_fs_phy_init()
1078 static int dwc2_hs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy) in dwc2_hs_phy_init() argument
1086 usbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_hs_phy_init()
1094 switch (hsotg->params.phy_type) { in dwc2_hs_phy_init()
1097 dev_dbg(hsotg->dev, "HS ULPI PHY selected\n"); in dwc2_hs_phy_init()
1100 if (hsotg->params.phy_ulpi_ddr) in dwc2_hs_phy_init()
1104 if (hsotg->params.oc_disable) in dwc2_hs_phy_init()
1110 dev_dbg(hsotg->dev, "HS UTMI+ PHY selected\n"); in dwc2_hs_phy_init()
1112 if (hsotg->params.phy_utmi_width == 16) in dwc2_hs_phy_init()
1116 dev_err(hsotg->dev, "FS PHY selected at HS!\n"); in dwc2_hs_phy_init()
1121 dwc2_writel(hsotg, usbcfg, GUSBCFG); in dwc2_hs_phy_init()
1124 retval = dwc2_core_reset(hsotg, false); in dwc2_hs_phy_init()
1126 dev_err(hsotg->dev, in dwc2_hs_phy_init()
1135 static void dwc2_set_turnaround_time(struct dwc2_hsotg *hsotg) in dwc2_set_turnaround_time() argument
1139 if (hsotg->params.phy_type != DWC2_PHY_TYPE_PARAM_UTMI) in dwc2_set_turnaround_time()
1142 usbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_set_turnaround_time()
1145 if (hsotg->params.phy_utmi_width == 16) in dwc2_set_turnaround_time()
1150 dwc2_writel(hsotg, usbcfg, GUSBCFG); in dwc2_set_turnaround_time()
1153 int dwc2_phy_init(struct dwc2_hsotg *hsotg, bool select_phy) in dwc2_phy_init() argument
1158 if ((hsotg->params.speed == DWC2_SPEED_PARAM_FULL || in dwc2_phy_init()
1159 hsotg->params.speed == DWC2_SPEED_PARAM_LOW) && in dwc2_phy_init()
1160 hsotg->params.phy_type == DWC2_PHY_TYPE_PARAM_FS) { in dwc2_phy_init()
1162 retval = dwc2_fs_phy_init(hsotg, select_phy); in dwc2_phy_init()
1167 retval = dwc2_hs_phy_init(hsotg, select_phy); in dwc2_phy_init()
1171 if (dwc2_is_device_mode(hsotg)) in dwc2_phy_init()
1172 dwc2_set_turnaround_time(hsotg); in dwc2_phy_init()
1175 if (hsotg->hw_params.hs_phy_type == GHWCFG2_HS_PHY_TYPE_ULPI && in dwc2_phy_init()
1176 hsotg->hw_params.fs_phy_type == GHWCFG2_FS_PHY_TYPE_DEDICATED && in dwc2_phy_init()
1177 hsotg->params.ulpi_fs_ls) { in dwc2_phy_init()
1178 dev_dbg(hsotg->dev, "Setting ULPI FSLS\n"); in dwc2_phy_init()
1179 usbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_phy_init()
1182 dwc2_writel(hsotg, usbcfg, GUSBCFG); in dwc2_phy_init()
1184 usbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_phy_init()
1187 dwc2_writel(hsotg, usbcfg, GUSBCFG); in dwc2_phy_init()