struct irq_domain * __init flipper_pic_init(struct device_node *np) { struct device_node *pi; struct irq_domain *irq_domain = NULL; struct resource res; void __iomem *io_base; int retval; pi = of_get_parent(np); if (!pi) { pr_err("no parent found\n"); goto out; } if (!of_device_is_compatible(pi, "nintendo,flipper-pi")) { pr_err("unexpected parent compatible\n"); goto out; } retval = of_address_to_resource(pi, 0, &res); if (retval) { pr_err("no io memory range found\n"); goto out; } io_base = ioremap(res.start, resource_size(&res)); pr_info("controller at 0x%08x mapped to 0x%p\n", res.start, io_base); __flipper_quiesce(io_base); irq_domain = irq_domain_add_linear(np, FLIPPER_NR_IRQS, &flipper_irq_domain_ops, io_base); if (!irq_domain) { pr_err("failed to allocate irq_domain\n"); return NULL; } out: return irq_domain; }
void flipper_quiesce(void) { void __iomem *io_base = flipper_irq_host->host_data; __flipper_quiesce(io_base); }