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)
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to