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>
This commit is contained in:
parent
383f4a0ec7
commit
55efadde7e
@ -678,60 +678,6 @@ static struct ti_usb_phy_device usb_phy2_device = {
|
|||||||
.index = 1,
|
.index = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
int board_usb_init(int index, enum usb_init_type init)
|
|
||||||
{
|
|
||||||
enable_usb_clocks(index);
|
|
||||||
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);
|
|
||||||
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);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf("Invalid Controller Index\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int board_usb_cleanup(int index, enum usb_init_type init)
|
|
||||||
{
|
|
||||||
switch (index) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
ti_usb_phy_uboot_exit(index);
|
|
||||||
dwc3_uboot_exit(index);
|
|
||||||
dwc3_omap_uboot_exit(index);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf("Invalid Controller Index\n");
|
|
||||||
}
|
|
||||||
disable_usb_clocks(index);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int usb_gadget_handle_interrupts(int index)
|
int usb_gadget_handle_interrupts(int index)
|
||||||
{
|
{
|
||||||
u32 status;
|
u32 status;
|
||||||
@ -742,8 +688,62 @@ int usb_gadget_handle_interrupts(int index)
|
|||||||
|
|
||||||
return 0;
|
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;
|
||||||
|
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;
|
||||||
|
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
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_usb_cleanup(int index, enum usb_init_type init)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USB_DWC3
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
|
||||||
|
|
||||||
#ifdef CONFIG_DRIVER_TI_CPSW
|
#ifdef CONFIG_DRIVER_TI_CPSW
|
||||||
|
|
||||||
static void cpsw_control(int enabled)
|
static void cpsw_control(int enabled)
|
||||||
|
@ -439,64 +439,6 @@ static struct ti_usb_phy_device usb_phy2_device = {
|
|||||||
.index = 1,
|
.index = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
int board_usb_init(int index, enum usb_init_type init)
|
|
||||||
{
|
|
||||||
enable_usb_clocks(index);
|
|
||||||
switch (index) {
|
|
||||||
case 0:
|
|
||||||
if (init == USB_INIT_DEVICE) {
|
|
||||||
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) {
|
|
||||||
usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
|
|
||||||
usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
|
|
||||||
} 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");
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int board_usb_cleanup(int index, enum usb_init_type init)
|
|
||||||
{
|
|
||||||
switch (index) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
ti_usb_phy_uboot_exit(index);
|
|
||||||
dwc3_uboot_exit(index);
|
|
||||||
dwc3_omap_uboot_exit(index);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf("Invalid Controller Index\n");
|
|
||||||
}
|
|
||||||
disable_usb_clocks(index);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int usb_gadget_handle_interrupts(int index)
|
int usb_gadget_handle_interrupts(int index)
|
||||||
{
|
{
|
||||||
u32 status;
|
u32 status;
|
||||||
@ -507,7 +449,63 @@ int usb_gadget_handle_interrupts(int index)
|
|||||||
|
|
||||||
return 0;
|
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);
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
if (init == USB_INIT_DEVICE) {
|
||||||
|
printf("port %d can't be used as device\n", index);
|
||||||
|
disable_usb_clocks(index);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
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
|
#endif
|
||||||
|
} else {
|
||||||
|
printf("port %d can't be used as host\n", index);
|
||||||
|
disable_usb_clocks(index);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Invalid Controller Index\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_usb_cleanup(int index, enum usb_init_type init)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USB_DWC3
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
|
||||||
|
|
||||||
#ifdef CONFIG_DRIVER_TI_CPSW
|
#ifdef CONFIG_DRIVER_TI_CPSW
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user