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: 6f1af1e358 ("board: ti: invoke clock API to enable and disable clocks")
Signed-off-by: Roger Quadros <rogerq@ti.com>
master
Roger Quadros 9 years ago committed by Tom Rini
parent 383f4a0ec7
commit 55efadde7e
  1. 58
      board/ti/am43xx/board.c
  2. 54
      board/ti/am57xx/board.c

@ -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 { dwc3_omap_uboot_init(&usb_otg_ss1_glue);
usb_otg_ss1.dr_mode = USB_DR_MODE_HOST; ti_usb_phy_uboot_init(&usb_phy1_device);
usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_ID_GROUND; 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; 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 { ti_usb_phy_uboot_init(&usb_phy2_device);
usb_otg_ss2.dr_mode = USB_DR_MODE_HOST; dwc3_omap_uboot_init(&usb_otg_ss2_glue);
usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_ID_GROUND; 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; 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:
ti_usb_phy_uboot_exit(index); if (init == USB_INIT_DEVICE) {
dwc3_uboot_exit(index); ti_usb_phy_uboot_exit(index);
dwc3_omap_uboot_exit(index); dwc3_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 = {
.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)
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)
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:
ti_usb_phy_uboot_exit(index); if (init == USB_INIT_DEVICE) {
dwc3_uboot_exit(index); ti_usb_phy_uboot_exit(index);
dwc3_omap_uboot_exit(index); dwc3_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

Loading…
Cancel
Save