Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24.4 /kernel/irq/chip.c

Filename:/kernel/irq/chip.c
Lines Added:55
Lines Deleted:1
Also changed in: (Previous) 2.6.24.4-rc3  2.6.24.4-rc2  2.6.24.4-rc1  2.6.24.3  2.6.24.3-rc1  2.6.24-git22 
(Following) 2.6.24.5  2.6.24.6  2.6.24.7  2.6.25-rc7  2.6.25-rc8  2.6.25-rc9 

Location
[  2.6.24.4
  [  kernel
    [  irq
       o  chip.c

Patch

diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 44019ce..e4e1c99 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -246,6 +246,17 @@ static unsigned int default_startup(unsigned int irq)
 }
 
 /*
+ * default shutdown function
+ */
+static void default_shutdown(unsigned int irq)
+{
+   struct irq_desc *desc = irq_desc + irq;
+
+   desc->chip->mask(irq);
+   desc->status |= IRQ_MASKED;
+}
+
+/*
  * Fixup enable/disable function pointers
  */
 void irq_chip_set_defaults(struct irq_chip *chip)
@@ -256,8 +267,15 @@ void irq_chip_set_defaults(struct irq_chip *chip)
       chip->disable = default_disable;
    if (!chip->startup)
       chip->startup = default_startup;
+   /*
+    * We use chip->disable, when the user provided its own. When
+    * we have default_disable set for chip->disable, then we need
+    * to use default_shutdown, otherwise the irq line is not
+    * disabled on free_irq():
+    */
    if (!chip->shutdown)
-      chip->shutdown = chip->disable;
+      chip->shutdown = chip->disable != default_disable ?
+         chip->disable : default_shutdown;
    if (!chip->name)
       chip->name = chip->typename;
    if (!chip->end)
@@ -589,3 +607,39 @@ set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
    set_irq_chip(irq, chip);
    __set_irq_handler(irq, handle, 0, name);
 }
+
+void __init set_irq_noprobe(unsigned int irq)
+{
+   struct irq_desc *desc;
+   unsigned long flags;
+
+   if (irq >= NR_IRQS) {
+      printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq);
+
+      return;
+   }
+
+   desc = irq_desc + irq;
+
+   spin_lock_irqsave(&desc->lock, flags);
+   desc->status |= IRQ_NOPROBE;
+   spin_unlock_irqrestore(&desc->lock, flags);
+}
+
+void __init set_irq_probe(unsigned int irq)
+{
+   struct irq_desc *desc;
+   unsigned long flags;
+
+   if (irq >= NR_IRQS) {
+      printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq);
+
+      return;
+   }
+
+   desc = irq_desc + irq;
+
+   spin_lock_irqsave(&desc->lock, flags);
+   desc->status &= ~IRQ_NOPROBE;
+   spin_unlock_irqrestore(&desc->lock, flags);
+}


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.