static void intc_mask_ack(struct irq_data *data) { unsigned int irq = data->irq; struct intc_desc_int *d = get_intc_desc(irq); unsigned long handle = intc_get_ack_handle(irq); unsigned long addr; intc_disable(data); /* read register and write zero only to the associated bit */ if (handle) { unsigned int value; addr = INTC_REG(d, _INTC_ADDR_D(handle), 0); value = intc_set_field_from_handle(0, 1, handle); switch (_INTC_FN(handle)) { case REG_FN_MODIFY_BASE + 0: /* 8bit */ __raw_readb(addr); __raw_writeb(0xff ^ value, addr); break; case REG_FN_MODIFY_BASE + 1: /* 16bit */ __raw_readw(addr); __raw_writew(0xffff ^ value, addr); break; case REG_FN_MODIFY_BASE + 3: /* 32bit */ __raw_readl(addr); __raw_writel(0xffffffff ^ value, addr); break; default: BUG(); break; } } }
static unsigned long write_8(unsigned long addr, unsigned long h, unsigned long data) { __raw_writeb(intc_set_field_from_handle(0, data, h), addr); (void)__raw_readb(addr); /* Defeat write posting */ return 0; }
static unsigned long write_32(unsigned long addr, unsigned long h, unsigned long data) { __raw_writel(intc_set_field_from_handle(0, data, h), addr); (void)__raw_readl(addr); return 0; }
static unsigned long modify_32(unsigned long addr, unsigned long h, unsigned long data) { unsigned long flags; unsigned int value; local_irq_save(flags); value = intc_set_field_from_handle(__raw_readl(addr), data, h); __raw_writel(value, addr); (void)__raw_readl(addr); /* Defeat write posting */ local_irq_restore(flags); return 0; }
static unsigned long modify_16(unsigned long addr, unsigned long h, unsigned long data) { unsigned long flags; unsigned int value; local_irq_save(flags); value = intc_set_field_from_handle(__raw_readw(addr), data, h); __raw_writew(value, addr); (void)__raw_readw(addr); local_irq_restore(flags); return 0; }