static struct device_t * irq_pl192_probe(struct driver_t * drv, struct dtnode_t * n) { struct irq_pl192_pdata_t * pdat; struct irqchip_t * chip; struct device_t * dev; virtual_addr_t virt = phys_to_virt(dt_read_address(n)); u32_t id = (((read32(virt + 0xfec) & 0xff) << 24) | ((read32(virt + 0xfe8) & 0xff) << 16) | ((read32(virt + 0xfe4) & 0xff) << 8) | ((read32(virt + 0xfe0) & 0xff) << 0)); int base = dt_read_int(n, "interrupt-base", -1); int nirq = dt_read_int(n, "interrupt-count", -1); if(((id >> 12) & 0xff) != 0x41 || (id & 0xfff) != 0x192) return NULL; if((base < 0) || (nirq <= 0)) return NULL; pdat = malloc(sizeof(struct irq_pl192_pdata_t)); if(!pdat) return NULL; chip = malloc(sizeof(struct irqchip_t)); if(!chip) { free(pdat); return NULL; } pdat->virt = virt; pdat->base = base; pdat->nirq = nirq; chip->name = alloc_device_name(dt_read_name(n), -1); chip->base = pdat->base; chip->nirq = pdat->nirq; chip->handler = malloc(sizeof(struct irq_handler_t) * pdat->nirq); chip->enable = irq_pl192_enable; chip->disable = irq_pl192_disable; chip->settype = irq_pl192_settype; chip->dispatch = irq_pl192_dispatch; chip->priv = pdat; pl192_ctrl_init(pdat->virt); arm32_interrupt_enable(); if(!register_irqchip(&dev, chip)) { free_device_name(chip->name); free(chip->handler); free(chip->priv); free(chip); return NULL; } dev->driver = drv; return dev; }
static struct device_t * irq_gic400_probe(struct driver_t * drv, struct dtnode_t * n) { struct irq_gic400_pdata_t * pdat; struct irqchip_t * chip; struct device_t * dev; virtual_addr_t virt = phys_to_virt(dt_read_address(n)); int base = dt_read_int(n, "interrupt-base", -1); int nirq = dt_read_int(n, "interrupt-count", -1); if((base < 0) || (nirq <= 0)) return NULL; pdat = malloc(sizeof(struct irq_gic400_pdata_t)); if(!pdat) return NULL; chip = malloc(sizeof(struct irqchip_t)); if(!chip) { free(pdat); return NULL; } pdat->virt = virt; pdat->base = base; pdat->nirq = nirq; chip->name = alloc_device_name(dt_read_name(n), -1); chip->base = pdat->base; chip->nirq = pdat->nirq; chip->handler = malloc(sizeof(struct irq_handler_t) * pdat->nirq); chip->enable = irq_gic400_enable; chip->disable = irq_gic400_disable; chip->settype = irq_gic400_settype; chip->dispatch = irq_gic400_dispatch; chip->priv = pdat; gic400_dist_init(pdat->virt); gic400_cpu_init(pdat->virt); arm32_interrupt_enable(); if(!register_irqchip(&dev, chip)) { free_device_name(chip->name); free(chip->handler); free(chip->priv); free(chip); return NULL; } dev->driver = drv; return dev; }