
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 mugunthanvnm@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 mugunthanvnm@ti.com Signed-off-by: Vignesh R vigneshr@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 balbi@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 balbi@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!