static void gef_pic_unmask(struct irq_data *d) { unsigned long flags; unsigned int hwirq = irqd_to_hwirq(d); u32 mask; raw_spin_lock_irqsave(&gef_pic_lock, flags); mask = in_be32(gef_pic_irq_reg_base + GEF_PIC_INTR_MASK(0)); mask |= (1 << hwirq); out_be32(gef_pic_irq_reg_base + GEF_PIC_INTR_MASK(0), mask); raw_spin_unlock_irqrestore(&gef_pic_lock, flags); }
static void gef_pic_unmask(unsigned int virq) { unsigned long flags; unsigned int hwirq; u32 mask; hwirq = gef_irq_to_hw(virq); spin_lock_irqsave(&gef_pic_lock, flags); mask = in_be32(gef_pic_irq_reg_base + GEF_PIC_INTR_MASK(0)); mask |= (1 << hwirq); out_be32(gef_pic_irq_reg_base + GEF_PIC_INTR_MASK(0), mask); spin_unlock_irqrestore(&gef_pic_lock, flags); }
unsigned int gef_pic_get_irq(void) { u32 cause, mask, active; unsigned int virq = NO_IRQ; int hwirq; cause = in_be32(gef_pic_irq_reg_base + GEF_PIC_INTR_STATUS); mask = in_be32(gef_pic_irq_reg_base + GEF_PIC_INTR_MASK(0)); active = cause & mask; if (active) { for (hwirq = GEF_PIC_NUM_IRQS - 1; hwirq > -1; hwirq--) { if (active & (0x1 << hwirq)) break; } virq = irq_linear_revmap(gef_pic_irq_host, (irq_hw_number_t)hwirq); } return virq; }