/** * acpi_irq_get - Lookup an ACPI IRQ resource and use it to initialize resource. * @handle: ACPI device handle * @index: ACPI IRQ resource index to lookup * @res: Linux IRQ resource to initialize * * Description: * Look for the ACPI IRQ resource with the given index and use it to initialize * the given Linux IRQ resource. * * Return: * 0 on success * -EINVAL if an error occurs * -EPROBE_DEFER if the IRQ lookup/conversion failed */ int acpi_irq_get(acpi_handle handle, unsigned int index, struct resource *res) { struct irq_fwspec fwspec; struct irq_domain *domain; unsigned long flags; int rc; rc = acpi_irq_parse_one(handle, index, &fwspec, &flags); if (rc) return rc; domain = irq_find_matching_fwnode(fwspec.fwnode, DOMAIN_BUS_ANY); if (!domain) return -EPROBE_DEFER; rc = irq_create_fwspec_mapping(&fwspec); if (rc <= 0) return -EINVAL; res->start = rc; res->end = rc; res->flags = flags; return 0; }
/** * acpi_register_gsi() - Map a GSI to a linux IRQ number * @dev: device for which IRQ has to be mapped * @gsi: GSI IRQ number * @trigger: trigger type of the GSI number to be mapped * @polarity: polarity of the GSI to be mapped * * Returns: a valid linux IRQ number on success * -EINVAL on failure */ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) { struct irq_fwspec fwspec; if (WARN_ON(!acpi_gsi_domain_id)) { pr_warn("GSI: No registered irqchip, giving up\n"); return -EINVAL; } fwspec.fwnode = acpi_gsi_domain_id; fwspec.param[0] = gsi; fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity); fwspec.param_count = 2; return irq_create_fwspec_mapping(&fwspec); }
static int xgene_gpio_sb_to_irq(struct gpio_chip *gc, u32 gpio) { struct xgene_gpio_sb *priv = gpiochip_get_data(gc); struct irq_fwspec fwspec; if ((gpio < priv->irq_start) || (gpio > HWIRQ_TO_GPIO(priv, priv->nirq))) return -ENXIO; if (gc->parent->of_node) fwspec.fwnode = of_node_to_fwnode(gc->parent->of_node); else fwspec.fwnode = gc->parent->fwnode; fwspec.param_count = 2; fwspec.param[0] = GPIO_TO_HWIRQ(priv, gpio); fwspec.param[1] = IRQ_TYPE_NONE; return irq_create_fwspec_mapping(&fwspec); }