* [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver
@ 2018-05-18 11:15 Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
` (6 more replies)
0 siblings, 7 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
To: u-boot
Hi,
this patchset is based on unfinished series send to ML 06/13/2017
by Vignesh
"[U-Boot] [PATCH v2 00/13] driver model bring-up of dwc3 usb peripheral"
We have taken some part of this to Xilinx tree and use it for a while
but it is time to review it and upstream it.
The patchset has 2 patches created by Mugunthan which are a little bit
fixed.
dwc3-generic driver was inspired by omap version.
And the last 3 patches just doing conversion and enable DM_USB for our
platform.
Thanks,
Michal
Changes in v2:
- Retype dwc->dev in gadget.c to avoid compilation warning
- Guard udevice with __UBOOT__
- Move ifdef in core.c to avoid compilation issues for some platforms
(for example edison)
- Change style to avoid correct but not nice indentation by using char
*driver variable (suggested by Marek)
Michal Simek (4):
usb: dwc3: Add generic DWC3 glue logic driver
usb: xhci: zynqmp: Add support for DM_USB
arm64: zynqmp: Use DWC3 generic driver and DM_USB
usb: xhci: zynqmp: Remove support for !DM_USB
Mugunthan V N (2):
usb: dwc3: Add dwc3_init/remove with DM_USB
usb: common: add support to get maximum speed from dt
arch/arm/include/asm/arch-zynqmp/hardware.h | 3 -
board/xilinx/zynqmp/zynqmp.c | 46 -----
.../xilinx_zynqmp_zc1751_xm015_dc1_defconfig | 1 +
.../xilinx_zynqmp_zc1751_xm016_dc2_defconfig | 1 +
.../xilinx_zynqmp_zc1751_xm017_dc3_defconfig | 1 +
configs/xilinx_zynqmp_zcu100_revC_defconfig | 1 +
configs/xilinx_zynqmp_zcu102_rev1_0_defconfig | 1 +
configs/xilinx_zynqmp_zcu102_revA_defconfig | 1 +
configs/xilinx_zynqmp_zcu102_revB_defconfig | 1 +
configs/xilinx_zynqmp_zcu104_revA_defconfig | 1 +
configs/xilinx_zynqmp_zcu104_revC_defconfig | 1 +
configs/xilinx_zynqmp_zcu106_revA_defconfig | 1 +
configs/xilinx_zynqmp_zcu111_revA_defconfig | 1 +
drivers/usb/common/common.c | 29 ++++
drivers/usb/dwc3/Kconfig | 6 +
drivers/usb/dwc3/Makefile | 1 +
drivers/usb/dwc3/core.c | 55 ++++++
drivers/usb/dwc3/core.h | 6 +
drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++
drivers/usb/dwc3/gadget.c | 2 +-
drivers/usb/host/Kconfig | 1 +
drivers/usb/host/xhci-zynqmp.c | 85 ++++++----
.../configs/xilinx_zynqmp_zc1751_xm015_dc1.h | 1 -
.../configs/xilinx_zynqmp_zc1751_xm016_dc2.h | 2 -
.../configs/xilinx_zynqmp_zc1751_xm017_dc3.h | 3 -
include/configs/xilinx_zynqmp_zcu100.h | 3 -
include/configs/xilinx_zynqmp_zcu102.h | 2 -
include/configs/xilinx_zynqmp_zcu104.h | 2 -
include/configs/xilinx_zynqmp_zcu106.h | 2 -
include/configs/xilinx_zynqmp_zcu111.h | 2 -
include/linux/usb/otg.h | 9 +
scripts/config_whitelist.txt | 1 -
32 files changed, 330 insertions(+), 99 deletions(-)
create mode 100644 drivers/usb/dwc3/dwc3-generic.c
--
2.17.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
2018-05-18 13:21 ` Jean-Jacques Hiblot
2018-05-18 11:15 ` [U-Boot] [PATCH v2 2/6] usb: common: add support to get maximum speed from dt Michal Simek
` (5 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
To: u-boot
From: Mugunthan V N <mugunthanvnm@ti.com>
The patch is preparing dwc3 core for enabling DM_USB with peripheral
driver with using driver model support.
The driver will be bound by the DWC3 wrapper driver based on the
dr_mode device tree entry.
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
(Remove dwc3-omap changes)
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---
Changes in v2:
- Retype dwc->dev in gadget.c to avoid compilation warning
- Guard udevice with __UBOOT__
- Move ifdef in core.c to avoid compilation issues for some platforms
(for example edison)
Origin series here: https://patchwork.ozlabs.org/patch/775108/
- Fix labels as was asked in previous review.
---
drivers/usb/dwc3/core.c | 55 +++++++++++++++++++++++++++++++++++++++
drivers/usb/dwc3/core.h | 6 +++++
drivers/usb/dwc3/gadget.c | 2 +-
3 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index dbdad22d1134..1ab5cee60969 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -788,3 +788,58 @@ MODULE_ALIAS("platform:dwc3");
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
+
+#ifdef CONFIG_DM_USB
+
+int dwc3_init(struct dwc3 *dwc)
+{
+ int ret;
+
+ dwc3_cache_hwparams(dwc);
+
+ ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE);
+ if (ret) {
+ dev_err(dwc->dev, "failed to allocate event buffers\n");
+ return -ENOMEM;
+ }
+
+ ret = dwc3_core_init(dwc);
+ if (ret) {
+ dev_err(dev, "failed to initialize core\n");
+ goto core_fail;
+ }
+
+ ret = dwc3_event_buffers_setup(dwc);
+ if (ret) {
+ dev_err(dwc->dev, "failed to setup event buffers\n");
+ goto event_fail;
+ }
+
+ ret = dwc3_core_init_mode(dwc);
+ if (ret)
+ goto mode_fail;
+
+ return 0;
+
+mode_fail:
+ dwc3_event_buffers_cleanup(dwc);
+
+event_fail:
+ dwc3_core_exit(dwc);
+
+core_fail:
+ dwc3_free_event_buffers(dwc);
+
+ return ret;
+}
+
+void dwc3_remove(struct dwc3 *dwc)
+{
+ dwc3_core_exit_mode(dwc);
+ dwc3_event_buffers_cleanup(dwc);
+ dwc3_free_event_buffers(dwc);
+ dwc3_core_exit(dwc);
+ kfree(dwc->mem);
+}
+
+#endif
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index cbe9850a0bda..58fe91dc5131 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -712,7 +712,11 @@ struct dwc3 {
/* device lock */
spinlock_t lock;
+#if defined(__UBOOT__) && defined(CONFIG_DM_USB)
+ struct udevice *dev;
+#else
struct device *dev;
+#endif
struct platform_device *xhci;
struct resource xhci_resources[DWC3_XHCI_RESOURCES_NUM];
@@ -987,6 +991,8 @@ struct dwc3_gadget_ep_cmd_params {
/* prototypes */
int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc);
+int dwc3_init(struct dwc3 *dwc);
+void dwc3_remove(struct dwc3 *dwc);
#ifdef CONFIG_USB_DWC3_HOST
int dwc3_host_init(struct dwc3 *dwc);
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index d45fae044c4a..e340cb268fcd 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2609,7 +2609,7 @@ int dwc3_gadget_init(struct dwc3 *dwc)
if (ret)
goto err4;
- ret = usb_add_gadget_udc(dwc->dev, &dwc->gadget);
+ ret = usb_add_gadget_udc((struct device *)dwc->dev, &dwc->gadget);
if (ret) {
dev_err(dwc->dev, "failed to register udc\n");
goto err4;
--
2.17.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 2/6] usb: common: add support to get maximum speed from dt
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
` (4 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
To: u-boot
From: Mugunthan V N <mugunthanvnm@ti.com>
Add support to get maximum speed from dt so that usb drivers
makes use of it for DT parsing.
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
(rebase and fix errors)
Reviewed-by: Simon Glass <sjg@chromium.org>
---
Changes in v2: None
drivers/usb/common/common.c | 29 +++++++++++++++++++++++++++++
include/linux/usb/otg.h | 9 +++++++++
2 files changed, 38 insertions(+)
diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c
index 17a0ab23ff53..a55def5aba67 100644
--- a/drivers/usb/common/common.c
+++ b/drivers/usb/common/common.c
@@ -9,6 +9,7 @@
#include <common.h>
#include <linux/libfdt.h>
#include <linux/usb/otg.h>
+#include <linux/usb/ch9.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -37,3 +38,31 @@ enum usb_dr_mode usb_get_dr_mode(int node)
return USB_DR_MODE_UNKNOWN;
}
+
+static const char *const speed_names[] = {
+ [USB_SPEED_UNKNOWN] = "UNKNOWN",
+ [USB_SPEED_LOW] = "low-speed",
+ [USB_SPEED_FULL] = "full-speed",
+ [USB_SPEED_HIGH] = "high-speed",
+ [USB_SPEED_WIRELESS] = "wireless",
+ [USB_SPEED_SUPER] = "super-speed",
+};
+
+enum usb_device_speed usb_get_maximum_speed(int node)
+{
+ const void *fdt = gd->fdt_blob;
+ const char *max_speed;
+ int i;
+
+ max_speed = fdt_getprop(fdt, node, "maximum-speed", NULL);
+ if (!max_speed) {
+ pr_err("usb maximum-speed not found\n");
+ return USB_SPEED_UNKNOWN;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(speed_names); i++)
+ if (!strcmp(max_speed, speed_names[i]))
+ return i;
+
+ return USB_SPEED_UNKNOWN;
+}
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index 0b273d8e2e8a..d2604c5cafba 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -25,4 +25,13 @@ enum usb_dr_mode {
*/
enum usb_dr_mode usb_get_dr_mode(int node);
+/**
+ * usb_get_maximum_speed() - Get maximum speed for given device
+ * @node: Node offset to the given device
+ *
+ * The function gets phy interface string from property 'maximum-speed',
+ * and returns the correspondig enum usb_device_speed
+ */
+enum usb_device_speed usb_get_maximum_speed(int node);
+
#endif /* __LINUX_USB_OTG_H */
--
2.17.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 2/6] usb: common: add support to get maximum speed from dt Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
2018-05-18 13:24 ` Jean-Jacques Hiblot
2018-05-18 11:15 ` [U-Boot] [PATCH v2 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
` (3 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
To: u-boot
By enabling BLK by default this is the next driver which needs to get
support for DM_USB. Adding generic DWC3 glue logic which only
parse nodes and read device mode. Based on it probe proper
host/peripheral DWC3 drivers for it.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---
Changes in v2:
- Change style to avoid correct but not nice indentation by using char
*driver variable (suggested by Marek)
drivers/usb/dwc3/Kconfig | 6 ++
drivers/usb/dwc3/Makefile | 1 +
drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++++++++++++++++
3 files changed, 164 insertions(+)
create mode 100644 drivers/usb/dwc3/dwc3-generic.c
diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
index ae7fc1c6304d..943b7630eba4 100644
--- a/drivers/usb/dwc3/Kconfig
+++ b/drivers/usb/dwc3/Kconfig
@@ -37,6 +37,12 @@ config USB_DWC3_OMAP
Say 'Y' here if you have one such device
+config USB_DWC3_GENERIC
+ bool "Xilinx ZynqMP and similar Platforms"
+ depends on DM_USB && USB_DWC3
+ help
+ Some platforms can reuse this DWC3 generic implementation.
+
config USB_DWC3_UNIPHIER
bool "DesignWare USB3 Host Support on UniPhier Platforms"
depends on ARCH_UNIPHIER && USB_XHCI_DWC3
diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
index cd18b8d9ec02..60b5515a67da 100644
--- a/drivers/usb/dwc3/Makefile
+++ b/drivers/usb/dwc3/Makefile
@@ -7,6 +7,7 @@ dwc3-y := core.o
obj-$(CONFIG_USB_DWC3_GADGET) += gadget.o ep0.o
obj-$(CONFIG_USB_DWC3_OMAP) += dwc3-omap.o
+obj-$(CONFIG_USB_DWC3_GENERIC) += dwc3-generic.o
obj-$(CONFIG_USB_DWC3_UNIPHIER) += dwc3-uniphier.o
obj-$(CONFIG_USB_DWC3_PHY_OMAP) += ti_usb_phy.o
obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG) += samsung_usb_phy.o
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
new file mode 100644
index 000000000000..ca63eac3d98e
--- /dev/null
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -0,0 +1,157 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Generic DWC3 Glue layer
+ *
+ * Copyright (C) 2016 - 2018 Xilinx, Inc.
+ *
+ * Based on dwc3-omap.c.
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
+#include <linux/usb/otg.h>
+#include <linux/compat.h>
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+#include <malloc.h>
+#include <usb.h>
+#include "core.h"
+#include "gadget.h"
+#include "linux-compat.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int usb_gadget_handle_interrupts(int index)
+{
+ struct dwc3 *priv;
+ struct udevice *dev;
+ int ret;
+
+ ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
+ if (!dev || ret) {
+ pr_err("No USB device found\n");
+ return -ENODEV;
+ }
+
+ priv = dev_get_priv(dev);
+
+ dwc3_gadget_uboot_handle_interrupt(priv);
+
+ return 0;
+}
+
+static int dwc3_generic_peripheral_probe(struct udevice *dev)
+{
+ struct dwc3 *priv = dev_get_priv(dev);
+
+ return dwc3_init(priv);
+}
+
+static int dwc3_generic_peripheral_remove(struct udevice *dev)
+{
+ struct dwc3 *priv = dev_get_priv(dev);
+
+ dwc3_remove(priv);
+
+ return 0;
+}
+
+static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
+{
+ struct dwc3 *priv = dev_get_priv(dev);
+ int node = dev_of_offset(dev);
+
+ priv->regs = (void *)devfdt_get_addr(dev);
+ priv->regs += DWC3_GLOBALS_REGS_START;
+
+ priv->maximum_speed = usb_get_maximum_speed(node);
+ if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
+ pr_err("Invalid usb maximum speed\n");
+ return -ENODEV;
+ }
+
+ priv->dr_mode = usb_get_dr_mode(node);
+ if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
+ pr_err("Invalid usb mode setup\n");
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+static int dwc3_generic_peripheral_bind(struct udevice *dev)
+{
+ return device_probe(dev);
+}
+
+U_BOOT_DRIVER(dwc3_generic_peripheral) = {
+ .name = "dwc3-generic-peripheral",
+ .id = UCLASS_USB_DEV_GENERIC,
+ .ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
+ .probe = dwc3_generic_peripheral_probe,
+ .remove = dwc3_generic_peripheral_remove,
+ .bind = dwc3_generic_peripheral_bind,
+ .platdata_auto_alloc_size = sizeof(struct usb_platdata),
+ .priv_auto_alloc_size = sizeof(struct dwc3),
+ .flags = DM_FLAG_ALLOC_PRIV_DMA,
+};
+
+static int dwc3_generic_bind(struct udevice *parent)
+{
+ const void *fdt = gd->fdt_blob;
+ int node;
+ int ret;
+
+ for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0;
+ node = fdt_next_subnode(fdt, node)) {
+ const char *name = fdt_get_name(fdt, node, NULL);
+ enum usb_dr_mode dr_mode;
+ struct udevice *dev;
+ const char *driver;
+
+ debug("%s: subnode name: %s\n", __func__, name);
+ if (strncmp(name, "dwc3@", 4))
+ continue;
+
+ dr_mode = usb_get_dr_mode(node);
+
+ switch (dr_mode) {
+ case USB_DR_MODE_PERIPHERAL:
+ case USB_DR_MODE_OTG:
+ debug("%s: dr_mode: OTG or Peripheral\n", __func__);
+ driver = "dwc3-generic-peripheral";
+ break;
+ case USB_DR_MODE_HOST:
+ debug("%s: dr_mode: HOST\n", __func__);
+ driver = "dwc3-generic-host";
+ break;
+ default:
+ debug("%s: unsupported dr_mode\n", __func__);
+ return -ENODEV;
+ };
+
+ ret = device_bind_driver_to_node(parent, driver, name,
+ offset_to_ofnode(node), &dev);
+ if (ret) {
+ debug("%s: not able to bind usb device mode\n",
+ __func__);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+static const struct udevice_id dwc3_generic_ids[] = {
+ { .compatible = "xlnx,zynqmp-dwc3" },
+ { }
+};
+
+U_BOOT_DRIVER(dwc3_generic_wrapper) = {
+ .name = "dwc3-generic-wrapper",
+ .id = UCLASS_MISC,
+ .of_match = dwc3_generic_ids,
+ .bind = dwc3_generic_bind,
+};
--
2.17.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 4/6] usb: xhci: zynqmp: Add support for DM_USB
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
` (2 preceding siblings ...)
2018-05-18 11:15 ` [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
` (2 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
To: u-boot
The patch is adding support for DM_USB for xhci driver.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---
Changes in v2: None
drivers/usb/host/xhci-zynqmp.c | 69 ++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/drivers/usb/host/xhci-zynqmp.c b/drivers/usb/host/xhci-zynqmp.c
index b1ade582aef6..526a42a9a58a 100644
--- a/drivers/usb/host/xhci-zynqmp.c
+++ b/drivers/usb/host/xhci-zynqmp.c
@@ -10,6 +10,7 @@
*/
#include <common.h>
+#include <dm.h>
#include <usb.h>
#include <linux/errno.h>
#include <asm/arch/hardware.h>
@@ -54,13 +55,23 @@
#define USBOTGSS_IRQ_SET_1_DMADISABLECLR_EN BIT(17)
struct zynqmp_xhci {
+#ifdef CONFIG_DM_USB
+ struct usb_platdata usb_plat;
+#endif
+ struct xhci_ctrl ctrl;
struct xhci_hccr *hcd;
struct dwc3 *dwc3_reg;
};
+#ifdef CONFIG_DM_USB
+struct zynqmp_xhci_platdata {
+ fdt_addr_t hcd_base;
+};
+#else
static struct zynqmp_xhci zynqmp_xhci;
unsigned long ctr_addr[] = CONFIG_ZYNQMP_XHCI_LIST;
+#endif
static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
{
@@ -78,6 +89,7 @@ static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
return ret;
}
+#ifndef CONFIG_DM_USB
int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
{
struct zynqmp_xhci *ctx = &zynqmp_xhci;
@@ -111,6 +123,7 @@ int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
return ret;
}
+#endif
void xhci_hcd_stop(int index)
{
@@ -121,3 +134,59 @@ void xhci_hcd_stop(int index)
return;
}
+
+#ifdef CONFIG_DM_USB
+static int xhci_usb_probe(struct udevice *dev)
+{
+ struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
+ struct zynqmp_xhci *ctx = dev_get_priv(dev);
+ struct xhci_hcor *hcor;
+ int ret;
+
+ ctx->hcd = (struct xhci_hccr *)plat->hcd_base;
+ ctx->dwc3_reg = (struct dwc3 *)((char *)(ctx->hcd) + DWC3_REG_OFFSET);
+
+ ret = zynqmp_xhci_core_init(ctx);
+ if (ret) {
+ puts("XHCI: failed to initialize controller\n");
+ return -EINVAL;
+ }
+
+ hcor = (struct xhci_hcor *)((ulong)ctx->hcd +
+ HC_LENGTH(xhci_readl(&ctx->hcd->cr_capbase)));
+
+ return xhci_register(dev, ctx->hcd, hcor);
+}
+
+static int xhci_usb_remove(struct udevice *dev)
+{
+ return xhci_deregister(dev);
+}
+
+static int xhci_usb_ofdata_to_platdata(struct udevice *dev)
+{
+ struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
+ const void *blob = gd->fdt_blob;
+
+ /* Get the base address for XHCI controller from the device node */
+ plat->hcd_base = fdtdec_get_addr(blob, dev_of_offset(dev), "reg");
+ if (plat->hcd_base == FDT_ADDR_T_NONE) {
+ debug("Can't get the XHCI register base address\n");
+ return -ENXIO;
+ }
+
+ return 0;
+}
+
+U_BOOT_DRIVER(dwc3_generic_host) = {
+ .name = "dwc3-generic-host",
+ .id = UCLASS_USB,
+ .ofdata_to_platdata = xhci_usb_ofdata_to_platdata,
+ .probe = xhci_usb_probe,
+ .remove = xhci_usb_remove,
+ .ops = &xhci_usb_ops,
+ .platdata_auto_alloc_size = sizeof(struct zynqmp_xhci_platdata),
+ .priv_auto_alloc_size = sizeof(struct zynqmp_xhci),
+ .flags = DM_FLAG_ALLOC_PRIV_DMA,
+};
+#endif
--
2.17.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
` (3 preceding siblings ...)
2018-05-18 11:15 ` [U-Boot] [PATCH v2 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
2018-05-18 11:25 ` [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Marek Vasut
6 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
To: u-boot
Remove harcoded XHCI lists and detect mode, speed based on DT.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Serial-changes: 2
- Remove also XHCI macros from hardware.h
- Remove additional new line in zcu106
---
Changes in v2: None
arch/arm/include/asm/arch-zynqmp/hardware.h | 3 --
board/xilinx/zynqmp/zynqmp.c | 46 -------------------
.../xilinx_zynqmp_zc1751_xm015_dc1_defconfig | 1 +
.../xilinx_zynqmp_zc1751_xm016_dc2_defconfig | 1 +
.../xilinx_zynqmp_zc1751_xm017_dc3_defconfig | 1 +
configs/xilinx_zynqmp_zcu100_revC_defconfig | 1 +
configs/xilinx_zynqmp_zcu102_rev1_0_defconfig | 1 +
configs/xilinx_zynqmp_zcu102_revA_defconfig | 1 +
configs/xilinx_zynqmp_zcu102_revB_defconfig | 1 +
configs/xilinx_zynqmp_zcu104_revA_defconfig | 1 +
configs/xilinx_zynqmp_zcu104_revC_defconfig | 1 +
configs/xilinx_zynqmp_zcu106_revA_defconfig | 1 +
configs/xilinx_zynqmp_zcu111_revA_defconfig | 1 +
.../configs/xilinx_zynqmp_zc1751_xm015_dc1.h | 1 -
.../configs/xilinx_zynqmp_zc1751_xm016_dc2.h | 2 -
.../configs/xilinx_zynqmp_zc1751_xm017_dc3.h | 3 --
include/configs/xilinx_zynqmp_zcu100.h | 3 --
include/configs/xilinx_zynqmp_zcu102.h | 2 -
include/configs/xilinx_zynqmp_zcu104.h | 2 -
include/configs/xilinx_zynqmp_zcu106.h | 2 -
include/configs/xilinx_zynqmp_zcu111.h | 2 -
21 files changed, 11 insertions(+), 66 deletions(-)
diff --git a/arch/arm/include/asm/arch-zynqmp/hardware.h b/arch/arm/include/asm/arch-zynqmp/hardware.h
index dfd6097b4beb..acc68251be94 100644
--- a/arch/arm/include/asm/arch-zynqmp/hardware.h
+++ b/arch/arm/include/asm/arch-zynqmp/hardware.h
@@ -17,9 +17,6 @@
#define ARASAN_NAND_BASEADDR 0xFF100000
-#define ZYNQMP_USB0_XHCI_BASEADDR 0xFE200000
-#define ZYNQMP_USB1_XHCI_BASEADDR 0xFE300000
-
#define ZYNQMP_TCM_BASE_ADDR 0xFFE00000
#define ZYNQMP_TCM_SIZE 0x40000
diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
index 57c0d93aa1bc..e41fec32df31 100644
--- a/board/xilinx/zynqmp/zynqmp.c
+++ b/board/xilinx/zynqmp/zynqmp.c
@@ -548,49 +548,3 @@ int checkboard(void)
puts("Board: Xilinx ZynqMP\n");
return 0;
}
-
-#ifdef CONFIG_USB_DWC3
-static struct dwc3_device dwc3_device_data0 = {
- .maximum_speed = USB_SPEED_HIGH,
- .base = ZYNQMP_USB0_XHCI_BASEADDR,
- .dr_mode = USB_DR_MODE_PERIPHERAL,
- .index = 0,
-};
-
-static struct dwc3_device dwc3_device_data1 = {
- .maximum_speed = USB_SPEED_HIGH,
- .base = ZYNQMP_USB1_XHCI_BASEADDR,
- .dr_mode = USB_DR_MODE_PERIPHERAL,
- .index = 1,
-};
-
-int usb_gadget_handle_interrupts(int index)
-{
- dwc3_uboot_handle_interrupt(index);
- return 0;
-}
-
-int board_usb_init(int index, enum usb_init_type init)
-{
- debug("%s: index %x\n", __func__, index);
-
-#if defined(CONFIG_USB_GADGET_DOWNLOAD)
- g_dnl_set_serialnumber(CONFIG_SYS_CONFIG_NAME);
-#endif
-
- switch (index) {
- case 0:
- return dwc3_uboot_init(&dwc3_device_data0);
- case 1:
- return dwc3_uboot_init(&dwc3_device_data1);
- };
-
- return -1;
-}
-
-int board_usb_cleanup(int index, enum usb_init_type init)
-{
- dwc3_uboot_exit(index);
- return 0;
-}
-#endif
diff --git a/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig b/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
index 3aa39306520f..f5a33342fa64 100644
--- a/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm015_dc1_defconfig
@@ -83,6 +83,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig b/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
index 1bd52ab79124..7f7ee558ee7e 100644
--- a/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm016_dc2_defconfig
@@ -79,6 +79,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig b/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
index e1e7d22a3a62..2add3bafe278 100644
--- a/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
+++ b/configs/xilinx_zynqmp_zc1751_xm017_dc3_defconfig
@@ -75,6 +75,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu100_revC_defconfig b/configs/xilinx_zynqmp_zcu100_revC_defconfig
index 3dd6ae9a0b3b..2a6a5a69cdfe 100644
--- a/configs/xilinx_zynqmp_zcu100_revC_defconfig
+++ b/configs/xilinx_zynqmp_zcu100_revC_defconfig
@@ -73,6 +73,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig b/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
index 0ddec9986697..4cb3959f3626 100644
--- a/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
@@ -93,6 +93,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu102_revA_defconfig b/configs/xilinx_zynqmp_zcu102_revA_defconfig
index 94dc62a61643..e989d1635c30 100644
--- a/configs/xilinx_zynqmp_zcu102_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_revA_defconfig
@@ -91,6 +91,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu102_revB_defconfig b/configs/xilinx_zynqmp_zcu102_revB_defconfig
index 8889f1909ac0..bd67df904a2d 100644
--- a/configs/xilinx_zynqmp_zcu102_revB_defconfig
+++ b/configs/xilinx_zynqmp_zcu102_revB_defconfig
@@ -91,6 +91,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu104_revA_defconfig b/configs/xilinx_zynqmp_zcu104_revA_defconfig
index 3d3d941d375c..a76b9cf54622 100644
--- a/configs/xilinx_zynqmp_zcu104_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu104_revA_defconfig
@@ -84,6 +84,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu104_revC_defconfig b/configs/xilinx_zynqmp_zcu104_revC_defconfig
index 7c22d7f020ed..dcd4897f2fbd 100644
--- a/configs/xilinx_zynqmp_zcu104_revC_defconfig
+++ b/configs/xilinx_zynqmp_zcu104_revC_defconfig
@@ -84,6 +84,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu106_revA_defconfig b/configs/xilinx_zynqmp_zcu106_revA_defconfig
index 017940e98361..a5fa33e366ae 100644
--- a/configs/xilinx_zynqmp_zcu106_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu106_revA_defconfig
@@ -90,6 +90,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/configs/xilinx_zynqmp_zcu111_revA_defconfig b/configs/xilinx_zynqmp_zcu111_revA_defconfig
index 028a7b532844..4d9b91563523 100644
--- a/configs/xilinx_zynqmp_zcu111_revA_defconfig
+++ b/configs/xilinx_zynqmp_zcu111_revA_defconfig
@@ -84,6 +84,7 @@ CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_ZYNQMP=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
diff --git a/include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h b/include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h
index 852c2238de4a..f0ab3f159222 100644
--- a/include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h
+++ b/include/configs/xilinx_zynqmp_zc1751_xm015_dc1.h
@@ -11,7 +11,6 @@
#define CONFIG_ZYNQ_SDHCI0
#define CONFIG_ZYNQ_SDHCI1
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
#include <configs/xilinx_zynqmp.h>
diff --git a/include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h b/include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h
index 2533ab860906..bfebbb3cd197 100644
--- a/include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h
+++ b/include/configs/xilinx_zynqmp_zc1751_xm016_dc2.h
@@ -9,8 +9,6 @@
#ifndef __CONFIG_ZYNQMP_ZC1751_XM016_DC2_H
#define __CONFIG_ZYNQMP_ZC1751_XM016_DC2_H
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB1_XHCI_BASEADDR}
-
#include <configs/xilinx_zynqmp.h>
#endif /* __CONFIG_ZYNQMP_ZC1751_XM016_DC2_H */
diff --git a/include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h b/include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h
index f7d4ab2800c9..bd4a0c3178b8 100644
--- a/include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h
+++ b/include/configs/xilinx_zynqmp_zc1751_xm017_dc3.h
@@ -11,9 +11,6 @@
#define CONFIG_ZYNQ_SDHCI1
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR, \
- ZYNQMP_USB1_XHCI_BASEADDR}
-
#include <configs/xilinx_zynqmp.h>
#endif /* __CONFIG_ZYNQMP_ZC1751_XM017_DC3_H */
diff --git a/include/configs/xilinx_zynqmp_zcu100.h b/include/configs/xilinx_zynqmp_zcu100.h
index 029347da479c..b65d0c1cddd2 100644
--- a/include/configs/xilinx_zynqmp_zcu100.h
+++ b/include/configs/xilinx_zynqmp_zcu100.h
@@ -24,9 +24,6 @@
{0, {{I2C_MUX_PCA9548, 0x75, 7} } }, \
}
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR, \
- ZYNQMP_USB1_XHCI_BASEADDR}
-
#define CONFIG_USB_HOST_ETHER
#define CONFIG_USB_ETHER_ASIX
diff --git a/include/configs/xilinx_zynqmp_zcu102.h b/include/configs/xilinx_zynqmp_zcu102.h
index c61e1b5e27c2..ca11b97c7c4c 100644
--- a/include/configs/xilinx_zynqmp_zcu102.h
+++ b/include/configs/xilinx_zynqmp_zcu102.h
@@ -35,8 +35,6 @@
#define CONFIG_PCA953X
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
-
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
#define CONFIG_ZYNQ_EEPROM_BUS 5
#define CONFIG_ZYNQ_GEM_EEPROM_ADDR 0x54
diff --git a/include/configs/xilinx_zynqmp_zcu104.h b/include/configs/xilinx_zynqmp_zcu104.h
index 8d417f45e014..7e3b9ad7058b 100644
--- a/include/configs/xilinx_zynqmp_zcu104.h
+++ b/include/configs/xilinx_zynqmp_zcu104.h
@@ -26,8 +26,6 @@
#define CONFIG_PCA953X
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
-
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
#include <configs/xilinx_zynqmp.h>
diff --git a/include/configs/xilinx_zynqmp_zcu106.h b/include/configs/xilinx_zynqmp_zcu106.h
index 01ac12a53c17..cc2d145ddd94 100644
--- a/include/configs/xilinx_zynqmp_zcu106.h
+++ b/include/configs/xilinx_zynqmp_zcu106.h
@@ -35,8 +35,6 @@
#define CONFIG_PCA953X
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
-
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
#define CONFIG_ZYNQ_EEPROM_BUS 5
#define CONFIG_ZYNQ_GEM_EEPROM_ADDR 0x54
diff --git a/include/configs/xilinx_zynqmp_zcu111.h b/include/configs/xilinx_zynqmp_zcu111.h
index 3233b379798d..8f8cb4f08707 100644
--- a/include/configs/xilinx_zynqmp_zcu111.h
+++ b/include/configs/xilinx_zynqmp_zcu111.h
@@ -38,8 +38,6 @@
#define CONFIG_PCA953X
-#define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR}
-
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
#define CONFIG_ZYNQ_EEPROM_BUS 5
#define CONFIG_ZYNQ_GEM_EEPROM_ADDR 0x54
--
2.17.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 6/6] usb: xhci: zynqmp: Remove support for !DM_USB
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
` (4 preceding siblings ...)
2018-05-18 11:15 ` [U-Boot] [PATCH v2 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
@ 2018-05-18 11:15 ` Michal Simek
2018-05-18 11:25 ` [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Marek Vasut
6 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-18 11:15 UTC (permalink / raw)
To: u-boot
Switch to DM_USB was done and there is no need to keep !DM_USB code in
tree.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
Changes in v2: None
drivers/usb/host/Kconfig | 1 +
drivers/usb/host/xhci-zynqmp.c | 46 ----------------------------------
scripts/config_whitelist.txt | 1 -
3 files changed, 1 insertion(+), 47 deletions(-)
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 3455e8113bb8..b4dd005651cf 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -75,6 +75,7 @@ config USB_XHCI_STI
config USB_XHCI_ZYNQMP
bool "Support for Xilinx ZynqMP on-chip xHCI USB controller"
depends on ARCH_ZYNQMP
+ depends on DM_USB
help
Enables support for the on-chip xHCI controller on Xilinx ZynqMP SoCs.
diff --git a/drivers/usb/host/xhci-zynqmp.c b/drivers/usb/host/xhci-zynqmp.c
index 526a42a9a58a..e44e1ae1d915 100644
--- a/drivers/usb/host/xhci-zynqmp.c
+++ b/drivers/usb/host/xhci-zynqmp.c
@@ -55,23 +55,15 @@
#define USBOTGSS_IRQ_SET_1_DMADISABLECLR_EN BIT(17)
struct zynqmp_xhci {
-#ifdef CONFIG_DM_USB
struct usb_platdata usb_plat;
-#endif
struct xhci_ctrl ctrl;
struct xhci_hccr *hcd;
struct dwc3 *dwc3_reg;
};
-#ifdef CONFIG_DM_USB
struct zynqmp_xhci_platdata {
fdt_addr_t hcd_base;
};
-#else
-static struct zynqmp_xhci zynqmp_xhci;
-
-unsigned long ctr_addr[] = CONFIG_ZYNQMP_XHCI_LIST;
-#endif
static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
{
@@ -89,42 +81,6 @@ static int zynqmp_xhci_core_init(struct zynqmp_xhci *zynqmp_xhci)
return ret;
}
-#ifndef CONFIG_DM_USB
-int xhci_hcd_init(int index, struct xhci_hccr **hccr, struct xhci_hcor **hcor)
-{
- struct zynqmp_xhci *ctx = &zynqmp_xhci;
- int ret = 0;
- uint32_t hclen;
-
- if (index < 0 || index >= ARRAY_SIZE(ctr_addr))
- return -EINVAL;
-
- ctx->hcd = (struct xhci_hccr *)ctr_addr[index];
- ctx->dwc3_reg = (struct dwc3 *)((void *)ctx->hcd + DWC3_REG_OFFSET);
-
- ret = board_usb_init(index, USB_INIT_HOST);
- if (ret != 0) {
- puts("Failed to initialize board for USB\n");
- return ret;
- }
-
- ret = zynqmp_xhci_core_init(ctx);
- if (ret < 0) {
- puts("Failed to initialize xhci\n");
- return ret;
- }
-
- *hccr = (struct xhci_hccr *)ctx->hcd;
- hclen = HC_LENGTH(xhci_readl(&(*hccr)->cr_capbase));
- *hcor = (struct xhci_hcor *)((uintptr_t) *hccr + hclen);
-
- debug("zynqmp-xhci: init hccr %p and hcor %p hc_length %d\n",
- *hccr, *hcor, hclen);
-
- return ret;
-}
-#endif
-
void xhci_hcd_stop(int index)
{
/*
@@ -135,7 +91,6 @@ void xhci_hcd_stop(int index)
return;
}
-#ifdef CONFIG_DM_USB
static int xhci_usb_probe(struct udevice *dev)
{
struct zynqmp_xhci_platdata *plat = dev_get_platdata(dev);
@@ -189,4 +144,3 @@ U_BOOT_DRIVER(dwc3_generic_host) = {
.priv_auto_alloc_size = sizeof(struct zynqmp_xhci),
.flags = DM_FLAG_ALLOC_PRIV_DMA,
};
-#endif
diff --git a/scripts/config_whitelist.txt b/scripts/config_whitelist.txt
index 71df6dbebde6..bfbdfcfc80ac 100644
--- a/scripts/config_whitelist.txt
+++ b/scripts/config_whitelist.txt
@@ -4782,7 +4782,6 @@ CONFIG_ZLIB
CONFIG_ZLT
CONFIG_ZM7300
CONFIG_ZYNQMP_EEPROM
-CONFIG_ZYNQMP_XHCI_LIST
CONFIG_ZYNQ_EEPROM
CONFIG_ZYNQ_EEPROM_BUS
CONFIG_ZYNQ_GEM_EEPROM_ADDR
--
2.17.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
` (5 preceding siblings ...)
2018-05-18 11:15 ` [U-Boot] [PATCH v2 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
@ 2018-05-18 11:25 ` Marek Vasut
6 siblings, 0 replies; 12+ messages in thread
From: Marek Vasut @ 2018-05-18 11:25 UTC (permalink / raw)
To: u-boot
On 05/18/2018 01:15 PM, Michal Simek wrote:
> Hi,
>
> this patchset is based on unfinished series send to ML 06/13/2017
> by Vignesh
> "[U-Boot] [PATCH v2 00/13] driver model bring-up of dwc3 usb peripheral"
> We have taken some part of this to Xilinx tree and use it for a while
> but it is time to review it and upstream it.
>
> The patchset has 2 patches created by Mugunthan which are a little bit
> fixed.
> dwc3-generic driver was inspired by omap version.
> And the last 3 patches just doing conversion and enable DM_USB for our
> platform.
Applied, although 4/6 had some git am problems with headers.
--
Best regards,
Marek Vasut
^ permalink raw reply [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB
2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
@ 2018-05-18 13:21 ` Jean-Jacques Hiblot
0 siblings, 0 replies; 12+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-18 13:21 UTC (permalink / raw)
To: u-boot
Hi Michal,
I've been trying your series on DRA7 platforms. Thanks for the work.
I have a few comments though.
On 18/05/2018 13:15, Michal Simek wrote:
> From: Mugunthan V N <mugunthanvnm@ti.com>
>
> The patch is preparing dwc3 core for enabling DM_USB with peripheral
> driver with using driver model support.
> The driver will be bound by the DWC3 wrapper driver based on the
> dr_mode device tree entry.
>
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
> (Remove dwc3-omap changes)
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
>
> Changes in v2:
> - Retype dwc->dev in gadget.c to avoid compilation warning
> - Guard udevice with __UBOOT__
> - Move ifdef in core.c to avoid compilation issues for some platforms
> (for example edison)
>
> Origin series here: https://patchwork.ozlabs.org/patch/775108/
>
> - Fix labels as was asked in previous review.
>
> ---
> drivers/usb/dwc3/core.c | 55 +++++++++++++++++++++++++++++++++++++++
> drivers/usb/dwc3/core.h | 6 +++++
> drivers/usb/dwc3/gadget.c | 2 +-
> 3 files changed, 62 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index dbdad22d1134..1ab5cee60969 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -788,3 +788,58 @@ MODULE_ALIAS("platform:dwc3");
> MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
> MODULE_LICENSE("GPL v2");
> MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
> +
> +#ifdef CONFIG_DM_USB
What about having a separate config for device ? like CONFIG_DM_USB_DEV.
This would allow patforms to keep using non-DM USB device and DM USB hosts
> +
> +int dwc3_init(struct dwc3 *dwc)
> +{
> + int ret;
> +
> + dwc3_cache_hwparams(dwc);
> +
> + ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE);
> + if (ret) {
> + dev_err(dwc->dev, "failed to allocate event buffers\n");
> + return -ENOMEM;
> + }
> +
> + ret = dwc3_core_init(dwc);
> + if (ret) {
> + dev_err(dev, "failed to initialize core\n");
> + goto core_fail;
> + }
> +
> + ret = dwc3_event_buffers_setup(dwc);
> + if (ret) {
> + dev_err(dwc->dev, "failed to setup event buffers\n");
> + goto event_fail;
> + }
> +
> + ret = dwc3_core_init_mode(dwc);
> + if (ret)
> + goto mode_fail;
> +
> + return 0;
> +
> +mode_fail:
> + dwc3_event_buffers_cleanup(dwc);
> +
> +event_fail:
> + dwc3_core_exit(dwc);
> +
> +core_fail:
> + dwc3_free_event_buffers(dwc);
> +
> + return ret;
> +}
> +
> +void dwc3_remove(struct dwc3 *dwc)
> +{
> + dwc3_core_exit_mode(dwc);
> + dwc3_event_buffers_cleanup(dwc);
> + dwc3_free_event_buffers(dwc);
> + dwc3_core_exit(dwc);
> + kfree(dwc->mem);
> +}
> +
> +#endif
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index cbe9850a0bda..58fe91dc5131 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -712,7 +712,11 @@ struct dwc3 {
> /* device lock */
> spinlock_t lock;
>
> +#if defined(__UBOOT__) && defined(CONFIG_DM_USB)
> + struct udevice *dev;
> +#else
> struct device *dev;
> +#endif
>
> struct platform_device *xhci;
> struct resource xhci_resources[DWC3_XHCI_RESOURCES_NUM];
> @@ -987,6 +991,8 @@ struct dwc3_gadget_ep_cmd_params {
>
> /* prototypes */
> int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc);
> +int dwc3_init(struct dwc3 *dwc);
> +void dwc3_remove(struct dwc3 *dwc);
>
> #ifdef CONFIG_USB_DWC3_HOST
> int dwc3_host_init(struct dwc3 *dwc);
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index d45fae044c4a..e340cb268fcd 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -2609,7 +2609,7 @@ int dwc3_gadget_init(struct dwc3 *dwc)
> if (ret)
> goto err4;
>
> - ret = usb_add_gadget_udc(dwc->dev, &dwc->gadget);
> + ret = usb_add_gadget_udc((struct device *)dwc->dev, &dwc->gadget);
> if (ret) {
> dev_err(dwc->dev, "failed to register udc\n");
> goto err4;
^ permalink raw reply [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver
2018-05-18 11:15 ` [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
@ 2018-05-18 13:24 ` Jean-Jacques Hiblot
2018-05-18 13:26 ` Jean-Jacques Hiblot
0 siblings, 1 reply; 12+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-18 13:24 UTC (permalink / raw)
To: u-boot
On 18/05/2018 13:15, Michal Simek wrote:
> By enabling BLK by default this is the next driver which needs to get
> support for DM_USB. Adding generic DWC3 glue logic which only
> parse nodes and read device mode. Based on it probe proper
> host/peripheral DWC3 drivers for it.
>
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
>
> Changes in v2:
> - Change style to avoid correct but not nice indentation by using char
> *driver variable (suggested by Marek)
>
> drivers/usb/dwc3/Kconfig | 6 ++
> drivers/usb/dwc3/Makefile | 1 +
> drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++++++++++++++++
> 3 files changed, 164 insertions(+)
> create mode 100644 drivers/usb/dwc3/dwc3-generic.c
>
> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
> index ae7fc1c6304d..943b7630eba4 100644
> --- a/drivers/usb/dwc3/Kconfig
> +++ b/drivers/usb/dwc3/Kconfig
> @@ -37,6 +37,12 @@ config USB_DWC3_OMAP
>
> Say 'Y' here if you have one such device
>
> +config USB_DWC3_GENERIC
> + bool "Xilinx ZynqMP and similar Platforms"
> + depends on DM_USB && USB_DWC3
> + help
> + Some platforms can reuse this DWC3 generic implementation.
> +
> config USB_DWC3_UNIPHIER
> bool "DesignWare USB3 Host Support on UniPhier Platforms"
> depends on ARCH_UNIPHIER && USB_XHCI_DWC3
> diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
> index cd18b8d9ec02..60b5515a67da 100644
> --- a/drivers/usb/dwc3/Makefile
> +++ b/drivers/usb/dwc3/Makefile
> @@ -7,6 +7,7 @@ dwc3-y := core.o
> obj-$(CONFIG_USB_DWC3_GADGET) += gadget.o ep0.o
>
> obj-$(CONFIG_USB_DWC3_OMAP) += dwc3-omap.o
> +obj-$(CONFIG_USB_DWC3_GENERIC) += dwc3-generic.o
> obj-$(CONFIG_USB_DWC3_UNIPHIER) += dwc3-uniphier.o
> obj-$(CONFIG_USB_DWC3_PHY_OMAP) += ti_usb_phy.o
> obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG) += samsung_usb_phy.o
> diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
> new file mode 100644
> index 000000000000..ca63eac3d98e
> --- /dev/null
> +++ b/drivers/usb/dwc3/dwc3-generic.c
> @@ -0,0 +1,157 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Generic DWC3 Glue layer
> + *
> + * Copyright (C) 2016 - 2018 Xilinx, Inc.
> + *
> + * Based on dwc3-omap.c.
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <dm/device-internal.h>
> +#include <dm/lists.h>
> +#include <linux/usb/otg.h>
> +#include <linux/compat.h>
> +#include <linux/usb/ch9.h>
> +#include <linux/usb/gadget.h>
> +#include <malloc.h>
> +#include <usb.h>
> +#include "core.h"
> +#include "gadget.h"
> +#include "linux-compat.h"
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int usb_gadget_handle_interrupts(int index)
> +{
> + struct dwc3 *priv;
> + struct udevice *dev;
> + int ret;
> +
> + ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
> + if (!dev || ret) {
> + pr_err("No USB device found\n");
> + return -ENODEV;
> + }
> +
> + priv = dev_get_priv(dev);
> +
> + dwc3_gadget_uboot_handle_interrupt(priv);
> +
> + return 0;
> +}
> +
> +static int dwc3_generic_peripheral_probe(struct udevice *dev)
> +{
> + struct dwc3 *priv = dev_get_priv(dev);
> +
> + return dwc3_init(priv);
> +}
> +
> +static int dwc3_generic_peripheral_remove(struct udevice *dev)
> +{
> + struct dwc3 *priv = dev_get_priv(dev);
> +
> + dwc3_remove(priv);
> +
> + return 0;
> +}
> +
> +static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice *dev)
> +{
> + struct dwc3 *priv = dev_get_priv(dev);
> + int node = dev_of_offset(dev);
> +
> + priv->regs = (void *)devfdt_get_addr(dev);
> + priv->regs += DWC3_GLOBALS_REGS_START;
> +
> + priv->maximum_speed = usb_get_maximum_speed(node);
> + if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
> + pr_err("Invalid usb maximum speed\n");
> + return -ENODEV;
> + }
> +
> + priv->dr_mode = usb_get_dr_mode(node);
> + if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
> + pr_err("Invalid usb mode setup\n");
> + return -ENODEV;
> + }
> +
> + return 0;
> +}
> +
> +static int dwc3_generic_peripheral_bind(struct udevice *dev)
> +{
> + return device_probe(dev);
This is wrong place to probe the device.
What must be done is to probe the device when it is first used.
I have a patch in progress for this. When it's cleaned up I'll share a
repo so that you can have look and maybe pick it up.
> +}
> +
> +U_BOOT_DRIVER(dwc3_generic_peripheral) = {
> + .name = "dwc3-generic-peripheral",
> + .id = UCLASS_USB_DEV_GENERIC,
> + .ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
> + .probe = dwc3_generic_peripheral_probe,
> + .remove = dwc3_generic_peripheral_remove,
> + .bind = dwc3_generic_peripheral_bind,
> + .platdata_auto_alloc_size = sizeof(struct usb_platdata),
> + .priv_auto_alloc_size = sizeof(struct dwc3),
> + .flags = DM_FLAG_ALLOC_PRIV_DMA,
> +};
> +
> +static int dwc3_generic_bind(struct udevice *parent)
> +{
> + const void *fdt = gd->fdt_blob;
> + int node;
> + int ret;
> +
> + for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node > 0;
> + node = fdt_next_subnode(fdt, node)) {
> + const char *name = fdt_get_name(fdt, node, NULL);
> + enum usb_dr_mode dr_mode;
> + struct udevice *dev;
> + const char *driver;
> +
> + debug("%s: subnode name: %s\n", __func__, name);
> + if (strncmp(name, "dwc3@", 4))
> + continue;
> +
> + dr_mode = usb_get_dr_mode(node);
> +
> + switch (dr_mode) {
> + case USB_DR_MODE_PERIPHERAL:
> + case USB_DR_MODE_OTG:
> + debug("%s: dr_mode: OTG or Peripheral\n", __func__);
> + driver = "dwc3-generic-peripheral";
> + break;
> + case USB_DR_MODE_HOST:
> + debug("%s: dr_mode: HOST\n", __func__);
> + driver = "dwc3-generic-host";
> + break;
> + default:
> + debug("%s: unsupported dr_mode\n", __func__);
> + return -ENODEV;
> + };
> +
> + ret = device_bind_driver_to_node(parent, driver, name,
> + offset_to_ofnode(node), &dev);
> + if (ret) {
> + debug("%s: not able to bind usb device mode\n",
> + __func__);
> + return ret;
> + }
> + }
> +
> + return 0;
> +}
> +
> +static const struct udevice_id dwc3_generic_ids[] = {
> + { .compatible = "xlnx,zynqmp-dwc3" },
> + { }
> +};
> +
> +U_BOOT_DRIVER(dwc3_generic_wrapper) = {
> + .name = "dwc3-generic-wrapper",
> + .id = UCLASS_MISC,
> + .of_match = dwc3_generic_ids,
> + .bind = dwc3_generic_bind,
> +};
^ permalink raw reply [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver
2018-05-18 13:24 ` Jean-Jacques Hiblot
@ 2018-05-18 13:26 ` Jean-Jacques Hiblot
2018-05-21 6:45 ` Michal Simek
0 siblings, 1 reply; 12+ messages in thread
From: Jean-Jacques Hiblot @ 2018-05-18 13:26 UTC (permalink / raw)
To: u-boot
On 18/05/2018 15:24, Jean-Jacques Hiblot wrote:
>
>
> On 18/05/2018 13:15, Michal Simek wrote:
>> By enabling BLK by default this is the next driver which needs to get
>> support for DM_USB. Adding generic DWC3 glue logic which only
>> parse nodes and read device mode. Based on it probe proper
>> host/peripheral DWC3 drivers for it.
>>
>> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
>> ---
>>
>> Changes in v2:
>> - Change style to avoid correct but not nice indentation by using char
>> *driver variable (suggested by Marek)
>>
>> drivers/usb/dwc3/Kconfig | 6 ++
>> drivers/usb/dwc3/Makefile | 1 +
>> drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++++++++++++++++
>> 3 files changed, 164 insertions(+)
>> create mode 100644 drivers/usb/dwc3/dwc3-generic.c
>>
>> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
>> index ae7fc1c6304d..943b7630eba4 100644
>> --- a/drivers/usb/dwc3/Kconfig
>> +++ b/drivers/usb/dwc3/Kconfig
>> @@ -37,6 +37,12 @@ config USB_DWC3_OMAP
>> Say 'Y' here if you have one such device
>> +config USB_DWC3_GENERIC
>> + bool "Xilinx ZynqMP and similar Platforms"
>> + depends on DM_USB && USB_DWC3
>> + help
>> + Some platforms can reuse this DWC3 generic implementation.
>> +
>> config USB_DWC3_UNIPHIER
>> bool "DesignWare USB3 Host Support on UniPhier Platforms"
>> depends on ARCH_UNIPHIER && USB_XHCI_DWC3
>> diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
>> index cd18b8d9ec02..60b5515a67da 100644
>> --- a/drivers/usb/dwc3/Makefile
>> +++ b/drivers/usb/dwc3/Makefile
>> @@ -7,6 +7,7 @@ dwc3-y := core.o
>> obj-$(CONFIG_USB_DWC3_GADGET) += gadget.o ep0.o
>> obj-$(CONFIG_USB_DWC3_OMAP) += dwc3-omap.o
>> +obj-$(CONFIG_USB_DWC3_GENERIC) += dwc3-generic.o
>> obj-$(CONFIG_USB_DWC3_UNIPHIER) += dwc3-uniphier.o
>> obj-$(CONFIG_USB_DWC3_PHY_OMAP) += ti_usb_phy.o
>> obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG) += samsung_usb_phy.o
>> diff --git a/drivers/usb/dwc3/dwc3-generic.c
>> b/drivers/usb/dwc3/dwc3-generic.c
>> new file mode 100644
>> index 000000000000..ca63eac3d98e
>> --- /dev/null
>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>> @@ -0,0 +1,157 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/*
>> + * Generic DWC3 Glue layer
>> + *
>> + * Copyright (C) 2016 - 2018 Xilinx, Inc.
>> + *
>> + * Based on dwc3-omap.c.
>> + */
>> +
>> +#include <common.h>
>> +#include <dm.h>
>> +#include <dm/device-internal.h>
>> +#include <dm/lists.h>
>> +#include <linux/usb/otg.h>
>> +#include <linux/compat.h>
>> +#include <linux/usb/ch9.h>
>> +#include <linux/usb/gadget.h>
>> +#include <malloc.h>
>> +#include <usb.h>
>> +#include "core.h"
>> +#include "gadget.h"
>> +#include "linux-compat.h"
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +int usb_gadget_handle_interrupts(int index)
>> +{
>> + struct dwc3 *priv;
>> + struct udevice *dev;
>> + int ret;
>> +
>> + ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
>> + if (!dev || ret) {
>> + pr_err("No USB device found\n");
>> + return -ENODEV;
>> + }
>> +
>> + priv = dev_get_priv(dev);
>> +
>> + dwc3_gadget_uboot_handle_interrupt(priv);
>> +
>> + return 0;
>> +}
>> +
>> +static int dwc3_generic_peripheral_probe(struct udevice *dev)
>> +{
>> + struct dwc3 *priv = dev_get_priv(dev);
>> +
>> + return dwc3_init(priv);
>> +}
>> +
>> +static int dwc3_generic_peripheral_remove(struct udevice *dev)
>> +{
>> + struct dwc3 *priv = dev_get_priv(dev);
>> +
>> + dwc3_remove(priv);
>> +
>> + return 0;
>> +}
>> +
>> +static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice
>> *dev)
>> +{
>> + struct dwc3 *priv = dev_get_priv(dev);
>> + int node = dev_of_offset(dev);
>> +
>> + priv->regs = (void *)devfdt_get_addr(dev);
>> + priv->regs += DWC3_GLOBALS_REGS_START;
>> +
>> + priv->maximum_speed = usb_get_maximum_speed(node);
>> + if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
>> + pr_err("Invalid usb maximum speed\n");
>> + return -ENODEV;
>> + }
>> +
>> + priv->dr_mode = usb_get_dr_mode(node);
>> + if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
>> + pr_err("Invalid usb mode setup\n");
>> + return -ENODEV;
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static int dwc3_generic_peripheral_bind(struct udevice *dev)
>> +{
>> + return device_probe(dev);
> This is wrong place to probe the device.
> What must be done is to probe the device when it is first used.
> I have a patch in progress for this. When it's cleaned up I'll share a
> repo so that you can have look and maybe pick it up.
Well the series is already applied. I'll send the patch to ML in this case.
>> +}
>> +
>> +U_BOOT_DRIVER(dwc3_generic_peripheral) = {
>> + .name = "dwc3-generic-peripheral",
>> + .id = UCLASS_USB_DEV_GENERIC,
>> + .ofdata_to_platdata = dwc3_generic_peripheral_ofdata_to_platdata,
>> + .probe = dwc3_generic_peripheral_probe,
>> + .remove = dwc3_generic_peripheral_remove,
>> + .bind = dwc3_generic_peripheral_bind,
>> + .platdata_auto_alloc_size = sizeof(struct usb_platdata),
>> + .priv_auto_alloc_size = sizeof(struct dwc3),
>> + .flags = DM_FLAG_ALLOC_PRIV_DMA,
>> +};
>> +
>> +static int dwc3_generic_bind(struct udevice *parent)
>> +{
>> + const void *fdt = gd->fdt_blob;
>> + int node;
>> + int ret;
>> +
>> + for (node = fdt_first_subnode(fdt, dev_of_offset(parent)); node
>> > 0;
>> + node = fdt_next_subnode(fdt, node)) {
>> + const char *name = fdt_get_name(fdt, node, NULL);
>> + enum usb_dr_mode dr_mode;
>> + struct udevice *dev;
>> + const char *driver;
>> +
>> + debug("%s: subnode name: %s\n", __func__, name);
>> + if (strncmp(name, "dwc3@", 4))
>> + continue;
>> +
>> + dr_mode = usb_get_dr_mode(node);
>> +
>> + switch (dr_mode) {
>> + case USB_DR_MODE_PERIPHERAL:
>> + case USB_DR_MODE_OTG:
>> + debug("%s: dr_mode: OTG or Peripheral\n", __func__);
>> + driver = "dwc3-generic-peripheral";
>> + break;
>> + case USB_DR_MODE_HOST:
>> + debug("%s: dr_mode: HOST\n", __func__);
>> + driver = "dwc3-generic-host";
>> + break;
>> + default:
>> + debug("%s: unsupported dr_mode\n", __func__);
>> + return -ENODEV;
>> + };
>> +
>> + ret = device_bind_driver_to_node(parent, driver, name,
>> + offset_to_ofnode(node), &dev);
>> + if (ret) {
>> + debug("%s: not able to bind usb device mode\n",
>> + __func__);
>> + return ret;
>> + }
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static const struct udevice_id dwc3_generic_ids[] = {
>> + { .compatible = "xlnx,zynqmp-dwc3" },
>> + { }
>> +};
>> +
>> +U_BOOT_DRIVER(dwc3_generic_wrapper) = {
>> + .name = "dwc3-generic-wrapper",
>> + .id = UCLASS_MISC,
>> + .of_match = dwc3_generic_ids,
>> + .bind = dwc3_generic_bind,
>> +};
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
^ permalink raw reply [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver
2018-05-18 13:26 ` Jean-Jacques Hiblot
@ 2018-05-21 6:45 ` Michal Simek
0 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-05-21 6:45 UTC (permalink / raw)
To: u-boot
On 18.5.2018 15:26, Jean-Jacques Hiblot wrote:
>
>
> On 18/05/2018 15:24, Jean-Jacques Hiblot wrote:
>>
>>
>> On 18/05/2018 13:15, Michal Simek wrote:
>>> By enabling BLK by default this is the next driver which needs to get
>>> support for DM_USB. Adding generic DWC3 glue logic which only
>>> parse nodes and read device mode. Based on it probe proper
>>> host/peripheral DWC3 drivers for it.
>>>
>>> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
>>> ---
>>>
>>> Changes in v2:
>>> - Change style to avoid correct but not nice indentation by using char
>>> *driver variable (suggested by Marek)
>>>
>>> drivers/usb/dwc3/Kconfig | 6 ++
>>> drivers/usb/dwc3/Makefile | 1 +
>>> drivers/usb/dwc3/dwc3-generic.c | 157 ++++++++++++++++++++++++++++++++
>>> 3 files changed, 164 insertions(+)
>>> create mode 100644 drivers/usb/dwc3/dwc3-generic.c
>>>
>>> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
>>> index ae7fc1c6304d..943b7630eba4 100644
>>> --- a/drivers/usb/dwc3/Kconfig
>>> +++ b/drivers/usb/dwc3/Kconfig
>>> @@ -37,6 +37,12 @@ config USB_DWC3_OMAP
>>> Say 'Y' here if you have one such device
>>> +config USB_DWC3_GENERIC
>>> + bool "Xilinx ZynqMP and similar Platforms"
>>> + depends on DM_USB && USB_DWC3
>>> + help
>>> + Some platforms can reuse this DWC3 generic implementation.
>>> +
>>> config USB_DWC3_UNIPHIER
>>> bool "DesignWare USB3 Host Support on UniPhier Platforms"
>>> depends on ARCH_UNIPHIER && USB_XHCI_DWC3
>>> diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
>>> index cd18b8d9ec02..60b5515a67da 100644
>>> --- a/drivers/usb/dwc3/Makefile
>>> +++ b/drivers/usb/dwc3/Makefile
>>> @@ -7,6 +7,7 @@ dwc3-y := core.o
>>> obj-$(CONFIG_USB_DWC3_GADGET) += gadget.o ep0.o
>>> obj-$(CONFIG_USB_DWC3_OMAP) += dwc3-omap.o
>>> +obj-$(CONFIG_USB_DWC3_GENERIC) += dwc3-generic.o
>>> obj-$(CONFIG_USB_DWC3_UNIPHIER) += dwc3-uniphier.o
>>> obj-$(CONFIG_USB_DWC3_PHY_OMAP) += ti_usb_phy.o
>>> obj-$(CONFIG_USB_DWC3_PHY_SAMSUNG) += samsung_usb_phy.o
>>> diff --git a/drivers/usb/dwc3/dwc3-generic.c
>>> b/drivers/usb/dwc3/dwc3-generic.c
>>> new file mode 100644
>>> index 000000000000..ca63eac3d98e
>>> --- /dev/null
>>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>>> @@ -0,0 +1,157 @@
>>> +// SPDX-License-Identifier: GPL-2.0
>>> +/*
>>> + * Generic DWC3 Glue layer
>>> + *
>>> + * Copyright (C) 2016 - 2018 Xilinx, Inc.
>>> + *
>>> + * Based on dwc3-omap.c.
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <dm.h>
>>> +#include <dm/device-internal.h>
>>> +#include <dm/lists.h>
>>> +#include <linux/usb/otg.h>
>>> +#include <linux/compat.h>
>>> +#include <linux/usb/ch9.h>
>>> +#include <linux/usb/gadget.h>
>>> +#include <malloc.h>
>>> +#include <usb.h>
>>> +#include "core.h"
>>> +#include "gadget.h"
>>> +#include "linux-compat.h"
>>> +
>>> +DECLARE_GLOBAL_DATA_PTR;
>>> +
>>> +int usb_gadget_handle_interrupts(int index)
>>> +{
>>> + struct dwc3 *priv;
>>> + struct udevice *dev;
>>> + int ret;
>>> +
>>> + ret = uclass_first_device(UCLASS_USB_DEV_GENERIC, &dev);
>>> + if (!dev || ret) {
>>> + pr_err("No USB device found\n");
>>> + return -ENODEV;
>>> + }
>>> +
>>> + priv = dev_get_priv(dev);
>>> +
>>> + dwc3_gadget_uboot_handle_interrupt(priv);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int dwc3_generic_peripheral_probe(struct udevice *dev)
>>> +{
>>> + struct dwc3 *priv = dev_get_priv(dev);
>>> +
>>> + return dwc3_init(priv);
>>> +}
>>> +
>>> +static int dwc3_generic_peripheral_remove(struct udevice *dev)
>>> +{
>>> + struct dwc3 *priv = dev_get_priv(dev);
>>> +
>>> + dwc3_remove(priv);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int dwc3_generic_peripheral_ofdata_to_platdata(struct udevice
>>> *dev)
>>> +{
>>> + struct dwc3 *priv = dev_get_priv(dev);
>>> + int node = dev_of_offset(dev);
>>> +
>>> + priv->regs = (void *)devfdt_get_addr(dev);
>>> + priv->regs += DWC3_GLOBALS_REGS_START;
>>> +
>>> + priv->maximum_speed = usb_get_maximum_speed(node);
>>> + if (priv->maximum_speed == USB_SPEED_UNKNOWN) {
>>> + pr_err("Invalid usb maximum speed\n");
>>> + return -ENODEV;
>>> + }
>>> +
>>> + priv->dr_mode = usb_get_dr_mode(node);
>>> + if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
>>> + pr_err("Invalid usb mode setup\n");
>>> + return -ENODEV;
>>> + }
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int dwc3_generic_peripheral_bind(struct udevice *dev)
>>> +{
>>> + return device_probe(dev);
>> This is wrong place to probe the device.
>> What must be done is to probe the device when it is first used.
>> I have a patch in progress for this. When it's cleaned up I'll share a
>> repo so that you can have look and maybe pick it up.
> Well the series is already applied. I'll send the patch to ML in this case.
Yes. Please cc me if you want to test something.
Thanks,
Michal
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2018-05-21 6:45 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-05-18 11:15 [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 1/6] usb: dwc3: Add dwc3_init/remove with DM_USB Michal Simek
2018-05-18 13:21 ` Jean-Jacques Hiblot
2018-05-18 11:15 ` [U-Boot] [PATCH v2 2/6] usb: common: add support to get maximum speed from dt Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 3/6] usb: dwc3: Add generic DWC3 glue logic driver Michal Simek
2018-05-18 13:24 ` Jean-Jacques Hiblot
2018-05-18 13:26 ` Jean-Jacques Hiblot
2018-05-21 6:45 ` Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 4/6] usb: xhci: zynqmp: Add support for DM_USB Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 5/6] arm64: zynqmp: Use DWC3 generic driver and DM_USB Michal Simek
2018-05-18 11:15 ` [U-Boot] [PATCH v2 6/6] usb: xhci: zynqmp: Remove support for !DM_USB Michal Simek
2018-05-18 11:25 ` [U-Boot] [PATCH v2 0/6] Convert Xilinx ZynqMP to DM_USB with generic DWC3 glue logic driver Marek Vasut
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox