On Tuesday 13 June 2017 07:33 PM, Marek Vasut wrote: > On 06/13/2017 02:10 PM, Vignesh R wrote: >> From: Mugunthan V N <mugunthan...@ti.com> >> >> Add a TI DWC3 peripheral driver with driver model support and the >> driver will be bound by the DWC3 wrapper driver based on the >> dr_mode device tree entry. >> >> Signed-off-by: Mugunthan V N <mugunthan...@ti.com> >> Signed-off-by: Vignesh R <vigne...@ti.com> >> --- >> drivers/usb/dwc3/core.c | 57 +++++++++++++++ >> drivers/usb/dwc3/core.h | 6 ++ >> drivers/usb/dwc3/dwc3-omap.c | 167 >> +++++++++++++++++++++++++++++++++++++++++++ >> 3 files changed, 230 insertions(+) >> >> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c >> index 98102bd6b00a..a895f8fbddd3 100644 >> --- a/drivers/usb/dwc3/core.c >> +++ b/drivers/usb/dwc3/core.c >> @@ -603,6 +603,8 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) >> >> #define DWC3_ALIGN_MASK (16 - 1) >> >> +#ifndef CONFIG_DM_USB >> + >> /** >> * dwc3_uboot_init - dwc3 core uboot initialization code >> * @dwc3_dev: struct dwc3_device containing initialization data >> @@ -789,3 +791,58 @@ MODULE_ALIAS("platform:dwc3"); >> MODULE_AUTHOR("Felipe Balbi <ba...@ti.com>"); >> MODULE_LICENSE("GPL v2"); >> MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver"); >> + >> +#else >> + >> +int dwc3_init(struct dwc3 *dwc) >> +{ >> + int ret; >> + >> + dwc3_cache_hwparams(dwc); >> + >> + ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); >> + if (ret) { >> + dev_err(dwc->dev, "failed to allocate event buffers\n"); >> + return -ENOMEM; >> + } >> + >> + ret = dwc3_core_init(dwc); >> + if (ret) { >> + dev_err(dev, "failed to initialize core\n"); >> + goto err0; >> + } >> + >> + ret = dwc3_event_buffers_setup(dwc); >> + if (ret) { >> + dev_err(dwc->dev, "failed to setup event buffers\n"); >> + goto err1; >> + } >> + >> + ret = dwc3_core_init_mode(dwc); >> + if (ret) >> + goto err2; >> + >> + return 0; >> + >> +err2: > > Use more descriptive label names please ...
Ok, will do in next version. > >> + dwc3_event_buffers_cleanup(dwc); >> + >> +err1: >> + dwc3_core_exit(dwc); >> + >> +err0: >> + dwc3_free_event_buffers(dwc); >> + >> + return ret; >> +} >> + >> +void dwc3_remove(struct dwc3 *dwc) >> +{ >> + dwc3_core_exit_mode(dwc); >> + dwc3_event_buffers_cleanup(dwc); >> + dwc3_free_event_buffers(dwc); >> + dwc3_core_exit(dwc); >> + kfree(dwc->mem); >> +} >> + >> +#endif >> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h >> index 72d2fcdd3f42..972628751697 100644 >> --- a/drivers/usb/dwc3/core.h >> +++ b/drivers/usb/dwc3/core.h >> @@ -713,7 +713,11 @@ struct dwc3 { >> /* device lock */ >> spinlock_t lock; >> >> +#ifndef CONFIG_DM_USB >> struct device *dev; >> +#else >> + struct udevice *dev; >> +#endif >> >> struct platform_device *xhci; >> struct resource xhci_resources[DWC3_XHCI_RESOURCES_NUM]; >> @@ -988,6 +992,8 @@ struct dwc3_gadget_ep_cmd_params { >> >> /* prototypes */ >> int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc); >> +int dwc3_init(struct dwc3 *dwc); >> +void dwc3_remove(struct dwc3 *dwc); >> >> #ifdef CONFIG_USB_DWC3_HOST >> int dwc3_host_init(struct dwc3 *dwc); >> diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c >> index f18884f13392..b4dde726c6f3 100644 >> --- a/drivers/usb/dwc3/dwc3-omap.c >> +++ b/drivers/usb/dwc3/dwc3-omap.c >> @@ -27,6 +27,23 @@ >> #include <dwc3-uboot.h> >> >> #include "linux-compat.h" >> +#include <linux/usb/ch9.h> >> +#include <linux/usb/gadget.h> >> +#include <ti-usb-phy-uboot.h> >> +#include <usb.h> >> + >> +#include "core.h" >> + >> +#include <libfdt.h> >> +#include <dm/device.h> >> +#include <dm/uclass.h> >> +#include <dm/lists.h> >> +#include <dwc3-uboot.h> >> + >> +#include <asm/omap_common.h> >> +#include "gadget.h" >> + >> +DECLARE_GLOBAL_DATA_PTR; >> >> /* >> * All these registers belong to OMAP's Wrapper around the >> @@ -135,6 +152,12 @@ struct dwc3_omap { >> u32 index; >> }; >> >> +struct omap_dwc3_priv { >> + struct dwc3_omap omap; >> + struct dwc3 dwc3; >> + struct ti_usb_phy_device phy_device; >> +}; >> + >> static LIST_HEAD(dwc3_omap_list); >> >> static inline u32 dwc3_omap_readl(void __iomem *base, u32 offset) >> @@ -362,6 +385,8 @@ static void dwc3_omap_set_utmi_mode(struct dwc3_omap >> *omap, int utmi_mode) >> dwc3_omap_write_utmi_status(omap, reg); >> } >> >> +#ifndef CONFIG_DM_USB >> + >> /** >> * dwc3_omap_uboot_init - dwc3 omap uboot initialization code >> * @dev: struct dwc3_omap_device containing initialization data >> @@ -462,3 +487,145 @@ MODULE_ALIAS("platform:omap-dwc3"); >> MODULE_AUTHOR("Felipe Balbi <ba...@ti.com>"); >> MODULE_LICENSE("GPL v2"); >> MODULE_DESCRIPTION("DesignWare USB3 OMAP Glue Layer"); >> + >> +#else >> + >> +int usb_gadget_handle_interrupts(int index) > > Can this be made somehow more generic , so that the core code would > contain the basic interrupt handling and probe routines and the various > SoC-specific drivers would add their specific bits to it ? > How about moving this to drivers/usb/dwc3/gadget.c and then provide a callback to each of SoC specific drivers? >> +{ >> + struct omap_dwc3_priv *priv; >> + struct dwc3_omap *omap; >> + struct dwc3 *dwc; >> + struct udevice *dev; >> + u32 status; >> + int ret; >> + >> + ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev); >> + if (!dev || ret) { >> + error("No USB device found\n"); >> + return -ENODEV; >> + } >> + >> + priv = dev_get_priv(dev); >> + omap = &priv->omap; >> + dwc = &priv->dwc3; >> + >> + status = dwc3_omap_interrupt(-1, omap); >> + if (status) >> + dwc3_gadget_uboot_handle_interrupt(dwc); >> + >> + return 0; >> +} Thanks for the review! -- Regards Vignesh _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot