[U-Boot] [PATCH v4] usb: new board-specific USB init interface

Igor Grinberg
2013-09-17T16:11:24Z

Hello,

On 09/10/2013 06:10 PM, Mateusz Zalega wrote:
> This commit unifies board-specific USB initialization implementations
> under one symbol (usb_board_init), declaration of which is available in
> usb.h.
>
> New API allows selective initialization of USB controllers whenever needed.
>
> Signed-off-by: Mateusz Zalega <m.zalega@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
> Cc: Marek Vasut <marex@denx.de>
> Cc: Lukasz Majewski <l.majewski@samsung.com>

I think, you should Cc respective board maintainers as well.

Acked-by: Igor Grinberg <grinberg@compulab.co.il>

> Change-Id: Ia78a1378f30a55dd14598c9a1a1b4b8a762e2cd8
> ---
> Changes since RFC (v1):
> - NVIDIA Tegra doesn't postpone its USB init anymore
> - board_usb_init()'s sole argument name was shortened
> - networking code comment style (/* blurb...) dropped
> - squashed RFC changes so that patch won't break bisect
>
> v2 changes:
> - commit message fixup
>
> v3 changes:
> - added 'index' argument to perform selective port initialization
>
> v4 changes:
> - board_usb_init_fail() renamed to board_usb_cleanup()
> - board_usb_cleanup() accepts controller index and init type
> - DFU and UMS commands don't init all USB controllers anymore
> - minor related fixes & refactorization
> ---
> arch/arm/include/asm/arch-tegra/usb.h | 3 +-
> arch/arm/include/asm/ehci-omap.h | 4 +--
> board/amcc/canyonlands/canyonlands.c | 5 +--
> board/balloon3/balloon3.c | 7 +++--
> board/compulab/cm_t35/cm_t35.c | 2 +-
> board/esd/apc405/apc405.c | 8 ++---
> board/esd/pmc440/pmc440.c | 8 ++---
> board/htkw/mcx/mcx.c | 2 +-
> board/icpdas/lp8x4x/lp8x4x.c | 7 +++--
> board/nvidia/common/board.c | 4 ++-
> board/samsung/trats/trats.c | 5 +--
> board/technexion/twister/twister.c | 2 +-
> board/teejet/mt_ventoux/mt_ventoux.c | 2 +-
> board/ti/beagle/beagle.c | 2 +-
> board/ti/omap5_uevm/evm.c | 2 +-
> board/ti/panda/panda.c | 2 +-
> board/toradex/colibri_pxa270/colibri_pxa270.c | 7 +++--
> board/trizepsiv/conxs.c | 7 +++--
> board/vpac270/vpac270.c | 7 +++--
> common/cmd_dfu.c | 31 +++++++++++--------
> common/cmd_usb_mass_storage.c | 44 ++++++++++++++-------------
> common/usb.c | 5 +++
> drivers/dfu/dfu.c | 2 +-
> drivers/usb/host/ehci-omap.c | 12 ++------
> drivers/usb/host/ehci-tegra.c | 2 +-
> drivers/usb/host/ohci-hcd.c | 4 +--
> drivers/usb/host/ohci.h | 11 +++----
> include/g_dnl.h | 2 --
> include/usb.h | 30 +++++++++++++++++-
> include/usb_mass_storage.h | 13 +++-----
> 30 files changed, 138 insertions(+), 104 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-tegra/usb.h b/arch/arm/include/asm/arch-tegra/usb.h
> index f66257c..a1efd07 100644
> --- a/arch/arm/include/asm/arch-tegra/usb.h
> +++ b/arch/arm/include/asm/arch-tegra/usb.h
> @@ -131,8 +131,7 @@
> /* USB3_IF_USB_PHY_VBUS_SENSORS_0 */
> #define VBUS_VLD_STS (1 << 26)
>
> -
> /* Setup USB on the board */
> -int board_usb_init(const void *blob);
> +int usb_process_devicetree(const void *blob);
>
> #endif /* _TEGRA_USB_H_ */
> diff --git a/arch/arm/include/asm/ehci-omap.h b/arch/arm/include/asm/ehci-omap.h
> index ac83a53..c7bca05 100644
> --- a/arch/arm/include/asm/ehci-omap.h
> +++ b/arch/arm/include/asm/ehci-omap.h
> @@ -145,8 +145,8 @@ struct omap_ehci {
> struct ehci_hccr;
> struct ehci_hcor;
>
> -int omap_ehci_hcd_init(struct omap_usbhs_board_data *usbhs_pdata,
> - struct ehci_hccr **hccr, struct ehci_hcor **hcor);
> +int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
> + struct ehci_hccr **hccr, struct ehci_hcor **hcor);
> int omap_ehci_hcd_stop(void);
>
> #endif /* _OMAP_COMMON_EHCI_H_ */
> diff --git a/board/amcc/canyonlands/canyonlands.c b/board/amcc/canyonlands/canyonlands.c
> index cc36f45..395095e 100644
> --- a/board/amcc/canyonlands/canyonlands.c
> +++ b/board/amcc/canyonlands/canyonlands.c
> @@ -16,6 +16,7 @@
> #include <asm/4xx_pcie.h>
> #include <asm/ppc4xx-gpio.h>
> #include <asm/errno.h>
> +#include <usb.h>
>
> extern flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* info for FLASH chips */
>
> @@ -188,7 +189,7 @@ int board_early_init_f(void)
> }
>
> #if defined(CONFIG_USB_OHCI_NEW) && defined(CONFIG_SYS_USB_OHCI_BOARD_INIT)
> -int usb_board_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> struct board_bcsr *bcsr_data =
> (struct board_bcsr *)CONFIG_SYS_BCSR_BASE;
> @@ -229,7 +230,7 @@ int usb_board_stop(void)
> return 0;
> }
>
> -int usb_board_init_fail(void)
> +int board_usb_cleanup(int index, enum board_usb_init_type init)
> {
> return usb_board_stop();
> }
> diff --git a/board/balloon3/balloon3.c b/board/balloon3/balloon3.c
> index ecbac16..19c0e02 100644
> --- a/board/balloon3/balloon3.c
> +++ b/board/balloon3/balloon3.c
> @@ -13,6 +13,7 @@
> #include <asm/io.h>
> #include <spartan3.h>
> #include <command.h>
> +#include <usb.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -59,7 +60,7 @@ void dram_init_banksize(void)
> }
>
> #ifdef CONFIG_CMD_USB
> -int usb_board_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> writel((readl(UHCHR) | UHCHR_PCPL | UHCHR_PSPL) &
> ~(UHCHR_SSEP0 | UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSE),
> @@ -90,9 +91,9 @@ int usb_board_init(void)
> return 0;
> }
>
> -void usb_board_init_fail(void)
> +int board_usb_cleanup(int index, enum board_usb_init_type init)
> {
> - return;
> + return 0;
> }
>
> void usb_board_stop(void)
> diff --git a/board/compulab/cm_t35/cm_t35.c b/board/compulab/cm_t35/cm_t35.c
> index 3caa5be..7626abc 100644
> --- a/board/compulab/cm_t35/cm_t35.c
> +++ b/board/compulab/cm_t35/cm_t35.c
> @@ -591,7 +591,7 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> twl4030_i2c_write_u8(TWL4030_CHIP_GPIO, offset, 0xC0);
> udelay(1);
>
> - return omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
> + return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
> }
>
> int ehci_hcd_stop(void)
> diff --git a/board/esd/apc405/apc405.c b/board/esd/apc405/apc405.c
> index f13f088..79341f5 100644
> --- a/board/esd/apc405/apc405.c
> +++ b/board/esd/apc405/apc405.c
> @@ -17,6 +17,7 @@
> #include <mtd/cfi_flash.h>
> #include <asm/4xx_pci.h>
> #include <pci.h>
> +#include <usb.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -428,7 +429,7 @@ void reset_phy(void)
> }
>
> #if defined(CONFIG_USB_OHCI_NEW) && defined(CONFIG_SYS_USB_OHCI_BOARD_INIT)
> -int usb_board_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> return 0;
> }
> @@ -453,9 +454,8 @@ int usb_board_stop(void)
> return 0;
> }
>
> -int usb_board_init_fail(void)
> +int board_usb_cleanup(int index, enum board_usb_init_type init)
> {
> - usb_board_stop();
> - return 0;
> + return usb_board_stop();
> }
> #endif /* defined(CONFIG_USB_OHCI) && defined(CONFIG_SYS_USB_OHCI_BOARD_INIT) */
> diff --git a/board/esd/pmc440/pmc440.c b/board/esd/pmc440/pmc440.c
> index 549b3b7..44b86da 100644
> --- a/board/esd/pmc440/pmc440.c
> +++ b/board/esd/pmc440/pmc440.c
> @@ -27,6 +27,7 @@
> #endif
> #include <serial.h>
> #include <asm/4xx_pci.h>
> +#include <usb.h>
>
> #include "fpga.h"
> #include "pmc440.h"
> @@ -821,7 +822,7 @@ int bootstrap_eeprom_read (unsigned dev_addr, unsigned offset,
> }
>
> #if defined(CONFIG_USB_OHCI_NEW) && defined(CONFIG_SYS_USB_OHCI_BOARD_INIT)
> -int usb_board_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> char *act = getenv("usbact");
> int i;
> @@ -845,10 +846,9 @@ int usb_board_stop(void)
> return 0;
> }
>
> -int usb_board_init_fail(void)
> +int board_usb_cleanup(int index, enum board_usb_init_type init)
> {
> - usb_board_stop();
> - return 0;
> + return usb_board_stop();
> }
> #endif /* defined(CONFIG_USB_OHCI) && defined(CONFIG_SYS_USB_OHCI_BOARD_INIT) */
>
> diff --git a/board/htkw/mcx/mcx.c b/board/htkw/mcx/mcx.c
> index 653d7ea..6f85b47 100644
> --- a/board/htkw/mcx/mcx.c
> +++ b/board/htkw/mcx/mcx.c
> @@ -42,7 +42,7 @@ static struct omap_usbhs_board_data usbhs_bdata = {
>
> int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> {
> - return omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
> + return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
> }
>
> int ehci_hcd_stop(int index)
> diff --git a/board/icpdas/lp8x4x/lp8x4x.c b/board/icpdas/lp8x4x/lp8x4x.c
> index 1b68ef3..a96bed6 100644
> --- a/board/icpdas/lp8x4x/lp8x4x.c
> +++ b/board/icpdas/lp8x4x/lp8x4x.c
> @@ -15,6 +15,7 @@
> #include <netdev.h>
> #include <serial.h>
> #include <asm/io.h>
> +#include <usb.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -58,7 +59,7 @@ int board_mmc_init(bd_t *bis)
> #endif
>
> #ifdef CONFIG_CMD_USB
> -int usb_board_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> writel((UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
> ~(UHCHR_SSEP0 | UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSE),
> @@ -89,9 +90,9 @@ int usb_board_init(void)
> return 0;
> }
>
> -void usb_board_init_fail(void)
> +int board_usb_cleanup(int index, enum board_usb_init_type init)
> {
> - return;
> + return 0;
> }
>
> void usb_board_stop(void)
> diff --git a/board/nvidia/common/board.c b/board/nvidia/common/board.c
> index 126e56e..1972527 100644
> --- a/board/nvidia/common/board.c
> +++ b/board/nvidia/common/board.c
> @@ -32,6 +32,7 @@
> #ifdef CONFIG_USB_EHCI_TEGRA
> #include <asm/arch-tegra/usb.h>
> #include <asm/arch/usb.h>
> +#include <usb.h>
> #endif
> #ifdef CONFIG_TEGRA_MMC
> #include <asm/arch-tegra/tegra_mmc.h>
> @@ -153,8 +154,9 @@ int board_init(void)
>
> #ifdef CONFIG_USB_EHCI_TEGRA
> pin_mux_usb();
> - board_usb_init(gd->fdt_blob);
> + usb_process_devicetree(gd->fdt_blob);
> #endif
> +
> #ifdef CONFIG_LCD
> tegra_lcd_check_next_stage(gd->fdt_blob, 0);
> #endif
> diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
> index 7f61d17..58d925f 100644
> --- a/board/samsung/trats/trats.c
> +++ b/board/samsung/trats/trats.c
> @@ -26,6 +26,7 @@
> #include <power/max8997_muic.h>
> #include <power/battery.h>
> #include <power/max17042_fg.h>
> +#include <usb.h>
> #include <usb_mass_storage.h>
>
> #include "setup.h"
> @@ -495,10 +496,10 @@ struct s3c_plat_otg_data s5pc210_otg_data = {
> .usb_flags = PHY0_SLEEP,
> };
>
> -void board_usb_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> debug("USB_udc_probe\n");
> - s3c_udc_probe(&s5pc210_otg_data);
> + return s3c_udc_probe(&s5pc210_otg_data);
> }
> #endif
>
> diff --git a/board/technexion/twister/twister.c b/board/technexion/twister/twister.c
> index cd91d8f..6f2ff55 100644
> --- a/board/technexion/twister/twister.c
> +++ b/board/technexion/twister/twister.c
> @@ -53,7 +53,7 @@ static struct omap_usbhs_board_data usbhs_bdata = {
>
> int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> {
> - return omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
> + return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
> }
>
> int ehci_hcd_stop(int index)
> diff --git a/board/teejet/mt_ventoux/mt_ventoux.c b/board/teejet/mt_ventoux/mt_ventoux.c
> index b4e01d1..df873f5 100644
> --- a/board/teejet/mt_ventoux/mt_ventoux.c
> +++ b/board/teejet/mt_ventoux/mt_ventoux.c
> @@ -104,7 +104,7 @@ static struct omap_usbhs_board_data usbhs_bdata = {
>
> int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> {
> - return omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
> + return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
> }
>
> int ehci_hcd_stop(int index)
> diff --git a/board/ti/beagle/beagle.c b/board/ti/beagle/beagle.c
> index 62e9bea..41fed54 100644
> --- a/board/ti/beagle/beagle.c
> +++ b/board/ti/beagle/beagle.c
> @@ -523,7 +523,7 @@ static struct omap_usbhs_board_data usbhs_bdata = {
>
> int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> {
> - return omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
> + return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
> }
>
> int ehci_hcd_stop(int index)
> diff --git a/board/ti/omap5_uevm/evm.c b/board/ti/omap5_uevm/evm.c
> index 4706330..3ae0671 100644
> --- a/board/ti/omap5_uevm/evm.c
> +++ b/board/ti/omap5_uevm/evm.c
> @@ -176,7 +176,7 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> auxclk |= AUXCLK_ENABLE_MASK;
> writel(auxclk, (*prcm)->scrm_auxclk1);
>
> - ret = omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
> + ret = omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
> if (ret < 0) {
> puts("Failed to initialize ehci\n");
> return ret;
> diff --git a/board/ti/panda/panda.c b/board/ti/panda/panda.c
> index e838ffd..fe7a437 100644
> --- a/board/ti/panda/panda.c
> +++ b/board/ti/panda/panda.c
> @@ -263,7 +263,7 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> utmi_clk |= HSUSBHOST_CLKCTRL_CLKSEL_UTMI_P1_MASK;
> sr32((void *)CM_L3INIT_HSUSBHOST_CLKCTRL, 0, 32, utmi_clk);
>
> - ret = omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
> + ret = omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
> if (ret < 0)
> return ret;
>
> diff --git a/board/toradex/colibri_pxa270/colibri_pxa270.c b/board/toradex/colibri_pxa270/colibri_pxa270.c
> index c1e2562..b70c1e3 100644
> --- a/board/toradex/colibri_pxa270/colibri_pxa270.c
> +++ b/board/toradex/colibri_pxa270/colibri_pxa270.c
> @@ -13,6 +13,7 @@
> #include <netdev.h>
> #include <asm/io.h>
> #include <serial.h>
> +#include <usb.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -39,7 +40,7 @@ int dram_init(void)
> }
>
> #ifdef CONFIG_CMD_USB
> -int usb_board_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> writel((readl(UHCHR) | UHCHR_PCPL | UHCHR_PSPL) &
> ~(UHCHR_SSEP0 | UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSE),
> @@ -70,9 +71,9 @@ int usb_board_init(void)
> return 0;
> }
>
> -void usb_board_init_fail(void)
> +int board_usb_cleanup(int index, enum board_usb_init_type init)
> {
> - return;
> + return 0;
> }
>
> void usb_board_stop(void)
> diff --git a/board/trizepsiv/conxs.c b/board/trizepsiv/conxs.c
> index c0c318f..830d5a8 100644
> --- a/board/trizepsiv/conxs.c
> +++ b/board/trizepsiv/conxs.c
> @@ -21,6 +21,7 @@
> #include <asm/arch/regs-mmc.h>
> #include <netdev.h>
> #include <asm/io.h>
> +#include <usb.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -42,7 +43,7 @@ extern struct serial_device serial_stuart_device;
> * Miscelaneous platform dependent initialisations
> */
>
> -int usb_board_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> writel((readl(UHCHR) | UHCHR_PCPL | UHCHR_PSPL) &
> ~(UHCHR_SSEP0 | UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSE),
> @@ -69,9 +70,9 @@ int usb_board_init(void)
> return 0;
> }
>
> -void usb_board_init_fail(void)
> +int board_usb_cleanup(int index, enum board_usb_init_type init)
> {
> - return;
> + return 0;
> }
>
> void usb_board_stop(void)
> diff --git a/board/vpac270/vpac270.c b/board/vpac270/vpac270.c
> index 616736f..fab4636 100644
> --- a/board/vpac270/vpac270.c
> +++ b/board/vpac270/vpac270.c
> @@ -13,6 +13,7 @@
> #include <netdev.h>
> #include <serial.h>
> #include <asm/io.h>
> +#include <usb.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -66,7 +67,7 @@ int board_mmc_init(bd_t *bis)
> #endif
>
> #ifdef CONFIG_CMD_USB
> -int usb_board_init(void)
> +int board_usb_init(int index, enum board_usb_init_type init)
> {
> writel((UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
> ~(UHCHR_SSEP0 | UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSE),
> @@ -97,9 +98,9 @@ int usb_board_init(void)
> return 0;
> }
>
> -void usb_board_init_fail(void)
> +int board_usb_cleanup(int index, enum board_usb_init_type init)
> {
> - return;
> + return 0;
> }
>
> void usb_board_stop(void)
> diff --git a/common/cmd_dfu.c b/common/cmd_dfu.c
> index 793c422..693b5bc 100644
> --- a/common/cmd_dfu.c
> +++ b/common/cmd_dfu.c
> @@ -14,17 +14,22 @@
> #include <dfu.h>
> #include <asm/errno.h>
> #include <g_dnl.h>
> +#include <usb.h>
>
> static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> {
> + if (argc < 4)
> + return CMD_RET_USAGE;
> +
> + char *usb_controller = argv[1];
> + char *interface = argv[2];
> + char *devstring = argv[3];
> +
> const char *str_env;
> char *s = "dfu";
> int ret, i = 0;
> char *env_bkp;
>
> - if (argc < 3)
> - return CMD_RET_USAGE;
> -
> str_env = getenv("dfu_alt_info");
> if (str_env == NULL) {
> printf("%s: \"dfu_alt_info\" env variable not defined!\n",
> @@ -33,19 +38,18 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> }
>
> env_bkp = strdup(str_env);
> - ret = dfu_config_entities(env_bkp, argv[1],
> - (int)simple_strtoul(argv[2], NULL, 10));
> + ret = dfu_config_entities(env_bkp, interface,
> + (int)simple_strtoul(devstring, NULL, 0));
> if (ret)
> return CMD_RET_FAILURE;
>
> - if (argc > 3 && strcmp(argv[3], "list") == 0) {
> + if (argc > 4 && strcmp(argv[4], "list") == 0) {
> dfu_show_entities();
> goto done;
> }
>
> -#ifdef CONFIG_TRATS
> - board_usb_init();
> -#endif
> + int controller_index = simple_strtoul(usb_controller, NULL, 0);
> + board_usb_init(controller_index, USB_INIT_DEVICE);
>
> g_dnl_register(s);
> while (1) {
> @@ -77,8 +81,9 @@ done:
>
> U_BOOT_CMD(dfu, CONFIG_SYS_MAXARGS, 1, do_dfu,
> "Device Firmware Upgrade",
> - "<interface> <dev> [list]\n"
> - " - device firmware upgrade on a device <dev>\n"
> - " attached to interface <interface>\n"
> - " [list] - list available alt settings"
> + "<USB_controller> <interface> <dev> [list]\n"
> + " - device firmware upgrade via <USB_controller>\n"
> + " on device <dev>, attached to interface\n"
> + " <interface>\n"
> + " [list] - list available alt settings\n"
> );
> diff --git a/common/cmd_usb_mass_storage.c b/common/cmd_usb_mass_storage.c
> index 33a4715..c6dc5b9 100644
> --- a/common/cmd_usb_mass_storage.c
> +++ b/common/cmd_usb_mass_storage.c
> @@ -9,51 +9,53 @@
> #include <common.h>
> #include <command.h>
> #include <g_dnl.h>
> +#include <usb.h>
> #include <usb_mass_storage.h>
>
> int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
> int argc, char * const argv[])
> {
> - char *ep;
> - unsigned int dev_num = 0, offset = 0, part_size = 0;
> - int rc;
> + if (argc < 3)
> + return CMD_RET_USAGE;
>
> - struct ums_board_info *ums_info;
> - static char *s = "ums";
> -
> - if (argc < 2) {
> - printf("usage: ums <dev> - e.g. ums 0\n");
> - return 0;
> - }
> -
> - dev_num = (int)simple_strtoul(argv[1], &ep, 16);
> + const char *usb_controller = argv[1];
> + const char *mmc_devstring = argv[2];
>
> + unsigned int dev_num = (unsigned int)(simple_strtoul(mmc_devstring,
> + NULL, 0));
> if (dev_num) {
> - puts("\nSet eMMC device to 0! - e.g. ums 0\n");
> + error("Set eMMC device to 0! - e.g. ums 0");
> goto fail;
> }
>
> - board_usb_init();
> - ums_info = board_ums_init(dev_num, offset, part_size);
> + unsigned int controller_index = (unsigned int)(simple_strtoul(
> + usb_controller, NULL, 0));
> + if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
> + error("Couldn't init USB controller.");
> + goto fail;
> + }
>
> + struct ums_board_info *ums_info = board_ums_init(dev_num, 0, 0);
> if (!ums_info) {
> - printf("MMC: %d -> NOT available\n", dev_num);
> + error("MMC: %d -> NOT available", dev_num);
> goto fail;
> }
> - rc = fsg_init(ums_info);
> +
> + int rc = fsg_init(ums_info);
> if (rc) {
> - printf("cmd ums: fsg_init failed\n");
> + error("fsg_init failed");
> goto fail;
> }
>
> - g_dnl_register(s);
> + g_dnl_register("ums");
>
> while (1) {
> /* Handle control-c and timeouts */
> if (ctrlc()) {
> - printf("The remote end did not respond in time.\n");
> + error("The remote end did not respond in time.");
> goto exit;
> }
> +
> usb_gadget_handle_interrupts();
> /* Check if USB cable has been detached */
> if (fsg_main_thread(NULL) == EIO)
> @@ -69,5 +71,5 @@ fail:
>
> U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage,
> "Use the UMS [User Mass Storage]",
> - "ums - User Mass Storage Gadget"
> + "<USB_controller> <mmc_dev>"
> );
> diff --git a/common/usb.c b/common/usb.c
> index c97f522..bdcdd63 100644
> --- a/common/usb.c
> +++ b/common/usb.c
> @@ -1037,4 +1037,9 @@ int usb_new_device(struct usb_device *dev)
> return 0;
> }
>
> +__attribute__((weak))
> +int board_usb_init(int index, enum board_usb_init_type init)
> +{
> + return 0;
> +}
> /* EOF */
> diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c
> index d73d510..e785d39 100644
> --- a/drivers/dfu/dfu.c
> +++ b/drivers/dfu/dfu.c
> @@ -307,7 +307,7 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
> }
>
> static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
> - char *interface, int num)
> + char *interface, int num)
> {
> char *st;
>
> diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
> index 3c58f9e..c4ce487 100644
> --- a/drivers/usb/host/ehci-omap.c
> +++ b/drivers/usb/host/ehci-omap.c
> @@ -96,12 +96,6 @@ static void omap_ehci_soft_phy_reset(int port)
> }
> #endif
>
> -inline int __board_usb_init(void)
> -{
> - return 0;
> -}
> -int board_usb_init(void) __attribute__((weak, alias("__board_usb_init")));
> -
> #if defined(CONFIG_OMAP_EHCI_PHY1_RESET_GPIO) || \
> defined(CONFIG_OMAP_EHCI_PHY2_RESET_GPIO) || \
> defined(CONFIG_OMAP_EHCI_PHY3_RESET_GPIO)
> @@ -157,15 +151,15 @@ int omap_ehci_hcd_stop(void)
> * Based on "drivers/usb/host/ehci-omap.c" from Linux 3.1
> * See there for additional Copyrights.
> */
> -int omap_ehci_hcd_init(struct omap_usbhs_board_data *usbhs_pdata,
> - struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> +int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
> + struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> {
> int ret;
> unsigned int i, reg = 0, rev = 0;
>
> debug("Initializing OMAP EHCI\n");
>
> - ret = board_usb_init();
> + ret = board_usb_init(index, USB_INIT_HOST);
> if (ret < 0)
> return ret;
>
> diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
> index c6da449..cc23133 100644
> --- a/drivers/usb/host/ehci-tegra.c
> +++ b/drivers/usb/host/ehci-tegra.c
> @@ -699,7 +699,7 @@ static int process_usb_nodes(const void *blob, int node_list[], int count)
> return 0;
> }
>
> -int board_usb_init(const void *blob)
> +int usb_process_devicetree(const void *blob)
> {
> int node_list[USB_PORTS_MAX];
> int count, err = 0;
> diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
> index c33c487..756f2fa 100644
> --- a/drivers/usb/host/ohci-hcd.c
> +++ b/drivers/usb/host/ohci-hcd.c
> @@ -1861,7 +1861,7 @@ int usb_lowlevel_init(int index, void **controller)
>
> #ifdef CONFIG_SYS_USB_OHCI_BOARD_INIT
> /* board dependant init */
> - if (usb_board_init())
> + if (board_usb_init(index, USB_INIT_HOST))
> return -1;
> #endif
> memset(&gohci, 0, sizeof(ohci_t));
> @@ -1918,7 +1918,7 @@ int usb_lowlevel_init(int index, void **controller)
> err ("can't reset usb-%s", gohci.slot_name);
> #ifdef CONFIG_SYS_USB_OHCI_BOARD_INIT
> /* board dependant cleanup */
> - usb_board_init_fail();
> + board_usb_cleanup(index, USB_INIT_HOST);
> #endif
>
> #ifdef CONFIG_SYS_USB_OHCI_CPU_INIT
> diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h
> index d977e8f..9a4a2c2 100644
> --- a/drivers/usb/host/ohci.h
> +++ b/drivers/usb/host/ohci.h
> @@ -19,14 +19,11 @@
> #endif /* CONFIG_SYS_OHCI_SWAP_REG_ACCESS */
>
> /* functions for doing board or CPU specific setup/cleanup */
> -extern int usb_board_init(void);
> -extern int usb_board_stop(void);
> -extern int usb_board_init_fail(void);
> -
> -extern int usb_cpu_init(void);
> -extern int usb_cpu_stop(void);
> -extern int usb_cpu_init_fail(void);
> +int usb_board_stop(void);
>
> +int usb_cpu_init(void);
> +int usb_cpu_stop(void);
> +int usb_cpu_init_fail(void);
>
> static int cc_to_error[16] = {
>
> diff --git a/include/g_dnl.h b/include/g_dnl.h
> index 2b2f11a..b6c4dd4 100644
> --- a/include/g_dnl.h
> +++ b/include/g_dnl.h
> @@ -14,6 +14,4 @@ int g_dnl_bind_fixup(struct usb_device_descriptor *);
> int g_dnl_register(const char *s);
> void g_dnl_unregister(void);
>
> -/* USB initialization declaration - board specific */
> -void board_usb_init(void);
> #endif /* __G_DOWNLOAD_H_ */
> diff --git a/include/usb.h b/include/usb.h
> index 60db897..681b408 100644
> --- a/include/usb.h
> +++ b/include/usb.h
> @@ -165,10 +165,38 @@ int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
>
> extern void udc_disconnect(void);
>
> -#else
> +#elif !defined(CONFIG_USB_GADGET)
> #error USB Lowlevel not defined
> #endif
>
> +/*
> + * You can initialize platform's USB host or device
> + * ports by passing this enum as an argument to
> + * board_usb_init().
> + */
> +enum board_usb_init_type {
> + USB_INIT_HOST,
> + USB_INIT_DEVICE
> +};
> +
> +/*
> + * board-specific hardware initialization, called by
> + * usb drivers and u-boot commands
> + *
> + * @param index USB controller number
> + * @param init initializes controller as USB host or device
> + */
> +int board_usb_init(int index, enum board_usb_init_type init);
> +
> +/*
> + * can be used to clean up after failed USB initialization attempt
> + * vide: board_usb_init()
> + *
> + * @param index USB controller number for selective cleanup
> + * @param init board_usb_init_type passed to board_usb_init()
> + */
> +int board_usb_cleanup(int index, enum board_usb_init_type init);
> +
> #ifdef CONFIG_USB_STORAGE
>
> #define USB_MAX_STOR_DEV 5
> diff --git a/include/usb_mass_storage.h b/include/usb_mass_storage.h
> index 35cdcc3..f26403e 100644
> --- a/include/usb_mass_storage.h
> +++ b/include/usb_mass_storage.h
> @@ -30,13 +30,10 @@ struct ums_board_info {
> struct ums_device ums_dev;
> };
>
> -extern void board_usb_init(void);
> -
> -extern int fsg_init(struct ums_board_info *);
> -extern void fsg_cleanup(void);
> -extern struct ums_board_info *board_ums_init(unsigned int,
> - unsigned int, unsigned int);
> -extern int usb_gadget_handle_interrupts(void);
> -extern int fsg_main_thread(void *);
> +int fsg_init(struct ums_board_info *);
> +void fsg_cleanup(void);
> +struct ums_board_info *board_ums_init(unsigned int, unsigned int,
> + unsigned int);
> +int fsg_main_thread(void *);
>
> #endif /* __USB_MASS_STORAGE_H__ */
>

--
Regards,
Igor