From 8b53ec260e601d4b433e2e64863ee8e56ff8e312 Mon Sep 17 00:00:00 2001 From: Daniel Thompson Date: Wed, 4 Jun 2014 16:01:52 +0100 Subject: irqchip: nvic: Use the generic noop function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using the generic function saves looking up this custom one in a source navigator. Signed-off-by: Daniel Thompson Link: https://lkml.kernel.org/r/1401894112-13386-1-git-send-email-daniel.thompson@linaro.org Cc: Thomas Gleixner Cc: Jason Cooper Acked-by: Uwe Kleine-König Signed-off-by: Jason Cooper --- drivers/irqchip/irq-nvic.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/drivers/irqchip/irq-nvic.c b/drivers/irqchip/irq-nvic.c index 70bdf6edb7bb..4ff0805fca01 100644 --- a/drivers/irqchip/irq-nvic.c +++ b/drivers/irqchip/irq-nvic.c @@ -49,14 +49,6 @@ nvic_handle_irq(irq_hw_number_t hwirq, struct pt_regs *regs) handle_IRQ(irq, regs); } -static void nvic_eoi(struct irq_data *d) -{ - /* - * This is a no-op as end of interrupt is signaled by the exception - * return sequence. - */ -} - static int __init nvic_of_init(struct device_node *node, struct device_node *parent) { @@ -102,7 +94,10 @@ static int __init nvic_of_init(struct device_node *node, gc->chip_types[0].regs.disable = NVIC_ICER; gc->chip_types[0].chip.irq_mask = irq_gc_mask_disable_reg; gc->chip_types[0].chip.irq_unmask = irq_gc_unmask_enable_reg; - gc->chip_types[0].chip.irq_eoi = nvic_eoi; + /* This is a no-op as end of interrupt is signaled by the + * exception return sequence. + */ + gc->chip_types[0].chip.irq_eoi = irq_gc_noop; /* disable interrupts */ writel_relaxed(~0, gc->reg_base + NVIC_ICER); -- cgit v1.2.3 From a26c06f96eff6cb1834320463b7945b7a4c516ad Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:37 +0000 Subject: irqchip: spear_shirq: Kill pointless static Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212712.948802939@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 6ce6bd3441bf..93f2196e8a08 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -252,7 +252,7 @@ static int __init shirq_init(struct spear_shirq **shirq_blocks, int block_nr, struct device_node *np) { int i, irq_base, hwirq = 0, irq_nr = 0; - static struct irq_domain *shirq_domain; + struct irq_domain *shirq_domain; void __iomem *base; base = of_iomap(np, 0); -- cgit v1.2.3 From 078bc005651cfb134135c5f6eca48a997afb4014 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:38 +0000 Subject: irqchip: spear_shirq: Move private structs to source No point in having them in a separate header file. Make the init functions static. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.038658058@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 52 ++++++++++++++++++++++++++---- include/linux/irqchip/spear-shirq.h | 64 ------------------------------------- 2 files changed, 45 insertions(+), 71 deletions(-) delete mode 100644 include/linux/irqchip/spear-shirq.h diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 93f2196e8a08..441e39f08135 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -27,6 +26,45 @@ #include "irqchip.h" +/* + * struct shirq_regs: shared irq register configuration + * + * enb_reg: enable register offset + * reset_to_enb: val 1 indicates, we need to clear bit for enabling interrupt + * status_reg: status register offset + * status_reg_mask: status register valid mask + * clear_reg: clear register offset + * reset_to_clear: val 1 indicates, we need to clear bit for clearing interrupt + */ +struct shirq_regs { + u32 enb_reg; + u32 reset_to_enb; + u32 status_reg; + u32 clear_reg; + u32 reset_to_clear; +}; + +/* + * struct spear_shirq: shared irq structure + * + * irq: hardware irq number + * irq_base: base irq in linux domain + * irq_nr: no. of shared interrupts in a particular block + * irq_bit_off: starting bit offset in the status register + * invalid_irq: irq group is currently disabled + * base: base address of shared irq register + * regs: register configuration for shared irq block + */ +struct spear_shirq { + u32 irq; + u32 irq_base; + u32 irq_nr; + u32 irq_bit_off; + int invalid_irq; + void __iomem *base; + struct shirq_regs regs; +}; + static DEFINE_SPINLOCK(lock); /* spear300 shared irq registers offsets and masks */ @@ -296,24 +334,24 @@ err_unmap: return -ENXIO; } -int __init spear300_shirq_of_init(struct device_node *np, - struct device_node *parent) +static int __init spear300_shirq_of_init(struct device_node *np, + struct device_node *parent) { return shirq_init(spear300_shirq_blocks, ARRAY_SIZE(spear300_shirq_blocks), np); } IRQCHIP_DECLARE(spear300_shirq, "st,spear300-shirq", spear300_shirq_of_init); -int __init spear310_shirq_of_init(struct device_node *np, - struct device_node *parent) +static int __init spear310_shirq_of_init(struct device_node *np, + struct device_node *parent) { return shirq_init(spear310_shirq_blocks, ARRAY_SIZE(spear310_shirq_blocks), np); } IRQCHIP_DECLARE(spear310_shirq, "st,spear310-shirq", spear310_shirq_of_init); -int __init spear320_shirq_of_init(struct device_node *np, - struct device_node *parent) +static int __init spear320_shirq_of_init(struct device_node *np, + struct device_node *parent) { return shirq_init(spear320_shirq_blocks, ARRAY_SIZE(spear320_shirq_blocks), np); diff --git a/include/linux/irqchip/spear-shirq.h b/include/linux/irqchip/spear-shirq.h deleted file mode 100644 index c8be16d213a3..000000000000 --- a/include/linux/irqchip/spear-shirq.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * SPEAr platform shared irq layer header file - * - * Copyright (C) 2009-2012 ST Microelectronics - * Viresh Kumar - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#ifndef __SPEAR_SHIRQ_H -#define __SPEAR_SHIRQ_H - -#include -#include - -/* - * struct shirq_regs: shared irq register configuration - * - * enb_reg: enable register offset - * reset_to_enb: val 1 indicates, we need to clear bit for enabling interrupt - * status_reg: status register offset - * status_reg_mask: status register valid mask - * clear_reg: clear register offset - * reset_to_clear: val 1 indicates, we need to clear bit for clearing interrupt - */ -struct shirq_regs { - u32 enb_reg; - u32 reset_to_enb; - u32 status_reg; - u32 clear_reg; - u32 reset_to_clear; -}; - -/* - * struct spear_shirq: shared irq structure - * - * irq: hardware irq number - * irq_base: base irq in linux domain - * irq_nr: no. of shared interrupts in a particular block - * irq_bit_off: starting bit offset in the status register - * invalid_irq: irq group is currently disabled - * base: base address of shared irq register - * regs: register configuration for shared irq block - */ -struct spear_shirq { - u32 irq; - u32 irq_base; - u32 irq_nr; - u32 irq_bit_off; - int invalid_irq; - void __iomem *base; - struct shirq_regs regs; -}; - -int __init spear300_shirq_of_init(struct device_node *np, - struct device_node *parent); -int __init spear310_shirq_of_init(struct device_node *np, - struct device_node *parent); -int __init spear320_shirq_of_init(struct device_node *np, - struct device_node *parent); - -#endif /* __SPEAR_SHIRQ_H */ -- cgit v1.2.3 From f37ecbce8bf8867ce19fe9ef09e789002d7aad15 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:39 +0000 Subject: irqchip: spear_shirq: No point in storing the parent irq The struct member is pointless and a nismomer as well. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.129694036@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 441e39f08135..576968efbc4d 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -47,7 +47,6 @@ struct shirq_regs { /* * struct spear_shirq: shared irq structure * - * irq: hardware irq number * irq_base: base irq in linux domain * irq_nr: no. of shared interrupts in a particular block * irq_bit_off: starting bit offset in the status register @@ -56,7 +55,6 @@ struct shirq_regs { * regs: register configuration for shared irq block */ struct spear_shirq { - u32 irq; u32 irq_base; u32 irq_nr; u32 irq_bit_off; @@ -268,28 +266,29 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) chip->irq_unmask(&desc->irq_data); } -static void __init spear_shirq_register(struct spear_shirq *shirq) +static void __init spear_shirq_register(struct spear_shirq *shirq, + int parent_irq) { int i; if (shirq->invalid_irq) return; - irq_set_chained_handler(shirq->irq, shirq_handler); + irq_set_chained_handler(parent_irq, shirq_handler); + irq_set_handler_data(parent_irq, shirq); + for (i = 0; i < shirq->irq_nr; i++) { irq_set_chip_and_handler(shirq->irq_base + i, &shirq_chip, handle_simple_irq); set_irq_flags(shirq->irq_base + i, IRQF_VALID); irq_set_chip_data(shirq->irq_base + i, shirq); } - - irq_set_handler_data(shirq->irq, shirq); } static int __init shirq_init(struct spear_shirq **shirq_blocks, int block_nr, struct device_node *np) { - int i, irq_base, hwirq = 0, irq_nr = 0; + int i, parent_irq, irq_base, hwirq = 0, irq_nr = 0; struct irq_domain *shirq_domain; void __iomem *base; @@ -319,9 +318,9 @@ static int __init shirq_init(struct spear_shirq **shirq_blocks, int block_nr, shirq_blocks[i]->base = base; shirq_blocks[i]->irq_base = irq_find_mapping(shirq_domain, hwirq); - shirq_blocks[i]->irq = irq_of_parse_and_map(np, i); - spear_shirq_register(shirq_blocks[i]); + parent_irq = irq_of_parse_and_map(np, i); + spear_shirq_register(shirq_blocks[i], parent_irq); hwirq += shirq_blocks[i]->irq_nr; } -- cgit v1.2.3 From c5d1d857482b080875640bb68bc9d8b65ad29b6f Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:39 +0000 Subject: irqchip: spear_shirq: Namespace cleanup The struct members of the shirq block struct are named to confuse the hell out of the casual reader. Clean it up. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.219411832@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 106 +++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 576968efbc4d..f7c25a77845a 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -47,20 +47,20 @@ struct shirq_regs { /* * struct spear_shirq: shared irq structure * - * irq_base: base irq in linux domain - * irq_nr: no. of shared interrupts in a particular block - * irq_bit_off: starting bit offset in the status register - * invalid_irq: irq group is currently disabled - * base: base address of shared irq register - * regs: register configuration for shared irq block + * base: Base register address + * regs: Register configuration for shared irq block + * virq_base: Base virtual interrupt number + * nr_irqs: Number of interrupts handled by this block + * offset: Bit offset of the first interrupt + * disabled: Group is disabled, but accounted */ struct spear_shirq { - u32 irq_base; - u32 irq_nr; - u32 irq_bit_off; - int invalid_irq; - void __iomem *base; - struct shirq_regs regs; + void __iomem *base; + struct shirq_regs regs; + u32 virq_base; + u32 nr_irqs; + u32 offset; + bool disabled; }; static DEFINE_SPINLOCK(lock); @@ -70,8 +70,8 @@ static DEFINE_SPINLOCK(lock); #define SPEAR300_INT_STS_MASK_REG 0x58 static struct spear_shirq spear300_shirq_ras1 = { - .irq_nr = 9, - .irq_bit_off = 0, + .offset = 0, + .nr_irqs = 9, .regs = { .enb_reg = SPEAR300_INT_ENB_MASK_REG, .status_reg = SPEAR300_INT_STS_MASK_REG, @@ -87,8 +87,8 @@ static struct spear_shirq *spear300_shirq_blocks[] = { #define SPEAR310_INT_STS_MASK_REG 0x04 static struct spear_shirq spear310_shirq_ras1 = { - .irq_nr = 8, - .irq_bit_off = 0, + .offset = 0, + .nr_irqs = 8, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -97,8 +97,8 @@ static struct spear_shirq spear310_shirq_ras1 = { }; static struct spear_shirq spear310_shirq_ras2 = { - .irq_nr = 5, - .irq_bit_off = 8, + .offset = 8, + .nr_irqs = 5, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -107,8 +107,8 @@ static struct spear_shirq spear310_shirq_ras2 = { }; static struct spear_shirq spear310_shirq_ras3 = { - .irq_nr = 1, - .irq_bit_off = 13, + .offset = 13, + .nr_irqs = 1, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -117,8 +117,8 @@ static struct spear_shirq spear310_shirq_ras3 = { }; static struct spear_shirq spear310_shirq_intrcomm_ras = { - .irq_nr = 3, - .irq_bit_off = 14, + .offset = 14, + .nr_irqs = 3, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -139,8 +139,8 @@ static struct spear_shirq *spear310_shirq_blocks[] = { #define SPEAR320_INT_ENB_MASK_REG 0x08 static struct spear_shirq spear320_shirq_ras1 = { - .irq_nr = 3, - .irq_bit_off = 7, + .offset = 7, + .nr_irqs = 3, .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, @@ -150,8 +150,8 @@ static struct spear_shirq spear320_shirq_ras1 = { }; static struct spear_shirq spear320_shirq_ras2 = { - .irq_nr = 1, - .irq_bit_off = 10, + .offset = 10, + .nr_irqs = 1, .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, @@ -161,9 +161,9 @@ static struct spear_shirq spear320_shirq_ras2 = { }; static struct spear_shirq spear320_shirq_ras3 = { - .irq_nr = 7, - .irq_bit_off = 0, - .invalid_irq = 1, + .offset = 0, + .nr_irqs = 7, + .disabled = 1, .regs = { .enb_reg = SPEAR320_INT_ENB_MASK_REG, .reset_to_enb = 1, @@ -174,8 +174,8 @@ static struct spear_shirq spear320_shirq_ras3 = { }; static struct spear_shirq spear320_shirq_intrcomm_ras = { - .irq_nr = 11, - .irq_bit_off = 11, + .offset = 11, + .nr_irqs = 11, .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, @@ -194,7 +194,7 @@ static struct spear_shirq *spear320_shirq_blocks[] = { static void shirq_irq_mask_unmask(struct irq_data *d, bool mask) { struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); - u32 val, offset = d->irq - shirq->irq_base; + u32 val, offset = d->irq - shirq->virq_base; unsigned long flags; if (shirq->regs.enb_reg == -1) @@ -204,9 +204,9 @@ static void shirq_irq_mask_unmask(struct irq_data *d, bool mask) val = readl(shirq->base + shirq->regs.enb_reg); if (mask ^ shirq->regs.reset_to_enb) - val &= ~(0x1 << shirq->irq_bit_off << offset); + val &= ~(0x1 << shirq->offset << offset); else - val |= 0x1 << shirq->irq_bit_off << offset; + val |= 0x1 << shirq->offset << offset; writel(val, shirq->base + shirq->regs.enb_reg); spin_unlock_irqrestore(&lock, flags); @@ -239,17 +239,17 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) chip = irq_get_chip(irq); chip->irq_ack(&desc->irq_data); - mask = ((0x1 << shirq->irq_nr) - 1) << shirq->irq_bit_off; + mask = ((0x1 << shirq->nr_irqs) - 1) << shirq->offset; while ((val = readl(shirq->base + shirq->regs.status_reg) & mask)) { - val >>= shirq->irq_bit_off; - for (i = 0, j = 1; i < shirq->irq_nr; i++, j <<= 1) { + val >>= shirq->offset; + for (i = 0, j = 1; i < shirq->nr_irqs; i++, j <<= 1) { if (!(j & val)) continue; - generic_handle_irq(shirq->irq_base + i); + generic_handle_irq(shirq->virq_base + i); /* clear interrupt */ if (shirq->regs.clear_reg == -1) @@ -257,9 +257,9 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) tmp = readl(shirq->base + shirq->regs.clear_reg); if (shirq->regs.reset_to_clear) - tmp &= ~(j << shirq->irq_bit_off); + tmp &= ~(j << shirq->offset); else - tmp |= (j << shirq->irq_bit_off); + tmp |= (j << shirq->offset); writel(tmp, shirq->base + shirq->regs.clear_reg); } } @@ -271,24 +271,24 @@ static void __init spear_shirq_register(struct spear_shirq *shirq, { int i; - if (shirq->invalid_irq) + if (shirq->disabled) return; irq_set_chained_handler(parent_irq, shirq_handler); irq_set_handler_data(parent_irq, shirq); - for (i = 0; i < shirq->irq_nr; i++) { - irq_set_chip_and_handler(shirq->irq_base + i, + for (i = 0; i < shirq->nr_irqs; i++) { + irq_set_chip_and_handler(shirq->virq_base + i, &shirq_chip, handle_simple_irq); - set_irq_flags(shirq->irq_base + i, IRQF_VALID); - irq_set_chip_data(shirq->irq_base + i, shirq); + set_irq_flags(shirq->virq_base + i, IRQF_VALID); + irq_set_chip_data(shirq->virq_base + i, shirq); } } static int __init shirq_init(struct spear_shirq **shirq_blocks, int block_nr, struct device_node *np) { - int i, parent_irq, irq_base, hwirq = 0, irq_nr = 0; + int i, parent_irq, virq_base, hwirq = 0, nr_irqs = 0; struct irq_domain *shirq_domain; void __iomem *base; @@ -299,15 +299,15 @@ static int __init shirq_init(struct spear_shirq **shirq_blocks, int block_nr, } for (i = 0; i < block_nr; i++) - irq_nr += shirq_blocks[i]->irq_nr; + nr_irqs += shirq_blocks[i]->nr_irqs; - irq_base = irq_alloc_descs(-1, 0, irq_nr, 0); - if (IS_ERR_VALUE(irq_base)) { + virq_base = irq_alloc_descs(-1, 0, nr_irqs, 0); + if (IS_ERR_VALUE(virq_base)) { pr_err("%s: irq desc alloc failed\n", __func__); goto err_unmap; } - shirq_domain = irq_domain_add_legacy(np, irq_nr, irq_base, 0, + shirq_domain = irq_domain_add_legacy(np, nr_irqs, virq_base, 0, &irq_domain_simple_ops, NULL); if (WARN_ON(!shirq_domain)) { pr_warn("%s: irq domain init failed\n", __func__); @@ -316,18 +316,18 @@ static int __init shirq_init(struct spear_shirq **shirq_blocks, int block_nr, for (i = 0; i < block_nr; i++) { shirq_blocks[i]->base = base; - shirq_blocks[i]->irq_base = irq_find_mapping(shirq_domain, + shirq_blocks[i]->virq_base = irq_find_mapping(shirq_domain, hwirq); parent_irq = irq_of_parse_and_map(np, i); spear_shirq_register(shirq_blocks[i], parent_irq); - hwirq += shirq_blocks[i]->irq_nr; + hwirq += shirq_blocks[i]->nr_irqs; } return 0; err_free_desc: - irq_free_descs(irq_base, irq_nr); + irq_free_descs(virq_base, nr_irqs); err_unmap: iounmap(base); return -ENXIO; -- cgit v1.2.3 From 03319a1a2966ec39be79182d6d529221c38fde72 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:40 +0000 Subject: irqchip: spear_shirq: Reorder the spear320 ras blocks Order the ras blocks in the order of interrupts not alphabetically. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.310591579@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index f7c25a77845a..7ebb1a2fbfc7 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -138,20 +138,22 @@ static struct spear_shirq *spear310_shirq_blocks[] = { #define SPEAR320_INT_CLR_MASK_REG 0x04 #define SPEAR320_INT_ENB_MASK_REG 0x08 -static struct spear_shirq spear320_shirq_ras1 = { - .offset = 7, - .nr_irqs = 3, +static struct spear_shirq spear320_shirq_ras3 = { + .offset = 0, + .nr_irqs = 7, + .disabled = 1, .regs = { - .enb_reg = -1, + .enb_reg = SPEAR320_INT_ENB_MASK_REG, + .reset_to_enb = 1, .status_reg = SPEAR320_INT_STS_MASK_REG, .clear_reg = SPEAR320_INT_CLR_MASK_REG, .reset_to_clear = 1, }, }; -static struct spear_shirq spear320_shirq_ras2 = { - .offset = 10, - .nr_irqs = 1, +static struct spear_shirq spear320_shirq_ras1 = { + .offset = 7, + .nr_irqs = 3, .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, @@ -160,13 +162,11 @@ static struct spear_shirq spear320_shirq_ras2 = { }, }; -static struct spear_shirq spear320_shirq_ras3 = { - .offset = 0, - .nr_irqs = 7, - .disabled = 1, +static struct spear_shirq spear320_shirq_ras2 = { + .offset = 10, + .nr_irqs = 1, .regs = { - .enb_reg = SPEAR320_INT_ENB_MASK_REG, - .reset_to_enb = 1, + .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, .clear_reg = SPEAR320_INT_CLR_MASK_REG, .reset_to_clear = 1, -- cgit v1.2.3 From e3c871ab232ccc5fd82f76b21b9cae0113f01dc0 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:40 +0000 Subject: irqchip: spear_shirq: Use the proper interfaces No point in doing a full irq lookup, when the desc pointer is available. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.404243909@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 7ebb1a2fbfc7..874950c014be 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -232,12 +232,12 @@ static struct irq_chip shirq_chip = { static void shirq_handler(unsigned irq, struct irq_desc *desc) { - u32 i, j, val, mask, tmp; - struct irq_chip *chip; struct spear_shirq *shirq = irq_get_handler_data(irq); + struct irq_data *idata = irq_desc_get_irq_data(desc); + struct irq_chip *chip = irq_data_get_irq_chip(idata); + u32 i, j, val, mask, tmp; - chip = irq_get_chip(irq); - chip->irq_ack(&desc->irq_data); + chip->irq_ack(idata); mask = ((0x1 << shirq->nr_irqs) - 1) << shirq->offset; while ((val = readl(shirq->base + shirq->regs.status_reg) & @@ -263,7 +263,7 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) writel(tmp, shirq->base + shirq->regs.clear_reg); } } - chip->irq_unmask(&desc->irq_data); + chip->irq_unmask(idata); } static void __init spear_shirq_register(struct spear_shirq *shirq, -- cgit v1.2.3 From 4ecc832f4ef25dcb684ca986de3612e881748c0e Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:41 +0000 Subject: irqchip: spear_shirq: Precalculate status mask Calculate the status mask at compile time, not at runtime. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.496614337@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 874950c014be..fc57c35a20b4 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -49,6 +49,7 @@ struct shirq_regs { * * base: Base register address * regs: Register configuration for shared irq block + * mask: Mask to apply to the status register * virq_base: Base virtual interrupt number * nr_irqs: Number of interrupts handled by this block * offset: Bit offset of the first interrupt @@ -57,6 +58,7 @@ struct shirq_regs { struct spear_shirq { void __iomem *base; struct shirq_regs regs; + u32 mask; u32 virq_base; u32 nr_irqs; u32 offset; @@ -72,6 +74,7 @@ static DEFINE_SPINLOCK(lock); static struct spear_shirq spear300_shirq_ras1 = { .offset = 0, .nr_irqs = 9, + .mask = ((0x1 << 9) - 1) << 0, .regs = { .enb_reg = SPEAR300_INT_ENB_MASK_REG, .status_reg = SPEAR300_INT_STS_MASK_REG, @@ -89,6 +92,7 @@ static struct spear_shirq *spear300_shirq_blocks[] = { static struct spear_shirq spear310_shirq_ras1 = { .offset = 0, .nr_irqs = 8, + .mask = ((0x1 << 8) - 1) << 0, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -99,6 +103,7 @@ static struct spear_shirq spear310_shirq_ras1 = { static struct spear_shirq spear310_shirq_ras2 = { .offset = 8, .nr_irqs = 5, + .mask = ((0x1 << 5) - 1) << 8, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -109,6 +114,7 @@ static struct spear_shirq spear310_shirq_ras2 = { static struct spear_shirq spear310_shirq_ras3 = { .offset = 13, .nr_irqs = 1, + .mask = ((0x1 << 1) - 1) << 13, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -119,6 +125,7 @@ static struct spear_shirq spear310_shirq_ras3 = { static struct spear_shirq spear310_shirq_intrcomm_ras = { .offset = 14, .nr_irqs = 3, + .mask = ((0x1 << 3) - 1) << 14, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -141,6 +148,7 @@ static struct spear_shirq *spear310_shirq_blocks[] = { static struct spear_shirq spear320_shirq_ras3 = { .offset = 0, .nr_irqs = 7, + .mask = ((0x1 << 7) - 1) << 0, .disabled = 1, .regs = { .enb_reg = SPEAR320_INT_ENB_MASK_REG, @@ -154,6 +162,7 @@ static struct spear_shirq spear320_shirq_ras3 = { static struct spear_shirq spear320_shirq_ras1 = { .offset = 7, .nr_irqs = 3, + .mask = ((0x1 << 3) - 1) << 7, .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, @@ -165,6 +174,7 @@ static struct spear_shirq spear320_shirq_ras1 = { static struct spear_shirq spear320_shirq_ras2 = { .offset = 10, .nr_irqs = 1, + .mask = ((0x1 << 1) - 1) << 10, .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, @@ -176,6 +186,7 @@ static struct spear_shirq spear320_shirq_ras2 = { static struct spear_shirq spear320_shirq_intrcomm_ras = { .offset = 11, .nr_irqs = 11, + .mask = ((0x1 << 11) - 1) << 11, .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, @@ -239,7 +250,7 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) chip->irq_ack(idata); - mask = ((0x1 << shirq->nr_irqs) - 1) << shirq->offset; + mask = shirq->mask; while ((val = readl(shirq->base + shirq->regs.status_reg) & mask)) { -- cgit v1.2.3 From 97dcc21bd3dc7f04a48ff37700ae838feb35fca4 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:41 +0000 Subject: irqchip: spear_shirq: Kill the clear_reg nonsense None of the chips has a ACK register. The code brainlessly fiddles with the enable register, so it might even reenable a disabled interrupt at least on spear300. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.570396433@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 35 +---------------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index fc57c35a20b4..2a33129c4f4b 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -33,15 +33,11 @@ * reset_to_enb: val 1 indicates, we need to clear bit for enabling interrupt * status_reg: status register offset * status_reg_mask: status register valid mask - * clear_reg: clear register offset - * reset_to_clear: val 1 indicates, we need to clear bit for clearing interrupt */ struct shirq_regs { u32 enb_reg; u32 reset_to_enb; u32 status_reg; - u32 clear_reg; - u32 reset_to_clear; }; /* @@ -78,7 +74,6 @@ static struct spear_shirq spear300_shirq_ras1 = { .regs = { .enb_reg = SPEAR300_INT_ENB_MASK_REG, .status_reg = SPEAR300_INT_STS_MASK_REG, - .clear_reg = -1, }, }; @@ -96,7 +91,6 @@ static struct spear_shirq spear310_shirq_ras1 = { .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, - .clear_reg = -1, }, }; @@ -107,7 +101,6 @@ static struct spear_shirq spear310_shirq_ras2 = { .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, - .clear_reg = -1, }, }; @@ -118,7 +111,6 @@ static struct spear_shirq spear310_shirq_ras3 = { .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, - .clear_reg = -1, }, }; @@ -129,7 +121,6 @@ static struct spear_shirq spear310_shirq_intrcomm_ras = { .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, - .clear_reg = -1, }, }; @@ -150,13 +141,6 @@ static struct spear_shirq spear320_shirq_ras3 = { .nr_irqs = 7, .mask = ((0x1 << 7) - 1) << 0, .disabled = 1, - .regs = { - .enb_reg = SPEAR320_INT_ENB_MASK_REG, - .reset_to_enb = 1, - .status_reg = SPEAR320_INT_STS_MASK_REG, - .clear_reg = SPEAR320_INT_CLR_MASK_REG, - .reset_to_clear = 1, - }, }; static struct spear_shirq spear320_shirq_ras1 = { @@ -166,8 +150,6 @@ static struct spear_shirq spear320_shirq_ras1 = { .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, - .clear_reg = SPEAR320_INT_CLR_MASK_REG, - .reset_to_clear = 1, }, }; @@ -178,8 +160,6 @@ static struct spear_shirq spear320_shirq_ras2 = { .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, - .clear_reg = SPEAR320_INT_CLR_MASK_REG, - .reset_to_clear = 1, }, }; @@ -190,8 +170,6 @@ static struct spear_shirq spear320_shirq_intrcomm_ras = { .regs = { .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, - .clear_reg = SPEAR320_INT_CLR_MASK_REG, - .reset_to_clear = 1, }, }; @@ -246,7 +224,7 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) struct spear_shirq *shirq = irq_get_handler_data(irq); struct irq_data *idata = irq_desc_get_irq_data(desc); struct irq_chip *chip = irq_data_get_irq_chip(idata); - u32 i, j, val, mask, tmp; + u32 i, j, val, mask; chip->irq_ack(idata); @@ -261,17 +239,6 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) continue; generic_handle_irq(shirq->virq_base + i); - - /* clear interrupt */ - if (shirq->regs.clear_reg == -1) - continue; - - tmp = readl(shirq->base + shirq->regs.clear_reg); - if (shirq->regs.reset_to_clear) - tmp &= ~(j << shirq->offset); - else - tmp |= (j << shirq->offset); - writel(tmp, shirq->base + shirq->regs.clear_reg); } } chip->irq_unmask(idata); -- cgit v1.2.3 From 25dc49e3321a3b3f17b3f78297432073bb14ec0b Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:42 +0000 Subject: irqchip: spear_shirq: Simplify chained handler I don't know if there are less efficient ways to code that. Get rid of the loop mess and use efficient code. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.662897061@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 2a33129c4f4b..8521a7295b02 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -224,23 +224,20 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) struct spear_shirq *shirq = irq_get_handler_data(irq); struct irq_data *idata = irq_desc_get_irq_data(desc); struct irq_chip *chip = irq_data_get_irq_chip(idata); - u32 i, j, val, mask; + u32 pend; chip->irq_ack(idata); - mask = shirq->mask; - while ((val = readl(shirq->base + shirq->regs.status_reg) & - mask)) { + pend = readl(shirq->base + shirq->regs.status_reg) & shirq->mask; + pend >>= shirq->offset; - val >>= shirq->offset; - for (i = 0, j = 1; i < shirq->nr_irqs; i++, j <<= 1) { + while (pend) { + int irq = __ffs(pend); - if (!(j & val)) - continue; - - generic_handle_irq(shirq->virq_base + i); - } + pend &= ~(0x1 << irq); + generic_handle_irq(shirq->virq_base + irq); } + chip->irq_unmask(idata); } -- cgit v1.2.3 From fe64ac89cf8f5067cf7f6757b6cd9fd77c527bdf Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:43 +0000 Subject: irqchip: spear_shirq: Remove the parent irq "ack"/unmask "ack" is actually a mask in the parent irq. The demultiplexer and the handlers run with interrupts disabled. No point in masking and unmasking the parent. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.754300980@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 8521a7295b02..8765aa7f7a15 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -222,12 +222,8 @@ static struct irq_chip shirq_chip = { static void shirq_handler(unsigned irq, struct irq_desc *desc) { struct spear_shirq *shirq = irq_get_handler_data(irq); - struct irq_data *idata = irq_desc_get_irq_data(desc); - struct irq_chip *chip = irq_data_get_irq_chip(idata); u32 pend; - chip->irq_ack(idata); - pend = readl(shirq->base + shirq->regs.status_reg) & shirq->mask; pend >>= shirq->offset; @@ -237,8 +233,6 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) pend &= ~(0x1 << irq); generic_handle_irq(shirq->virq_base + irq); } - - chip->irq_unmask(idata); } static void __init spear_shirq_register(struct spear_shirq *shirq, -- cgit v1.2.3 From f07e42f96f06dca3f9f897b956d83aec165ee693 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:43 +0000 Subject: irqchip: spear_shirq: Use proper irq chips for the different SoCs Only spear300 has an actual mask register for the RAS interrupts. Add an irq chip pointer to the shirq struct and initialize spear300 with the actual implementation and the others with dummy_irq_chip. The disabled RAS3 block has no irq chip assigned, so we can check for this and remove the disabled member. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.831341023@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 97 ++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 52 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 8765aa7f7a15..169ef9a385d0 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -49,7 +49,8 @@ struct shirq_regs { * virq_base: Base virtual interrupt number * nr_irqs: Number of interrupts handled by this block * offset: Bit offset of the first interrupt - * disabled: Group is disabled, but accounted + * irq_chip: Interrupt controller chip used for this instance, + * if NULL group is disabled, but accounted */ struct spear_shirq { void __iomem *base; @@ -58,19 +59,50 @@ struct spear_shirq { u32 virq_base; u32 nr_irqs; u32 offset; - bool disabled; + struct irq_chip *irq_chip; }; -static DEFINE_SPINLOCK(lock); - /* spear300 shared irq registers offsets and masks */ #define SPEAR300_INT_ENB_MASK_REG 0x54 #define SPEAR300_INT_STS_MASK_REG 0x58 +static DEFINE_RAW_SPINLOCK(shirq_lock); + +static void shirq_irq_mask(struct irq_data *d) +{ + struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); + u32 val, shift = d->irq - shirq->virq_base + shirq->offset; + u32 __iomem *reg = shirq->base + shirq->regs.enb_reg; + + raw_spin_lock(&shirq_lock); + val = readl(reg) & ~(0x1 << shift); + writel(val, reg); + raw_spin_unlock(&shirq_lock); +} + +static void shirq_irq_unmask(struct irq_data *d) +{ + struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); + u32 val, shift = d->irq - shirq->virq_base + shirq->offset; + u32 __iomem *reg = shirq->base + shirq->regs.enb_reg; + + raw_spin_lock(&shirq_lock); + val = readl(reg) | (0x1 << shift); + writel(val, reg); + raw_spin_unlock(&shirq_lock); +} + +static struct irq_chip shirq_chip = { + .name = "spear-shirq", + .irq_mask = shirq_irq_mask, + .irq_unmask = shirq_irq_unmask, +}; + static struct spear_shirq spear300_shirq_ras1 = { .offset = 0, .nr_irqs = 9, .mask = ((0x1 << 9) - 1) << 0, + .irq_chip = &shirq_chip, .regs = { .enb_reg = SPEAR300_INT_ENB_MASK_REG, .status_reg = SPEAR300_INT_STS_MASK_REG, @@ -88,8 +120,8 @@ static struct spear_shirq spear310_shirq_ras1 = { .offset = 0, .nr_irqs = 8, .mask = ((0x1 << 8) - 1) << 0, + .irq_chip = &dummy_irq_chip, .regs = { - .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, }, }; @@ -98,6 +130,7 @@ static struct spear_shirq spear310_shirq_ras2 = { .offset = 8, .nr_irqs = 5, .mask = ((0x1 << 5) - 1) << 8, + .irq_chip = &dummy_irq_chip, .regs = { .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, @@ -108,8 +141,8 @@ static struct spear_shirq spear310_shirq_ras3 = { .offset = 13, .nr_irqs = 1, .mask = ((0x1 << 1) - 1) << 13, + .irq_chip = &dummy_irq_chip, .regs = { - .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, }, }; @@ -118,8 +151,8 @@ static struct spear_shirq spear310_shirq_intrcomm_ras = { .offset = 14, .nr_irqs = 3, .mask = ((0x1 << 3) - 1) << 14, + .irq_chip = &dummy_irq_chip, .regs = { - .enb_reg = -1, .status_reg = SPEAR310_INT_STS_MASK_REG, }, }; @@ -140,15 +173,14 @@ static struct spear_shirq spear320_shirq_ras3 = { .offset = 0, .nr_irqs = 7, .mask = ((0x1 << 7) - 1) << 0, - .disabled = 1, }; static struct spear_shirq spear320_shirq_ras1 = { .offset = 7, .nr_irqs = 3, .mask = ((0x1 << 3) - 1) << 7, + .irq_chip = &dummy_irq_chip, .regs = { - .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, }, }; @@ -157,8 +189,8 @@ static struct spear_shirq spear320_shirq_ras2 = { .offset = 10, .nr_irqs = 1, .mask = ((0x1 << 1) - 1) << 10, + .irq_chip = &dummy_irq_chip, .regs = { - .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, }, }; @@ -167,8 +199,8 @@ static struct spear_shirq spear320_shirq_intrcomm_ras = { .offset = 11, .nr_irqs = 11, .mask = ((0x1 << 11) - 1) << 11, + .irq_chip = &dummy_irq_chip, .regs = { - .enb_reg = -1, .status_reg = SPEAR320_INT_STS_MASK_REG, }, }; @@ -180,45 +212,6 @@ static struct spear_shirq *spear320_shirq_blocks[] = { &spear320_shirq_intrcomm_ras, }; -static void shirq_irq_mask_unmask(struct irq_data *d, bool mask) -{ - struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); - u32 val, offset = d->irq - shirq->virq_base; - unsigned long flags; - - if (shirq->regs.enb_reg == -1) - return; - - spin_lock_irqsave(&lock, flags); - val = readl(shirq->base + shirq->regs.enb_reg); - - if (mask ^ shirq->regs.reset_to_enb) - val &= ~(0x1 << shirq->offset << offset); - else - val |= 0x1 << shirq->offset << offset; - - writel(val, shirq->base + shirq->regs.enb_reg); - spin_unlock_irqrestore(&lock, flags); - -} - -static void shirq_irq_mask(struct irq_data *d) -{ - shirq_irq_mask_unmask(d, 1); -} - -static void shirq_irq_unmask(struct irq_data *d) -{ - shirq_irq_mask_unmask(d, 0); -} - -static struct irq_chip shirq_chip = { - .name = "spear-shirq", - .irq_ack = shirq_irq_mask, - .irq_mask = shirq_irq_mask, - .irq_unmask = shirq_irq_unmask, -}; - static void shirq_handler(unsigned irq, struct irq_desc *desc) { struct spear_shirq *shirq = irq_get_handler_data(irq); @@ -240,7 +233,7 @@ static void __init spear_shirq_register(struct spear_shirq *shirq, { int i; - if (shirq->disabled) + if (!shirq->irq_chip) return; irq_set_chained_handler(parent_irq, shirq_handler); @@ -248,7 +241,7 @@ static void __init spear_shirq_register(struct spear_shirq *shirq, for (i = 0; i < shirq->nr_irqs; i++) { irq_set_chip_and_handler(shirq->virq_base + i, - &shirq_chip, handle_simple_irq); + shirq->irq_chip, handle_simple_irq); set_irq_flags(shirq->virq_base + i, IRQF_VALID); irq_set_chip_data(shirq->virq_base + i, shirq); } -- cgit v1.2.3 From 1b0a76c146adce782ddb8e71f01729f5f3671c66 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 19 Jun 2014 21:34:44 +0000 Subject: irqchip: spear_shirq: Simplify register access code The extra register data structure is pointless. Move the offsets of the status and the mask register into the shirq block structure. Signed-off-by: Thomas Gleixner Link: https://lkml.kernel.org/r/20140619212713.923306179@linutronix.de Acked-by: Viresh Kumar Signed-off-by: Jason Cooper --- drivers/irqchip/spear-shirq.c | 61 ++++++++++++------------------------------- 1 file changed, 16 insertions(+), 45 deletions(-) diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index 169ef9a385d0..9c145a7cb056 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c @@ -26,25 +26,12 @@ #include "irqchip.h" -/* - * struct shirq_regs: shared irq register configuration - * - * enb_reg: enable register offset - * reset_to_enb: val 1 indicates, we need to clear bit for enabling interrupt - * status_reg: status register offset - * status_reg_mask: status register valid mask - */ -struct shirq_regs { - u32 enb_reg; - u32 reset_to_enb; - u32 status_reg; -}; - /* * struct spear_shirq: shared irq structure * * base: Base register address - * regs: Register configuration for shared irq block + * status_reg: Status register offset for chained interrupt handler + * mask_reg: Mask register offset for irq chip * mask: Mask to apply to the status register * virq_base: Base virtual interrupt number * nr_irqs: Number of interrupts handled by this block @@ -54,7 +41,8 @@ struct shirq_regs { */ struct spear_shirq { void __iomem *base; - struct shirq_regs regs; + u32 status_reg; + u32 mask_reg; u32 mask; u32 virq_base; u32 nr_irqs; @@ -72,7 +60,7 @@ static void shirq_irq_mask(struct irq_data *d) { struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); u32 val, shift = d->irq - shirq->virq_base + shirq->offset; - u32 __iomem *reg = shirq->base + shirq->regs.enb_reg; + u32 __iomem *reg = shirq->base + shirq->mask_reg; raw_spin_lock(&shirq_lock); val = readl(reg) & ~(0x1 << shift); @@ -84,7 +72,7 @@ static void shirq_irq_unmask(struct irq_data *d) { struct spear_shirq *shirq = irq_data_get_irq_chip_data(d); u32 val, shift = d->irq - shirq->virq_base + shirq->offset; - u32 __iomem *reg = shirq->base + shirq->regs.enb_reg; + u32 __iomem *reg = shirq->base + shirq->mask_reg; raw_spin_lock(&shirq_lock); val = readl(reg) | (0x1 << shift); @@ -103,10 +91,8 @@ static struct spear_shirq spear300_shirq_ras1 = { .nr_irqs = 9, .mask = ((0x1 << 9) - 1) << 0, .irq_chip = &shirq_chip, - .regs = { - .enb_reg = SPEAR300_INT_ENB_MASK_REG, - .status_reg = SPEAR300_INT_STS_MASK_REG, - }, + .status_reg = SPEAR300_INT_STS_MASK_REG, + .mask_reg = SPEAR300_INT_ENB_MASK_REG, }; static struct spear_shirq *spear300_shirq_blocks[] = { @@ -121,9 +107,7 @@ static struct spear_shirq spear310_shirq_ras1 = { .nr_irqs = 8, .mask = ((0x1 << 8) - 1) << 0, .irq_chip = &dummy_irq_chip, - .regs = { - .status_reg = SPEAR310_INT_STS_MASK_REG, - }, + .status_reg = SPEAR310_INT_STS_MASK_REG, }; static struct spear_shirq spear310_shirq_ras2 = { @@ -131,10 +115,7 @@ static struct spear_shirq spear310_shirq_ras2 = { .nr_irqs = 5, .mask = ((0x1 << 5) - 1) << 8, .irq_chip = &dummy_irq_chip, - .regs = { - .enb_reg = -1, - .status_reg = SPEAR310_INT_STS_MASK_REG, - }, + .status_reg = SPEAR310_INT_STS_MASK_REG, }; static struct spear_shirq spear310_shirq_ras3 = { @@ -142,9 +123,7 @@ static struct spear_shirq spear310_shirq_ras3 = { .nr_irqs = 1, .mask = ((0x1 << 1) - 1) << 13, .irq_chip = &dummy_irq_chip, - .regs = { - .status_reg = SPEAR310_INT_STS_MASK_REG, - }, + .status_reg = SPEAR310_INT_STS_MASK_REG, }; static struct spear_shirq spear310_shirq_intrcomm_ras = { @@ -152,9 +131,7 @@ static struct spear_shirq spear310_shirq_intrcomm_ras = { .nr_irqs = 3, .mask = ((0x1 << 3) - 1) << 14, .irq_chip = &dummy_irq_chip, - .regs = { - .status_reg = SPEAR310_INT_STS_MASK_REG, - }, + .status_reg = SPEAR310_INT_STS_MASK_REG, }; static struct spear_shirq *spear310_shirq_blocks[] = { @@ -180,9 +157,7 @@ static struct spear_shirq spear320_shirq_ras1 = { .nr_irqs = 3, .mask = ((0x1 << 3) - 1) << 7, .irq_chip = &dummy_irq_chip, - .regs = { - .status_reg = SPEAR320_INT_STS_MASK_REG, - }, + .status_reg = SPEAR320_INT_STS_MASK_REG, }; static struct spear_shirq spear320_shirq_ras2 = { @@ -190,9 +165,7 @@ static struct spear_shirq spear320_shirq_ras2 = { .nr_irqs = 1, .mask = ((0x1 << 1) - 1) << 10, .irq_chip = &dummy_irq_chip, - .regs = { - .status_reg = SPEAR320_INT_STS_MASK_REG, - }, + .status_reg = SPEAR320_INT_STS_MASK_REG, }; static struct spear_shirq spear320_shirq_intrcomm_ras = { @@ -200,9 +173,7 @@ static struct spear_shirq spear320_shirq_intrcomm_ras = { .nr_irqs = 11, .mask = ((0x1 << 11) - 1) << 11, .irq_chip = &dummy_irq_chip, - .regs = { - .status_reg = SPEAR320_INT_STS_MASK_REG, - }, + .status_reg = SPEAR320_INT_STS_MASK_REG, }; static struct spear_shirq *spear320_shirq_blocks[] = { @@ -217,7 +188,7 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc) struct spear_shirq *shirq = irq_get_handler_data(irq); u32 pend; - pend = readl(shirq->base + shirq->regs.status_reg) & shirq->mask; + pend = readl(shirq->base + shirq->status_reg) & shirq->mask; pend >>= shirq->offset; while (pend) { -- cgit v1.2.3