1. 15 2月, 2012 2 次提交
    • T
      genirq: Handle pending irqs in irq_startup() · b4bc724e
      Thomas Gleixner 提交于
      An interrupt might be pending when irq_startup() is called, but the
      startup code does not invoke the resend logic. In some cases this
      prevents the device from issuing another interrupt which renders the
      device non functional.
      
      Call the resend function in irq_startup() to keep things going.
      Reported-and-tested-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      Cc: stable@vger.kernel.org
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      b4bc724e
    • T
      genirq: Unmask oneshot irqs when thread was not woken · ac563761
      Thomas Gleixner 提交于
      When the primary handler of an interrupt which is marked IRQ_ONESHOT
      returns IRQ_HANDLED or IRQ_NONE, then the interrupt thread is not
      woken and the unmask logic of the interrupt line is never
      invoked. This keeps the interrupt masked forever.
      
      This was not noticed as most IRQ_ONESHOT users wake the thread
      unconditionally (usually because they cannot access the underlying
      device from hard interrupt context). Though this behaviour was nowhere
      documented and not necessarily intentional. Some drivers can avoid the
      thread wakeup in certain cases and run into the situation where the
      interrupt line s kept masked.
      
      Handle it gracefully.
      Reported-and-tested-by: NLothar Wassmann <lw@karo-electronics.de>
      Cc: stable@vger.kernel.org
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      ac563761
  2. 03 10月, 2011 1 次提交
    • M
      genirq: Add support for per-cpu dev_id interrupts · 31d9d9b6
      Marc Zyngier 提交于
      The ARM GIC interrupt controller offers per CPU interrupts (PPIs),
      which are usually used to connect local timers to each core. Each CPU
      has its own private interface to the GIC, and only sees the PPIs that
      are directly connect to it.
      
      While these timers are separate devices and have a separate interrupt
      line to a core, they all use the same IRQ number.
      
      For these devices, request_irq() is not the right API as it assumes
      that an IRQ number is visible by a number of CPUs (through the
      affinity setting), but makes it very awkward to express that an IRQ
      number can be handled by all CPUs, and yet be a different interrupt
      line on each CPU, requiring a different dev_id cookie to be passed
      back to the handler.
      
      The *_percpu_irq() functions is designed to overcome these
      limitations, by providing a per-cpu dev_id vector:
      
      int request_percpu_irq(unsigned int irq, irq_handler_t handler,
      		   const char *devname, void __percpu *percpu_dev_id);
      void free_percpu_irq(unsigned int, void __percpu *);
      int setup_percpu_irq(unsigned int irq, struct irqaction *new);
      void remove_percpu_irq(unsigned int irq, struct irqaction *act);
      void enable_percpu_irq(unsigned int irq);
      void disable_percpu_irq(unsigned int irq);
      
      The API has a number of limitations:
      - no interrupt sharing
      - no threading
      - common handler across all the CPUs
      
      Once the interrupt is requested using setup_percpu_irq() or
      request_percpu_irq(), it must be enabled by each core that wishes its
      local interrupt to be delivered.
      
      Based on an initial patch by Thomas Gleixner.
      Signed-off-by: NMarc Zyngier <marc.zyngier@arm.com>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1316793788-14500-2-git-send-email-marc.zyngier@arm.comSigned-off-by: NThomas Gleixner <tglx@linutronix.de>
      31d9d9b6
  3. 12 9月, 2011 1 次提交
  4. 18 5月, 2011 1 次提交
  5. 23 4月, 2011 1 次提交
  6. 31 3月, 2011 1 次提交
  7. 30 3月, 2011 2 次提交
  8. 29 3月, 2011 2 次提交
  9. 28 3月, 2011 2 次提交
  10. 27 3月, 2011 4 次提交
  11. 02 3月, 2011 1 次提交
  12. 22 2月, 2011 1 次提交
  13. 19 2月, 2011 21 次提交