Lines Matching full:domain

28 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base,
31 static void irq_domain_check_hierarchy(struct irq_domain *domain);
62 * identifying an irq domain
65 * @name: Optional user provided domain name
74 * domain struct.
137 struct irq_domain *domain; in __irq_domain_create() local
146 domain = kzalloc_node(struct_size(domain, revmap, size), in __irq_domain_create()
148 if (!domain) in __irq_domain_create()
157 domain->fwnode = fwnode; in __irq_domain_create()
158 domain->name = kstrdup(fwid->name, GFP_KERNEL); in __irq_domain_create()
159 if (!domain->name) { in __irq_domain_create()
160 kfree(domain); in __irq_domain_create()
163 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in __irq_domain_create()
166 domain->fwnode = fwnode; in __irq_domain_create()
167 domain->name = fwid->name; in __irq_domain_create()
181 kfree(domain); in __irq_domain_create()
185 domain->name = strreplace(name, '/', ':'); in __irq_domain_create()
186 domain->fwnode = fwnode; in __irq_domain_create()
187 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in __irq_domain_create()
190 if (!domain->name) { in __irq_domain_create()
193 domain->name = kasprintf(GFP_KERNEL, "unknown-%d", in __irq_domain_create()
195 if (!domain->name) { in __irq_domain_create()
196 kfree(domain); in __irq_domain_create()
199 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in __irq_domain_create()
206 INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL); in __irq_domain_create()
207 domain->ops = ops; in __irq_domain_create()
208 domain->host_data = host_data; in __irq_domain_create()
209 domain->hwirq_max = hwirq_max; in __irq_domain_create()
212 domain->flags |= IRQ_DOMAIN_FLAG_NO_MAP; in __irq_domain_create()
214 domain->revmap_size = size; in __irq_domain_create()
217 * Hierarchical domains use the domain lock of the root domain in __irq_domain_create()
218 * (innermost domain). in __irq_domain_create()
221 * pointer is set to the domain itself so that &domain->root->mutex in __irq_domain_create()
224 mutex_init(&domain->mutex); in __irq_domain_create()
225 domain->root = domain; in __irq_domain_create()
227 irq_domain_check_hierarchy(domain); in __irq_domain_create()
229 return domain; in __irq_domain_create()
232 static void __irq_domain_publish(struct irq_domain *domain) in __irq_domain_publish() argument
235 debugfs_add_domain_dir(domain); in __irq_domain_publish()
236 list_add(&domain->link, &irq_domain_list); in __irq_domain_publish()
239 pr_debug("Added domain %s\n", domain->name); in __irq_domain_publish()
249 * @ops: domain callbacks
253 * Returns pointer to IRQ domain, or NULL on failure.
260 struct irq_domain *domain; in __irq_domain_add() local
262 domain = __irq_domain_create(fwnode, size, hwirq_max, direct_max, in __irq_domain_add()
264 if (domain) in __irq_domain_add()
265 __irq_domain_publish(domain); in __irq_domain_add()
267 return domain; in __irq_domain_add()
272 * irq_domain_remove() - Remove an irq domain.
273 * @domain: domain to remove
275 * This routine is used to remove an irq domain. The caller must ensure
276 * that all mappings within the domain have been disposed of prior to
279 void irq_domain_remove(struct irq_domain *domain) in irq_domain_remove() argument
282 debugfs_remove_domain_dir(domain); in irq_domain_remove()
284 WARN_ON(!radix_tree_empty(&domain->revmap_tree)); in irq_domain_remove()
286 list_del(&domain->link); in irq_domain_remove()
289 * If the going away domain is the default one, reset it. in irq_domain_remove()
291 if (unlikely(irq_default_domain == domain)) in irq_domain_remove()
296 pr_debug("Removed domain %s\n", domain->name); in irq_domain_remove()
298 fwnode_dev_initialized(domain->fwnode, false); in irq_domain_remove()
299 fwnode_handle_put(domain->fwnode); in irq_domain_remove()
300 if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED) in irq_domain_remove()
301 kfree(domain->name); in irq_domain_remove()
302 kfree(domain); in irq_domain_remove()
306 void irq_domain_update_bus_token(struct irq_domain *domain, in irq_domain_update_bus_token() argument
311 if (domain->bus_token == bus_token) in irq_domain_update_bus_token()
316 domain->bus_token = bus_token; in irq_domain_update_bus_token()
318 name = kasprintf(GFP_KERNEL, "%s-%d", domain->name, bus_token); in irq_domain_update_bus_token()
324 debugfs_remove_domain_dir(domain); in irq_domain_update_bus_token()
326 if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED) in irq_domain_update_bus_token()
327 kfree(domain->name); in irq_domain_update_bus_token()
329 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in irq_domain_update_bus_token()
331 domain->name = name; in irq_domain_update_bus_token()
332 debugfs_add_domain_dir(domain); in irq_domain_update_bus_token()
342 * @first_irq: first number of irq block assigned to the domain,
344 * pre-map all of the irqs in the domain to virqs starting at first_irq.
345 * @ops: domain callbacks
362 struct irq_domain *domain; in irq_domain_create_simple() local
364 domain = __irq_domain_add(fwnode, size, size, 0, ops, host_data); in irq_domain_create_simple()
365 if (!domain) in irq_domain_create_simple()
377 irq_domain_associate_many(domain, first_irq, 0, size); in irq_domain_create_simple()
380 return domain; in irq_domain_create_simple()
388 * @first_irq: first number of irq block assigned to the domain
392 * @ops: map/unmap domain callbacks
418 struct irq_domain *domain; in irq_domain_create_legacy() local
420 domain = __irq_domain_add(fwnode, first_hwirq + size, first_hwirq + size, 0, ops, host_data); in irq_domain_create_legacy()
421 if (domain) in irq_domain_create_legacy()
422 irq_domain_associate_many(domain, first_irq, first_hwirq, size); in irq_domain_create_legacy()
424 return domain; in irq_domain_create_legacy()
429 * irq_find_matching_fwspec() - Locates a domain for a given fwspec
431 * @bus_token: domain-specific data
445 * bus_token == DOMAIN_BUS_ANY matches any domain, any other in irq_find_matching_fwspec()
446 * values must generate an exact match for the domain to be in irq_find_matching_fwspec()
471 * irq_set_default_host() - Set a "default" irq domain
472 * @domain: default domain pointer
474 * For convenience, it's possible to set a "default" domain that will be used
479 void irq_set_default_host(struct irq_domain *domain) in irq_set_default_host() argument
481 pr_debug("Default domain set to @0x%p\n", domain); in irq_set_default_host()
483 irq_default_domain = domain; in irq_set_default_host()
488 * irq_get_default_host() - Retrieve the "default" irq domain
490 * Returns: the default domain, if any.
502 static bool irq_domain_is_nomap(struct irq_domain *domain) in irq_domain_is_nomap() argument
505 (domain->flags & IRQ_DOMAIN_FLAG_NO_MAP); in irq_domain_is_nomap()
508 static void irq_domain_clear_mapping(struct irq_domain *domain, in irq_domain_clear_mapping() argument
511 lockdep_assert_held(&domain->root->mutex); in irq_domain_clear_mapping()
513 if (irq_domain_is_nomap(domain)) in irq_domain_clear_mapping()
516 if (hwirq < domain->revmap_size) in irq_domain_clear_mapping()
517 rcu_assign_pointer(domain->revmap[hwirq], NULL); in irq_domain_clear_mapping()
519 radix_tree_delete(&domain->revmap_tree, hwirq); in irq_domain_clear_mapping()
522 static void irq_domain_set_mapping(struct irq_domain *domain, in irq_domain_set_mapping() argument
528 * called from irq_domain_insert_irq() for each domain in a hierarchy. in irq_domain_set_mapping()
530 lockdep_assert_held(&domain->root->mutex); in irq_domain_set_mapping()
532 if (irq_domain_is_nomap(domain)) in irq_domain_set_mapping()
535 if (hwirq < domain->revmap_size) in irq_domain_set_mapping()
536 rcu_assign_pointer(domain->revmap[hwirq], irq_data); in irq_domain_set_mapping()
538 radix_tree_insert(&domain->revmap_tree, hwirq, irq_data); in irq_domain_set_mapping()
541 static void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq) in irq_domain_disassociate() argument
546 if (WARN(!irq_data || irq_data->domain != domain, in irq_domain_disassociate()
552 mutex_lock(&domain->root->mutex); in irq_domain_disassociate()
563 if (domain->ops->unmap) in irq_domain_disassociate()
564 domain->ops->unmap(domain, irq); in irq_domain_disassociate()
567 irq_data->domain = NULL; in irq_domain_disassociate()
569 domain->mapcount--; in irq_domain_disassociate()
572 irq_domain_clear_mapping(domain, hwirq); in irq_domain_disassociate()
574 mutex_unlock(&domain->root->mutex); in irq_domain_disassociate()
577 static int irq_domain_associate_locked(struct irq_domain *domain, unsigned int virq, in irq_domain_associate_locked() argument
583 if (WARN(hwirq >= domain->hwirq_max, in irq_domain_associate_locked()
584 "error: hwirq 0x%x is too large for %s\n", (int)hwirq, domain->name)) in irq_domain_associate_locked()
588 if (WARN(irq_data->domain, "error: virq%i is already associated", virq)) in irq_domain_associate_locked()
592 irq_data->domain = domain; in irq_domain_associate_locked()
593 if (domain->ops->map) { in irq_domain_associate_locked()
594 ret = domain->ops->map(domain, virq, hwirq); in irq_domain_associate_locked()
603 domain->name, hwirq, virq, ret); in irq_domain_associate_locked()
605 irq_data->domain = NULL; in irq_domain_associate_locked()
611 domain->mapcount++; in irq_domain_associate_locked()
612 irq_domain_set_mapping(domain, hwirq, irq_data); in irq_domain_associate_locked()
619 int irq_domain_associate(struct irq_domain *domain, unsigned int virq, in irq_domain_associate() argument
624 mutex_lock(&domain->root->mutex); in irq_domain_associate()
625 ret = irq_domain_associate_locked(domain, virq, hwirq); in irq_domain_associate()
626 mutex_unlock(&domain->root->mutex); in irq_domain_associate()
632 void irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base, in irq_domain_associate_many() argument
638 of_node = irq_domain_get_of_node(domain); in irq_domain_associate_many()
643 irq_domain_associate(domain, irq_base + i, hwirq_base + i); in irq_domain_associate_many()
650 * @domain: domain to allocate the irq for or NULL for default domain
658 unsigned int irq_create_direct_mapping(struct irq_domain *domain) in irq_create_direct_mapping() argument
663 if (domain == NULL) in irq_create_direct_mapping()
664 domain = irq_default_domain; in irq_create_direct_mapping()
666 of_node = irq_domain_get_of_node(domain); in irq_create_direct_mapping()
672 if (virq >= domain->hwirq_max) { in irq_create_direct_mapping()
674 domain->hwirq_max); in irq_create_direct_mapping()
680 if (irq_domain_associate(domain, virq, virq)) { in irq_create_direct_mapping()
690 static unsigned int irq_create_mapping_affinity_locked(struct irq_domain *domain, in irq_create_mapping_affinity_locked() argument
694 struct device_node *of_node = irq_domain_get_of_node(domain); in irq_create_mapping_affinity_locked()
697 pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq); in irq_create_mapping_affinity_locked()
707 if (irq_domain_associate_locked(domain, virq, hwirq)) { in irq_create_mapping_affinity_locked()
712 pr_debug("irq %lu on domain %s mapped to virtual irq %u\n", in irq_create_mapping_affinity_locked()
720 * @domain: domain owning this hardware interrupt or NULL for default domain
721 * @hwirq: hardware irq number in that domain space
729 unsigned int irq_create_mapping_affinity(struct irq_domain *domain, in irq_create_mapping_affinity() argument
735 /* Look for default domain if necessary */ in irq_create_mapping_affinity()
736 if (domain == NULL) in irq_create_mapping_affinity()
737 domain = irq_default_domain; in irq_create_mapping_affinity()
738 if (domain == NULL) { in irq_create_mapping_affinity()
739 WARN(1, "%s(, %lx) called with NULL domain\n", __func__, hwirq); in irq_create_mapping_affinity()
743 mutex_lock(&domain->root->mutex); in irq_create_mapping_affinity()
746 virq = irq_find_mapping(domain, hwirq); in irq_create_mapping_affinity()
752 virq = irq_create_mapping_affinity_locked(domain, hwirq, affinity); in irq_create_mapping_affinity()
754 mutex_unlock(&domain->root->mutex); in irq_create_mapping_affinity()
773 /* If domain has no translation, then we assume interrupt line */ in irq_domain_translate()
793 struct irq_domain *domain; in irq_create_fwspec_mapping() local
800 domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_WIRED); in irq_create_fwspec_mapping()
801 if (!domain) in irq_create_fwspec_mapping()
802 domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_ANY); in irq_create_fwspec_mapping()
804 domain = irq_default_domain; in irq_create_fwspec_mapping()
807 if (!domain) { in irq_create_fwspec_mapping()
808 pr_warn("no irq domain found for %s !\n", in irq_create_fwspec_mapping()
813 if (irq_domain_translate(domain, fwspec, &hwirq, &type)) in irq_create_fwspec_mapping()
823 mutex_lock(&domain->root->mutex); in irq_create_fwspec_mapping()
829 virq = irq_find_mapping(domain, hwirq); in irq_create_fwspec_mapping()
860 if (irq_domain_is_hierarchy(domain)) { in irq_create_fwspec_mapping()
861 virq = irq_domain_alloc_irqs_locked(domain, -1, 1, NUMA_NO_NODE, in irq_create_fwspec_mapping()
869 virq = irq_create_mapping_affinity_locked(domain, hwirq, NULL); in irq_create_fwspec_mapping()
883 mutex_unlock(&domain->root->mutex); in irq_create_fwspec_mapping()
907 struct irq_domain *domain; in irq_dispose_mapping() local
912 domain = irq_data->domain; in irq_dispose_mapping()
913 if (WARN_ON(domain == NULL)) in irq_dispose_mapping()
916 if (irq_domain_is_hierarchy(domain)) { in irq_dispose_mapping()
919 irq_domain_disassociate(domain, virq); in irq_dispose_mapping()
927 * @domain: domain owning this hardware interrupt
928 * @hwirq: hardware irq number in that domain space
933 struct irq_desc *__irq_resolve_mapping(struct irq_domain *domain, in __irq_resolve_mapping() argument
940 /* Look for default domain if necessary */ in __irq_resolve_mapping()
941 if (domain == NULL) in __irq_resolve_mapping()
942 domain = irq_default_domain; in __irq_resolve_mapping()
943 if (domain == NULL) in __irq_resolve_mapping()
946 if (irq_domain_is_nomap(domain)) { in __irq_resolve_mapping()
947 if (hwirq < domain->hwirq_max) { in __irq_resolve_mapping()
948 data = irq_domain_get_irq_data(domain, hwirq); in __irq_resolve_mapping()
960 if (hwirq < domain->revmap_size) in __irq_resolve_mapping()
961 data = rcu_dereference(domain->revmap[hwirq]); in __irq_resolve_mapping()
963 data = radix_tree_lookup(&domain->revmap_tree, hwirq); in __irq_resolve_mapping()
1120 * @parent: Parent irq domain to associate with the new domain
1121 * @flags: Irq domain flags associated to the domain
1122 * @size: Size of the domain. See below
1124 * @ops: Pointer to the interrupt domain callbacks
1127 * If @size is 0 a tree domain is created, otherwise a linear domain.
1129 * If successful the parent is associated to the new domain and the
1130 * domain flags are set.
1131 * Returns pointer to IRQ domain, or NULL on failure.
1140 struct irq_domain *domain; in irq_domain_create_hierarchy() local
1143 domain = __irq_domain_create(fwnode, size, size, 0, ops, host_data); in irq_domain_create_hierarchy()
1145 domain = __irq_domain_create(fwnode, 0, ~0, 0, ops, host_data); in irq_domain_create_hierarchy()
1147 if (domain) { in irq_domain_create_hierarchy()
1149 domain->root = parent->root; in irq_domain_create_hierarchy()
1150 domain->parent = parent; in irq_domain_create_hierarchy()
1151 domain->flags |= flags; in irq_domain_create_hierarchy()
1153 __irq_domain_publish(domain); in irq_domain_create_hierarchy()
1156 return domain; in irq_domain_create_hierarchy()
1165 struct irq_domain *domain = data->domain; in irq_domain_insert_irq() local
1167 domain->mapcount++; in irq_domain_insert_irq()
1168 irq_domain_set_mapping(domain, data->hwirq, data); in irq_domain_insert_irq()
1184 struct irq_domain *domain = data->domain; in irq_domain_remove_irq() local
1187 domain->mapcount--; in irq_domain_remove_irq()
1188 irq_domain_clear_mapping(domain, hwirq); in irq_domain_remove_irq()
1192 static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, in irq_domain_insert_irq_data() argument
1203 irq_data->domain = domain; in irq_domain_insert_irq_data()
1229 irq_data->domain = NULL; in irq_domain_free_irq_data()
1237 * @domain: IRQ domain from which the hierarchy is to be disconnected
1240 * Marks the @virq level belonging to @domain as disconnected.
1242 * to @domain.
1248 int irq_domain_disconnect_hierarchy(struct irq_domain *domain, in irq_domain_disconnect_hierarchy() argument
1253 irqd = irq_domain_get_irq_data(domain, virq); in irq_domain_disconnect_hierarchy()
1300 virq, tail->parent_data->domain->name); in irq_domain_trim_hierarchy()
1311 static int irq_domain_alloc_irq_data(struct irq_domain *domain, in irq_domain_alloc_irq_data() argument
1321 irq_data->domain = domain; in irq_domain_alloc_irq_data()
1323 for (parent = domain->parent; parent; parent = parent->parent) { in irq_domain_alloc_irq_data()
1336 * irq_domain_get_irq_data - Get irq_data associated with @virq and @domain
1337 * @domain: domain to match
1340 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1347 if (irq_data->domain == domain) in irq_domain_get_irq_data()
1355 * irq_domain_set_hwirq_and_chip - Set hwirq and irqchip of @virq at @domain
1356 * @domain: Interrupt domain to match
1362 int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, unsigned int virq, in irq_domain_set_hwirq_and_chip() argument
1367 struct irq_data *irq_data = irq_domain_get_irq_data(domain, virq); in irq_domain_set_hwirq_and_chip()
1381 * irq_domain_set_info - Set the complete data for a @virq in @domain
1382 * @domain: Interrupt domain to match
1391 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
1396 irq_domain_set_hwirq_and_chip(domain, virq, hwirq, chip, chip_data); in irq_domain_set_info()
1404 * @domain: Interrupt domain to match
1408 void irq_domain_free_irqs_common(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_common() argument
1415 irq_data = irq_domain_get_irq_data(domain, virq + i); in irq_domain_free_irqs_common()
1419 irq_domain_free_irqs_parent(domain, virq, nr_irqs); in irq_domain_free_irqs_common()
1425 * @domain: Interrupt domain to match
1429 void irq_domain_free_irqs_top(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_top() argument
1438 irq_domain_free_irqs_common(domain, virq, nr_irqs); in irq_domain_free_irqs_top()
1441 static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain, in irq_domain_free_irqs_hierarchy() argument
1447 if (!domain->ops->free) in irq_domain_free_irqs_hierarchy()
1451 if (irq_domain_get_irq_data(domain, irq_base + i)) in irq_domain_free_irqs_hierarchy()
1452 domain->ops->free(domain, irq_base + i, 1); in irq_domain_free_irqs_hierarchy()
1456 int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain, in irq_domain_alloc_irqs_hierarchy() argument
1460 if (!domain->ops->alloc) { in irq_domain_alloc_irqs_hierarchy()
1461 pr_debug("domain->ops->alloc() is NULL\n"); in irq_domain_alloc_irqs_hierarchy()
1465 return domain->ops->alloc(domain, irq_base, nr_irqs, arg); in irq_domain_alloc_irqs_hierarchy()
1468 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, in irq_domain_alloc_irqs_locked() argument
1486 if (irq_domain_alloc_irq_data(domain, virq, nr_irqs)) { in irq_domain_alloc_irqs_locked()
1492 ret = irq_domain_alloc_irqs_hierarchy(domain, virq, nr_irqs, arg); in irq_domain_alloc_irqs_locked()
1515 * __irq_domain_alloc_irqs - Allocate IRQs from domain
1516 * @domain: domain to allocate from
1520 * @arg: domain specific argument
1536 int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base, in __irq_domain_alloc_irqs() argument
1542 if (domain == NULL) { in __irq_domain_alloc_irqs()
1543 domain = irq_default_domain; in __irq_domain_alloc_irqs()
1544 if (WARN(!domain, "domain is NULL; cannot allocate IRQ\n")) in __irq_domain_alloc_irqs()
1548 mutex_lock(&domain->root->mutex); in __irq_domain_alloc_irqs()
1549 ret = irq_domain_alloc_irqs_locked(domain, irq_base, nr_irqs, node, arg, in __irq_domain_alloc_irqs()
1551 mutex_unlock(&domain->root->mutex); in __irq_domain_alloc_irqs()
1562 lockdep_assert_held(&d->domain->root->mutex); in irq_domain_fix_revmap()
1564 if (irq_domain_is_nomap(d->domain)) in irq_domain_fix_revmap()
1568 if (d->hwirq < d->domain->revmap_size) { in irq_domain_fix_revmap()
1570 rcu_assign_pointer(d->domain->revmap[d->hwirq], d); in irq_domain_fix_revmap()
1572 slot = radix_tree_lookup_slot(&d->domain->revmap_tree, d->hwirq); in irq_domain_fix_revmap()
1574 radix_tree_replace_slot(&d->domain->revmap_tree, slot, d); in irq_domain_fix_revmap()
1579 * irq_domain_push_irq() - Push a domain in to the top of a hierarchy.
1580 * @domain: Domain to push.
1581 * @virq: Irq to push the domain in to.
1585 * via a call to pci_enable_msix(), add an additional domain to the
1589 int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg) in irq_domain_push_irq() argument
1611 if (domain == NULL) in irq_domain_push_irq()
1614 if (WARN_ON(!irq_domain_is_hierarchy(domain))) in irq_domain_push_irq()
1620 if (domain->parent != irq_data->domain) in irq_domain_push_irq()
1628 mutex_lock(&domain->root->mutex); in irq_domain_push_irq()
1635 * values for this domain. in irq_domain_push_irq()
1638 irq_data->domain = domain; in irq_domain_push_irq()
1645 rv = irq_domain_alloc_irqs_hierarchy(domain, virq, 1, arg); in irq_domain_push_irq()
1654 irq_domain_set_mapping(domain, irq_data->hwirq, irq_data); in irq_domain_push_irq()
1656 mutex_unlock(&domain->root->mutex); in irq_domain_push_irq()
1663 * irq_domain_pop_irq() - Remove a domain from the top of a hierarchy.
1664 * @domain: Domain to remove.
1665 * @virq: Irq to remove the domain from.
1670 int irq_domain_pop_irq(struct irq_domain *domain, int virq) in irq_domain_pop_irq() argument
1692 if (domain == NULL) in irq_domain_pop_irq()
1698 tmp_irq_data = irq_domain_get_irq_data(domain, virq); in irq_domain_pop_irq()
1700 /* We can only "pop" if this domain is at the top of the list */ in irq_domain_pop_irq()
1704 if (WARN_ON(irq_data->domain != domain)) in irq_domain_pop_irq()
1711 mutex_lock(&domain->root->mutex); in irq_domain_pop_irq()
1715 irq_domain_clear_mapping(domain, irq_data->hwirq); in irq_domain_pop_irq()
1716 irq_domain_free_irqs_hierarchy(domain, virq, 1); in irq_domain_pop_irq()
1723 mutex_unlock(&domain->root->mutex); in irq_domain_pop_irq()
1739 struct irq_domain *domain; in irq_domain_free_irqs() local
1742 if (WARN(!data || !data->domain || !data->domain->ops->free, in irq_domain_free_irqs()
1746 domain = data->domain; in irq_domain_free_irqs()
1748 mutex_lock(&domain->root->mutex); in irq_domain_free_irqs()
1751 irq_domain_free_irqs_hierarchy(domain, virq, nr_irqs); in irq_domain_free_irqs()
1752 mutex_unlock(&domain->root->mutex); in irq_domain_free_irqs()
1759 * irq_domain_alloc_irqs_parent - Allocate interrupts from parent domain
1760 * @domain: Domain below which interrupts must be allocated
1763 * @arg: Allocation data (arch/domain specific)
1765 int irq_domain_alloc_irqs_parent(struct irq_domain *domain, in irq_domain_alloc_irqs_parent() argument
1769 if (!domain->parent) in irq_domain_alloc_irqs_parent()
1772 return irq_domain_alloc_irqs_hierarchy(domain->parent, irq_base, in irq_domain_alloc_irqs_parent()
1778 * irq_domain_free_irqs_parent - Free interrupts from parent domain
1779 * @domain: Domain below which interrupts must be freed
1783 void irq_domain_free_irqs_parent(struct irq_domain *domain, in irq_domain_free_irqs_parent() argument
1786 if (!domain->parent) in irq_domain_free_irqs_parent()
1789 irq_domain_free_irqs_hierarchy(domain->parent, irq_base, nr_irqs); in irq_domain_free_irqs_parent()
1795 if (irq_data && irq_data->domain) { in __irq_domain_deactivate_irq()
1796 struct irq_domain *domain = irq_data->domain; in __irq_domain_deactivate_irq() local
1798 if (domain->ops->deactivate) in __irq_domain_deactivate_irq()
1799 domain->ops->deactivate(domain, irq_data); in __irq_domain_deactivate_irq()
1809 if (irqd && irqd->domain) { in __irq_domain_activate_irq()
1810 struct irq_domain *domain = irqd->domain; in __irq_domain_activate_irq() local
1815 if (!ret && domain->ops->activate) { in __irq_domain_activate_irq()
1816 ret = domain->ops->activate(domain, irqd, reserve); in __irq_domain_activate_irq()
1861 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument
1864 if (domain->ops->alloc) in irq_domain_check_hierarchy()
1865 domain->flags |= IRQ_DOMAIN_FLAG_HIERARCHY; in irq_domain_check_hierarchy()
1869 * irq_domain_get_irq_data - Get irq_data associated with @virq and @domain
1870 * @domain: domain to match
1873 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1878 return (irq_data && irq_data->domain == domain) ? irq_data : NULL; in irq_domain_get_irq_data()
1883 * irq_domain_set_info - Set the complete data for a @virq in @domain
1884 * @domain: Interrupt domain to match
1893 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
1903 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, in irq_domain_alloc_irqs_locked() argument
1910 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument
1941 /* Default domain? Might be NULL */ in irq_domain_debug_show()