static int ehci_usb_probe(struct udevice *dev) { struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; struct usb_platdata *plat = dev_get_platdata(dev); struct ehci_sunxi_priv *priv = dev_get_priv(dev); struct ehci_hccr *hccr = (struct ehci_hccr *)dev_get_addr(dev); struct ehci_hcor *hcor; /* * This should go away once we've moved to the driver model for * clocks resp. phys. */ priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0; #ifdef CONFIG_MACH_SUN8I_H3 priv->ahb_gate_mask |= 1 << AHB_GATE_OFFSET_USB_OHCI0; #endif priv->phy_index = ((u32)hccr - SUNXI_USB1_BASE) / 0x1000 + 1; priv->ahb_gate_mask <<= priv->phy_index - 1; setbits_le32(&ccm->ahb_gate0, priv->ahb_gate_mask); #ifdef CONFIG_SUNXI_GEN_SUN6I setbits_le32(&ccm->ahb_reset0_cfg, priv->ahb_gate_mask); #endif sunxi_usb_phy_init(priv->phy_index); sunxi_usb_phy_power_on(priv->phy_index); hcor = (struct ehci_hcor *)((uint32_t)hccr + HC_LENGTH(ehci_readl(&hccr->cr_capbase))); return ehci_register(dev, hccr, hcor, NULL, 0, plat->init_type); }
static int ohci_usb_probe(struct udevice *dev) { struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; struct usb_bus_priv *bus_priv = dev_get_uclass_priv(dev); struct ohci_sunxi_priv *priv = dev_get_priv(dev); struct ohci_regs *regs = (struct ohci_regs *)dev_get_addr(dev); bus_priv->companion = true; /* * This should go away once we've moved to the driver model for * clocks resp. phys. */ if (regs == (void *)(SUNXI_USB1_BASE + 0x400)) { priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0; priv->usb_gate_mask = CCM_USB_CTRL_OHCI0_CLK; priv->phy_index = 1; } else { priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI1; priv->usb_gate_mask = CCM_USB_CTRL_OHCI1_CLK; priv->phy_index = 2; } setbits_le32(&ccm->ahb_gate0, priv->ahb_gate_mask); setbits_le32(&ccm->usb_clk_cfg, priv->usb_gate_mask); #ifdef CONFIG_SUNXI_GEN_SUN6I setbits_le32(&ccm->ahb_reset0_cfg, priv->ahb_gate_mask); #endif sunxi_usb_phy_init(priv->phy_index); sunxi_usb_phy_power_on(priv->phy_index); return ohci_register(dev, regs); }
static int sunxi_musb_enable(struct musb *musb) { int ret; pr_debug("%s():\n", __func__); musb_ep_select(musb->mregs, 0); musb_writeb(musb->mregs, MUSB_FADDR, 0); if (enabled) return 0; /* select PIO mode */ musb_writeb(musb->mregs, USBC_REG_o_VEND0, 0); if (is_host_enabled(musb)) { ret = sunxi_usb_phy_vbus_detect(0); if (ret == 1) { printf("A charger is plugged into the OTG: "); return -ENODEV; } ret = sunxi_usb_phy_id_detect(0); if (ret == 1) { printf("No host cable detected: "); return -ENODEV; } sunxi_usb_phy_power_on(0); /* port power on */ } USBC_ForceVbusValidToHigh(musb->mregs); enabled = true; return 0; }
static void sunxi_musb_enable(struct musb *musb) { pr_debug("%s():\n", __func__); if (enabled) return; /* select PIO mode */ musb_writeb(musb->mregs, USBC_REG_o_VEND0, 0); if (is_host_enabled(musb)) sunxi_usb_phy_power_on(0); /* port power on */ USBC_ForceVbusValidToHigh(musb->mregs); enabled = true; }