From: Paul Mundt <lethal@linux-sh.org>
To: linux-arch@vger.kernel.org
Subject: [PATCH] generic hardirq type setting
Date: Thu, 19 Jan 2006 03:17:37 +0200 [thread overview]
Message-ID: <20060119011737.GA18038@linux-sh.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 3495 bytes --]
Now that Russell's SA_TRIGGER_* changes went in, I've been updating some
of the SH code to support it. ARM supports a ->set_type() through its
struct irqchip so doesn't have to deal with this, but this requires a bit
more work for architectures that are using generic hardirqs.
I've added a ->set_type() to struct hw_interrupt_type to deal with this,
which seems like the least invasive solution. dhowells made a note about
handling and returning errors for invalid type configurations when
Russell's initial patch was posted, so I've implemented this as well.
Any comments?
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
---
arch/sh/kernel/cpu/irq/pint.c | 19 +++++++++++++++++++
include/linux/irq.h | 1 +
kernel/irq/manage.c | 19 +++++++++++++++++--
3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/arch/sh/kernel/cpu/irq/pint.c b/arch/sh/kernel/cpu/irq/pint.c
index 95d6024..ca4bb94 100644
--- a/arch/sh/kernel/cpu/irq/pint.c
+++ b/arch/sh/kernel/cpu/irq/pint.c
@@ -37,9 +37,28 @@ static unsigned int startup_pint_irq(uns
return 0; /* never anything pending */
}
+static int set_type_pint_irq(unsigned int irq, unsigned int type)
+{
+ unsigned int val;
+
+ /* Only level detection is possible */
+ if (unlikely(!(type & (SA_TRIGGER_HIGH | SA_TRIGGER_LOW))))
+ return -EINVAL;
+
+ val = ctrl_inw(INTC_ICR2);
+ if (type & SA_TRIGGER_HIGH)
+ val |= (1 << (irq - PINT_IRQ_BASE));
+ else
+ val &= ~(1 << (irq - PINT_IRQ_BASE));
+ ctrl_outw(val, INTC_ICR2);
+
+ return 0;
+}
+
static struct hw_interrupt_type pint_irq_type = {
.typename = "PINT-IRQ",
.startup = startup_pint_irq,
+ .set_type = set_type_pint_irq,
.shutdown = shutdown_pint_irq,
.enable = enable_pint_irq,
.disable = disable_pint_irq,
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 6c5d4c8..904cffa 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -53,6 +53,7 @@ struct hw_interrupt_type {
void (*ack)(unsigned int irq);
void (*end)(unsigned int irq);
void (*set_affinity)(unsigned int irq, cpumask_t dest);
+ int (*set_type)(unsigned int irq, unsigned int type);
/* Currently used only by UML, might disappear one day.*/
#ifdef CONFIG_IRQ_RELEASE_METHOD
void (*release)(unsigned int irq, void *dev_id);
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 97d5559..4ec7c9a 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -203,8 +203,12 @@ int setup_irq(unsigned int irq, struct i
spin_lock_irqsave(&desc->lock,flags);
p = &desc->action;
if ((old = *p) != NULL) {
- /* Can't share interrupts unless both agree to */
- if (!(old->flags & new->flags & SA_SHIRQ)) {
+ /*
+ * Can't share interrupts unless both agree to and are
+ * the same type.
+ */
+ if (!(old->flags & new->flags & SA_SHIRQ) ||
+ (~old->flags & new->flags & SA_TRIGGER_MASK)) {
spin_unlock_irqrestore(&desc->lock,flags);
return -EBUSY;
}
@@ -220,6 +224,17 @@ int setup_irq(unsigned int irq, struct i
*p = new;
if (!shared) {
+ if (desc->handler->set_type) {
+ unsigned int type = new->flags & SA_TRIGGER_MASK;
+ int ret;
+
+ ret = desc->handler->set_type(irq, type);
+ if (unlikely(ret != 0)) {
+ spin_unlock_irqrestore(&desc->lock, flags);
+ return ret;
+ }
+ }
+
desc->depth = 0;
desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT |
IRQ_WAITING | IRQ_INPROGRESS);
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
next reply other threads:[~2006-01-19 1:17 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-01-19 1:17 Paul Mundt [this message]
2006-01-19 1:32 ` [PATCH] generic hardirq type setting Paul Mundt
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=20060119011737.GA18038@linux-sh.org \
--to=lethal@linux-sh.org \
--cc=linux-arch@vger.kernel.org \
/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.