|
|
|
@ -372,7 +372,6 @@ static bool irq_may_run(struct irq_desc *desc)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* handle_simple_irq - Simple and software-decoded IRQs.
|
|
|
|
|
* @irq: the interrupt number
|
|
|
|
|
* @desc: the interrupt description structure for this irq
|
|
|
|
|
*
|
|
|
|
|
* Simple interrupts are either sent from a demultiplexing interrupt
|
|
|
|
@ -382,8 +381,7 @@ static bool irq_may_run(struct irq_desc *desc)
|
|
|
|
|
* Note: The caller is expected to handle the ack, clear, mask and
|
|
|
|
|
* unmask issues if necessary.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
handle_simple_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
void handle_simple_irq(struct irq_desc *desc)
|
|
|
|
|
{
|
|
|
|
|
raw_spin_lock(&desc->lock);
|
|
|
|
|
|
|
|
|
@ -425,7 +423,6 @@ static void cond_unmask_irq(struct irq_desc *desc)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* handle_level_irq - Level type irq handler
|
|
|
|
|
* @irq: the interrupt number
|
|
|
|
|
* @desc: the interrupt description structure for this irq
|
|
|
|
|
*
|
|
|
|
|
* Level type interrupts are active as long as the hardware line has
|
|
|
|
@ -433,8 +430,7 @@ static void cond_unmask_irq(struct irq_desc *desc)
|
|
|
|
|
* it after the associated handler has acknowledged the device, so the
|
|
|
|
|
* interrupt line is back to inactive.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
handle_level_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
void handle_level_irq(struct irq_desc *desc)
|
|
|
|
|
{
|
|
|
|
|
raw_spin_lock(&desc->lock);
|
|
|
|
|
mask_ack_irq(desc);
|
|
|
|
@ -496,7 +492,6 @@ static void cond_unmask_eoi_irq(struct irq_desc *desc, struct irq_chip *chip)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* handle_fasteoi_irq - irq handler for transparent controllers
|
|
|
|
|
* @irq: the interrupt number
|
|
|
|
|
* @desc: the interrupt description structure for this irq
|
|
|
|
|
*
|
|
|
|
|
* Only a single callback will be issued to the chip: an ->eoi()
|
|
|
|
@ -504,8 +499,7 @@ static void cond_unmask_eoi_irq(struct irq_desc *desc, struct irq_chip *chip)
|
|
|
|
|
* for modern forms of interrupt handlers, which handle the flow
|
|
|
|
|
* details in hardware, transparently.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
void handle_fasteoi_irq(struct irq_desc *desc)
|
|
|
|
|
{
|
|
|
|
|
struct irq_chip *chip = desc->irq_data.chip;
|
|
|
|
|
|
|
|
|
@ -546,7 +540,6 @@ EXPORT_SYMBOL_GPL(handle_fasteoi_irq);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* handle_edge_irq - edge type IRQ handler
|
|
|
|
|
* @irq: the interrupt number
|
|
|
|
|
* @desc: the interrupt description structure for this irq
|
|
|
|
|
*
|
|
|
|
|
* Interrupt occures on the falling and/or rising edge of a hardware
|
|
|
|
@ -560,8 +553,7 @@ EXPORT_SYMBOL_GPL(handle_fasteoi_irq);
|
|
|
|
|
* the handler was running. If all pending interrupts are handled, the
|
|
|
|
|
* loop is left.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
handle_edge_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
void handle_edge_irq(struct irq_desc *desc)
|
|
|
|
|
{
|
|
|
|
|
raw_spin_lock(&desc->lock);
|
|
|
|
|
|
|
|
|
@ -618,13 +610,12 @@ EXPORT_SYMBOL(handle_edge_irq);
|
|
|
|
|
#ifdef CONFIG_IRQ_EDGE_EOI_HANDLER
|
|
|
|
|
/**
|
|
|
|
|
* handle_edge_eoi_irq - edge eoi type IRQ handler
|
|
|
|
|
* @irq: the interrupt number
|
|
|
|
|
* @desc: the interrupt description structure for this irq
|
|
|
|
|
*
|
|
|
|
|
* Similar as the above handle_edge_irq, but using eoi and w/o the
|
|
|
|
|
* mask/unmask logic.
|
|
|
|
|
*/
|
|
|
|
|
void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
void handle_edge_eoi_irq(struct irq_desc *desc)
|
|
|
|
|
{
|
|
|
|
|
struct irq_chip *chip = irq_desc_get_chip(desc);
|
|
|
|
|
|
|
|
|
@ -665,13 +656,11 @@ out_eoi:
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* handle_percpu_irq - Per CPU local irq handler
|
|
|
|
|
* @irq: the interrupt number
|
|
|
|
|
* @desc: the interrupt description structure for this irq
|
|
|
|
|
*
|
|
|
|
|
* Per CPU interrupts on SMP machines without locking requirements
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
void handle_percpu_irq(struct irq_desc *desc)
|
|
|
|
|
{
|
|
|
|
|
struct irq_chip *chip = irq_desc_get_chip(desc);
|
|
|
|
|
|
|
|
|
@ -688,7 +677,6 @@ handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* handle_percpu_devid_irq - Per CPU local irq handler with per cpu dev ids
|
|
|
|
|
* @irq: the interrupt number
|
|
|
|
|
* @desc: the interrupt description structure for this irq
|
|
|
|
|
*
|
|
|
|
|
* Per CPU interrupts on SMP machines without locking requirements. Same as
|
|
|
|
@ -698,11 +686,12 @@ handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
* contain the real device id for the cpu on which this handler is
|
|
|
|
|
* called
|
|
|
|
|
*/
|
|
|
|
|
void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
void handle_percpu_devid_irq(struct irq_desc *desc)
|
|
|
|
|
{
|
|
|
|
|
struct irq_chip *chip = irq_desc_get_chip(desc);
|
|
|
|
|
struct irqaction *action = desc->action;
|
|
|
|
|
void *dev_id = raw_cpu_ptr(action->percpu_dev_id);
|
|
|
|
|
unsigned int irq = irq_desc_get_irq(desc);
|
|
|
|
|
irqreturn_t res;
|
|
|
|
|
|
|
|
|
|
kstat_incr_irqs_this_cpu(desc);
|
|
|
|
|