2023-01-31 15:15:56

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH] xhci: split out rcar/rz support from xhci-plat.c

From: Arnd Bergmann <[email protected]>

The USB_XHCI_RZV2M and USB_RENESAS_USB3 select other drivers
based on the enabled SoC types, which leads to build failures
when the dependencies are not met:

WARNING: unmet direct dependencies detected for USB_RZV2M_USB3DRD
Depends on [n]: USB_SUPPORT [=y] && USB_GADGET [=n] && (ARCH_R9A09G011 [=n] || COMPILE_TEST [=y])
Selected by [m]:
- USB_XHCI_RZV2M [=m] && USB_SUPPORT [=y] && USB [=y] && USB_XHCI_HCD [=m] && USB_XHCI_PLATFORM [=m] && (ARCH_R9A09G011 [=n] || COMPILE_TEST [=y])
ERROR: modpost: "rzv2m_usb3drd_reset" [drivers/usb/host/xhci-plat-hcd.ko] undefined!

The xhci-rcar driver has a reverse dependency with the xhci core, and it
depends on the UDC driver in turn. To untangle this, make the xhci-rcar.ko
driver a standalone module that just calls into the xhci-plat.ko module
like other drivers do.

This allows handling the dependency on the USB_RZV2M_USB3DRD driver to
only affect the xhci-rcar module and simplify the xhci-plat module.

It also allows leaving out the hacks for broken dma mask and nested
devices from the rcar side and keep that only in the generic xhci driver.

As a future cleanup, the marvell and dwc3 specific bits of xhci-plat.c
could be moved out as well, but that is not required for this bugfix.

Fixes: c52c9acc415e ("xhci: host: Add Renesas RZ/V2M SoC support")
Signed-off-by: Arnd Bergmann <[email protected]>
---
drivers/usb/gadget/udc/Kconfig | 4 +-
drivers/usb/host/Kconfig | 9 ++-
drivers/usb/host/Makefile | 11 ++-
drivers/usb/host/xhci-plat.c | 127 +++++++++++++--------------------
drivers/usb/host/xhci-plat.h | 7 ++
drivers/usb/host/xhci-rcar.c | 102 ++++++++++++++++++++++++--
drivers/usb/host/xhci-rcar.h | 55 --------------
7 files changed, 164 insertions(+), 151 deletions(-)
delete mode 100644 drivers/usb/host/xhci-rcar.h

diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig
index 9b7a1681550f..20b477b2a080 100644
--- a/drivers/usb/gadget/udc/Kconfig
+++ b/drivers/usb/gadget/udc/Kconfig
@@ -182,8 +182,6 @@ config USB_RENESAS_USBHS_UDC
config USB_RZV2M_USB3DRD
tristate 'Renesas USB3.1 DRD controller'
depends on ARCH_R9A09G011 || COMPILE_TEST
- default USB_XHCI_RZV2M
- default USB_RENESAS_USB3
help
Renesas USB3.1 DRD controller is a USB DRD controller
that supports both host and device switching.
@@ -194,8 +192,8 @@ config USB_RZV2M_USB3DRD
config USB_RENESAS_USB3
tristate 'Renesas USB3.0 Peripheral controller'
depends on ARCH_RENESAS || COMPILE_TEST
+ depends on USB_RZV2M_USB3DRD || !USB_RZV2M_USB3DRD
depends on EXTCON
- select USB_RZV2M_USB3DRD if ARCH_R9A09G011
select USB_ROLE_SWITCH
help
Renesas USB3.0 Peripheral controller is a USB peripheral controller
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 4b5c5b1feb40..cfcc0685b650 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -53,8 +53,6 @@ config USB_XHCI_PCI_RENESAS

config USB_XHCI_PLATFORM
tristate "Generic xHCI driver for a platform device"
- select USB_XHCI_RCAR if ARCH_RENESAS
- select USB_XHCI_RZV2M if ARCH_R9A09G011
help
Adds an xHCI host driver for a generic platform device, which
provides a memory space and an irq.
@@ -92,15 +90,16 @@ config USB_XHCI_RCAR
tristate "xHCI support for Renesas R-Car SoCs"
depends on USB_XHCI_PLATFORM
depends on ARCH_RENESAS || COMPILE_TEST
+ default ARCH_RENESAS
help
Say 'Y' to enable the support for the xHCI host controller
found in Renesas R-Car ARM SoCs.

config USB_XHCI_RZV2M
- tristate "xHCI support for Renesas RZ/V2M SoC"
- depends on USB_XHCI_PLATFORM
+ bool "xHCI support for Renesas RZ/V2M SoC"
+ depends on USB_XHCI_RCAR
depends on ARCH_R9A09G011 || COMPILE_TEST
- select USB_RZV2M_USB3DRD
+ depends on USB_RZV2M_USB3DRD=y || (USB_RZV2M_USB3DRD=USB_XHCI_RCAR)
help
Say 'Y' to enable the support for the xHCI host controller
found in Renesas RZ/V2M SoC.
diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
index 6b1f9317f116..5a13712f367d 100644
--- a/drivers/usb/host/Makefile
+++ b/drivers/usb/host/Makefile
@@ -25,17 +25,13 @@ xhci-plat-hcd-y := xhci-plat.o
ifneq ($(CONFIG_USB_XHCI_MVEBU), )
xhci-plat-hcd-y += xhci-mvebu.o
endif
-ifneq ($(CONFIG_USB_XHCI_RCAR), )
- xhci-plat-hcd-y += xhci-rcar.o
-endif
-ifneq ($(CONFIG_USB_XHCI_RZV2M), )
- xhci-plat-hcd-y += xhci-rzv2m.o
-endif
-
ifneq ($(CONFIG_DEBUG_FS),)
xhci-hcd-y += xhci-debugfs.o
endif

+xhci-rcar-hcd-y += xhci-rcar.o
+xhci-rcar-hcd-$(CONFIG_USB_XHCI_RZV2M) += xhci-rzv2m.o
+
obj-$(CONFIG_USB_PCI) += pci-quirks.o

obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o
@@ -75,6 +71,7 @@ obj-$(CONFIG_USB_XHCI_PCI) += xhci-pci.o
obj-$(CONFIG_USB_XHCI_PCI_RENESAS) += xhci-pci-renesas.o
obj-$(CONFIG_USB_XHCI_PLATFORM) += xhci-plat-hcd.o
obj-$(CONFIG_USB_XHCI_HISTB) += xhci-histb.o
+obj-$(CONFIG_USB_XHCI_RCAR) += xhci-rcar-hcd.o
obj-$(CONFIG_USB_XHCI_MTK) += xhci-mtk-hcd.o
obj-$(CONFIG_USB_XHCI_TEGRA) += xhci-tegra.o
obj-$(CONFIG_USB_SL811_HCD) += sl811-hcd.o
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index 57269f1f318e..cd17ccab6e00 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -24,8 +24,6 @@
#include "xhci.h"
#include "xhci-plat.h"
#include "xhci-mvebu.h"
-#include "xhci-rcar.h"
-#include "xhci-rzv2m.h"

static struct hc_driver __read_mostly xhci_plat_hc_driver;

@@ -116,21 +114,6 @@ static const struct xhci_plat_priv xhci_plat_marvell_armada3700 = {
.init_quirk = xhci_mvebu_a3700_init_quirk,
};

-static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = {
- SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V1)
-};
-
-static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = {
- SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V3)
-};
-
-static const struct xhci_plat_priv xhci_plat_renesas_rzv2m = {
- .quirks = XHCI_NO_64BIT_SUPPORT | XHCI_TRUST_TX_LENGTH |
- XHCI_SLOW_SUSPEND,
- .init_quirk = xhci_rzv2m_init_quirk,
- .plat_start = xhci_rzv2m_start,
-};
-
static const struct xhci_plat_priv xhci_plat_brcm = {
.quirks = XHCI_RESET_ON_RESUME | XHCI_SUSPEND_RESUME_CLKS,
};
@@ -149,30 +132,6 @@ static const struct of_device_id usb_xhci_of_match[] = {
}, {
.compatible = "marvell,armada3700-xhci",
.data = &xhci_plat_marvell_armada3700,
- }, {
- .compatible = "renesas,xhci-r8a7790",
- .data = &xhci_plat_renesas_rcar_gen2,
- }, {
- .compatible = "renesas,xhci-r8a7791",
- .data = &xhci_plat_renesas_rcar_gen2,
- }, {
- .compatible = "renesas,xhci-r8a7793",
- .data = &xhci_plat_renesas_rcar_gen2,
- }, {
- .compatible = "renesas,xhci-r8a7795",
- .data = &xhci_plat_renesas_rcar_gen3,
- }, {
- .compatible = "renesas,xhci-r8a7796",
- .data = &xhci_plat_renesas_rcar_gen3,
- }, {
- .compatible = "renesas,rcar-gen2-xhci",
- .data = &xhci_plat_renesas_rcar_gen2,
- }, {
- .compatible = "renesas,rcar-gen3-xhci",
- .data = &xhci_plat_renesas_rcar_gen3,
- }, {
- .compatible = "renesas,rzv2m-xhci",
- .data = &xhci_plat_renesas_rzv2m,
}, {
.compatible = "brcm,xhci-brcm-v2",
.data = &xhci_plat_brcm,
@@ -185,11 +144,10 @@ static const struct of_device_id usb_xhci_of_match[] = {
MODULE_DEVICE_TABLE(of, usb_xhci_of_match);
#endif

-static int xhci_plat_probe(struct platform_device *pdev)
+int xhci_plat_probe(struct platform_device *pdev, struct device *sysdev, const struct xhci_plat_priv *priv_match)
{
- const struct xhci_plat_priv *priv_match;
const struct hc_driver *driver;
- struct device *sysdev, *tmpdev;
+ struct device *tmpdev;
struct xhci_hcd *xhci;
struct resource *res;
struct usb_hcd *hcd, *usb3_hcd;
@@ -207,31 +165,10 @@ static int xhci_plat_probe(struct platform_device *pdev)
if (irq < 0)
return irq;

- /*
- * sysdev must point to a device that is known to the system firmware
- * or PCI hardware. We handle these three cases here:
- * 1. xhci_plat comes from firmware
- * 2. xhci_plat is child of a device from firmware (dwc3-plat)
- * 3. xhci_plat is grandchild of a pci device (dwc3-pci)
- */
- for (sysdev = &pdev->dev; sysdev; sysdev = sysdev->parent) {
- if (is_of_node(sysdev->fwnode) ||
- is_acpi_device_node(sysdev->fwnode))
- break;
-#ifdef CONFIG_PCI
- else if (sysdev->bus == &pci_bus_type)
- break;
-#endif
- }
-
if (!sysdev)
sysdev = &pdev->dev;

- if (WARN_ON(!sysdev->dma_mask))
- /* Platform did not initialize dma_mask */
- ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
- else
- ret = dma_set_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
+ ret = dma_set_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
if (ret)
return ret;

@@ -293,11 +230,6 @@ static int xhci_plat_probe(struct platform_device *pdev)
if (ret)
goto disable_reg_clk;

- if (pdev->dev.of_node)
- priv_match = of_device_get_match_data(&pdev->dev);
- else
- priv_match = dev_get_platdata(&pdev->dev);
-
if (priv_match) {
priv = hcd_to_xhci_priv(hcd);
/* Just copy data for now */
@@ -411,8 +343,47 @@ static int xhci_plat_probe(struct platform_device *pdev)

return ret;
}
+EXPORT_SYMBOL_GPL(xhci_plat_probe);
+
+static int xhci_generic_plat_probe(struct platform_device *pdev)
+{
+ const struct xhci_plat_priv *priv_match;
+ struct device *sysdev;
+ int ret;
+
+ /*
+ * sysdev must point to a device that is known to the system firmware
+ * or PCI hardware. We handle these three cases here:
+ * 1. xhci_plat comes from firmware
+ * 2. xhci_plat is child of a device from firmware (dwc3-plat)
+ * 3. xhci_plat is grandchild of a pci device (dwc3-pci)
+ */
+ for (sysdev = &pdev->dev; sysdev; sysdev = sysdev->parent) {
+ if (is_of_node(sysdev->fwnode) ||
+ is_acpi_device_node(sysdev->fwnode))
+ break;
+#ifdef CONFIG_PCI
+ else if (sysdev->bus == &pci_bus_type)
+ break;
+#endif
+ }
+
+ if (WARN_ON(!sysdev->dma_mask)) {
+ /* Platform did not initialize dma_mask */
+ ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
+ if (ret)
+ return ret;
+ }
+
+ if (pdev->dev.of_node)
+ priv_match = of_device_get_match_data(&pdev->dev);
+ else
+ priv_match = dev_get_platdata(&pdev->dev);
+
+ return xhci_plat_probe(pdev, sysdev, priv_match);
+}

-static int xhci_plat_remove(struct platform_device *dev)
+int xhci_plat_remove(struct platform_device *dev)
{
struct usb_hcd *hcd = platform_get_drvdata(dev);
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
@@ -446,6 +417,7 @@ static int xhci_plat_remove(struct platform_device *dev)

return 0;
}
+EXPORT_SYMBOL_GPL(xhci_plat_remove);

static int __maybe_unused xhci_plat_suspend(struct device *dev)
{
@@ -522,13 +494,14 @@ static int __maybe_unused xhci_plat_runtime_resume(struct device *dev)
return xhci_resume(xhci, 0);
}

-static const struct dev_pm_ops xhci_plat_pm_ops = {
+const struct dev_pm_ops xhci_plat_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(xhci_plat_suspend, xhci_plat_resume)

SET_RUNTIME_PM_OPS(xhci_plat_runtime_suspend,
xhci_plat_runtime_resume,
NULL)
};
+EXPORT_SYMBOL_GPL(xhci_plat_pm_ops);

#ifdef CONFIG_ACPI
static const struct acpi_device_id usb_xhci_acpi_match[] = {
@@ -539,8 +512,8 @@ static const struct acpi_device_id usb_xhci_acpi_match[] = {
MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match);
#endif

-static struct platform_driver usb_xhci_driver = {
- .probe = xhci_plat_probe,
+static struct platform_driver usb_generic_xhci_driver = {
+ .probe = xhci_generic_plat_probe,
.remove = xhci_plat_remove,
.shutdown = usb_hcd_platform_shutdown,
.driver = {
@@ -555,13 +528,13 @@ MODULE_ALIAS("platform:xhci-hcd");
static int __init xhci_plat_init(void)
{
xhci_init_driver(&xhci_plat_hc_driver, &xhci_plat_overrides);
- return platform_driver_register(&usb_xhci_driver);
+ return platform_driver_register(&usb_generic_xhci_driver);
}
module_init(xhci_plat_init);

static void __exit xhci_plat_exit(void)
{
- platform_driver_unregister(&usb_xhci_driver);
+ platform_driver_unregister(&usb_generic_xhci_driver);
}
module_exit(xhci_plat_exit);

diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h
index 1fb149d1fbce..83b5b5aa9f8e 100644
--- a/drivers/usb/host/xhci-plat.h
+++ b/drivers/usb/host/xhci-plat.h
@@ -21,4 +21,11 @@ struct xhci_plat_priv {

#define hcd_to_xhci_priv(h) ((struct xhci_plat_priv *)hcd_to_xhci(h)->priv)
#define xhci_to_priv(x) ((struct xhci_plat_priv *)(x)->priv)
+
+int xhci_plat_probe(struct platform_device *pdev, struct device *sysdev,
+ const struct xhci_plat_priv *priv_match);
+
+int xhci_plat_remove(struct platform_device *dev);
+extern const struct dev_pm_ops xhci_plat_pm_ops;
+
#endif /* _XHCI_PLAT_H */
diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c
index aef0258a7160..7f18509a1d39 100644
--- a/drivers/usb/host/xhci-rcar.c
+++ b/drivers/usb/host/xhci-rcar.c
@@ -10,12 +10,17 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
+#include <linux/of_device.h>
#include <linux/usb/phy.h>
#include <linux/sys_soc.h>

#include "xhci.h"
#include "xhci-plat.h"
-#include "xhci-rcar.h"
+#include "xhci-rzv2m.h"
+
+#define XHCI_RCAR_FIRMWARE_NAME_V1 "r8a779x_usb3_v1.dlmem"
+#define XHCI_RCAR_FIRMWARE_NAME_V2 "r8a779x_usb3_v2.dlmem"
+#define XHCI_RCAR_FIRMWARE_NAME_V3 "r8a779x_usb3_v3.dlmem"

/*
* - The V3 firmware is for almost all R-Car Gen3 (except r8a7795 ES1.x)
@@ -108,7 +113,7 @@ static int xhci_rcar_is_gen2(struct device *dev)
of_device_is_compatible(node, "renesas,rcar-gen2-xhci");
}

-void xhci_rcar_start(struct usb_hcd *hcd)
+static void xhci_rcar_start(struct usb_hcd *hcd)
{
u32 temp;

@@ -203,7 +208,7 @@ static bool xhci_rcar_wait_for_pll_active(struct usb_hcd *hcd)
}

/* This function needs to initialize a "phy" of usb before */
-int xhci_rcar_init_quirk(struct usb_hcd *hcd)
+static int xhci_rcar_init_quirk(struct usb_hcd *hcd)
{
/* If hcd->regs is NULL, we don't just call the following function */
if (!hcd->regs)
@@ -215,7 +220,7 @@ int xhci_rcar_init_quirk(struct usb_hcd *hcd)
return xhci_rcar_download_firmware(hcd);
}

-int xhci_rcar_resume_quirk(struct usb_hcd *hcd)
+static int xhci_rcar_resume_quirk(struct usb_hcd *hcd)
{
int ret;

@@ -225,3 +230,92 @@ int xhci_rcar_resume_quirk(struct usb_hcd *hcd)

return ret;
}
+
+/*
+ * On R-Car Gen2 and Gen3, the AC64 bit (bit 0) of HCCPARAMS1 is set
+ * to 1. However, these SoCs don't support 64-bit address memory
+ * pointers. So, this driver clears the AC64 bit of xhci->hcc_params
+ * to call dma_set_coherent_mask(dev, DMA_BIT_MASK(32)) in
+ * xhci_gen_setup() by using the XHCI_NO_64BIT_SUPPORT quirk.
+ *
+ * And, since the firmware/internal CPU control the USBSTS.STS_HALT
+ * and the process speed is down when the roothub port enters U3,
+ * long delay for the handshake of STS_HALT is neeed in xhci_suspend()
+ * by using the XHCI_SLOW_SUSPEND quirk.
+ */
+#define SET_XHCI_PLAT_PRIV_FOR_RCAR(firmware) \
+ .firmware_name = firmware, \
+ .quirks = XHCI_NO_64BIT_SUPPORT | XHCI_TRUST_TX_LENGTH | \
+ XHCI_SLOW_SUSPEND, \
+ .init_quirk = xhci_rcar_init_quirk, \
+ .plat_start = xhci_rcar_start, \
+ .resume_quirk = xhci_rcar_resume_quirk,
+
+static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = {
+ SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V1)
+};
+
+static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = {
+ SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V3)
+};
+
+static const struct xhci_plat_priv xhci_plat_renesas_rzv2m = {
+ .quirks = XHCI_NO_64BIT_SUPPORT | XHCI_TRUST_TX_LENGTH |
+ XHCI_SLOW_SUSPEND,
+ .init_quirk = xhci_rzv2m_init_quirk,
+ .plat_start = xhci_rzv2m_start,
+};
+
+static const struct of_device_id usb_xhci_of_match[] = {
+ {
+ .compatible = "renesas,xhci-r8a7790",
+ .data = &xhci_plat_renesas_rcar_gen2,
+ }, {
+ .compatible = "renesas,xhci-r8a7791",
+ .data = &xhci_plat_renesas_rcar_gen2,
+ }, {
+ .compatible = "renesas,xhci-r8a7793",
+ .data = &xhci_plat_renesas_rcar_gen2,
+ }, {
+ .compatible = "renesas,xhci-r8a7795",
+ .data = &xhci_plat_renesas_rcar_gen3,
+ }, {
+ .compatible = "renesas,xhci-r8a7796",
+ .data = &xhci_plat_renesas_rcar_gen3,
+ }, {
+ .compatible = "renesas,rcar-gen2-xhci",
+ .data = &xhci_plat_renesas_rcar_gen2,
+ }, {
+ .compatible = "renesas,rcar-gen3-xhci",
+ .data = &xhci_plat_renesas_rcar_gen3,
+ }, {
+ .compatible = "renesas,rzv2m-xhci",
+ .data = &xhci_plat_renesas_rzv2m,
+ },
+ { },
+};
+MODULE_DEVICE_TABLE(of, usb_xhci_of_match);
+
+static int xhci_renesas_probe(struct platform_device *pdev)
+{
+ const struct xhci_plat_priv *priv_match;
+
+ priv_match = of_device_get_match_data(&pdev->dev);
+
+ return xhci_plat_probe(pdev, NULL, priv_match);
+}
+
+static struct platform_driver usb_xhci_renesas_driver = {
+ .probe = xhci_renesas_probe,
+ .remove = xhci_plat_remove,
+ .shutdown = usb_hcd_platform_shutdown,
+ .driver = {
+ .name = "xhci-renesas-hcd",
+ .pm = &xhci_plat_pm_ops,
+ .of_match_table = of_match_ptr(usb_xhci_of_match),
+ },
+};
+module_platform_driver(usb_xhci_renesas_driver);
+
+MODULE_DESCRIPTION("xHCI Platform Host Controller Driver for Renesas R-Car and RZ");
+MODULE_LICENSE("GPL");
diff --git a/drivers/usb/host/xhci-rcar.h b/drivers/usb/host/xhci-rcar.h
deleted file mode 100644
index 048ad3b8a6c7..000000000000
--- a/drivers/usb/host/xhci-rcar.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * drivers/usb/host/xhci-rcar.h
- *
- * Copyright (C) 2014 Renesas Electronics Corporation
- */
-
-#ifndef _XHCI_RCAR_H
-#define _XHCI_RCAR_H
-
-#define XHCI_RCAR_FIRMWARE_NAME_V1 "r8a779x_usb3_v1.dlmem"
-#define XHCI_RCAR_FIRMWARE_NAME_V2 "r8a779x_usb3_v2.dlmem"
-#define XHCI_RCAR_FIRMWARE_NAME_V3 "r8a779x_usb3_v3.dlmem"
-
-#if IS_ENABLED(CONFIG_USB_XHCI_RCAR)
-void xhci_rcar_start(struct usb_hcd *hcd);
-int xhci_rcar_init_quirk(struct usb_hcd *hcd);
-int xhci_rcar_resume_quirk(struct usb_hcd *hcd);
-#else
-static inline void xhci_rcar_start(struct usb_hcd *hcd)
-{
-}
-
-static inline int xhci_rcar_init_quirk(struct usb_hcd *hcd)
-{
- return 0;
-}
-
-static inline int xhci_rcar_resume_quirk(struct usb_hcd *hcd)
-{
- return 0;
-}
-#endif
-
-/*
- * On R-Car Gen2 and Gen3, the AC64 bit (bit 0) of HCCPARAMS1 is set
- * to 1. However, these SoCs don't support 64-bit address memory
- * pointers. So, this driver clears the AC64 bit of xhci->hcc_params
- * to call dma_set_coherent_mask(dev, DMA_BIT_MASK(32)) in
- * xhci_gen_setup() by using the XHCI_NO_64BIT_SUPPORT quirk.
- *
- * And, since the firmware/internal CPU control the USBSTS.STS_HALT
- * and the process speed is down when the roothub port enters U3,
- * long delay for the handshake of STS_HALT is neeed in xhci_suspend()
- * by using the XHCI_SLOW_SUSPEND quirk.
- */
-#define SET_XHCI_PLAT_PRIV_FOR_RCAR(firmware) \
- .firmware_name = firmware, \
- .quirks = XHCI_NO_64BIT_SUPPORT | XHCI_TRUST_TX_LENGTH | \
- XHCI_SLOW_SUSPEND, \
- .init_quirk = xhci_rcar_init_quirk, \
- .plat_start = xhci_rcar_start, \
- .resume_quirk = xhci_rcar_resume_quirk,
-
-#endif /* _XHCI_RCAR_H */
--
2.39.0



2023-01-31 15:57:31

by Biju Das

[permalink] [raw]
Subject: RE: [PATCH] xhci: split out rcar/rz support from xhci-plat.c

Hi Arnd,

Thanks for the patch.

> -----Original Message-----
> From: Arnd Bergmann <[email protected]>
> Sent: Tuesday, January 31, 2023 3:05 PM
> To: Greg Kroah-Hartman <[email protected]>; Mathias Nyman
> <[email protected]>; Biju Das <[email protected]>
> Cc: Arnd Bergmann <[email protected]>; Pali Roh?r <[email protected]>; Geert
> Uytterhoeven <[email protected]>; [email protected]; linux-
> [email protected]
> Subject: [PATCH] xhci: split out rcar/rz support from xhci-plat.c
>
> From: Arnd Bergmann <[email protected]>
>
> The USB_XHCI_RZV2M and USB_RENESAS_USB3 select other drivers based on the
> enabled SoC types, which leads to build failures when the dependencies are
> not met:
>
> WARNING: unmet direct dependencies detected for USB_RZV2M_USB3DRD
> Depends on [n]: USB_SUPPORT [=y] && USB_GADGET [=n] && (ARCH_R9A09G011
> [=n] || COMPILE_TEST [=y])
> Selected by [m]:
> - USB_XHCI_RZV2M [=m] && USB_SUPPORT [=y] && USB [=y] && USB_XHCI_HCD [=m]
> && USB_XHCI_PLATFORM [=m] && (ARCH_R9A09G011 [=n] || COMPILE_TEST [=y])
> ERROR: modpost: "rzv2m_usb3drd_reset" [drivers/usb/host/xhci-plat-hcd.ko]
> undefined!
>
> The xhci-rcar driver has a reverse dependency with the xhci core, and it
> depends on the UDC driver in turn. To untangle this, make the xhci-rcar.ko
> driver a standalone module that just calls into the xhci-plat.ko module like
> other drivers do.
>
> This allows handling the dependency on the USB_RZV2M_USB3DRD driver to only
> affect the xhci-rcar module and simplify the xhci-plat module.
>
> It also allows leaving out the hacks for broken dma mask and nested devices
> from the rcar side and keep that only in the generic xhci driver.
>
> As a future cleanup, the marvell and dwc3 specific bits of xhci-plat.c could
> be moved out as well, but that is not required for this bugfix.
>
> Fixes: c52c9acc415e ("xhci: host: Add Renesas RZ/V2M SoC support")
> Signed-off-by: Arnd Bergmann <[email protected]>

I have tested this patch. So,

Tested-by: Biju Das <[email protected]>

Both RZ/G2M and RZ/V2M host functionality verified by read/write test on USB mass storage
device.

RZ/V2M USB3function tested by ping command on host machine.

RZ/G2M USB3 function tested by connecting to RZ/V2M as host machine:

echo ee000000.usb > /sys/bus/platform/drivers/xhci-renesas-hcd/unbind -> remove host driver
modprobe g_serial-> binding to USB2.0 port
modprobe g_mass_storage file=/backing_file--> binding to USB3.0 port
echo 1 > /sys/kernel/debug/usb/ee020000.usb/b_device -> emulate USB3 function as it uses USB3.0 host port.

RZ/G2M USB3 function logs :
root@rzv2m:~# [ 1744.276259] usb 2-1: new SuperSpeed USB device number 3 using xhci-renesas-hcd
[ 1744.303389] usb-storage 2-1:1.0: USB Mass Storage device detected
[ 1744.310182] usb-storage 2-1:1.0: Quirks match for vid 0525 pid a4a5: 10000
[ 1744.320098] scsi host0: usb-storage 2-1:1.0
[ 1745.349349] scsi 0:0:0:0: Direct-Access Linux File-Stor Gadget 0602 PQ: 0 ANSI: 2
[ 1745.365588] sd 0:0:0:0: Power-on or device reset occurred
[ 1745.374441] sd 0:0:0:0: [sda] 2048 512-byte logical blocks: (1.05 MB/1.00 MiB)
[ 1745.497264] sd 0:0:0:0: [sda] Write Protect is off
[ 1745.609251] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 1745.840594] sda: sda1
[ 1745.849103] sd 0:0:0:0: [sda] Attached SCSI disk

Cheers,
Biju

> ---
> drivers/usb/gadget/udc/Kconfig | 4 +-
> drivers/usb/host/Kconfig | 9 ++-
> drivers/usb/host/Makefile | 11 ++-
> drivers/usb/host/xhci-plat.c | 127 +++++++++++++--------------------
> drivers/usb/host/xhci-plat.h | 7 ++
> drivers/usb/host/xhci-rcar.c | 102 ++++++++++++++++++++++++--
> drivers/usb/host/xhci-rcar.h | 55 --------------
> 7 files changed, 164 insertions(+), 151 deletions(-) delete mode 100644
> drivers/usb/host/xhci-rcar.h
>
> diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig
> index 9b7a1681550f..20b477b2a080 100644
> --- a/drivers/usb/gadget/udc/Kconfig
> +++ b/drivers/usb/gadget/udc/Kconfig
> @@ -182,8 +182,6 @@ config USB_RENESAS_USBHS_UDC config USB_RZV2M_USB3DRD
> tristate 'Renesas USB3.1 DRD controller'
> depends on ARCH_R9A09G011 || COMPILE_TEST
> - default USB_XHCI_RZV2M
> - default USB_RENESAS_USB3
> help
> Renesas USB3.1 DRD controller is a USB DRD controller
> that supports both host and device switching.
> @@ -194,8 +192,8 @@ config USB_RZV2M_USB3DRD config USB_RENESAS_USB3
> tristate 'Renesas USB3.0 Peripheral controller'
> depends on ARCH_RENESAS || COMPILE_TEST
> + depends on USB_RZV2M_USB3DRD || !USB_RZV2M_USB3DRD
> depends on EXTCON
> - select USB_RZV2M_USB3DRD if ARCH_R9A09G011
> select USB_ROLE_SWITCH
> help
> Renesas USB3.0 Peripheral controller is a USB peripheral controller
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index
> 4b5c5b1feb40..cfcc0685b650 100644
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -53,8 +53,6 @@ config USB_XHCI_PCI_RENESAS
>
> config USB_XHCI_PLATFORM
> tristate "Generic xHCI driver for a platform device"
> - select USB_XHCI_RCAR if ARCH_RENESAS
> - select USB_XHCI_RZV2M if ARCH_R9A09G011
> help
> Adds an xHCI host driver for a generic platform device, which
> provides a memory space and an irq.
> @@ -92,15 +90,16 @@ config USB_XHCI_RCAR
> tristate "xHCI support for Renesas R-Car SoCs"
> depends on USB_XHCI_PLATFORM
> depends on ARCH_RENESAS || COMPILE_TEST
> + default ARCH_RENESAS
> help
> Say 'Y' to enable the support for the xHCI host controller
> found in Renesas R-Car ARM SoCs.
>
> config USB_XHCI_RZV2M
> - tristate "xHCI support for Renesas RZ/V2M SoC"
> - depends on USB_XHCI_PLATFORM
> + bool "xHCI support for Renesas RZ/V2M SoC"
> + depends on USB_XHCI_RCAR
> depends on ARCH_R9A09G011 || COMPILE_TEST
> - select USB_RZV2M_USB3DRD
> + depends on USB_RZV2M_USB3DRD=y || (USB_RZV2M_USB3DRD=USB_XHCI_RCAR)
> help
> Say 'Y' to enable the support for the xHCI host controller
> found in Renesas RZ/V2M SoC.
> diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index
> 6b1f9317f116..5a13712f367d 100644
> --- a/drivers/usb/host/Makefile
> +++ b/drivers/usb/host/Makefile
> @@ -25,17 +25,13 @@ xhci-plat-hcd-y := xhci-plat.o ifneq
> ($(CONFIG_USB_XHCI_MVEBU), )
> xhci-plat-hcd-y += xhci-mvebu.o
> endif
> -ifneq ($(CONFIG_USB_XHCI_RCAR), )
> - xhci-plat-hcd-y += xhci-rcar.o
> -endif
> -ifneq ($(CONFIG_USB_XHCI_RZV2M), )
> - xhci-plat-hcd-y += xhci-rzv2m.o
> -endif
> -
> ifneq ($(CONFIG_DEBUG_FS),)
> xhci-hcd-y += xhci-debugfs.o
> endif
>
> +xhci-rcar-hcd-y += xhci-rcar.o
> +xhci-rcar-hcd-$(CONFIG_USB_XHCI_RZV2M) += xhci-rzv2m.o
> +
> obj-$(CONFIG_USB_PCI) += pci-quirks.o
>
> obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o
> @@ -75,6 +71,7 @@ obj-$(CONFIG_USB_XHCI_PCI) += xhci-pci.o
> obj-$(CONFIG_USB_XHCI_PCI_RENESAS) += xhci-pci-renesas.o
> obj-$(CONFIG_USB_XHCI_PLATFORM) += xhci-plat-hcd.o
> obj-$(CONFIG_USB_XHCI_HISTB) += xhci-histb.o
> +obj-$(CONFIG_USB_XHCI_RCAR) += xhci-rcar-hcd.o
> obj-$(CONFIG_USB_XHCI_MTK) += xhci-mtk-hcd.o
> obj-$(CONFIG_USB_XHCI_TEGRA) += xhci-tegra.o
> obj-$(CONFIG_USB_SL811_HCD) += sl811-hcd.o
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index 57269f1f318e..cd17ccab6e00 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -24,8 +24,6 @@
> #include "xhci.h"
> #include "xhci-plat.h"
> #include "xhci-mvebu.h"
> -#include "xhci-rcar.h"
> -#include "xhci-rzv2m.h"
>
> static struct hc_driver __read_mostly xhci_plat_hc_driver;
>
> @@ -116,21 +114,6 @@ static const struct xhci_plat_priv
> xhci_plat_marvell_armada3700 = {
> .init_quirk = xhci_mvebu_a3700_init_quirk, };
>
> -static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = {
> - SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V1)
> -};
> -
> -static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = {
> - SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V3)
> -};
> -
> -static const struct xhci_plat_priv xhci_plat_renesas_rzv2m = {
> - .quirks = XHCI_NO_64BIT_SUPPORT | XHCI_TRUST_TX_LENGTH |
> - XHCI_SLOW_SUSPEND,
> - .init_quirk = xhci_rzv2m_init_quirk,
> - .plat_start = xhci_rzv2m_start,
> -};
> -
> static const struct xhci_plat_priv xhci_plat_brcm = {
> .quirks = XHCI_RESET_ON_RESUME | XHCI_SUSPEND_RESUME_CLKS, }; @@ -
> 149,30 +132,6 @@ static const struct of_device_id usb_xhci_of_match[] = {
> }, {
> .compatible = "marvell,armada3700-xhci",
> .data = &xhci_plat_marvell_armada3700,
> - }, {
> - .compatible = "renesas,xhci-r8a7790",
> - .data = &xhci_plat_renesas_rcar_gen2,
> - }, {
> - .compatible = "renesas,xhci-r8a7791",
> - .data = &xhci_plat_renesas_rcar_gen2,
> - }, {
> - .compatible = "renesas,xhci-r8a7793",
> - .data = &xhci_plat_renesas_rcar_gen2,
> - }, {
> - .compatible = "renesas,xhci-r8a7795",
> - .data = &xhci_plat_renesas_rcar_gen3,
> - }, {
> - .compatible = "renesas,xhci-r8a7796",
> - .data = &xhci_plat_renesas_rcar_gen3,
> - }, {
> - .compatible = "renesas,rcar-gen2-xhci",
> - .data = &xhci_plat_renesas_rcar_gen2,
> - }, {
> - .compatible = "renesas,rcar-gen3-xhci",
> - .data = &xhci_plat_renesas_rcar_gen3,
> - }, {
> - .compatible = "renesas,rzv2m-xhci",
> - .data = &xhci_plat_renesas_rzv2m,
> }, {
> .compatible = "brcm,xhci-brcm-v2",
> .data = &xhci_plat_brcm,
> @@ -185,11 +144,10 @@ static const struct of_device_id usb_xhci_of_match[] =
> { MODULE_DEVICE_TABLE(of, usb_xhci_of_match); #endif
>
> -static int xhci_plat_probe(struct platform_device *pdev)
> +int xhci_plat_probe(struct platform_device *pdev, struct device
> +*sysdev, const struct xhci_plat_priv *priv_match)
> {
> - const struct xhci_plat_priv *priv_match;
> const struct hc_driver *driver;
> - struct device *sysdev, *tmpdev;
> + struct device *tmpdev;
> struct xhci_hcd *xhci;
> struct resource *res;
> struct usb_hcd *hcd, *usb3_hcd;
> @@ -207,31 +165,10 @@ static int xhci_plat_probe(struct platform_device
> *pdev)
> if (irq < 0)
> return irq;
>
> - /*
> - * sysdev must point to a device that is known to the system firmware
> - * or PCI hardware. We handle these three cases here:
> - * 1. xhci_plat comes from firmware
> - * 2. xhci_plat is child of a device from firmware (dwc3-plat)
> - * 3. xhci_plat is grandchild of a pci device (dwc3-pci)
> - */
> - for (sysdev = &pdev->dev; sysdev; sysdev = sysdev->parent) {
> - if (is_of_node(sysdev->fwnode) ||
> - is_acpi_device_node(sysdev->fwnode))
> - break;
> -#ifdef CONFIG_PCI
> - else if (sysdev->bus == &pci_bus_type)
> - break;
> -#endif
> - }
> -
> if (!sysdev)
> sysdev = &pdev->dev;
>
> - if (WARN_ON(!sysdev->dma_mask))
> - /* Platform did not initialize dma_mask */
> - ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
> - else
> - ret = dma_set_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
> + ret = dma_set_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
> if (ret)
> return ret;
>
> @@ -293,11 +230,6 @@ static int xhci_plat_probe(struct platform_device
> *pdev)
> if (ret)
> goto disable_reg_clk;
>
> - if (pdev->dev.of_node)
> - priv_match = of_device_get_match_data(&pdev->dev);
> - else
> - priv_match = dev_get_platdata(&pdev->dev);
> -
> if (priv_match) {
> priv = hcd_to_xhci_priv(hcd);
> /* Just copy data for now */
> @@ -411,8 +343,47 @@ static int xhci_plat_probe(struct platform_device
> *pdev)
>
> return ret;
> }
> +EXPORT_SYMBOL_GPL(xhci_plat_probe);
> +
> +static int xhci_generic_plat_probe(struct platform_device *pdev) {
> + const struct xhci_plat_priv *priv_match;
> + struct device *sysdev;
> + int ret;
> +
> + /*
> + * sysdev must point to a device that is known to the system firmware
> + * or PCI hardware. We handle these three cases here:
> + * 1. xhci_plat comes from firmware
> + * 2. xhci_plat is child of a device from firmware (dwc3-plat)
> + * 3. xhci_plat is grandchild of a pci device (dwc3-pci)
> + */
> + for (sysdev = &pdev->dev; sysdev; sysdev = sysdev->parent) {
> + if (is_of_node(sysdev->fwnode) ||
> + is_acpi_device_node(sysdev->fwnode))
> + break;
> +#ifdef CONFIG_PCI
> + else if (sysdev->bus == &pci_bus_type)
> + break;
> +#endif
> + }
> +
> + if (WARN_ON(!sysdev->dma_mask)) {
> + /* Platform did not initialize dma_mask */
> + ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
> + if (ret)
> + return ret;
> + }
> +
> + if (pdev->dev.of_node)
> + priv_match = of_device_get_match_data(&pdev->dev);
> + else
> + priv_match = dev_get_platdata(&pdev->dev);
> +
> + return xhci_plat_probe(pdev, sysdev, priv_match); }
>
> -static int xhci_plat_remove(struct platform_device *dev)
> +int xhci_plat_remove(struct platform_device *dev)
> {
> struct usb_hcd *hcd = platform_get_drvdata(dev);
> struct xhci_hcd *xhci = hcd_to_xhci(hcd);
> @@ -446,6 +417,7 @@ static int xhci_plat_remove(struct platform_device *dev)
>
> return 0;
> }
> +EXPORT_SYMBOL_GPL(xhci_plat_remove);
>
> static int __maybe_unused xhci_plat_suspend(struct device *dev) { @@ -
> 522,13 +494,14 @@ static int __maybe_unused xhci_plat_runtime_resume(struct
> device *dev)
> return xhci_resume(xhci, 0);
> }
>
> -static const struct dev_pm_ops xhci_plat_pm_ops = {
> +const struct dev_pm_ops xhci_plat_pm_ops = {
> SET_SYSTEM_SLEEP_PM_OPS(xhci_plat_suspend, xhci_plat_resume)
>
> SET_RUNTIME_PM_OPS(xhci_plat_runtime_suspend,
> xhci_plat_runtime_resume,
> NULL)
> };
> +EXPORT_SYMBOL_GPL(xhci_plat_pm_ops);
>
> #ifdef CONFIG_ACPI
> static const struct acpi_device_id usb_xhci_acpi_match[] = { @@ -539,8
> +512,8 @@ static const struct acpi_device_id usb_xhci_acpi_match[] = {
> MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); #endif
>
> -static struct platform_driver usb_xhci_driver = {
> - .probe = xhci_plat_probe,
> +static struct platform_driver usb_generic_xhci_driver = {
> + .probe = xhci_generic_plat_probe,
> .remove = xhci_plat_remove,
> .shutdown = usb_hcd_platform_shutdown,
> .driver = {
> @@ -555,13 +528,13 @@ MODULE_ALIAS("platform:xhci-hcd");
> static int __init xhci_plat_init(void)
> {
> xhci_init_driver(&xhci_plat_hc_driver, &xhci_plat_overrides);
> - return platform_driver_register(&usb_xhci_driver);
> + return platform_driver_register(&usb_generic_xhci_driver);
> }
> module_init(xhci_plat_init);
>
> static void __exit xhci_plat_exit(void) {
> - platform_driver_unregister(&usb_xhci_driver);
> + platform_driver_unregister(&usb_generic_xhci_driver);
> }
> module_exit(xhci_plat_exit);
>
> diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h
> index 1fb149d1fbce..83b5b5aa9f8e 100644
> --- a/drivers/usb/host/xhci-plat.h
> +++ b/drivers/usb/host/xhci-plat.h
> @@ -21,4 +21,11 @@ struct xhci_plat_priv {
>
> #define hcd_to_xhci_priv(h) ((struct xhci_plat_priv *)hcd_to_xhci(h)->priv)
> #define xhci_to_priv(x) ((struct xhci_plat_priv *)(x)->priv)
> +
> +int xhci_plat_probe(struct platform_device *pdev, struct device *sysdev,
> + const struct xhci_plat_priv *priv_match);
> +
> +int xhci_plat_remove(struct platform_device *dev); extern const struct
> +dev_pm_ops xhci_plat_pm_ops;
> +
> #endif /* _XHCI_PLAT_H */
> diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c
> index aef0258a7160..7f18509a1d39 100644
> --- a/drivers/usb/host/xhci-rcar.c
> +++ b/drivers/usb/host/xhci-rcar.c
> @@ -10,12 +10,17 @@
> #include <linux/module.h>
> #include <linux/platform_device.h>
> #include <linux/of.h>
> +#include <linux/of_device.h>
> #include <linux/usb/phy.h>
> #include <linux/sys_soc.h>
>
> #include "xhci.h"
> #include "xhci-plat.h"
> -#include "xhci-rcar.h"
> +#include "xhci-rzv2m.h"
> +
> +#define XHCI_RCAR_FIRMWARE_NAME_V1 "r8a779x_usb3_v1.dlmem"
> +#define XHCI_RCAR_FIRMWARE_NAME_V2 "r8a779x_usb3_v2.dlmem"
> +#define XHCI_RCAR_FIRMWARE_NAME_V3 "r8a779x_usb3_v3.dlmem"
>
> /*
> * - The V3 firmware is for almost all R-Car Gen3 (except r8a7795 ES1.x) @@
> -108,7 +113,7 @@ static int xhci_rcar_is_gen2(struct device *dev)
> of_device_is_compatible(node, "renesas,rcar-gen2-xhci"); }
>
> -void xhci_rcar_start(struct usb_hcd *hcd)
> +static void xhci_rcar_start(struct usb_hcd *hcd)
> {
> u32 temp;
>
> @@ -203,7 +208,7 @@ static bool xhci_rcar_wait_for_pll_active(struct usb_hcd
> *hcd) }
>
> /* This function needs to initialize a "phy" of usb before */ -int
> xhci_rcar_init_quirk(struct usb_hcd *hcd)
> +static int xhci_rcar_init_quirk(struct usb_hcd *hcd)
> {
> /* If hcd->regs is NULL, we don't just call the following function */
> if (!hcd->regs)
> @@ -215,7 +220,7 @@ int xhci_rcar_init_quirk(struct usb_hcd *hcd)
> return xhci_rcar_download_firmware(hcd); }
>
> -int xhci_rcar_resume_quirk(struct usb_hcd *hcd)
> +static int xhci_rcar_resume_quirk(struct usb_hcd *hcd)
> {
> int ret;
>
> @@ -225,3 +230,92 @@ int xhci_rcar_resume_quirk(struct usb_hcd *hcd)
>
> return ret;
> }
> +
> +/*
> + * On R-Car Gen2 and Gen3, the AC64 bit (bit 0) of HCCPARAMS1 is set
> + * to 1. However, these SoCs don't support 64-bit address memory
> + * pointers. So, this driver clears the AC64 bit of xhci->hcc_params
> + * to call dma_set_coherent_mask(dev, DMA_BIT_MASK(32)) in
> + * xhci_gen_setup() by using the XHCI_NO_64BIT_SUPPORT quirk.
> + *
> + * And, since the firmware/internal CPU control the USBSTS.STS_HALT
> + * and the process speed is down when the roothub port enters U3,
> + * long delay for the handshake of STS_HALT is neeed in xhci_suspend()
> + * by using the XHCI_SLOW_SUSPEND quirk.
> + */
> +#define SET_XHCI_PLAT_PRIV_FOR_RCAR(firmware) \
> + .firmware_name = firmware, \
> + .quirks = XHCI_NO_64BIT_SUPPORT | XHCI_TRUST_TX_LENGTH | \
> + XHCI_SLOW_SUSPEND, \
> + .init_quirk = xhci_rcar_init_quirk, \
> + .plat_start = xhci_rcar_start, \
> + .resume_quirk = xhci_rcar_resume_quirk,
> +
> +static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = {
> + SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V1)
> +};
> +
> +static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = {
> + SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V3)
> +};
> +
> +static const struct xhci_plat_priv xhci_plat_renesas_rzv2m = {
> + .quirks = XHCI_NO_64BIT_SUPPORT | XHCI_TRUST_TX_LENGTH |
> + XHCI_SLOW_SUSPEND,
> + .init_quirk = xhci_rzv2m_init_quirk,
> + .plat_start = xhci_rzv2m_start,
> +};
> +
> +static const struct of_device_id usb_xhci_of_match[] = {
> + {
> + .compatible = "renesas,xhci-r8a7790",
> + .data = &xhci_plat_renesas_rcar_gen2,
> + }, {
> + .compatible = "renesas,xhci-r8a7791",
> + .data = &xhci_plat_renesas_rcar_gen2,
> + }, {
> + .compatible = "renesas,xhci-r8a7793",
> + .data = &xhci_plat_renesas_rcar_gen2,
> + }, {
> + .compatible = "renesas,xhci-r8a7795",
> + .data = &xhci_plat_renesas_rcar_gen3,
> + }, {
> + .compatible = "renesas,xhci-r8a7796",
> + .data = &xhci_plat_renesas_rcar_gen3,
> + }, {
> + .compatible = "renesas,rcar-gen2-xhci",
> + .data = &xhci_plat_renesas_rcar_gen2,
> + }, {
> + .compatible = "renesas,rcar-gen3-xhci",
> + .data = &xhci_plat_renesas_rcar_gen3,
> + }, {
> + .compatible = "renesas,rzv2m-xhci",
> + .data = &xhci_plat_renesas_rzv2m,
> + },
> + { },
> +};
> +MODULE_DEVICE_TABLE(of, usb_xhci_of_match);
> +
> +static int xhci_renesas_probe(struct platform_device *pdev) {
> + const struct xhci_plat_priv *priv_match;
> +
> + priv_match = of_device_get_match_data(&pdev->dev);
> +
> + return xhci_plat_probe(pdev, NULL, priv_match); }
> +
> +static struct platform_driver usb_xhci_renesas_driver = {
> + .probe = xhci_renesas_probe,
> + .remove = xhci_plat_remove,
> + .shutdown = usb_hcd_platform_shutdown,
> + .driver = {
> + .name = "xhci-renesas-hcd",
> + .pm = &xhci_plat_pm_ops,
> + .of_match_table = of_match_ptr(usb_xhci_of_match),
> + },
> +};
> +module_platform_driver(usb_xhci_renesas_driver);
> +
> +MODULE_DESCRIPTION("xHCI Platform Host Controller Driver for Renesas
> +R-Car and RZ"); MODULE_LICENSE("GPL");
> diff --git a/drivers/usb/host/xhci-rcar.h b/drivers/usb/host/xhci-rcar.h
> deleted file mode 100644 index 048ad3b8a6c7..000000000000
> --- a/drivers/usb/host/xhci-rcar.h
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - * drivers/usb/host/xhci-rcar.h
> - *
> - * Copyright (C) 2014 Renesas Electronics Corporation
> - */
> -
> -#ifndef _XHCI_RCAR_H
> -#define _XHCI_RCAR_H
> -
> -#define XHCI_RCAR_FIRMWARE_NAME_V1 "r8a779x_usb3_v1.dlmem"
> -#define XHCI_RCAR_FIRMWARE_NAME_V2 "r8a779x_usb3_v2.dlmem"
> -#define XHCI_RCAR_FIRMWARE_NAME_V3 "r8a779x_usb3_v3.dlmem"
> -
> -#if IS_ENABLED(CONFIG_USB_XHCI_RCAR)
> -void xhci_rcar_start(struct usb_hcd *hcd); -int xhci_rcar_init_quirk(struct
> usb_hcd *hcd); -int xhci_rcar_resume_quirk(struct usb_hcd *hcd); -#else -
> static inline void xhci_rcar_start(struct usb_hcd *hcd) -{ -}
> -
> -static inline int xhci_rcar_init_quirk(struct usb_hcd *hcd) -{
> - return 0;
> -}
> -
> -static inline int xhci_rcar_resume_quirk(struct usb_hcd *hcd) -{
> - return 0;
> -}
> -#endif
> -
> -/*
> - * On R-Car Gen2 and Gen3, the AC64 bit (bit 0) of HCCPARAMS1 is set
> - * to 1. However, these SoCs don't support 64-bit address memory
> - * pointers. So, this driver clears the AC64 bit of xhci->hcc_params
> - * to call dma_set_coherent_mask(dev, DMA_BIT_MASK(32)) in
> - * xhci_gen_setup() by using the XHCI_NO_64BIT_SUPPORT quirk.
> - *
> - * And, since the firmware/internal CPU control the USBSTS.STS_HALT
> - * and the process speed is down when the roothub port enters U3,
> - * long delay for the handshake of STS_HALT is neeed in xhci_suspend()
> - * by using the XHCI_SLOW_SUSPEND quirk.
> - */
> -#define SET_XHCI_PLAT_PRIV_FOR_RCAR(firmware) \
> - .firmware_name = firmware, \
> - .quirks = XHCI_NO_64BIT_SUPPORT | XHCI_TRUST_TX_LENGTH | \
> - XHCI_SLOW_SUSPEND, \
> - .init_quirk = xhci_rcar_init_quirk, \
> - .plat_start = xhci_rcar_start, \
> - .resume_quirk = xhci_rcar_resume_quirk,
> -
> -#endif /* _XHCI_RCAR_H */
> --
> 2.39.0