[U-Boot] [PATCH 0/3] ti: add usb peripheral support for omap5 and beagle x15

Add dwc3 peripheral support for omap5 and beagle x15 and enable DFU for these platforms.
This patch series is split from [1] to contain only adding peripheral support for omap5 and beagle x15.
[1] -> http://permalink.gmane.org/gmane.comp.boot-loaders.u-boot/229188
Kishon Vijay Abraham I (3): board: ti: beagle_x15: added USB initializtion code board: ti: OMAP5: added USB initializtion code include: configs: Enable DWC3 and DFU in ti_omap5_common
arch/arm/include/asm/arch-omap5/omap.h | 8 ++- board/ti/beagle_x15/board.c | 111 ++++++++++++++++++++++++++++++++ board/ti/omap5_uevm/evm.c | 75 +++++++++++++++++++++ include/configs/dra7xx_evm.h | 63 ------------------ include/configs/ti_omap5_common.h | 67 ++++++++++++++++++- 5 files changed, 257 insertions(+), 67 deletions(-)

Implemented board_usb_init(), board_usb_cleanup() and usb_gadget_handle_interrupts() in beagle_x15 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 | 2 +- board/ti/beagle_x15/board.c | 111 ++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/arch-omap5/omap.h b/arch/arm/include/asm/arch-omap5/omap.h index 524fae4..9b66877 100644 --- a/arch/arm/include/asm/arch-omap5/omap.h +++ b/arch/arm/include/asm/arch-omap5/omap.h @@ -33,7 +33,7 @@ #define CONTROL_ID_CODE CONTROL_CORE_ID_CODE #endif
-#ifdef CONFIG_DRA7XX +#if defined(CONFIG_DRA7XX) || defined(CONFIG_AM57XX) #define DRA7_USB_OTG_SS1_BASE 0x48890000 #define DRA7_USB_OTG_SS1_GLUE_BASE 0x48880000 #define DRA7_USB3_PHY1_PLL_CTRL 0x4A084C00 diff --git a/board/ti/beagle_x15/board.c b/board/ti/beagle_x15/board.c index c7f19c7..bcf8cf2 100644 --- a/board/ti/beagle_x15/board.c +++ b/board/ti/beagle_x15/board.c @@ -22,7 +22,13 @@ #include <asm/arch/mmc_host_def.h> #include <asm/arch/sata.h> #include <asm/arch/gpio.h> +#include <asm/arch/omap.h> #include <environment.h> +#include <usb.h> +#include <linux/usb/gadget.h> +#include <dwc3-uboot.h> +#include <dwc3-omap-uboot.h> +#include <ti-usb-phy-uboot.h>
#include "mux_data.h"
@@ -309,6 +315,111 @@ int spl_start_uboot(void) } #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, + .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_HIGH, + .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, + .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) { + printf("port %d can't be used as device\n", 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); + 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"); + } + 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 + #ifdef CONFIG_DRIVER_TI_CPSW
/* Delay value to add to calibrated value */

On Wed, Aug 19, 2015 at 02:13:19PM +0530, Kishon Vijay Abraham I wrote:
Implemented board_usb_init(), board_usb_cleanup() and usb_gadget_handle_interrupts() in beagle_x15 board file that can be invoked by various gadget drivers.
Signed-off-by: Kishon Vijay Abraham I kishon@ti.com
Reviewed-by: Tom Rini trini@konsulko.com

On Wed, Aug 19, 2015 at 02:13:19PM +0530, Kishon Vijay Abraham I wrote:
Implemented board_usb_init(), board_usb_cleanup() and usb_gadget_handle_interrupts() in beagle_x15 board file that can be invoked by various gadget drivers.
Signed-off-by: Kishon Vijay Abraham I kishon@ti.com Reviewed-by: Tom Rini trini@konsulko.com
Applied to u-boot/master, thanks!

Implemented board_usb_init(), board_usb_cleanup() and usb_gadget_handle_interrupts() in omap5 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 | 6 +++ board/ti/omap5_uevm/evm.c | 75 ++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+)
diff --git a/arch/arm/include/asm/arch-omap5/omap.h b/arch/arm/include/asm/arch-omap5/omap.h index 9b66877..bf5afbd 100644 --- a/arch/arm/include/asm/arch-omap5/omap.h +++ b/arch/arm/include/asm/arch-omap5/omap.h @@ -43,6 +43,12 @@ #define DRA7_USB_OTG_SS2_BASE 0x488D0000 #define DRA7_USB_OTG_SS2_GLUE_BASE 0x488C0000 #define DRA7_USB2_PHY2_POWER 0x4A002E74 +#else +#define OMAP5XX_USB_OTG_SS_BASE 0x4A030000 +#define OMAP5XX_USB_OTG_SS_GLUE_BASE 0x4A020000 +#define OMAP5XX_USB3_PHY_PLL_CTRL 0x4A084C00 +#define OMAP5XX_USB3_PHY_POWER 0x4A002370 +#define OMAP5XX_USB2_PHY_POWER 0x4A002300 #endif
/* To be verified */ diff --git a/board/ti/omap5_uevm/evm.c b/board/ti/omap5_uevm/evm.c index 833ffe9..d0d0e0e 100644 --- a/board/ti/omap5_uevm/evm.c +++ b/board/ti/omap5_uevm/evm.c @@ -8,9 +8,15 @@ */ #include <common.h> #include <palmas.h> +#include <asm/arch/omap.h> #include <asm/arch/sys_proto.h> #include <asm/arch/mmc_host_def.h> #include <tca642x.h> +#include <usb.h> +#include <linux/usb/gadget.h> +#include <dwc3-uboot.h> +#include <dwc3-omap-uboot.h> +#include <ti-usb-phy-uboot.h>
#include "mux_data.h"
@@ -53,6 +59,75 @@ struct tca642x_bank_info tca642x_init[] = { .configuration_reg = 0x40 }, };
+#ifdef CONFIG_USB_DWC3 +static struct dwc3_device usb_otg_ss = { + .maximum_speed = USB_SPEED_SUPER, + .base = OMAP5XX_USB_OTG_SS_BASE, + .tx_fifo_resize = false, + .index = 0, +}; + +static struct dwc3_omap_device usb_otg_ss_glue = { + .base = (void *)OMAP5XX_USB_OTG_SS_GLUE_BASE, + .utmi_mode = DWC3_OMAP_UTMI_MODE_SW, + .index = 0, +}; + +static struct ti_usb_phy_device usb_phy_device = { + .pll_ctrl_base = (void *)OMAP5XX_USB3_PHY_PLL_CTRL, + .usb2_phy_power = (void *)OMAP5XX_USB2_PHY_POWER, + .usb3_phy_power = (void *)OMAP5XX_USB3_PHY_POWER, + .index = 0, +}; + +int board_usb_init(int index, enum usb_init_type init) +{ + if (index) { + printf("Invalid Controller Index\n"); + return -EINVAL; + } + + if (init == USB_INIT_DEVICE) { + usb_otg_ss.dr_mode = USB_DR_MODE_PERIPHERAL; + usb_otg_ss_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID; + } else { + usb_otg_ss.dr_mode = USB_DR_MODE_HOST; + usb_otg_ss_glue.vbus_id_status = OMAP_DWC3_ID_GROUND; + } + + ti_usb_phy_uboot_init(&usb_phy_device); + dwc3_omap_uboot_init(&usb_otg_ss_glue); + dwc3_uboot_init(&usb_otg_ss); + + return 0; +} + +int board_usb_cleanup(int index, enum usb_init_type init) +{ + if (index) { + printf("Invalid Controller Index\n"); + return -EINVAL; + } + + ti_usb_phy_uboot_exit(index); + dwc3_uboot_exit(index); + dwc3_omap_uboot_exit(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 + /** * @brief board_init *

On Wed, Aug 19, 2015 at 02:13:20PM +0530, Kishon Vijay Abraham I wrote:
Implemented board_usb_init(), board_usb_cleanup() and usb_gadget_handle_interrupts() in omap5 board file that can be invoked by various gadget drivers.
Signed-off-by: Kishon Vijay Abraham I kishon@ti.com
Reviewed-by: Tom Rini trini@konsulko.com

On Wed, Aug 19, 2015 at 02:13:20PM +0530, Kishon Vijay Abraham I wrote:
Implemented board_usb_init(), board_usb_cleanup() and usb_gadget_handle_interrupts() in omap5 board file that can be invoked by various gadget drivers.
Signed-off-by: Kishon Vijay Abraham I kishon@ti.com Reviewed-by: Tom Rini trini@konsulko.com
Applied to u-boot/master, thanks!

Enabled configs for dwc3, dwc3-omap and PHY for dwc3 in ti_omap5_common. Also enabled support for DFU.
Since ti_omap5_common is used by dra7 too, removed these configs from dra7xx_evm config file.
Signed-off-by: Kishon Vijay Abraham I kishon@ti.com --- include/configs/dra7xx_evm.h | 63 ---------------------------------- include/configs/ti_omap5_common.h | 67 +++++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 66 deletions(-)
diff --git a/include/configs/dra7xx_evm.h b/include/configs/dra7xx_evm.h index 7499447..78a2c25 100644 --- a/include/configs/dra7xx_evm.h +++ b/include/configs/dra7xx_evm.h @@ -47,47 +47,6 @@ "uuid_disk=${uuid_gpt_disk};" \ "name=rootfs,start=2MiB,size=-,uuid=${uuid_gpt_rootfs}"
-#define DFU_ALT_INFO_MMC \ - "dfu_alt_info_mmc=" \ - "boot part 0 1;" \ - "rootfs part 0 2;" \ - "MLO fat 0 1;" \ - "MLO.raw raw 0x100 0x100;" \ - "u-boot.img.raw raw 0x300 0x400;" \ - "spl-os-args.raw raw 0x80 0x80;" \ - "spl-os-image.raw raw 0x900 0x2000;" \ - "spl-os-args fat 0 1;" \ - "spl-os-image fat 0 1;" \ - "u-boot.img fat 0 1;" \ - "uEnv.txt fat 0 1\0" - -#define DFU_ALT_INFO_EMMC \ - "dfu_alt_info_emmc=" \ - "rawemmc raw 0 3751936;" \ - "boot part 1 1;" \ - "rootfs part 1 2;" \ - "MLO fat 1 1;" \ - "MLO.raw raw 0x100 0x100;" \ - "u-boot.img.raw raw 0x300 0x400;" \ - "spl-os-args.raw raw 0x80 0x80;" \ - "spl-os-image.raw raw 0x900 0x2000;" \ - "spl-os-args fat 1 1;" \ - "spl-os-image fat 1 1;" \ - "u-boot.img fat 1 1;" \ - "uEnv.txt fat 1 1\0" - -#define DFU_ALT_INFO_RAM \ - "dfu_alt_info_ram=" \ - "kernel ram 0x80200000 0x4000000;" \ - "fdt ram 0x80f80000 0x80000;" \ - "ramdisk ram 0x81000000 0x4000000\0" - -#define DFUARGS \ - "dfu_bufsiz=0x10000\0" \ - DFU_ALT_INFO_MMC \ - DFU_ALT_INFO_EMMC \ - DFU_ALT_INFO_RAM - /* Fastboot */ #define CONFIG_USB_FUNCTION_FASTBOOT #define CONFIG_CMD_FASTBOOT @@ -184,28 +143,6 @@ #define CONFIG_OMAP_USB_PHY #define CONFIG_OMAP_USB2PHY2_HOST
-/* USB GADGET */ -#define CONFIG_USB_DWC3_PHY_OMAP -#define CONFIG_USB_DWC3_OMAP -#define CONFIG_USB_DWC3 -#define CONFIG_USB_DWC3_GADGET - -#define CONFIG_USB_GADGET -#define CONFIG_USB_GADGET_DOWNLOAD -#define CONFIG_USB_GADGET_VBUS_DRAW 2 -#define CONFIG_G_DNL_MANUFACTURER "Texas Instruments" -#define CONFIG_G_DNL_VENDOR_NUM 0x0451 -#define CONFIG_G_DNL_PRODUCT_NUM 0xd022 -#define CONFIG_USB_GADGET_DUALSPEED - -/* USB Device Firmware Update support */ -#define CONFIG_USB_FUNCTION_DFU -#define CONFIG_DFU_RAM -#define CONFIG_CMD_DFU - -#define CONFIG_DFU_MMC -#define CONFIG_DFU_RAM - /* SATA */ #define CONFIG_BOARD_LATE_INIT #define CONFIG_CMD_SCSI diff --git a/include/configs/ti_omap5_common.h b/include/configs/ti_omap5_common.h index fe04692..5e37843 100644 --- a/include/configs/ti_omap5_common.h +++ b/include/configs/ti_omap5_common.h @@ -47,6 +47,29 @@
#include <configs/ti_armv7_omap.h>
+#ifndef CONFIG_CM_T54 +/* USB GADGET */ +#define CONFIG_USB_DWC3_PHY_OMAP +#define CONFIG_USB_DWC3_OMAP +#define CONFIG_USB_DWC3 +#define CONFIG_USB_DWC3_GADGET + +#define CONFIG_USB_GADGET +#define CONFIG_USB_GADGET_DOWNLOAD +#define CONFIG_USB_GADGET_VBUS_DRAW 2 +#define CONFIG_G_DNL_MANUFACTURER "Texas Instruments" +#define CONFIG_G_DNL_VENDOR_NUM 0x0403 +#define CONFIG_G_DNL_PRODUCT_NUM 0xBD00 +#define CONFIG_USB_GADGET_DUALSPEED + +/* USB Device Firmware Update support */ +#define CONFIG_USB_FUNCTION_DFU +#define CONFIG_DFU_RAM +#define CONFIG_CMD_DFU + +#define CONFIG_DFU_MMC +#endif + /* * Hardware drivers */ @@ -62,9 +85,47 @@ #define PARTS_DEFAULT #endif
-#ifndef DFUARGS -#define DFUARGS -#endif + +#define DFU_ALT_INFO_MMC \ + "dfu_alt_info_mmc=" \ + "boot part 0 1;" \ + "rootfs part 0 2;" \ + "MLO fat 0 1;" \ + "MLO.raw raw 0x100 0x100;" \ + "u-boot.img.raw raw 0x300 0x400;" \ + "spl-os-args.raw raw 0x80 0x80;" \ + "spl-os-image.raw raw 0x900 0x2000;" \ + "spl-os-args fat 0 1;" \ + "spl-os-image fat 0 1;" \ + "u-boot.img fat 0 1;" \ + "uEnv.txt fat 0 1\0" + +#define DFU_ALT_INFO_EMMC \ + "dfu_alt_info_emmc=" \ + "rawemmc raw 0 3751936;" \ + "boot part 1 1;" \ + "rootfs part 1 2;" \ + "MLO fat 1 1;" \ + "MLO.raw raw 0x100 0x100;" \ + "u-boot.img.raw raw 0x300 0x400;" \ + "spl-os-args.raw raw 0x80 0x80;" \ + "spl-os-image.raw raw 0x900 0x2000;" \ + "spl-os-args fat 1 1;" \ + "spl-os-image fat 1 1;" \ + "u-boot.img fat 1 1;" \ + "uEnv.txt fat 1 1\0" + +#define DFU_ALT_INFO_RAM \ + "dfu_alt_info_ram=" \ + "kernel ram 0x80200000 0x4000000;" \ + "fdt ram 0x80f80000 0x80000;" \ + "ramdisk ram 0x81000000 0x4000000\0" + +#define DFUARGS \ + "dfu_bufsiz=0x10000\0" \ + DFU_ALT_INFO_MMC \ + DFU_ALT_INFO_EMMC \ + DFU_ALT_INFO_RAM
#ifndef CONFIG_SPL_BUILD #define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG

On Wed, Aug 19, 2015 at 02:13:21PM +0530, Kishon Vijay Abraham I wrote:
Enabled configs for dwc3, dwc3-omap and PHY for dwc3 in ti_omap5_common. Also enabled support for DFU.
Since ti_omap5_common is used by dra7 too, removed these configs from dra7xx_evm config file.
Signed-off-by: Kishon Vijay Abraham I kishon@ti.com
This is starting to move board-specific stuff (like using DFU) into the common file for all OMAP5 boards, so I don't like this. NAK in concept, thanks!

Hi Tom,
On Thursday 20 August 2015 11:26 PM, Tom Rini wrote:
On Wed, Aug 19, 2015 at 02:13:21PM +0530, Kishon Vijay Abraham I wrote:
Enabled configs for dwc3, dwc3-omap and PHY for dwc3 in ti_omap5_common. Also enabled support for DFU.
Since ti_omap5_common is used by dra7 too, removed these configs from dra7xx_evm config file.
Signed-off-by: Kishon Vijay Abraham I kishon@ti.com
This is starting to move board-specific stuff (like using DFU) into the common file for all OMAP5 boards, so I don't like this. NAK in concept, thanks!
Since we have added support for DFU for all the OMAP5 based boards (including DRA's), thought it is better to add in a common file which is used by all these boards.
So do you prefer the configs be added in dra7xx_evm.h, omap5_evm.h, beagle_x15.h etc..
Thanks Kishon

On Fri, Aug 21, 2015 at 11:27:33AM +0530, Kishon Vijay Abraham I wrote:
Hi Tom,
On Thursday 20 August 2015 11:26 PM, Tom Rini wrote:
On Wed, Aug 19, 2015 at 02:13:21PM +0530, Kishon Vijay Abraham I wrote:
Enabled configs for dwc3, dwc3-omap and PHY for dwc3 in ti_omap5_common. Also enabled support for DFU.
Since ti_omap5_common is used by dra7 too, removed these configs from dra7xx_evm config file.
Signed-off-by: Kishon Vijay Abraham I kishon@ti.com
This is starting to move board-specific stuff (like using DFU) into the common file for all OMAP5 boards, so I don't like this. NAK in concept, thanks!
Since we have added support for DFU for all the OMAP5 based boards (including DRA's), thought it is better to add in a common file which is used by all these boards.
So do you prefer the configs be added in dra7xx_evm.h, omap5_evm.h, beagle_x15.h etc..
Yes in each config. As we can see from when am335x (and am43xx now) starts getting used outside of TI some assumptions get changed and we still want them opting in on the comon header files :)
participants (2)
-
Kishon Vijay Abraham I
-
Tom Rini