Skip to contentSkip to conversation

Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver

PATCH New Michal Simek 3 participants 12 messages May 18, 2018 – May 21, 2018

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

v2 cover Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver

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
Signature · 1 line
2.17.0
#1 lore raw

PATCH v2 1/6 usb: dwc3: Add dwc3_init/remove with DM_USB

From: Mugunthan V N <[email protected]>

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.

(Remove dwc3-omap changes)

---

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(-)
drivers/usb/dwc3/core.c +55 -0
index dbdad22d1134..1ab5cee60969 100644
@@ -788,3 +788,58 @@ MODULE_ALIAS("platform:dwc3");
 MODULE_AUTHOR("Felipe Balbi <[email protected]>");
 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
drivers/usb/dwc3/core.h +6 -0
index cbe9850a0bda..58fe91dc5131 100644
@@ -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);
drivers/usb/dwc3/gadget.c +1 -1
index d45fae044c4a..e340cb268fcd 100644
@@ -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;
Signature · 1 line
2.17.0
#2 lore raw

PATCH v2 1/6 usb: dwc3: Add dwc3_init/remove with DM_USB

Hi Michal,

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

I have a few comments though.

Quoted 33 lines · Michal Simek

From: Mugunthan V N <[email protected]>

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.

(Remove dwc3-omap changes)

---

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(-)
drivers/usb/dwc3/core.c +0 -0
index dbdad22d1134..1ab5cee60969 100644

drivers/usb/dwc3/core.c MODULE_ALIAS("platform:dwc3"); · line 792

Quoted 5 lines
drivers/usb/dwc3/core.c +2 -0
@@ -788,3 +788,58 @@ MODULE_ALIAS("platform:dwc3");
  MODULE_AUTHOR("Felipe Balbi <[email protected]>");
  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

Quoted 91 lines
drivers/usb/dwc3/core.c +53 -0
+
+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
drivers/usb/dwc3/core.h +6 -0
index cbe9850a0bda..58fe91dc5131 100644
@@ -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);
drivers/usb/dwc3/gadget.c +1 -1
index d45fae044c4a..e340cb268fcd 100644
@@ -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;
#3 lore raw

PATCH v2 2/6 usb: common: add support to get maximum speed from dt

In reply to Michal Simek

From: Mugunthan V N <[email protected]>

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

(rebase and fix errors)

---

Changes in v2: None

 drivers/usb/common/common.c | 29 +++++++++++++++++++++++++++++
 include/linux/usb/otg.h     |  9 +++++++++
 2 files changed, 38 insertions(+)
drivers/usb/common/common.c +29 -0
index 17a0ab23ff53..a55def5aba67 100644
@@ -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;
+}
include/linux/usb/otg.h +9 -0
index 0b273d8e2e8a..d2604c5cafba 100644
@@ -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 */
Signature · 1 line
2.17.0
#4 lore raw

PATCH v2 3/6 usb: dwc3: Add generic DWC3 glue logic driver

In reply to Michal Simek

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.

---

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
drivers/usb/dwc3/Kconfig +6 -0
index ae7fc1c6304d..943b7630eba4 100644
@@ -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
drivers/usb/dwc3/Makefile +1 -0
index cd18b8d9ec02..60b5515a67da 100644
@@ -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
drivers/usb/dwc3/dwc3-generic.c new file +157 -0

157 lines not on this page · raw message

Signature · 1 line
2.17.0
#5 lore raw

PATCH v2 3/6 usb: dwc3: Add generic DWC3 glue logic driver

Quoted 129 lines · Michal Simek

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.

---

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

drivers/usb/dwc3/Kconfig +6 -0
index ae7fc1c6304d..943b7630eba4 100644
@@ -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
drivers/usb/dwc3/Makefile +1 -0
index cd18b8d9ec02..60b5515a67da 100644
@@ -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
drivers/usb/dwc3/dwc3-generic.c new file +76 -0
new file mode 100644
index 000000000000..ca63eac3d98e
@@ -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) {

drivers/usb/dwc3/dwc3-generic.c line 86

Quoted 10 lines
drivers/usb/dwc3/dwc3-generic.c new file +10 -0
+		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.

Quoted 71 lines
drivers/usb/dwc3/dwc3-generic.c new file +71 -0
+}
+
+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,
+};
#6 lore raw

PATCH v2 3/6 usb: dwc3: Add generic DWC3 glue logic driver

Quoted 137 lines · Jean-Jacques Hiblot
Quoted 134 lines · Michal Simek

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.

---

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

drivers/usb/dwc3/Kconfig +0 -0
index ae7fc1c6304d..943b7630eba4 100644
@@ -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

drivers/usb/dwc3/Makefile +0 -0
index cd18b8d9ec02..60b5515a67da 100644
@@ -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

drivers/usb/dwc3/dwc3-generic.c new file +61 -0
new file mode 100644
index 000000000000..ca63eac3d98e
@@ -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)

drivers/usb/dwc3/dwc3-generic.c new file +21 -0
+{
+    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;
+}
Quoted 8 lines

drivers/usb/dwc3/dwc3-generic.c line 86

Quoted 4 lines
drivers/usb/dwc3/dwc3-generic.c new file +4 -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.

Quoted 77 lines
Quoted 62 lines
drivers/usb/dwc3/dwc3-generic.c new file +21 -0
+}
+
+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 
Quoted 1 line

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;

drivers/usb/dwc3/dwc3-generic.c new file +35 -0
+
+        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[] = {

drivers/usb/dwc3/dwc3-generic.c line 157

Quoted 10 lines
drivers/usb/dwc3/dwc3-generic.c new file +10 -0
+    { .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

#7 lore raw

PATCH v2 3/6 usb: dwc3: Add generic DWC3 glue logic driver

Quoted 148 lines · Jean-Jacques Hiblot
Quoted 137 lines · Jean-Jacques Hiblot
Quoted 134 lines · Michal Simek

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.

---

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

drivers/usb/dwc3/Kconfig +0 -0
index ae7fc1c6304d..943b7630eba4 100644
@@ -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

drivers/usb/dwc3/Makefile +0 -0
index cd18b8d9ec02..60b5515a67da 100644
@@ -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

drivers/usb/dwc3/dwc3-generic.c new file +61 -0
new file mode 100644
index 000000000000..ca63eac3d98e
@@ -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)

drivers/usb/dwc3/dwc3-generic.c new file +21 -0
+{
+    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;
+}
Quoted 8 lines

drivers/usb/dwc3/dwc3-generic.c line 86

Quoted 4 lines
drivers/usb/dwc3/dwc3-generic.c new file +4 -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.

Quoted 1 line

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

#8 lore raw

PATCH v2 4/6 usb: xhci: zynqmp: Add support for DM_USB

In reply to Michal Simek

The patch is adding support for DM_USB for xhci driver.

---

Changes in v2: None

 drivers/usb/host/xhci-zynqmp.c | 69 ++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)
drivers/usb/host/xhci-zynqmp.c +69 -0
index b1ade582aef6..526a42a9a58a 100644
@@ -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
Signature · 1 line
2.17.0
#9 lore raw

PATCH v2 5/6 arm64: zynqmp: Use DWC3 generic driver and DM_USB

In reply to Michal Simek

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

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(-)
arch/arm/include/asm/arch-zynqmp/hardware.h +0 -3
index dfd6097b4beb..acc68251be94 100644
@@ -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
 
board/xilinx/zynqmp/zynqmp.c +0 -46

49 lines not on this page · raw message

configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig +1 -0
index 3aa39306520f..f5a33342fa64 100644
@@ -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
configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig +1 -0
index 1bd52ab79124..7f7ee558ee7e 100644
@@ -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
configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig +1 -0
index e1e7d22a3a62..2add3bafe278 100644
@@ -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
configs/xilinx_zynqmp_zcu100_revC_defconfig +1 -0
index 3dd6ae9a0b3b..2a6a5a69cdfe 100644
@@ -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
configs/xilinx_zynqmp_zcu102_rev1_0_defconfig +1 -0
index 0ddec9986697..4cb3959f3626 100644
@@ -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
configs/xilinx_zynqmp_zcu102_revA_defconfig +1 -0
index 94dc62a61643..e989d1635c30 100644
@@ -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
configs/xilinx_zynqmp_zcu102_revB_defconfig +1 -0
index 8889f1909ac0..bd67df904a2d 100644
@@ -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
configs/xilinx_zynqmp_zcu104_revA_defconfig +1 -0
index 3d3d941d375c..a76b9cf54622 100644
@@ -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
configs/xilinx_zynqmp_zcu104_revC_defconfig +1 -0
index 7c22d7f020ed..dcd4897f2fbd 100644
@@ -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
configs/xilinx_zynqmp_zcu106_revA_defconfig +1 -0
index 017940e98361..a5fa33e366ae 100644
@@ -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
configs/xilinx_zynqmp_zcu111_revA_defconfig +1 -0
index 028a7b532844..4d9b91563523 100644
@@ -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
include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h +0 -1
index 852c2238de4a..f0ab3f159222 100644
@@ -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>
 
include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h +0 -2
index 2533ab860906..bfebbb3cd197 100644
@@ -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 */
include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h +0 -3
index f7d4ab2800c9..bd4a0c3178b8 100644
@@ -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 */
include/configs/xilinx_zynqmp_zcu100.h +0 -3
index 029347da479c..b65d0c1cddd2 100644
@@ -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
 
include/configs/xilinx_zynqmp_zcu102.h +0 -2
index c61e1b5e27c2..ca11b97c7c4c 100644
@@ -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
include/configs/xilinx_zynqmp_zcu104.h +0 -2
index 8d417f45e014..7e3b9ad7058b 100644
@@ -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>
include/configs/xilinx_zynqmp_zcu106.h +0 -2
index 01ac12a53c17..cc2d145ddd94 100644
@@ -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
include/configs/xilinx_zynqmp_zcu111.h +0 -2
index 3233b379798d..8f8cb4f08707 100644
@@ -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
Signature · 1 line
2.17.0
#10 lore raw

PATCH v2 6/6 usb: xhci: zynqmp: Remove support for !DM_USB

In reply to Michal Simek

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

---

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(-)
drivers/usb/host/Kconfig +1 -0
index 3455e8113bb8..b4dd005651cf 100644
@@ -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.
 
drivers/usb/host/xhci-zynqmp.c +0 -46

76 lines not on this page · raw message

scripts/config_whitelist.txt +0 -1
index 71df6dbebde6..bfbdfcfc80ac 100644
@@ -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
Signature · 1 line
2.17.0
Applied
#11 lore raw

v2 cover Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver

In reply to Michal Simek
Quoted 8 lines · Michal Simek

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.

Quoted 5 lines

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.

Signature · 2 lines
Best regards,
Marek Vasut