|
@@ -82,13 +82,6 @@ void irq_domain_remove(struct irq_domain *domain)
|
|
|
mutex_lock(&irq_domain_mutex);
|
|
|
|
|
|
switch (domain->revmap_type) {
|
|
|
- case IRQ_DOMAIN_MAP_LEGACY:
|
|
|
- /*
|
|
|
- * Legacy domains don't manage their own irq_desc
|
|
|
- * allocations, we expect the caller to handle irq_desc
|
|
|
- * freeing on their own.
|
|
|
- */
|
|
|
- break;
|
|
|
case IRQ_DOMAIN_MAP_TREE:
|
|
|
/*
|
|
|
* radix_tree_delete() takes care of destroying the root
|
|
@@ -122,17 +115,6 @@ void irq_domain_remove(struct irq_domain *domain)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(irq_domain_remove);
|
|
|
|
|
|
-static unsigned int irq_domain_legacy_revmap(struct irq_domain *domain,
|
|
|
- irq_hw_number_t hwirq)
|
|
|
-{
|
|
|
- irq_hw_number_t first_hwirq = domain->revmap_data.legacy.first_hwirq;
|
|
|
- int size = domain->revmap_data.legacy.size;
|
|
|
-
|
|
|
- if (WARN_ON(hwirq < first_hwirq || hwirq >= first_hwirq + size))
|
|
|
- return 0;
|
|
|
- return hwirq - first_hwirq + domain->revmap_data.legacy.first_irq;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* irq_domain_add_simple() - Allocate and register a simple irq_domain.
|
|
|
* @of_node: pointer to interrupt controller's device tree node.
|
|
@@ -213,57 +195,17 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node,
|
|
|
void *host_data)
|
|
|
{
|
|
|
struct irq_domain *domain;
|
|
|
- unsigned int i;
|
|
|
|
|
|
- domain = irq_domain_alloc(of_node, IRQ_DOMAIN_MAP_LEGACY, ops, host_data);
|
|
|
+ pr_debug("Setting up legacy domain virq[%i:%i] ==> hwirq[%i:%i]\n",
|
|
|
+ first_irq, first_irq + size - 1,
|
|
|
+ (int)first_hwirq, (int)first_hwirq + size -1);
|
|
|
+
|
|
|
+ domain = irq_domain_add_linear(of_node, first_hwirq + size, ops, host_data);
|
|
|
if (!domain)
|
|
|
return NULL;
|
|
|
|
|
|
- domain->revmap_data.legacy.first_irq = first_irq;
|
|
|
- domain->revmap_data.legacy.first_hwirq = first_hwirq;
|
|
|
- domain->revmap_data.legacy.size = size;
|
|
|
-
|
|
|
- mutex_lock(&irq_domain_mutex);
|
|
|
- /* Verify that all the irqs are available */
|
|
|
- for (i = 0; i < size; i++) {
|
|
|
- int irq = first_irq + i;
|
|
|
- struct irq_data *irq_data = irq_get_irq_data(irq);
|
|
|
-
|
|
|
- if (WARN_ON(!irq_data || irq_data->domain)) {
|
|
|
- mutex_unlock(&irq_domain_mutex);
|
|
|
- irq_domain_free(domain);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- }
|
|
|
+ WARN_ON(irq_domain_associate_many(domain, first_irq, first_hwirq, size));
|
|
|
|
|
|
- /* Claim all of the irqs before registering a legacy domain */
|
|
|
- for (i = 0; i < size; i++) {
|
|
|
- struct irq_data *irq_data = irq_get_irq_data(first_irq + i);
|
|
|
- irq_data->hwirq = first_hwirq + i;
|
|
|
- irq_data->domain = domain;
|
|
|
- }
|
|
|
- mutex_unlock(&irq_domain_mutex);
|
|
|
-
|
|
|
- for (i = 0; i < size; i++) {
|
|
|
- int irq = first_irq + i;
|
|
|
- int hwirq = first_hwirq + i;
|
|
|
-
|
|
|
- /* IRQ0 gets ignored */
|
|
|
- if (!irq)
|
|
|
- continue;
|
|
|
-
|
|
|
- /* Legacy flags are left to default at this point,
|
|
|
- * one can then use irq_create_mapping() to
|
|
|
- * explicitly change them
|
|
|
- */
|
|
|
- if (ops->map)
|
|
|
- ops->map(domain, irq, hwirq);
|
|
|
-
|
|
|
- /* Clear norequest flags */
|
|
|
- irq_clear_status_flags(irq, IRQ_NOREQUEST);
|
|
|
- }
|
|
|
-
|
|
|
- irq_domain_add(domain);
|
|
|
return domain;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(irq_domain_add_legacy);
|
|
@@ -492,10 +434,6 @@ int irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base,
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
-
|
|
|
- err_unmap:
|
|
|
- irq_domain_disassociate_many(domain, irq_base, i);
|
|
|
- return -EINVAL;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(irq_domain_associate_many);
|
|
|
|
|
@@ -575,10 +513,6 @@ unsigned int irq_create_mapping(struct irq_domain *domain,
|
|
|
return virq;
|
|
|
}
|
|
|
|
|
|
- /* Get a virtual interrupt number */
|
|
|
- if (domain->revmap_type == IRQ_DOMAIN_MAP_LEGACY)
|
|
|
- return irq_domain_legacy_revmap(domain, hwirq);
|
|
|
-
|
|
|
/* Allocate a virtual interrupt number */
|
|
|
hint = hwirq % nr_irqs;
|
|
|
if (hint == 0)
|
|
@@ -706,10 +640,6 @@ void irq_dispose_mapping(unsigned int virq)
|
|
|
if (WARN_ON(domain == NULL))
|
|
|
return;
|
|
|
|
|
|
- /* Never unmap legacy interrupts */
|
|
|
- if (domain->revmap_type == IRQ_DOMAIN_MAP_LEGACY)
|
|
|
- return;
|
|
|
-
|
|
|
irq_domain_disassociate_many(domain, virq, 1);
|
|
|
irq_free_desc(virq);
|
|
|
}
|
|
@@ -732,8 +662,6 @@ unsigned int irq_find_mapping(struct irq_domain *domain,
|
|
|
return 0;
|
|
|
|
|
|
switch (domain->revmap_type) {
|
|
|
- case IRQ_DOMAIN_MAP_LEGACY:
|
|
|
- return irq_domain_legacy_revmap(domain, hwirq);
|
|
|
case IRQ_DOMAIN_MAP_LINEAR:
|
|
|
return irq_linear_revmap(domain, hwirq);
|
|
|
case IRQ_DOMAIN_MAP_TREE:
|