return 0;
}
#endif
+
+#ifdef CONFIG_USB_XHCI_IMX8M
+#define FSL_SIP_GPC 0xC2000000
+#define FSL_SIP_CONFIG_GPC_PM_DOMAIN 0x03
+int imx8m_usb_power(int usb_id, bool on)
+{
+ unsigned long ret;
+
+ if (usb_id > 1)
+ return -EINVAL;
+
+ ret = call_imx_sip(FSL_SIP_GPC,
+ FSL_SIP_CONFIG_GPC_PM_DOMAIN, 2 + usb_id, on, 0);
+ if (ret)
+ return -EPERM;
+
+ return 0;
+}
+#endif
RegData &= ~(USB_PHY_CTRL1_RESET | USB_PHY_CTRL1_ATERESET);
writel(RegData, dwc3->base + USB_PHY_CTRL1);
}
+#endif
+#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_IMX8M)
int board_usb_init(int index, enum usb_init_type init)
{
- dwc3_nxp_usb_phy_init(&dwc3_device_data);
- return dwc3_uboot_init(&dwc3_device_data);
+ imx8m_usb_power(index, true);
+
+ if (index == 0 && init == USB_INIT_DEVICE) {
+ dwc3_nxp_usb_phy_init(&dwc3_device_data);
+ return dwc3_uboot_init(&dwc3_device_data);
+ }
+
+ return 0;
}
int board_usb_cleanup(int index, enum usb_init_type init)
{
- dwc3_uboot_exit(index);
+ if (index == 0 && init == USB_INIT_DEVICE) {
+ dwc3_uboot_exit(index);
+ }
+
+ imx8m_usb_power(index, false);
+
return 0;
}
#endif
struct imx8m_usbmix *usbmix_reg;
};
+struct imx8m_usbctrl_data {
+ u32 usb_id;
+ unsigned long ctr_addr;
+};
static struct imx8m_xhci imx8m_xhci;
-unsigned long ctr_addr[] = {USB2_BASE_ADDR};
+static struct imx8m_usbctrl_data ctr_data[] = {
+ {1, USB2_BASE_ADDR},
+};
static void imx8m_usb_phy_init(struct imx8m_usbmix *usbmix_reg)
{
struct imx8m_xhci *ctx = &imx8m_xhci;
int ret = 0;
- ctx->hcd = (struct xhci_hccr *)ctr_addr[index];
+ ctx->hcd = (struct xhci_hccr *)(ctr_data[index].ctr_addr);
ctx->dwc3_reg = (struct dwc3 *)((char *)(ctx->hcd) + DWC3_REG_OFFSET);
ctx->usbmix_reg = (struct imx8m_usbmix *)((char *)(ctx->hcd) +
USBMIX_PHY_OFFSET);
- ret = board_usb_init(index, USB_INIT_HOST);
+ ret = board_usb_init(ctr_data[index].usb_id, USB_INIT_HOST);
if (ret != 0) {
+ imx8m_usb_power(ctr_data[index].usb_id, false);
puts("Failed to initialize board for imx8m USB\n");
return ret;
}
void xhci_hcd_stop(int index)
{
+ board_usb_cleanup(ctr_data[index].usb_id, USB_INIT_HOST);
}