Message ID | 1423212497-11970-37-git-send-email-kishon@ti.com |
---|---|
State | Accepted |
Delegated to: | Łukasz Majewski |
Headers | show |
Hi Kishon, > Implemented board_usb_init(), board_usb_cleanup() and > usb_gadget_handle_interrupts() in dra7xx board file that > can be invoked by various gadget drivers. > > Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> > --- > arch/arm/include/asm/arch-omap5/omap.h | 12 ++++ > board/ti/dra7xx/evm.c | 109 > ++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) > > diff --git a/arch/arm/include/asm/arch-omap5/omap.h > b/arch/arm/include/asm/arch-omap5/omap.h index e218159..e844bfb 100644 > --- a/arch/arm/include/asm/arch-omap5/omap.h > +++ b/arch/arm/include/asm/arch-omap5/omap.h > @@ -33,6 +33,18 @@ > #define CONTROL_ID_CODE CONTROL_CORE_ID_CODE > #endif > > +#ifdef CONFIG_DRA7XX > +#define DRA7_USB_OTG_SS1_BASE 0x48890000 > +#define DRA7_USB_OTG_SS1_GLUE_BASE 0x48880000 > +#define DRA7_USB3_PHY1_PLL_CTRL 0x4A084C00 > +#define DRA7_USB3_PHY1_POWER 0x4A002370 > +#define DRA7_USB2_PHY1_POWER 0x4A002300 > + > +#define DRA7_USB_OTG_SS2_BASE 0x488D0000 > +#define DRA7_USB_OTG_SS2_GLUE_BASE 0x488C0000 > +#define DRA7_USB2_PHY2_POWER 0x4A002E74 > +#endif > + > /* To be verified */ > #define OMAP5430_CONTROL_ID_CODE_ES1_0 0x0B94202F > #define OMAP5430_CONTROL_ID_CODE_ES2_0 0x1B94202F > diff --git a/board/ti/dra7xx/evm.c b/board/ti/dra7xx/evm.c > index 6522241..284775c 100644 > --- a/board/ti/dra7xx/evm.c > +++ b/board/ti/dra7xx/evm.c > @@ -14,11 +14,16 @@ > #include <palmas.h> > #include <sata.h> > #include <asm/gpio.h> > +#include <usb.h> > +#include <linux/usb/gadget.h> > #include <asm/arch/gpio.h> > #include <asm/arch/sys_proto.h> > #include <asm/arch/mmc_host_def.h> > #include <asm/arch/sata.h> > #include <environment.h> > +#include <dwc3-uboot.h> > +#include <dwc3-omap-uboot.h> > +#include <ti-usb-phy-uboot.h> > > #include "mux_data.h" > > @@ -123,6 +128,110 @@ int board_mmc_init(bd_t *bis) > } > #endif > > +#ifdef CONFIG_USB_DWC3 > +static struct dwc3_device usb_otg_ss1 = { > + .maximum_speed = USB_SPEED_SUPER, > + .base = DRA7_USB_OTG_SS1_BASE, > + .tx_fifo_resize = false, > + .index = 0, > +}; > + > +static struct dwc3_omap_device usb_otg_ss1_glue = { > + .base = (void *)DRA7_USB_OTG_SS1_GLUE_BASE, > + .utmi_mode = DWC3_OMAP_UTMI_MODE_SW, > + .vbus_id_status = OMAP_DWC3_VBUS_VALID, > + .index = 0, > +}; > + > +static struct ti_usb_phy_device usb_phy1_device = { > + .pll_ctrl_base = (void *)DRA7_USB3_PHY1_PLL_CTRL, > + .usb2_phy_power = (void *)DRA7_USB2_PHY1_POWER, > + .usb3_phy_power = (void *)DRA7_USB3_PHY1_POWER, > + .index = 0, > +}; > + > +static struct dwc3_device usb_otg_ss2 = { > + .maximum_speed = USB_SPEED_SUPER, > + .base = DRA7_USB_OTG_SS2_BASE, > + .tx_fifo_resize = false, > + .index = 1, > +}; > + > +static struct dwc3_omap_device usb_otg_ss2_glue = { > + .base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE, > + .utmi_mode = DWC3_OMAP_UTMI_MODE_SW, > + .vbus_id_status = OMAP_DWC3_VBUS_VALID, > + .index = 1, > +}; > + > +static struct ti_usb_phy_device usb_phy2_device = { > + .usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER, > + .index = 1, > +}; > + > +int board_usb_init(int index, enum usb_init_type init) > +{ > + 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; > + } > + > + 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 { > + 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"); > + } > + return 0; > +} > + > +int usb_gadget_handle_interrupts(void) > +{ > + u32 status; > + > + status = dwc3_omap_uboot_interrupt_status(0); > + if (status) > + dwc3_uboot_handle_interrupt(0); > + > + return 0; > +} > +#endif > + > #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT) > int spl_start_uboot(void) > { Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
diff --git a/arch/arm/include/asm/arch-omap5/omap.h b/arch/arm/include/asm/arch-omap5/omap.h index e218159..e844bfb 100644 --- a/arch/arm/include/asm/arch-omap5/omap.h +++ b/arch/arm/include/asm/arch-omap5/omap.h @@ -33,6 +33,18 @@ #define CONTROL_ID_CODE CONTROL_CORE_ID_CODE #endif +#ifdef CONFIG_DRA7XX +#define DRA7_USB_OTG_SS1_BASE 0x48890000 +#define DRA7_USB_OTG_SS1_GLUE_BASE 0x48880000 +#define DRA7_USB3_PHY1_PLL_CTRL 0x4A084C00 +#define DRA7_USB3_PHY1_POWER 0x4A002370 +#define DRA7_USB2_PHY1_POWER 0x4A002300 + +#define DRA7_USB_OTG_SS2_BASE 0x488D0000 +#define DRA7_USB_OTG_SS2_GLUE_BASE 0x488C0000 +#define DRA7_USB2_PHY2_POWER 0x4A002E74 +#endif + /* To be verified */ #define OMAP5430_CONTROL_ID_CODE_ES1_0 0x0B94202F #define OMAP5430_CONTROL_ID_CODE_ES2_0 0x1B94202F diff --git a/board/ti/dra7xx/evm.c b/board/ti/dra7xx/evm.c index 6522241..284775c 100644 --- a/board/ti/dra7xx/evm.c +++ b/board/ti/dra7xx/evm.c @@ -14,11 +14,16 @@ #include <palmas.h> #include <sata.h> #include <asm/gpio.h> +#include <usb.h> +#include <linux/usb/gadget.h> #include <asm/arch/gpio.h> #include <asm/arch/sys_proto.h> #include <asm/arch/mmc_host_def.h> #include <asm/arch/sata.h> #include <environment.h> +#include <dwc3-uboot.h> +#include <dwc3-omap-uboot.h> +#include <ti-usb-phy-uboot.h> #include "mux_data.h" @@ -123,6 +128,110 @@ int board_mmc_init(bd_t *bis) } #endif +#ifdef CONFIG_USB_DWC3 +static struct dwc3_device usb_otg_ss1 = { + .maximum_speed = USB_SPEED_SUPER, + .base = DRA7_USB_OTG_SS1_BASE, + .tx_fifo_resize = false, + .index = 0, +}; + +static struct dwc3_omap_device usb_otg_ss1_glue = { + .base = (void *)DRA7_USB_OTG_SS1_GLUE_BASE, + .utmi_mode = DWC3_OMAP_UTMI_MODE_SW, + .vbus_id_status = OMAP_DWC3_VBUS_VALID, + .index = 0, +}; + +static struct ti_usb_phy_device usb_phy1_device = { + .pll_ctrl_base = (void *)DRA7_USB3_PHY1_PLL_CTRL, + .usb2_phy_power = (void *)DRA7_USB2_PHY1_POWER, + .usb3_phy_power = (void *)DRA7_USB3_PHY1_POWER, + .index = 0, +}; + +static struct dwc3_device usb_otg_ss2 = { + .maximum_speed = USB_SPEED_SUPER, + .base = DRA7_USB_OTG_SS2_BASE, + .tx_fifo_resize = false, + .index = 1, +}; + +static struct dwc3_omap_device usb_otg_ss2_glue = { + .base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE, + .utmi_mode = DWC3_OMAP_UTMI_MODE_SW, + .vbus_id_status = OMAP_DWC3_VBUS_VALID, + .index = 1, +}; + +static struct ti_usb_phy_device usb_phy2_device = { + .usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER, + .index = 1, +}; + +int board_usb_init(int index, enum usb_init_type init) +{ + 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; + } + + 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 { + 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"); + } + return 0; +} + +int usb_gadget_handle_interrupts(void) +{ + u32 status; + + status = dwc3_omap_uboot_interrupt_status(0); + if (status) + dwc3_uboot_handle_interrupt(0); + + return 0; +} +#endif + #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT) int spl_start_uboot(void) {
Implemented board_usb_init(), board_usb_cleanup() and usb_gadget_handle_interrupts() in dra7xx board file that can be invoked by various gadget drivers. Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> --- arch/arm/include/asm/arch-omap5/omap.h | 12 ++++ board/ti/dra7xx/evm.c | 109 ++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+)