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;
		}
	}
}
Exemple #2
0
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;
}
Exemple #4
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;
}