[U-Boot] [PATCH v2 00/11] driver model bring-up of musb on AM335x GP and BBB

This patch series enables musb driver to adopt driver model. This has been tested on the following evms (logs [1]) by loading kernel and dtb from sata hard-disk. * AM335x GP evm * AM335x BBB
Also pushed a branch for testing [2]
This patch series depends on the following patch series * usb common code for DT parsing [4] * usb ether gadget DM conversion [5]
Changes from initial version: * Separated out the usb gadget driver patches from earlier musb series [3] for testing and submitting of dwc3 dm musb patches. * passed an dummy dev pointer for non-DM case as well for reducing the number of #ifdefs in musb backend driver.
[1] - http://pastebin.ubuntu.com/16345030/ [2] - git://git.ti.com/~mugunthanvnm/ti-u-boot/mugunth-ti-u-boot.git dm-musb-v2 [3] - http://lists.denx.de/pipermail/u-boot/2016-February/246827.html [4] - http://patchwork.ozlabs.org/patch/609333/ [5] - http://lists.denx.de/pipermail/u-boot/2016-May/254225.html
Note: ~~~~~ The following checkpatch warning can be ignore as splitting the line will break grep during debug session.
WARNING: line over 80 characters #223: FILE: drivers/usb/musb-new/ti-musb.c:232: + error("musb - not able to bind usb host node\n");
total: 0 errors, 1 warnings, 0 checks, 207 lines checked
NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE
patches/musb/v2.01/0006-drivers-usb-musb-add-ti-musb-host-driver-with-driver.patch has style problems, please review.
If any of these errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS. WARNING: line over 80 characters #167: FILE: drivers/usb/musb-new/ti-musb.c:336: + error("musb - not able to bind usb device node\n");
total: 0 errors, 1 warnings, 0 checks, 143 lines checked
NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE
patches/musb/v2.01/0007-drivers-usb-musb-add-ti-musb-peripheral-driver-with-.patch has style problems, please review.
Mugunthan V N (11): configs: am335x: usb: do not define CONFIG_DM_USB for spl am33xx: board: do not register usb devices when CONFIG_DM_USB is defined drivers: usb: musb: add ti musb misc driver for wrapper am33xx: board: probe misc drivers to register musb devices drivers: usb: musb: adopt musb backend driver to driver model drivers: usb: musb: add ti musb host driver with driver model support drivers: usb: musb: add ti musb peripheral driver with driver model support am33xx: board: init usb ether gadget for rndis support am335x_evm: enable usb ether gadget as it supports DM_ETH defconfig: am335x_boneblack: enable usb driver model defconfig: am335x_gp_evm: enable usb driver model
arch/arm/cpu/armv7/am33xx/board.c | 24 +- arch/arm/cpu/armv7/omap3/am35x_musb.c | 6 +- arch/arm/include/asm/arch-omap3/musb.h | 6 +- arch/arm/include/asm/omap_musb.h | 7 +- configs/am335x_boneblack_vboot_defconfig | 3 + configs/am335x_gp_evm_defconfig | 3 + drivers/usb/musb-new/Kconfig | 9 + drivers/usb/musb-new/Makefile | 1 + drivers/usb/musb-new/am35x.c | 14 +- drivers/usb/musb-new/musb_dsps.c | 8 +- drivers/usb/musb-new/musb_uboot.c | 2 + drivers/usb/musb-new/ti-musb.c | 368 +++++++++++++++++++++++++++++++ include/configs/am335x_evm.h | 4 +- 13 files changed, 429 insertions(+), 26 deletions(-) create mode 100644 drivers/usb/musb-new/ti-musb.c

Since OMAP's spl doesn't support DM currently, do not define CONFIG_DM_USB for spl build.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com Reviewed-by: Tom Rini trini@konsulko.com --- include/configs/am335x_evm.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h index 16935a1..ed7a0b2 100644 --- a/include/configs/am335x_evm.h +++ b/include/configs/am335x_evm.h @@ -322,6 +322,7 @@ #ifdef CONFIG_SPL_BUILD #undef CONFIG_DM_MMC #undef CONFIG_TIMER +#undef CONFIG_DM_USB #endif
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_USBETH_SUPPORT)

Do not register usb devices when CONFIG_DM_USB is define.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com Reviewed-by: Tom Rini trini@konsulko.com --- arch/arm/cpu/armv7/am33xx/board.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c index a99cbf9..b64e557 100644 --- a/arch/arm/cpu/armv7/am33xx/board.c +++ b/arch/arm/cpu/armv7/am33xx/board.c @@ -120,7 +120,8 @@ int cpu_mmc_init(bd_t *bis)
/* AM33XX has two MUSB controllers which can be host or gadget */ #if (defined(CONFIG_USB_MUSB_GADGET) || defined(CONFIG_USB_MUSB_HOST)) && \ - (defined(CONFIG_AM335X_USB0) || defined(CONFIG_AM335X_USB1)) + (defined(CONFIG_AM335X_USB0) || defined(CONFIG_AM335X_USB1)) && \ + (!defined(CONFIG_DM_USB)) static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
/* USB 2.0 PHY Control */ @@ -187,6 +188,7 @@ static struct musb_hdrc_platform_data otg1_plat = {
int arch_misc_init(void) { +#ifndef CONFIG_DM_USB #ifdef CONFIG_AM335X_USB0 musb_register(&otg0_plat, &otg0_board_data, (void *)USB0_OTG_BASE); @@ -195,6 +197,7 @@ int arch_misc_init(void) musb_register(&otg1_plat, &otg1_board_data, (void *)USB1_OTG_BASE); #endif +#endif return 0; }

Add a misc driver for MUSB wrapper, so that based on dr_mode the USB devices can bind to USB host or USB device drivers.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com --- drivers/usb/musb-new/Kconfig | 9 ++++++ drivers/usb/musb-new/Makefile | 1 + drivers/usb/musb-new/ti-musb.c | 64 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 drivers/usb/musb-new/ti-musb.c
diff --git a/drivers/usb/musb-new/Kconfig b/drivers/usb/musb-new/Kconfig index c264859..caba42c 100644 --- a/drivers/usb/musb-new/Kconfig +++ b/drivers/usb/musb-new/Kconfig @@ -14,6 +14,15 @@ config USB_MUSB_GADGET help Enables the MUSB USB dual-role controller in gadget mode.
+config USB_MUSB_TI + bool "Enable TI OTG USB controller" + depends on DM_USB + default n + help + Say y here to enable support for the dual role high + speed USB controller based on the Mentor Graphics + silicon IP. + if USB_MUSB_HOST || USB_MUSB_GADGET
config USB_MUSB_PIC32 diff --git a/drivers/usb/musb-new/Makefile b/drivers/usb/musb-new/Makefile index df1c3c8..296f230 100644 --- a/drivers/usb/musb-new/Makefile +++ b/drivers/usb/musb-new/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_USB_MUSB_AM35X) += am35x.o obj-$(CONFIG_USB_MUSB_OMAP2PLUS) += omap2430.o obj-$(CONFIG_USB_MUSB_PIC32) += pic32.o obj-$(CONFIG_USB_MUSB_SUNXI) += sunxi.o +obj-$(CONFIG_USB_MUSB_TI) += ti-musb.o
ccflags-y := $(call cc-option,-Wno-unused-variable) \ $(call cc-option,-Wno-unused-but-set-variable) \ diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c new file mode 100644 index 0000000..cf0e296 --- /dev/null +++ b/drivers/usb/musb-new/ti-musb.c @@ -0,0 +1,64 @@ +/* + * MISC driver for TI MUSB Glue. + * + * (C) Copyright 2016 + * Texas Instruments Incorporated, <www.ti.com> + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include <common.h> +#include <command.h> +#include <console.h> +#include <dm.h> +#include <linux/usb/otg.h> +#include <dm/device-internal.h> +#include <dm/lists.h> + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_DM_USB + +static int ti_musb_wrapper_bind(struct udevice *parent) +{ + const void *fdt = gd->fdt_blob; + int node; + int ret; + + for (node = fdt_first_subnode(fdt, parent->of_offset); node > 0; + node = fdt_next_subnode(fdt, node)) { + struct udevice *dev; + const char *name = fdt_get_name(fdt, node, NULL); + enum usb_dr_mode dr_mode; + struct driver *drv; + + if (strncmp(name, "usb@", 4)) + continue; + + dr_mode = usb_get_dr_mode(node); + switch (dr_mode) { + case USB_DR_MODE_PERIPHERAL: + /* Bind MUSB device */ + break; + case USB_DR_MODE_HOST: + /* Bind MUSB host */ + break; + default: + break; + }; + } + return 0; +} + +static const struct udevice_id ti_musb_ids[] = { + { .compatible = "ti,am33xx-usb" }, + { } +}; + +U_BOOT_DRIVER(ti_musb_wrapper) = { + .name = "ti-musb-wrapper", + .id = UCLASS_MISC, + .of_match = ti_musb_ids, + .bind = ti_musb_wrapper_bind, +}; + +#endif /* CONFIG_DM_USB */

On Tue, May 10, 2016 at 05:18:08PM +0530, Mugunthan V N wrote:
Add a misc driver for MUSB wrapper, so that based on dr_mode the USB devices can bind to USB host or USB device drivers.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com
Reviewed-by: Tom Rini trini@konsulko.com

MUSB wrapper driver is bound as MISC device and underlying usb devices are bind to usb drivers based on dr_mode, so probing the MISC wrapper driver to register musb devices.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com Reviewed-by: Tom Rini trini@konsulko.com --- arch/arm/cpu/armv7/am33xx/board.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c index b64e557..8f0ff09 100644 --- a/arch/arm/cpu/armv7/am33xx/board.c +++ b/arch/arm/cpu/armv7/am33xx/board.c @@ -197,6 +197,13 @@ int arch_misc_init(void) musb_register(&otg1_plat, &otg1_board_data, (void *)USB1_OTG_BASE); #endif +#else + struct udevice *dev; + int ret; + + ret = uclass_first_device(UCLASS_MISC, &dev); + if (ret || !dev) + return ret; #endif return 0; }

Currently all backend driver ops uses hard coded physical address, so to adopt the driver to DM, add device pointer to ops call backs so that drivers can get physical addresses from the usb driver priv/plat data.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com --- arch/arm/cpu/armv7/am33xx/board.c | 4 ++-- arch/arm/cpu/armv7/omap3/am35x_musb.c | 6 +++--- arch/arm/include/asm/arch-omap3/musb.h | 6 +++--- arch/arm/include/asm/omap_musb.h | 7 ++++--- drivers/usb/musb-new/am35x.c | 14 +++++++------- drivers/usb/musb-new/musb_dsps.c | 8 ++++---- 6 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c index 8f0ff09..b8d8a3b 100644 --- a/arch/arm/cpu/armv7/am33xx/board.c +++ b/arch/arm/cpu/armv7/am33xx/board.c @@ -148,7 +148,7 @@ static struct musb_hdrc_config musb_config = { };
#ifdef CONFIG_AM335X_USB0 -static void am33xx_otg0_set_phy_power(u8 on) +static void am33xx_otg0_set_phy_power(struct udevice *dev, u8 on) { am33xx_usb_set_phy_power(on, &cdev->usb_ctrl0); } @@ -167,7 +167,7 @@ static struct musb_hdrc_platform_data otg0_plat = { #endif
#ifdef CONFIG_AM335X_USB1 -static void am33xx_otg1_set_phy_power(u8 on) +static void am33xx_otg1_set_phy_power(struct udevice *dev, u8 on) { am33xx_usb_set_phy_power(on, &cdev->usb_ctrl1); } diff --git a/arch/arm/cpu/armv7/omap3/am35x_musb.c b/arch/arm/cpu/armv7/omap3/am35x_musb.c index 74dd105..d542699 100644 --- a/arch/arm/cpu/armv7/omap3/am35x_musb.c +++ b/arch/arm/cpu/armv7/omap3/am35x_musb.c @@ -13,7 +13,7 @@ #include <asm/io.h> #include <asm/arch/am35x_def.h>
-void am35x_musb_reset(void) +void am35x_musb_reset(struct udevice *dev) { /* Reset the musb interface */ clrsetbits_le32(&am35x_scm_general_regs->ip_sw_reset, @@ -22,7 +22,7 @@ void am35x_musb_reset(void) USBOTGSS_SW_RST, 0); }
-void am35x_musb_phy_power(u8 on) +void am35x_musb_phy_power(struct udevice *dev, u8 on) { unsigned long start = get_timer(0);
@@ -53,7 +53,7 @@ void am35x_musb_phy_power(u8 on) } }
-void am35x_musb_clear_irq(void) +void am35x_musb_clear_irq(struct udevice *dev) { clrsetbits_le32(&am35x_scm_general_regs->lvl_intr_clr, 0, USBOTGSS_INT_CLR); diff --git a/arch/arm/include/asm/arch-omap3/musb.h b/arch/arm/include/asm/arch-omap3/musb.h index cee4ed3..d06a758 100644 --- a/arch/arm/include/asm/arch-omap3/musb.h +++ b/arch/arm/include/asm/arch-omap3/musb.h @@ -7,7 +7,7 @@
#ifndef __ASM_ARCH_OMAP3_MUSB_H #define __ASM_ARCH_OMAP3_MUSB_H -extern void am35x_musb_reset(void); -extern void am35x_musb_phy_power(u8 on); -extern void am35x_musb_clear_irq(void); +void am35x_musb_reset(struct udevice *dev); +void am35x_musb_phy_power(struct udevice *dev, u8 on); +void am35x_musb_clear_irq(struct udevice *dev); #endif diff --git a/arch/arm/include/asm/omap_musb.h b/arch/arm/include/asm/omap_musb.h index 8b9cb0e..7c5fb40 100644 --- a/arch/arm/include/asm/omap_musb.h +++ b/arch/arm/include/asm/omap_musb.h @@ -15,9 +15,10 @@ extern const struct musb_platform_ops omap2430_ops;
struct omap_musb_board_data { u8 interface_type; - void (*set_phy_power)(u8 on); - void (*clear_irq)(void); - void (*reset)(void); + struct udevice *dev; + void (*set_phy_power)(struct udevice *dev, u8 on); + void (*clear_irq)(struct udevice *dev); + void (*reset)(struct udevice *dev); };
enum musb_interface {MUSB_INTERFACE_ULPI, MUSB_INTERFACE_UTMI}; diff --git a/drivers/usb/musb-new/am35x.c b/drivers/usb/musb-new/am35x.c index b8791dd..0167ea7 100644 --- a/drivers/usb/musb-new/am35x.c +++ b/drivers/usb/musb-new/am35x.c @@ -336,7 +336,7 @@ eoi: if (ret == IRQ_HANDLED || epintr || usbintr) { /* clear level interrupt */ if (data->clear_irq) - data->clear_irq(); + data->clear_irq(data->dev); /* write EOI */ musb_writel(reg_base, USB_END_OF_INTR_REG, 0); } @@ -401,14 +401,14 @@ static int am35x_musb_init(struct musb *musb)
/* Reset the musb */ if (data->reset) - data->reset(); + data->reset(data->dev);
/* Reset the controller */ musb_writel(reg_base, USB_CTRL_REG, AM35X_SOFT_RESET_MASK);
/* Start the on-chip PHY and its PLL. */ if (data->set_phy_power) - data->set_phy_power(1); + data->set_phy_power(data->dev, 1);
msleep(5);
@@ -416,7 +416,7 @@ static int am35x_musb_init(struct musb *musb)
/* clear level interrupt */ if (data->clear_irq) - data->clear_irq(); + data->clear_irq(data->dev);
return 0; } @@ -439,7 +439,7 @@ static int am35x_musb_exit(struct musb *musb)
/* Shutdown the on-chip PHY and its PLL. */ if (data->set_phy_power) - data->set_phy_power(0); + data->set_phy_power(data->dev, 0);
#ifndef __UBOOT__ usb_put_phy(musb->xceiv); @@ -630,7 +630,7 @@ static int am35x_suspend(struct device *dev)
/* Shutdown the on-chip PHY and its PLL. */ if (data->set_phy_power) - data->set_phy_power(0); + data->set_phy_power(data->dev, 0);
clk_disable(glue->phy_clk); clk_disable(glue->clk); @@ -647,7 +647,7 @@ static int am35x_resume(struct device *dev)
/* Start the on-chip PHY and its PLL. */ if (data->set_phy_power) - data->set_phy_power(1); + data->set_phy_power(data->dev, 1);
ret = clk_enable(glue->phy_clk); if (ret) { diff --git a/drivers/usb/musb-new/musb_dsps.c b/drivers/usb/musb-new/musb_dsps.c index bb7c952..b7f3550 100644 --- a/drivers/usb/musb-new/musb_dsps.c +++ b/drivers/usb/musb-new/musb_dsps.c @@ -452,7 +452,7 @@ static int dsps_musb_init(struct musb *musb)
/* Start the on-chip PHY and its PLL. */ if (data->set_phy_power) - data->set_phy_power(1); + data->set_phy_power(data->dev, 1);
musb->isr = dsps_interrupt;
@@ -493,7 +493,7 @@ static int dsps_musb_exit(struct musb *musb)
/* Shutdown the on-chip PHY and its PLL. */ if (data->set_phy_power) - data->set_phy_power(0); + data->set_phy_power(data->dev, 0);
#ifndef __UBOOT__ /* NOP driver needs change if supporting dual instance */ @@ -693,7 +693,7 @@ static int dsps_suspend(struct device *dev)
/* Shutdown the on-chip PHY and its PLL. */ if (data->set_phy_power) - data->set_phy_power(0); + data->set_phy_power(data->dev, 0);
return 0; } @@ -705,7 +705,7 @@ static int dsps_resume(struct device *dev)
/* Start the on-chip PHY and its PLL. */ if (data->set_phy_power) - data->set_phy_power(1); + data->set_phy_power(data->dev, 1);
return 0; }

On Tue, May 10, 2016 at 05:18:10PM +0530, Mugunthan V N wrote:
Currently all backend driver ops uses hard coded physical address, so to adopt the driver to DM, add device pointer to ops call backs so that drivers can get physical addresses from the usb driver priv/plat data.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com
Reviewed-by: Tom Rini trini@konsulko.com

Add a TI MUSB host driver with driver model support and the driver will be bound by the MUSB wrapper driver based on the dr_mode device tree entry.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com --- drivers/usb/musb-new/ti-musb.c | 191 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+)
diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c index cf0e296..1c15aa2 100644 --- a/drivers/usb/musb-new/ti-musb.c +++ b/drivers/usb/musb-new/ti-musb.c @@ -14,10 +14,195 @@ #include <dm/device-internal.h> #include <dm/lists.h>
+#include <asm/io.h> +#include <asm/omap_musb.h> +#include "musb_uboot.h" + DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_DM_USB
+/* USB 2.0 PHY Control */ +#define CM_PHY_PWRDN (1 << 0) +#define CM_PHY_OTG_PWRDN (1 << 1) +#define OTGVDET_EN (1 << 19) +#define OTGSESSENDEN (1 << 20) + +#define AM335X_USB1_CTRL 0x8 + +struct ti_musb_platdata { + void *base; + void *ctrl_mod_base; + struct musb_hdrc_platform_data plat; + struct musb_hdrc_config musb_config; + struct omap_musb_board_data otg_board_data; +}; + +static int ti_musb_get_usb_index(int node) +{ + const void *fdt = gd->fdt_blob; + int i = 0; + char path[64]; + const char *alias_path; + char alias[16]; + + fdt_get_path(fdt, node, path, sizeof(path)); + + do { + snprintf(alias, sizeof(alias), "usb%d", i); + alias_path = fdt_get_alias(fdt, alias); + if (alias_path == NULL) { + debug("USB index not found\n"); + return -ENOENT; + } + + if (!strcmp(path, alias_path)) + return i; + + i++; + } while (alias_path); + + return -ENOENT; +} + +static void ti_musb_set_phy_power(struct udevice *dev, u8 on) +{ + struct ti_musb_platdata *platdata = dev_get_platdata(dev); + + if (on) { + clrsetbits_le32(platdata->ctrl_mod_base, + CM_PHY_PWRDN | CM_PHY_OTG_PWRDN, + OTGVDET_EN | OTGSESSENDEN); + } else { + clrsetbits_le32(platdata->ctrl_mod_base, 0, + CM_PHY_PWRDN | CM_PHY_OTG_PWRDN); + } +} + +static int ti_musb_ofdata_to_platdata(struct udevice *dev) +{ + struct ti_musb_platdata *platdata = dev_get_platdata(dev); + const void *fdt = gd->fdt_blob; + int node = dev->of_offset; + int phys; + int ctrl_mod; + int usb_index; + + platdata->base = (void *)dev_get_addr_index(dev, 1); + + phys = fdtdec_lookup_phandle(fdt, node, "phys"); + ctrl_mod = fdtdec_lookup_phandle(fdt, phys, "ti,ctrl_mod"); + platdata->ctrl_mod_base = (void *)fdtdec_get_addr(fdt, ctrl_mod, "reg"); + usb_index = ti_musb_get_usb_index(node); + switch (usb_index) { + case 1: + platdata->ctrl_mod_base += AM335X_USB1_CTRL; + case 0: + default: + break; + } + + platdata->musb_config.multipoint = fdtdec_get_int(fdt, node, + "mentor,multipoint", + -1); + if (platdata->musb_config.multipoint < 0) { + error("MUSB multipoint DT entry missing\n"); + return -ENOENT; + } + + platdata->musb_config.dyn_fifo = 1; + + platdata->musb_config.num_eps = fdtdec_get_int(fdt, node, + "mentor,num-eps", -1); + if (platdata->musb_config.num_eps < 0) { + error("MUSB num-eps DT entry missing\n"); + return -ENOENT; + } + + platdata->musb_config.ram_bits = fdtdec_get_int(fdt, node, + "mentor,ram-bits", -1); + if (platdata->musb_config.ram_bits < 0) { + error("MUSB ram-bits DT entry missing\n"); + return -ENOENT; + } + + platdata->otg_board_data.set_phy_power = ti_musb_set_phy_power; + platdata->otg_board_data.dev = dev; + platdata->plat.config = &platdata->musb_config; + + platdata->plat.power = fdtdec_get_int(fdt, node, "mentor,power", -1); + if (platdata->plat.power < 0) { + error("MUSB mentor,power DT entry missing\n"); + return -ENOENT; + } + + platdata->plat.platform_ops = &musb_dsps_ops; + platdata->plat.board_data = &platdata->otg_board_data; + + return 0; +} + +static int ti_musb_host_probe(struct udevice *dev) +{ + struct musb_host_data *host = dev_get_priv(dev); + struct ti_musb_platdata *platdata = dev_get_platdata(dev); + struct usb_bus_priv *priv = dev_get_uclass_priv(dev); + struct omap_musb_board_data *otg_board_data; + int ret; + + priv->desc_before_addr = true; + + otg_board_data = &platdata->otg_board_data; + + host->host = musb_init_controller(&platdata->plat, + (struct device *)otg_board_data, + platdata->base); + if (!host->host) + return -EIO; + + ret = musb_lowlevel_init(host); + + return ret; +} + +static int ti_musb_host_remove(struct udevice *dev) +{ + struct musb_host_data *host = dev_get_priv(dev); + + musb_stop(host->host); + + return 0; +} + +static int ti_musb_host_ofdata_to_platdata(struct udevice *dev) +{ + struct ti_musb_platdata *platdata = dev_get_platdata(dev); + const void *fdt = gd->fdt_blob; + int node = dev->of_offset; + int ret; + + ret = ti_musb_ofdata_to_platdata(dev); + if (ret) { + error("platdata dt parse error\n"); + return ret; + } + + platdata->plat.mode = MUSB_HOST; + + return 0; +} + +U_BOOT_DRIVER(ti_musb_host) = { + .name = "ti-musb-host", + .id = UCLASS_USB, + .ofdata_to_platdata = ti_musb_host_ofdata_to_platdata, + .probe = ti_musb_host_probe, + .remove = ti_musb_host_remove, + .ops = &musb_usb_ops, + .platdata_auto_alloc_size = sizeof(struct ti_musb_platdata), + .priv_auto_alloc_size = sizeof(struct musb_host_data), +}; + static int ti_musb_wrapper_bind(struct udevice *parent) { const void *fdt = gd->fdt_blob; @@ -41,6 +226,12 @@ static int ti_musb_wrapper_bind(struct udevice *parent) break; case USB_DR_MODE_HOST: /* Bind MUSB host */ + ret = device_bind_driver_to_node(parent, "ti-musb-host", + name, node, &dev); + if (ret) { + error("musb - not able to bind usb host node\n"); + return ret; + } break; default: break;

On Tue, May 10, 2016 at 05:18:11PM +0530, Mugunthan V N wrote:
Add a TI MUSB host driver with driver model support and the driver will be bound by the MUSB wrapper driver based on the dr_mode device tree entry.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com
Reviewed-by: Tom Rini trini@konsulko.com

Add a TI MUSB peripheral driver with driver model support and the driver will be bound by the MUSB wrapper driver based on the dr_mode device tree entry.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com --- drivers/usb/musb-new/musb_uboot.c | 2 + drivers/usb/musb-new/ti-musb.c | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+)
diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c index 6ce528c..b03b556 100644 --- a/drivers/usb/musb-new/musb_uboot.c +++ b/drivers/usb/musb-new/musb_uboot.c @@ -373,6 +373,7 @@ struct dm_usb_ops musb_usb_ops = { #endif /* CONFIG_DM_USB */ #endif /* CONFIG_USB_MUSB_HOST */
+#ifndef CONFIG_DM_USB #ifdef CONFIG_USB_MUSB_GADGET static struct musb *gadget;
@@ -453,3 +454,4 @@ int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
return 0; } +#endif /* CONFIG_DM_USB */ diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c index 1c15aa2..11d10aa 100644 --- a/drivers/usb/musb-new/ti-musb.c +++ b/drivers/usb/musb-new/ti-musb.c @@ -14,6 +14,7 @@ #include <dm/device-internal.h> #include <dm/lists.h>
+#include <watchdog.h> #include <asm/io.h> #include <asm/omap_musb.h> #include "musb_uboot.h" @@ -142,6 +143,110 @@ static int ti_musb_ofdata_to_platdata(struct udevice *dev) return 0; }
+static struct musb *gadget; + +int usb_gadget_handle_interrupts(int index) +{ + WATCHDOG_RESET(); + if (!gadget || !gadget->isr) + return -EINVAL; + + return gadget->isr(0, gadget); +} + +int usb_gadget_register_driver(struct usb_gadget_driver *driver) +{ + int ret; + + if (!driver || driver->speed < USB_SPEED_FULL || !driver->bind || + !driver->setup) { + printf("bad parameter.\n"); + return -EINVAL; + } + + if (!gadget) { + printf("Controller uninitialized\n"); + return -ENXIO; + } + + ret = musb_gadget_start(&gadget->g, driver); + if (ret < 0) { + printf("gadget_start failed with %d\n", ret); + return ret; + } + + ret = driver->bind(&gadget->g); + if (ret < 0) { + printf("bind failed with %d\n", ret); + return ret; + } + + return 0; +} + +int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) +{ + if (driver->disconnect) + driver->disconnect(&gadget->g); + if (driver->unbind) + driver->unbind(&gadget->g); + return 0; +} + +static int ti_musb_peripheral_usb_probe(struct udevice *dev) +{ + struct ti_musb_platdata *platdata = dev_get_platdata(dev); + struct usb_bus_priv *priv = dev_get_uclass_priv(dev); + struct omap_musb_board_data *otg_board_data; + + otg_board_data = &platdata->otg_board_data; + + gadget = musb_init_controller(&platdata->plat, + (struct device *)otg_board_data, + platdata->base); + if (!gadget) { + error("gadget init failed\n"); + return -EIO; + } + + return 0; +} + +static int ti_musb_peripheral_remove(struct udevice *dev) +{ + musb_stop(gadget); + + return 0; +} + +static int ti_musb_peripheral_ofdata_to_platdata(struct udevice *dev) +{ + struct ti_musb_platdata *platdata = dev_get_platdata(dev); + const void *fdt = gd->fdt_blob; + int node = dev->of_offset; + int ret; + + ret = ti_musb_ofdata_to_platdata(dev); + if (ret) { + error("platdata dt parse error\n"); + return ret; + } + + platdata->plat.mode = MUSB_PERIPHERAL; + + return 0; +} + +U_BOOT_DRIVER(ti_musb_peripheral) = { + .name = "ti-musb-peripheral", + .id = UCLASS_USB_DEV_GENERIC, + .ofdata_to_platdata = ti_musb_peripheral_ofdata_to_platdata, + .probe = ti_musb_peripheral_usb_probe, + .remove = ti_musb_peripheral_remove, + .platdata_auto_alloc_size = sizeof(struct ti_musb_platdata), + .priv_auto_alloc_size = sizeof(struct musb), +}; + static int ti_musb_host_probe(struct udevice *dev) { struct musb_host_data *host = dev_get_priv(dev); @@ -222,7 +327,15 @@ static int ti_musb_wrapper_bind(struct udevice *parent) dr_mode = usb_get_dr_mode(node); switch (dr_mode) { case USB_DR_MODE_PERIPHERAL: + case USB_DR_MODE_OTG: /* Bind MUSB device */ + ret = device_bind_driver_to_node(parent, + "ti-musb-peripheral", + name, node, &dev); + if (ret) { + error("musb - not able to bind usb device node\n"); + return ret; + } break; case USB_DR_MODE_HOST: /* Bind MUSB host */

On 05/10/2016 01:48 PM, Mugunthan V N wrote:
Add a TI MUSB peripheral driver with driver model support and the driver will be bound by the MUSB wrapper driver based on the dr_mode device tree entry.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com
drivers/usb/musb-new/musb_uboot.c | 2 + drivers/usb/musb-new/ti-musb.c | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+)
diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c index 6ce528c..b03b556 100644 --- a/drivers/usb/musb-new/musb_uboot.c +++ b/drivers/usb/musb-new/musb_uboot.c @@ -373,6 +373,7 @@ struct dm_usb_ops musb_usb_ops = { #endif /* CONFIG_DM_USB */ #endif /* CONFIG_USB_MUSB_HOST */
+#ifndef CONFIG_DM_USB #ifdef CONFIG_USB_MUSB_GADGET static struct musb *gadget;
@@ -453,3 +454,4 @@ int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
return 0; } +#endif /* CONFIG_DM_USB */ diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c index 1c15aa2..11d10aa 100644 --- a/drivers/usb/musb-new/ti-musb.c +++ b/drivers/usb/musb-new/ti-musb.c @@ -14,6 +14,7 @@ #include <dm/device-internal.h> #include <dm/lists.h>
+#include <watchdog.h> #include <asm/io.h> #include <asm/omap_musb.h> #include "musb_uboot.h" @@ -142,6 +143,110 @@ static int ti_musb_ofdata_to_platdata(struct udevice *dev) return 0; }
+static struct musb *gadget;
+int usb_gadget_handle_interrupts(int index) +{
- WATCHDOG_RESET();
- if (!gadget || !gadget->isr)
return -EINVAL;
- return gadget->isr(0, gadget);
+}
+int usb_gadget_register_driver(struct usb_gadget_driver *driver) +{
- int ret;
- if (!driver || driver->speed < USB_SPEED_FULL || !driver->bind ||
!driver->setup) {
printf("bad parameter.\n");
Sentence usually starts with capital letter and ends with fullstop (not the case below).
return -EINVAL;
- }
- if (!gadget) {
printf("Controller uninitialized\n");
return -ENXIO;
- }
- ret = musb_gadget_start(&gadget->g, driver);
- if (ret < 0) {
printf("gadget_start failed with %d\n", ret);
return ret;
- }
- ret = driver->bind(&gadget->g);
- if (ret < 0) {
printf("bind failed with %d\n", ret);
Are all these prints really useful ?
return ret;
- }
- return 0;
+}
+int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) +{
- if (driver->disconnect)
driver->disconnect(&gadget->g);
- if (driver->unbind)
driver->unbind(&gadget->g);
- return 0;
+}
+static int ti_musb_peripheral_usb_probe(struct udevice *dev) +{
- struct ti_musb_platdata *platdata = dev_get_platdata(dev);
- struct usb_bus_priv *priv = dev_get_uclass_priv(dev);
- struct omap_musb_board_data *otg_board_data;
- otg_board_data = &platdata->otg_board_data;
- gadget = musb_init_controller(&platdata->plat,
(struct device *)otg_board_data,
platdata->base);
- if (!gadget) {
error("gadget init failed\n");
return -EIO;
- }
- return 0;
+}
+static int ti_musb_peripheral_remove(struct udevice *dev) +{
- musb_stop(gadget);
- return 0;
+}
+static int ti_musb_peripheral_ofdata_to_platdata(struct udevice *dev) +{
- struct ti_musb_platdata *platdata = dev_get_platdata(dev);
- const void *fdt = gd->fdt_blob;
- int node = dev->of_offset;
- int ret;
- ret = ti_musb_ofdata_to_platdata(dev);
- if (ret) {
error("platdata dt parse error\n");
return ret;
- }
- platdata->plat.mode = MUSB_PERIPHERAL;
- return 0;
+}
+U_BOOT_DRIVER(ti_musb_peripheral) = {
- .name = "ti-musb-peripheral",
- .id = UCLASS_USB_DEV_GENERIC,
- .ofdata_to_platdata = ti_musb_peripheral_ofdata_to_platdata,
- .probe = ti_musb_peripheral_usb_probe,
- .remove = ti_musb_peripheral_remove,
- .platdata_auto_alloc_size = sizeof(struct ti_musb_platdata),
- .priv_auto_alloc_size = sizeof(struct musb),
+};
static int ti_musb_host_probe(struct udevice *dev) { struct musb_host_data *host = dev_get_priv(dev); @@ -222,7 +327,15 @@ static int ti_musb_wrapper_bind(struct udevice *parent) dr_mode = usb_get_dr_mode(node); switch (dr_mode) { case USB_DR_MODE_PERIPHERAL:
case USB_DR_MODE_OTG: /* Bind MUSB device */
ret = device_bind_driver_to_node(parent,
"ti-musb-peripheral",
name, node, &dev);
if (ret) {
error("musb - not able to bind usb device node\n");
return ret;
case USB_DR_MODE_HOST: /* Bind MUSB host */} break;

On Tuesday 10 May 2016 06:09 PM, Marek Vasut wrote:
On 05/10/2016 01:48 PM, Mugunthan V N wrote:
Add a TI MUSB peripheral driver with driver model support and the driver will be bound by the MUSB wrapper driver based on the dr_mode device tree entry.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com
drivers/usb/musb-new/musb_uboot.c | 2 + drivers/usb/musb-new/ti-musb.c | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+)
diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c index 6ce528c..b03b556 100644 --- a/drivers/usb/musb-new/musb_uboot.c +++ b/drivers/usb/musb-new/musb_uboot.c @@ -373,6 +373,7 @@ struct dm_usb_ops musb_usb_ops = { #endif /* CONFIG_DM_USB */ #endif /* CONFIG_USB_MUSB_HOST */
+#ifndef CONFIG_DM_USB #ifdef CONFIG_USB_MUSB_GADGET static struct musb *gadget;
@@ -453,3 +454,4 @@ int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
return 0; } +#endif /* CONFIG_DM_USB */ diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c index 1c15aa2..11d10aa 100644 --- a/drivers/usb/musb-new/ti-musb.c +++ b/drivers/usb/musb-new/ti-musb.c @@ -14,6 +14,7 @@ #include <dm/device-internal.h> #include <dm/lists.h>
+#include <watchdog.h> #include <asm/io.h> #include <asm/omap_musb.h> #include "musb_uboot.h" @@ -142,6 +143,110 @@ static int ti_musb_ofdata_to_platdata(struct udevice *dev) return 0; }
+static struct musb *gadget;
+int usb_gadget_handle_interrupts(int index) +{
- WATCHDOG_RESET();
- if (!gadget || !gadget->isr)
return -EINVAL;
- return gadget->isr(0, gadget);
+}
+int usb_gadget_register_driver(struct usb_gadget_driver *driver) +{
- int ret;
- if (!driver || driver->speed < USB_SPEED_FULL || !driver->bind ||
!driver->setup) {
printf("bad parameter.\n");
Sentence usually starts with capital letter and ends with fullstop (not the case below).
return -EINVAL;
- }
- if (!gadget) {
printf("Controller uninitialized\n");
return -ENXIO;
- }
- ret = musb_gadget_start(&gadget->g, driver);
- if (ret < 0) {
printf("gadget_start failed with %d\n", ret);
return ret;
- }
- ret = driver->bind(&gadget->g);
- if (ret < 0) {
printf("bind failed with %d\n", ret);
Are all these prints really useful ?
This function is just a carry forward from non-DM driver, will have a look to remove irrelevant logs.
Regards Mugunthan V N
return ret;
- }
- return 0;
+}
+int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) +{
- if (driver->disconnect)
driver->disconnect(&gadget->g);
- if (driver->unbind)
driver->unbind(&gadget->g);
- return 0;
+}
+static int ti_musb_peripheral_usb_probe(struct udevice *dev) +{
- struct ti_musb_platdata *platdata = dev_get_platdata(dev);
- struct usb_bus_priv *priv = dev_get_uclass_priv(dev);
- struct omap_musb_board_data *otg_board_data;
- otg_board_data = &platdata->otg_board_data;
- gadget = musb_init_controller(&platdata->plat,
(struct device *)otg_board_data,
platdata->base);
- if (!gadget) {
error("gadget init failed\n");
return -EIO;
- }
- return 0;
+}
+static int ti_musb_peripheral_remove(struct udevice *dev) +{
- musb_stop(gadget);
- return 0;
+}
+static int ti_musb_peripheral_ofdata_to_platdata(struct udevice *dev) +{
- struct ti_musb_platdata *platdata = dev_get_platdata(dev);
- const void *fdt = gd->fdt_blob;
- int node = dev->of_offset;
- int ret;
- ret = ti_musb_ofdata_to_platdata(dev);
- if (ret) {
error("platdata dt parse error\n");
return ret;
- }
- platdata->plat.mode = MUSB_PERIPHERAL;
- return 0;
+}
+U_BOOT_DRIVER(ti_musb_peripheral) = {
- .name = "ti-musb-peripheral",
- .id = UCLASS_USB_DEV_GENERIC,
- .ofdata_to_platdata = ti_musb_peripheral_ofdata_to_platdata,
- .probe = ti_musb_peripheral_usb_probe,
- .remove = ti_musb_peripheral_remove,
- .platdata_auto_alloc_size = sizeof(struct ti_musb_platdata),
- .priv_auto_alloc_size = sizeof(struct musb),
+};
static int ti_musb_host_probe(struct udevice *dev) { struct musb_host_data *host = dev_get_priv(dev); @@ -222,7 +327,15 @@ static int ti_musb_wrapper_bind(struct udevice *parent) dr_mode = usb_get_dr_mode(node); switch (dr_mode) { case USB_DR_MODE_PERIPHERAL:
case USB_DR_MODE_OTG: /* Bind MUSB device */
ret = device_bind_driver_to_node(parent,
"ti-musb-peripheral",
name, node, &dev);
if (ret) {
error("musb - not able to bind usb device node\n");
return ret;
case USB_DR_MODE_HOST: /* Bind MUSB host */} break;

On 11 May 2016 at 23:49, Mugunthan V N mugunthanvnm@ti.com wrote:
On Tuesday 10 May 2016 06:09 PM, Marek Vasut wrote:
On 05/10/2016 01:48 PM, Mugunthan V N wrote:
Add a TI MUSB peripheral driver with driver model support and the driver will be bound by the MUSB wrapper driver based on the dr_mode device tree entry.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com
drivers/usb/musb-new/musb_uboot.c | 2 + drivers/usb/musb-new/ti-musb.c | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+)
Reviewed-by: Simon Glass sjg@chromium.org

Add usb ether gadget device with usb_ether_init() when CONFIG_DM_ETH and CONFIG_USB_ETHER are defined.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com Reviewed-by: Tom Rini trini@konsulko.com --- arch/arm/cpu/armv7/am33xx/board.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c index b8d8a3b..4a8f81b 100644 --- a/arch/arm/cpu/armv7/am33xx/board.c +++ b/arch/arm/cpu/armv7/am33xx/board.c @@ -204,6 +204,14 @@ int arch_misc_init(void) ret = uclass_first_device(UCLASS_MISC, &dev); if (ret || !dev) return ret; + +#if defined(CONFIG_DM_ETH) && defined(CONFIG_USB_ETHER) + ret = usb_ether_init(); + if (ret) { + error("USB ether init failed\n"); + return ret; + } +#endif #endif return 0; }

Since usb ether gadget have support for driver model, so enable usb ether gadget.
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com Reviewed-by: Tom Rini trini@konsulko.com --- include/configs/am335x_evm.h | 3 --- 1 file changed, 3 deletions(-)
diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h index ed7a0b2..b02dfae 100644 --- a/include/configs/am335x_evm.h +++ b/include/configs/am335x_evm.h @@ -307,12 +307,9 @@ #endif
#ifdef CONFIG_USB_MUSB_GADGET -/* Removing USB gadget and can be enabled adter adding support usb DM */ -#ifndef CONFIG_DM_ETH #define CONFIG_USB_ETHER #define CONFIG_USB_ETH_RNDIS #define CONFIG_USBNET_HOST_ADDR "de:ad:be:af:00:00" -#endif /* CONFIG_DM_ETH */ #endif /* CONFIG_USB_MUSB_GADGET */
/*

enable usb driver model for am335x bbb as musb supports driver model
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com Reviewed-by: Tom Rini trini@konsulko.com --- configs/am335x_boneblack_vboot_defconfig | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/configs/am335x_boneblack_vboot_defconfig b/configs/am335x_boneblack_vboot_defconfig index 903f518..2591d76 100644 --- a/configs/am335x_boneblack_vboot_defconfig +++ b/configs/am335x_boneblack_vboot_defconfig @@ -49,3 +49,6 @@ CONFIG_USB_GADGET_DOWNLOAD=y CONFIG_G_DNL_MANUFACTURER="Texas Instruments" CONFIG_G_DNL_VENDOR_NUM=0x0451 CONFIG_G_DNL_PRODUCT_NUM=0xd022 +CONFIG_MISC=y +CONFIG_DM_USB=y +CONFIG_USB_MUSB_TI=y

enable usb driver model for am335x gp evm as musb supports driver model
Signed-off-by: Mugunthan V N mugunthanvnm@ti.com Reviewed-by: Tom Rini trini@konsulko.com --- configs/am335x_gp_evm_defconfig | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/configs/am335x_gp_evm_defconfig b/configs/am335x_gp_evm_defconfig index d7f126e..05a0f5b 100644 --- a/configs/am335x_gp_evm_defconfig +++ b/configs/am335x_gp_evm_defconfig @@ -44,3 +44,6 @@ CONFIG_G_DNL_MANUFACTURER="Texas Instruments" CONFIG_G_DNL_VENDOR_NUM=0x0451 CONFIG_G_DNL_PRODUCT_NUM=0xd022 CONFIG_RSA=y +CONFIG_MISC=y +CONFIG_DM_USB=y +CONFIG_USB_MUSB_TI=y
participants (4)
-
Marek Vasut
-
Mugunthan V N
-
Simon Glass
-
Tom Rini