public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver
@ 2018-05-18 11:15 Michal Simek
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
  To: u-boot


Hi,

this patchset is based on unfinished series send to ML 06/13/2017
by Vignesh
"[U-Boot] [PATCH v2 00/13] driver model bring-up of dwc3 usb peripheral"
We have taken some part of this to Xilinx tree and use it for a while
but it is time to review it and upstream it.

The patchset has 2 patches created by Mugunthan which are a little bit
fixed.
dwc3-generic driver was inspired by omap version.
And the last 3 patches just doing conversion and enable DM_USB for our
platform.

Thanks,
Michal

Changes in v2:
- Retype dwc->dev in gadget.c to avoid compilation warning
- Guard udevice with __UBOOT__
- Move ifdef in core.c to avoid compilation issues for some platforms
  (for example edison)
- Change style to avoid correct but not nice indentation by using char
  *driver variable (suggested by Marek)

Michal Simek (4):
  usb: dwc3: Add generic DWC3 glue logic driver
  usb: xhci: zynqmp: Add support for DM_USB
  arm64: zynqmp: Use DWC3 generic driver and DM_USB
  usb: xhci: zynqmp: Remove support for !DM_USB

Mugunthan V N (2):
  usb: dwc3: Add dwc3_init/remove with DM_USB
  usb: common: add support to get maximum speed from dt

 arch/arm/include/asm/arch-zynqmp/hardware.h   |   3 -
 board/xilinx/zynqmp/zynqmp.c                  |  46 -----
 .../xilinx_zynqmp_zc1751_xm015_dc1_defconfig  |   1 +
 .../xilinx_zynqmp_zc1751_xm016_dc2_defconfig  |   1 +
 .../xilinx_zynqmp_zc1751_xm017_dc3_defconfig  |   1 +
 configs/xilinx_zynqmp_zcu100_revC_defconfig   |   1 +
 configs/xilinx_zynqmp_zcu102_rev1_0_defconfig |   1 +
 configs/xilinx_zynqmp_zcu102_revA_defconfig   |   1 +
 configs/xilinx_zynqmp_zcu102_revB_defconfig   |   1 +
 configs/xilinx_zynqmp_zcu104_revA_defconfig   |   1 +
 configs/xilinx_zynqmp_zcu104_revC_defconfig   |   1 +
 configs/xilinx_zynqmp_zcu106_revA_defconfig   |   1 +
 configs/xilinx_zynqmp_zcu111_revA_defconfig   |   1 +
 drivers/usb/common/common.c                   |  29 ++++
 drivers/usb/dwc3/Kconfig                      |   6 +
 drivers/usb/dwc3/Makefile                     |   1 +
 drivers/usb/dwc3/core.c                       |  55 ++++++
 drivers/usb/dwc3/core.h                       |   6 +
 drivers/usb/dwc3/dwc3-generic.c               | 157 ++++++++++++++++++
 drivers/usb/dwc3/gadget.c                     |   2 +-
 drivers/usb/host/Kconfig                      |   1 +
 drivers/usb/host/xhci-zynqmp.c                |  85 ++++++----
 .../configs/xilinx_zynqmp_zc1751_xm015_dc1.h  |   1 -
 .../configs/xilinx_zynqmp_zc1751_xm016_dc2.h  |   2 -
 .../configs/xilinx_zynqmp_zc1751_xm017_dc3.h  |   3 -
 include/configs/xilinx_zynqmp_zcu100.h        |   3 -
 include/configs/xilinx_zynqmp_zcu102.h        |   2 -
 include/configs/xilinx_zynqmp_zcu104.h        |   2 -
 include/configs/xilinx_zynqmp_zcu106.h        |   2 -
 include/configs/xilinx_zynqmp_zcu111.h        |   2 -
 include/linux/usb/otg.h                       |   9 +
 scripts/config_whitelist.txt                  |   1 -
 32 files changed, 330 insertions(+), 99 deletions(-)
 create mode 100644 drivers/usb/dwc3/dwc3-generic.c

-- 
2.17.0

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB
  2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
  2018-05-18 13:21   ` Jean-Jacques Hiblot
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 2/6] usb: common: add support to get maximum speed from dt Michal Simek
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
  To: u-boot

From: Mugunthan V N <mugunthanvnm@ti.com>

The patch is preparing dwc3 core for enabling DM_USB with peripheral
driver with using driver model support.
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>
(Remove dwc3-omap changes)
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v2:
- Retype dwc->dev in gadget.c to avoid compilation warning
- Guard udevice with __UBOOT__
- Move ifdef in core.c to avoid compilation issues for some platforms
  (for example edison)

Origin series here: https://patchwork.ozlabs.org/patch/775108/

- Fix labels as was asked in previous review.

---
 drivers/usb/dwc3/core.c   | 55 +++++++++++++++++++++++++++++++++++++++
 drivers/usb/dwc3/core.h   |  6 +++++
 drivers/usb/dwc3/gadget.c |  2 +-
 3 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index dbdad22d1134..1ab5cee60969 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -788,3 +788,58 @@ MODULE_ALIAS("platform:dwc3");
 MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
 MODULE_LICENSE("GPL v2");
 MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
+
+#ifdef CONFIG_DM_USB
+
+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 core_fail;
+	}
+
+	ret = dwc3_event_buffers_setup(dwc);
+	if (ret) {
+		dev_err(dwc->dev, "failed to setup event buffers\n");
+		goto event_fail;
+	}
+
+	ret = dwc3_core_init_mode(dwc);
+	if (ret)
+		goto mode_fail;
+
+	return 0;
+
+mode_fail:
+	dwc3_event_buffers_cleanup(dwc);
+
+event_fail:
+	dwc3_core_exit(dwc);
+
+core_fail:
+	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 cbe9850a0bda..58fe91dc5131 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -712,7 +712,11 @@ struct dwc3 {
 	/* device lock */
 	spinlock_t		lock;
 
+#if defined(__UBOOT__) && defined(CONFIG_DM_USB)
+	struct udevice		*dev;
+#else
 	struct device		*dev;
+#endif
 
 	struct platform_device	*xhci;
 	struct resource		xhci_resources[DWC3_XHCI_RESOURCES_NUM];
@@ -987,6 +991,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/gadget.c b/drivers/usb/dwc3/gadget.c
index d45fae044c4a..e340cb268fcd 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2609,7 +2609,7 @@ int dwc3_gadget_init(struct dwc3 *dwc)
 	if (ret)
 		goto err4;
 
-	ret = usb_add_gadget_udc(dwc->dev, &dwc->gadget);
+	ret = usb_add_gadget_udc((struct device *)dwc->dev, &dwc->gadget);
 	if (ret) {
 		dev_err(dwc->dev, "failed to register udc\n");
 		goto err4;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 2/6] usb: common: add support to get maximum speed from dt
  2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
  To: u-boot

From: Mugunthan V N <mugunthanvnm@ti.com>

Add support to get maximum speed from dt so that usb drivers
makes use of it for DT parsing.

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
(rebase and fix errors)
Reviewed-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/usb/common/common.c | 29 +++++++++++++++++++++++++++++
 include/linux/usb/otg.h     |  9 +++++++++
 2 files changed, 38 insertions(+)

diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c
index 17a0ab23ff53..a55def5aba67 100644
--- a/drivers/usb/common/common.c
+++ b/drivers/usb/common/common.c
@@ -9,6 +9,7 @@
 #include <common.h>
 #include <linux/libfdt.h>
 #include <linux/usb/otg.h>
+#include <linux/usb/ch9.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -37,3 +38,31 @@ enum usb_dr_mode usb_get_dr_mode(int node)
 
 	return USB_DR_MODE_UNKNOWN;
 }
+
+static const char *const speed_names[] = {
+	[USB_SPEED_UNKNOWN] = "UNKNOWN",
+	[USB_SPEED_LOW] = "low-speed",
+	[USB_SPEED_FULL] = "full-speed",
+	[USB_SPEED_HIGH] = "high-speed",
+	[USB_SPEED_WIRELESS] = "wireless",
+	[USB_SPEED_SUPER] = "super-speed",
+};
+
+enum usb_device_speed usb_get_maximum_speed(int node)
+{
+	const void *fdt = gd->fdt_blob;
+	const char *max_speed;
+	int i;
+
+	max_speed = fdt_getprop(fdt, node, "maximum-speed", NULL);
+	if (!max_speed) {
+		pr_err("usb maximum-speed not found\n");
+		return USB_SPEED_UNKNOWN;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(speed_names); i++)
+		if (!strcmp(max_speed, speed_names[i]))
+			return i;
+
+	return USB_SPEED_UNKNOWN;
+}
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index 0b273d8e2e8a..d2604c5cafba 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -25,4 +25,13 @@ enum usb_dr_mode {
  */
 enum usb_dr_mode usb_get_dr_mode(int node);
 
+/**
+ * usb_get_maximum_speed() - Get maximum speed for given device
+ * @node: Node offset to the given device
+ *
+ * The function gets phy interface string from property 'maximum-speed',
+ * and returns the correspondig enum usb_device_speed
+ */
+enum usb_device_speed usb_get_maximum_speed(int node);
+
 #endif /* __LINUX_USB_OTG_H */
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver
  2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 2/6] usb: common: add support to get maximum speed from dt Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
  2018-05-18 13:24   ` Jean-Jacques Hiblot
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
  To: u-boot

By enabling BLK by default this is the next driver which needs to get
support for DM_USB. Adding generic DWC3 glue logic which only
parse nodes and read device mode. Based on it probe proper
host/peripheral DWC3 drivers for it.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v2:
- Change style to avoid correct but not nice indentation by using char
  *driver variable (suggested by Marek)

 drivers/usb/dwc3/Kconfig        |   6 ++
 drivers/usb/dwc3/Makefile       |   1 +
 drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++++++++++++++++
 3 files changed, 164 insertions(+)
 create mode 100644 drivers/usb/dwc3/dwc3-generic.c

diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
index ae7fc1c6304d..943b7630eba4 100644
--- a/drivers/usb/dwc3/Kconfig
+++ b/drivers/usb/dwc3/Kconfig
@@ -37,6 +37,12 @@ config USB_DWC3_OMAP
 
 	  Say 'Y' here if you have one such device
 
+config USB_DWC3_GENERIC
+	bool "Xilinx ZynqMP and similar Platforms"
+	depends on DM_USB && USB_DWC3
+	help
+	  Some platforms can reuse this DWC3 generic implementation.
+
 config USB_DWC3_UNIPHIER
 	bool "DesignWare USB3 Host Support on UniPhier Platforms"
 	depends on ARCH_UNIPHIER && USB_XHCI_DWC3
diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
index cd18b8d9ec02..60b5515a67da 100644
--- a/drivers/usb/dwc3/Makefile
+++ b/drivers/usb/dwc3/Makefile
@@ -7,6 +7,7 @@ dwc3-y					:= core.o
 obj-$(CONFIG_USB_DWC3_GADGET)		+= gadget.o ep0.o
 
 obj-$(CONFIG_USB_DWC3_OMAP)		+= dwc3-omap.o
+obj-$(CONFIG_USB_DWC3_GENERIC)		+= dwc3-generic.o
 obj-$(CONFIG_USB_DWC3_UNIPHIER)		+= dwc3-uniphier.o
 obj-$(CONFIG_USB_DWC3_PHY_OMAP)		+= ti_usb_phy.o
 obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG)	+= samsung_usb_phy.o
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
new file mode 100644
index 000000000000..ca63eac3d98e
--- /dev/null
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -0,0 +1,157 @@
+// SPDX-License-Identifier:     GPL-2.0
+/*
+ * Generic DWC3 Glue layer
+ *
+ * Copyright (C) 2016 - 2018 Xilinx, Inc.
+ *
+ * Based on dwc3-omap.c.
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
+#include <linux/usb/otg.h>
+#include <linux/compat.h>
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+#include <malloc.h>
+#include <usb.h>
+#include "core.h"
+#include "gadget.h"
+#include "linux-compat.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int usb_gadget_handle_interrupts(int index)
+{
+	struct dwc3 *priv;
+	struct udevice *dev;
+	int ret;
+
+	ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
+	if (!dev || ret) {
+		pr_err("No USB device found\n");
+		return -ENODEV;
+	}
+
+	priv = dev_get_priv(dev);
+
+	dwc3_gadget_uboot_handle_interrupt(priv);
+
+	return 0;
+}
+
+static int dwc3_generic_peripheral_probe(struct udevice *dev)
+{
+	struct dwc3 *priv = dev_get_priv(dev);
+
+	return dwc3_init(priv);
+}
+
+static int dwc3_generic_peripheral_remove(struct udevice *dev)
+{
+	struct dwc3 *priv = dev_get_priv(dev);
+
+	dwc3_remove(priv);
+
+	return 0;
+}
+
+static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
+{
+	struct dwc3 *priv = dev_get_priv(dev);
+	int node = dev_of_offset(dev);
+
+	priv->regs = (void *)devfdt_get_addr(dev);
+	priv->regs += DWC3_GLOBALS_REGS_START;
+
+	priv->maximum_speed = usb_get_maximum_speed(node);
+	if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
+		pr_err("Invalid usb maximum speed\n");
+		return -ENODEV;
+	}
+
+	priv->dr_mode = usb_get_dr_mode(node);
+	if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
+		pr_err("Invalid usb mode setup\n");
+		return -ENODEV;
+	}
+
+	return 0;
+}
+
+static int dwc3_generic_peripheral_bind(struct udevice *dev)
+{
+	return device_probe(dev);
+}
+
+U_BOOT_DRIVER(dwc3_generic_peripheral) = {
+	.name	= "dwc3-generic-peripheral",
+	.id	= UCLASS_USB_DEV_GENERIC,
+	.ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
+	.probe = dwc3_generic_peripheral_probe,
+	.remove = dwc3_generic_peripheral_remove,
+	.bind = dwc3_generic_peripheral_bind,
+	.platdata_auto_alloc_size = sizeof(struct usb_platdata),
+	.priv_auto_alloc_size = sizeof(struct dwc3),
+	.flags	= DM_FLAG_ALLOC_PRIV_DMA,
+};
+
+static int dwc3_generic_bind(struct udevice *parent)
+{
+	const void *fdt = gd->fdt_blob;
+	int node;
+	int ret;
+
+	for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0;
+	     node = fdt_next_subnode(fdt, node)) {
+		const char *name = fdt_get_name(fdt, node, NULL);
+		enum usb_dr_mode dr_mode;
+		struct udevice *dev;
+		const char *driver;
+
+		debug("%s: subnode name: %s\n", __func__, name);
+		if (strncmp(name, "dwc3@", 4))
+			continue;
+
+		dr_mode = usb_get_dr_mode(node);
+
+		switch (dr_mode) {
+		case USB_DR_MODE_PERIPHERAL:
+		case USB_DR_MODE_OTG:
+			debug("%s: dr_mode: OTG or Peripheral\n", __func__);
+			driver = "dwc3-generic-peripheral";
+			break;
+		case USB_DR_MODE_HOST:
+			debug("%s: dr_mode: HOST\n", __func__);
+			driver = "dwc3-generic-host";
+			break;
+		default:
+			debug("%s: unsupported dr_mode\n", __func__);
+			return -ENODEV;
+		};
+
+		ret = device_bind_driver_to_node(parent, driver, name,
+						 offset_to_ofnode(node), &dev);
+		if (ret) {
+			debug("%s: not able to bind usb device mode\n",
+			      __func__);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
+static const struct udevice_id dwc3_generic_ids[] = {
+	{ .compatible = "xlnx,zynqmp-dwc3" },
+	{ }
+};
+
+U_BOOT_DRIVER(dwc3_generic_wrapper) = {
+	.name	= "dwc3-generic-wrapper",
+	.id	= UCLASS_MISC,
+	.of_match = dwc3_generic_ids,
+	.bind = dwc3_generic_bind,
+};
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 4/6] usb: xhci: zynqmp: Add support for DM_USB
  2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
                   ` (2 preceding siblings ...)
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
  To: u-boot

The patch is adding support for DM_USB for xhci driver.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

Changes in v2: None

 drivers/usb/host/xhci-zynqmp.c | 69 ++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/drivers/usb/host/xhci-zynqmp.c b/drivers/usb/host/xhci-zynqmp.c
index b1ade582aef6..526a42a9a58a 100644
--- a/drivers/usb/host/xhci-zynqmp.c
+++ b/drivers/usb/host/xhci-zynqmp.c
@@ -10,6 +10,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <usb.h>
 #include <linux/errno.h>
 #include <asm/arch/hardware.h>
@@ -54,13 +55,23 @@
 #define USBOTGSS_IRQ_SET_1_DMADISABLECLR_EN	BIT(17)
 
 struct zynqmp_xhci {
+#ifdef CONFIG_DM_USB
+	struct usb_platdata usb_plat;
+#endif
+	struct xhci_ctrl ctrl;
 	struct xhci_hccr *hcd;
 	struct dwc3 *dwc3_reg;
 };
 
+#ifdef CONFIG_DM_USB
+struct zynqmp_xhci_platdata {
+	fdt_addr_t hcd_base;
+};
+#else
 static struct zynqmp_xhci zynqmp_xhci;
 
 unsigned long ctr_addr[] = CONFIG_ZYNQMP_XHCI_LIST;
+#endif
 
 static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
 {
@@ -78,6 +89,7 @@ static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
 	return ret;
 }
 
+#ifndef CONFIG_DM_USB
 int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
 {
 	struct zynqmp_xhci *ctx = &zynqmp_xhci;
@@ -111,6 +123,7 @@ int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
 
 	return ret;
 }
+#endif
 
 void xhci_hcd_stop(int index)
 {
@@ -121,3 +134,59 @@ void xhci_hcd_stop(int index)
 
 	return;
 }
+
+#ifdef CONFIG_DM_USB
+static int xhci_usb_probe(struct udevice *dev)
+{
+	struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
+	struct zynqmp_xhci *ctx = dev_get_priv(dev);
+	struct xhci_hcor *hcor;
+	int ret;
+
+	ctx->hcd = (struct xhci_hccr *)plat->hcd_base;
+	ctx->dwc3_reg = (struct dwc3 *)((char *)(ctx->hcd) + DWC3_REG_OFFSET);
+
+	ret = zynqmp_xhci_core_init(ctx);
+	if (ret) {
+		puts("XHCI: failed to initialize controller\n");
+		return -EINVAL;
+	}
+
+	hcor = (struct xhci_hcor *)((ulong)ctx->hcd +
+				  HC_LENGTH(xhci_readl(&ctx->hcd->cr_capbase)));
+
+	return xhci_register(dev, ctx->hcd, hcor);
+}
+
+static int xhci_usb_remove(struct udevice *dev)
+{
+	return xhci_deregister(dev);
+}
+
+static int xhci_usb_ofdata_to_platdata(struct udevice *dev)
+{
+	struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
+	const void *blob = gd->fdt_blob;
+
+	/* Get the base address for XHCI controller from the device node */
+	plat->hcd_base = fdtdec_get_addr(blob, dev_of_offset(dev), "reg");
+	if (plat->hcd_base == FDT_ADDR_T_NONE) {
+		debug("Can't get the XHCI register base address\n");
+		return -ENXIO;
+	}
+
+	return 0;
+}
+
+U_BOOT_DRIVER(dwc3_generic_host) = {
+	.name = "dwc3-generic-host",
+	.id = UCLASS_USB,
+	.ofdata_to_platdata = xhci_usb_ofdata_to_platdata,
+	.probe = xhci_usb_probe,
+	.remove = xhci_usb_remove,
+	.ops = &xhci_usb_ops,
+	.platdata_auto_alloc_size = sizeof(struct zynqmp_xhci_platdata),
+	.priv_auto_alloc_size = sizeof(struct zynqmp_xhci),
+	.flags = DM_FLAG_ALLOC_PRIV_DMA,
+};
+#endif
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB
  2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
                   ` (3 preceding siblings ...)
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
  2018-05-18 11:25 ` [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Marek Vasut
  6 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
  To: u-boot

Remove harcoded XHCI lists and detect mode, speed based on DT.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Serial-changes: 2
- Remove also XHCI macros from hardware.h
- Remove additional new line in zcu106
---

Changes in v2: None

 arch/arm/include/asm/arch-zynqmp/hardware.h   |  3 --
 board/xilinx/zynqmp/zynqmp.c                  | 46 -------------------
 .../xilinx_zynqmp_zc1751_xm015_dc1_defconfig  |  1 +
 .../xilinx_zynqmp_zc1751_xm016_dc2_defconfig  |  1 +
 .../xilinx_zynqmp_zc1751_xm017_dc3_defconfig  |  1 +
 configs/xilinx_zynqmp_zcu100_revC_defconfig   |  1 +
 configs/xilinx_zynqmp_zcu102_rev1_0_defconfig |  1 +
 configs/xilinx_zynqmp_zcu102_revA_defconfig   |  1 +
 configs/xilinx_zynqmp_zcu102_revB_defconfig   |  1 +
 configs/xilinx_zynqmp_zcu104_revA_defconfig   |  1 +
 configs/xilinx_zynqmp_zcu104_revC_defconfig   |  1 +
 configs/xilinx_zynqmp_zcu106_revA_defconfig   |  1 +
 configs/xilinx_zynqmp_zcu111_revA_defconfig   |  1 +
 .../configs/xilinx_zynqmp_zc1751_xm015_dc1.h  |  1 -
 .../configs/xilinx_zynqmp_zc1751_xm016_dc2.h  |  2 -
 .../configs/xilinx_zynqmp_zc1751_xm017_dc3.h  |  3 --
 include/configs/xilinx_zynqmp_zcu100.h        |  3 --
 include/configs/xilinx_zynqmp_zcu102.h        |  2 -
 include/configs/xilinx_zynqmp_zcu104.h        |  2 -
 include/configs/xilinx_zynqmp_zcu106.h        |  2 -
 include/configs/xilinx_zynqmp_zcu111.h        |  2 -
 21 files changed, 11 insertions(+), 66 deletions(-)

diff --git a/arch/arm/include/asm/arch-zynqmp/hardware.h b/arch/arm/include/asm/arch-zynqmp/hardware.h
index dfd6097b4beb..acc68251be94 100644
--- a/arch/arm/include/asm/arch-zynqmp/hardware.h
+++ b/arch/arm/include/asm/arch-zynqmp/hardware.h
@@ -17,9 +17,6 @@
 
 #define ARASAN_NAND_BASEADDR	0xFF100000
 
-#define ZYNQMP_USB0_XHCI_BASEADDR	0xFE200000
-#define ZYNQMP_USB1_XHCI_BASEADDR	0xFE300000
-
 #define ZYNQMP_TCM_BASE_ADDR	0xFFE00000
 #define ZYNQMP_TCM_SIZE		0x40000
 
diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
index 57c0d93aa1bc..e41fec32df31 100644
--- a/board/xilinx/zynqmp/zynqmp.c
+++ b/board/xilinx/zynqmp/zynqmp.c
@@ -548,49 +548,3 @@ int checkboard(void)
 	puts("Board: Xilinx ZynqMP\n");
 	return 0;
 }
-
-#ifdef CONFIG_USB_DWC3
-static struct dwc3_device dwc3_device_data0 = {
-	.maximum_speed = USB_SPEED_HIGH,
-	.base = ZYNQMP_USB0_XHCI_BASEADDR,
-	.dr_mode = USB_DR_MODE_PERIPHERAL,
-	.index = 0,
-};
-
-static struct dwc3_device dwc3_device_data1 = {
-	.maximum_speed = USB_SPEED_HIGH,
-	.base = ZYNQMP_USB1_XHCI_BASEADDR,
-	.dr_mode = USB_DR_MODE_PERIPHERAL,
-	.index = 1,
-};
-
-int usb_gadget_handle_interrupts(int index)
-{
-	dwc3_uboot_handle_interrupt(index);
-	return 0;
-}
-
-int board_usb_init(int index, enum usb_init_type init)
-{
-	debug("%s: index %x\n", __func__, index);
-
-#if defined(CONFIG_USB_GADGET_DOWNLOAD)
-	g_dnl_set_serialnumber(CONFIG_SYS_CONFIG_NAME);
-#endif
-
-	switch (index) {
-	case 0:
-		return dwc3_uboot_init(&dwc3_device_data0);
-	case 1:
-		return dwc3_uboot_init(&dwc3_device_data1);
-	};
-
-	return -1;
-}
-
-int board_usb_cleanup(int index, enum usb_init_type init)
-{
-	dwc3_uboot_exit(index);
-	return 0;
-}
-#endif
diff --git a/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig b/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
index 3aa39306520f..f5a33342fa64 100644
--- a/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
@@ -83,6 +83,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig b/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
index 1bd52ab79124..7f7ee558ee7e 100644
--- a/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
@@ -79,6 +79,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig b/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
index e1e7d22a3a62..2add3bafe278 100644
--- a/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
@@ -75,6 +75,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu100_revC_defconfig b/configs/xilinx_zynqmp_zcu100_revC_defconfig
index 3dd6ae9a0b3b..2a6a5a69cdfe 100644
--- a/configs/xilinx_zynqmp_zcu100_revC_defconfig
+++ b/configs/xilinx_zynqmp_zcu100_revC_defconfig
@@ -73,6 +73,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig b/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
index 0ddec9986697..4cb3959f3626 100644
--- a/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
@@ -93,6 +93,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu102_revA_defconfig b/configs/xilinx_zynqmp_zcu102_revA_defconfig
index 94dc62a61643..e989d1635c30 100644
--- a/configs/xilinx_zynqmp_zcu102_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_revA_defconfig
@@ -91,6 +91,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu102_revB_defconfig b/configs/xilinx_zynqmp_zcu102_revB_defconfig
index 8889f1909ac0..bd67df904a2d 100644
--- a/configs/xilinx_zynqmp_zcu102_revB_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_revB_defconfig
@@ -91,6 +91,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu104_revA_defconfig b/configs/xilinx_zynqmp_zcu104_revA_defconfig
index 3d3d941d375c..a76b9cf54622 100644
--- a/configs/xilinx_zynqmp_zcu104_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu104_revA_defconfig
@@ -84,6 +84,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu104_revC_defconfig b/configs/xilinx_zynqmp_zcu104_revC_defconfig
index 7c22d7f020ed..dcd4897f2fbd 100644
--- a/configs/xilinx_zynqmp_zcu104_revC_defconfig
+++ b/configs/xilinx_zynqmp_zcu104_revC_defconfig
@@ -84,6 +84,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu106_revA_defconfig b/configs/xilinx_zynqmp_zcu106_revA_defconfig
index 017940e98361..a5fa33e366ae 100644
--- a/configs/xilinx_zynqmp_zcu106_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu106_revA_defconfig
@@ -90,6 +90,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu111_revA_defconfig b/configs/xilinx_zynqmp_zcu111_revA_defconfig
index 028a7b532844..4d9b91563523 100644
--- a/configs/xilinx_zynqmp_zcu111_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu111_revA_defconfig
@@ -84,6 +84,7 @@ CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_ZYNQMP=y
 CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
 CONFIG_USB_STORAGE=y
diff --git a/include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h b/include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h
index 852c2238de4a..f0ab3f159222 100644
--- a/include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h
+++ b/include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h
@@ -11,7 +11,6 @@
 
 #define CONFIG_ZYNQ_SDHCI0
 #define CONFIG_ZYNQ_SDHCI1
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
 
 #include <configs/xilinx_zynqmp.h>
 
diff --git a/include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h b/include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h
index 2533ab860906..bfebbb3cd197 100644
--- a/include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h
+++ b/include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h
@@ -9,8 +9,6 @@
 #ifndef __CONFIG_ZYNQMP_ZC1751_XM016_DC2_H
 #define __CONFIG_ZYNQMP_ZC1751_XM016_DC2_H
 
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB1_XHCI_BASEADDR}
-
 #include <configs/xilinx_zynqmp.h>
 
 #endif /* __CONFIG_ZYNQMP_ZC1751_XM016_DC2_H */
diff --git a/include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h b/include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h
index f7d4ab2800c9..bd4a0c3178b8 100644
--- a/include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h
+++ b/include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h
@@ -11,9 +11,6 @@
 
 #define CONFIG_ZYNQ_SDHCI1
 
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR, \
-				 ZYNQMP_USB1_XHCI_BASEADDR}
-
 #include <configs/xilinx_zynqmp.h>
 
 #endif /* __CONFIG_ZYNQMP_ZC1751_XM017_DC3_H */
diff --git a/include/configs/xilinx_zynqmp_zcu100.h b/include/configs/xilinx_zynqmp_zcu100.h
index 029347da479c..b65d0c1cddd2 100644
--- a/include/configs/xilinx_zynqmp_zcu100.h
+++ b/include/configs/xilinx_zynqmp_zcu100.h
@@ -24,9 +24,6 @@
 				{0, {{I2C_MUX_PCA9548, 0x75, 7} } }, \
 				}
 
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR, \
-				 ZYNQMP_USB1_XHCI_BASEADDR}
-
 #define CONFIG_USB_HOST_ETHER
 #define CONFIG_USB_ETHER_ASIX
 
diff --git a/include/configs/xilinx_zynqmp_zcu102.h b/include/configs/xilinx_zynqmp_zcu102.h
index c61e1b5e27c2..ca11b97c7c4c 100644
--- a/include/configs/xilinx_zynqmp_zcu102.h
+++ b/include/configs/xilinx_zynqmp_zcu102.h
@@ -35,8 +35,6 @@
 
 #define CONFIG_PCA953X
 
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
-
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
 #define CONFIG_ZYNQ_EEPROM_BUS		5
 #define CONFIG_ZYNQ_GEM_EEPROM_ADDR	0x54
diff --git a/include/configs/xilinx_zynqmp_zcu104.h b/include/configs/xilinx_zynqmp_zcu104.h
index 8d417f45e014..7e3b9ad7058b 100644
--- a/include/configs/xilinx_zynqmp_zcu104.h
+++ b/include/configs/xilinx_zynqmp_zcu104.h
@@ -26,8 +26,6 @@
 
 #define CONFIG_PCA953X
 
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
-
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
 
 #include <configs/xilinx_zynqmp.h>
diff --git a/include/configs/xilinx_zynqmp_zcu106.h b/include/configs/xilinx_zynqmp_zcu106.h
index 01ac12a53c17..cc2d145ddd94 100644
--- a/include/configs/xilinx_zynqmp_zcu106.h
+++ b/include/configs/xilinx_zynqmp_zcu106.h
@@ -35,8 +35,6 @@
 
 #define CONFIG_PCA953X
 
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
-
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
 #define CONFIG_ZYNQ_EEPROM_BUS		5
 #define CONFIG_ZYNQ_GEM_EEPROM_ADDR	0x54
diff --git a/include/configs/xilinx_zynqmp_zcu111.h b/include/configs/xilinx_zynqmp_zcu111.h
index 3233b379798d..8f8cb4f08707 100644
--- a/include/configs/xilinx_zynqmp_zcu111.h
+++ b/include/configs/xilinx_zynqmp_zcu111.h
@@ -38,8 +38,6 @@
 
 #define CONFIG_PCA953X
 
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
-
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
 #define CONFIG_ZYNQ_EEPROM_BUS		5
 #define CONFIG_ZYNQ_GEM_EEPROM_ADDR	0x54
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 6/6] usb: xhci: zynqmp: Remove support for !DM_USB
  2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
                   ` (4 preceding siblings ...)
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
  2018-05-18 11:25 ` [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Marek Vasut
  6 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
  To: u-boot

Switch to DM_USB was done and there is no need to keep !DM_USB code in
tree.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---

Changes in v2: None

 drivers/usb/host/Kconfig       |  1 +
 drivers/usb/host/xhci-zynqmp.c | 46 ----------------------------------
 scripts/config_whitelist.txt   |  1 -
 3 files changed, 1 insertion(+), 47 deletions(-)

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 3455e8113bb8..b4dd005651cf 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -75,6 +75,7 @@ config USB_XHCI_STI
 config USB_XHCI_ZYNQMP
 	bool "Support for Xilinx ZynqMP on-chip xHCI USB controller"
 	depends on ARCH_ZYNQMP
+	depends on DM_USB
 	help
 	  Enables support for the on-chip xHCI controller on Xilinx ZynqMP SoCs.
 
diff --git a/drivers/usb/host/xhci-zynqmp.c b/drivers/usb/host/xhci-zynqmp.c
index 526a42a9a58a..e44e1ae1d915 100644
--- a/drivers/usb/host/xhci-zynqmp.c
+++ b/drivers/usb/host/xhci-zynqmp.c
@@ -55,23 +55,15 @@
 #define USBOTGSS_IRQ_SET_1_DMADISABLECLR_EN	BIT(17)
 
 struct zynqmp_xhci {
-#ifdef CONFIG_DM_USB
 	struct usb_platdata usb_plat;
-#endif
 	struct xhci_ctrl ctrl;
 	struct xhci_hccr *hcd;
 	struct dwc3 *dwc3_reg;
 };
 
-#ifdef CONFIG_DM_USB
 struct zynqmp_xhci_platdata {
 	fdt_addr_t hcd_base;
 };
-#else
-static struct zynqmp_xhci zynqmp_xhci;
-
-unsigned long ctr_addr[] = CONFIG_ZYNQMP_XHCI_LIST;
-#endif
 
 static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
 {
@@ -89,42 +81,6 @@ static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
 	return ret;
 }
 
-#ifndef CONFIG_DM_USB
-int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
-{
-	struct zynqmp_xhci *ctx = &zynqmp_xhci;
-	int ret = 0;
-	uint32_t hclen;
-
-	if (index < 0 || index >= ARRAY_SIZE(ctr_addr))
-		return -EINVAL;
-
-	ctx->hcd = (struct xhci_hccr *)ctr_addr[index];
-	ctx->dwc3_reg = (struct dwc3 *)((void *)ctx->hcd + DWC3_REG_OFFSET);
-
-	ret = board_usb_init(index, USB_INIT_HOST);
-	if (ret != 0) {
-		puts("Failed to initialize board for USB\n");
-		return ret;
-	}
-
-	ret = zynqmp_xhci_core_init(ctx);
-	if (ret < 0) {
-		puts("Failed to initialize xhci\n");
-		return ret;
-	}
-
-	*hccr = (struct xhci_hccr *)ctx->hcd;
-	hclen = HC_LENGTH(xhci_readl(&(*hccr)->cr_capbase));
-	*hcor = (struct xhci_hcor *)((uintptr_t) *hccr + hclen);
-
-	debug("zynqmp-xhci: init hccr %p and hcor %p hc_length %d\n",
-	      *hccr, *hcor, hclen);
-
-	return ret;
-}
-#endif
-
 void xhci_hcd_stop(int index)
 {
 	/*
@@ -135,7 +91,6 @@ void xhci_hcd_stop(int index)
 	return;
 }
 
-#ifdef CONFIG_DM_USB
 static int xhci_usb_probe(struct udevice *dev)
 {
 	struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
@@ -189,4 +144,3 @@ U_BOOT_DRIVER(dwc3_generic_host) = {
 	.priv_auto_alloc_size = sizeof(struct zynqmp_xhci),
 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
 };
-#endif
diff --git a/scripts/config_whitelist.txt b/scripts/config_whitelist.txt
index 71df6dbebde6..bfbdfcfc80ac 100644
--- a/scripts/config_whitelist.txt
+++ b/scripts/config_whitelist.txt
@@ -4782,7 +4782,6 @@ CONFIG_ZLIB
 CONFIG_ZLT
 CONFIG_ZM7300
 CONFIG_ZYNQMP_EEPROM
-CONFIG_ZYNQMP_XHCI_LIST
 CONFIG_ZYNQ_EEPROM
 CONFIG_ZYNQ_EEPROM_BUS
 CONFIG_ZYNQ_GEM_EEPROM_ADDR
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver
  2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
                   ` (5 preceding siblings ...)
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
@ 2018-05-18 11:25 ` Marek Vasut
  6 siblings, 0 replies; 12+ messages in thread
From: Marek Vasut @ 2018-05-18 11:25 UTC (permalink / raw)
  To: u-boot

On 05/18/2018 01:15 PM, Michal Simek wrote:
> Hi,
> 
> this patchset is based on unfinished series send to ML 06/13/2017
> by Vignesh
> "[U-Boot] [PATCH v2 00/13] driver model bring-up of dwc3 usb peripheral"
> We have taken some part of this to Xilinx tree and use it for a while
> but it is time to review it and upstream it.
> 
> The patchset has 2 patches created by Mugunthan which are a little bit
> fixed.
> dwc3-generic driver was inspired by omap version.
> And the last 3 patches just doing conversion and enable DM_USB for our
> platform.

Applied, although 4/6 had some git am problems with headers.

-- 
Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
@ 2018-05-18 13:21   ` Jean-Jacques Hiblot
  0 siblings, 0 replies; 12+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-18 13:21 UTC (permalink / raw)
  To: u-boot

Hi Michal,

I've been trying your series on DRA7 platforms. Thanks for the work.

I have a few comments though.


On 18/05/2018 13:15, Michal Simek wrote:
> From: Mugunthan V N <mugunthanvnm@ti.com>
>
> The patch is preparing dwc3 core for enabling DM_USB with peripheral
> driver with using driver model support.
> 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>
> (Remove dwc3-omap changes)
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
>
> Changes in v2:
> - Retype dwc->dev in gadget.c to avoid compilation warning
> - Guard udevice with __UBOOT__
> - Move ifdef in core.c to avoid compilation issues for some platforms
>    (for example edison)
>
> Origin series here: https://patchwork.ozlabs.org/patch/775108/
>
> - Fix labels as was asked in previous review.
>
> ---
>   drivers/usb/dwc3/core.c   | 55 +++++++++++++++++++++++++++++++++++++++
>   drivers/usb/dwc3/core.h   |  6 +++++
>   drivers/usb/dwc3/gadget.c |  2 +-
>   3 files changed, 62 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index dbdad22d1134..1ab5cee60969 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -788,3 +788,58 @@ MODULE_ALIAS("platform:dwc3");
>   MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
>   MODULE_LICENSE("GPL v2");
>   MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
> +
> +#ifdef CONFIG_DM_USB
What about having a separate config for device ? like CONFIG_DM_USB_DEV.
This would allow patforms to keep using non-DM USB device and DM USB hosts
> +
> +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 core_fail;
> +	}
> +
> +	ret = dwc3_event_buffers_setup(dwc);
> +	if (ret) {
> +		dev_err(dwc->dev, "failed to setup event buffers\n");
> +		goto event_fail;
> +	}
> +
> +	ret = dwc3_core_init_mode(dwc);
> +	if (ret)
> +		goto mode_fail;
> +
> +	return 0;
> +
> +mode_fail:
> +	dwc3_event_buffers_cleanup(dwc);
> +
> +event_fail:
> +	dwc3_core_exit(dwc);
> +
> +core_fail:
> +	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 cbe9850a0bda..58fe91dc5131 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -712,7 +712,11 @@ struct dwc3 {
>   	/* device lock */
>   	spinlock_t		lock;
>   
> +#if defined(__UBOOT__) && defined(CONFIG_DM_USB)
> +	struct udevice		*dev;
> +#else
>   	struct device		*dev;
> +#endif
>   
>   	struct platform_device	*xhci;
>   	struct resource		xhci_resources[DWC3_XHCI_RESOURCES_NUM];
> @@ -987,6 +991,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/gadget.c b/drivers/usb/dwc3/gadget.c
> index d45fae044c4a..e340cb268fcd 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -2609,7 +2609,7 @@ int dwc3_gadget_init(struct dwc3 *dwc)
>   	if (ret)
>   		goto err4;
>   
> -	ret = usb_add_gadget_udc(dwc->dev, &dwc->gadget);
> +	ret = usb_add_gadget_udc((struct device *)dwc->dev, &dwc->gadget);
>   	if (ret) {
>   		dev_err(dwc->dev, "failed to register udc\n");
>   		goto err4;

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver
  2018-05-18 11:15 ` [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
@ 2018-05-18 13:24   ` Jean-Jacques Hiblot
  2018-05-18 13:26     ` Jean-Jacques Hiblot
  0 siblings, 1 reply; 12+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-18 13:24 UTC (permalink / raw)
  To: u-boot



On 18/05/2018 13:15, Michal Simek wrote:
> By enabling BLK by default this is the next driver which needs to get
> support for DM_USB. Adding generic DWC3 glue logic which only
> parse nodes and read device mode. Based on it probe proper
> host/peripheral DWC3 drivers for it.
>
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
>
> Changes in v2:
> - Change style to avoid correct but not nice indentation by using char
>    *driver variable (suggested by Marek)
>
>   drivers/usb/dwc3/Kconfig        |   6 ++
>   drivers/usb/dwc3/Makefile       |   1 +
>   drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++++++++++++++++
>   3 files changed, 164 insertions(+)
>   create mode 100644 drivers/usb/dwc3/dwc3-generic.c
>
> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
> index ae7fc1c6304d..943b7630eba4 100644
> --- a/drivers/usb/dwc3/Kconfig
> +++ b/drivers/usb/dwc3/Kconfig
> @@ -37,6 +37,12 @@ config USB_DWC3_OMAP
>   
>   	  Say 'Y' here if you have one such device
>   
> +config USB_DWC3_GENERIC
> +	bool "Xilinx ZynqMP and similar Platforms"
> +	depends on DM_USB && USB_DWC3
> +	help
> +	  Some platforms can reuse this DWC3 generic implementation.
> +
>   config USB_DWC3_UNIPHIER
>   	bool "DesignWare USB3 Host Support on UniPhier Platforms"
>   	depends on ARCH_UNIPHIER && USB_XHCI_DWC3
> diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
> index cd18b8d9ec02..60b5515a67da 100644
> --- a/drivers/usb/dwc3/Makefile
> +++ b/drivers/usb/dwc3/Makefile
> @@ -7,6 +7,7 @@ dwc3-y					:= core.o
>   obj-$(CONFIG_USB_DWC3_GADGET)		+= gadget.o ep0.o
>   
>   obj-$(CONFIG_USB_DWC3_OMAP)		+= dwc3-omap.o
> +obj-$(CONFIG_USB_DWC3_GENERIC)		+= dwc3-generic.o
>   obj-$(CONFIG_USB_DWC3_UNIPHIER)		+= dwc3-uniphier.o
>   obj-$(CONFIG_USB_DWC3_PHY_OMAP)		+= ti_usb_phy.o
>   obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG)	+= samsung_usb_phy.o
> diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
> new file mode 100644
> index 000000000000..ca63eac3d98e
> --- /dev/null
> +++ b/drivers/usb/dwc3/dwc3-generic.c
> @@ -0,0 +1,157 @@
> +// SPDX-License-Identifier:     GPL-2.0
> +/*
> + * Generic DWC3 Glue layer
> + *
> + * Copyright (C) 2016 - 2018 Xilinx, Inc.
> + *
> + * Based on dwc3-omap.c.
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <dm/device-internal.h>
> +#include <dm/lists.h>
> +#include <linux/usb/otg.h>
> +#include <linux/compat.h>
> +#include <linux/usb/ch9.h>
> +#include <linux/usb/gadget.h>
> +#include <malloc.h>
> +#include <usb.h>
> +#include "core.h"
> +#include "gadget.h"
> +#include "linux-compat.h"
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int usb_gadget_handle_interrupts(int index)
> +{
> +	struct dwc3 *priv;
> +	struct udevice *dev;
> +	int ret;
> +
> +	ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
> +	if (!dev || ret) {
> +		pr_err("No USB device found\n");
> +		return -ENODEV;
> +	}
> +
> +	priv = dev_get_priv(dev);
> +
> +	dwc3_gadget_uboot_handle_interrupt(priv);
> +
> +	return 0;
> +}
> +
> +static int dwc3_generic_peripheral_probe(struct udevice *dev)
> +{
> +	struct dwc3 *priv = dev_get_priv(dev);
> +
> +	return dwc3_init(priv);
> +}
> +
> +static int dwc3_generic_peripheral_remove(struct udevice *dev)
> +{
> +	struct dwc3 *priv = dev_get_priv(dev);
> +
> +	dwc3_remove(priv);
> +
> +	return 0;
> +}
> +
> +static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
> +{
> +	struct dwc3 *priv = dev_get_priv(dev);
> +	int node = dev_of_offset(dev);
> +
> +	priv->regs = (void *)devfdt_get_addr(dev);
> +	priv->regs += DWC3_GLOBALS_REGS_START;
> +
> +	priv->maximum_speed = usb_get_maximum_speed(node);
> +	if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
> +		pr_err("Invalid usb maximum speed\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->dr_mode = usb_get_dr_mode(node);
> +	if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
> +		pr_err("Invalid usb mode setup\n");
> +		return -ENODEV;
> +	}
> +
> +	return 0;
> +}
> +
> +static int dwc3_generic_peripheral_bind(struct udevice *dev)
> +{
> +	return device_probe(dev);
This is wrong place to probe the device.
What must be done is to probe the device when it is first used.
I have a patch in progress for this. When it's cleaned up I'll share a 
repo so that you can have look and maybe pick it up.
> +}
> +
> +U_BOOT_DRIVER(dwc3_generic_peripheral) = {
> +	.name	= "dwc3-generic-peripheral",
> +	.id	= UCLASS_USB_DEV_GENERIC,
> +	.ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
> +	.probe = dwc3_generic_peripheral_probe,
> +	.remove = dwc3_generic_peripheral_remove,
> +	.bind = dwc3_generic_peripheral_bind,
> +	.platdata_auto_alloc_size = sizeof(struct usb_platdata),
> +	.priv_auto_alloc_size = sizeof(struct dwc3),
> +	.flags	= DM_FLAG_ALLOC_PRIV_DMA,
> +};
> +
> +static int dwc3_generic_bind(struct udevice *parent)
> +{
> +	const void *fdt = gd->fdt_blob;
> +	int node;
> +	int ret;
> +
> +	for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0;
> +	     node = fdt_next_subnode(fdt, node)) {
> +		const char *name = fdt_get_name(fdt, node, NULL);
> +		enum usb_dr_mode dr_mode;
> +		struct udevice *dev;
> +		const char *driver;
> +
> +		debug("%s: subnode name: %s\n", __func__, name);
> +		if (strncmp(name, "dwc3@", 4))
> +			continue;
> +
> +		dr_mode = usb_get_dr_mode(node);
> +
> +		switch (dr_mode) {
> +		case USB_DR_MODE_PERIPHERAL:
> +		case USB_DR_MODE_OTG:
> +			debug("%s: dr_mode: OTG or Peripheral\n", __func__);
> +			driver = "dwc3-generic-peripheral";
> +			break;
> +		case USB_DR_MODE_HOST:
> +			debug("%s: dr_mode: HOST\n", __func__);
> +			driver = "dwc3-generic-host";
> +			break;
> +		default:
> +			debug("%s: unsupported dr_mode\n", __func__);
> +			return -ENODEV;
> +		};
> +
> +		ret = device_bind_driver_to_node(parent, driver, name,
> +						 offset_to_ofnode(node), &dev);
> +		if (ret) {
> +			debug("%s: not able to bind usb device mode\n",
> +			      __func__);
> +			return ret;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct udevice_id dwc3_generic_ids[] = {
> +	{ .compatible = "xlnx,zynqmp-dwc3" },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(dwc3_generic_wrapper) = {
> +	.name	= "dwc3-generic-wrapper",
> +	.id	= UCLASS_MISC,
> +	.of_match = dwc3_generic_ids,
> +	.bind = dwc3_generic_bind,
> +};

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver
  2018-05-18 13:24   ` Jean-Jacques Hiblot
@ 2018-05-18 13:26     ` Jean-Jacques Hiblot
  2018-05-21  6:45       ` Michal Simek
  0 siblings, 1 reply; 12+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-18 13:26 UTC (permalink / raw)
  To: u-boot



On 18/05/2018 15:24, Jean-Jacques Hiblot wrote:
>
>
> On 18/05/2018 13:15, Michal Simek wrote:
>> By enabling BLK by default this is the next driver which needs to get
>> support for DM_USB. Adding generic DWC3 glue logic which only
>> parse nodes and read device mode. Based on it probe proper
>> host/peripheral DWC3 drivers for it.
>>
>> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
>> ---
>>
>> Changes in v2:
>> - Change style to avoid correct but not nice indentation by using char
>>    *driver variable (suggested by Marek)
>>
>>   drivers/usb/dwc3/Kconfig        |   6 ++
>>   drivers/usb/dwc3/Makefile       |   1 +
>>   drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++++++++++++++++
>>   3 files changed, 164 insertions(+)
>>   create mode 100644 drivers/usb/dwc3/dwc3-generic.c
>>
>> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
>> index ae7fc1c6304d..943b7630eba4 100644
>> --- a/drivers/usb/dwc3/Kconfig
>> +++ b/drivers/usb/dwc3/Kconfig
>> @@ -37,6 +37,12 @@ config USB_DWC3_OMAP
>>           Say 'Y' here if you have one such device
>>   +config USB_DWC3_GENERIC
>> +    bool "Xilinx ZynqMP and similar Platforms"
>> +    depends on DM_USB && USB_DWC3
>> +    help
>> +      Some platforms can reuse this DWC3 generic implementation.
>> +
>>   config USB_DWC3_UNIPHIER
>>       bool "DesignWare USB3 Host Support on UniPhier Platforms"
>>       depends on ARCH_UNIPHIER && USB_XHCI_DWC3
>> diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
>> index cd18b8d9ec02..60b5515a67da 100644
>> --- a/drivers/usb/dwc3/Makefile
>> +++ b/drivers/usb/dwc3/Makefile
>> @@ -7,6 +7,7 @@ dwc3-y                    := core.o
>>   obj-$(CONFIG_USB_DWC3_GADGET)        += gadget.o ep0.o
>>     obj-$(CONFIG_USB_DWC3_OMAP)        += dwc3-omap.o
>> +obj-$(CONFIG_USB_DWC3_GENERIC)        += dwc3-generic.o
>>   obj-$(CONFIG_USB_DWC3_UNIPHIER)        += dwc3-uniphier.o
>>   obj-$(CONFIG_USB_DWC3_PHY_OMAP)        += ti_usb_phy.o
>>   obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG)    += samsung_usb_phy.o
>> diff --git a/drivers/usb/dwc3/dwc3-generic.c 
>> b/drivers/usb/dwc3/dwc3-generic.c
>> new file mode 100644
>> index 000000000000..ca63eac3d98e
>> --- /dev/null
>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>> @@ -0,0 +1,157 @@
>> +// SPDX-License-Identifier:     GPL-2.0
>> +/*
>> + * Generic DWC3 Glue layer
>> + *
>> + * Copyright (C) 2016 - 2018 Xilinx, Inc.
>> + *
>> + * Based on dwc3-omap.c.
>> + */
>> +
>> +#include <common.h>
>> +#include <dm.h>
>> +#include <dm/device-internal.h>
>> +#include <dm/lists.h>
>> +#include <linux/usb/otg.h>
>> +#include <linux/compat.h>
>> +#include <linux/usb/ch9.h>
>> +#include <linux/usb/gadget.h>
>> +#include <malloc.h>
>> +#include <usb.h>
>> +#include "core.h"
>> +#include "gadget.h"
>> +#include "linux-compat.h"
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +int usb_gadget_handle_interrupts(int index)
>> +{
>> +    struct dwc3 *priv;
>> +    struct udevice *dev;
>> +    int ret;
>> +
>> +    ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
>> +    if (!dev || ret) {
>> +        pr_err("No USB device found\n");
>> +        return -ENODEV;
>> +    }
>> +
>> +    priv = dev_get_priv(dev);
>> +
>> +    dwc3_gadget_uboot_handle_interrupt(priv);
>> +
>> +    return 0;
>> +}
>> +
>> +static int dwc3_generic_peripheral_probe(struct udevice *dev)
>> +{
>> +    struct dwc3 *priv = dev_get_priv(dev);
>> +
>> +    return dwc3_init(priv);
>> +}
>> +
>> +static int dwc3_generic_peripheral_remove(struct udevice *dev)
>> +{
>> +    struct dwc3 *priv = dev_get_priv(dev);
>> +
>> +    dwc3_remove(priv);
>> +
>> +    return 0;
>> +}
>> +
>> +static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice 
>> *dev)
>> +{
>> +    struct dwc3 *priv = dev_get_priv(dev);
>> +    int node = dev_of_offset(dev);
>> +
>> +    priv->regs = (void *)devfdt_get_addr(dev);
>> +    priv->regs += DWC3_GLOBALS_REGS_START;
>> +
>> +    priv->maximum_speed = usb_get_maximum_speed(node);
>> +    if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
>> +        pr_err("Invalid usb maximum speed\n");
>> +        return -ENODEV;
>> +    }
>> +
>> +    priv->dr_mode = usb_get_dr_mode(node);
>> +    if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
>> +        pr_err("Invalid usb mode setup\n");
>> +        return -ENODEV;
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>> +static int dwc3_generic_peripheral_bind(struct udevice *dev)
>> +{
>> +    return device_probe(dev);
> This is wrong place to probe the device.
> What must be done is to probe the device when it is first used.
> I have a patch in progress for this. When it's cleaned up I'll share a 
> repo so that you can have look and maybe pick it up.
Well the series is already applied. I'll send the patch to ML in this case.
>> +}
>> +
>> +U_BOOT_DRIVER(dwc3_generic_peripheral) = {
>> +    .name    = "dwc3-generic-peripheral",
>> +    .id    = UCLASS_USB_DEV_GENERIC,
>> +    .ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
>> +    .probe = dwc3_generic_peripheral_probe,
>> +    .remove = dwc3_generic_peripheral_remove,
>> +    .bind = dwc3_generic_peripheral_bind,
>> +    .platdata_auto_alloc_size = sizeof(struct usb_platdata),
>> +    .priv_auto_alloc_size = sizeof(struct dwc3),
>> +    .flags    = DM_FLAG_ALLOC_PRIV_DMA,
>> +};
>> +
>> +static int dwc3_generic_bind(struct udevice *parent)
>> +{
>> +    const void *fdt = gd->fdt_blob;
>> +    int node;
>> +    int ret;
>> +
>> +    for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node 
>> > 0;
>> +         node = fdt_next_subnode(fdt, node)) {
>> +        const char *name = fdt_get_name(fdt, node, NULL);
>> +        enum usb_dr_mode dr_mode;
>> +        struct udevice *dev;
>> +        const char *driver;
>> +
>> +        debug("%s: subnode name: %s\n", __func__, name);
>> +        if (strncmp(name, "dwc3@", 4))
>> +            continue;
>> +
>> +        dr_mode = usb_get_dr_mode(node);
>> +
>> +        switch (dr_mode) {
>> +        case USB_DR_MODE_PERIPHERAL:
>> +        case USB_DR_MODE_OTG:
>> +            debug("%s: dr_mode: OTG or Peripheral\n", __func__);
>> +            driver = "dwc3-generic-peripheral";
>> +            break;
>> +        case USB_DR_MODE_HOST:
>> +            debug("%s: dr_mode: HOST\n", __func__);
>> +            driver = "dwc3-generic-host";
>> +            break;
>> +        default:
>> +            debug("%s: unsupported dr_mode\n", __func__);
>> +            return -ENODEV;
>> +        };
>> +
>> +        ret = device_bind_driver_to_node(parent, driver, name,
>> +                         offset_to_ofnode(node), &dev);
>> +        if (ret) {
>> +            debug("%s: not able to bind usb device mode\n",
>> +                  __func__);
>> +            return ret;
>> +        }
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>> +static const struct udevice_id dwc3_generic_ids[] = {
>> +    { .compatible = "xlnx,zynqmp-dwc3" },
>> +    { }
>> +};
>> +
>> +U_BOOT_DRIVER(dwc3_generic_wrapper) = {
>> +    .name    = "dwc3-generic-wrapper",
>> +    .id    = UCLASS_MISC,
>> +    .of_match = dwc3_generic_ids,
>> +    .bind = dwc3_generic_bind,
>> +};
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver
  2018-05-18 13:26     ` Jean-Jacques Hiblot
@ 2018-05-21  6:45       ` Michal Simek
  0 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-21  6:45 UTC (permalink / raw)
  To: u-boot

On 18.5.2018 15:26, Jean-Jacques Hiblot wrote:
> 
> 
> On 18/05/2018 15:24, Jean-Jacques Hiblot wrote:
>>
>>
>> On 18/05/2018 13:15, Michal Simek wrote:
>>> By enabling BLK by default this is the next driver which needs to get
>>> support for DM_USB. Adding generic DWC3 glue logic which only
>>> parse nodes and read device mode. Based on it probe proper
>>> host/peripheral DWC3 drivers for it.
>>>
>>> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
>>> ---
>>>
>>> Changes in v2:
>>> - Change style to avoid correct but not nice indentation by using char
>>>    *driver variable (suggested by Marek)
>>>
>>>   drivers/usb/dwc3/Kconfig        |   6 ++
>>>   drivers/usb/dwc3/Makefile       |   1 +
>>>   drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++++++++++++++++
>>>   3 files changed, 164 insertions(+)
>>>   create mode 100644 drivers/usb/dwc3/dwc3-generic.c
>>>
>>> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
>>> index ae7fc1c6304d..943b7630eba4 100644
>>> --- a/drivers/usb/dwc3/Kconfig
>>> +++ b/drivers/usb/dwc3/Kconfig
>>> @@ -37,6 +37,12 @@ config USB_DWC3_OMAP
>>>           Say 'Y' here if you have one such device
>>>   +config USB_DWC3_GENERIC
>>> +    bool "Xilinx ZynqMP and similar Platforms"
>>> +    depends on DM_USB && USB_DWC3
>>> +    help
>>> +      Some platforms can reuse this DWC3 generic implementation.
>>> +
>>>   config USB_DWC3_UNIPHIER
>>>       bool "DesignWare USB3 Host Support on UniPhier Platforms"
>>>       depends on ARCH_UNIPHIER && USB_XHCI_DWC3
>>> diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
>>> index cd18b8d9ec02..60b5515a67da 100644
>>> --- a/drivers/usb/dwc3/Makefile
>>> +++ b/drivers/usb/dwc3/Makefile
>>> @@ -7,6 +7,7 @@ dwc3-y                    := core.o
>>>   obj-$(CONFIG_USB_DWC3_GADGET)        += gadget.o ep0.o
>>>     obj-$(CONFIG_USB_DWC3_OMAP)        += dwc3-omap.o
>>> +obj-$(CONFIG_USB_DWC3_GENERIC)        += dwc3-generic.o
>>>   obj-$(CONFIG_USB_DWC3_UNIPHIER)        += dwc3-uniphier.o
>>>   obj-$(CONFIG_USB_DWC3_PHY_OMAP)        += ti_usb_phy.o
>>>   obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG)    += samsung_usb_phy.o
>>> diff --git a/drivers/usb/dwc3/dwc3-generic.c
>>> b/drivers/usb/dwc3/dwc3-generic.c
>>> new file mode 100644
>>> index 000000000000..ca63eac3d98e
>>> --- /dev/null
>>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>>> @@ -0,0 +1,157 @@
>>> +// SPDX-License-Identifier:     GPL-2.0
>>> +/*
>>> + * Generic DWC3 Glue layer
>>> + *
>>> + * Copyright (C) 2016 - 2018 Xilinx, Inc.
>>> + *
>>> + * Based on dwc3-omap.c.
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <dm.h>
>>> +#include <dm/device-internal.h>
>>> +#include <dm/lists.h>
>>> +#include <linux/usb/otg.h>
>>> +#include <linux/compat.h>
>>> +#include <linux/usb/ch9.h>
>>> +#include <linux/usb/gadget.h>
>>> +#include <malloc.h>
>>> +#include <usb.h>
>>> +#include "core.h"
>>> +#include "gadget.h"
>>> +#include "linux-compat.h"
>>> +
>>> +DECLARE_GLOBAL_DATA_PTR;
>>> +
>>> +int usb_gadget_handle_interrupts(int index)
>>> +{
>>> +    struct dwc3 *priv;
>>> +    struct udevice *dev;
>>> +    int ret;
>>> +
>>> +    ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
>>> +    if (!dev || ret) {
>>> +        pr_err("No USB device found\n");
>>> +        return -ENODEV;
>>> +    }
>>> +
>>> +    priv = dev_get_priv(dev);
>>> +
>>> +    dwc3_gadget_uboot_handle_interrupt(priv);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> +static int dwc3_generic_peripheral_probe(struct udevice *dev)
>>> +{
>>> +    struct dwc3 *priv = dev_get_priv(dev);
>>> +
>>> +    return dwc3_init(priv);
>>> +}
>>> +
>>> +static int dwc3_generic_peripheral_remove(struct udevice *dev)
>>> +{
>>> +    struct dwc3 *priv = dev_get_priv(dev);
>>> +
>>> +    dwc3_remove(priv);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> +static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice
>>> *dev)
>>> +{
>>> +    struct dwc3 *priv = dev_get_priv(dev);
>>> +    int node = dev_of_offset(dev);
>>> +
>>> +    priv->regs = (void *)devfdt_get_addr(dev);
>>> +    priv->regs += DWC3_GLOBALS_REGS_START;
>>> +
>>> +    priv->maximum_speed = usb_get_maximum_speed(node);
>>> +    if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
>>> +        pr_err("Invalid usb maximum speed\n");
>>> +        return -ENODEV;
>>> +    }
>>> +
>>> +    priv->dr_mode = usb_get_dr_mode(node);
>>> +    if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
>>> +        pr_err("Invalid usb mode setup\n");
>>> +        return -ENODEV;
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> +static int dwc3_generic_peripheral_bind(struct udevice *dev)
>>> +{
>>> +    return device_probe(dev);
>> This is wrong place to probe the device.
>> What must be done is to probe the device when it is first used.
>> I have a patch in progress for this. When it's cleaned up I'll share a
>> repo so that you can have look and maybe pick it up.
> Well the series is already applied. I'll send the patch to ML in this case.

Yes. Please cc me if you want to test something.

Thanks,
Michal

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-05-21  6:45 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
2018-05-18 13:21   ` Jean-Jacques Hiblot
2018-05-18 11:15 ` [U-Boot] [PATCH v2 2/6] usb: common: add support to get maximum speed from dt Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
2018-05-18 13:24   ` Jean-Jacques Hiblot
2018-05-18 13:26     ` Jean-Jacques Hiblot
2018-05-21  6:45       ` Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
2018-05-18 11:25 ` [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Marek Vasut

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox