static void *ipr_base;
static void *icr_base;
#define IPRA (ipr_base)
+#define IER (icr_base + 2)
+#define ISR (icr_base + 4)
static const unsigned char ipr_table[] = {
0x03, 0x02, 0x01, 0x00, 0x13, 0x12, 0x11, 0x10, /* 16 - 23 */
int pos;
void __iomem *addr;
unsigned short pri;
- int irq = data->irq;
+ int irq = data->irq - 16;
+ unsigned short ier;
+
+ if (irq < 0)
+ return;
- addr = IPRA + ((ipr_table[irq - 16] & 0xf0) >> 3);
- pos = (ipr_table[irq - 16] & 0x0f) * 4;
+ addr = IPRA + ((ipr_table[irq] & 0xf0) >> 3);
+ pos = (ipr_table[irq] & 0x0f) * 4;
pri = ~(0x000f << pos);
pri &= __raw_readw(addr);
__raw_writew(pri, addr);
+ if (irq < 16) {
+ ier = __raw_readw(IER);
+ ier &= ~(1 << irq);
+ __raw_writew(ier, IER);
+ }
}
static void h8s_enable_irq(struct irq_data *data)
int pos;
void __iomem *addr;
unsigned short pri;
- int irq = data->irq;
+ int irq = data->irq - 16;
+ unsigned short ier;
+
+ if (irq < 0)
+ return;
- addr = IPRA + ((ipr_table[irq - 16] & 0xf0) >> 3);
- pos = (ipr_table[irq - 16] & 0x0f) * 4;
+ addr = IPRA + ((ipr_table[irq] & 0xf0) >> 3);
+ pos = (ipr_table[irq] & 0x0f) * 4;
pri = ~(0x000f << pos);
pri &= __raw_readw(addr);
pri |= 1 << pos;
__raw_writew(pri, addr);
+ if (irq < 16) {
+ ier = __raw_readw(IER);
+ ier &= ~(1 << irq);
+ __raw_writew(ier, IER);
+ }
}
static void h8s_ack_irq(struct irq_data *data)
{
- void __iomem *isr_addr = icr_base + 4;
int irq = data->irq;
uint16_t isr;
if (irq >= 16 && irq < 32) {
irq -= 16;
- isr = __raw_readw(isr_addr);
+ isr = __raw_readw(ISR);
isr &= ~(1 << irq);
- __raw_writew(isr, isr_addr);
+ __raw_writew(isr, ISR);
}
}
for (n = 0; n <= 'k' - 'a'; n++)
__raw_writew(0x0000, IPRA + (n * 2));
- __raw_writew(0xffff, icr_base + 2);
+ __raw_writew(0xffff, IER);
domain = irq_domain_add_linear(intc, NR_IRQS, &irq_ops, NULL);
BUG_ON(!domain);
irq_set_default_host(domain);