ARM: AM57xx: AM43xx: Fix USB host
authorRoger Quadros <rogerq@ti.com>
Mon, 23 May 2016 14:37:48 +0000 (17:37 +0300)
committerTom Rini <trini@konsulko.com>
Fri, 3 Jun 2016 01:42:15 +0000 (21:42 -0400)
CONFIG_USB_XHCI_OMAP can be set for host mode without setting
CONFIG_USB_DWC3 which is meant for gadget mode only.
board_usb_init() was not being defined for CONFIG_USB_XHCI_OMAP
resulting in a data abort on usb start.

Define board_usb_init() for CONFIG_USB_XHCI_OMAP case. Move
gadget specific handling to within CONFIG_USB_DWC3.

Fixes: 6f1af1e358b7 ("board: ti: invoke clock API to enable and disable clocks")
Signed-off-by: Roger Quadros <rogerq@ti.com>
board/ti/am43xx/board.c
board/ti/am57xx/board.c

index b42546a148319c9b8f7eaacb2fb959d3d94b3cad..bde5ac7c992aebafee04f64ce5737d26c0c68b9e 100644 (file)
@@ -678,71 +678,71 @@ static struct ti_usb_phy_device usb_phy2_device = {
        .index = 1,
 };
 
+int usb_gadget_handle_interrupts(int index)
+{
+       u32 status;
+
+       status = dwc3_omap_uboot_interrupt_status(index);
+       if (status)
+               dwc3_uboot_handle_interrupt(index);
+
+       return 0;
+}
+#endif /* CONFIG_USB_DWC3 */
+
+#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
 int board_usb_init(int index, enum usb_init_type init)
 {
        enable_usb_clocks(index);
+#ifdef CONFIG_USB_DWC3
        switch (index) {
        case 0:
                if (init == USB_INIT_DEVICE) {
                        usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
                        usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
-               } else {
-                       usb_otg_ss1.dr_mode = USB_DR_MODE_HOST;
-                       usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
+                       dwc3_omap_uboot_init(&usb_otg_ss1_glue);
+                       ti_usb_phy_uboot_init(&usb_phy1_device);
+                       dwc3_uboot_init(&usb_otg_ss1);
                }
-
-               dwc3_omap_uboot_init(&usb_otg_ss1_glue);
-               ti_usb_phy_uboot_init(&usb_phy1_device);
-               dwc3_uboot_init(&usb_otg_ss1);
                break;
        case 1:
                if (init == USB_INIT_DEVICE) {
                        usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
                        usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
-               } else {
-                       usb_otg_ss2.dr_mode = USB_DR_MODE_HOST;
-                       usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
+                       ti_usb_phy_uboot_init(&usb_phy2_device);
+                       dwc3_omap_uboot_init(&usb_otg_ss2_glue);
+                       dwc3_uboot_init(&usb_otg_ss2);
                }
-
-               ti_usb_phy_uboot_init(&usb_phy2_device);
-               dwc3_omap_uboot_init(&usb_otg_ss2_glue);
-               dwc3_uboot_init(&usb_otg_ss2);
                break;
        default:
                printf("Invalid Controller Index\n");
        }
+#endif
 
        return 0;
 }
 
 int board_usb_cleanup(int index, enum usb_init_type init)
 {
+#ifdef CONFIG_USB_DWC3
        switch (index) {
        case 0:
        case 1:
-               ti_usb_phy_uboot_exit(index);
-               dwc3_uboot_exit(index);
-               dwc3_omap_uboot_exit(index);
+               if (init == USB_INIT_DEVICE) {
+                       ti_usb_phy_uboot_exit(index);
+                       dwc3_uboot_exit(index);
+                       dwc3_omap_uboot_exit(index);
+               }
                break;
        default:
                printf("Invalid Controller Index\n");
        }
+#endif
        disable_usb_clocks(index);
 
        return 0;
 }
-
-int usb_gadget_handle_interrupts(int index)
-{
-       u32 status;
-
-       status = dwc3_omap_uboot_interrupt_status(index);
-       if (status)
-               dwc3_uboot_handle_interrupt(index);
-
-       return 0;
-}
-#endif
+#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
 
 #ifdef CONFIG_DRIVER_TI_CPSW
 
index 9904047a07e704b45687d484bdd96e4578bf8e97..7142a92fb380479f283bcf12a8d47055c21f07e4 100644 (file)
@@ -439,6 +439,19 @@ static struct ti_usb_phy_device usb_phy2_device = {
        .index = 1,
 };
 
+int usb_gadget_handle_interrupts(int index)
+{
+       u32 status;
+
+       status = dwc3_omap_uboot_interrupt_status(index);
+       if (status)
+               dwc3_uboot_handle_interrupt(index);
+
+       return 0;
+}
+#endif /* CONFIG_USB_DWC3 */
+
+#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
 int board_usb_init(int index, enum usb_init_type init)
 {
        enable_usb_clocks(index);
@@ -448,31 +461,23 @@ int board_usb_init(int index, enum usb_init_type init)
                        printf("port %d can't be used as device\n", index);
                        disable_usb_clocks(index);
                        return -EINVAL;
-               } else {
-                       usb_otg_ss1.dr_mode = USB_DR_MODE_HOST;
-                       usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
-                       setbits_le32((*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
-                                    OTG_SS_CLKCTRL_MODULEMODE_HW |
-                                    OPTFCLKEN_REFCLK960M);
                }
-
-               ti_usb_phy_uboot_init(&usb_phy1_device);
-               dwc3_omap_uboot_init(&usb_otg_ss1_glue);
-               dwc3_uboot_init(&usb_otg_ss1);
                break;
        case 1:
                if (init == USB_INIT_DEVICE) {
+#ifdef CONFIG_USB_DWC3
                        usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
                        usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
+                       ti_usb_phy_uboot_init(&usb_phy2_device);
+                       dwc3_omap_uboot_init(&usb_otg_ss2_glue);
+                       dwc3_uboot_init(&usb_otg_ss2);
+#endif
                } else {
                        printf("port %d can't be used as host\n", index);
                        disable_usb_clocks(index);
                        return -EINVAL;
                }
 
-               ti_usb_phy_uboot_init(&usb_phy2_device);
-               dwc3_omap_uboot_init(&usb_otg_ss2_glue);
-               dwc3_uboot_init(&usb_otg_ss2);
                break;
        default:
                printf("Invalid Controller Index\n");
@@ -483,31 +488,24 @@ int board_usb_init(int index, enum usb_init_type init)
 
 int board_usb_cleanup(int index, enum usb_init_type init)
 {
+#ifdef CONFIG_USB_DWC3
        switch (index) {
        case 0:
        case 1:
-               ti_usb_phy_uboot_exit(index);
-               dwc3_uboot_exit(index);
-               dwc3_omap_uboot_exit(index);
+               if (init == USB_INIT_DEVICE) {
+                       ti_usb_phy_uboot_exit(index);
+                       dwc3_uboot_exit(index);
+                       dwc3_omap_uboot_exit(index);
+               }
                break;
        default:
                printf("Invalid Controller Index\n");
        }
+#endif
        disable_usb_clocks(index);
        return 0;
 }
-
-int usb_gadget_handle_interrupts(int index)
-{
-       u32 status;
-
-       status = dwc3_omap_uboot_interrupt_status(index);
-       if (status)
-               dwc3_uboot_handle_interrupt(index);
-
-       return 0;
-}
-#endif
+#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
 
 #ifdef CONFIG_DRIVER_TI_CPSW