Skip to content
Snippets Groups Projects
Commit 55efadde authored by Roger Quadros's avatar Roger Quadros Committed by Tom Rini
Browse files

ARM: AM57xx: AM43xx: Fix USB host


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: 6f1af1e3 ("board: ti: invoke clock API to enable and disable clocks")
Signed-off-by: default avatarRoger Quadros <rogerq@ti.com>
parent 383f4a0e
Branches
Tags
No related merge requests found
...@@ -678,71 +678,71 @@ static struct ti_usb_phy_device usb_phy2_device = { ...@@ -678,71 +678,71 @@ static struct ti_usb_phy_device usb_phy2_device = {
.index = 1, .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) int board_usb_init(int index, enum usb_init_type init)
{ {
enable_usb_clocks(index); enable_usb_clocks(index);
#ifdef CONFIG_USB_DWC3
switch (index) { switch (index) {
case 0: case 0:
if (init == USB_INIT_DEVICE) { if (init == USB_INIT_DEVICE) {
usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL; usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID; 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); dwc3_omap_uboot_init(&usb_otg_ss1_glue);
ti_usb_phy_uboot_init(&usb_phy1_device); ti_usb_phy_uboot_init(&usb_phy1_device);
dwc3_uboot_init(&usb_otg_ss1); dwc3_uboot_init(&usb_otg_ss1);
}
break; break;
case 1: case 1:
if (init == USB_INIT_DEVICE) { if (init == USB_INIT_DEVICE) {
usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL; usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID; 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); ti_usb_phy_uboot_init(&usb_phy2_device);
dwc3_omap_uboot_init(&usb_otg_ss2_glue); dwc3_omap_uboot_init(&usb_otg_ss2_glue);
dwc3_uboot_init(&usb_otg_ss2); dwc3_uboot_init(&usb_otg_ss2);
}
break; break;
default: default:
printf("Invalid Controller Index\n"); printf("Invalid Controller Index\n");
} }
#endif
return 0; return 0;
} }
int board_usb_cleanup(int index, enum usb_init_type init) int board_usb_cleanup(int index, enum usb_init_type init)
{ {
#ifdef CONFIG_USB_DWC3
switch (index) { switch (index) {
case 0: case 0:
case 1: case 1:
if (init == USB_INIT_DEVICE) {
ti_usb_phy_uboot_exit(index); ti_usb_phy_uboot_exit(index);
dwc3_uboot_exit(index); dwc3_uboot_exit(index);
dwc3_omap_uboot_exit(index); dwc3_omap_uboot_exit(index);
}
break; break;
default: default:
printf("Invalid Controller Index\n"); printf("Invalid Controller Index\n");
} }
#endif
disable_usb_clocks(index); disable_usb_clocks(index);
return 0; return 0;
} }
#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
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
#ifdef CONFIG_DRIVER_TI_CPSW #ifdef CONFIG_DRIVER_TI_CPSW
......
...@@ -439,6 +439,19 @@ static struct ti_usb_phy_device usb_phy2_device = { ...@@ -439,6 +439,19 @@ static struct ti_usb_phy_device usb_phy2_device = {
.index = 1, .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) int board_usb_init(int index, enum usb_init_type init)
{ {
enable_usb_clocks(index); enable_usb_clocks(index);
...@@ -448,31 +461,23 @@ int board_usb_init(int index, enum usb_init_type init) ...@@ -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); printf("port %d can't be used as device\n", index);
disable_usb_clocks(index); disable_usb_clocks(index);
return -EINVAL; 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; break;
case 1: case 1:
if (init == USB_INIT_DEVICE) { if (init == USB_INIT_DEVICE) {
#ifdef CONFIG_USB_DWC3
usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL; usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID; 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 { } else {
printf("port %d can't be used as host\n", index); printf("port %d can't be used as host\n", index);
disable_usb_clocks(index); disable_usb_clocks(index);
return -EINVAL; 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; break;
default: default:
printf("Invalid Controller Index\n"); printf("Invalid Controller Index\n");
...@@ -483,31 +488,24 @@ int board_usb_init(int index, enum usb_init_type init) ...@@ -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) int board_usb_cleanup(int index, enum usb_init_type init)
{ {
#ifdef CONFIG_USB_DWC3
switch (index) { switch (index) {
case 0: case 0:
case 1: case 1:
if (init == USB_INIT_DEVICE) {
ti_usb_phy_uboot_exit(index); ti_usb_phy_uboot_exit(index);
dwc3_uboot_exit(index); dwc3_uboot_exit(index);
dwc3_omap_uboot_exit(index); dwc3_omap_uboot_exit(index);
}
break; break;
default: default:
printf("Invalid Controller Index\n"); printf("Invalid Controller Index\n");
} }
#endif
disable_usb_clocks(index); disable_usb_clocks(index);
return 0; return 0;
} }
#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
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
#ifdef CONFIG_DRIVER_TI_CPSW #ifdef CONFIG_DRIVER_TI_CPSW
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment