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
This commit is contained in:
parent
fae95359ee
commit
98884a9ea9
@ -52,7 +52,8 @@ fdt_intc_decode_ic(phandle_t node, pcell_t *intr, int *interrupt, int *trig,
|
||||
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;
|
||||
|
@ -270,6 +270,7 @@ bcm_intc_map_intr(device_t dev, struct intr_map_data *data,
|
||||
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 intr_map_data *data,
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user