All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver
@ 2018-05-16 14:26 Michal Simek
  2018-05-16 14:26 ` [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Michal Simek @ 2018-05-16 14:26 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


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

 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                       |  57 ++++++
 drivers/usb/dwc3/core.h                       |   6 +
 drivers/usb/dwc3/dwc3-generic.c               | 165 ++++++++++++++++++
 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        |   1 -
 include/configs/xilinx_zynqmp_zcu111.h        |   2 -
 include/linux/usb/otg.h                       |   9 +
 scripts/config_whitelist.txt                  |   1 -
 30 files changed, 339 insertions(+), 94 deletions(-)
 create mode 100644 drivers/usb/dwc3/dwc3-generic.c

-- 
2.17.0

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

* [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB
  2018-05-16 14:26 [U-Boot] [PATCH 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
@ 2018-05-16 14:26 ` Michal Simek
  2018-05-16 14:40   ` Marek Vasut
  2018-05-16 14:26 ` [U-Boot] [PATCH 2/6] usb: common: add support to get maximum speed from dt Michal Simek
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Michal Simek @ 2018-05-16 14:26 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>
---

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

- Fix labels as was asked in previous review.
---
 drivers/usb/dwc3/core.c | 57 +++++++++++++++++++++++++++++++++++++++++
 drivers/usb/dwc3/core.h |  6 +++++
 2 files changed, 63 insertions(+)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index dbdad22d1134..e533325dda07 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -602,6 +602,8 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc)
 
 #define DWC3_ALIGN_MASK		(16 - 1)
 
+#ifndef CONFIG_DM_USB
+
 /**
  * dwc3_uboot_init - dwc3 core uboot initialization code
  * @dwc3_dev: struct dwc3_device containing initialization data
@@ -788,3 +790,58 @@ MODULE_ALIAS("platform:dwc3");
 MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
 MODULE_LICENSE("GPL v2");
 MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
+
+#else
+
+int dwc3_init(struct dwc3 *dwc)
+{
+	int ret;
+
+	dwc3_cache_hwparams(dwc);
+
+	ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE);
+	if (ret) {
+		dev_err(dwc->dev, "failed to allocate event buffers\n");
+		return -ENOMEM;
+	}
+
+	ret = dwc3_core_init(dwc);
+	if (ret) {
+		dev_err(dev, "failed to initialize core\n");
+		goto 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..ad16c9b7c46c 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -712,7 +712,11 @@ struct dwc3 {
 	/* device lock */
 	spinlock_t		lock;
 
+#ifndef CONFIG_DM_USB
 	struct device		*dev;
+#else
+	struct udevice		*dev;
+#endif
 
 	struct platform_device	*xhci;
 	struct resource		xhci_resources[DWC3_XHCI_RESOURCES_NUM];
@@ -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);
-- 
2.17.0

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

* [U-Boot] [PATCH 2/6] usb: common: add support to get maximum speed from dt
  2018-05-16 14:26 [U-Boot] [PATCH 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
  2018-05-16 14:26 ` [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
@ 2018-05-16 14:26 ` Michal Simek
  2018-05-16 20:57   ` Simon Glass
  2018-05-16 14:26 ` [U-Boot] [PATCH 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Michal Simek @ 2018-05-16 14:26 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)
---

 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] 15+ messages in thread

* [U-Boot] [PATCH 3/6] usb: dwc3: Add generic DWC3 glue logic driver
  2018-05-16 14:26 [U-Boot] [PATCH 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
  2018-05-16 14:26 ` [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
  2018-05-16 14:26 ` [U-Boot] [PATCH 2/6] usb: common: add support to get maximum speed from dt Michal Simek
@ 2018-05-16 14:26 ` Michal Simek
  2018-05-16 14:41   ` Marek Vasut
  2018-05-16 14:26 ` [U-Boot] [PATCH 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Michal Simek @ 2018-05-16 14:26 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>
---

 drivers/usb/dwc3/Kconfig        |   6 ++
 drivers/usb/dwc3/Makefile       |   1 +
 drivers/usb/dwc3/dwc3-generic.c | 165 ++++++++++++++++++++++++++++++++
 3 files changed, 172 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..7dd2555c2042
--- /dev/null
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -0,0 +1,165 @@
+// 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;
+
+		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__);
+			ret = device_bind_driver_to_node(parent,
+							 "dwc3-generic-peripheral",
+							 name,
+							 offset_to_ofnode(node),
+							 &dev);
+			if (ret) {
+				debug("%s: not able to bind usb device mode\n",
+				      __func__);
+				return ret;
+			}
+			break;
+		case USB_DR_MODE_HOST:
+			debug("%s: dr_mode: HOST\n", __func__);
+			ret = device_bind_driver_to_node(parent,
+							 "dwc3-generic-host",
+							 name,
+							 offset_to_ofnode(node),
+							 &dev);
+			if (ret) {
+				debug("%s: not able to bind usb host mode\n",
+				      __func__);
+				return ret;
+			}
+			break;
+		default:
+			break;
+		};
+	}
+
+	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] 15+ messages in thread

* [U-Boot] [PATCH 4/6] usb: xhci: zynqmp: Add support for DM_USB
  2018-05-16 14:26 [U-Boot] [PATCH 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
                   ` (2 preceding siblings ...)
  2018-05-16 14:26 ` [U-Boot] [PATCH 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
@ 2018-05-16 14:26 ` Michal Simek
  2018-05-16 14:26 ` [U-Boot] [PATCH 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
  2018-05-16 14:26 ` [U-Boot] [PATCH 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
  5 siblings, 0 replies; 15+ messages in thread
From: Michal Simek @ 2018-05-16 14:26 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>
---

 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] 15+ messages in thread

* [U-Boot] [PATCH 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB
  2018-05-16 14:26 [U-Boot] [PATCH 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
                   ` (3 preceding siblings ...)
  2018-05-16 14:26 ` [U-Boot] [PATCH 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
@ 2018-05-16 14:26 ` Michal Simek
  2018-05-16 14:26 ` [U-Boot] [PATCH 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
  5 siblings, 0 replies; 15+ messages in thread
From: Michal Simek @ 2018-05-16 14:26 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>
---

 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        |  1 -
 include/configs/xilinx_zynqmp_zcu111.h        |  2 -
 20 files changed, 11 insertions(+), 62 deletions(-)

diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
index 415fa668a789..551921b888a0 100644
--- a/board/xilinx/zynqmp/zynqmp.c
+++ b/board/xilinx/zynqmp/zynqmp.c
@@ -601,49 +601,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 9e2c0127474b..f36ab6f06972 100644
--- a/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm015_dc1_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_zc1751_xm016_dc2_defconfig b/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
index bd6d77ed3fcf..56d09c2c07da 100644
--- a/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
@@ -80,6 +80,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 2e7ba74c03d2..ea4069d49571 100644
--- a/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
@@ -76,6 +76,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 95dc5c131196..cdab565add4f 100644
--- a/configs/xilinx_zynqmp_zcu100_revC_defconfig
+++ b/configs/xilinx_zynqmp_zcu100_revC_defconfig
@@ -78,6 +78,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 d3a226d4d2cf..0fa88b985aa2 100644
--- a/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
@@ -94,6 +94,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 af7fd000697b..264900a97f65 100644
--- a/configs/xilinx_zynqmp_zcu102_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_revA_defconfig
@@ -92,6 +92,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..c0774cd983c8 100644
--- a/include/configs/xilinx_zynqmp_zcu106.h
+++ b/include/configs/xilinx_zynqmp_zcu106.h
@@ -35,7 +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
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] 15+ messages in thread

* [U-Boot] [PATCH 6/6] usb: xhci: zynqmp: Remove support for !DM_USB
  2018-05-16 14:26 [U-Boot] [PATCH 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
                   ` (4 preceding siblings ...)
  2018-05-16 14:26 ` [U-Boot] [PATCH 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
@ 2018-05-16 14:26 ` Michal Simek
  2018-05-16 20:57   ` Simon Glass
  5 siblings, 1 reply; 15+ messages in thread
From: Michal Simek @ 2018-05-16 14:26 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>
---

 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] 15+ messages in thread

* [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB
  2018-05-16 14:26 ` [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
@ 2018-05-16 14:40   ` Marek Vasut
  2018-05-17  7:40     ` Michal Simek
  0 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2018-05-16 14:40 UTC (permalink / raw)
  To: u-boot

On 05/16/2018 04:26 PM, 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>
> ---
[...]
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index cbe9850a0bda..ad16c9b7c46c 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -712,7 +712,11 @@ struct dwc3 {
>  	/* device lock */
>  	spinlock_t		lock;
>  
> +#ifndef CONFIG_DM_USB

Shouldnt this be ifdef __UBOOT__ ?

>  	struct device		*dev;
> +#else
> +	struct udevice		*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);
> 


-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH 3/6] usb: dwc3: Add generic DWC3 glue logic driver
  2018-05-16 14:26 ` [U-Boot] [PATCH 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
@ 2018-05-16 14:41   ` Marek Vasut
  2018-05-17  6:27     ` Michal Simek
  0 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2018-05-16 14:41 UTC (permalink / raw)
  To: u-boot

On 05/16/2018 04:26 PM, 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>
> ---
> 
>  drivers/usb/dwc3/Kconfig        |   6 ++
>  drivers/usb/dwc3/Makefile       |   1 +
>  drivers/usb/dwc3/dwc3-generic.c | 165 ++++++++++++++++++++++++++++++++
>  3 files changed, 172 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..7dd2555c2042
> --- /dev/null
> +++ b/drivers/usb/dwc3/dwc3-generic.c
> @@ -0,0 +1,165 @@
> +// 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;
> +
> +		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__);
> +			ret = device_bind_driver_to_node(parent,
> +							 "dwc3-generic-peripheral",
> +							 name,
> +							 offset_to_ofnode(node),
> +							 &dev);
> +			if (ret) {
> +				debug("%s: not able to bind usb device mode\n",
> +				      __func__);
> +				return ret;
> +			}
> +			break;
> +		case USB_DR_MODE_HOST:
> +			debug("%s: dr_mode: HOST\n", __func__);
> +			ret = device_bind_driver_to_node(parent,
> +							 "dwc3-generic-host",
> +							 name,
> +							 offset_to_ofnode(node),
> +							 &dev);

Can you somehow improve this indent hell ?

> +			if (ret) {
> +				debug("%s: not able to bind usb host mode\n",
> +				      __func__);
> +				return ret;
> +			}
> +			break;
> +		default:
> +			break;
> +		};
> +	}
> +
> +	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,
> +};
> 


-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH 2/6] usb: common: add support to get maximum speed from dt
  2018-05-16 14:26 ` [U-Boot] [PATCH 2/6] usb: common: add support to get maximum speed from dt Michal Simek
@ 2018-05-16 20:57   ` Simon Glass
  0 siblings, 0 replies; 15+ messages in thread
From: Simon Glass @ 2018-05-16 20:57 UTC (permalink / raw)
  To: u-boot

On 16 May 2018 at 08:26, Michal Simek <michal.simek@xilinx.com> wrote:
> 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)
> ---
>
>  drivers/usb/common/common.c | 29 +++++++++++++++++++++++++++++
>  include/linux/usb/otg.h     |  9 +++++++++
>  2 files changed, 38 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

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

* [U-Boot] [PATCH 6/6] usb: xhci: zynqmp: Remove support for !DM_USB
  2018-05-16 14:26 ` [U-Boot] [PATCH 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
@ 2018-05-16 20:57   ` Simon Glass
  0 siblings, 0 replies; 15+ messages in thread
From: Simon Glass @ 2018-05-16 20:57 UTC (permalink / raw)
  To: u-boot

On 16 May 2018 at 08:26, Michal Simek <michal.simek@xilinx.com> wrote:
> 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>
> ---
>
>  drivers/usb/host/Kconfig       |  1 +
>  drivers/usb/host/xhci-zynqmp.c | 46 ----------------------------------
>  scripts/config_whitelist.txt   |  1 -
>  3 files changed, 1 insertion(+), 47 deletions(-)
>

Reviewed-by: Simon Glass <sjg@chromium.org>

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

* [U-Boot] [PATCH 3/6] usb: dwc3: Add generic DWC3 glue logic driver
  2018-05-16 14:41   ` Marek Vasut
@ 2018-05-17  6:27     ` Michal Simek
  2018-05-17  8:27       ` Marek Vasut
  0 siblings, 1 reply; 15+ messages in thread
From: Michal Simek @ 2018-05-17  6:27 UTC (permalink / raw)
  To: u-boot

On 16.5.2018 16:41, Marek Vasut wrote:
> On 05/16/2018 04:26 PM, 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>
>> ---
>>
>>  drivers/usb/dwc3/Kconfig        |   6 ++
>>  drivers/usb/dwc3/Makefile       |   1 +
>>  drivers/usb/dwc3/dwc3-generic.c | 165 ++++++++++++++++++++++++++++++++
>>  3 files changed, 172 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..7dd2555c2042
>> --- /dev/null
>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>> @@ -0,0 +1,165 @@
>> +// 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;
>> +
>> +		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__);
>> +			ret = device_bind_driver_to_node(parent,
>> +							 "dwc3-generic-peripheral",
>> +							 name,
>> +							 offset_to_ofnode(node),
>> +							 &dev);
>> +			if (ret) {
>> +				debug("%s: not able to bind usb device mode\n",
>> +				      __func__);
>> +				return ret;
>> +			}
>> +			break;
>> +		case USB_DR_MODE_HOST:
>> +			debug("%s: dr_mode: HOST\n", __func__);
>> +			ret = device_bind_driver_to_node(parent,
>> +							 "dwc3-generic-host",
>> +							 name,
>> +							 offset_to_ofnode(node),
>> +							 &dev);
> 
> Can you somehow improve this indent hell ?

Unfortunately this is correct style. I am happy to break 80 char limit
which will clean this up.  Just let me know your preference.

Thanks,
Michal

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180517/3e3ba753/attachment.sig>

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

* [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB
  2018-05-16 14:40   ` Marek Vasut
@ 2018-05-17  7:40     ` Michal Simek
  2018-05-17  8:25       ` Marek Vasut
  0 siblings, 1 reply; 15+ messages in thread
From: Michal Simek @ 2018-05-17  7:40 UTC (permalink / raw)
  To: u-boot

On 16.5.2018 16:40, Marek Vasut wrote:
> On 05/16/2018 04:26 PM, 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>
>> ---
> [...]
>> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
>> index cbe9850a0bda..ad16c9b7c46c 100644
>> --- a/drivers/usb/dwc3/core.h
>> +++ b/drivers/usb/dwc3/core.h
>> @@ -712,7 +712,11 @@ struct dwc3 {
>>  	/* device lock */
>>  	spinlock_t		lock;
>>  
>> +#ifndef CONFIG_DM_USB
> 
> Shouldnt this be ifdef __UBOOT__ ?
> 
>>  	struct device		*dev;
>> +#else
>> +	struct udevice		*dev;
>> +#endif

What about this?

#if defined(__UBOOT__) && defined(CONFIG_DM_USB)
	struct udevice		*dev;
#else
	struct device		*dev;
#endif

Thanks,
Michal

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180517/5c6692e3/attachment.sig>

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

* [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB
  2018-05-17  7:40     ` Michal Simek
@ 2018-05-17  8:25       ` Marek Vasut
  0 siblings, 0 replies; 15+ messages in thread
From: Marek Vasut @ 2018-05-17  8:25 UTC (permalink / raw)
  To: u-boot

On 05/17/2018 09:40 AM, Michal Simek wrote:
> On 16.5.2018 16:40, Marek Vasut wrote:
>> On 05/16/2018 04:26 PM, 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>
>>> ---
>> [...]
>>> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
>>> index cbe9850a0bda..ad16c9b7c46c 100644
>>> --- a/drivers/usb/dwc3/core.h
>>> +++ b/drivers/usb/dwc3/core.h
>>> @@ -712,7 +712,11 @@ struct dwc3 {
>>>  	/* device lock */
>>>  	spinlock_t		lock;
>>>  
>>> +#ifndef CONFIG_DM_USB
>>
>> Shouldnt this be ifdef __UBOOT__ ?
>>
>>>  	struct device		*dev;
>>> +#else
>>> +	struct udevice		*dev;
>>> +#endif
> 
> What about this?
> 
> #if defined(__UBOOT__) && defined(CONFIG_DM_USB)
> 	struct udevice		*dev;
> #else
> 	struct device		*dev;
> #endif

Yes. I am kinda surprised we don't have some udevice<->device mapping
layer, but I guess that might have it's own problems.

-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH 3/6] usb: dwc3: Add generic DWC3 glue logic driver
  2018-05-17  6:27     ` Michal Simek
@ 2018-05-17  8:27       ` Marek Vasut
  0 siblings, 0 replies; 15+ messages in thread
From: Marek Vasut @ 2018-05-17  8:27 UTC (permalink / raw)
  To: u-boot

On 05/17/2018 08:27 AM, Michal Simek wrote:
> On 16.5.2018 16:41, Marek Vasut wrote:
>> On 05/16/2018 04:26 PM, 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>
>>> ---
>>>
>>>  drivers/usb/dwc3/Kconfig        |   6 ++
>>>  drivers/usb/dwc3/Makefile       |   1 +
>>>  drivers/usb/dwc3/dwc3-generic.c | 165 ++++++++++++++++++++++++++++++++
>>>  3 files changed, 172 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..7dd2555c2042
>>> --- /dev/null
>>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>>> @@ -0,0 +1,165 @@
>>> +// 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;
>>> +
>>> +		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__);
>>> +			ret = device_bind_driver_to_node(parent,
>>> +							 "dwc3-generic-peripheral",
>>> +							 name,
>>> +							 offset_to_ofnode(node),
>>> +							 &dev);
>>> +			if (ret) {
>>> +				debug("%s: not able to bind usb device mode\n",
>>> +				      __func__);
>>> +				return ret;
>>> +			}
>>> +			break;
>>> +		case USB_DR_MODE_HOST:
>>> +			debug("%s: dr_mode: HOST\n", __func__);
>>> +			ret = device_bind_driver_to_node(parent,
>>> +							 "dwc3-generic-host",
>>> +							 name,
>>> +							 offset_to_ofnode(node),
>>> +							 &dev);
>>
>> Can you somehow improve this indent hell ?
> 
> Unfortunately this is correct style. I am happy to break 80 char limit
> which will clean this up.  Just let me know your preference.

Would separate function help here ? Or even better, something like

switch (drmode) {
 case foo
 case bar
   driver_name = "dwc3-generic-peripheral";
   break;
 case baz
  ...
}

ret = device_bind_driver...(parent, driver_name, name ....);

?

-- 
Best regards,
Marek Vasut

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

end of thread, other threads:[~2018-05-17  8:27 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-16 14:26 [U-Boot] [PATCH 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
2018-05-16 14:26 ` [U-Boot] [PATCH 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
2018-05-16 14:40   ` Marek Vasut
2018-05-17  7:40     ` Michal Simek
2018-05-17  8:25       ` Marek Vasut
2018-05-16 14:26 ` [U-Boot] [PATCH 2/6] usb: common: add support to get maximum speed from dt Michal Simek
2018-05-16 20:57   ` Simon Glass
2018-05-16 14:26 ` [U-Boot] [PATCH 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
2018-05-16 14:41   ` Marek Vasut
2018-05-17  6:27     ` Michal Simek
2018-05-17  8:27       ` Marek Vasut
2018-05-16 14:26 ` [U-Boot] [PATCH 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
2018-05-16 14:26 ` [U-Boot] [PATCH 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
2018-05-16 14:26 ` [U-Boot] [PATCH 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
2018-05-16 20:57   ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.