Author: gonzo
Date: Tue Oct 11 21:37:34 2016
New Revision: 307067
URL: https://svnweb.freebsd.org/changeset/base/307067

Log:
  Make intc driver compatible with upstream DTS
  
  - Fix compatibility strings
  - Properly decode upstream's two-cell interrupt specs. Our home-made dts
      does not have two-cell interrupts so no need to preserve backward
      compatibility

Modified:
  head/sys/arm/broadcom/bcm2835/bcm2835_common.c
  head/sys/arm/broadcom/bcm2835/bcm2835_intr.c

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_common.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_common.c      Tue Oct 11 20:31:59 
2016        (r307066)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_common.c      Tue Oct 11 21:37:34 
2016        (r307067)
@@ -52,7 +52,8 @@ fdt_intc_decode_ic(phandle_t node, pcell
     int *pol)
 {
 
-       if (fdt_is_compatible(node, "broadcom,bcm2835-armctrl-ic")) {
+       if (fdt_is_compatible(node, "broadcom,bcm2835-armctrl-ic") ||
+           fdt_is_compatible(node, "brcm,bcm2836-armctrl-ic")) {
                *interrupt = fdt32_to_cpu(intr[0]);
                *trig = INTR_TRIGGER_CONFORM;
                *pol = INTR_POLARITY_CONFORM;

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_intr.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_intr.c        Tue Oct 11 20:31:59 
2016        (r307066)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_intr.c        Tue Oct 11 21:37:34 
2016        (r307067)
@@ -270,6 +270,7 @@ bcm_intc_map_intr(device_t dev, struct i
        u_int irq;
        struct intr_map_data_fdt *daf;
        struct bcm_intc_softc *sc;
+       bool valid;
 
        if (data->type != INTR_MAP_DATA_FDT)
                return (ENOTSUP);
@@ -277,8 +278,36 @@ bcm_intc_map_intr(device_t dev, struct i
        daf = (struct intr_map_data_fdt *)data;
        if (daf->ncells == 1)
                irq = daf->cells[0];
-       else if (daf->ncells == 2)
-               irq = daf->cells[0] * 32 + daf->cells[1];
+       else if (daf->ncells == 2) {
+               valid = true;
+               switch (daf->cells[0]) {
+               case 0:
+                       irq = daf->cells[1];
+                       if (irq >= BANK1_START)
+                               valid = false;
+                       break;
+               case 1:
+                       irq = daf->cells[1] + BANK1_START;
+                       if (irq > BANK1_END)
+                               valid = false;
+                       break;
+               case 2:
+                       irq = daf->cells[1] + BANK2_START;
+                       if (irq > BANK2_END)
+                               valid = false;
+                       break;
+               default:
+                       valid = false;
+                       break;
+               }
+
+               if (!valid) {
+                       device_printf(dev,
+                           "invalid IRQ config: bank=%d, irq=%d\n",
+                           daf->cells[0], daf->cells[1]);
+                       return (EINVAL);
+               }
+       }
        else
                return (EINVAL);
 
@@ -355,7 +384,8 @@ bcm_intc_probe(device_t dev)
        if (!ofw_bus_status_okay(dev))
                return (ENXIO);
 
-       if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-armctrl-ic"))
+       if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-armctrl-ic") &&
+           !ofw_bus_is_compatible(dev, "brcm,bcm2836-armctrl-ic"))
                return (ENXIO);
        device_set_desc(dev, "BCM2835 Interrupt Controller");
        return (BUS_PROBE_DEFAULT);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to