* [PATCH v2 1/2] usb: host: ehci-xilinx-of: remove the driver
2026-11-06 5:18 [PATCH v2 0/2] usb: host: remove Xilinx XPS USB host controller Radhey Shyam Pandey
@ 2026-11-06 5:18 ` Radhey Shyam Pandey
2026-11-06 5:30 ` sashiko-bot
2026-11-06 5:18 ` [PATCH v2 2/2] dt-bindings: xilinx: Remove description for USB host controller Radhey Shyam Pandey
1 sibling, 1 reply; 7+ messages in thread
From: Radhey Shyam Pandey @ 2026-11-06 5:18 UTC (permalink / raw)
To: robh, krzk+dt, conor+dt, michal.simek, gregkh, stern, saravanak
Cc: devicetree, linux-arm-kernel, linux-kernel, linux-usb,
Radhey Shyam Pandey
The Xilinx XPS USB host controller is legacy soft IP for PPC405 and
MicroBlaze FPGA designs.
This IP core relies on Xilinx Platform Studio (XPS) and the ISE Design
Suite, both of which were discontinued by Xilinx years ago. Furthermore,
modern AMD toolchains (Vivado Design Suite and Vitis) provide no support
for the legacy PLB (Processor Local Bus) architecture used by this core.
As a result, no new hardware designs can be built using this IP.
Nothing in the upstream tree carries its "xlnx,xps-usb-host-1.00.a"
compatible string and no defconfig enables CONFIG_XPS_USB_HCD_XILINX.
The compatible was never documented in a schema binding.
It is also one of the few remaining users of the deprecated glue model
where the .c file is #included into ehci-hcd.c rather than built as its
own object.
Given the complete obsolescence of the supporting hardware development
tools and the lack of upstream users, remove the dead driver.
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Reviewed-by: Michal Simek <michal.simek@amd.com>
Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
---
Changes for v2:
- Add Alan and Michal acked /reviewed tags.
---
drivers/usb/host/Kconfig | 11 --
drivers/usb/host/ehci-hcd.c | 7 -
drivers/usb/host/ehci-xilinx-of.c | 229 ------------------------------
scripts/dtc/dt_to_config | 8 +-
4 files changed, 2 insertions(+), 253 deletions(-)
delete mode 100644 drivers/usb/host/ehci-xilinx-of.c
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 05a88969a6a0..471d203b60a5 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -224,17 +224,6 @@ config USB_EHCI_PORT_SPEED_HOOK
depends on USB_EHCI_ROOT_HUB_TT
# Used for hosts with controller-specific port speed reporting
-config XPS_USB_HCD_XILINX
- bool "Use Xilinx usb host EHCI controller core"
- depends on (PPC32 || MICROBLAZE)
- select USB_EHCI_BIG_ENDIAN_DESC
- select USB_EHCI_BIG_ENDIAN_MMIO
- help
- Xilinx xps USB host controller core is EHCI compliant and has
- transaction translator built-in. It can be configured to either
- support both high speed and full speed devices, or high speed
- devices only.
-
config USB_EHCI_FSL
tristate "Support for Freescale on-chip EHCI USB controller"
select USB_EHCI_ROOT_HUB_TT
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 75f780ec3ba0..7842f8a752d7 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -1331,10 +1331,6 @@ MODULE_LICENSE ("GPL");
#include "ehci-ppc-of.c"
#endif
-#ifdef CONFIG_XPS_USB_HCD_XILINX
-#include "ehci-xilinx-of.c"
-#endif
-
#ifdef CONFIG_SPARC_LEON
#include "ehci-grlib.c"
#endif
@@ -1346,9 +1342,6 @@ static struct platform_driver * const platform_drivers[] = {
#ifdef CONFIG_USB_EHCI_HCD_PPC_OF
&ehci_hcd_ppc_of_driver,
#endif
-#ifdef CONFIG_XPS_USB_HCD_XILINX
- &ehci_hcd_xilinx_of_driver,
-#endif
#ifdef CONFIG_SPARC_LEON
&ehci_grlib_driver,
#endif
diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c
deleted file mode 100644
index 1d16cfefabd7..000000000000
--- a/drivers/usb/host/ehci-xilinx-of.c
+++ /dev/null
@@ -1,229 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * EHCI HCD (Host Controller Driver) for USB.
- *
- * Bus Glue for Xilinx EHCI core on the of_platform bus
- *
- * Copyright (c) 2009 Xilinx, Inc.
- *
- * Based on "ehci-ppc-of.c" by Valentine Barshak <vbarshak@ru.mvista.com>
- * and "ehci-ppc-soc.c" by Stefan Roese <sr@denx.de>
- * and "ohci-ppc-of.c" by Sylvain Munaut <tnt@246tNt.com>
- */
-
-#include <linux/err.h>
-#include <linux/signal.h>
-
-#include <linux/of.h>
-#include <linux/of_platform.h>
-#include <linux/of_address.h>
-#include <linux/of_irq.h>
-
-/**
- * ehci_xilinx_port_handed_over - hand the port out if failed to enable it
- * @hcd: Pointer to the usb_hcd device to which the host controller bound
- * @portnum:Port number to which the device is attached.
- *
- * This function is used as a place to tell the user that the Xilinx USB host
- * controller does support LS devices. And in an HS only configuration, it
- * does not support FS devices either. It is hoped that this can help a
- * confused user.
- *
- * There are cases when the host controller fails to enable the port due to,
- * for example, insufficient power that can be supplied to the device from
- * the USB bus. In those cases, the messages printed here are not helpful.
- *
- * Return: Always return 0
- */
-static int ehci_xilinx_port_handed_over(struct usb_hcd *hcd, int portnum)
-{
- dev_warn(hcd->self.controller, "port %d cannot be enabled\n", portnum);
- if (hcd->has_tt) {
- dev_warn(hcd->self.controller,
- "Maybe you have connected a low speed device?\n");
-
- dev_warn(hcd->self.controller,
- "We do not support low speed devices\n");
- } else {
- dev_warn(hcd->self.controller,
- "Maybe your device is not a high speed device?\n");
- dev_warn(hcd->self.controller,
- "The USB host controller does not support full speed nor low speed devices\n");
- dev_warn(hcd->self.controller,
- "You can reconfigure the host controller to have full speed support\n");
- }
-
- return 0;
-}
-
-
-static const struct hc_driver ehci_xilinx_of_hc_driver = {
- .description = hcd_name,
- .product_desc = "OF EHCI",
- .hcd_priv_size = sizeof(struct ehci_hcd),
-
- /*
- * generic hardware linkage
- */
- .irq = ehci_irq,
- .flags = HCD_MEMORY | HCD_DMA | HCD_USB2 | HCD_BH,
-
- /*
- * basic lifecycle operations
- */
- .reset = ehci_setup,
- .start = ehci_run,
- .stop = ehci_stop,
- .shutdown = ehci_shutdown,
-
- /*
- * managing i/o requests and associated device resources
- */
- .urb_enqueue = ehci_urb_enqueue,
- .urb_dequeue = ehci_urb_dequeue,
- .endpoint_disable = ehci_endpoint_disable,
- .endpoint_reset = ehci_endpoint_reset,
-
- /*
- * scheduling support
- */
- .get_frame_number = ehci_get_frame,
-
- /*
- * root hub support
- */
- .hub_status_data = ehci_hub_status_data,
- .hub_control = ehci_hub_control,
-#ifdef CONFIG_PM
- .bus_suspend = ehci_bus_suspend,
- .bus_resume = ehci_bus_resume,
-#endif
- .relinquish_port = NULL,
- .port_handed_over = ehci_xilinx_port_handed_over,
-
- .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete,
-};
-
-/**
- * ehci_hcd_xilinx_of_probe - Probe method for the USB host controller
- * @op: pointer to the platform_device bound to the host controller
- *
- * This function requests resources and sets up appropriate properties for the
- * host controller. Because the Xilinx USB host controller can be configured
- * as HS only or HS/FS only, it checks the configuration in the device tree
- * entry, and sets an appropriate value for hcd->has_tt.
- *
- * Return: zero on success, negative error code otherwise
- */
-static int ehci_hcd_xilinx_of_probe(struct platform_device *op)
-{
- struct device_node *dn = op->dev.of_node;
- struct usb_hcd *hcd;
- struct ehci_hcd *ehci;
- struct resource res;
- int irq;
- int rv;
- int *value;
-
- if (usb_disabled())
- return -ENODEV;
-
- dev_dbg(&op->dev, "initializing XILINX-OF USB Controller\n");
-
- rv = of_address_to_resource(dn, 0, &res);
- if (rv)
- return rv;
-
- hcd = usb_create_hcd(&ehci_xilinx_of_hc_driver, &op->dev,
- "XILINX-OF USB");
- if (!hcd)
- return -ENOMEM;
-
- hcd->rsrc_start = res.start;
- hcd->rsrc_len = resource_size(&res);
-
- irq = irq_of_parse_and_map(dn, 0);
- if (!irq) {
- dev_err(&op->dev, "%s: irq_of_parse_and_map failed\n",
- __FILE__);
- rv = -EBUSY;
- goto err_irq;
- }
-
- hcd->regs = devm_ioremap_resource(&op->dev, &res);
- if (IS_ERR(hcd->regs)) {
- rv = PTR_ERR(hcd->regs);
- goto err_irq;
- }
-
- ehci = hcd_to_ehci(hcd);
-
- /* This core always has big-endian register interface and uses
- * big-endian memory descriptors.
- */
- ehci->big_endian_mmio = 1;
- ehci->big_endian_desc = 1;
-
- /* Check whether the FS support option is selected in the hardware.
- */
- value = (int *)of_get_property(dn, "xlnx,support-usb-fs", NULL);
- if (value && (*value == 1)) {
- ehci_dbg(ehci, "USB host controller supports FS devices\n");
- hcd->has_tt = 1;
- } else {
- ehci_dbg(ehci,
- "USB host controller is HS only\n");
- hcd->has_tt = 0;
- }
-
- /* Debug registers are at the first 0x100 region
- */
- ehci->caps = hcd->regs + 0x100;
-
- rv = usb_add_hcd(hcd, irq, 0);
- if (rv == 0) {
- device_wakeup_enable(hcd->self.controller);
- return 0;
- }
-
-err_irq:
- usb_put_hcd(hcd);
-
- return rv;
-}
-
-/**
- * ehci_hcd_xilinx_of_remove - shutdown hcd and release resources
- * @op: pointer to platform_device structure that is to be removed
- *
- * Remove the hcd structure, and release resources that has been requested
- * during probe.
- *
- * Return: Always return 0
- */
-static void ehci_hcd_xilinx_of_remove(struct platform_device *op)
-{
- struct usb_hcd *hcd = platform_get_drvdata(op);
-
- dev_dbg(&op->dev, "stopping XILINX-OF USB Controller\n");
-
- usb_remove_hcd(hcd);
-
- usb_put_hcd(hcd);
-}
-
-static const struct of_device_id ehci_hcd_xilinx_of_match[] = {
- {.compatible = "xlnx,xps-usb-host-1.00.a",},
- {},
-};
-MODULE_DEVICE_TABLE(of, ehci_hcd_xilinx_of_match);
-
-static struct platform_driver ehci_hcd_xilinx_of_driver = {
- .probe = ehci_hcd_xilinx_of_probe,
- .remove = ehci_hcd_xilinx_of_remove,
- .shutdown = usb_hcd_platform_shutdown,
- .driver = {
- .name = "xilinx-of-ehci",
- .of_match_table = ehci_hcd_xilinx_of_match,
- },
-};
diff --git a/scripts/dtc/dt_to_config b/scripts/dtc/dt_to_config
index 70d6d5f06bdc..3f9e751a3285 100755
--- a/scripts/dtc/dt_to_config
+++ b/scripts/dtc/dt_to_config
@@ -116,13 +116,12 @@ $num_pr_flags = $pr_flag_pos_config_test_fail + 1;
'hardcoded_no_driver' => ['no_config'],
# drivers/usb/host/ehci-ppc-of.c
- # drivers/usb/host/ehci-xilinx-of.c
- # are included from:
+ # is included from:
# drivers/usb/host/ehci-hcd.c
# thus the search of Makefile for the included .c files is incorrect
# ehci-hcd.c wraps the includes with ifdef CONFIG_USB_EHCI_HCD_..._OF
#
- # similar model for ohci-hcd.c (but no ohci-xilinx-of.c)
+ # similar model for ohci-hcd.c
#
# similarly, uhci-hcd.c includes uhci-platform.c
@@ -131,9 +130,6 @@ $num_pr_flags = $pr_flag_pos_config_test_fail + 1;
'drivers/usb/host/ohci-ppc-of.c' => ['CONFIG_USB_OHCI_HCD',
'CONFIG_USB_OHCI_HCD_PPC_OF'],
- 'drivers/usb/host/ehci-xilinx-of.c' => ['CONFIG_USB_EHCI_HCD',
- 'CONFIG_USB_EHCI_HCD_XILINX'],
-
'drivers/usb/host/uhci-platform.c' => ['CONFIG_USB_UHCI_HCD',
'CONFIG_USB_UHCI_PLATFORM'],
--
2.44.4
^ permalink raw reply related [flat|nested] 7+ messages in thread