[PATCH V3 02/14] genirq: Generic chip: Change irq_reg_{readl,writel} arguments

2014-11-01 Thread Kevin Cernekee
Pass in the irq_chip_generic struct so we can use different readl/writel
settings for each irqchip driver, when appropriate.  Compute
(gc->reg_base + reg_offset) in the helper function because this is pretty
much what all callers want to do anyway.

Compile-tested using the following configurations:

at91_dt_defconfig (CONFIG_ATMEL_AIC_IRQ=y)
sama5_defconfig (CONFIG_ATMEL_AIC5_IRQ=y)
sunxi_defconfig (CONFIG_ARCH_SUNXI=y)

tb10x (ARC) is untested.

Signed-off-by: Kevin Cernekee 
---
 drivers/irqchip/irq-atmel-aic.c  | 40 -
 drivers/irqchip/irq-atmel-aic5.c | 65 +++-
 drivers/irqchip/irq-sunxi-nmi.c  |  4 +--
 drivers/irqchip/irq-tb10x.c  |  4 +--
 include/linux/irq.h  | 19 +++-
 kernel/irq/generic-chip.c| 20 ++---
 6 files changed, 77 insertions(+), 75 deletions(-)

diff --git a/drivers/irqchip/irq-atmel-aic.c b/drivers/irqchip/irq-atmel-aic.c
index 9a2cf3c..27fdd8c 100644
--- a/drivers/irqchip/irq-atmel-aic.c
+++ b/drivers/irqchip/irq-atmel-aic.c
@@ -65,11 +65,11 @@ aic_handle(struct pt_regs *regs)
u32 irqnr;
u32 irqstat;
 
-   irqnr = irq_reg_readl(gc->reg_base + AT91_AIC_IVR);
-   irqstat = irq_reg_readl(gc->reg_base + AT91_AIC_ISR);
+   irqnr = irq_reg_readl(gc, AT91_AIC_IVR);
+   irqstat = irq_reg_readl(gc, AT91_AIC_ISR);
 
if (!irqstat)
-   irq_reg_writel(0, gc->reg_base + AT91_AIC_EOICR);
+   irq_reg_writel(gc, 0, AT91_AIC_EOICR);
else
handle_domain_irq(aic_domain, irqnr, regs);
 }
@@ -80,7 +80,7 @@ static int aic_retrigger(struct irq_data *d)
 
/* Enable interrupt on AIC5 */
irq_gc_lock(gc);
-   irq_reg_writel(d->mask, gc->reg_base + AT91_AIC_ISCR);
+   irq_reg_writel(gc, d->mask, AT91_AIC_ISCR);
irq_gc_unlock(gc);
 
return 0;
@@ -92,12 +92,12 @@ static int aic_set_type(struct irq_data *d, unsigned type)
unsigned int smr;
int ret;
 
-   smr = irq_reg_readl(gc->reg_base + AT91_AIC_SMR(d->hwirq));
+   smr = irq_reg_readl(gc, AT91_AIC_SMR(d->hwirq));
ret = aic_common_set_type(d, type, );
if (ret)
return ret;
 
-   irq_reg_writel(smr, gc->reg_base + AT91_AIC_SMR(d->hwirq));
+   irq_reg_writel(gc, smr, AT91_AIC_SMR(d->hwirq));
 
return 0;
 }
@@ -108,8 +108,8 @@ static void aic_suspend(struct irq_data *d)
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 
irq_gc_lock(gc);
-   irq_reg_writel(gc->mask_cache, gc->reg_base + AT91_AIC_IDCR);
-   irq_reg_writel(gc->wake_active, gc->reg_base + AT91_AIC_IECR);
+   irq_reg_writel(gc, gc->mask_cache, AT91_AIC_IDCR);
+   irq_reg_writel(gc, gc->wake_active, AT91_AIC_IECR);
irq_gc_unlock(gc);
 }
 
@@ -118,8 +118,8 @@ static void aic_resume(struct irq_data *d)
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 
irq_gc_lock(gc);
-   irq_reg_writel(gc->wake_active, gc->reg_base + AT91_AIC_IDCR);
-   irq_reg_writel(gc->mask_cache, gc->reg_base + AT91_AIC_IECR);
+   irq_reg_writel(gc, gc->wake_active, AT91_AIC_IDCR);
+   irq_reg_writel(gc, gc->mask_cache, AT91_AIC_IECR);
irq_gc_unlock(gc);
 }
 
@@ -128,8 +128,8 @@ static void aic_pm_shutdown(struct irq_data *d)
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 
irq_gc_lock(gc);
-   irq_reg_writel(0x, gc->reg_base + AT91_AIC_IDCR);
-   irq_reg_writel(0x, gc->reg_base + AT91_AIC_ICCR);
+   irq_reg_writel(gc, 0x, AT91_AIC_IDCR);
+   irq_reg_writel(gc, 0x, AT91_AIC_ICCR);
irq_gc_unlock(gc);
 }
 #else
@@ -148,24 +148,24 @@ static void __init aic_hw_init(struct irq_domain *domain)
 * will not Lock out nIRQ
 */
for (i = 0; i < 8; i++)
-   irq_reg_writel(0, gc->reg_base + AT91_AIC_EOICR);
+   irq_reg_writel(gc, 0, AT91_AIC_EOICR);
 
/*
 * Spurious Interrupt ID in Spurious Vector Register.
 * When there is no current interrupt, the IRQ Vector Register
 * reads the value stored in AIC_SPU
 */
-   irq_reg_writel(0x, gc->reg_base + AT91_AIC_SPU);
+   irq_reg_writel(gc, 0x, AT91_AIC_SPU);
 
/* No debugging in AIC: Debug (Protect) Control Register */
-   irq_reg_writel(0, gc->reg_base + AT91_AIC_DCR);
+   irq_reg_writel(gc, 0, AT91_AIC_DCR);
 
/* Disable and clear all interrupts initially */
-   irq_reg_writel(0x, gc->reg_base + AT91_AIC_IDCR);
-   irq_reg_writel(0x, gc->reg_base + AT91_AIC_ICCR);
+   irq_reg_writel(gc, 0x, AT91_AIC_IDCR);
+   irq_reg_writel(gc, 0x, AT91_AIC_ICCR);
 
for (i = 0; i < 32; i++)
-   irq_reg_writel(i, gc->reg_base + AT91_AIC_SVR(i));
+   irq_reg_writel(gc, i, AT91_AIC_SVR(i));
 }
 
 static int 

[PATCH V3 02/14] genirq: Generic chip: Change irq_reg_{readl,writel} arguments

2014-11-01 Thread Kevin Cernekee
Pass in the irq_chip_generic struct so we can use different readl/writel
settings for each irqchip driver, when appropriate.  Compute
(gc-reg_base + reg_offset) in the helper function because this is pretty
much what all callers want to do anyway.

Compile-tested using the following configurations:

at91_dt_defconfig (CONFIG_ATMEL_AIC_IRQ=y)
sama5_defconfig (CONFIG_ATMEL_AIC5_IRQ=y)
sunxi_defconfig (CONFIG_ARCH_SUNXI=y)

tb10x (ARC) is untested.

Signed-off-by: Kevin Cernekee cerne...@gmail.com
---
 drivers/irqchip/irq-atmel-aic.c  | 40 -
 drivers/irqchip/irq-atmel-aic5.c | 65 +++-
 drivers/irqchip/irq-sunxi-nmi.c  |  4 +--
 drivers/irqchip/irq-tb10x.c  |  4 +--
 include/linux/irq.h  | 19 +++-
 kernel/irq/generic-chip.c| 20 ++---
 6 files changed, 77 insertions(+), 75 deletions(-)

diff --git a/drivers/irqchip/irq-atmel-aic.c b/drivers/irqchip/irq-atmel-aic.c
index 9a2cf3c..27fdd8c 100644
--- a/drivers/irqchip/irq-atmel-aic.c
+++ b/drivers/irqchip/irq-atmel-aic.c
@@ -65,11 +65,11 @@ aic_handle(struct pt_regs *regs)
u32 irqnr;
u32 irqstat;
 
-   irqnr = irq_reg_readl(gc-reg_base + AT91_AIC_IVR);
-   irqstat = irq_reg_readl(gc-reg_base + AT91_AIC_ISR);
+   irqnr = irq_reg_readl(gc, AT91_AIC_IVR);
+   irqstat = irq_reg_readl(gc, AT91_AIC_ISR);
 
if (!irqstat)
-   irq_reg_writel(0, gc-reg_base + AT91_AIC_EOICR);
+   irq_reg_writel(gc, 0, AT91_AIC_EOICR);
else
handle_domain_irq(aic_domain, irqnr, regs);
 }
@@ -80,7 +80,7 @@ static int aic_retrigger(struct irq_data *d)
 
/* Enable interrupt on AIC5 */
irq_gc_lock(gc);
-   irq_reg_writel(d-mask, gc-reg_base + AT91_AIC_ISCR);
+   irq_reg_writel(gc, d-mask, AT91_AIC_ISCR);
irq_gc_unlock(gc);
 
return 0;
@@ -92,12 +92,12 @@ static int aic_set_type(struct irq_data *d, unsigned type)
unsigned int smr;
int ret;
 
-   smr = irq_reg_readl(gc-reg_base + AT91_AIC_SMR(d-hwirq));
+   smr = irq_reg_readl(gc, AT91_AIC_SMR(d-hwirq));
ret = aic_common_set_type(d, type, smr);
if (ret)
return ret;
 
-   irq_reg_writel(smr, gc-reg_base + AT91_AIC_SMR(d-hwirq));
+   irq_reg_writel(gc, smr, AT91_AIC_SMR(d-hwirq));
 
return 0;
 }
@@ -108,8 +108,8 @@ static void aic_suspend(struct irq_data *d)
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 
irq_gc_lock(gc);
-   irq_reg_writel(gc-mask_cache, gc-reg_base + AT91_AIC_IDCR);
-   irq_reg_writel(gc-wake_active, gc-reg_base + AT91_AIC_IECR);
+   irq_reg_writel(gc, gc-mask_cache, AT91_AIC_IDCR);
+   irq_reg_writel(gc, gc-wake_active, AT91_AIC_IECR);
irq_gc_unlock(gc);
 }
 
@@ -118,8 +118,8 @@ static void aic_resume(struct irq_data *d)
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 
irq_gc_lock(gc);
-   irq_reg_writel(gc-wake_active, gc-reg_base + AT91_AIC_IDCR);
-   irq_reg_writel(gc-mask_cache, gc-reg_base + AT91_AIC_IECR);
+   irq_reg_writel(gc, gc-wake_active, AT91_AIC_IDCR);
+   irq_reg_writel(gc, gc-mask_cache, AT91_AIC_IECR);
irq_gc_unlock(gc);
 }
 
@@ -128,8 +128,8 @@ static void aic_pm_shutdown(struct irq_data *d)
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 
irq_gc_lock(gc);
-   irq_reg_writel(0x, gc-reg_base + AT91_AIC_IDCR);
-   irq_reg_writel(0x, gc-reg_base + AT91_AIC_ICCR);
+   irq_reg_writel(gc, 0x, AT91_AIC_IDCR);
+   irq_reg_writel(gc, 0x, AT91_AIC_ICCR);
irq_gc_unlock(gc);
 }
 #else
@@ -148,24 +148,24 @@ static void __init aic_hw_init(struct irq_domain *domain)
 * will not Lock out nIRQ
 */
for (i = 0; i  8; i++)
-   irq_reg_writel(0, gc-reg_base + AT91_AIC_EOICR);
+   irq_reg_writel(gc, 0, AT91_AIC_EOICR);
 
/*
 * Spurious Interrupt ID in Spurious Vector Register.
 * When there is no current interrupt, the IRQ Vector Register
 * reads the value stored in AIC_SPU
 */
-   irq_reg_writel(0x, gc-reg_base + AT91_AIC_SPU);
+   irq_reg_writel(gc, 0x, AT91_AIC_SPU);
 
/* No debugging in AIC: Debug (Protect) Control Register */
-   irq_reg_writel(0, gc-reg_base + AT91_AIC_DCR);
+   irq_reg_writel(gc, 0, AT91_AIC_DCR);
 
/* Disable and clear all interrupts initially */
-   irq_reg_writel(0x, gc-reg_base + AT91_AIC_IDCR);
-   irq_reg_writel(0x, gc-reg_base + AT91_AIC_ICCR);
+   irq_reg_writel(gc, 0x, AT91_AIC_IDCR);
+   irq_reg_writel(gc, 0x, AT91_AIC_ICCR);
 
for (i = 0; i  32; i++)
-   irq_reg_writel(i, gc-reg_base + AT91_AIC_SVR(i));
+   irq_reg_writel(gc, i, AT91_AIC_SVR(i));
 }
 
 static int