xhci: split out rcar/rz support from xhci-plat.c
Subsystems (3)
PATCH 1/1 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.
--- 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
drivers/usb/gadget/udc/Kconfig +1 -3
@@ -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
drivers/usb/host/Kconfig +4 -5
@@ -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.
drivers/usb/host/Makefile +4 -7
@@ -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
drivers/usb/host/xhci-plat.c +50 -77
210 lines not on this page · raw message
drivers/usb/host/xhci-plat.h +7 -0
@@ -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 */
drivers/usb/host/xhci-rcar.c +98 -4
134 lines not on this page · raw message
drivers/usb/host/xhci-rcar.h deleted +0 -55
55 lines not on this page · raw message
Signature · 1 line
2.39.0
Hi Arnd,
Thanks for the patch.
Quoted 33 lines
-----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 fromxhci-plat.cFrom: Arnd Bergmann <[email protected]>
The
USB_XHCI_RZV2MandUSB_RENESAS_USB3select 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_USB3DRDdriver to only affect the xhci-rcar module and simplify the xhci-plat module.
Quoted 8 lines
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.ccould 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,
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
Quoted 532 lines
--- 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.hdrivers/usb/gadget/udc/Kconfig +1
-3@@ -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 controllerdrivers/usb/host/Kconfig index renamed from drivers/usb/host/Kconfig +0
-0
4b5c5b1feb40..cfcc0685b650100644drivers/usb/host/Kconfig +4
-5@@ -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.drivers/usb/host/Makefile index renamed from drivers/usb/host/Makefile +0
-0
6b1f9317f116..5a13712f367d100644drivers/usb/host/Makefile +4
-7@@ -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.odrivers/usb/host/xhci-plat.c +0
-17@@ -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[] = {drivers/usb/host/xhci-plat.c +0
-24}, { .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); #endifdrivers/usb/host/xhci-plat.c +4
-30-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);drivers/usb/host/xhci-plat.c +39
-1/* 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_unusedxhci_plat_runtime_resume(struct device *dev)drivers/usb/host/xhci-plat.c +3
-1return 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); #endifdrivers/usb/host/xhci-plat.c +4
-4-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);drivers/usb/host/xhci-plat.h +7
-0@@ -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 */ drivers/usb/host/xhci-rcar.c +96
-4@@ -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");drivers/usb/host/xhci-rcar.h deleted +0
-16@@ -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); -intxhci_rcar_resume_quirk(struct usb_hcd *hcd); -#else - static inline voidxhci_rcar_start(struct usb_hcd *hcd)-{ -}drivers/usb/host/xhci-rcar.h deleted +0
-32- -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