svn commit: r356564 - head/sys/dev/usb/controller

Kyle Evans kevans at FreeBSD.org
Thu Jan 9 19:22:12 UTC 2020


Author: kevans
Date: Thu Jan  9 19:22:11 2020
New Revision: 356564
URL: https://svnweb.freebsd.org/changeset/base/356564

Log:
  dwc_otg: fix fdt attachment for newer bcm2708-usb nodes
  
  The newer versions of RPi FDT flipped the order of the interrupts
  specification and added an 'interrupt-names' property for driver aide in
  finding the correct interrupt, rather than assuming the positions. Use it if
  it's available, or fallback to the old method if there is no interrupt-names
  property with a usb value.
  
  This has been tested with both old RPi3B FDT and new RPi3B FDT, USB again
  works on the latter.
  
  Reported by:	Tom Yan <tom.ty89 gmail com>
  MFC after:	3 days

Modified:
  head/sys/dev/usb/controller/dwc_otg_fdt.c

Modified: head/sys/dev/usb/controller/dwc_otg_fdt.c
==============================================================================
--- head/sys/dev/usb/controller/dwc_otg_fdt.c	Thu Jan  9 19:17:42 2020	(r356563)
+++ head/sys/dev/usb/controller/dwc_otg_fdt.c	Thu Jan  9 19:22:11 2020	(r356564)
@@ -80,6 +80,20 @@ dwc_otg_probe(device_t dev)
 	return (BUS_PROBE_DEFAULT);
 }
 
+static int
+dwc_otg_irq_index(device_t dev, int *rid)
+{
+	int idx, rv;
+	phandle_t node;
+
+	node = ofw_bus_get_node(dev);
+	rv = ofw_bus_find_string_index(node, "interrupt-names", "usb", &idx);
+	if (rv != 0)
+		return (rv);
+	*rid = idx;
+	return (0);
+}
+
 int
 dwc_otg_attach(device_t dev)
 {
@@ -130,10 +144,16 @@ dwc_otg_attach(device_t dev)
 
 
 	/*
-	 * brcm,bcm2708-usb FDT provides two interrupts,
-	 * we need only second one (VC_USB)
+	 * brcm,bcm2708-usb FDT provides two interrupts, we need only the USB
+	 * interrupt (VC_USB).  The latest FDT for it provides an
+	 * interrupt-names property and swapped them around, while older ones
+	 * did not have interrupt-names and put the usb interrupt in the second
+	 * position.  We'll attempt to use interrupt-names first with a fallback
+	 * to the old method of assuming the index based on the compatible
+	 * string.
 	 */
-	rid = ofw_bus_is_compatible(dev, "brcm,bcm2708-usb") ? 1 : 0;
+	if (dwc_otg_irq_index(dev, &rid) != 0)
+		rid = ofw_bus_is_compatible(dev, "brcm,bcm2708-usb") ? 1 : 0;
 	sc->sc_otg.sc_irq_res =
 	    bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE);
 	if (sc->sc_otg.sc_irq_res == NULL)


More information about the svn-src-head mailing list