|
@@ -243,14 +243,15 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node,
|
|
|
EXPORT_SYMBOL_GPL(irq_domain_add_legacy);
|
|
|
|
|
|
/**
|
|
|
- * irq_find_matching_fwnode() - Locates a domain for a given fwnode
|
|
|
- * @fwnode: FW descriptor of the interrupt controller
|
|
|
+ * irq_find_matching_fwspec() - Locates a domain for a given fwspec
|
|
|
+ * @fwspec: FW specifier for an interrupt
|
|
|
* @bus_token: domain-specific data
|
|
|
*/
|
|
|
-struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode,
|
|
|
+struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec,
|
|
|
enum irq_domain_bus_token bus_token)
|
|
|
{
|
|
|
struct irq_domain *h, *found = NULL;
|
|
|
+ struct fwnode_handle *fwnode = fwspec->fwnode;
|
|
|
int rc;
|
|
|
|
|
|
/* We might want to match the legacy controller last since
|
|
@@ -264,7 +265,9 @@ struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode,
|
|
|
*/
|
|
|
mutex_lock(&irq_domain_mutex);
|
|
|
list_for_each_entry(h, &irq_domain_list, link) {
|
|
|
- if (h->ops->match)
|
|
|
+ if (h->ops->select && fwspec->param_count)
|
|
|
+ rc = h->ops->select(h, fwspec, bus_token);
|
|
|
+ else if (h->ops->match)
|
|
|
rc = h->ops->match(h, to_of_node(fwnode), bus_token);
|
|
|
else
|
|
|
rc = ((fwnode != NULL) && (h->fwnode == fwnode) &&
|
|
@@ -279,7 +282,7 @@ struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode,
|
|
|
mutex_unlock(&irq_domain_mutex);
|
|
|
return found;
|
|
|
}
|
|
|
-EXPORT_SYMBOL_GPL(irq_find_matching_fwnode);
|
|
|
+EXPORT_SYMBOL_GPL(irq_find_matching_fwspec);
|
|
|
|
|
|
/**
|
|
|
* irq_set_default_host() - Set a "default" irq domain
|
|
@@ -574,11 +577,9 @@ unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec)
|
|
|
int virq;
|
|
|
|
|
|
if (fwspec->fwnode) {
|
|
|
- domain = irq_find_matching_fwnode(fwspec->fwnode,
|
|
|
- DOMAIN_BUS_WIRED);
|
|
|
+ domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_WIRED);
|
|
|
if (!domain)
|
|
|
- domain = irq_find_matching_fwnode(fwspec->fwnode,
|
|
|
- DOMAIN_BUS_ANY);
|
|
|
+ domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_ANY);
|
|
|
} else {
|
|
|
domain = irq_default_domain;
|
|
|
}
|