From: Yinghai Lu <yinghai@kernel.org>
To: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>,
Andrew Morton <akpm@linux-foundation.org>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>,
Eric Biederman <ebiederm@xmission.com>,
linux-kernel@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH 10/12] genericirq: add set_irq_desc_chip/data ...
Date: Thu, 04 Mar 2010 02:08:57 -0800 [thread overview]
Message-ID: <1267697339-5491-11-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1267697339-5491-1-git-send-email-yinghai@kernel.org>
with set_irq_chip/data...
to take desc instead of irq
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
include/linux/irq.h | 10 +++-
include/linux/irqnr.h | 1 +
kernel/irq/chip.c | 127 ++++++++++++++++++++++++++++--------------------
3 files changed, 83 insertions(+), 55 deletions(-)
diff --git a/include/linux/irq.h b/include/linux/irq.h
index b9ce77c..df91606 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -526,9 +526,9 @@ static inline int irq_has_action(unsigned int irq)
/* Dynamic irq helper functions */
extern void dynamic_irq_init(unsigned int irq);
-void dynamic_irq_init_keep_chip_data(unsigned int irq);
+void dynamic_irq_init_keep_chip_data(struct irq_desc *desc);
extern void dynamic_irq_cleanup(unsigned int irq);
-void dynamic_irq_cleanup_keep_chip_data(unsigned int irq);
+void dynamic_irq_cleanup_keep_chip_data(struct irq_desc *desc);
/* Set/get chip/data for an IRQ: */
extern int set_irq_chip(unsigned int irq, struct irq_chip *chip);
@@ -537,6 +537,12 @@ extern int set_irq_chip_data(unsigned int irq, void *data);
extern int set_irq_type(unsigned int irq, unsigned int type);
extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);
+int set_irq_desc_chip(struct irq_desc *desc, struct irq_chip *chip);
+int set_irq_desc_data(struct irq_desc *desc, void *data);
+int set_irq_desc_chip_data(struct irq_desc *desc, void *data);
+int set_irq_desc_type(struct irq_desc *desc, unsigned int type);
+int set_irq_desc_msi(struct irq_desc *desc, struct msi_desc *entry);
+
#define get_irq_chip(irq) (irq_to_desc(irq)->chip)
#define get_irq_chip_data(irq) (irq_to_desc(irq)->chip_data)
#define get_irq_data(irq) (irq_to_desc(irq)->handler_data)
diff --git a/include/linux/irqnr.h b/include/linux/irqnr.h
index 7bf89bc..dee8f2b 100644
--- a/include/linux/irqnr.h
+++ b/include/linux/irqnr.h
@@ -43,6 +43,7 @@ extern struct irq_desc *irq_to_desc(unsigned int irq);
#ifdef CONFIG_SMP
#define irq_node(irq) (irq_to_desc(irq)->node)
+#define irq_desc_node(desc) ((desc)->node)
#else
#define irq_node(irq) 0
#endif
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 5aa93f6..7a9ed81 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -18,17 +18,10 @@
#include "internals.h"
-static void dynamic_irq_init_x(unsigned int irq, bool keep_chip_data)
+static void dynamic_irq_init_x(struct irq_desc *desc, bool keep_chip_data)
{
- struct irq_desc *desc;
unsigned long flags;
- desc = irq_to_desc(irq);
- if (!desc) {
- WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
- return;
- }
-
/* Ensure we don't have left over values from a previous use of this irq */
raw_spin_lock_irqsave(&desc->lock, flags);
desc->status = IRQ_DISABLED;
@@ -57,7 +50,15 @@ static void dynamic_irq_init_x(unsigned int irq, bool keep_chip_data)
*/
void dynamic_irq_init(unsigned int irq)
{
- dynamic_irq_init_x(irq, false);
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+ if (!desc) {
+ WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
+ return;
+ }
+
+ dynamic_irq_init_x(desc, false);
}
/**
@@ -66,26 +67,20 @@ void dynamic_irq_init(unsigned int irq)
*
* does not set irq_to_desc(irq)->chip_data to NULL
*/
-void dynamic_irq_init_keep_chip_data(unsigned int irq)
+void dynamic_irq_init_keep_chip_data(struct irq_desc *desc)
{
- dynamic_irq_init_x(irq, true);
+ dynamic_irq_init_x(desc, true);
}
-static void dynamic_irq_cleanup_x(unsigned int irq, bool keep_chip_data)
+static void dynamic_irq_cleanup_x(struct irq_desc *desc, bool keep_chip_data)
{
- struct irq_desc *desc = irq_to_desc(irq);
unsigned long flags;
- if (!desc) {
- WARN(1, KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
- return;
- }
-
raw_spin_lock_irqsave(&desc->lock, flags);
if (desc->action) {
raw_spin_unlock_irqrestore(&desc->lock, flags);
WARN(1, KERN_ERR "Destroying IRQ%d without calling free_irq\n",
- irq);
+ desc->irq);
return;
}
desc->msi_desc = NULL;
@@ -105,7 +100,14 @@ static void dynamic_irq_cleanup_x(unsigned int irq, bool keep_chip_data)
*/
void dynamic_irq_cleanup(unsigned int irq)
{
- dynamic_irq_cleanup_x(irq, false);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ if (!desc) {
+ WARN(1, KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
+ return;
+ }
+
+ dynamic_irq_cleanup_x(desc, false);
}
/**
@@ -114,9 +116,9 @@ void dynamic_irq_cleanup(unsigned int irq)
*
* does not set irq_to_desc(irq)->chip_data to NULL
*/
-void dynamic_irq_cleanup_keep_chip_data(unsigned int irq)
+void dynamic_irq_cleanup_keep_chip_data(struct irq_desc *desc)
{
- dynamic_irq_cleanup_x(irq, true);
+ dynamic_irq_cleanup_x(desc, true);
}
@@ -152,26 +154,31 @@ EXPORT_SYMBOL(set_irq_chip);
* @irq: irq number
* @type: IRQ_TYPE_{LEVEL,EDGE}_* value - see include/linux/irq.h
*/
-int set_irq_type(unsigned int irq, unsigned int type)
+int set_irq_desc_type(struct irq_desc *desc, unsigned int type)
{
- struct irq_desc *desc = irq_to_desc(irq);
unsigned long flags;
int ret = -ENXIO;
- if (!desc) {
- printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
- return -ENODEV;
- }
-
type &= IRQ_TYPE_SENSE_MASK;
if (type == IRQ_TYPE_NONE)
return 0;
raw_spin_lock_irqsave(&desc->lock, flags);
- ret = __irq_set_trigger(desc, irq, type);
+ ret = __irq_set_trigger(desc, desc->irq, type);
raw_spin_unlock_irqrestore(&desc->lock, flags);
return ret;
}
+int set_irq_type(unsigned int irq, unsigned int type)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ if (!desc) {
+ printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
+ return -ENODEV;
+ }
+
+ return set_irq_desc_type(desc, type);
+}
EXPORT_SYMBOL(set_irq_type);
/**
@@ -181,10 +188,18 @@ EXPORT_SYMBOL(set_irq_type);
*
* Set the hardware irq controller data for an irq
*/
+int set_irq_desc_data(struct irq_desc *desc, void *data)
+{
+ unsigned long flags;
+
+ raw_spin_lock_irqsave(&desc->lock, flags);
+ desc->handler_data = data;
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+ return 0;
+}
int set_irq_data(unsigned int irq, void *data)
{
struct irq_desc *desc = irq_to_desc(irq);
- unsigned long flags;
if (!desc) {
printk(KERN_ERR
@@ -192,10 +207,7 @@ int set_irq_data(unsigned int irq, void *data)
return -EINVAL;
}
- raw_spin_lock_irqsave(&desc->lock, flags);
- desc->handler_data = data;
- raw_spin_unlock_irqrestore(&desc->lock, flags);
- return 0;
+ return set_irq_desc_data(desc, data);
}
EXPORT_SYMBOL(set_irq_data);
@@ -206,24 +218,28 @@ EXPORT_SYMBOL(set_irq_data);
*
* Set the MSI descriptor entry for an irq
*/
-int set_irq_msi(unsigned int irq, struct msi_desc *entry)
+int set_irq_desc_msi(struct irq_desc *desc, struct msi_desc *entry)
{
- struct irq_desc *desc = irq_to_desc(irq);
unsigned long flags;
- if (!desc) {
- printk(KERN_ERR
- "Trying to install msi data for IRQ%d\n", irq);
- return -EINVAL;
- }
-
raw_spin_lock_irqsave(&desc->lock, flags);
desc->msi_desc = entry;
if (entry)
- entry->irq = irq;
+ entry->irq = desc->irq;
raw_spin_unlock_irqrestore(&desc->lock, flags);
return 0;
}
+int set_irq_msi(unsigned int irq, struct msi_desc *entry)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ if (!desc) {
+ printk(KERN_ERR
+ "Trying to install msi data for IRQ%d\n", desc->irq);
+ return -EINVAL;
+ }
+
+ return set_irq_desc_msi(desc, entry);
+}
/**
* set_irq_chip_data - set irq chip data for an irq
@@ -232,19 +248,12 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)
*
* Set the hardware irq chip data for an irq
*/
-int set_irq_chip_data(unsigned int irq, void *data)
+int set_irq_desc_chip_data(struct irq_desc *desc, void *data)
{
- struct irq_desc *desc = irq_to_desc(irq);
unsigned long flags;
- if (!desc) {
- printk(KERN_ERR
- "Trying to install chip data for IRQ%d\n", irq);
- return -EINVAL;
- }
-
if (!desc->chip) {
- printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", irq);
+ printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", desc->irq);
return -EINVAL;
}
@@ -254,6 +263,18 @@ int set_irq_chip_data(unsigned int irq, void *data)
return 0;
}
+int set_irq_chip_data(unsigned int irq, void *data)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ if (!desc) {
+ printk(KERN_ERR
+ "Trying to install chip data for IRQ%d\n", irq);
+ return -EINVAL;
+ }
+
+ return set_irq_desc_chip_data(desc, data);
+}
EXPORT_SYMBOL(set_irq_chip_data);
/**
--
1.6.4.2
next prev parent reply other threads:[~2010-03-04 10:11 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-04 10:08 [PATCH 0/12] irq related: make function to take irq_desc pointer instead of irq Yinghai Lu
2010-03-04 10:08 ` [PATCH 01/12] x86: fix out of order of gsi - full Yinghai Lu
2010-03-04 10:08 ` [PATCH 02/12] x86: set nr_irqs_gsi only in probe_nr_irqs_gsi Yinghai Lu
2010-03-04 10:08 ` [PATCH 03/12] x86: kill smpboot_hooks.h Yinghai Lu
2010-03-04 10:08 ` [PATCH 04/12] x86: use vector_desc instead of vector_irq Yinghai Lu
2010-03-04 10:08 ` [PATCH 05/12] genericirq: make irq_chip to have member with irq_desc pointer Yinghai Lu
2010-03-04 10:08 ` [PATCH 06/12] genericirq: make irq_chip related function to take desc Yinghai Lu
2010-03-04 14:31 ` Thomas Gleixner
2010-03-04 18:56 ` Yinghai Lu
2010-03-04 19:08 ` Thomas Gleixner
2010-03-04 19:20 ` Yinghai Lu
2010-03-05 7:47 ` Julia Lawall
2010-03-21 4:18 ` Eric W. Biederman
2010-03-21 11:03 ` Julia Lawall
2010-03-21 13:11 ` [PATCH] irq: Start the transition of irq_chip methods taking a desc Eric W. Biederman
2010-03-21 13:11 ` Eric W. Biederman
2010-03-21 14:43 ` Thomas Gleixner
2010-03-21 18:50 ` Yinghai Lu
2010-03-22 0:32 ` Eric W. Biederman
2010-03-21 13:49 ` [PATCH 06/12] genericirq: make irq_chip related function to take desc Eric W. Biederman
2010-03-21 14:19 ` Julia Lawall
2010-03-21 16:29 ` Julia Lawall
2010-03-21 11:08 ` Julia Lawall
2010-03-21 11:43 ` Eric W. Biederman
2010-03-21 19:16 ` Julia Lawall
2010-03-21 19:35 ` Julia Lawall
2010-03-21 19:36 ` Julia Lawall
2010-03-22 0:36 ` Eric W. Biederman
2010-03-04 19:18 ` Yinghai Lu
2010-03-04 10:08 ` [PATCH 07/12] genericirq: make hpet_msi/ht/msi/dmar_msi " Yinghai Lu
2010-03-04 10:08 ` [PATCH 08/12] x86: make irq_chip to use desc_mask instead of mask Yinghai Lu
2010-03-04 15:10 ` [PATCH 08/12] x86: make irq_chip to use desc_mask instead of maskn Thomas Gleixner
2010-03-04 10:08 ` [PATCH 09/12] x86: irq_chip to use desc_mask instead of mask part 2 Yinghai Lu
2010-03-04 10:08 ` Yinghai Lu [this message]
2010-03-04 10:08 ` [PATCH 11/12] x86/iommu/dmar: update iommu/inter_remapping to use desc Yinghai Lu
2010-03-04 10:08 ` [PATCH 12/12] x86: remove arch_probe_nr_irqs Yinghai Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1267697339-5491-11-git-send-email-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=ebiederm@xmission.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=suresh.b.siddha@intel.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.