* [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.