aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/irq
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2014-03-12 11:01:07 -0400
committerThomas Gleixner <tglx@linutronix.de>2014-03-12 11:01:07 -0400
commitffb12cf002edbc5927079f51bebde428d601f723 (patch)
tree1f04d80df9db8883037d59c81f5836770eecfdc6 /kernel/irq
parent1a75b8e64571a85d5e648cfdf4c40e0d9923abc5 (diff)
parentc1bacbae8192dd2a9ebadd22d793b68054f6c6e5 (diff)
Merge branch 'irq/for-gpio' into irq/core
Merge the request/release callbacks which are in a separate branch for consumption by the gpio folks. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/irq')
-rw-r--r--kernel/irq/irqdomain.c1
-rw-r--r--kernel/irq/manage.c31
2 files changed, 29 insertions, 3 deletions
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index cf68bb36fe58..f14033700c25 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -10,6 +10,7 @@
10#include <linux/mutex.h> 10#include <linux/mutex.h>
11#include <linux/of.h> 11#include <linux/of.h>
12#include <linux/of_address.h> 12#include <linux/of_address.h>
13#include <linux/of_irq.h>
13#include <linux/topology.h> 14#include <linux/topology.h>
14#include <linux/seq_file.h> 15#include <linux/seq_file.h>
15#include <linux/slab.h> 16#include <linux/slab.h>
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index ada0c548c36a..de1a8ed29b40 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -832,8 +832,7 @@ static irqreturn_t irq_thread_fn(struct irq_desc *desc,
832 832
833static void wake_threads_waitq(struct irq_desc *desc) 833static void wake_threads_waitq(struct irq_desc *desc)
834{ 834{
835 if (atomic_dec_and_test(&desc->threads_active) && 835 if (atomic_dec_and_test(&desc->threads_active))
836 waitqueue_active(&desc->wait_for_threads))
837 wake_up(&desc->wait_for_threads); 836 wake_up(&desc->wait_for_threads);
838} 837}
839 838
@@ -954,6 +953,23 @@ static void irq_setup_forced_threading(struct irqaction *new)
954 } 953 }
955} 954}
956 955
956static int irq_request_resources(struct irq_desc *desc)
957{
958 struct irq_data *d = &desc->irq_data;
959 struct irq_chip *c = d->chip;
960
961 return c->irq_request_resources ? c->irq_request_resources(d) : 0;
962}
963
964static void irq_release_resources(struct irq_desc *desc)
965{
966 struct irq_data *d = &desc->irq_data;
967 struct irq_chip *c = d->chip;
968
969 if (c->irq_release_resources)
970 c->irq_release_resources(d);
971}
972
957/* 973/*
958 * Internal function to register an irqaction - typically used to 974 * Internal function to register an irqaction - typically used to
959 * allocate special interrupts that are part of the architecture. 975 * allocate special interrupts that are part of the architecture.
@@ -1149,6 +1165,13 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
1149 } 1165 }
1150 1166
1151 if (!shared) { 1167 if (!shared) {
1168 ret = irq_request_resources(desc);
1169 if (ret) {
1170 pr_err("Failed to request resources for %s (irq %d) on irqchip %s\n",
1171 new->name, irq, desc->irq_data.chip->name);
1172 goto out_mask;
1173 }
1174
1152 init_waitqueue_head(&desc->wait_for_threads); 1175 init_waitqueue_head(&desc->wait_for_threads);
1153 1176
1154 /* Setup the type (level, edge polarity) if configured: */ 1177 /* Setup the type (level, edge polarity) if configured: */
@@ -1319,8 +1342,10 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
1319 *action_ptr = action->next; 1342 *action_ptr = action->next;
1320 1343
1321 /* If this was the last handler, shut down the IRQ line: */ 1344 /* If this was the last handler, shut down the IRQ line: */
1322 if (!desc->action) 1345 if (!desc->action) {
1323 irq_shutdown(desc); 1346 irq_shutdown(desc);
1347 irq_release_resources(desc);
1348 }
1324 1349
1325#ifdef CONFIG_SMP 1350#ifdef CONFIG_SMP
1326 /* make sure affinity_hint is cleaned up */ 1351 /* make sure affinity_hint is cleaned up */