From: Yoshinori Sato Date: Wed, 15 Apr 2020 12:59:50 +0000 (+0900) Subject: irq-renesas-h8s: Fix external interrupt control. X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=beab3d5cb0e14e6397c4e596b3dbf1d36bf49d06;p=users%2Fjedix%2Flinux-maple.git irq-renesas-h8s: Fix external interrupt control. Signed-off-by: Yoshinori Sato --- diff --git a/drivers/irqchip/irq-renesas-h8s.c b/drivers/irqchip/irq-renesas-h8s.c index b69f2c825a7f8..0b8d9d7ef2ee1 100644 --- a/drivers/irqchip/irq-renesas-h8s.c +++ b/drivers/irqchip/irq-renesas-h8s.c @@ -14,6 +14,8 @@ 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 */ @@ -37,13 +39,22 @@ static void h8s_disable_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); __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) @@ -51,27 +62,35 @@ 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); } } @@ -110,7 +129,7 @@ static int __init h8s_intc_of_init(struct device_node *intc, 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);