static irqreturn_t dbdma_interrupt(int irq, void *dev_id, struct pt_regs *regs) { u32 intstat; u32 chan_index; chan_tab_t *ctp; au1x_ddma_desc_t *dp; au1x_dma_chan_t *cp; intstat = dbdma_gptr->ddma_intstat; au_sync(); chan_index = au_ffs(intstat) - 1; ctp = chan_tab_ptr[chan_index]; cp = ctp->chan_ptr; dp = ctp->cur_ptr; /* Reset interrupt. */ cp->ddma_irq = 0; au_sync(); if (ctp->chan_callback) (ctp->chan_callback)(irq, ctp->chan_callparam, regs); ctp->cur_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr)); return IRQ_RETVAL(1); }
void intc0_req0_irqdispatch(struct pt_regs *regs) { int irq = 0; static unsigned long intc0_req0 = 0; intc0_req0 |= au_readl(IC0_REQ0INT); if (!intc0_req0) return; #ifdef AU1000_USB_DEV_REQ_INT /* * Because of the tight timing of SETUP token to reply * transactions, the USB devices-side packet complete * interrupt needs the highest priority. */ if ((intc0_req0 & (1<<AU1000_USB_DEV_REQ_INT))) { intc0_req0 &= ~(1<<AU1000_USB_DEV_REQ_INT); do_IRQ(AU1000_USB_DEV_REQ_INT, regs); return; } #endif irq = au_ffs(intc0_req0) - 1; intc0_req0 &= ~(1<<irq); do_IRQ(irq, regs); }
void intc0_req1_irqdispatch(struct pt_regs *regs) { int irq = 0; static unsigned long intc0_req1 = 0; intc0_req1 |= au_readl(IC0_REQ1INT); if (!intc0_req1) return; irq = au_ffs(intc0_req1) - 1; intc0_req1 &= ~(1<<irq); do_IRQ(irq, regs); }
/* * Interrupt Controller 1: * interrupts 32 - 63 */ void intc1_req0_irqdispatch(struct pt_regs *regs) { int irq = 0; static unsigned long intc1_req0 = 0; intc1_req0 |= au_readl(IC1_REQ0INT); if (!intc1_req0) return; irq = au_ffs(intc1_req0) - 1; intc1_req0 &= ~(1<<irq); irq += 32; do_IRQ(irq, regs); }
irqreturn_t pb1200_cascade_handler( int irq, void *dev_id) { unsigned short bisr = bcsr->int_status; int extirq_nr = 0; /* Clear all the edge interrupts. This has no effect on level */ bcsr->int_status = bisr; for( ; bisr; bisr &= (bisr-1) ) { extirq_nr = (PB1200_INT_BEGIN-1) + au_ffs(bisr); /* Ack and dispatch IRQ */ do_IRQ(extirq_nr); } return IRQ_RETVAL(1); }
void intc0_req1_irqdispatch(struct pt_regs *regs) { int irq = 0; static unsigned long intc0_req1 = 0; intc0_req1 |= au_readl(IC0_REQ1INT); if (!intc0_req1) return; irq = au_ffs(intc0_req1) - 1; intc0_req1 &= ~(1<<irq); #ifdef CONFIG_PM if (irq == AU1000_TOY_MATCH2_INT) { mask_and_ack_rise_edge_irq(irq); counter0_irq(irq, NULL, regs); local_enable_irq(irq); } else #endif { do_IRQ(irq, regs); } }