|
@@ -1346,6 +1346,30 @@ void irq_domain_free_irqs_parent(struct irq_domain *domain,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent);
|
|
|
|
|
|
+static void __irq_domain_activate_irq(struct irq_data *irq_data)
|
|
|
+{
|
|
|
+ if (irq_data && irq_data->domain) {
|
|
|
+ struct irq_domain *domain = irq_data->domain;
|
|
|
+
|
|
|
+ if (irq_data->parent_data)
|
|
|
+ __irq_domain_activate_irq(irq_data->parent_data);
|
|
|
+ if (domain->ops->activate)
|
|
|
+ domain->ops->activate(domain, irq_data);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void __irq_domain_deactivate_irq(struct irq_data *irq_data)
|
|
|
+{
|
|
|
+ if (irq_data && irq_data->domain) {
|
|
|
+ struct irq_domain *domain = irq_data->domain;
|
|
|
+
|
|
|
+ if (domain->ops->deactivate)
|
|
|
+ domain->ops->deactivate(domain, irq_data);
|
|
|
+ if (irq_data->parent_data)
|
|
|
+ __irq_domain_deactivate_irq(irq_data->parent_data);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* irq_domain_activate_irq - Call domain_ops->activate recursively to activate
|
|
|
* interrupt
|
|
@@ -1356,13 +1380,9 @@ EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent);
|
|
|
*/
|
|
|
void irq_domain_activate_irq(struct irq_data *irq_data)
|
|
|
{
|
|
|
- if (irq_data && irq_data->domain) {
|
|
|
- struct irq_domain *domain = irq_data->domain;
|
|
|
-
|
|
|
- if (irq_data->parent_data)
|
|
|
- irq_domain_activate_irq(irq_data->parent_data);
|
|
|
- if (domain->ops->activate)
|
|
|
- domain->ops->activate(domain, irq_data);
|
|
|
+ if (!irqd_is_activated(irq_data)) {
|
|
|
+ __irq_domain_activate_irq(irq_data);
|
|
|
+ irqd_set_activated(irq_data);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1376,13 +1396,9 @@ void irq_domain_activate_irq(struct irq_data *irq_data)
|
|
|
*/
|
|
|
void irq_domain_deactivate_irq(struct irq_data *irq_data)
|
|
|
{
|
|
|
- if (irq_data && irq_data->domain) {
|
|
|
- struct irq_domain *domain = irq_data->domain;
|
|
|
-
|
|
|
- if (domain->ops->deactivate)
|
|
|
- domain->ops->deactivate(domain, irq_data);
|
|
|
- if (irq_data->parent_data)
|
|
|
- irq_domain_deactivate_irq(irq_data->parent_data);
|
|
|
+ if (irqd_is_activated(irq_data)) {
|
|
|
+ __irq_domain_deactivate_irq(irq_data);
|
|
|
+ irqd_clr_activated(irq_data);
|
|
|
}
|
|
|
}
|
|
|
|